From 57c560e7d522d6e9cddf9868a2a0bf335d00fcba Mon Sep 17 00:00:00 2001 From: Michael Krotscheck Date: Thu, 26 May 2016 10:24:15 -0700 Subject: [PATCH] .gitignore includes files flagged as ignored. If a file is ignored in the project builder, it is now persisted into the .gitignore file in the project. Change-Id: Ic8e5d08b82da5809b1dc2a8427f6563dc9acf00b --- .gitignore | 4 +- generators/app/lib/component/gitignore.js | 21 ++++++++++- spec/app/lib/component/gitignore.js | 45 ++++++++++++++++++++--- 3 files changed, 61 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index dc1d32d..f5fd01c 100644 --- a/.gitignore +++ b/.gitignore @@ -12,8 +12,8 @@ dist lib-cov logs node_modules -npm-debug.log* +npm-debug.log package pids reports -www \ No newline at end of file +www diff --git a/generators/app/lib/component/gitignore.js b/generators/app/lib/component/gitignore.js index 92610d5..2623079 100644 --- a/generators/app/lib/component/gitignore.js +++ b/generators/app/lib/component/gitignore.js @@ -53,17 +53,34 @@ * @returns {generator} The passed generator, for promise chaining. */ function configureGitIgnore (generator) { - var ignoreContent = Object.keys(excludedPaths).sort().join('\n'); + var ignoreContent = buildGitignore(); if (ignoreContent.length === 0) { // Delete the file if there's nothing to ignore. projectBuilder.removeFile(filePath); } else { - projectBuilder.writeFile(filePath, ignoreContent); + projectBuilder.writeFile(filePath, buildGitignore); } return generator; } + /** + * Generate the content of our .gitignore file from the configured list of excluded paths, + * as well as any project-level configured ignoreFiles. + * + * @returns {string} The content of the .eslintignore file. + */ + function buildGitignore () { + var ignoredFiles = projectBuilder.getIgnoredFiles(); + for (var i = 0; i < ignoredFiles.length; i++) { + if (!excludedPaths.hasOwnProperty(ignoredFiles[i])) { + excludedPaths[ignoredFiles[i]] = true; + } + } + + return Object.keys(excludedPaths).sort().join('\n'); + } + module.exports = { init: initGitignore, prompt: noop, diff --git a/spec/app/lib/component/gitignore.js b/spec/app/lib/component/gitignore.js index a402dc0..c690b70 100644 --- a/spec/app/lib/component/gitignore.js +++ b/spec/app/lib/component/gitignore.js @@ -84,13 +84,48 @@ var files = projectBuilder.getIncludedFiles(); var ignoreRef = files[0]; - var ignoreContent = ignoreRef.content.split('\n'); + var ignoreContent = ignoreRef.content().split('\n'); expect(ignoreContent.length).toBe(2); expect(ignoreContent[0]).toEqual('one'); expect(ignoreContent[1]).toEqual('two'); }); + it('should include any files flagged as ignored in the project builder.', + function () { + mockGenerator.fs.write('.gitignore', ''); + projectBuilder.ignoreFile('foo/bar.json'); + + gitignore.init(mockGenerator); + gitignore.prompt(mockGenerator); + gitignore.configure(mockGenerator); + + var files = projectBuilder.getIncludedFiles(); + var ignoreRef = files[0]; // There should only be one file. + var ignoreContent = ignoreRef.content().split('\n'); + expect(ignoreContent.length).toBe(1); + + expect(ignoreContent[0]).toBe('foo/bar.json'); + }); + + it('should de-duplicate file paths from multiple locations.', + function () { + // include 'node_modules' from both an existing file and from the project builder. + mockGenerator.fs.write('.gitignore', ['node_modules'].join('\n')); + projectBuilder.ignoreFile('node_modules'); + + gitignore.init(mockGenerator); + gitignore.prompt(mockGenerator); + gitignore.configure(mockGenerator); + + var files = projectBuilder.getIncludedFiles(); + var ignoreRef = files[0]; // There should only be one file. + var ignoreContent = ignoreRef.content().split('\n'); + expect(ignoreContent.length).toBe(1); + + expect(ignoreContent[0]).toBe('node_modules'); + }); + it('should sort the ignored files.', function () { mockGenerator.fs.write('.gitignore', ['b_line', 'a_line'].join('\n')); @@ -101,7 +136,7 @@ var files = projectBuilder.getIncludedFiles(); var ignoreRef = files[0]; - var ignoreContent = ignoreRef.content.split('\n'); + var ignoreContent = ignoreRef.content().split('\n'); expect(ignoreContent.length).toBe(2); expect(ignoreContent[0]).toBe('a_line'); expect(ignoreContent[1]).toBe('b_line'); @@ -117,7 +152,7 @@ var files = projectBuilder.getIncludedFiles(); var ignoreRef = files[0]; - var ignoreContent = ignoreRef.content.split('\n'); + var ignoreContent = ignoreRef.content().split('\n'); expect(ignoreContent.length).toBe(2); expect(ignoreContent[0]).toBe('1_one'); expect(ignoreContent[1]).toBe('2_two'); @@ -133,7 +168,7 @@ var files = projectBuilder.getIncludedFiles(); var ignoreRef = files[0]; - var ignoreContent = ignoreRef.content.split('\n'); + var ignoreContent = ignoreRef.content().split('\n'); expect(ignoreContent.length).toBe(1); expect(ignoreContent[0]).toBe('1_one'); }); @@ -148,7 +183,7 @@ var files = projectBuilder.getIncludedFiles(); var ignoreRef = files[0]; - var ignoreContent = ignoreRef.content.split('\n'); + var ignoreContent = ignoreRef.content().split('\n'); expect(ignoreContent.length).toBe(1); expect(ignoreContent[0]).toBe('1_one'); });