Skip to content

Commit be0310c

Browse files
Fix to have relative path with respect to base directory in output of LS command (#1095)
* Fix to have relative path path with respect to base directory in the output of LS command * updated tests for LS command * Code cleaning and removing debuggingcode * correcting base directory for relative path * removing non required variable * minor fix in logic of base directory calculation * minor change in test
1 parent 4380c12 commit be0310c

File tree

2 files changed

+50
-71
lines changed

2 files changed

+50
-71
lines changed

node/task.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -1065,17 +1065,15 @@ export function ls(optionsOrPaths?: unknown, ...paths: unknown[]): string[] {
10651065
paths.push(...pathsFromOptions);
10661066
}
10671067
}
1068-
1068+
10691069
if (paths.length === 0) {
10701070
paths.push(path.resolve('.'));
10711071
}
1072-
1072+
const pathsCopy = [...paths];
10731073
const preparedPaths: string[] = [];
1074-
10751074
try {
10761075
while (paths.length > 0) {
10771076
const pathEntry = resolve(paths.shift());
1078-
10791077
if (pathEntry?.includes('*')) {
10801078
paths.push(...findMatch(path.dirname(pathEntry), [path.basename(pathEntry)]));
10811079
continue;
@@ -1102,11 +1100,13 @@ export function ls(optionsOrPaths?: unknown, ...paths: unknown[]): string[] {
11021100
if (!includeHidden && entrybasename.startsWith('.') && entrybasename !== '.' && entrybasename !== '..') {
11031101
continue;
11041102
}
1105-
1103+
const baseDir = pathsCopy.find(p => entry.startsWith(path.resolve(p as string))) as string || path.resolve('.');
1104+
11061105
if (fs.lstatSync(entry).isDirectory() && isRecursive) {
11071106
preparedPaths.push(...fs.readdirSync(entry).map(x => path.join(entry, x)));
1107+
entries.push(path.relative(baseDir, entry));
11081108
} else {
1109-
entries.push(entry);
1109+
entries.push(path.relative(baseDir, entry));
11101110
}
11111111
}
11121112

node/test/ls.ts

+44-65
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import * as testutil from './testutil';
1212
describe('ls cases', () => {
1313
const TEMP_DIR_1 = path.resolve(DIRNAME, 'temp1');
1414
const TEMP_SUBDIR_1 = path.resolve(TEMP_DIR_1, 'temp1_subdir1');
15+
1516
let TEMP_FILE_1: string;
1617
let TEMP_FILE_1_JS: string;
1718
let TEMP_FILE_2: string;
@@ -41,19 +42,19 @@ describe('ls cases', () => {
4142
tl.mkdirP(TEMP_SUBDIR_1);
4243
tl.cd(TEMP_DIR_1);
4344

44-
TEMP_FILE_1 = path.join(TEMP_DIR_1, 'file1');
45+
TEMP_FILE_1 = 'file1';
4546
fs.writeFileSync(TEMP_FILE_1, 'test');
46-
TEMP_FILE_1_JS = path.join(TEMP_DIR_1, 'file1.js');
47+
TEMP_FILE_1_JS = 'file1.js';
4748
fs.writeFileSync(TEMP_FILE_1_JS, 'test');
48-
TEMP_FILE_2 = path.join(TEMP_DIR_1, 'file2');
49+
TEMP_FILE_2 = 'file2';
4950
fs.writeFileSync(TEMP_FILE_2, 'test');
50-
TEMP_FILE_2_JS = path.join(TEMP_DIR_1, 'file2.js');
51+
TEMP_FILE_2_JS = 'file2.js';
5152
fs.writeFileSync(TEMP_FILE_2_JS, 'test');
52-
TEMP_FILE_3_ESCAPED = path.join(TEMP_DIR_1, '(filename)e$cap3d.[]^-%');
53+
TEMP_FILE_3_ESCAPED = '(filename)e$cap3d.[]^-%';
5354
fs.writeFileSync(TEMP_FILE_3_ESCAPED, 'test');
54-
TEMP_HIDDEN_FILE_1 = path.join(TEMP_DIR_1, '.hidden_file');
55+
TEMP_HIDDEN_FILE_1 = '.hidden_file';
5556
fs.writeFileSync(TEMP_HIDDEN_FILE_1, 'test');
56-
TEMP_HIDDEN_DIR_1 = path.join(TEMP_DIR_1, '.hidden_dir');
57+
TEMP_HIDDEN_DIR_1 = '.hidden_dir';
5758
fs.mkdirSync(TEMP_HIDDEN_DIR_1);
5859

5960
TEMP_SUBDIR_FILE_1 = path.join(TEMP_SUBDIR_1, 'file');
@@ -79,13 +80,12 @@ describe('ls cases', () => {
7980

8081
it('Without arguments', (done) => {
8182
const result = tl.ls();
82-
8383
assert.ok(result.includes(TEMP_FILE_1));
8484
assert.ok(result.includes(TEMP_FILE_1_JS));
8585
assert.ok(result.includes(TEMP_FILE_2));
8686
assert.ok(result.includes(TEMP_FILE_2_JS));
8787
assert.ok(result.includes(TEMP_FILE_3_ESCAPED));
88-
assert.ok(result.includes(TEMP_SUBDIR_1));
88+
assert.ok(result.includes(path.relative(process.cwd(), TEMP_SUBDIR_1)));
8989
assert.equal(result.length, 6);
9090

9191
done();
@@ -99,31 +99,27 @@ describe('ls cases', () => {
9999
assert.ok(result.includes(TEMP_FILE_2));
100100
assert.ok(result.includes(TEMP_FILE_2_JS));
101101
assert.ok(result.includes(TEMP_FILE_3_ESCAPED));
102-
assert.ok(result.includes(TEMP_SUBDIR_1));
102+
assert.ok(result.includes(path.relative(process.cwd(), TEMP_SUBDIR_1)));
103103
assert.equal(result.length, 6);
104104

105105
done();
106106
});
107107

108-
it('Passed file as an argument', (done) => {
109-
const result = tl.ls(TEMP_FILE_1);
110-
111-
assert.ok(result.includes(TEMP_FILE_1));
112-
assert.equal(result.length, 1);
113-
108+
it('Passed . as an argument', (done) => {
109+
const result = tl.ls(".");
110+
assert.equal(result.length, 6);
114111
done();
115112
});
116113

117114
it('Provide the -A attribute as an argument', (done) => {
118115
tl.cd(TEMP_DIR_1);
119116
const result = tl.ls('-A');
120-
121117
assert.ok(result.includes(TEMP_FILE_1));
122118
assert.ok(result.includes(TEMP_FILE_1_JS));
123119
assert.ok(result.includes(TEMP_FILE_2));
124120
assert.ok(result.includes(TEMP_FILE_2_JS));
125121
assert.ok(result.includes(TEMP_FILE_3_ESCAPED));
126-
assert.ok(result.includes(TEMP_SUBDIR_1));
122+
assert.ok(result.includes(path.relative(process.cwd(), TEMP_SUBDIR_1)));
127123
assert.ok(result.includes(TEMP_HIDDEN_FILE_1));
128124
assert.ok(result.includes(TEMP_HIDDEN_DIR_1));
129125
assert.equal(result.length, 8);
@@ -133,22 +129,20 @@ describe('ls cases', () => {
133129

134130
it('Wildcard for TEMP_DIR_1', (done) => {
135131
const result = tl.ls(path.join(TEMP_DIR_1, '*'));
136-
137132
assert.ok(result.includes(TEMP_FILE_1));
138133
assert.ok(result.includes(TEMP_FILE_1_JS));
139134
assert.ok(result.includes(TEMP_FILE_2));
140135
assert.ok(result.includes(TEMP_FILE_2_JS));
141136
assert.ok(result.includes(TEMP_FILE_3_ESCAPED));
142-
assert.ok(result.includes(TEMP_SUBDIR_FILE_1));
143-
assert.ok(result.includes(TEMP_SUBDIR_FILELINK_1));
137+
assert.ok(result.includes(path.relative(process.cwd(), TEMP_SUBDIR_FILE_1)));
138+
assert.ok(result.includes(path.relative(process.cwd(), TEMP_SUBDIR_FILELINK_1)));
144139
assert.equal(result.length, 7);
145140

146141
done();
147142
});
148143

149144
it('Wildcard for find f*l*', (done) => {
150145
const result = tl.ls(path.join(TEMP_DIR_1, 'f*l*'));
151-
152146
assert.ok(result.includes(TEMP_FILE_1));
153147
assert.ok(result.includes(TEMP_FILE_1_JS));
154148
assert.ok(result.includes(TEMP_FILE_2));
@@ -160,7 +154,6 @@ describe('ls cases', () => {
160154

161155
it('Wildcard f*l*.js', (done) => {
162156
const result = tl.ls(path.join(TEMP_DIR_1, 'f*l*.js'));
163-
164157
assert.ok(result.includes(TEMP_FILE_1_JS));
165158
assert.ok(result.includes(TEMP_FILE_2_JS));
166159
assert.equal(result.length, 2);
@@ -170,15 +163,13 @@ describe('ls cases', () => {
170163

171164
it('Wildcard that is not valid', (done) => {
172165
const result = tl.ls(path.join(TEMP_DIR_1, '/*.j'));
173-
174166
assert.equal(result.length, 0);
175167

176168
done();
177169
});
178170

179171
it('Wildcard *.*', (done) => {
180172
const result = tl.ls(path.join(TEMP_DIR_1, '*.*'));
181-
182173
assert.ok(result.includes(TEMP_FILE_1_JS));
183174
assert.ok(result.includes(TEMP_FILE_2_JS));
184175
assert.ok(result.includes(TEMP_FILE_3_ESCAPED));
@@ -189,11 +180,10 @@ describe('ls cases', () => {
189180

190181
it('Two wildcards in the array', (done) => {
191182
const result = tl.ls([path.join(TEMP_DIR_1, 'f*le*.js'), path.join(TEMP_SUBDIR_1, '*')]);
192-
193183
assert.ok(result.includes(TEMP_FILE_1_JS));
194184
assert.ok(result.includes(TEMP_FILE_2_JS));
195-
assert.ok(result.includes(TEMP_SUBDIR_FILE_1));
196-
assert.ok(result.includes(TEMP_SUBDIR_FILELINK_1));
185+
assert.ok(result.includes(path.relative(process.cwd(), TEMP_SUBDIR_FILE_1)));
186+
assert.ok(result.includes(path.relative(process.cwd(), TEMP_SUBDIR_FILELINK_1)));
197187
assert.equal(result.length, 4);
198188

199189
done();
@@ -202,114 +192,103 @@ describe('ls cases', () => {
202192
it('Recursive without path argument', (done) => {
203193
tl.cd(TEMP_DIR_1);
204194
const result = tl.ls('-R');
205-
206195
assert.ok(result.includes(TEMP_FILE_1));
207196
assert.ok(result.includes(TEMP_FILE_1_JS));
208197
assert.ok(result.includes(TEMP_FILE_2));
209198
assert.ok(result.includes(TEMP_FILE_2_JS));
210199
assert.ok(result.includes(TEMP_FILE_3_ESCAPED));
211-
assert.ok(result.includes(TEMP_SUBDIR_FILE_1));
212-
assert.ok(result.includes(TEMP_SUBDIR_FILELINK_1));
213-
assert.equal(result.length, 7);
200+
assert.ok(result.includes(path.relative(process.cwd(), TEMP_SUBDIR_FILE_1)));
201+
assert.ok(result.includes(path.relative(process.cwd(), TEMP_SUBDIR_FILELINK_1)));
202+
assert.equal(result.length, 8);
214203

215204
done();
216205
});
217206

218207
it('Provide path and recursive attribute', (done) => {
219208
const result = tl.ls('-R', TEMP_DIR_1);
220-
221209
assert.ok(result.includes(TEMP_FILE_1));
222210
assert.ok(result.includes(TEMP_FILE_1_JS));
223211
assert.ok(result.includes(TEMP_FILE_2));
224212
assert.ok(result.includes(TEMP_FILE_2_JS));
225213
assert.ok(result.includes(TEMP_FILE_3_ESCAPED));
226-
assert.ok(result.includes(TEMP_SUBDIR_FILE_1));
227-
assert.ok(result.includes(TEMP_SUBDIR_FILELINK_1));
228-
assert.equal(result.length, 7);
214+
assert.ok(result.includes(path.relative(TEMP_DIR_1, TEMP_SUBDIR_FILE_1)));
215+
assert.ok(result.includes(path.relative(TEMP_DIR_1, TEMP_SUBDIR_FILELINK_1)));
216+
assert.equal(result.length, 8);
229217

230218
done();
231219
});
232220

233221
it('Provide path and -RA attributes', (done) => {
234222
const result = tl.ls('-RA', TEMP_DIR_1);
235-
236223
assert.ok(result.includes(TEMP_FILE_1));
237224
assert.ok(result.includes(TEMP_FILE_1_JS));
238225
assert.ok(result.includes(TEMP_FILE_2));
239226
assert.ok(result.includes(TEMP_FILE_2_JS));
240227
assert.ok(result.includes(TEMP_FILE_3_ESCAPED));
241-
assert.ok(result.includes(TEMP_SUBDIR_FILE_1));
242228
assert.ok(result.includes(TEMP_HIDDEN_FILE_1));
243-
assert.ok(result.includes(TEMP_SUBDIR_FILELINK_1));
244-
assert.equal(result.length, 8);
229+
assert.ok(result.includes(path.relative(TEMP_DIR_1, TEMP_SUBDIR_FILE_1)));
230+
assert.ok(result.includes(path.relative(TEMP_DIR_1, TEMP_SUBDIR_FILELINK_1)));
231+
assert.equal(result.length, 10);
245232

246233
done();
247234
});
248235

249236
it('Priovide -RA attribute', (done) => {
250237
const result = tl.ls('-RA', TEMP_SUBDIR_1);
251-
252-
assert.ok(result.includes(TEMP_SUBDIR_FILELINK_1));
238+
assert.ok(result.includes(path.relative(TEMP_SUBDIR_1, TEMP_SUBDIR_FILELINK_1)));
253239
assert.equal(result.length, 2);
254240

255241
done();
256242
});
257243

258244
it('Provide path and the -R attribute', (done) => {
259245
const result = tl.ls('-R', TEMP_SUBDIR_1);
260-
261-
assert.ok(result.includes(TEMP_SUBDIR_FILE_1));
262-
assert.ok(result.includes(TEMP_SUBDIR_FILELINK_1));
246+
assert.ok(result.includes(path.relative(TEMP_SUBDIR_1, TEMP_SUBDIR_FILE_1)));
247+
assert.ok(result.includes(path.relative(TEMP_SUBDIR_1, TEMP_SUBDIR_FILELINK_1)));
263248
assert.equal(result.length, 2);
264249

265250
done();
266251
});
267252

268-
it('Empty attributes, but several paths as multiple arguments', (done) => {
269-
const result = tl.ls('', TEMP_SUBDIR_1, TEMP_FILE_1);
270-
271-
assert.ok(result.includes(TEMP_FILE_1));
272-
assert.ok(result.includes(TEMP_SUBDIR_FILE_1));
273-
assert.ok(result.includes(TEMP_SUBDIR_FILELINK_1));
274-
assert.equal(result.length, 3);
253+
it('Empty attributes, non-array path as arguments', (done) => {
254+
const result = tl.ls('', TEMP_SUBDIR_1);
255+
assert.ok(result.includes(path.relative(TEMP_SUBDIR_1, TEMP_SUBDIR_FILE_1)));
256+
assert.ok(result.includes(path.relative(TEMP_SUBDIR_1, TEMP_SUBDIR_FILELINK_1)));
257+
assert.equal(result.length, 2);
275258

276259
done();
277260
});
278261

279-
it('Empty attributes, but several paths in array', (done) => {
262+
it('Empty attributes, but paths in array', (done) => {
280263
const result = tl.ls('', [TEMP_SUBDIR_1]);
281-
282-
assert.ok(result.includes(TEMP_SUBDIR_FILE_1));
283-
assert.ok(result.includes(TEMP_SUBDIR_FILELINK_1));
264+
assert.ok(result.includes(path.relative(TEMP_SUBDIR_1, TEMP_SUBDIR_FILE_1)));
265+
assert.ok(result.includes(path.relative(TEMP_SUBDIR_1, TEMP_SUBDIR_FILELINK_1)));
284266
assert.equal(result.length, 2);
285267

286268
done();
287269
});
288270

289271
it('Empty attributes, but one path', (done) => {
290272
const result = tl.ls('', TEMP_SUBDIR_1);
291-
292-
assert.ok(result.includes(TEMP_SUBDIR_FILE_1));
293-
assert.ok(result.includes(TEMP_SUBDIR_FILELINK_1));
273+
assert.ok(result.includes(path.relative(TEMP_SUBDIR_1, TEMP_SUBDIR_FILE_1)));
274+
assert.ok(result.includes(path.relative(TEMP_SUBDIR_1, TEMP_SUBDIR_FILELINK_1)));
294275
assert.equal(result.length, 2);
295276

296277
done();
297278
});
298279

299280
it('Provide path as first argument and subdir as second argument', (done) => {
300-
const result = tl.ls(TEMP_FILE_1, TEMP_SUBDIR_1);
301-
281+
const result = tl.ls(".", TEMP_SUBDIR_1);
302282
assert.ok(result.includes(TEMP_FILE_1));
303-
assert.ok(result.includes(TEMP_SUBDIR_FILE_1));
304-
assert.ok(result.includes(TEMP_SUBDIR_FILELINK_1));
305-
assert.equal(result.length, 3);
283+
assert.ok(result.includes(path.relative(TEMP_SUBDIR_1, TEMP_SUBDIR_FILE_1)));
284+
assert.ok(result.includes(path.relative(TEMP_SUBDIR_1, TEMP_SUBDIR_FILELINK_1)));
285+
assert.equal(result.length, 8);
306286

307287
done();
308288
});
309289

310290
it('New one folder without content', (done) => {
311291
tl.mkdirP('foo');
312-
313292
assert.doesNotThrow(() => tl.ls('foo'));
314293
assert.equal(tl.ls('foo').length, 0);
315294

0 commit comments

Comments
 (0)