cob-cli 2.49.1 → 2.50.0-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/cob-cli.js CHANGED
@@ -10,7 +10,10 @@ const init = require("../lib/commands/init");
10
10
  const customize = require("../lib/commands/customize");
11
11
  const test = require("../lib/commands/test");
12
12
  const deploy = require("../lib/commands/deploy");
13
+ const cleanup = require("../lib/commands/cleanup");
14
+ const package = require("../lib/commands/package");
13
15
  const updateFromServer = require("../lib/commands/updateFromServer");
16
+ const tagDefs = require("../lib/commands/tagDefs.js");
14
17
  const getDefs = require("../lib/commands/getDefs");
15
18
  const generateMermaid = require("../lib/commands/generateMermaid");
16
19
  const { upgradeRepo } = require("../lib/commands/upgradeRepo");
@@ -73,12 +76,30 @@ program
73
76
  .description('Deploy customization to the server')
74
77
  .action( deploy );
75
78
 
79
+ program
80
+ .command('cleanup')
81
+ .option('-e --environment <name>', 'environment to use')
82
+ .option('-s --servername <servername>', 'use <servername>.cultofbits.pt (i.e. name without the FQDN)')
83
+ .option('-l --localOnly', 'only clean local state, skip server cleanup')
84
+ .option('-V --verbose', 'verbose execution of tasks', increaseVerbosity, 0)
85
+ .description('Clean up repository state after an interrupted test or deploy')
86
+ .action( cleanup );
87
+
88
+ program
89
+ .command('package')
90
+ .option('-e --environment <name>', 'environment to use')
91
+ .option('-V --verbose', 'verbose execution of tasks', increaseVerbosity, 0)
92
+ .description('Package customization for out-of-band deploying')
93
+ .action( package );
94
+
76
95
  program
77
96
  .command('updateFromServer')
78
97
  .description('Updates local copy with current files on server, in case of changes made out of standard process.')
79
98
  .option('-e --environment <name>', 'environment to use')
80
99
  .option('-s --servername <servername>', 'use <servername>.cultofbits.pt (i.e. name without the FQDN)')
81
100
  .option('-V --verbose', 'verbose execution of tasks', increaseVerbosity, 0)
101
+ .option('-c --code', 'By adding this flag you indicate that you want to bring the code and not the data')
102
+ .option('--cookie <path>', '')
82
103
  .action( updateFromServer );
83
104
 
84
105
  program
@@ -91,6 +112,16 @@ program
91
112
  .option('-e --environment <name>', 'environment to use')
92
113
  .description('Updates local copy with definitions on server')
93
114
  .action( getDefs );
115
+
116
+ program
117
+ .command('tagDefs')
118
+ .description('Allows the user to tag un-tagged Changes in Definitions configured on exported solutions.')
119
+ .option('-e --environment <name>', 'environment to use')
120
+ .option('-s --servername <servername>', 'use <servername>.cultofbits.pt (i.e. name without the FQDN)')
121
+ .option('-V --verbose', 'verbose execution of tasks', increaseVerbosity, 0)
122
+ .option('--all', 'tag all Definitions of all exported solutions. Use with care!')
123
+ .option('--cookie <path>', '')
124
+ .action( tagDefs );
94
125
 
95
126
  program
96
127
  .command('generateMermaid')
@@ -0,0 +1,106 @@
1
+ require('colors');
2
+ const git = require('simple-git');
3
+ const fs = require('fs-extra');
4
+ const fg = require('fast-glob');
5
+ const execa = require('execa');
6
+ const Listr = require('listr');
7
+ const UpdaterRenderer = require('listr-update-renderer');
8
+ const verboseRenderer = require('listr-verbose-renderer');
9
+ const { getCurrentCommandEnviroment } = require("../task_lists/common_enviromentHandler");
10
+ const { SERVER_COB_CLI_DIRECTORY } = require("../task_lists/common_helpers");
11
+ const { restoreServerFilesToLastDeployed } = require("../task_lists/test_otherFilesContiousReload");
12
+ const { loadOperationState, clearOperationState } = require("../task_lists/common_operationState");
13
+ const { checkRepoVersion } = require("../commands/upgradeRepo");
14
+
15
+ const LOCAL_TEST_LOCK_FILE = ".test.in.execution";
16
+ const SERVER_TEST_LOCK_FILE = SERVER_COB_CLI_DIRECTORY + "test.in.execution";
17
+
18
+ async function cleanup(args) {
19
+ try {
20
+ checkRepoVersion()
21
+
22
+ const savedState = loadOperationState();
23
+ if (savedState) {
24
+ if (!args.environment) args.environment = savedState.environment;
25
+ if (!args.servername) args.servername = savedState.servername;
26
+ }
27
+
28
+ console.log("Cleaning up interrupted test/deploy state...".bold)
29
+
30
+ const cmdEnv = await getCurrentCommandEnviroment(args)
31
+ console.log(` environment: ${cmdEnv.name.bold} server: ${cmdEnv.serverStr}`)
32
+
33
+ await new Listr([
34
+ {
35
+ title: "Undo environment-specific file changes".bold,
36
+ skip: async () => {
37
+ const backupFiles = await fg(
38
+ ['**/*.ENV__ORIGINAL_BACKUP__.*', '**/*.ENV__DELETE__.*'],
39
+ { onlyFiles: false, dot: true }
40
+ );
41
+ return backupFiles.length === 0 ? "No environment-specific changes found" : false;
42
+ },
43
+ task: () => cmdEnv.unApplyCurrentCommandEnvironmentChanges()
44
+ },
45
+ {
46
+ // Runs after the local env undo so the working tree is clean before
47
+ // stashing and checking out the last-deployed SHA.
48
+ title: "Restore server files to last deployed version".bold,
49
+ skip: () => args.localOnly ? "Skipping server restore (--localOnly)" : false,
50
+ task: async () => {
51
+ let changedFiles = [];
52
+ try {
53
+ const result = await execa('ssh', [cmdEnv.server, "cat " + SERVER_TEST_LOCK_FILE]);
54
+ changedFiles = result.stdout.split("\n")
55
+ .map(l => l.split(" ")[0].trim())
56
+ .filter(f => f);
57
+ } catch { /* no test.in.execution on server = nothing to restore */ }
58
+
59
+ if (changedFiles.length === 0) return;
60
+
61
+ await restoreServerFilesToLastDeployed(cmdEnv, changedFiles);
62
+ }
63
+ },
64
+ {
65
+ title: "Restore git branch from detached HEAD".bold,
66
+ skip: async () => {
67
+ const branch = await git().revparse(["--abbrev-ref", "HEAD"]);
68
+ return branch.trim() !== "HEAD" ? "Not in detached HEAD state" : false;
69
+ },
70
+ task: () => git().checkout("-")
71
+ },
72
+ {
73
+ title: "Remove local test lock file".bold,
74
+ skip: () => !fs.existsSync(LOCAL_TEST_LOCK_FILE) ? "No local test lock file found" : false,
75
+ task: () => fs.unlinkSync(LOCAL_TEST_LOCK_FILE)
76
+ },
77
+ {
78
+ title: "Remove server test lock file".bold,
79
+ skip: () => args.localOnly ? "Skipping server cleanup (--localOnly)" : false,
80
+ task: () => execa('ssh', [cmdEnv.server, "rm -f " + SERVER_TEST_LOCK_FILE])
81
+ .catch(() => {}) // non-critical if server unreachable
82
+ },
83
+ ], {
84
+ renderer: args.verbose ? verboseRenderer : UpdaterRenderer,
85
+ collapse: false
86
+ }).run()
87
+
88
+ clearOperationState()
89
+
90
+ // Inform about stashes — don't auto-pop since user may have unrelated stashes
91
+ const stashList = await git().stash(["list"]);
92
+ if (stashList) {
93
+ console.log("\n" + "Note:".yellow.bold
94
+ + " Stashed changes detected (may be from the interrupted operation):")
95
+ console.log(stashList.split("\n").slice(0, 3).map(l => " " + l).join("\n"))
96
+ console.log("Run " + "git stash pop".yellow + " if you want to restore your uncommitted changes.\n")
97
+ }
98
+
99
+ console.log("\nDone!".green, "\nYou can now run 'cob-cli test' or 'cob-cli deploy' again.\n")
100
+
101
+ } catch(err) {
102
+ console.error("\n", err.message)
103
+ }
104
+ }
105
+
106
+ module.exports = cleanup;
@@ -4,11 +4,16 @@ const { confirmExecutionOfChanges } = require("../task_lists/common_syncFiles");
4
4
  const { validateDeployConditions } = require("../task_lists/deploy_validate");
5
5
  const { executeTasks } = require("../task_lists/deploy_execute");
6
6
  const { checkRepoVersion } = require("../commands/upgradeRepo");
7
+ const { saveOperationState, clearOperationState, checkNoInterruptedRun } = require("../task_lists/common_operationState");
7
8
 
8
9
  async function deploy(args) {
10
+ let stateSaved = false
9
11
  try {
10
12
  checkRepoVersion()
11
13
  const cmdEnv = await getCurrentCommandEnviroment(args)
14
+ await checkNoInterruptedRun()
15
+ saveOperationState(cmdEnv.name, cmdEnv.servername)
16
+ stateSaved = true
12
17
  if(args.resync) args.force = true;
13
18
 
14
19
  console.log(`Checking conditions to deploy ${cmdEnv.branchStr} to ${cmdEnv.serverStr}...` );
@@ -21,12 +26,14 @@ async function deploy(args) {
21
26
  changes = await confirmExecutionOfChanges(cmdEnv)
22
27
  } catch (err) {
23
28
  await cmdEnv.unApplyCurrentCommandEnvironmentChanges()
29
+ if (stateSaved) clearOperationState()
24
30
  throw err
25
31
  }
26
32
 
27
33
  if(changes.length == 0) {
28
34
  if(!args.force) {
29
35
  await cmdEnv.unApplyCurrentCommandEnvironmentChanges()
36
+ if (stateSaved) clearOperationState()
30
37
  throw new Error("Canceled:".yellow + " nothing todo\n")
31
38
  }
32
39
  console.log(" Just updating deploy information.")
@@ -34,9 +41,11 @@ async function deploy(args) {
34
41
 
35
42
  await executeTasks(cmdEnv, args).run();
36
43
 
44
+ if (stateSaved) clearOperationState()
37
45
  console.log("\nDone!".green, "\nEnjoy!")
38
46
 
39
47
  } catch(err) {
48
+ if (stateSaved) clearOperationState()
40
49
  console.error("\n",err.message);
41
50
  }
42
51
  }
@@ -0,0 +1,20 @@
1
+ require('colors');
2
+ const { checkRepoVersion } = require("../commands/upgradeRepo");
3
+ const { getCurrentCommandEnviroment } = require("../task_lists/common_enviromentHandler");
4
+ const { executeTasks } = require("../task_lists/package_execute");
5
+
6
+ async function package(args) {
7
+ try {
8
+ checkRepoVersion()
9
+ const cmdEnv = await getCurrentCommandEnviroment(args)
10
+ if(args.resync) args.force = true;
11
+
12
+ await executeTasks(cmdEnv, args).run();
13
+
14
+ console.log("\nDone!".green, "\nEnjoy!")
15
+
16
+ } catch(err) {
17
+ console.error("\n",err.message);
18
+ }
19
+ }
20
+ module.exports = package;
@@ -0,0 +1,67 @@
1
+ require('colors');
2
+ const { getCurrentCommandEnviroment } = require("../task_lists/common_enviromentHandler");
3
+ const { promptCredentials, readYamlFile } = require("../task_lists/common_helpers.js");
4
+ const { tagDefinitions } = require("../task_lists/tagDefs_execute.js");
5
+ const { checkRepoVersion } = require("../commands/upgradeRepo");
6
+ const axios = require('axios');
7
+ const tough = require('tough-cookie');
8
+ const axiosCookieJarSupport = require('axios-cookiejar-support')
9
+ const path = require('path')
10
+ const FileCookieStore = require('file-cookie-store');
11
+
12
+ async function tagDefs(args) {
13
+ try {
14
+ checkRepoVersion()
15
+ const cmdEnv = await getCurrentCommandEnviroment(args)
16
+
17
+ axiosCookieJarSupport.wrapper(axios)
18
+ axios.defaults.ignoreCookieErrors = true
19
+ axios.defaults.withCredentials = true
20
+ const cookieJar = new tough.CookieJar()
21
+ axios.defaults.jar = cookieJar
22
+
23
+ if( args.cookie ) {
24
+ const p = path.resolve(args.cookie);
25
+ const cookieFile = new FileCookieStore(p, {auto_sync: false, force_parse: true});
26
+ try{
27
+ let c = await new Promise((resolve, reject) => {
28
+ cookieFile.findCookie(`${cmdEnv.servername}.cultofbits.com`, '/', 'cobtoken', (err, result) => {
29
+ if(err != null) reject(err);
30
+ else resolve(result)
31
+ })
32
+ });
33
+ if(!c){
34
+ throw Error( `couldn't find a cookie for ${cmdEnv.servername} in ${p}`)
35
+ }
36
+ cookieJar.setCookie(c.toString(), `https://${cmdEnv.servername}.cultofbits.com`)
37
+ } catch(e){
38
+ console.error(e)
39
+ return
40
+ }
41
+
42
+ } else {
43
+
44
+ const credentials = await promptCredentials()
45
+
46
+ await axios.post(`https://${cmdEnv.servername}.cultofbits.com/recordm/security/auth`, credentials, {
47
+ headers: {
48
+ "Content-Type": "application/json",
49
+ },
50
+ })
51
+ }
52
+
53
+ const solutions = await readYamlFile("solutions.yml")
54
+
55
+ for (const solution of solutions) {
56
+ console.log("\nStarting to tag Defs of solution " + solution.name, solution.definitions)
57
+ if (solution.definitions) {
58
+ await tagDefinitions(cmdEnv.servername, solution.name, solution.definitions, args)
59
+ }
60
+ }
61
+
62
+ } catch (err) {
63
+ console.error("\n", err.message);
64
+ }
65
+ }
66
+
67
+ module.exports = tagDefs;
@@ -6,18 +6,30 @@ const { otherFilesContiousReload } = require("../task_lists/test_otherFilesConti
6
6
  const { getCurrentCommandEnviroment } = require("../task_lists/common_enviromentHandler");
7
7
  const { getKeypress } = require("../task_lists/common_helpers");
8
8
  const { checkRepoVersion } = require("../commands/upgradeRepo");
9
+ const { saveOperationState, clearOperationState, checkNoInterruptedRun } = require("../task_lists/common_operationState");
9
10
 
10
- async function test (args) {
11
+ async function test (args) {
11
12
  let restoreChanges, error = "";
12
13
  let cmdEnv
13
14
  let spawned
15
+ let stateSaved = false
16
+
17
+ let rejectOnSignal;
18
+ const signalPromise = new Promise((_, reject) => { rejectOnSignal = reject; });
19
+ const handleSignal = () => rejectOnSignal(new Error('signal'));
20
+ process.once('SIGTERM', handleSignal);
21
+ process.once('SIGHUP', handleSignal);
22
+
14
23
  try {
15
24
  checkRepoVersion()
16
25
  console.log("Start testing… ")
17
26
  cmdEnv = await getCurrentCommandEnviroment(args)
27
+ await checkNoInterruptedRun()
28
+ saveOperationState(cmdEnv.name, cmdEnv.servername)
29
+ stateSaved = true
18
30
 
19
31
  if(!args.localOnly) {
20
- await validateTestingConditions(cmdEnv, args)
32
+ await validateTestingConditions(cmdEnv, args)
21
33
  await cmdEnv.applyCurrentCommandEnvironmentChanges()
22
34
  restoreChanges = await otherFilesContiousReload(cmdEnv)
23
35
  } else {
@@ -27,16 +39,22 @@ async function test (args) {
27
39
 
28
40
  let key;
29
41
  do {
30
- key = await getKeypress()
31
- if(key == "o") opn("http://localhost:8040/recordm/index.html")
32
- } while( key != "q" && key != "ctrl+c" )
42
+ key = await Promise.race([getKeypress(), signalPromise, spawned.failed]);
43
+ if(key == "o") opn(`http://localhost:${spawned.port}/recordm/index.html`)
44
+ } while( key != "q" && key != "ctrl+c" )
33
45
 
34
- } catch (err) {
35
- error = err.message
36
- console.log("\n",error)
46
+ } catch (err) {
47
+ if(err.message !== 'signal' && err.message !== 'processes-failed') {
48
+ error = err.message
49
+ console.log("\n",error)
50
+ }
37
51
  } finally {
38
- restoreChanges && await restoreChanges()
52
+ process.off('SIGTERM', handleSignal);
53
+ process.off('SIGHUP', handleSignal);
54
+ try { process.stdin.setRawMode(false); } catch {}
39
55
  cmdEnv && await cmdEnv.unApplyCurrentCommandEnvironmentChanges() // Repõe as configurações
56
+ restoreChanges && await restoreChanges()
57
+ if (stateSaved) clearOperationState()
40
58
  spawned && await spawned.stop();
41
59
  // Dá tempo aos subprocessos para morrer (acho que já não é preciso)
42
60
  setTimeout(() => {
@@ -1,31 +1,167 @@
1
1
  require('colors');
2
2
  const { getCurrentCommandEnviroment } = require("../task_lists/common_enviromentHandler");
3
3
  const { copyFiles } = require("../task_lists/common_syncFiles");
4
+ const { promptCredentials, readYamlFile } = require("../task_lists/common_helpers.js");
4
5
  const { validateUpdateFromServerConditions } = require("../task_lists/updateFromServer_validate");
6
+ const { getGroupsFromServer } = require("../task_lists/updateFromServer_groups");
7
+ const { getDefinitionsFromServer } = require("../task_lists/updateFromServer_definitions");
8
+ const { getInstancesFromServer } = require("../task_lists/updateFromServer_instances");
9
+ const { getKibanaFromServer } = require("../task_lists/updateFromServer_kibana");
10
+ const { getDomainsFromServer } = require("../task_lists/updateFromServer_domains");
5
11
  const { checkRepoVersion } = require("../commands/upgradeRepo");
12
+ const axios = require('axios');
13
+ const tough = require('tough-cookie');
14
+ const fs = require("fs/promises");
15
+ const axiosCookieJarSupport = require('axios-cookiejar-support')
16
+ const path = require('path')
17
+ const FileCookieStore = require('file-cookie-store');
6
18
 
7
19
  async function updateFromServer(args) {
8
20
  try {
9
21
  checkRepoVersion()
10
22
  const cmdEnv = await getCurrentCommandEnviroment(args)
11
23
 
12
- await validateUpdateFromServerConditions(cmdEnv).run()
24
+ if (args.code) {
13
25
 
14
- console.log("\nOk to proceed. Getting files from server's live directories...");
15
- await cmdEnv.applyCurrentCommandEnvironmentChanges()
16
- let changes = await copyFiles(cmdEnv, "serverLive", "localCopy", args)
17
- await cmdEnv.unApplyCurrentCommandEnvironmentChanges()
26
+ await validateUpdateFromServerConditions(cmdEnv).run()
18
27
 
19
- if(changes.length == 0) {
20
- console.log("\nFinished.".green,"Nothing todo, no changes detected.");
28
+ console.log("\nOk to proceed. Getting files from server's live directories...");
29
+ await cmdEnv.applyCurrentCommandEnvironmentChanges()
30
+ let changes = await copyFiles(cmdEnv, "serverLive", "localCopy", args)
31
+ await cmdEnv.unApplyCurrentCommandEnvironmentChanges()
32
+
33
+ if (changes.length == 0) {
34
+ console.log("\nFinished.".green, "Nothing todo, no changes detected.");
35
+ } else {
36
+ console.log("\n " + changes.join("\n "));
37
+ console.log("\nUpdate done!".yellow, "Check", "git status".bold.blue, "and", "git diff".bold.blue, "to see the resulting differences.");
38
+ console.log("Notice that", "any changes since last deploy migth be lost.".underline)
39
+ console.log("Notice also that you will need to do a", "cob-cli deploy --force".bold.blue, "on next deploy.")
40
+ }
21
41
  } else {
22
- console.log("\n " + changes.join("\n "));
23
- console.log("\nUpdate done!".yellow,"Check","git status".bold.blue,"and","git diff".bold.blue,"to see the resulting differences.");
24
- console.log("Notice that","any changes since last deploy migth be lost.".underline)
25
- console.log("Notice also that you will need to do a","cob-cli deploy --force".bold.blue,"on next deploy.")
42
+
43
+ axiosCookieJarSupport.wrapper(axios)
44
+ axios.defaults.ignoreCookieErrors = true
45
+ axios.defaults.withCredentials = true
46
+ const cookieJar = new tough.CookieJar()
47
+ axios.defaults.jar = cookieJar
48
+
49
+ if( args.cookie ) {
50
+ const p = path.resolve(args.cookie);
51
+ const cookieFile = new FileCookieStore(p, {auto_sync: false, force_parse: true});
52
+ try{
53
+ let c = await new Promise((resolve, reject) => {
54
+ cookieFile.findCookie(`${cmdEnv.servername}.cultofbits.com`, '/', 'cobtoken', (err, result) => {
55
+ if(err != null) reject(err);
56
+ else resolve(result)
57
+ })
58
+ });
59
+ if(!c){
60
+ throw Error( `couldn't find a cookie for ${cmdEnv.servername} in ${p}`)
61
+ }
62
+ cookieJar.setCookie(c.toString(), `https://${cmdEnv.servername}.cultofbits.com`)
63
+ } catch(e){
64
+ console.error(e)
65
+ return
66
+ }
67
+
68
+ } else {
69
+ const credentials = await promptCredentials()
70
+ await axios.post(`https://${cmdEnv.servername}.cultofbits.com/recordm/security/auth`, credentials, {
71
+ headers: {
72
+ "Content-Type": "application/json",
73
+ },
74
+ })
75
+ }
76
+
77
+ console.log("\n Removing existing Data")
78
+ try{ await fs.access("others/solutionsData") } catch { await fs.mkdir("others/solutionsData") }
79
+ const dataFiles = await fs.readdir("others/solutionsData");
80
+ for (const file of dataFiles) {
81
+ const filePath = path.join("others/solutionsData", file);
82
+ await fs.rm(filePath, {recursive: true, force: true} )
83
+ }
84
+
85
+ const solutions = await readYamlFile("solutions.yml")
86
+
87
+ for (const solution of solutions) {
88
+
89
+ console.log("\nStarting updateFromServer of solution " + solution.name)
90
+
91
+ const dataPath = `others/solutionsData/${solution.name}`
92
+ fs.mkdir(dataPath, { recursive: true })
93
+
94
+ if (solution.permissions) {
95
+ await getGroupsFromServer(
96
+ cmdEnv.servername,
97
+ solution.groups,
98
+ dataPath + "/permissions.json",
99
+ solution.name,
100
+ args
101
+ )
102
+ }
103
+
104
+ if (solution.definitions) {
105
+ const definitionPath = dataPath + '/definitions/'
106
+ fs.mkdir(definitionPath, { recursive: true })
107
+ const viewsPath = dataPath + '/views/'
108
+ fs.mkdir(viewsPath, { recursive: true })
109
+ await getDefinitionsFromServer(
110
+ cmdEnv.servername,
111
+ solution.definitions,
112
+ definitionPath,
113
+ viewsPath,
114
+ solution.name,
115
+ args
116
+ ).run()
117
+ }
118
+
119
+ if (solution.instances) {
120
+ const instancesPath = dataPath + '/instances/'
121
+ fs.mkdir(instancesPath, { recursive: true })
122
+ await getInstancesFromServer(
123
+ cmdEnv.servername,
124
+ solution.instances,
125
+ instancesPath,
126
+ solution.name,
127
+ args
128
+ )
129
+ }
130
+
131
+ if(solution.kibana){
132
+ const kibanaPath = dataPath + '/kibana/'
133
+ fs.mkdir(kibanaPath, { recursive: true })
134
+ await getKibanaFromServer(
135
+ cmdEnv.servername,
136
+ solution.kibana.spaces,
137
+ kibanaPath,
138
+ solution.name,
139
+ args
140
+ )
141
+ }
142
+
143
+ if(solution.domains){
144
+ const domainsPath = dataPath + '/domains/'
145
+ fs.mkdir(domainsPath, { recursive: true })
146
+ await getDomainsFromServer(
147
+ cmdEnv.servername,
148
+ solution.domains.filter,
149
+ domainsPath,
150
+ solution.name,
151
+ args
152
+ )
153
+ }
154
+
155
+ }
156
+
157
+ await fs.writeFile('others/solutionsData/_index', solutions.map(c => c.name).join('\n'), 'utf-8')
26
158
  }
27
- } catch(err) {
28
- console.error("\n",err.message);
159
+
160
+
161
+ } catch (err) {
162
+ console.error("\n", err.message);
29
163
  }
30
164
  }
165
+
166
+
31
167
  module.exports = updateFromServer;
@@ -0,0 +1,26 @@
1
+ const axios = require("axios");
2
+
3
+ async function getFilteredDefinitions(servername, defConfigs) {
4
+ const uri = `https://${servername}.cultofbits.com/recordm/recordm/definitions`
5
+ const response = await axios.get( uri );
6
+
7
+ if(response.status != 200){
8
+ throw new Error(`HTTP Error Response: ${response.status} ${response.statusText}`);
9
+ }
10
+
11
+ let result = defConfigs.flatMap(c => {
12
+ return response.data.filter(def => match(c.filter, def))
13
+ .map(m => ({...m, ...c}))
14
+ });
15
+
16
+ return result
17
+ }
18
+
19
+ function match(query, definition) {
20
+ // simple matching for now
21
+ return definition.name.includes(query) || definition.description?.includes(query)
22
+ }
23
+
24
+ module.exports = {
25
+ getFilteredDefinitions: getFilteredDefinitions
26
+ }
@@ -74,7 +74,7 @@ async function _applySpecific(environmentName) {
74
74
  if(!fs.existsSync(deleteFile)) {
75
75
  if(fs.existsSync(prodFile)) {
76
76
  let backupFile = envSpecificFile.replace(/\.ENV__.*__/,".ENV__ORIGINAL_BACKUP__")
77
- await git().raw(["update-index","--assume-unchanged", prodFile])
77
+ await git().raw(["update-index","--assume-unchanged", prodFile]).catch(() => {})
78
78
  fs.renameSync(prodFile, backupFile)
79
79
  } else {
80
80
  fs.appendFileSync('.git/info/exclude', "\n" + prodFile)
@@ -82,7 +82,7 @@ async function _applySpecific(environmentName) {
82
82
  }
83
83
  }
84
84
  fs.renameSync(envSpecificFile, prodFile)
85
- await git().raw(["update-index","--assume-unchanged", envSpecificFile])
85
+ await git().raw(["update-index","--assume-unchanged", envSpecificFile]).catch(() => {})
86
86
  }
87
87
  }
88
88
 
@@ -94,11 +94,11 @@ async function _undoSpecific(environmentName) {
94
94
  let prodFile = changedFile.replace(/\.ENV__.*__/,"")
95
95
  let originalEnvSpecificFile = changedFile.replace(/\.ENV__.*__/,'.ENV__' + environmentName + '__')
96
96
  fs.renameSync(prodFile, originalEnvSpecificFile)
97
- await git().raw(["update-index","--no-assume-unchanged", originalEnvSpecificFile])
98
-
97
+ await git().raw(["update-index","--no-assume-unchanged", originalEnvSpecificFile]).catch(() => {})
98
+
99
99
  if( changedFile.indexOf("\.ENV__ORIGINAL_BACKUP__") > 0 ) {
100
100
  fs.renameSync(changedFile, prodFile)
101
- await git().raw(["update-index","--no-assume-unchanged", prodFile])
101
+ await git().raw(["update-index","--no-assume-unchanged", prodFile]).catch(() => {})
102
102
  }
103
103
  if( changedFile.indexOf("\.ENV__DELETE__") > 0 ) {
104
104
  flagDeleteExclude = true