diff --git a/packages/glob/__tests__/windows-path-matching.test.ts b/packages/glob/__tests__/windows-path-matching.test.ts new file mode 100644 index 00000000..afdbd49e --- /dev/null +++ b/packages/glob/__tests__/windows-path-matching.test.ts @@ -0,0 +1,80 @@ +/** + * Test to validate that glob works correctly on Windows with backslash paths + * This test validates the fix for: https://github.com/actions/toolkit/issues/ + */ + +import * as path from 'path' +import {MatchKind} from '../src/internal-match-kind' +import {Pattern} from '../src/internal-pattern' + +const IS_WINDOWS = process.platform === 'win32' + +describe('Windows path matching', () => { + it('matches paths with backslashes on Windows', () => { + if (!IS_WINDOWS) { + // This test is only relevant on Windows + return + } + + // Test basic pattern matching with Windows paths + const pattern = new Pattern('C:\\Users\\test\\*') + + // The itemPath would come from fs.readdir with backslashes on Windows + const itemPath = 'C:\\Users\\test\\file.txt' + + // This should match because the pattern and path both refer to the same file + expect(pattern.match(itemPath)).toBe(MatchKind.All) + }) + + it('partial matches work with backslashes on Windows', () => { + if (!IS_WINDOWS) { + return + } + + // Test partial matching with Windows paths + const pattern = new Pattern('C:\\Users\\test\\**') + + // Should partially match parent directory + expect(pattern.partialMatch('C:\\Users')).toBe(true) + expect(pattern.partialMatch('C:\\Users\\test')).toBe(true) + }) + + it('matches globstar patterns with backslashes on Windows', () => { + if (!IS_WINDOWS) { + return + } + + const pattern = new Pattern('C:\\foo\\**') + + // Should match the directory itself and descendants + expect(pattern.match('C:\\foo')).toBe(MatchKind.All) + expect(pattern.match('C:\\foo\\bar')).toBe(MatchKind.All) + expect(pattern.match('C:\\foo\\bar\\baz.txt')).toBe(MatchKind.All) + }) + + it('matches wildcard patterns with mixed separators on Windows', () => { + if (!IS_WINDOWS) { + return + } + + // Pattern might be specified with forward slashes by user + const pattern = new Pattern('C:/Users/*/file.txt') + + // But the actual path from filesystem will have backslashes + expect(pattern.match('C:\\Users\\test\\file.txt')).toBe(MatchKind.All) + }) + + it('handles complex patterns with backslashes on Windows', () => { + if (!IS_WINDOWS) { + return + } + + const currentDrive = process.cwd().substr(0, 2) + const pattern = new Pattern(`${currentDrive}\\**\\*.txt`) + + // Should match .txt files at any depth + expect(pattern.match(`${currentDrive}\\file.txt`)).toBe(MatchKind.All) + expect(pattern.match(`${currentDrive}\\foo\\bar\\test.txt`)).toBe(MatchKind.All) + expect(pattern.match(`${currentDrive}\\foo\\bar\\test.js`)).toBe(MatchKind.None) + }) +})