From da606a6d9d8ef27315bff01f8f4a8c817de4d1b5 Mon Sep 17 00:00:00 2001 From: Guilherme Carreiro Date: Fri, 31 Jan 2025 11:34:30 +0100 Subject: [PATCH] Improve mechanism that adds `.shopify` to `.gitignore` to avoid duplicate entries --- .changeset/curvy-kangaroos-flow.md | 6 ++++ packages/cli-kit/package.json | 1 + packages/cli-kit/src/public/node/git.test.ts | 34 ++++++++++++++++++++ packages/cli-kit/src/public/node/git.ts | 11 +++++-- pnpm-lock.yaml | 7 ++-- 5 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 .changeset/curvy-kangaroos-flow.md diff --git a/.changeset/curvy-kangaroos-flow.md b/.changeset/curvy-kangaroos-flow.md new file mode 100644 index 00000000000..d766fa09f36 --- /dev/null +++ b/.changeset/curvy-kangaroos-flow.md @@ -0,0 +1,6 @@ +--- +'@shopify/cli-kit': patch +'@shopify/theme': patch +--- + +Improve mechanism that adds `.shopify` to `.gitignore` to avoid duplicate entries diff --git a/packages/cli-kit/package.json b/packages/cli-kit/package.json index d1d0815f1e2..b2834a26f2a 100644 --- a/packages/cli-kit/package.json +++ b/packages/cli-kit/package.json @@ -137,6 +137,7 @@ "gradient-string": "2.0.2", "graphql": "16.8.1", "graphql-request": "5.2.0", + "ignore": "6.0.2", "ink": "4.4.1", "is-interactive": "2.0.0", "jose": "5.9.6", diff --git a/packages/cli-kit/src/public/node/git.test.ts b/packages/cli-kit/src/public/node/git.test.ts index b31b81761f5..84b5f1d8a25 100644 --- a/packages/cli-kit/src/public/node/git.test.ts +++ b/packages/cli-kit/src/public/node/git.test.ts @@ -444,4 +444,38 @@ describe('addToGitIgnore()', () => { expect(gitIgnoreContent).toBe('node_modules\ndist\n.shopify\n') }) }) + + test('does nothing when .shopify/* pattern exists in .gitignore', async () => { + await inTemporaryDirectory(async (tmpDir) => { + // Given + const gitIgnorePath = `${tmpDir}/.gitignore` + const gitIgnoreContent = '.shopify/*\nnode_modules\n' + + writeFileSync(gitIgnorePath, gitIgnoreContent) + + // When + git.addToGitIgnore(tmpDir, '.shopify') + + // Then + const actualContent = readFileSync(gitIgnorePath).toString() + expect(actualContent).toBe(gitIgnoreContent) + }) + }) + + test('does nothing when .shopify/** pattern exists in .gitignore', async () => { + await inTemporaryDirectory(async (tmpDir) => { + // Given + const gitIgnorePath = `${tmpDir}/.gitignore` + const gitIgnoreContent = '.shopify/**\nnode_modules\n' + + writeFileSync(gitIgnorePath, gitIgnoreContent) + + // When + git.addToGitIgnore(tmpDir, '.shopify') + + // Then + const actualContent = readFileSync(gitIgnorePath).toString() + expect(actualContent).toBe(gitIgnoreContent) + }) + }) }) diff --git a/packages/cli-kit/src/public/node/git.ts b/packages/cli-kit/src/public/node/git.ts index e3d9f2f0570..0e07bc7d571 100644 --- a/packages/cli-kit/src/public/node/git.ts +++ b/packages/cli-kit/src/public/node/git.ts @@ -6,6 +6,7 @@ import {cwd, joinPath} from './path.js' import {runWithTimer} from './metadata.js' import {outputContent, outputToken, outputDebug} from '../../public/node/output.js' import git, {TaskOptions, SimpleGitProgressEvent, DefaultLogFields, ListLogLine, SimpleGit} from 'simple-git' +import ignore from 'ignore' /** * Initialize a git repository at the given directory. @@ -83,8 +84,14 @@ export function addToGitIgnore(root: string, entry: string): void { const gitIgnoreContent = readFileSync(gitIgnorePath).toString() const eol = detectEOL(gitIgnoreContent) - if (gitIgnoreContent.split(eol).some((line) => line.trim() === entry.trim())) { - // The file already existing in the .gitignore + const lines = gitIgnoreContent.split(eol).map((line) => line.trim()) + const ignoreManager = ignore.default({allowRelativePaths: true}).add(lines) + + const isIgnoredEntry = ignoreManager.ignores(joinPath(entry)) + const isIgnoredEntryAsDir = ignoreManager.ignores(joinPath(entry, 'ignored.txt')) + const isAlreadyIgnored = isIgnoredEntry || isIgnoredEntryAsDir + if (isAlreadyIgnored) { + // The file is already ignored by an existing pattern return } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5d861013fb2..4aa1723bbfc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -401,6 +401,9 @@ importers: graphql-request: specifier: 5.2.0 version: 5.2.0(graphql@16.8.1) + ignore: + specifier: 6.0.2 + version: 6.0.2 ink: specifier: 4.4.1 version: 4.4.1(@types/react@17.0.2)(react@18.2.0) @@ -4322,7 +4325,7 @@ packages: debug: 4.4.0(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 - ignore: 5.3.1 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -11413,7 +11416,7 @@ packages: glob-parent: 6.0.2 globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3