git-dedup-core 0.1.0

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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ben Houston
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,121 @@
1
+ # git-dedup-core
2
+
3
+ [![npm version](https://img.shields.io/npm/v/git-dedup-core.svg)](https://www.npmjs.com/package/git-dedup-core)
4
+ [![npm downloads](https://img.shields.io/npm/dm/git-dedup-core.svg)](https://www.npmjs.com/package/git-dedup-core)
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
+ [![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
+ [![Discord](https://img.shields.io/badge/Discord-Join-5865F2?logo=discord&logoColor=white)](https://discord.gg/5J5Ur3F6Z2)
9
+
10
+ _The TypeScript storage engine behind [git-dedup](https://www.npmjs.com/package/git-dedup)._
11
+
12
+ Build Node.js tools that share one Git object pool across checkouts. The core owns cloning, submodule and worktree integration, repository consolidation, and store maintenance. It invokes native Git; the CLI handles command parsing and presentation.
13
+
14
+ Optimized for short-lived repositories in agentic workflows. **Automatically** reuse Git objects across repeated checkouts and worktrees with submodules. The pool holds objects from different remotes, including forks and unrelated repositories. Checkouts borrow from it through Git alternates.
15
+
16
+ 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%).
17
+
18
+ **[Documentation](https://git-dedup.ben3d.ca/) · [Source](https://github.com/bhouston/git-dedup) · [CLI package](https://www.npmjs.com/package/git-dedup)**
19
+
20
+ ## Installation
21
+
22
+ Requires **Node.js 22+ and Git** on macOS or Linux. The package is ESM and includes TypeScript declarations.
23
+
24
+ ```sh
25
+ npm install git-dedup-core
26
+ ```
27
+
28
+ ## Quick start
29
+
30
+ ```ts
31
+ import { createGitDedup } from 'git-dedup-core';
32
+
33
+ const dedup = createGitDedup({ cwd: process.cwd() });
34
+ const exitCode = await dedup.run(['clone', 'https://github.com/bhouston/git-dedup.git', 'git-dedup-checkout']);
35
+ process.exitCode = exitCode;
36
+ ```
37
+
38
+ `run()` accepts Git arguments and returns an exit code. It optimizes supported remote clones, `submodule update --init`, and `worktree add` with submodules. Recursive updates handle nested submodules. `submodule add` adopts the module after Git creates it. Other commands and unsupported clone forms, including local paths, shallow or partial clones, and SHA-256 repositories, pass through to Git.
39
+
40
+ ## API
41
+
42
+ ### `createGitDedup(options?)`
43
+
44
+ | Option | Purpose |
45
+ | ----------------- | -------------------------------------------------------------------- |
46
+ | `cwd` | Working directory; defaults to `process.cwd()` |
47
+ | `env` | Environment overrides for Git operations |
48
+ | `gitPath` | Explicit Git executable |
49
+ | `onStorageReport` | Opt-in callback for clone and checkout adoption storage measurements |
50
+
51
+ The returned methods are asynchronous:
52
+
53
+ | Method | Result and behavior |
54
+ | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
55
+ | `run(args)` | Git exit code; optimizes supported operations |
56
+ | `cache(path?)` | `{ cached, skipped, failed, repositories }`; adopts a repository and discoverable submodules, including local commits. Each repository reports its path, status, and any reason or full error detail. |
57
+ | `storePath()` | Resolved store path |
58
+ | `storeInfo()` | `{ path, sizeBytes, remoteCount }` |
59
+ | `fetch()` | `{ fetched }`; fetches registered remotes into the pool |
60
+ | `gc()` | `{ compacted }`; compacts the pool without pruning objects |
61
+ | `doctor()` | `{ checks }`; each check has `name`, `ok`, and `detail` |
62
+ | `gitVersion()` | Underlying Git version line, such as `git version 2.50.1` |
63
+
64
+ ### Consolidate an existing repository
65
+
66
+ ```ts
67
+ import { createGitDedup } from 'git-dedup-core';
68
+
69
+ const dedup = createGitDedup({ cwd: process.cwd() });
70
+ const { cached, skipped, failed, repositories } = await dedup.cache('./git-dedup-checkout');
71
+ console.log({ cached, skipped, failed, repositories });
72
+ console.log(await dedup.storeInfo());
73
+ ```
74
+
75
+ Checkout adoption imports local refs and HEAD into the pool before repacking the checkout.
76
+
77
+ ### Observe storage sharing
78
+
79
+ ```ts
80
+ import { createGitDedup } from 'git-dedup-core';
81
+
82
+ const dedup = createGitDedup({
83
+ cwd: process.cwd(),
84
+ onStorageReport(report) {
85
+ console.log({
86
+ operation: report.operation,
87
+ repository: report.repository,
88
+ poolReused: report.poolReused,
89
+ estimatedSavedBytes: report.estimatedSavedBytes,
90
+ });
91
+ },
92
+ });
93
+
94
+ await dedup.cache('./git-dedup-checkout');
95
+ ```
96
+
97
+ The callback enables metadata scans after optimized clones and checkout adoption. Without it, these scans are skipped. `StorageReport` also includes optional `beforeUniqueBytes` and `afterUniqueBytes` for checkout adoption. The package exports `GitDedupOptions`, `StorageReport`, `StoreInfo`, `CacheResult`, `DoctorCheck`, and `DoctorResult` types.
98
+
99
+ Adoption estimates count the reduction in private pack bytes. Counts cover `.pack`, `.idx`, and `.rev` files, excluding loose objects. They measure logical file sizes, not physical disk blocks reclaimed. Clone reports do not estimate savings.
100
+
101
+ ## Configuration
102
+
103
+ The store defaults to `~/.git-dedup`; `GIT_DEDUP_STORE` overrides its location. Changing the variable does not move existing data. Git configuration supports `git-dedup.gitPath`. The pool can be on a different filesystem from the checkout. git-dedup does not change global Git configuration.
104
+
105
+ ## Store dependency
106
+
107
+ Linked checkouts depend on the object pool through Git alternates. Deleting or moving the store can make their history unreadable.
108
+
109
+ Read the [storage model](https://git-dedup.ben3d.ca/docs/how-it-works) and [store dependency guide](https://git-dedup.ben3d.ca/docs/safety) for details.
110
+
111
+ ## Contributing
112
+
113
+ See [CONTRIBUTING.md](https://github.com/bhouston/git-dedup/blob/main/CONTRIBUTING.md) for the issue, branch, and PR workflow, and [GitHub Releases](https://github.com/bhouston/git-dedup/releases) for release notes.
114
+
115
+ ## License
116
+
117
+ [MIT](https://github.com/bhouston/git-dedup/blob/main/LICENSE)
118
+
119
+ ## Author
120
+
121
+ [Ben Houston](https://ben3d.ca)
@@ -0,0 +1,63 @@
1
+ export interface GitDedupOptions {
2
+ cwd?: string;
3
+ env?: NodeJS.ProcessEnv;
4
+ gitPath?: string;
5
+ onStorageReport?: (report: StorageReport) => void;
6
+ }
7
+ export interface StorageReport {
8
+ operation: 'clone' | 'cache';
9
+ repository: string;
10
+ poolReused: boolean;
11
+ estimatedSavedBytes: number;
12
+ /** Logical bytes in private pack files before/after cache adoption. Loose objects are excluded. */
13
+ beforeUniqueBytes?: number;
14
+ afterUniqueBytes?: number;
15
+ }
16
+ export interface StoreInfo {
17
+ path: string;
18
+ sizeBytes: number;
19
+ remoteCount: number;
20
+ }
21
+ export interface StoreRemote {
22
+ key: string;
23
+ remote: string;
24
+ }
25
+ export interface DoctorCheck {
26
+ name: string;
27
+ ok: boolean;
28
+ detail: string;
29
+ }
30
+ export interface DoctorResult {
31
+ checks: DoctorCheck[];
32
+ }
33
+ export interface CacheResult {
34
+ cached: number;
35
+ skipped: number;
36
+ failed: number;
37
+ repositories: CacheRepositoryResult[];
38
+ }
39
+ export interface CacheRepositoryResult {
40
+ path: string;
41
+ status: 'cached' | 'skipped' | 'failed';
42
+ reason?: string;
43
+ /** Full underlying error for diagnostic output. */
44
+ detail?: string;
45
+ }
46
+ declare function keyForRemote(remote: string): string | undefined;
47
+ export declare function createGitDedup(options?: GitDedupOptions): {
48
+ run: (args: string[]) => Promise<number>;
49
+ cache: (path?: string) => Promise<CacheResult>;
50
+ storeInfo: () => Promise<StoreInfo>;
51
+ listRemotes: () => Promise<StoreRemote[]>;
52
+ fetch: () => Promise<{
53
+ fetched: number;
54
+ }>;
55
+ gc: () => Promise<{
56
+ compacted: boolean;
57
+ }>;
58
+ doctor: () => Promise<DoctorResult>;
59
+ storePath: () => Promise<string>;
60
+ gitVersion: () => Promise<string>;
61
+ };
62
+ export { keyForRemote };
63
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;CACnD;AACD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mGAAmG;IACnG,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AACD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AACD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AACD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,qBAAqB,EAAE,CAAC;CACvC;AACD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA6BD,iBAAS,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA8BxD;AAiPD,wBAAgB,cAAc,CAAC,OAAO,GAAE,eAAoB;gBAskBjC,MAAM,EAAE,KAAG,OAAO,CAAC,MAAM,CAAC;8BAxQjB,OAAO,CAAC,WAAW,CAAC;qBAuI1B,OAAO,CAAC,SAAS,CAAC;uBAUhB,OAAO,CAAC,WAAW,EAAE,CAAC;iBA2B5B,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;cAkB/B,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;kBAS3B,OAAO,CAAC,YAAY,CAAC;qBA/ZlB,OAAO,CAAC,MAAM,CAAC;sBA2fd,OAAO,CAAC,MAAM,CAAC;EAO7C;AAWD,OAAO,EAAE,YAAY,EAAE,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,921 @@
1
+ import { execFile, spawn } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ import { constants } from 'node:fs';
4
+ import { access, mkdir, readdir, readFile, realpath, rm, stat, writeFile } from 'node:fs/promises';
5
+ import { homedir, constants as osConstants } from 'node:os';
6
+ import { basename, delimiter, dirname, join, resolve, sep } from 'node:path';
7
+ import { createHash, randomUUID } from 'node:crypto';
8
+ function cacheFailureReason(error, stage) {
9
+ const message = String(error);
10
+ if (/cannot lock ref|reference already exists|case.insensitive|refname collision/i.test(message))
11
+ return 'ref collision in the shared pool';
12
+ if (stage === 'remote fetch' || /could not resolve host|connection refused|network is unreachable/i.test(message))
13
+ return 'remote fetch failed';
14
+ if (/Unsupported Git object format/i.test(message))
15
+ return 'unsupported object format';
16
+ return 'Git storage operation failed';
17
+ }
18
+ function expandHome(value) {
19
+ return value === '~' ? homedir() : value.startsWith('~/') ? join(homedir(), value.slice(2)) : value;
20
+ }
21
+ function isPresent(path) {
22
+ return access(path, constants.F_OK).then(() => true, () => false);
23
+ }
24
+ function delay(ms) {
25
+ return new Promise((done) => setTimeout(done, ms));
26
+ }
27
+ function keyForRemote(remote) {
28
+ let host;
29
+ let pathname;
30
+ if (/^[^/@:]+@[^/:]+:.+/.test(remote)) {
31
+ const match = remote.match(/^[^/@:]+@([^/:]+):(.+)$/);
32
+ host = match[1];
33
+ pathname = match[2];
34
+ }
35
+ else {
36
+ let url;
37
+ try {
38
+ url = new URL(remote);
39
+ }
40
+ catch {
41
+ return undefined;
42
+ }
43
+ if (!['https:', 'http:', 'ssh:', 'git:'].includes(url.protocol))
44
+ return undefined;
45
+ host = url.hostname + (url.port ? `_${url.port}` : '');
46
+ pathname = url.pathname;
47
+ }
48
+ const parts = pathname
49
+ .replace(/^\/+/, '')
50
+ .replace(/\.git\/?$/, '')
51
+ .split('/');
52
+ if (!host ||
53
+ parts.length < 2 ||
54
+ parts.some((part) => !part || part === '.' || part === '..' || !/^[a-zA-Z0-9._-]+$/.test(part)))
55
+ return undefined;
56
+ if (!/^[a-zA-Z0-9._-]+$/.test(host))
57
+ return undefined;
58
+ return `${host.toLowerCase()}/${parts.join('/')}`;
59
+ }
60
+ async function directorySize(path) {
61
+ let size = 0;
62
+ for (const entry of await readdir(path, { withFileTypes: true }).catch(() => [])) {
63
+ const child = join(path, entry.name);
64
+ if (entry.isDirectory())
65
+ size += await directorySize(child);
66
+ else if (entry.isFile())
67
+ size += (await stat(child)).size;
68
+ }
69
+ return size;
70
+ }
71
+ const remoteId = (key) => createHash('sha256').update(key).digest('hex');
72
+ function unsupportedClone(args) {
73
+ return args.some((arg) => /^(--depth|--shallow|--filter|--mirror|--bare|--reference|--dissociate|--no-hardlinks|--shared|--separate-git-dir|--bundle-uri|--sparse|--upload-pack|--server-option|--template|--config|--origin|--no-checkout|--single-branch|--no-single-branch|--revision|--jobs|-j|-o|-u|-c)(=|$)/.test(arg));
74
+ }
75
+ function parseClone(args) {
76
+ if (unsupportedClone(args))
77
+ return undefined;
78
+ const positional = [];
79
+ let recurse = false;
80
+ let branch;
81
+ const forwarded = [];
82
+ for (let i = 0; i < args.length; i++) {
83
+ const arg = args[i];
84
+ if (arg === '--') {
85
+ positional.push(...args.slice(i + 1));
86
+ break;
87
+ }
88
+ if (arg === '-b' || arg === '--branch') {
89
+ branch = args[++i];
90
+ if (!branch)
91
+ return undefined;
92
+ forwarded.push(arg, branch);
93
+ continue;
94
+ }
95
+ if (arg.startsWith('--branch=')) {
96
+ branch = arg.slice(9);
97
+ forwarded.push(arg);
98
+ continue;
99
+ }
100
+ // VS Code's Git: Clone passes --recursive, Git's alias for --recurse-submodules.
101
+ if (arg === '--recurse-submodules' || arg === '--recursive') {
102
+ recurse = true;
103
+ continue;
104
+ }
105
+ if (['-q', '--quiet', '-v', '--verbose', '--progress', '--no-tags'].includes(arg)) {
106
+ forwarded.push(arg);
107
+ continue;
108
+ }
109
+ if (arg.startsWith('-'))
110
+ return undefined;
111
+ positional.push(arg);
112
+ }
113
+ if (positional.length < 1 || positional.length > 2)
114
+ return undefined;
115
+ return { remote: positional[0], destination: positional[1], recurse, branch, forwarded };
116
+ }
117
+ function defaultCloneName(remote) {
118
+ return remote
119
+ .replace(/\/+$/, '')
120
+ .split(/[/:]/)
121
+ .at(-1)
122
+ .replace(/\.git$/, '');
123
+ }
124
+ function resolveSubmoduleRemote(parent, child) {
125
+ if (!child.startsWith('./') && !child.startsWith('../'))
126
+ return child;
127
+ if (!keyForRemote(parent))
128
+ return undefined;
129
+ if (/^[^/@:]+@[^/:]+:.+/.test(parent)) {
130
+ const at = parent.indexOf(':');
131
+ const base = parent.slice(at + 1).split('/');
132
+ for (const part of child.split('/')) {
133
+ if (part === '..')
134
+ base.pop();
135
+ else if (part !== '.')
136
+ base.push(part);
137
+ }
138
+ return `${parent.slice(0, at + 1)}${base.join('/')}`;
139
+ }
140
+ try {
141
+ return new URL(child, parent.endsWith('/') ? parent : parent + '/').toString();
142
+ }
143
+ catch {
144
+ return undefined;
145
+ }
146
+ }
147
+ function parseGlobal(args, cwd) {
148
+ const prefix = [];
149
+ let i = 0;
150
+ while (i < args.length) {
151
+ const arg = args[i];
152
+ if (arg === '-C' ||
153
+ arg === '-c' ||
154
+ arg === '--git-dir' ||
155
+ arg === '--work-tree' ||
156
+ arg === '--namespace' ||
157
+ arg === '--config-env') {
158
+ if (!args[i + 1])
159
+ return undefined;
160
+ prefix.push(arg, args[i + 1]);
161
+ if (arg === '-C')
162
+ cwd = resolve(cwd, args[i + 1]);
163
+ i += 2;
164
+ continue;
165
+ }
166
+ if (arg.startsWith('-C') && arg.length > 2) {
167
+ prefix.push(arg);
168
+ cwd = resolve(cwd, arg.slice(2));
169
+ i++;
170
+ continue;
171
+ }
172
+ if (/^(--git-dir|--work-tree|--namespace|--config-env)=/.test(arg) || arg.startsWith('-c')) {
173
+ prefix.push(arg);
174
+ i++;
175
+ continue;
176
+ }
177
+ if (arg.startsWith('-'))
178
+ return undefined;
179
+ return { prefix, command: arg, rest: args.slice(i + 1), cwd };
180
+ }
181
+ return undefined;
182
+ }
183
+ async function canonicalPath(path) {
184
+ const existing = await realpath(path).catch(() => undefined);
185
+ if (existing)
186
+ return existing;
187
+ const parent = dirname(path);
188
+ return parent === path ? path : join(await canonicalPath(parent), basename(path));
189
+ }
190
+ async function lockDirectory(lock, action) {
191
+ await mkdir(dirname(lock), { recursive: true });
192
+ for (let attempts = 0;; attempts++) {
193
+ try {
194
+ await mkdir(lock);
195
+ await writeFile(join(lock, 'owner'), `${process.pid}\n`);
196
+ break;
197
+ }
198
+ catch (error) {
199
+ if (error.code !== 'EEXIST')
200
+ throw error;
201
+ if (attempts > 1200)
202
+ throw new Error(`Timed out waiting for git-dedup lock: ${lock}`, { cause: error });
203
+ if (attempts === 20)
204
+ process.stderr.write('git-dedup: waiting for the object pool lock\n');
205
+ const owner = Number((await readFile(join(lock, 'owner'), 'utf8').catch(() => '')).trim());
206
+ const age = Date.now() - (await stat(lock).catch(() => ({ mtimeMs: Date.now() }))).mtimeMs;
207
+ // A dead owner may be reaped. A live but slow Git process must never lose its lock.
208
+ if (age > 5000 && owner && !processExists(owner)) {
209
+ await rm(lock, { recursive: true, force: true });
210
+ continue;
211
+ }
212
+ await delay(50);
213
+ }
214
+ }
215
+ try {
216
+ return await action();
217
+ }
218
+ finally {
219
+ await rm(lock, { recursive: true, force: true });
220
+ }
221
+ }
222
+ function storeLock(root) {
223
+ return join(dirname(root), `.${basename(root)}.gitx-lock`);
224
+ }
225
+ async function initializeStore(root) {
226
+ await mkdir(root, { recursive: true });
227
+ const marker = join(root, '.gitx-store');
228
+ if (await isPresent(marker)) {
229
+ if ((await readFile(marker, 'utf8')) !== 'gitx-store-v2\n')
230
+ throw new Error(`Invalid git-dedup store marker: ${root}`);
231
+ return;
232
+ }
233
+ if ((await readdir(root)).length)
234
+ throw new Error(`Refusing to adopt a nonempty directory as a store: ${root}`);
235
+ await writeFile(marker, 'gitx-store-v2\n', { flag: 'wx' });
236
+ }
237
+ async function uniquePackBytes(gitdir) {
238
+ let bytes = 0;
239
+ for (const name of await readdir(join(gitdir, 'objects', 'pack')).catch(() => [])) {
240
+ if (!/\.(pack|idx|rev)$/.test(name))
241
+ continue;
242
+ const file = await stat(join(gitdir, 'objects', 'pack', name)).catch(() => undefined);
243
+ if (file?.nlink === 1)
244
+ bytes += file.size;
245
+ }
246
+ return bytes;
247
+ }
248
+ async function withLock(root, action) {
249
+ // One Git object database needs one writer at a time. Keep the lock outside the store.
250
+ return lockDirectory(storeLock(root), async () => {
251
+ await initializeStore(root);
252
+ return action();
253
+ });
254
+ }
255
+ function poolPath(root) {
256
+ return join(root, 'pool.git');
257
+ }
258
+ async function registerRemote(root, remote, key) {
259
+ const id = remoteId(key);
260
+ await mkdir(join(root, 'remotes'), { recursive: true });
261
+ await writeFile(join(root, 'remotes', `${id}.json`), JSON.stringify({ key, remote }) + '\n');
262
+ }
263
+ async function setAlternate(gitdir, pool) {
264
+ const alternate = join(gitdir, 'objects', 'info', 'alternates');
265
+ await mkdir(dirname(alternate), { recursive: true });
266
+ const target = join(pool, 'objects');
267
+ const existing = await readFile(alternate, 'utf8').catch(() => '');
268
+ if (existing.split('\n').includes(target))
269
+ return;
270
+ await writeFile(alternate, existing + target + '\n');
271
+ }
272
+ async function removeLegacyKeeps(gitdir) {
273
+ const packDirectory = join(gitdir, 'objects', 'pack');
274
+ for (const name of await readdir(packDirectory).catch(() => [])) {
275
+ if (!name.endsWith('.keep'))
276
+ continue;
277
+ const path = join(packDirectory, name);
278
+ if ((await readFile(path, 'utf8').catch(() => '')) === 'gitx base pack\n')
279
+ await rm(path);
280
+ }
281
+ }
282
+ async function consumerId(commonGitdir) {
283
+ // Shared across linked worktrees so a tip is pinned only once per object database.
284
+ const path = join(commonGitdir, 'gitx-consumer-id');
285
+ const existing = (await readFile(path, 'utf8').catch(() => '')).trim();
286
+ if (/^[a-f0-9-]{36}$/.test(existing))
287
+ return existing;
288
+ const id = randomUUID();
289
+ try {
290
+ await writeFile(path, `${id}\n`, { flag: 'wx' });
291
+ return id;
292
+ }
293
+ catch (error) {
294
+ if (error.code !== 'EEXIST')
295
+ throw error;
296
+ return (await readFile(path, 'utf8')).trim();
297
+ }
298
+ }
299
+ export function createGitDedup(options = {}) {
300
+ const cwd = resolve(options.cwd ?? process.cwd());
301
+ const incomingEnv = { ...process.env, ...options.env };
302
+ const env = { ...incomingEnv, GITX_ACTIVE: '1', GIT_DEDUP_ACTIVE: '1' };
303
+ let cachedGit;
304
+ function emitStorageReport(report) {
305
+ try {
306
+ options.onStorageReport?.(report);
307
+ }
308
+ catch {
309
+ process.stderr.write('git-dedup: storage report callback failed\n');
310
+ }
311
+ }
312
+ const hasRepositoryEnvironment = [
313
+ 'GIT_DIR',
314
+ 'GIT_WORK_TREE',
315
+ 'GIT_COMMON_DIR',
316
+ 'GIT_OBJECT_DIRECTORY',
317
+ 'GIT_ALTERNATE_OBJECT_DIRECTORIES',
318
+ 'GIT_INDEX_FILE',
319
+ ].some((key) => env[key]);
320
+ async function gitPath() {
321
+ if (cachedGit)
322
+ return cachedGit;
323
+ const own = await realpath(process.argv[1] ?? '').catch(() => '');
324
+ let candidate = options.gitPath;
325
+ if (!candidate) {
326
+ for (const pathPart of (env.PATH ?? '').split(delimiter)) {
327
+ const path = resolve(cwd, pathPart || '.', 'git');
328
+ const actual = await realpath(path).catch(() => '');
329
+ if (!actual || actual === own)
330
+ continue;
331
+ if (await access(path, constants.X_OK).then(() => true, () => false)) {
332
+ candidate = path;
333
+ break;
334
+ }
335
+ }
336
+ if (!candidate)
337
+ throw new Error('Real Git executable not found on PATH');
338
+ const configured = (await promisify(execFile)(candidate, ['config', '--get', 'git-dedup.gitPath'], { cwd, env }).then((result) => result.stdout.trim(), () => '')) ||
339
+ (await promisify(execFile)(candidate, ['config', '--get', 'gitx.gitPath'], { cwd, env }).then((result) => result.stdout.trim(), () => ''));
340
+ if (configured)
341
+ candidate = resolve(cwd, expandHome(configured));
342
+ }
343
+ const actual = await realpath(candidate).catch(() => '');
344
+ if (!actual || actual === own)
345
+ throw new Error('git-dedup.gitPath must point to a real Git executable, not git-dedup itself');
346
+ await access(candidate, constants.X_OK);
347
+ return (cachedGit = candidate);
348
+ }
349
+ async function git(args, at = cwd, inherit = false) {
350
+ const binary = await gitPath();
351
+ return new Promise((resolveResult, reject) => {
352
+ const child = spawn(binary, args, { cwd: at, env, stdio: inherit ? 'inherit' : ['ignore', 'pipe', 'pipe'] });
353
+ let stdout = '';
354
+ let stderr = '';
355
+ if (!inherit) {
356
+ child.stdout?.on('data', (b) => {
357
+ stdout += b;
358
+ });
359
+ child.stderr?.on('data', (b) => {
360
+ stderr += b;
361
+ });
362
+ }
363
+ const signals = ['SIGINT', 'SIGTERM', 'SIGHUP'];
364
+ const handlers = signals.map((signal) => () => {
365
+ child.kill(signal);
366
+ });
367
+ const cleanup = () => {
368
+ if (inherit)
369
+ signals.forEach((signal, i) => process.removeListener(signal, handlers[i]));
370
+ };
371
+ if (inherit)
372
+ signals.forEach((signal, i) => process.on(signal, handlers[i]));
373
+ child.on('error', (error) => {
374
+ cleanup();
375
+ reject(error);
376
+ });
377
+ child.on('close', (code, signal) => {
378
+ cleanup();
379
+ resolveResult({ code: code ?? (signal ? 128 + (osConstants.signals[signal] ?? 0) : 1), stdout, stderr });
380
+ });
381
+ });
382
+ }
383
+ async function checked(args, at = cwd) {
384
+ if (hasRepositoryEnvironment)
385
+ throw new Error('Unset Git repository override environment variables before running git-dedup storage operations');
386
+ const result = await git(args, at);
387
+ if (result.code !== 0)
388
+ throw new Error(`git ${args.join(' ')} failed: ${result.stderr.trim()}`);
389
+ return result.stdout.trim();
390
+ }
391
+ async function storePath() {
392
+ const configured = env.GIT_DEDUP_STORE || env.GITX_STORE;
393
+ if (configured)
394
+ return canonicalPath(resolve(cwd, expandHome(configured)));
395
+ for (const legacy of ['~/.cache/gitx', '~/.gitx']) {
396
+ const path = expandHome(legacy);
397
+ if (await isPresent(path))
398
+ return canonicalPath(path);
399
+ }
400
+ return canonicalPath(expandHome('~/.git-dedup'));
401
+ }
402
+ async function ensurePool(root) {
403
+ const pool = poolPath(root);
404
+ if (!(await isPresent(pool)))
405
+ await checked(['init', '--bare', '--object-format=sha1', pool]);
406
+ if ((await checked(['-C', pool, 'rev-parse', '--show-object-format'])) !== 'sha1')
407
+ throw new Error('Unsupported Git object format in shared pool');
408
+ // Git fsck in an alternate consumer can misread a commit graph from a pool
409
+ // containing unrelated histories. The graph is derived data, so omit it.
410
+ await checked(['-C', pool, 'config', 'gc.writeCommitGraph', 'false']);
411
+ await checked(['-C', pool, 'config', 'maintenance.commit-graph.enabled', 'false']);
412
+ await rm(join(pool, 'objects', 'info', 'commit-graph'), { force: true });
413
+ await rm(join(pool, 'objects', 'info', 'commit-graphs'), { recursive: true, force: true });
414
+ return pool;
415
+ }
416
+ async function fetchRemote(root, remote, key) {
417
+ const pool = await ensurePool(root);
418
+ await fetchRemoteObjects(pool, remote, key);
419
+ await registerRemote(root, remote, key);
420
+ return pool;
421
+ }
422
+ async function fetchRemoteObjects(pool, remote, key) {
423
+ const id = remoteId(key);
424
+ process.stderr.write(`git-dedup: updating object pool for ${key}\n`);
425
+ await checked([
426
+ '-C',
427
+ pool,
428
+ 'fetch',
429
+ '--no-tags',
430
+ remote,
431
+ `+refs/heads/*:refs/gitx/remotes/${id}/heads/*`,
432
+ `+refs/tags/*:refs/gitx/remotes/${id}/tags/*`,
433
+ ]);
434
+ }
435
+ async function consumerTips(repo) {
436
+ const refs = await checked(['for-each-ref', '--format=%(objectname)', 'refs'], repo);
437
+ const head = await checked(['rev-parse', 'HEAD'], repo);
438
+ return [...new Set([...refs.split('\n').filter(Boolean), head])].toSorted();
439
+ }
440
+ async function pinnedTips(pool, id) {
441
+ return new Set((await checked(['-C', pool, 'for-each-ref', '--format=%(objectname)', `refs/gitx/consumers/${id}`]))
442
+ .split('\n')
443
+ .filter(Boolean));
444
+ }
445
+ async function pinConsumer(pool, repo, commonGitdir, tips) {
446
+ // Immutable snapshots keep old tips reachable after force pushes, branch
447
+ // deletion, or a later cache call on the same checkout. Source ref names
448
+ // cannot be copied into a files-backed pool: refs differing only by case
449
+ // collide on case-insensitive filesystems. Object IDs are safe ref names,
450
+ // and one pin per distinct tip preserves the same reachability.
451
+ const id = await consumerId(commonGitdir);
452
+ const existing = await pinnedTips(pool, id);
453
+ const missing = tips.filter((oid) => !existing.has(oid));
454
+ // Keep fetch argument lists bounded for repositories with many refs.
455
+ for (let offset = 0; offset < missing.length; offset += 128)
456
+ await checked([
457
+ '-C',
458
+ pool,
459
+ 'fetch',
460
+ '--no-tags',
461
+ repo,
462
+ ...missing.slice(offset, offset + 128).map((oid) => `+${oid}:refs/gitx/consumers/${id}/${oid}`),
463
+ ]);
464
+ }
465
+ async function repoGitdir(path) {
466
+ const value = await checked(['rev-parse', '--absolute-git-dir'], path);
467
+ return value;
468
+ }
469
+ async function repoCommonGitdir(path) {
470
+ return checked(['rev-parse', '--path-format=absolute', '--git-common-dir'], path);
471
+ }
472
+ async function origin(path) {
473
+ const result = await git(['remote', 'get-url', 'origin'], path);
474
+ return result.code === 0 ? result.stdout.trim() : undefined;
475
+ }
476
+ async function remoteKey(remote, at = cwd) {
477
+ const expanded = await git(['ls-remote', '--get-url', remote], at);
478
+ return keyForRemote(expanded.code === 0 ? expanded.stdout.trim() : remote);
479
+ }
480
+ async function clone(args, effectiveCwd) {
481
+ const parsed = parseClone(args);
482
+ if (!parsed)
483
+ return undefined;
484
+ const key = await remoteKey(parsed.remote, effectiveCwd);
485
+ if (!key)
486
+ return undefined;
487
+ const destination = resolve(effectiveCwd, parsed.destination ?? defaultCloneName(parsed.remote));
488
+ if (await isPresent(destination))
489
+ return undefined;
490
+ const root = await storePath();
491
+ const cloned = await withLock(root, async () => {
492
+ const poolReused = options.onStorageReport ? await isPresent(poolPath(root)) : false;
493
+ let pool;
494
+ try {
495
+ pool = await fetchRemote(root, parsed.remote, key);
496
+ }
497
+ catch {
498
+ process.stderr.write('git-dedup: object pool unavailable; using Git clone\n');
499
+ return undefined;
500
+ }
501
+ const cloneArgs = ['clone', '--reference', pool, ...parsed.forwarded, parsed.remote, destination];
502
+ const result = await git(cloneArgs, effectiveCwd, true);
503
+ if (result.code !== 0)
504
+ return result.code;
505
+ await pinConsumer(pool, destination, await repoCommonGitdir(destination), await consumerTips(destination));
506
+ if (options.onStorageReport)
507
+ emitStorageReport({ operation: 'clone', repository: destination, poolReused, estimatedSavedBytes: 0 });
508
+ return 0;
509
+ });
510
+ if (cloned === 0 && parsed.recurse)
511
+ return updateSubmodules(['update', '--init', '--recursive'], destination);
512
+ return cloned;
513
+ }
514
+ async function seedSubmodules(repo) {
515
+ const modulesFile = join(repo, '.gitmodules');
516
+ if (!(await isPresent(modulesFile)))
517
+ return;
518
+ const parentRemote = await origin(repo);
519
+ const listing = await git(['config', '--file', modulesFile, '--get-regexp', '^submodule\\..*\\.(path|url)$'], repo);
520
+ if (listing.code !== 0)
521
+ return;
522
+ const byName = new Map();
523
+ for (const line of listing.stdout.split('\n')) {
524
+ const match = line.match(/^submodule\.(.+)\.(path|url) (.+)$/);
525
+ if (!match)
526
+ continue;
527
+ const item = byName.get(match[1]) ?? {};
528
+ item[match[2]] = match[3];
529
+ byName.set(match[1], item);
530
+ }
531
+ for (const [name, item] of byName) {
532
+ if (!item.path || !item.url || name.split('/').some((p) => !p || p === '.' || p === '..'))
533
+ continue;
534
+ const registered = await git(['config', '--get', `submodule.${name}.url`], repo);
535
+ if (registered.code !== 0)
536
+ continue;
537
+ const active = await git(['config', '--type=bool', '--get', `submodule.${name}.active`], repo);
538
+ if (active.stdout.trim() === 'false')
539
+ continue;
540
+ const remote = resolveSubmoduleRemote(parentRemote ?? '', registered.stdout.trim());
541
+ const key = remote && (await remoteKey(remote, repo));
542
+ if (!remote || !key)
543
+ continue;
544
+ const target = resolve(repo, item.path);
545
+ if (!target.startsWith(repo + sep) || (await isPresent(join(target, '.git'))))
546
+ continue;
547
+ const gitPathResult = await git(['rev-parse', '--path-format=absolute', '--git-path', `modules/${name}`], repo);
548
+ if (gitPathResult.code !== 0)
549
+ continue;
550
+ const gitdir = gitPathResult.stdout.trim();
551
+ if (await isPresent(gitdir))
552
+ continue;
553
+ const root = await storePath();
554
+ await withLock(root, async () => {
555
+ const pool = await fetchRemote(root, remote, key);
556
+ await mkdir(dirname(gitdir), { recursive: true });
557
+ await checked(['clone', '--bare', '--reference', pool, remote, gitdir]);
558
+ await checked(['--git-dir', gitdir, 'config', 'core.bare', 'false']);
559
+ await checked(['--git-dir', gitdir, 'config', 'core.worktree', target]);
560
+ await pinConsumer(pool, gitdir, gitdir, await consumerTips(gitdir));
561
+ });
562
+ }
563
+ }
564
+ async function updateSubmodules(args, at) {
565
+ if (args[0] === 'add') {
566
+ const code = (await git(['submodule', ...args], at, true)).code;
567
+ if (code !== 0)
568
+ return code;
569
+ const target = args.length === 2 ? defaultCloneName(args[1]) : args.length === 3 ? args[2] : undefined;
570
+ if (target && !target.startsWith('-')) {
571
+ try {
572
+ await cache(resolve(at, target));
573
+ }
574
+ catch (error) {
575
+ process.stderr.write(`git-dedup: submodule cache unavailable (${String(error)})\n`);
576
+ }
577
+ }
578
+ return 0;
579
+ }
580
+ if (args[0] !== 'update' || args.slice(1).some((arg) => !['--init', '--recursive', '--quiet', '-q'].includes(arg)))
581
+ return (await git(['submodule', ...args], at, true)).code;
582
+ if ((await git(['config', '--get', 'submodule.active'], at)).code === 0)
583
+ return (await git(['submodule', ...args], at, true)).code;
584
+ if (args.includes('--init')) {
585
+ const init = (await git(['submodule', 'init'], at, true)).code;
586
+ if (init !== 0)
587
+ return init;
588
+ }
589
+ try {
590
+ await seedSubmodules(at);
591
+ }
592
+ catch {
593
+ process.stderr.write('git-dedup: submodule cache unavailable; using Git\n');
594
+ }
595
+ const recursive = args.includes('--recursive') &&
596
+ args.includes('--init') &&
597
+ !args.some((arg) => ['--remote', '--merge', '--rebase', '--force', '--checkout'].includes(arg));
598
+ if (!recursive)
599
+ return (await git(['submodule', ...args], at, true)).code;
600
+ const top = (await git(['submodule', ...args.filter((arg) => arg !== '--recursive')], at, true)).code;
601
+ if (top !== 0)
602
+ return top;
603
+ const listing = await git(['config', '--file', '.gitmodules', '--get-regexp', '^submodule\\..*\\.path$'], at);
604
+ if (listing.code !== 0)
605
+ return 0;
606
+ for (const line of listing.stdout.trim().split('\n')) {
607
+ const match = line.match(/^submodule\..*\.path (.+)$/);
608
+ if (!match)
609
+ continue;
610
+ const child = resolve(at, match[1]);
611
+ if (!child.startsWith(at + sep) || !(await isPresent(child)))
612
+ continue;
613
+ const nested = await updateSubmodules(['update', '--init', '--recursive'], child);
614
+ if (nested !== 0)
615
+ return nested;
616
+ }
617
+ return 0;
618
+ }
619
+ async function cache(path = cwd) {
620
+ const result = { cached: 0, skipped: 0, failed: 0, repositories: [] };
621
+ const visited = new Set();
622
+ function record(repoPath, status, reason, detail) {
623
+ result[status]++;
624
+ result.repositories.push({
625
+ path: repoPath,
626
+ status,
627
+ ...(reason ? { reason } : {}),
628
+ ...(detail ? { detail } : {}),
629
+ });
630
+ }
631
+ async function adopt(repo) {
632
+ let gitdir;
633
+ try {
634
+ gitdir = await repoGitdir(repo);
635
+ }
636
+ catch (error) {
637
+ record(repo, 'skipped', 'not a Git repository or path is unavailable', String(error));
638
+ return;
639
+ }
640
+ if (visited.has(gitdir)) {
641
+ record(repo, 'skipped', 'object database already visited');
642
+ return;
643
+ }
644
+ visited.add(gitdir);
645
+ let stage = 'preparing repository';
646
+ try {
647
+ if ((await checked(['rev-parse', '--show-object-format'], repo)) !== 'sha1') {
648
+ record(repo, 'skipped', 'unsupported object format (requires SHA-1)');
649
+ return;
650
+ }
651
+ const commonGitdir = await repoCommonGitdir(repo);
652
+ const url = await origin(repo);
653
+ if (!url) {
654
+ record(repo, 'skipped', 'no origin remote');
655
+ return;
656
+ }
657
+ const key = await remoteKey(url, repo);
658
+ if (!key) {
659
+ record(repo, 'skipped', 'origin URL cannot be used as a store key');
660
+ return;
661
+ }
662
+ const root = await storePath();
663
+ await withLock(root, async () => {
664
+ const poolReused = await isPresent(poolPath(root));
665
+ const pool = await ensurePool(root);
666
+ const tips = await consumerTips(repo);
667
+ // A successful marker belongs to this worktree; linked worktrees can have different HEADs.
668
+ const marker = join(gitdir, 'gitx-cache.json');
669
+ const state = JSON.stringify({ version: 1, pool, remote: url, key, tips }) + '\n';
670
+ const alternate = join(commonGitdir, 'objects', 'info', 'alternates');
671
+ const alreadyLinked = (await readFile(alternate, 'utf8').catch(() => ''))
672
+ .split('\n')
673
+ .includes(join(pool, 'objects'));
674
+ const registered = (await readFile(join(root, 'remotes', `${remoteId(key)}.json`), 'utf8').catch(() => '')) ===
675
+ JSON.stringify({ key, remote: url }) + '\n';
676
+ const stateMatches = poolReused && alreadyLinked && registered && (await readFile(marker, 'utf8').catch(() => '')) === state;
677
+ const currentPins = stateMatches ? await pinnedTips(pool, await consumerId(commonGitdir)) : undefined;
678
+ if (currentPins && tips.every((oid) => currentPins.has(oid))) {
679
+ record(repo, 'skipped', 'already current');
680
+ process.stderr.write(`git-dedup: caching ${repo}: already current\n`);
681
+ return;
682
+ }
683
+ process.stderr.write(`git-dedup: caching ${repo}: packing local objects\n`);
684
+ // Gather loose local objects before adding an alternate; afterwards Git may
685
+ // consider a local object redundant and omit it from a new pack.
686
+ if (!alreadyLinked)
687
+ await checked(['-c', 'repack.writeBitmaps=false', 'repack', '-a', '-d', '-l'], repo);
688
+ const beforeUniqueBytes = await uniquePackBytes(commonGitdir);
689
+ process.stderr.write(`git-dedup: caching ${repo}: importing refs\n`);
690
+ stage = 'importing refs';
691
+ await pinConsumer(pool, repo, commonGitdir, tips);
692
+ stage = 'sharing objects';
693
+ process.stderr.write(`git-dedup: caching ${repo}: sharing objects\n`);
694
+ await setAlternate(commonGitdir, pool);
695
+ await removeLegacyKeeps(commonGitdir);
696
+ await checked(['-c', 'repack.writeBitmaps=false', 'repack', '-a', '-d', '-l'], repo);
697
+ if ((await isPresent(join(commonGitdir, 'objects', 'info', 'commit-graph'))) ||
698
+ (await isPresent(join(commonGitdir, 'objects', 'info', 'commit-graphs'))))
699
+ await checked(['commit-graph', 'write', '--reachable'], repo);
700
+ await checked(['fsck', '--connectivity-only', '--no-reflogs'], repo);
701
+ // Local adoption succeeds even when the remote is temporarily unavailable.
702
+ await registerRemote(root, url, key);
703
+ let refreshError;
704
+ try {
705
+ await fetchRemoteObjects(pool, url, key);
706
+ }
707
+ catch (error) {
708
+ refreshError = error;
709
+ }
710
+ await writeFile(marker, state);
711
+ if (options.onStorageReport) {
712
+ const afterUniqueBytes = await uniquePackBytes(commonGitdir);
713
+ emitStorageReport({
714
+ operation: 'cache',
715
+ repository: repo,
716
+ poolReused,
717
+ beforeUniqueBytes,
718
+ afterUniqueBytes,
719
+ estimatedSavedBytes: Math.max(0, beforeUniqueBytes - afterUniqueBytes),
720
+ });
721
+ }
722
+ record(repo, 'cached', refreshError ? 'remote refresh deferred; retry with git-dedup store fetch' : undefined, refreshError ? String(refreshError) : undefined);
723
+ if (refreshError)
724
+ process.stderr.write(`git-dedup: caching ${repo}: remote refresh deferred; retry with git-dedup store fetch\n`);
725
+ });
726
+ }
727
+ catch (error) {
728
+ record(repo, 'failed', cacheFailureReason(error, stage), String(error));
729
+ }
730
+ finally {
731
+ await visitModules(join(gitdir, 'modules'));
732
+ }
733
+ async function visitModules(directory) {
734
+ for (const entry of await readdir(directory, { withFileTypes: true }).catch(() => [])) {
735
+ if (!entry.isDirectory())
736
+ continue;
737
+ const modulePath = join(directory, entry.name);
738
+ if (await isPresent(join(modulePath, 'HEAD'))) {
739
+ const workTree = (await git(['--git-dir', modulePath, 'config', '--get', 'core.worktree'])).stdout.trim();
740
+ if (workTree)
741
+ await adopt(resolve(modulePath, workTree));
742
+ }
743
+ else
744
+ await visitModules(modulePath);
745
+ }
746
+ }
747
+ }
748
+ await adopt(resolve(cwd, path));
749
+ return result;
750
+ }
751
+ async function storeInfo() {
752
+ const path = await storePath();
753
+ return {
754
+ path,
755
+ sizeBytes: await directorySize(path),
756
+ remoteCount: (await readdir(join(path, 'remotes')).catch(() => [])).filter((name) => name.endsWith('.json'))
757
+ .length,
758
+ };
759
+ }
760
+ async function listRemotes() {
761
+ const directory = join(await storePath(), 'remotes');
762
+ const entries = await readdir(directory).catch((error) => {
763
+ if (error.code === 'ENOENT')
764
+ return [];
765
+ throw error;
766
+ });
767
+ const remotes = await Promise.all(entries
768
+ .filter((name) => name.endsWith('.json'))
769
+ .map(async (name) => {
770
+ const value = JSON.parse(await readFile(join(directory, name), 'utf8'));
771
+ if (!value ||
772
+ typeof value !== 'object' ||
773
+ !('key' in value) ||
774
+ typeof value.key !== 'string' ||
775
+ !('remote' in value) ||
776
+ typeof value.remote !== 'string' ||
777
+ `${remoteId(value.key)}.json` !== name)
778
+ throw new Error(`Invalid git-dedup remote registration: ${name}`);
779
+ return { key: value.key, remote: value.remote };
780
+ }));
781
+ return remotes.toSorted((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));
782
+ }
783
+ async function fetch() {
784
+ const root = await storePath();
785
+ let fetched = 0;
786
+ await withLock(root, async () => {
787
+ for (const name of await readdir(join(root, 'remotes')).catch(() => [])) {
788
+ if (!name.endsWith('.json'))
789
+ continue;
790
+ const { key, remote } = JSON.parse(await readFile(join(root, 'remotes', name), 'utf8'));
791
+ await fetchRemote(root, remote, key);
792
+ fetched++;
793
+ }
794
+ if (fetched)
795
+ await checked(['-C', poolPath(root), 'repack', '-d', '--geometric=2']);
796
+ });
797
+ return { fetched };
798
+ }
799
+ async function gc() {
800
+ const root = await storePath();
801
+ if (!(await isPresent(poolPath(root))))
802
+ return { compacted: false };
803
+ await withLock(root, async () => {
804
+ await checked(['-C', poolPath(root), 'gc', '--prune=never']);
805
+ });
806
+ return { compacted: true };
807
+ }
808
+ async function doctor() {
809
+ const root = await storePath();
810
+ return withLock(root, async () => {
811
+ const checks = [];
812
+ const pool = await ensurePool(root);
813
+ checks.push({
814
+ name: 'pool',
815
+ ok: true,
816
+ detail: `${pool}: SHA-1 object database`,
817
+ });
818
+ const binary = await gitPath();
819
+ checks.push({ name: 'git', ok: true, detail: `${binary}: ${await checked(['--version'])}` });
820
+ return { checks };
821
+ });
822
+ }
823
+ async function addWorktree(args, at) {
824
+ if (args[0] !== 'add')
825
+ return (await git(['worktree', ...args], at, true)).code;
826
+ let path;
827
+ let noCheckout = false;
828
+ for (let i = 1; i < args.length; i++) {
829
+ const arg = args[i];
830
+ if (arg === '--') {
831
+ path = args[i + 1];
832
+ break;
833
+ }
834
+ if (['-b', '-B', '--reason'].includes(arg)) {
835
+ i++;
836
+ continue;
837
+ }
838
+ if (arg === '--no-checkout' || arg === '--orphan')
839
+ noCheckout = true;
840
+ if ([
841
+ '-f',
842
+ '--force',
843
+ '-d',
844
+ '--detach',
845
+ '--checkout',
846
+ '--no-checkout',
847
+ '--lock',
848
+ '--track',
849
+ '--no-track',
850
+ '--guess-remote',
851
+ '--no-guess-remote',
852
+ '--orphan',
853
+ '-q',
854
+ '--quiet',
855
+ ].includes(arg) ||
856
+ /^(--reason|--track)=/.test(arg))
857
+ continue;
858
+ if (arg.startsWith('-'))
859
+ return (await git(['worktree', ...args], at, true)).code;
860
+ path = arg;
861
+ break;
862
+ }
863
+ const code = (await git(['worktree', ...args], at, true)).code;
864
+ if (code !== 0 || !path || noCheckout)
865
+ return code;
866
+ const target = resolve(at, path);
867
+ // Git already shares the superproject object directory between worktrees.
868
+ // Its submodules have separate gitdirs, so populate those through the pool.
869
+ if (await isPresent(join(target, '.gitmodules')))
870
+ return updateSubmodules(['update', '--init', '--recursive'], target);
871
+ return 0;
872
+ }
873
+ async function run(args) {
874
+ const parsed = parseGlobal(args, cwd);
875
+ if (incomingEnv.GITX_ACTIVE === '1' || incomingEnv.GIT_DEDUP_ACTIVE === '1' || hasRepositoryEnvironment || !parsed)
876
+ return (await git(args, cwd, true)).code;
877
+ // -C is resolved explicitly. Other global options can change Git semantics, so forward intact.
878
+ for (let i = 0; i < parsed.prefix.length; i++) {
879
+ const arg = parsed.prefix[i];
880
+ if (arg === '-C') {
881
+ i++;
882
+ continue;
883
+ }
884
+ if (arg.startsWith('-C'))
885
+ continue;
886
+ return (await git(args, cwd, true)).code;
887
+ }
888
+ if (parsed.cwd !== cwd) {
889
+ return createGitDedup({ ...options, cwd: parsed.cwd, env: incomingEnv }).run([parsed.command, ...parsed.rest]);
890
+ }
891
+ if (parsed.command === 'clone') {
892
+ const handled = await clone(parsed.rest, parsed.cwd);
893
+ if (handled !== undefined)
894
+ return handled;
895
+ }
896
+ if (parsed.command === 'submodule')
897
+ return updateSubmodules(parsed.rest, parsed.cwd);
898
+ if (parsed.command === 'worktree')
899
+ return addWorktree(parsed.rest, parsed.cwd);
900
+ return (await git(args, cwd, true)).code;
901
+ }
902
+ /** The underlying Git version line, such as `git version 2.50.1`. */
903
+ async function gitVersion() {
904
+ const result = await git(['--version']);
905
+ if (result.code !== 0)
906
+ throw new Error(`git --version failed: ${result.stderr.trim()}`);
907
+ return result.stdout.trim();
908
+ }
909
+ return { run, cache, storeInfo, listRemotes, fetch, gc, doctor, storePath, gitVersion };
910
+ }
911
+ function processExists(pid) {
912
+ try {
913
+ process.kill(pid, 0);
914
+ return true;
915
+ }
916
+ catch (error) {
917
+ return error.code === 'EPERM';
918
+ }
919
+ }
920
+ export { keyForRemote };
921
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "git-dedup-core",
3
+ "version": "0.1.0",
4
+ "description": "Consolidated Git storage with a shared object pool",
5
+ "keywords": [
6
+ "alternates",
7
+ "clone",
8
+ "deduplication",
9
+ "git",
10
+ "object-pool",
11
+ "shared-storage",
12
+ "storage",
13
+ "submodule",
14
+ "worktree"
15
+ ],
16
+ "homepage": "https://git-dedup.ben3d.ca",
17
+ "license": "MIT",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/bhouston/git-dedup.git",
21
+ "directory": "packages/core"
22
+ },
23
+ "files": [
24
+ "dist",
25
+ "README.md",
26
+ "LICENSE"
27
+ ],
28
+ "type": "module",
29
+ "main": "./dist/index.js",
30
+ "types": "./dist/index.d.ts",
31
+ "exports": {
32
+ ".": {
33
+ "types": "./dist/index.d.ts",
34
+ "import": "./dist/index.js"
35
+ }
36
+ },
37
+ "publishConfig": {
38
+ "access": "public"
39
+ },
40
+ "engines": {
41
+ "node": ">=22"
42
+ },
43
+ "scripts": {
44
+ "build": "tsc",
45
+ "tsc": "tsc --noEmit"
46
+ }
47
+ }