Ensure that evil filenames do not hose Project.scan

This commit is contained in:
Corey Johnson & Nathan Sobo
2012-07-18 16:22:21 -06:00
parent 12a576ff95
commit 4b1403724b
7 changed files with 23 additions and 11 deletions

View File

@@ -135,3 +135,10 @@ describe "Project", ->
path: project.resolve('a')
match: ['aa', 'a']
range: [[1, 3], [1, 5]]
it "works on evil filenames", ->
project.setPath(require.resolve('fixtures/evil-files'))
waitsForPromise ->
project.scan /(a)+/, ({path, match, range}) ->
matches.push({path, match, range})

View File

@@ -31,12 +31,12 @@ describe "TreeView", ->
expect(treeView.root.find('> .header .name')).toHaveText('fixtures/')
rootEntries = treeView.root.find('.entries')
subdir1 = rootEntries.find('> li:eq(0)')
expect(subdir1.find('.disclosure-arrow')).toHaveText('')
expect(subdir1.find('.name')).toHaveText('dir/')
expect(subdir1.find('.entries')).not.toExist()
subdir0 = rootEntries.find('> li:eq(0)')
expect(subdir0.find('.disclosure-arrow')).toHaveText('')
expect(subdir0.find('.name')).toHaveText('dir/')
expect(subdir0.find('.entries')).not.toExist()
subdir2 = rootEntries.find('> li:eq(1)')
subdir2 = rootEntries.find('> li:eq(2)')
expect(subdir2.find('.disclosure-arrow')).toHaveText('')
expect(subdir2.find('.name')).toHaveText('zed/')
expect(subdir2.find('.entries')).not.toExist()

View File

View File

@@ -0,0 +1 @@
you know how we do it

1
spec/fixtures/evil-files/quote".js vendored Normal file
View File

@@ -0,0 +1 @@
// I am evil because there's a " in my filename. Why you do that!?

3
spec/fixtures/evil-files/utfă.md vendored Normal file
View File

@@ -0,0 +1,3 @@
# Hello Word
This is markdown.

View File

@@ -138,13 +138,13 @@ class Project
scan: (regex, iterator) ->
regex = new RegExp(regex.source, 'g')
commands = [
"find \"#{@getPath()}\" -type f"
"grep --perl-regexp --invert-match --regexp=\"#{@ignorePathRegex()}\""
"xargs grep --null --perl-regexp --with-filename --line-number --recursive --regexp=\"#{regex.source}\""
]
command = [
"find \"#{@getPath()}\" -type f -print0" # find all paths in the project's working directory
"grep --text --perl-regexp --invert-match --regexp=\"#{@ignorePathRegex()}\"" # accept only non-ignored paths, separated by \0 (find doesn't support pcre)
"perl -0pi -e 's/\n$//'" # delete grep's trailing newline because it screws up xargs
"xargs -0 grep --null --perl-regexp --with-filename --line-number --recursive --regexp=\"#{regex.source}\"" # run grep on each filtered file
].join(" | ")
command = commands.join(" | ")
ChildProcess.exec command, bufferLines: true, stdout: (data) ->
for grepLine in data.split('\n') when grepLine.length
nullCharIndex = grepLine.indexOf('\0')