From 9d673a213ed1cdc2d2ce4388fae7c6cffb46aacc Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Sun, 17 Feb 2019 22:18:40 +0000 Subject: [PATCH] Use absolute flow file path in project settings This ensures the diff logic can recognise the project flow file and apply merge resolution to paths that git knows --- .../src/js/ui/projects/projectSettings.js | 49 ++++++++++++------- .../localfilesystem/projects/Project.js | 36 ++++++-------- 2 files changed, 47 insertions(+), 38 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectSettings.js b/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectSettings.js index 16a31390e..9282f4ca3 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectSettings.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectSettings.js @@ -766,8 +766,7 @@ RED.projects.settings = (function() { row = $('
').appendTo(filesContainer); $('').text(RED._("sidebar.project.projectSettings.package")).appendTo(row); var packageFileLabel = $('
').appendTo(row); - var packageFileLabelPrefixText = $('').text("/").appendTo(packageFileLabel); - var packageFileLabelText = $('').text(activeProject.files.package||"package.json").appendTo(packageFileLabel); + var packageFileLabelText = $('').text(activeProject.files.package||"package.json").appendTo(packageFileLabel); var packageFileInput = $('').val(activeProject.files.package||"package.json").appendTo(packageFileLabel); var packageFileInputSearch = $('') @@ -791,8 +790,8 @@ RED.projects.settings = (function() { packageFileInput.val(result); packageFileLabelText.text(result); var rootDir = result.substring(0,result.length - 12); - flowFileLabelPrefixText.text("/"+rootDir); - credFileLabelPrefixText.text("/"+rootDir); + flowFileLabelPrefixText.text(rootDir); + credFileLabelPrefixText.text(rootDir); flowFileInputResize(); packageFileSubLabel.hide(); } @@ -816,7 +815,7 @@ RED.projects.settings = (function() { } - var projectPackage = "/"+(activeProject.files.package||"package.json"); + var projectPackage = activeProject.files.package||"package.json"; var projectRoot = projectPackage.substring(0,projectPackage.length - 12); // Flow files @@ -824,13 +823,21 @@ RED.projects.settings = (function() { $('').text(RED._("sidebar.project.projectSettings.flow")).appendTo(row); var flowFileLabel = $('
').appendTo(row); var flowFileLabelPrefixText = $('').text(projectRoot).appendTo(flowFileLabel); - var flowFileLabelText = $('').text(activeProject.files.flow||"flows.json").appendTo(flowFileLabel); + var flowFileName = "flows.json"; + if (activeProject.files.flow) { + if (activeProject.files.flow.indexOf(projectRoot) === 0) { + flowFileName = activeProject.files.flow.substring(projectRoot.length); + } else { + flowFileName = activeProject.files.flow; + } + } + var flowFileLabelText = $('').text(flowFileName).appendTo(flowFileLabel); var flowFileInputResize = function() { flowFileInput.css({ "width": "calc(100% - "+(flowFileInputSearch.width() + flowFileLabelPrefixText.width())+"px)" }); } - var flowFileInput = $('').val(activeProject.files.flow||"flows.json").hide().appendTo(flowFileLabel); + var flowFileInput = $('').val(flowFileName).hide().appendTo(flowFileLabel); var flowFileInputSearch = $('') .hide() .appendTo(flowFileLabel) @@ -875,11 +882,20 @@ RED.projects.settings = (function() { row = $('').appendTo(filesContainer); $('').text(RED._("sidebar.project.projectSettings.credentials")).appendTo(row); + var credFileName = "flows_cred.json"; + if (activeProject.files.credentials) { + if (activeProject.files.flow.indexOf(projectRoot) === 0) { + credFileName = activeProject.files.credentials.substring(projectRoot.length); + } else { + credFileName = activeProject.files.credentials; + } + } + var credFileLabel = $('
').appendTo(row); var credFileLabelPrefixText = $('').text(projectRoot).appendTo(credFileLabel); - var credFileLabelText = $('').text(activeProject.files.credentials||"flows_cred.json").appendTo(credFileLabel); + var credFileLabelText = $('').text(credFileName).appendTo(credFileLabel); - var credFileInput = $('').val(activeProject.files.credentials||"flows_cred.json").insertAfter(credFileLabel); + var credFileInput = $('').val(credFileName).insertAfter(credFileLabel); var checkFiles = function() { var saveDisabled; @@ -1053,7 +1069,7 @@ RED.projects.settings = (function() { .appendTo(formButtons) .click(function(evt) { evt.preventDefault(); - var projectPackage = "/"+(activeProject.files.package||"package.json"); + var projectPackage = activeProject.files.package||"package.json"; var projectRoot = projectPackage.substring(0,projectPackage.length - 12); flowFileLabelPrefixText.text(projectRoot); credFileLabelPrefixText.text(projectRoot); @@ -1065,7 +1081,7 @@ RED.projects.settings = (function() { packageFileSubLabel.hide(); } flowFileInput.val(flowFileLabelText.text()); - credFileLabelText.text(activeProject.files.credentials||"flows_cred.json"); + credFileLabelText.text(credFileName); hideEditForm(); }); var saveButton = $('') @@ -1084,11 +1100,13 @@ RED.projects.settings = (function() { packageFileSubLabel.hide(); hideEditForm(); } + var rootPath = packageFileInput.val(); + rootPath = rootPath.substring(0,rootPath.length-12); var payload = { files: { - flow: flowFileInput.val(), - credentials: credFileInput.val(), - package: packageFileInput.val() + package: packageFileInput.val(), + flow: rootPath+flowFileInput.val(), + credentials: rootPath+credFileInput.val() } } @@ -1101,9 +1119,6 @@ RED.projects.settings = (function() { payload.currentCredentialSecret = credentialSecretExistingInput.val(); } } - - console.log(payload); - return; RED.deploy.setDeployInflight(true); utils.sendRequest({ url: "projects/"+activeProject.name, diff --git a/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/Project.js b/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/Project.js index 8a280ee9a..d67c49eeb 100644 --- a/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/Project.js +++ b/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/Project.js @@ -84,14 +84,15 @@ Project.prototype.load = function () { return checkProjectFiles(project).then(function(missingFiles) { project.missingFiles = missingFiles; if (missingFiles.indexOf('package.json') === -1) { + // We have a package.json in project.path+project.paths.root+"package.json" project.paths['package.json'] = fspath.join(project.paths.root,"package.json"); promises.push(fs.readFile(fspath.join(project.path,project.paths['package.json']),"utf8").then(function(content) { try { project.package = util.parseJSON(content); if (project.package.hasOwnProperty('node-red')) { if (project.package['node-red'].hasOwnProperty('settings')) { - project.paths.flowFile = project.package['node-red'].settings.flowFile; - project.paths.credentialsFile = project.package['node-red'].settings.credentialsFile; + project.paths.flowFile = fspath.join(project.paths.root,project.package['node-red'].settings.flowFile); + project.paths.credentialsFile = fspath.join(project.paths.root,project.package['node-red'].settings.credentialsFile); } } else { // TODO: package.json doesn't have a node-red section @@ -134,10 +135,6 @@ Project.prototype.load = function () { }); }; -Project.prototype.getFilePath = function(file) { - return fspath.join(this.path,this.paths.root,this.paths[file]) -} - Project.prototype.initialise = function(user,data) { var project = this; // if (!this.empty) { @@ -296,40 +293,39 @@ Project.prototype.update = function (user, data) { if (data.hasOwnProperty('files')) { this.package['node-red'] = this.package['node-red'] || { settings: {}}; if (data.files.hasOwnProperty('package') && data.files.package !== fspath.join(this.paths.root,"package.json")) { - // We have a package file. It could be one that doesn't exist yet, or - // does exist and we need to load it. + // We have a package file. It could be one that doesn't exist yet, + // or it does exist and we need to load it. if (!/package\.json$/.test(data.files.package)) { return Promise.reject("Invalid package file: "+data.files.package) } var root = data.files.package.substring(0,data.files.package.length-12); this.paths.root = root; - this.paths['package.json'] = 'package.json'; + this.paths['package.json'] = data.files.package; globalProjectSettings.projects[this.name].rootPath = root; saveSettings = true; // 1. check if it exists - if (fs.existsSync(fspath.join(this.path,this.paths.root,this.paths['package.json']))) { + if (fs.existsSync(fspath.join(this.path,this.paths['package.json']))) { // Load the existing one.... } else { var newPackage = defaultFileSet["package.json"](this); - fs.writeFileSync(fspath.join(this.path,this.paths.root,this.paths['package.json']),newPackage); + fs.writeFileSync(fspath.join(this.path,this.paths['package.json']),newPackage); this.package = JSON.parse(newPackage); } reloadProject = true; flowFilesChanged = true; } - if (data.files.hasOwnProperty('flow') && this.package['node-red'].settings.flowFile !== data.files.flow) { + if (data.files.hasOwnProperty('flow') && this.package['node-red'].settings.flowFile !== data.files.flow.substring(this.paths.root.length)) { this.paths.flowFile = data.files.flow; - this.package['node-red'].settings.flowFile = data.files.flow; + this.package['node-red'].settings.flowFile = data.files.flow.substring(this.paths.root.length); savePackage = true; flowFilesChanged = true; } - if (data.files.hasOwnProperty('credentials') && this.package['node-red'].settings.credentialsFile !== data.files.credentials) { + if (data.files.hasOwnProperty('credentials') && this.package['node-red'].settings.credentialsFile !== data.files.credentials.substring(this.paths.root.length)) { this.paths.credentialsFile = data.files.credentials; - this.package['node-red'].settings.credentialsFile = data.files.credentials; + this.package['node-red'].settings.credentialsFile = data.files.credentials.substring(this.paths.root.length); // Don't know if the credSecret is invalid or not so clear the flag delete this.credentialSecretInvalid; - savePackage = true; flowFilesChanged = true; } @@ -779,7 +775,7 @@ Project.prototype.removeRemote = function(user, remote) { Project.prototype.getFlowFile = function() { // console.log("Project.getFlowFile = ",this.paths.flowFile); if (this.paths.flowFile) { - return fspath.join(this.path,this.paths.root,this.paths.flowFile); + return fspath.join(this.path,this.paths.flowFile); } else { return null; } @@ -796,7 +792,7 @@ Project.prototype.getFlowFileBackup = function() { Project.prototype.getCredentialsFile = function() { // console.log("Project.getCredentialsFile = ",this.paths.credentialsFile); if (this.paths.credentialsFile) { - return fspath.join(this.path,this.paths.root,this.paths.credentialsFile); + return fspath.join(this.path,this.paths.credentialsFile); } else { return this.paths.credentialsFile; } @@ -920,14 +916,12 @@ function createDefaultProject(user, project) { }); } function checkProjectFiles(project) { - var projectPath = project.path; - var projectRoot = project.paths.root; var promises = []; var paths = []; for (var file in defaultFileSet) { if (defaultFileSet.hasOwnProperty(file)) { paths.push(file); - promises.push(fs.stat(fspath.join(projectPath,projectRoot,file))); + promises.push(fs.stat(fspath.join(project.path,project.paths.root,file))); } } return when.settle(promises).then(function(results) {