From 0d63d6459d46cb3f8ffb5fd15ba14c2d9805dbbc Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 24 Jan 2013 17:33:42 -0700 Subject: [PATCH] Make TextMate snippets loading immune to hidden files & invalid plist closes #143 --- .../Snippets/.hidden-file | 1 + .../Snippets/invalid.plist | 1 + src/packages/snippets/spec/snippets-spec.coffee | 5 +++++ .../snippets/src/load-snippets-handler.coffee | 17 +++++++++++++++-- 4 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 spec/fixtures/packages/textmate-package.tmbundle/Snippets/.hidden-file create mode 100644 spec/fixtures/packages/textmate-package.tmbundle/Snippets/invalid.plist diff --git a/spec/fixtures/packages/textmate-package.tmbundle/Snippets/.hidden-file b/spec/fixtures/packages/textmate-package.tmbundle/Snippets/.hidden-file new file mode 100644 index 000000000..35b867918 --- /dev/null +++ b/spec/fixtures/packages/textmate-package.tmbundle/Snippets/.hidden-file @@ -0,0 +1 @@ +I am hidden so I shouldn't be loaded diff --git a/spec/fixtures/packages/textmate-package.tmbundle/Snippets/invalid.plist b/spec/fixtures/packages/textmate-package.tmbundle/Snippets/invalid.plist new file mode 100644 index 000000000..d6970c8b7 --- /dev/null +++ b/spec/fixtures/packages/textmate-package.tmbundle/Snippets/invalid.plist @@ -0,0 +1 @@ +I am not a valid plist but that shouldn't cause a crisis diff --git a/src/packages/snippets/spec/snippets-spec.coffee b/src/packages/snippets/spec/snippets-spec.coffee index d09c6503f..150dbbddd 100644 --- a/src/packages/snippets/spec/snippets-spec.coffee +++ b/src/packages/snippets/spec/snippets-spec.coffee @@ -228,6 +228,7 @@ describe "Snippets extension", -> expect(console.warn.calls.length).toBeGreaterThan 0 it "loads snippets from all TextMate packages with snippets", -> + spyOn(console, 'warn').andCallThrough() jasmine.unspy(LoadSnippetsTask.prototype, 'start') snippets.loaded = false snippets.loadAll() @@ -245,6 +246,10 @@ describe "Snippets extension", -> } """ + # warn about junk-file, but don't even try to parse a hidden file + expect(console.warn).toHaveBeenCalled() + expect(console.warn.calls.length).toBeGreaterThan 0 + describe "Snippets parser", -> it "breaks a snippet body into lines, with each line containing tab stops at the appropriate position", -> bodyTree = snippets.parser.parse """ diff --git a/src/packages/snippets/src/load-snippets-handler.coffee b/src/packages/snippets/src/load-snippets-handler.coffee index ed66e8b11..de4fe2ec9 100644 --- a/src/packages/snippets/src/load-snippets-handler.coffee +++ b/src/packages/snippets/src/load-snippets-handler.coffee @@ -6,8 +6,21 @@ module.exports = loadTextmateSnippets: (path) -> snippetsDirPath = fs.join(path, 'Snippets') - snippets = fs.list(snippetsDirPath).map (snippetPath) -> - fs.readPlist(snippetPath) + snippets = [] + + for snippetsPath in fs.list(snippetsDirPath) + logWarning = -> + console.warn "Error reading TextMate snippets file '#{snippetsPath}'" + + continue if fs.base(snippetsPath).indexOf('.') is 0 + try + if object = fs.readPlist(snippetsPath) + snippets.push(object) if object + else + logWarning() + catch e + logWarning() + @snippetsLoaded(@translateTextmateSnippets(snippets)) loadAtomSnippets: (path) ->