JD2022-TU1/data/EngineData/SubmitAssistant/util/storage_utils.js

300 lines
No EOL
7.8 KiB
JavaScript

/**
* Module where all the interactions with the storage system are done.
*
* Here the storage system is P4, we interact with it with the P4JsApi.
* We also use the LocalStorage to store values.
*/
define([
"config",
"underscore",
],
function(config){
/*********************************************/
/***************** P4JsApi *******************/
/*********************************************/
/**
* Return the version of the system storage.
*
* @return - the version number
*/
var getVersion = function(){
return P4JsApi.getApiVersion();
};
/**
* Return the current user.
*
* @return - the name of the user.
*/
var getUser = function(){
return P4JsApi.getUser();
};
/**
* Return the email of the current user.
*
* @return - the user's email
*/
var getEmail = function(){
var result = this.executeCommand("user -o");
return result[0].Email;
};
/**
* Get all the groups of current user.
*
* @return - an array containing the name of all the groups of the current user.
*/
var getGroups = function(){
var user = this.getUser();
var groups = this.executeCommand("groups " + user);
//we have an array of object,
//and we want an array with "Group" attribute (name of the group) of each object.
//See underscore documentation for pluck method, for further informations.
return _.pluck(groups, "Group");
};
/**
* Return the current CL.
*
* @return - an object containing the current CL.
*/
var getCurrentCL = function(){
var clNumber = P4JsApi.getSubmitChange();
var command = "";
if(clNumber == "default") {
command = "change -o";
}
else if(clNumber && parseInt(clNumber) > 0) {
command = "change -o " + clNumber;
}
var currentCL = this.executeCommand(command);
return currentCL[0];
};
/**
* Return the files of the CL.
*
* @return - an array containing objects for each file.
*/
var getFiles = function(clNum, workspace){
if(! clNum){
clNum = P4JsApi.getSubmitChange();
}
if(! workspace){
workspace = P4JsApi.getClient();
}
var command = "fstat -Rco -e ";
if(clNum == "new"){
command += "default ";
}
else {
command += clNum + " ";
}
command += "//" + workspace + "/...";
var files = this.executeCommand(command);
//p4ERROR is set when CL is empty.
if(files[0].p4ERROR){
files = [];
}
return files;
};
/**
* Get the official maps.
*
* @return - the content of the text file as a string.
*/
var getOfficialMaps = function(){
var req = this.executeCommand("print -q \"" + config.path_maplist + "\"");
//for local line ending characters (workspace configuration)
var official_map_txt = req[0].text;
if(! official_map_txt){
//for shared line ending characters
var bin = req[0].binary;
official_map_txt = "";
for(var i = 0, length = bin.length ; i < length ; i++){
official_map_txt += String.fromCharCode(bin[i]);
}
}
return official_map_txt;
};
/**
* Enable / disable debug.
*
* @param is_debug - boolean to enable / disable debug.
*/
var setDebug = function(is_debug){
P4JsApi.setWebKitDeveloperExtrasEnabled(is_debug);
};
/**
* Execute given command and return results.
*
* @param command - the comand to execute.
*
* @return - return array containing all data
* @throw - error if no result
*/
var executeCommand = function(command){
var result = P4JsApi.p4(command);
if(result && result.size > 0){
return result.data;
}
else{
throw "Error with following command: " + command;
}
};
/**
* Save the given CL with its description and files in the storage system.
*
* @param changelistModel - the changelist model.
* @param filesCollection - the files collection.
*/
var saveCL = function(changelistModel, filesCollection){
var form = this.formatModel(changelistModel, filesCollection);
var data = P4JsApi.p4("change -i \"" + form + "\"");
// we are going to return the CL number if the new CL was newly created.
var p4Info_message = data.data[0].p4INFO.message;
var regEx = /Change\s*(\d+)\s*(?:created|saved)/gm;
var match = regEx.exec(p4Info_message);
if (match != null) {
var changeListNumber = match[1];
return changeListNumber;
}
};
/**
* Submit the given CL with its description and files, and applying the given options.
*
* @param changelistModel - the changelist model.
* @param filesCollection - the files collection.
* @param options - the options of the submit
*/
var submitCL = function(changelistModel, filesCollection, options){
var form = this.formatModel(changelistModel, filesCollection);
//can't pass the form to submit command
//so we have to save the changelist before
var result = P4JsApi.p4("change -i \"" + form + "\"");
var chgNum = result.data[0]["p4INFO"]["args"]["change"].split(" ")[1];
P4JsApi.p4("submit -c " + chgNum + " " + options);
};
/**
* Close the storage system.
*/
var closeSA = function(){
P4JsApi.refreshAll();
P4JsApi.accepted();
};
/**
* Format the CL with its description and files, in order to be a valid CL for P4.
*
* @param changelistModel - the changelist model.
* @param filesCollection - the files collection.
*
* @return - the formated model.
*/
var formatModel = function(changelistModel, filesCollection){
var formated_description = changelistModel.getFormatedDescription();
var formated_files = filesCollection.getFormatedFiles();
var formated_model = "Change: " + changelistModel.get("Change")
+ "\nClient: " + changelistModel.get("Client")
+ "\nUser: " + changelistModel.get("User")
+ "\nStatus: " + changelistModel.get("Status")
+ "\nDescription: \n" + formated_description
+ "\nFiles: \n" + formated_files
+ "\nJobs: \n" + ""; //removed from the submit assistant
return formated_model;
};
/**
* Open the given URL in the default browser.
*
* @param url - the url to open.
*/
var openURL = function(url){
P4JsApi.openUrlInBrowser(url);
};
/*********************************************/
/************** LocalStorage *****************/
/*********************************************/
/**
* Save the given value with the given key in the localStorage.
*
* @param key - the key of the value to save.
* @param value - the value to save.
*/
var localSave = function(key, value){
localStorage[key] = value;
};
/**
* Return the value of the given key from localStorage.
*
* @param key - the key of the value to return.
*
* @return - the value of the key or empty string if undefined
* (localStorage only support strings).
*/
var localLoad = function(key){
var value = localStorage[key];
if(value){
return value;
}
else{
return "";
}
};
return {
getVersion: getVersion,
getUser: getUser,
getEmail: getEmail,
getGroups: getGroups,
getCurrentCL: getCurrentCL,
getFiles: getFiles,
getOfficialMaps: getOfficialMaps,
setDebug: setDebug,
executeCommand: executeCommand,
saveCL: saveCL,
submitCL: submitCL,
closeSA: closeSA,
formatModel: formatModel,
openURL: openURL,
localSave: localSave,
localLoad: localLoad,
};
}
);