Skip to content

Commit

Permalink
Merge pull request #32 from yamadashy/fix/gitignore-compatible
Browse files Browse the repository at this point in the history
Fix gitignore syntax compliance and improve file filtering logic
  • Loading branch information
yamadashy authored Aug 4, 2024
2 parents be21c49 + 9ebeed4 commit d238145
Show file tree
Hide file tree
Showing 7 changed files with 188 additions and 139 deletions.
2 changes: 1 addition & 1 deletion .node-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
20.15.0
20.16.0
2 changes: 1 addition & 1 deletion .repopackignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
node_modules
.yarn
.eslinttcache
tests/fixtures/output
tests/fixtures
2 changes: 1 addition & 1 deletion .tool-versions
Original file line number Diff line number Diff line change
@@ -1 +1 @@
nodejs 20.15.0
nodejs 20.16.0
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,10 @@ To pack specific files or directories using glob patterns:
repopack --include "src/**/*.ts,**/*.md"
```

To exclude specific files or directories using .gitignore syntax:
To exclude specific files or directories:

```bash
repopack --ignore "*.log,tmp/"
repopack --ignore "**/*.log,tmp/"
```

Once you have generated the packed file, you can use it with Generative AI tools like Claude, ChatGPT, and Gemini.
Expand Down Expand Up @@ -232,7 +232,7 @@ Create a `repopack.config.json` file in your project root for custom configurati
|`include`| Patterns of files to include (using glob syntax) |`[]`|
|`ignore.useGitignore`| Whether to use patterns from the project's `.gitignore` file |`true`|
|`ignore.useDefaultPatterns`| Whether to use default ignore patterns |`true`|
|`ignore.customPatterns`| Additional patterns to ignore (using .gitignore syntax) |`[]`|
|`ignore.customPatterns`| Additional patterns to ignore (using glob patterns) |`[]`|

Example configuration:

Expand All @@ -250,7 +250,7 @@ Example configuration:
"ignore": {
"useGitignore": true,
"useDefaultPatterns": true,
"customPatterns": ["additional-folder", "*.log"]
"customPatterns": ["additional-folder", "**/*.log"]
}
}
```
Expand Down
76 changes: 37 additions & 39 deletions src/utils/defaultIgnore.ts
Original file line number Diff line number Diff line change
@@ -1,58 +1,56 @@
export const defaultIgnoreList = [
// Version control
'.git',
'.gitignore',
'.gitattributes',
'.hg',
'.git/**',
'.hg/**',
'.hgignore',
'.svn',
'.svn/**',

// Dependency directories
'node_modules',
'bower_components',
'node_modules/**',
'bower_components/**',

// Logs
'logs',
'*.log',
'logs/**',
'**/*.log',
'npm-debug.log*',
'yarn-debug.log*',
'yarn-error.log*',

// Runtime data
'pids',
'pids/**',
'*.pid',
'*.seed',
'*.pid.lock',

// Directory for instrumented libs generated by jscoverage/JSCover
'lib-cov',
'lib-cov/**',

// Coverage directory used by tools like istanbul
'coverage',
'coverage/**',

// nyc test coverage
'.nyc_output',
'.nyc_output/**',

// Grunt intermediate storage
'.grunt',
'.grunt/**',

// Bower dependency directory
'bower_components',
'bower_components/**',

// node-waf configuration
'.lock-wscript',

// Compiled binary addons
'build/Release',
'build/Release/**',

// Dependency directories
'jspm_packages/',
'jspm_packages/**',

// TypeScript v1 declaration files
'typings/',
'typings/**',

// Optional npm cache directory
'.npm',
'.npm/**',

// Optional eslint cache
'.eslintcache',
Expand All @@ -64,7 +62,7 @@ export const defaultIgnoreList = [
'*.tgz',

// Yarn files
'.yarn/*',
'.yarn/**',

// Yarn Integrity file
'.yarn-integrity',
Expand All @@ -73,50 +71,50 @@ export const defaultIgnoreList = [
'.env',

// next.js build output
'.next',
'.next/**',

// nuxt.js build output
'.nuxt',
'.nuxt/**',

// vuepress build output
'.vuepress/dist',
'.vuepress/dist/**',

// Serverless directories
'.serverless/',
'.serverless/**',

// FuseBox cache
'.fusebox/',
'.fusebox/**',

// DynamoDB Local files
'.dynamodb/',
'.dynamodb/**',

// TypeScript output
'dist',
'dist/**',

// OS generated files
'.DS_Store',
'Thumbs.db',
'**/.DS_Store',
'**/Thumbs.db',

// Editor directories and files
'.idea',
'.vscode',
'*.swp',
'*.swo',
'*.swn',
'*.bak',
'.idea/**',
'.vscode/**',
'**/*.swp',
'**/*.swo',
'**/*.swn',
'**/*.bak',

// Package manager locks
'package-lock.json',
'yarn.lock',
'pnpm-lock.yaml',

// Build outputs
'build',
'out',
'build/**',
'out/**',

// Temporary files
'tmp',
'temp',
'tmp/**',
'temp/**',

// repopack output
'repopack-output.txt',
Expand Down
48 changes: 24 additions & 24 deletions src/utils/filterUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,24 @@ import { defaultIgnoreList } from './defaultIgnore.js';
export async function filterFiles(rootDir: string, config: RepopackConfigMerged): Promise<string[]> {
const includePatterns = config.include.length > 0 ? config.include : ['**/*'];

const ignorePatterns = await getAllIgnorePatterns(rootDir, config);
const ignorePatterns = await getIgnorePatterns(config);
const ignoreFilePaths = await getIgnoreFilePaths(rootDir, config);

logger.trace('Include patterns:', includePatterns);
logger.trace('Ignore patterns:', ignorePatterns);
logger.trace('Ignore files:', ignoreFilePaths);

try {
const filePaths = await globby(includePatterns, {
cwd: rootDir,
ignore: ignorePatterns,
// Ignore option is in accordance with .gitignore rules
gitignore: true,
dot: true,
ignoreFiles: ignoreFilePaths,
// result options
onlyFiles: true,
followSymbolicLinks: false,
absolute: false,
// glob options
dot: true,
followSymbolicLinks: false,
});

logger.trace(`Filtered ${filePaths.length} files`);
Expand All @@ -40,35 +43,32 @@ export function parseIgnoreContent(content: string): string[] {
.filter((line) => line && !line.startsWith('#'));
}

export async function getIgnorePatterns(filename: string, rootDir: string, fsModule = fs): Promise<string[]> {
const ignorePath = path.join(rootDir, filename);
try {
const ignoreContent = await fsModule.readFile(ignorePath, 'utf-8');
return parseIgnoreContent(ignoreContent);
} catch (error) {
logger.debug(`No ${filename} file found or unable to read it.`);
return [];
export async function getIgnoreFilePaths(rootDir: string, config: RepopackConfigMerged): Promise<string[]> {
let ignoreFilePaths: string[] = [];

if (config.ignore.useGitignore) {
ignoreFilePaths.push(path.join(rootDir, '.gitignore'));
}

const existsRepopackIgnore = await fs
.access(path.join(rootDir, '.repopackignore'))
.then(() => true)
.catch(() => false);
if (existsRepopackIgnore) {
ignoreFilePaths.push(path.join(rootDir, '.repopackignore'));
}

return ignoreFilePaths;
}

export async function getAllIgnorePatterns(rootDir: string, config: RepopackConfigMerged): Promise<string[]> {
export async function getIgnorePatterns(config: RepopackConfigMerged): Promise<string[]> {
let ignorePatterns: string[] = [];

// Add default ignore patterns
if (config.ignore.useDefaultPatterns) {
ignorePatterns = [...ignorePatterns, ...defaultIgnoreList];
}

// Add .gitignore patterns
const gitignorePatterns = await getIgnorePatterns('.gitignore', rootDir);
if (config.ignore.useGitignore) {
ignorePatterns = [...ignorePatterns, ...gitignorePatterns];
}

// Add .repopackignore patterns
const repopackIgnorePatterns = await getIgnorePatterns('.repopackignore', rootDir);
ignorePatterns = [...ignorePatterns, ...repopackIgnorePatterns];

// Add custom ignore patterns
if (config.ignore.customPatterns) {
ignorePatterns = [...ignorePatterns, ...config.ignore.customPatterns];
Expand Down
Loading

0 comments on commit d238145

Please sign in to comment.