Skip to content

Commit 7c87b49

Browse files
authored
fix(autocomplete): fix the generation of the autocomplete script and prevent duplication on enable/disable (#5794)
1 parent 6a6a832 commit 7c87b49

File tree

1 file changed

+77
-17
lines changed

1 file changed

+77
-17
lines changed

lib/common/services/auto-completion-service.ts

+77-17
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ export class AutoCompletionService implements IAutoCompletionService {
2121
"###-begin-%s-completion-###";
2222
private static TABTAB_COMPLETION_END_REGEX_PATTERN =
2323
"###-end-%s-completion-###";
24+
private static GENERATED_TABTAB_COMPLETION_END =
25+
"###-end-ns-completions-section-###";
26+
private static GENERATED_TABTAB_COMPLETION_START =
27+
"###-begin-ns-completions-section-###";
2428

2529
constructor(
2630
private $fs: IFileSystem,
@@ -70,6 +74,16 @@ export class AutoCompletionService implements IAutoCompletionService {
7074
return tabTabRegex;
7175
}
7276

77+
private getTabTabCompletionsRegex(): RegExp {
78+
return new RegExp(
79+
util.format(
80+
"%s[\\s\\S]*%s",
81+
AutoCompletionService.GENERATED_TABTAB_COMPLETION_START,
82+
AutoCompletionService.GENERATED_TABTAB_COMPLETION_END
83+
)
84+
);
85+
}
86+
7387
private removeObsoleteAutoCompletion(): void {
7488
// In previous releases we were writing directly in .bash_profile, .bashrc, .zshrc and .profile - remove this old code
7589
const shellProfilesToBeCleared = this.shellProfiles;
@@ -107,6 +121,43 @@ export class AutoCompletionService implements IAutoCompletionService {
107121
});
108122
}
109123

124+
private removeOboleteTabTabCompletion(text: string) {
125+
try {
126+
let newText = text.replace(this.getTabTabObsoleteRegex("ns"), "");
127+
128+
newText = newText.replace(this.getTabTabObsoleteRegex("nsc"), "");
129+
130+
newText = newText.replace(
131+
this.getTabTabObsoleteRegex("nativescript"),
132+
""
133+
);
134+
135+
newText = newText.replace(this.getTabTabObsoleteRegex("tns"), "");
136+
137+
return newText;
138+
} catch (error) {
139+
this.$logger.trace(
140+
"Error while trying to disable autocompletion for '%s' file. Error is:\n%s",
141+
error.toString()
142+
);
143+
144+
return text;
145+
}
146+
}
147+
148+
@cache()
149+
private get completionAliasDefinition() {
150+
const pattern = "compdef _nativescript.js_yargs_completions %s";
151+
const ns = util.format(pattern, "ns");
152+
const tns = util.format(pattern, "tns");
153+
return util.format(
154+
"\n%s\n%s\n%s\n",
155+
ns,
156+
tns,
157+
AutoCompletionService.GENERATED_TABTAB_COMPLETION_END
158+
);
159+
}
160+
110161
@cache()
111162
private get completionShellScriptContent() {
112163
const startText = util.format(
@@ -284,24 +335,9 @@ export class AutoCompletionService implements IAutoCompletionService {
284335
if (this.$fs.exists(filePath)) {
285336
const contents = this.$fs.readText(filePath);
286337
const regExp = new RegExp(
287-
util.format(
288-
"%s\\s+completion\\s+--\\s+",
289-
this.$staticConfig.CLIENT_NAME.toLowerCase()
290-
)
338+
AutoCompletionService.GENERATED_TABTAB_COMPLETION_START
291339
);
292340
let matchCondition = contents.match(regExp);
293-
if (this.$staticConfig.CLIENT_NAME_ALIAS) {
294-
matchCondition =
295-
matchCondition ||
296-
contents.match(
297-
new RegExp(
298-
util.format(
299-
"%s\\s+completion\\s+--\\s+",
300-
this.$staticConfig.CLIENT_NAME_ALIAS.toLowerCase()
301-
)
302-
)
303-
);
304-
}
305341

306342
if (matchCondition) {
307343
doUpdate = false;
@@ -316,9 +352,33 @@ export class AutoCompletionService implements IAutoCompletionService {
316352
__dirname,
317353
`../../../bin/${clientExecutableFileName}.js`
318354
);
355+
356+
if (this.$fs.exists(filePath)) {
357+
const existingText = this.$fs.readText(filePath);
358+
let newText = existingText.replace(
359+
this.getTabTabCompletionsRegex(),
360+
""
361+
);
362+
newText = this.removeOboleteTabTabCompletion(newText);
363+
if (newText !== existingText) {
364+
this.$logger.trace(
365+
"Remove existing AutoCompletion from file %s.",
366+
filePath
367+
);
368+
this.$fs.writeFile(filePath, newText);
369+
}
370+
}
371+
// The generated seems to be inconsistent in it's start/end markers so adding our own.
372+
373+
this.$fs.appendFile(
374+
filePath,
375+
`\n${AutoCompletionService.GENERATED_TABTAB_COMPLETION_START}\n`
376+
);
319377
await this.$childProcess.exec(
320-
`"${process.argv[0]}" "${pathToExecutableFile}" completion >> "${filePath}"`
378+
`"${process.argv[0]}" "${pathToExecutableFile}" completion_generate_script >> "${filePath}"`
321379
);
380+
this.$fs.appendFile(filePath, this.completionAliasDefinition);
381+
322382
this.$fs.chmod(filePath, "0644");
323383
}
324384
} catch (err) {

0 commit comments

Comments
 (0)