git-dedup 0.1.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +29 -32
  2. package/dist/commands/store/$default.d.ts +1 -1
  3. package/dist/commands/store/$default.d.ts.map +1 -1
  4. package/dist/commands/store/$default.js +14 -3
  5. package/dist/commands/store/$default.js.map +1 -1
  6. package/dist/commands/{cache.d.ts → store/add.d.ts} +3 -3
  7. package/dist/commands/store/add.d.ts.map +1 -0
  8. package/dist/commands/{cache.js → store/add.js} +19 -19
  9. package/dist/commands/store/add.js.map +1 -0
  10. package/dist/commands/store/fetch.d.ts.map +1 -1
  11. package/dist/commands/store/fetch.js +6 -1
  12. package/dist/commands/store/fetch.js.map +1 -1
  13. package/dist/commands/store/prune.d.ts +4 -0
  14. package/dist/commands/store/prune.d.ts.map +1 -0
  15. package/dist/commands/store/prune.js +9 -0
  16. package/dist/commands/store/prune.js.map +1 -0
  17. package/dist/commands/store/remove.d.ts +16 -0
  18. package/dist/commands/store/remove.d.ts.map +1 -0
  19. package/dist/commands/store/remove.js +48 -0
  20. package/dist/commands/store/remove.js.map +1 -0
  21. package/dist/context.d.ts +6 -4
  22. package/dist/context.d.ts.map +1 -1
  23. package/dist/discover.d.ts +3 -3
  24. package/dist/discover.d.ts.map +1 -1
  25. package/dist/discover.js +44 -25
  26. package/dist/discover.js.map +1 -1
  27. package/dist/index.js +1 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/stats.d.ts.map +1 -1
  30. package/dist/stats.js +4 -15
  31. package/dist/stats.js.map +1 -1
  32. package/package.json +8 -3
  33. package/dist/commands/cache.d.ts.map +0 -1
  34. package/dist/commands/cache.js.map +0 -1
  35. package/dist/commands/doctor.d.ts +0 -4
  36. package/dist/commands/doctor.d.ts.map +0 -1
  37. package/dist/commands/doctor.js +0 -12
  38. package/dist/commands/doctor.js.map +0 -1
package/README.md CHANGED
@@ -3,29 +3,26 @@
3
3
  [![npm version](https://img.shields.io/npm/v/git-dedup.svg)](https://www.npmjs.com/package/git-dedup)
4
4
  [![npm downloads](https://img.shields.io/npm/dm/git-dedup.svg)](https://www.npmjs.com/package/git-dedup)
5
5
  [![CI](https://github.com/bhouston/git-dedup/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/bhouston/git-dedup/actions/workflows/ci.yml)
6
+ [![Coverage](https://codecov.io/gh/bhouston/git-dedup/branch/main/graph/badge.svg)](https://codecov.io/gh/bhouston/git-dedup)
6
7
  [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/bhouston/git-dedup/blob/main/LICENSE)
7
- [![Documentation](https://img.shields.io/badge/docs-git-dedup-blue)](https://git-dedup.ben3d.ca/)
8
+ [![Documentation](https://img.shields.io/badge/docs-git--dedup-blue)](https://git-dedup.ben3d.ca/)
8
9
  [![Discord](https://img.shields.io/badge/Discord-Join-5865F2?logo=discord&logoColor=white)](https://discord.gg/5J5Ur3F6Z2)
9
10
 
10
- git-dedup keeps Git objects from many remotes in one local object pool. Supported clones and linked repositories use Git alternates to borrow those objects, reducing duplicate storage across checkouts and forks. git-dedup is not a disposable cache: linked checkouts depend on the store.
11
+ **Faster checkouts, a fraction of the disk space.**
11
12
 
12
- In one typical local setup spanning 117 checkouts (94 distinct Git object databases, with linked worktrees counted once), git-dedup uses 11.1 GB for Git objects versus an estimated 35.5 GB without sharing, saving about 24.4 GB (69%).
13
+ git-dedup is a drop-in replacement for `git clone` built for fleets of coding agents. It automatically keeps one shared copy of Git history, so every new clone, worktree, and submodule reuses what is already on disk instead of downloading it again. Large checkouts are 6x faster, and Git data takes 70% less disk.
13
14
 
14
15
  ```sh
15
- # Populate the shared object pool in ~/.git-dedup.
16
- git-dedup clone https://github.com/you/project.git project
16
+ npm install --global git-dedup
17
17
 
18
- # Another checkout borrows objects from the same pool.
19
- git-dedup clone https://github.com/you/project.git project-review
20
- cd project-review
18
+ # check out a new repo automatically using the dedup store
19
+ git-dedup clone https://github.com/you/project.git
21
20
 
22
- # All normal Git commands work in the checkout.
23
- git status
24
- git diff
25
- git log --oneline
21
+ # dedup an existing repo into the store
22
+ git-dedup store add ./my-existing-repo
26
23
  ```
27
24
 
28
- Repeated clones can borrow objects already in the pool, reducing download and storage work.
25
+ That's it. git-dedup automatically consolidates the new or existing project's history into a shared store in `~/.git-dedup` or if its history already existed there, it reuses it automatically.
29
26
 
30
27
  **[Documentation](https://git-dedup.ben3d.ca/) · [Source](https://github.com/bhouston/git-dedup) · [Agent setup](https://git-dedup.ben3d.ca/docs/agents)**
31
28
 
@@ -38,8 +35,6 @@ npm install --global git-dedup
38
35
  git-dedup --help
39
36
  ```
40
37
 
41
- If you previously installed `@bhouston/gitx`, install `git-dedup` and update scripts or editor settings that call `gitx`. Existing gitx stores and linked checkouts continue to work; the new CLI reuses an existing store automatically.
42
-
43
38
  ## Usage
44
39
 
45
40
  ```sh
@@ -48,11 +43,11 @@ git-dedup clone https://github.com/bhouston/git-dedup.git git-dedup-main
48
43
  git-dedup --stats clone https://github.com/bhouston/git-dedup.git git-dedup-review
49
44
 
50
45
  # Adopt an existing repository and its discoverable submodules.
51
- git-dedup cache ./git-dedup-main --stats
46
+ git-dedup store add ./git-dedup-main --stats
52
47
 
53
48
  # Preview, then adopt every checkout in a workspace directory.
54
- git-dedup cache ~/Coding --all --dry-run
55
- git-dedup cache ~/Coding --all
49
+ git-dedup store add ~/Coding --all --dry-run
50
+ git-dedup store add ~/Coding --all
56
51
 
57
52
  # Ordinary Git commands also work through git-dedup.
58
53
  git-dedup -C git-dedup-main status
@@ -69,31 +64,33 @@ git-dedup worktree add -b review ../project-review
69
64
 
70
65
  Supported updates prepare missing submodule repositories from the pool, including nested modules with `--recursive`. `git-dedup submodule add` adds the module to the store after Git creates it. `git-dedup worktree add` uses Git's common object database and initializes supported submodules in the new worktree; `--no-checkout` defers initialization.
71
66
 
72
- Other Git commands and unsupported clone forms pass through to Git. Local path clones, shallow or partial clones, and SHA-256 repositories use ordinary Git behavior.
67
+ Other Git commands and unsupported clone forms pass through to Git. Local path clones, shallow or partial clones, and SHA-256 repositories use ordinary Git behavior. When git-dedup forwards a clone, submodule, or worktree command it would otherwise handle, it prints one `git-dedup: <reason>; using plain Git` line on stderr unless you pass `-q` or `--quiet`.
73
68
 
74
- `cache --all` scans checkout directories below the given path without following symlinks. It skips Git metadata and common dependency/build directories (`node_modules`, `vendor`, `dist`, `build`, `target`, `.next`, `.nuxt`, `.turbo`, `.venv`, and `coverage`). It does not initialize absent submodules. Linked worktrees sharing one Git object database are processed once. Each checkout's outcome appears separately, and a failed checkout does not stop the remaining targets.
69
+ `store add` accepts a local checkout path, not a remote URL. The checkout can then depend on the shared store for Git objects. `store fetch` refreshes registered remotes.
70
+
71
+ `store add --all` scans checkout directories below the given path without following symlinks. Within a Git worktree, it follows applicable Git ignore rules and skips `.git` metadata. Outside a Git worktree, it scans all directory names until it finds a checkout. It does not initialize absent submodules. Linked worktrees sharing one Git object database are processed once. Each checkout's outcome appears separately, and a failed checkout does not stop the remaining targets.
75
72
 
76
73
  ### Store commands
77
74
 
78
- | Command | Purpose |
79
- | ----------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
80
- | `git-dedup cache [path]` | Adopt or relink a repository and its submodules; report skipped and failed paths (`--verbose` shows full Git errors) |
81
- | `git-dedup cache <directory> --all` | Discover and adopt checkouts below a directory; use `--dry-run` to preview |
82
- | `git-dedup store` | Show store path, remote count, and size |
83
- | `git-dedup store fetch` | Fetch registered remotes into the pool |
84
- | `git-dedup store gc` | Compact the pool without pruning consumer objects |
85
- | `git-dedup doctor` | Inspect the pool and Git setup |
75
+ | Command | Purpose |
76
+ | ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
77
+ | `git-dedup store add [path]` | Adopt or relink a repository and its submodules; report skipped and failed paths (`--verbose` shows full Git errors) |
78
+ | `git-dedup store add <directory> --all` | Discover and adopt checkouts below a directory; use `--dry-run` to preview |
79
+ | `git-dedup store` | Show store path, remote count, size, and Git and pool health checks |
80
+ | `git-dedup store fetch` | Fetch registered remotes into the pool |
81
+ | `git-dedup store gc` | Compact the pool without pruning consumer objects |
82
+ | `git-dedup store prune` | Reclaim pool objects no registered checkout uses; refuses while a checkout is missing |
83
+ | `git-dedup store remove <path>` | Detach a checkout: copy its objects back and unlink it from the pool |
84
+ | `git-dedup store remove --forget <path>` | Unregister a deleted checkout so `store prune` can run |
86
85
 
87
86
  ### Optional storage reports
88
87
 
89
88
  ```sh
90
89
  git-dedup --stats clone https://github.com/bhouston/git-dedup.git git-dedup-extra
91
- git-dedup cache ./git-dedup-extra --stats
90
+ git-dedup store add ./git-dedup-extra --stats
92
91
  ```
93
92
 
94
- Reports go to stderr and show whether the pool already existed. Adoption reports compare private pack bytes before and after adoption. Clone reports identify use of Git alternates; they do not estimate disk savings.
95
-
96
- Measurement is opt-in and scans local `.pack`, `.idx`, and `.rev` file metadata, without traversing Git objects. It excludes loose objects. These are logical file-size estimates, not measured disk blocks reclaimed. The first use populates the pool and can increase total disk use. Plain Git fallback does not print a report.
93
+ Reports go to stderr. See [storage reports](https://git-dedup.ben3d.ca/docs/how-it-works#storage-reports) for what they measure.
97
94
 
98
95
  ## Configuration
99
96
 
@@ -1,3 +1,3 @@
1
- export declare const describe = "Show the shared store";
1
+ export declare const describe = "Show the shared store and its health";
2
2
  export declare const handler: () => Promise<void>;
3
3
  //# sourceMappingURL=$default.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"$default.d.ts","sourceRoot":"","sources":["../../../src/commands/store/$default.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,0BAA0B,CAAC;AAChD,eAAO,MAAM,OAAO,qBAGnB,CAAC"}
1
+ {"version":3,"file":"$default.d.ts","sourceRoot":"","sources":["../../../src/commands/store/$default.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,QAAQ,yCAAyC,CAAC;AAC/D,eAAO,MAAM,OAAO,qBAYnB,CAAC"}
@@ -1,7 +1,18 @@
1
+ import { humanizeBytes } from 'humanize-units';
1
2
  import { dedup } from '../../context.js';
2
- export const describe = 'Show the shared store';
3
+ export const describe = 'Show the shared store and its health';
3
4
  export const handler = async () => {
4
- const info = await dedup().storeInfo();
5
- console.log(`${info.path}\nRemotes: ${info.remoteCount}\nSize: ${info.sizeBytes} bytes`);
5
+ const client = dedup();
6
+ const info = await client.storeInfo();
7
+ console.log(`${info.path}\nRemotes: ${info.remoteCount}\nSize: ${humanizeBytes(info.sizeBytes)}`);
8
+ const health = await client.doctor();
9
+ if (health.empty) {
10
+ console.log('The store is empty. Start with `git-dedup clone <url>` or `git-dedup store add [path]`.');
11
+ }
12
+ for (const check of health.checks) {
13
+ console.log(`${check.ok ? 'OK' : 'WARN'} ${check.name}: ${check.detail}`);
14
+ }
15
+ if (health.checks.some((check) => !check.ok))
16
+ process.exitCode = 1;
6
17
  };
7
18
  //# sourceMappingURL=$default.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"$default.js","sourceRoot":"","sources":["../../../src/commands/store/$default.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,MAAM,CAAC,MAAM,QAAQ,GAAG,uBAAuB,CAAC;AAChD,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;IAChC,MAAM,IAAI,GAAG,MAAM,KAAK,EAAE,CAAC,SAAS,EAAE,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,WAAW,WAAW,IAAI,CAAC,SAAS,QAAQ,CAAC,CAAC;AAC3F,CAAC,CAAC"}
1
+ {"version":3,"file":"$default.js","sourceRoot":"","sources":["../../../src/commands/store/$default.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,MAAM,CAAC,MAAM,QAAQ,GAAG,sCAAsC,CAAC;AAC/D,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;IAChC,MAAM,MAAM,GAAG,KAAK,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,WAAW,WAAW,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAClG,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;IACrC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,yFAAyF,CAAC,CAAC;IACzG,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACrE,CAAC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import type { ArgumentsCamelCase, Argv } from 'yargs';
2
- export declare const command = "cache [path]";
3
- export declare const describe = "Adopt or relink a repository to the shared store";
2
+ export declare const command = "add [path]";
3
+ export declare const describe = "Add a local checkout to the shared store; linked checkouts depend on it";
4
4
  export declare const builder: (parser: Argv) => Argv<{
5
5
  path: string | undefined;
6
6
  } & {
@@ -19,4 +19,4 @@ export declare const handler: (args: ArgumentsCamelCase<{
19
19
  dryRun: boolean;
20
20
  verbose: boolean;
21
21
  }>) => Promise<void>;
22
- //# sourceMappingURL=cache.d.ts.map
22
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/commands/store/add.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAMtD,eAAO,MAAM,OAAO,eAAe,CAAC;AACpC,eAAO,MAAM,QAAQ,4EAA4E,CAAC;AAClG,eAAO,MAAM,OAAO,WAAY,IAAI;;;;;;;;;;EAyB9B,CAAC;AAWP,eAAO,MAAM,OAAO,SACZ,kBAAkB,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,kBA+C7G,CAAC"}
@@ -1,12 +1,12 @@
1
- import { dedup } from '../context.js';
2
- import { printStorageReports } from '../stats.js';
3
- import { discoverCheckouts } from '../discover.js';
4
- export const command = 'cache [path]';
5
- export const describe = 'Adopt or relink a repository to the shared store';
1
+ import { dedup } from '../../context.js';
2
+ import { printStorageReports } from '../../stats.js';
3
+ import { discoverCheckouts } from '../../discover.js';
4
+ export const command = 'add [path]';
5
+ export const describe = 'Add a local checkout to the shared store; linked checkouts depend on it';
6
6
  export const builder = (parser) => parser
7
7
  .positional('path', {
8
8
  type: 'string',
9
- describe: 'Repository path (defaults to the current directory)',
9
+ describe: 'Local checkout path (defaults to the current directory)',
10
10
  })
11
11
  .option('stats', {
12
12
  type: 'boolean',
@@ -16,12 +16,12 @@ export const builder = (parser) => parser
16
16
  .option('all', {
17
17
  type: 'boolean',
18
18
  default: false,
19
- describe: 'Discover and cache all checkouts under the directory',
19
+ describe: 'Discover and add all checkouts under the directory',
20
20
  })
21
21
  .option('dry-run', {
22
22
  type: 'boolean',
23
23
  default: false,
24
- describe: 'Preview checkouts discovered by --all without caching',
24
+ describe: 'Preview checkouts discovered by --all without adding them',
25
25
  })
26
26
  .option('verbose', {
27
27
  type: 'boolean',
@@ -32,7 +32,7 @@ function reportRepositories(result, verbose) {
32
32
  for (const repository of result.repositories) {
33
33
  if (!repository.reason)
34
34
  continue;
35
- const label = repository.status === 'cached' ? 'Warning' : repository.status === 'failed' ? 'Failed' : 'Skipped';
35
+ const label = repository.status === 'added' ? 'Warning' : repository.status === 'failed' ? 'Failed' : 'Skipped';
36
36
  console.error(`${label} ${repository.path}: ${repository.reason}`);
37
37
  if (verbose && repository.detail)
38
38
  console.error(repository.detail);
@@ -44,14 +44,14 @@ export const handler = async (args) => {
44
44
  const reports = [];
45
45
  const client = dedup(args.stats ? { onStorageReport: (report) => reports.push(report) } : undefined);
46
46
  if (args.all) {
47
- const targets = await discoverCheckouts(args.path ?? process.cwd());
47
+ const targets = await discoverCheckouts(args.path ?? process.cwd(), await client.gitPath());
48
48
  console.log(`Discovered ${targets.length} checkout(s):`);
49
49
  for (const target of targets)
50
50
  console.log(` ${target.path}${target.coveredBy ? ` (submodule of ${target.coveredBy})` : ''}`);
51
51
  if (args.dryRun)
52
52
  return;
53
53
  const completed = new Set();
54
- let cached = 0;
54
+ let added = 0;
55
55
  let skipped = 0;
56
56
  let failed = 0;
57
57
  for (const target of targets) {
@@ -60,35 +60,35 @@ export const handler = async (args) => {
60
60
  continue;
61
61
  }
62
62
  try {
63
- const result = await client.cache(target.path);
64
- cached += result.cached;
63
+ const result = await client.add(target.path);
64
+ added += result.added;
65
65
  skipped += result.skipped;
66
66
  failed += result.failed;
67
67
  reportRepositories(result, args.verbose);
68
68
  completed.add(target.path);
69
- console.log(`Finished ${target.path}: cached ${result.cached}, skipped ${result.skipped}, failed ${result.failed}`);
69
+ console.log(`Finished ${target.path}: added ${result.added}, skipped ${result.skipped}, failed ${result.failed}`);
70
70
  }
71
71
  catch (error) {
72
72
  failed++;
73
73
  const detail = error instanceof Error ? error.message : String(error);
74
- console.error(`Failed ${target.path}: cache operation failed`);
74
+ console.error(`Failed ${target.path}: store add operation failed`);
75
75
  if (args.verbose)
76
76
  console.error(detail);
77
77
  }
78
78
  }
79
- console.log(`Cached ${cached} repository(s); skipped ${skipped}; failed ${failed}.`);
79
+ console.log(`Added ${added} repository(s); skipped ${skipped}; failed ${failed}.`);
80
80
  if (args.stats)
81
81
  printStorageReports(reports);
82
82
  if (failed)
83
83
  process.exitCode = 1;
84
84
  return;
85
85
  }
86
- const result = await client.cache(args.path);
86
+ const result = await client.add(args.path);
87
87
  reportRepositories(result, args.verbose);
88
- console.log(`Cached ${result.cached} repository(s); skipped ${result.skipped}; failed ${result.failed}.`);
88
+ console.log(`Added ${result.added} repository(s); skipped ${result.skipped}; failed ${result.failed}.`);
89
89
  if (args.stats)
90
90
  printStorageReports(reports);
91
91
  if (result.failed)
92
92
  process.exitCode = 1;
93
93
  };
94
- //# sourceMappingURL=cache.js.map
94
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/commands/store/add.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../src/commands/store/fetch.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO,UAAU,CAAC;AAC/B,eAAO,MAAM,QAAQ,yDAAyD,CAAC;AAC/E,eAAO,MAAM,OAAO,qBAGnB,CAAC"}
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../src/commands/store/fetch.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO,UAAU,CAAC;AAC/B,eAAO,MAAM,QAAQ,yDAAyD,CAAC;AAC/E,eAAO,MAAM,OAAO,qBAMnB,CAAC"}
@@ -3,6 +3,11 @@ export const command = 'fetch';
3
3
  export const describe = 'Fetch registered remotes into the shared object pool';
4
4
  export const handler = async () => {
5
5
  const result = await dedup().fetch();
6
- console.log(`Fetched ${result.fetched} remote(s).`);
6
+ for (const remote of result.remotes)
7
+ if (remote.status === 'failed')
8
+ console.error(`Failed ${remote.key}: ${remote.reason}`);
9
+ console.log(`Fetched ${result.fetched} remote(s); ${result.failed} failed.`);
10
+ if (result.failed)
11
+ process.exitCode = 1;
7
12
  };
8
13
  //# sourceMappingURL=fetch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../src/commands/store/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAC/B,MAAM,CAAC,MAAM,QAAQ,GAAG,sDAAsD,CAAC;AAC/E,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;IAChC,MAAM,MAAM,GAAG,MAAM,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,CAAC,CAAC"}
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../src/commands/store/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAC/B,MAAM,CAAC,MAAM,QAAQ,GAAG,sDAAsD,CAAC;AAC/E,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;IAChC,MAAM,MAAM,GAAG,MAAM,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC;IACrC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO;QACjC,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1F,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,OAAO,eAAe,MAAM,CAAC,MAAM,UAAU,CAAC,CAAC;IAC7E,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AAC1C,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const command = "prune";
2
+ export declare const describe = "Reclaim pool objects that no registered checkout uses";
3
+ export declare const handler: () => Promise<void>;
4
+ //# sourceMappingURL=prune.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune.d.ts","sourceRoot":"","sources":["../../../src/commands/store/prune.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,UAAU,CAAC;AAC/B,eAAO,MAAM,QAAQ,0DAA0D,CAAC;AAChF,eAAO,MAAM,OAAO,qBAGnB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { humanizeBytes } from 'humanize-units';
2
+ import { dedup } from '../../context.js';
3
+ export const command = 'prune';
4
+ export const describe = 'Reclaim pool objects that no registered checkout uses';
5
+ export const handler = async () => {
6
+ const result = await dedup().prune();
7
+ console.log(`Reclaimed ${humanizeBytes(result.reclaimedBytes)}.`);
8
+ };
9
+ //# sourceMappingURL=prune.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune.js","sourceRoot":"","sources":["../../../src/commands/store/prune.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAC/B,MAAM,CAAC,MAAM,QAAQ,GAAG,uDAAuD,CAAC;AAChF,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;IAChC,MAAM,MAAM,GAAG,MAAM,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,aAAa,aAAa,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AACpE,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { ArgumentsCamelCase, Argv } from 'yargs';
2
+ export declare const command = "remove <path>";
3
+ export declare const describe = "Detach a checkout and its submodules from the shared store";
4
+ export declare const builder: (parser: Argv) => Argv<{
5
+ path: string;
6
+ } & {
7
+ verbose: boolean;
8
+ } & {
9
+ forget: boolean;
10
+ }>;
11
+ export declare const handler: (args: ArgumentsCamelCase<{
12
+ path: string;
13
+ verbose: boolean;
14
+ forget: boolean;
15
+ }>) => Promise<void>;
16
+ //# sourceMappingURL=remove.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../../src/commands/store/remove.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAItD,eAAO,MAAM,OAAO,kBAAkB,CAAC;AACvC,eAAO,MAAM,QAAQ,+DAA+D,CAAC;AACrF,eAAO,MAAM,OAAO,WAAY,IAAI;;;;;;EAgB9B,CAAC;AAEP,eAAO,MAAM,OAAO,SAAgB,kBAAkB,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,kBAuB1G,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { dedup } from '../../context.js';
2
+ import { humanizeBytes } from 'humanize-units';
3
+ export const command = 'remove <path>';
4
+ export const describe = 'Detach a checkout and its submodules from the shared store';
5
+ export const builder = (parser) => parser
6
+ .positional('path', {
7
+ type: 'string',
8
+ demandOption: true,
9
+ describe: 'Local checkout path',
10
+ })
11
+ .option('verbose', {
12
+ type: 'boolean',
13
+ default: false,
14
+ describe: 'Show full Git errors for skipped and failed repositories',
15
+ })
16
+ .option('forget', {
17
+ type: 'boolean',
18
+ default: false,
19
+ describe: 'Release a deleted checkout so store prune can reclaim its objects',
20
+ });
21
+ export const handler = async (args) => {
22
+ if (args.forget) {
23
+ const forgotten = await dedup().forget(args.path);
24
+ for (const gitdir of forgotten)
25
+ console.log(`Forgot ${gitdir}`);
26
+ if (!forgotten.length) {
27
+ console.error(`No registered checkout matches ${args.path}.`);
28
+ process.exitCode = 1;
29
+ }
30
+ return;
31
+ }
32
+ const result = await dedup().remove(args.path);
33
+ for (const repository of result.repositories) {
34
+ if (repository.status === 'removed')
35
+ console.log(`Removed ${repository.path}: objects now use ${humanizeBytes(repository.objectBytes ?? 0)}`);
36
+ else
37
+ console.error(`${repository.status === 'failed' ? 'Failed' : 'Skipped'} ${repository.path}: ${repository.reason}`);
38
+ if (args.verbose && repository.detail)
39
+ console.error(repository.detail);
40
+ }
41
+ if (!result.removed && !result.failed)
42
+ console.log(`Nothing to remove: ${args.path} is not linked to the store.`);
43
+ else
44
+ console.log(`Removed ${result.removed} repository(s); skipped ${result.skipped}; failed ${result.failed}.`);
45
+ if (result.failed)
46
+ process.exitCode = 1;
47
+ };
48
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../../src/commands/store/remove.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAAC;AACvC,MAAM,CAAC,MAAM,QAAQ,GAAG,4DAA4D,CAAC;AACrF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,MAAY,EAAE,EAAE,CACtC,MAAM;KACH,UAAU,CAAC,MAAM,EAAE;IAClB,IAAI,EAAE,QAAQ;IACd,YAAY,EAAE,IAAI;IAClB,QAAQ,EAAE,qBAAqB;CAChC,CAAC;KACD,MAAM,CAAC,SAAS,EAAE;IACjB,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,0DAA0D;CACrE,CAAC;KACD,MAAM,CAAC,QAAQ,EAAE;IAChB,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,mEAAmE;CAC9E,CAAC,CAAC;AAEP,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,IAA6E,EAAE,EAAE;IAC7G,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,SAAS,GAAG,MAAM,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,KAAK,MAAM,MAAM,IAAI,SAAS;YAAE,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,kCAAkC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;YAC9D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;QACD,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QAC7C,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS;YACjC,OAAO,CAAC,GAAG,CAAC,WAAW,UAAU,CAAC,IAAI,qBAAqB,aAAa,CAAC,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;;YAEzG,OAAO,CAAC,KAAK,CACX,GAAG,UAAU,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC,MAAM,EAAE,CACpG,CAAC;QACJ,IAAI,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC,MAAM;YAAE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,IAAI,8BAA8B,CAAC,CAAC;;QAC7G,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,OAAO,2BAA2B,MAAM,CAAC,OAAO,YAAY,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACjH,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AAC1C,CAAC,CAAC"}
package/dist/context.d.ts CHANGED
@@ -1,17 +1,19 @@
1
1
  import type { GitDedupOptions } from 'git-dedup-core';
2
2
  export declare const dedup: (options?: GitDedupOptions) => {
3
3
  run: (args: string[]) => Promise<number>;
4
- cache: (path?: string) => Promise<import("git-dedup-core").CacheResult>;
4
+ add: (path?: string, quiet?: boolean) => Promise<import("git-dedup-core").StoreAddResult>;
5
+ remove: (path?: string) => Promise<import("git-dedup-core").StoreRemoveResult>;
5
6
  storeInfo: () => Promise<import("git-dedup-core").StoreInfo>;
6
7
  listRemotes: () => Promise<import("git-dedup-core").StoreRemote[]>;
7
- fetch: () => Promise<{
8
- fetched: number;
9
- }>;
8
+ fetch: () => Promise<import("git-dedup-core").StoreFetchResult>;
10
9
  gc: () => Promise<{
11
10
  compacted: boolean;
12
11
  }>;
12
+ prune: () => Promise<import("git-dedup-core").PruneResult>;
13
+ forget: (path: string) => Promise<string[]>;
13
14
  doctor: () => Promise<import("git-dedup-core").DoctorResult>;
14
15
  storePath: () => Promise<string>;
15
16
  gitVersion: () => Promise<string>;
17
+ gitPath: () => Promise<string>;
16
18
  };
17
19
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,eAAO,MAAM,KAAK,aAAc,eAAe;;;;;;;;;;;;;;CAA4B,CAAC"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,eAAO,MAAM,KAAK,aAAc,eAAe;;;;;;;;;;;;;;;;CAA4B,CAAC"}
@@ -2,9 +2,9 @@ export interface DiscoveredCheckout {
2
2
  path: string;
3
3
  gitDir: string;
4
4
  commonGitDir: string;
5
- /** The parent repository whose cache operation visits this initialized submodule. */
5
+ /** The parent repository whose store add operation visits this initialized submodule. */
6
6
  coveredBy?: string;
7
7
  }
8
- /** Discover checkout roots without following symlinks or entering Git/object/build directories. */
9
- export declare function discoverCheckouts(directory: string): Promise<DiscoveredCheckout[]>;
8
+ /** Discover checkout roots without following symlinks or entering ignored directories or Git metadata. */
9
+ export declare function discoverCheckouts(directory: string, git?: string): Promise<DiscoveredCheckout[]>;
10
10
  //# sourceMappingURL=discover.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,mGAAmG;AACnG,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA2CxF"}
1
+ {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"AAkCA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,yFAAyF;IACzF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,0GAA0G;AAC1G,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,SAAQ,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAqDrG"}
package/dist/discover.js CHANGED
@@ -1,44 +1,63 @@
1
- import { execFile } from 'node:child_process';
1
+ import { execFile, spawn } from 'node:child_process';
2
2
  import { readdir, realpath, stat } from 'node:fs/promises';
3
3
  import { promisify } from 'node:util';
4
4
  import { isAbsolute, join, resolve, sep } from 'node:path';
5
5
  const execFileAsync = promisify(execFile);
6
- const ignored = new Set([
7
- '.git',
8
- '.hg',
9
- '.svn',
10
- '.next',
11
- '.nuxt',
12
- '.turbo',
13
- '.venv',
14
- 'build',
15
- 'coverage',
16
- 'dist',
17
- 'node_modules',
18
- 'target',
19
- 'vendor',
20
- ]);
21
- /** Discover checkout roots without following symlinks or entering Git/object/build directories. */
22
- export async function discoverCheckouts(directory) {
6
+ async function isInsideWorktree(git, path) {
7
+ try {
8
+ const { stdout } = await execFileAsync(git, ['-C', path, 'rev-parse', '--is-inside-work-tree']);
9
+ return stdout.trim() === 'true';
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ }
15
+ async function ignoredDirectories(git, path, names) {
16
+ if (!names.length)
17
+ return new Set();
18
+ const output = await new Promise((done, reject) => {
19
+ const child = spawn(git, ['-C', path, 'check-ignore', '--no-index', '-z', '--stdin']);
20
+ const stdout = [];
21
+ const stderr = [];
22
+ child.stdout.on('data', (chunk) => stdout.push(chunk));
23
+ child.stderr.on('data', (chunk) => stderr.push(chunk));
24
+ child.once('error', reject);
25
+ child.once('close', (code) => {
26
+ if (code === 0 || code === 1)
27
+ done(Buffer.concat(stdout).toString());
28
+ else
29
+ reject(new Error(`git check-ignore failed: ${Buffer.concat(stderr).toString().trim()}`));
30
+ });
31
+ child.stdin.end(names.join('\0') + '\0');
32
+ });
33
+ return new Set(output.split('\0').filter(Boolean));
34
+ }
35
+ /** Discover checkout roots without following symlinks or entering ignored directories or Git metadata. */
36
+ export async function discoverCheckouts(directory, git = 'git') {
23
37
  const root = resolve(directory);
24
38
  if (!(await stat(root)).isDirectory())
25
39
  throw new Error(`Not a directory: ${root}`);
26
40
  const candidates = [];
27
- const pending = [root];
41
+ const pending = [{ path: root, insideWorktree: await isInsideWorktree(git, root) }];
28
42
  while (pending.length) {
29
- const current = pending.pop();
43
+ const { path: current, insideWorktree } = pending.pop();
30
44
  const entries = await readdir(current, { withFileTypes: true });
31
- if (entries.some((entry) => entry.name === '.git' && (entry.isFile() || entry.isDirectory())))
45
+ const hasGit = entries.some((entry) => entry.name === '.git' && (entry.isFile() || entry.isDirectory()));
46
+ if (hasGit)
32
47
  candidates.push(current);
33
- for (const entry of entries) {
34
- if (entry.isDirectory() && !ignored.has(entry.name))
35
- pending.push(join(current, entry.name));
48
+ const directories = entries.filter((entry) => entry.isDirectory() && entry.name !== '.git');
49
+ const excluded = insideWorktree || hasGit
50
+ ? await ignoredDirectories(git, current, directories.map((entry) => entry.name))
51
+ : new Set();
52
+ for (const entry of directories) {
53
+ if (!excluded.has(entry.name))
54
+ pending.push({ path: join(current, entry.name), insideWorktree: insideWorktree || hasGit });
36
55
  }
37
56
  }
38
57
  const unique = new Map();
39
58
  for (const path of candidates.toSorted((a, b) => a.length - b.length || a.localeCompare(b))) {
40
59
  try {
41
- const { stdout } = await execFileAsync('git', [
60
+ const { stdout } = await execFileAsync(git, [
42
61
  '-C',
43
62
  path,
44
63
  'rev-parse',
@@ -1 +1 @@
1
- {"version":3,"file":"discover.js","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ import { fileURLToPath } from 'node:url';
4
4
  import { createGitDedup } from 'git-dedup-core';
5
5
  const here = dirname(fileURLToPath(import.meta.url));
6
6
  const packageInfo = JSON.parse(readFileSync(join(here, '../package.json'), 'utf8'));
7
- const ownCommands = new Set(['cache', 'store', 'doctor', 'docgen']);
7
+ const ownCommands = new Set(['store', 'docgen']);
8
8
  /** Run the git-dedup CLI. All Git commands retain their original argument array. */
9
9
  export async function main(args = process.argv.slice(2)) {
10
10
  const stats = args[0] === '--stats';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC,CAGjF,CAAC;AACF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEpE,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;IACpC,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACnD,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,KAAK,IAAqB,EAAE;QACzC,IAAI,CAAC,KAAK;YAAE,OAAO,cAAc,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAoB,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,EAAE,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC5G,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QAC3D,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACF,IACE,KAAK;QACL,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;QACvB,KAAK,KAAK,QAAQ;QAClB,KAAK,KAAK,IAAI;QACd,KAAK,KAAK,WAAW;QACrB,KAAK,KAAK,IAAI,EACd,CAAC;QACD,OAAO,MAAM,EAAE,CAAC;IAClB,CAAC;IACD,gFAAgF;IAChF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,cAAc,EAAE,CAAC,UAAU,EAAE,eAAe,WAAW,CAAC,OAAO,GAAG,CAAC,CAAC;QACzF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,oFAAoF;IACpF,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAE7G,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC;SACvB,UAAU,CAAC,WAAW,CAAC;SACvB,KAAK,CACJ,sHAAsH,CACvH;SACA,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;SAC5B,IAAI,EAAE;SACN,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,yDAAyD,EAAE,CAAC;SACzG,MAAM,EAAE;SACR,cAAc,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IACtC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,QAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAC1B,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../src/stats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAcpD,iFAAiF;AACjF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,IAAI,CAwBlE"}
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../src/stats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAIpD,iFAAiF;AACjF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,IAAI,CAwBlE"}
package/dist/stats.js CHANGED
@@ -1,20 +1,9 @@
1
- function bytes(value) {
2
- if (value < 1024)
3
- return `${value} B`;
4
- const units = ['KiB', 'MiB', 'GiB', 'TiB'];
5
- let scaled = value;
6
- let unit = -1;
7
- do {
8
- scaled /= 1024;
9
- unit++;
10
- } while (scaled >= 1024 && unit < units.length - 1);
11
- return `${scaled.toFixed(1)} ${units[unit]}`;
12
- }
1
+ import { humanizeBytes as bytes } from 'humanize-units';
13
2
  /** Report logical pack bytes; no filesystem allocation estimate is available. */
14
3
  export function printStorageReports(reports) {
15
4
  for (const report of reports) {
16
5
  const prefix = `git-dedup: ${report.operation} ${report.repository}: ${report.poolReused ? 'reused' : 'created'} object pool; `;
17
- if (report.operation === 'cache') {
6
+ if (report.operation === 'add') {
18
7
  process.stderr.write(prefix +
19
8
  `private packs ${bytes(report.beforeUniqueBytes ?? 0)} -> ${bytes(report.afterUniqueBytes ?? 0)}; ` +
20
9
  `estimated private pack reduction ${bytes(report.estimatedSavedBytes)}\n`);
@@ -25,8 +14,8 @@ export function printStorageReports(reports) {
25
14
  }
26
15
  if (reports.length) {
27
16
  const total = reports.reduce((sum, report) => sum + report.estimatedSavedBytes, 0);
28
- if (reports[0]?.operation === 'cache') {
29
- process.stderr.write(`git-dedup: estimated private pack reduction ${bytes(total)} (${total.toLocaleString('en-US')} bytes); ` +
17
+ if (reports[0]?.operation === 'add') {
18
+ process.stderr.write(`git-dedup: estimated private pack reduction ${bytes(total)}; ` +
30
19
  'logical pack bytes only; actual disk reclaimed may differ.\n');
31
20
  }
32
21
  else {
package/dist/stats.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"stats.js","sourceRoot":"","sources":["../src/stats.ts"],"names":[],"mappings":"AAEA,SAAS,KAAK,CAAC,KAAa;IAC1B,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,IAAI,CAAC;IACtC,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3C,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;IACd,GAAG,CAAC;QACF,MAAM,IAAI,IAAI,CAAC;QACf,IAAI,EAAE,CAAC;IACT,CAAC,QAAQ,MAAM,IAAI,IAAI,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;IACpD,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,mBAAmB,CAAC,OAAwB;IAC1D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,cAAc,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,gBAAgB,CAAC;QAChI,IAAI,MAAM,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;YACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,MAAM;gBACJ,iBAAiB,KAAK,CAAC,MAAM,CAAC,iBAAiB,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC,IAAI;gBACnG,oCAAoC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAC5E,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,2CAA2C,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC;QACnF,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,KAAK,OAAO,EAAE,CAAC;YACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,+CAA+C,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,WAAW;gBACtG,8DAA8D,CACjE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mFAAmF,CAAC,CAAC;QAC5G,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../src/stats.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAExD,iFAAiF;AACjF,MAAM,UAAU,mBAAmB,CAAC,OAAwB;IAC1D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,cAAc,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,gBAAgB,CAAC;QAChI,IAAI,MAAM,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;YAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,MAAM;gBACJ,iBAAiB,KAAK,CAAC,MAAM,CAAC,iBAAiB,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC,IAAI;gBACnG,oCAAoC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAC5E,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,2CAA2C,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC;QACnF,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,KAAK,KAAK,EAAE,CAAC;YACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,+CAA+C,KAAK,CAAC,KAAK,CAAC,IAAI;gBAC7D,8DAA8D,CACjE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mFAAmF,CAAC,CAAC;QAC5G,CAAC;IACH,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "git-dedup",
3
- "version": "0.1.0",
4
- "description": "A Git wrapper that shares repository object storage",
3
+ "version": "2.0.1",
4
+ "description": "Faster checkouts, a fraction of the disk space: share one copy of Git history across clones, worktrees, and submodules",
5
5
  "keywords": [
6
6
  "cli",
7
7
  "clone",
@@ -29,6 +29,10 @@
29
29
  "README.md",
30
30
  "LICENSE"
31
31
  ],
32
+ "os": [
33
+ "darwin",
34
+ "linux"
35
+ ],
32
36
  "type": "module",
33
37
  "exports": {
34
38
  ".": {
@@ -42,9 +46,10 @@
42
46
  "dependencies": {
43
47
  "@clidoc/core": "^0.1.0",
44
48
  "@clidoc/yargs": "^1.1.0",
49
+ "humanize-units": "^2.0.4",
45
50
  "yargs": "^18.0.0",
46
51
  "yargs-file-commands": "^2.1.0",
47
- "git-dedup-core": "0.1.0"
52
+ "git-dedup-core": "2.0.1"
48
53
  },
49
54
  "devDependencies": {
50
55
  "@types/node": "^24.0.0",
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/commands/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAMtD,eAAO,MAAM,OAAO,iBAAiB,CAAC;AACtC,eAAO,MAAM,QAAQ,qDAAqD,CAAC;AAC3E,eAAO,MAAM,OAAO,WAAY,IAAI;;;;;;;;;;EAyB9B,CAAC;AAWP,eAAO,MAAM,OAAO,SACZ,kBAAkB,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,kBA+C7G,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/commands/cache.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- export declare const command = "doctor";
2
- export declare const describe = "Check Git and shared store configuration";
3
- export declare const handler: () => Promise<void>;
4
- //# sourceMappingURL=doctor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO,WAAW,CAAC;AAChC,eAAO,MAAM,QAAQ,6CAA6C,CAAC;AACnE,eAAO,MAAM,OAAO,qBAMnB,CAAC"}
@@ -1,12 +0,0 @@
1
- import { dedup } from '../context.js';
2
- export const command = 'doctor';
3
- export const describe = 'Check Git and shared store configuration';
4
- export const handler = async () => {
5
- const result = await dedup().doctor();
6
- for (const check of result.checks) {
7
- console.log(`${check.ok ? 'OK' : 'WARN'} ${check.name}: ${check.detail}`);
8
- }
9
- if (result.checks.some((check) => !check.ok))
10
- process.exitCode = 1;
11
- };
12
- //# sourceMappingURL=doctor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC;AAChC,MAAM,CAAC,MAAM,QAAQ,GAAG,0CAA0C,CAAC;AACnE,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;IAChC,MAAM,MAAM,GAAG,MAAM,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC;IACtC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACrE,CAAC,CAAC"}