@foss.global/gitmanager 0.4.0 → 0.6.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/changelog.md +18 -0
- package/dist_rust/rustgitmanager_linux_amd64 +0 -0
- package/dist_rust/rustgitmanager_linux_arm64 +0 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.gitmanager.d.ts +3 -1
- package/dist_ts/classes.gitmanager.js +22 -2
- package/dist_ts/models.d.ts +23 -0
- package/dist_ts/rust-gitmanager-bridge.d.ts +3 -1
- package/dist_ts/rust-gitmanager-bridge.js +7 -1
- package/package.json +1 -1
- package/readme.md +47 -7
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.gitmanager.ts +32 -2
- package/ts/models.ts +29 -0
- package/ts/rust-gitmanager-bridge.ts +17 -1
package/changelog.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-07-20 - 0.6.0
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- add trusted receive-pack support to smart HTTP (smart-http)
|
|
8
|
+
- Adds optional receivePack configuration with a trusted ingress token and request body limit.
|
|
9
|
+
- Enables bounded git-receive-pack advertisement and push handling through the Rust Smart HTTP server.
|
|
10
|
+
- Expands tests and documentation for trusted ingress receive-pack behavior.
|
|
11
|
+
|
|
12
|
+
## 2026-07-20 - 0.5.0
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
- add durable repository bundle export and restore (repository-bundles)
|
|
17
|
+
- Add public createRepositoryBundle and restoreRepositoryBundle APIs across TypeScript and Rust IPC.
|
|
18
|
+
- Stage bundle files in a configurable transferDir with maxBundleBytes validation.
|
|
19
|
+
- Restore bundles atomically with default branch validation and strict repository integrity checks.
|
|
20
|
+
|
|
3
21
|
## 2026-07-20 - 0.4.0
|
|
4
22
|
|
|
5
23
|
### Features
|
|
Binary file
|
|
Binary file
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@foss.global/gitmanager',
|
|
6
|
-
version: '0.
|
|
6
|
+
version: '0.6.0',
|
|
7
7
|
description: 'Headless Git manager for the foss.global Git platform, with a TypeScript API and Rust engine.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx5QkFBeUI7SUFDL0IsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLCtGQUErRjtDQUM3RyxDQUFBIn0=
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
|
-
import type { IGitManagerCommitDetail, IGitManagerCommitRequest, IGitManagerCommitSummary, IGitManagerDiff, IGitManagerDiffRequest, IGitManagerFileContent, IGitManagerImportMirrorRequest, IGitManagerInitBareRepositoryRequest, IGitManagerListCommitsRequest, IGitManagerListTagsRequest, IGitManagerReadFileRequest, IGitManagerRef, IGitManagerRefRequest,
|
|
2
|
+
import type { IGitManagerCommitDetail, IGitManagerCommitRequest, IGitManagerCommitSummary, IGitManagerDiff, IGitManagerDiffRequest, IGitManagerFileContent, IGitManagerImportMirrorRequest, IGitManagerInitBareRepositoryRequest, IGitManagerListCommitsRequest, IGitManagerListTagsRequest, IGitManagerReadFileRequest, IGitManagerRef, IGitManagerRefRequest, IGitManagerRepositoryBundle, IGitManagerRepositoryInfo, IGitManagerRepositorySelector, IGitManagerRestoreBundleRequest, IGitManagerSmartHttpRepositoryAccess, IGitManagerSmartHttpRepositoryVisibility, IGitManagerStatus, IGitManagerTag, IGitManagerTagRequest, IGitManagerTreeEntry, IGitManagerTreeRequest, IGitManagerOptions } from './models.js';
|
|
3
3
|
export declare class GitManager extends plugins.EventEmitter {
|
|
4
4
|
private bridge;
|
|
5
5
|
private started;
|
|
@@ -17,6 +17,8 @@ export declare class GitManager extends plugins.EventEmitter {
|
|
|
17
17
|
importMirror(requestArg: IGitManagerImportMirrorRequest): Promise<IGitManagerRepositoryInfo>;
|
|
18
18
|
refreshMirror(requestArg: IGitManagerRepositorySelector): Promise<IGitManagerRepositoryInfo>;
|
|
19
19
|
verifyRepository(requestArg: IGitManagerRepositorySelector): Promise<IGitManagerRepositoryInfo>;
|
|
20
|
+
createRepositoryBundle(requestArg: IGitManagerRepositorySelector): Promise<IGitManagerRepositoryBundle>;
|
|
21
|
+
restoreRepositoryBundle(requestArg: IGitManagerRestoreBundleRequest): Promise<IGitManagerRepositoryInfo>;
|
|
20
22
|
listRepositories(): Promise<IGitManagerRepositoryInfo[]>;
|
|
21
23
|
listRefs(requestArg: IGitManagerRefRequest): Promise<IGitManagerRef[]>;
|
|
22
24
|
listTree(requestArg: IGitManagerTreeRequest): Promise<IGitManagerTreeEntry[]>;
|
|
@@ -7,9 +7,13 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
7
7
|
this.started = false;
|
|
8
8
|
this.startPromise = null;
|
|
9
9
|
this.stopRequested = false;
|
|
10
|
+
const dataDir = optionsArg.dataDir
|
|
11
|
+
?? plugins.path.resolve(process.cwd(), '.nogit', 'gitmanager');
|
|
10
12
|
const smartHttpOptions = optionsArg.smartHttp;
|
|
11
13
|
this.config = {
|
|
12
|
-
dataDir
|
|
14
|
+
dataDir,
|
|
15
|
+
transferDir: optionsArg.transferDir ?? plugins.path.join(dataDir, 'transfers'),
|
|
16
|
+
maxBundleBytes: optionsArg.maxBundleBytes ?? 8 * 1024 * 1024 * 1024,
|
|
13
17
|
smartHttp: smartHttpOptions && smartHttpOptions.enabled !== false
|
|
14
18
|
? {
|
|
15
19
|
bindAddress: smartHttpOptions.bindAddress ?? '127.0.0.1',
|
|
@@ -27,6 +31,14 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
27
31
|
processTimeoutMs: smartHttpOptions.processTimeoutMs ?? 30 * 60 * 1000,
|
|
28
32
|
idleTimeoutSeconds: smartHttpOptions.idleTimeoutSeconds ?? 300,
|
|
29
33
|
gracefulShutdownMs: smartHttpOptions.gracefulShutdownMs ?? 10_000,
|
|
34
|
+
receivePack: smartHttpOptions.receivePack
|
|
35
|
+
&& smartHttpOptions.receivePack.enabled !== false
|
|
36
|
+
? {
|
|
37
|
+
trustedIngressToken: smartHttpOptions.receivePack.trustedIngressToken,
|
|
38
|
+
maxRequestBodyBytes: smartHttpOptions.receivePack.maxRequestBodyBytes
|
|
39
|
+
?? 4 * 1024 * 1024 * 1024,
|
|
40
|
+
}
|
|
41
|
+
: undefined,
|
|
30
42
|
}
|
|
31
43
|
: undefined,
|
|
32
44
|
};
|
|
@@ -119,6 +131,14 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
119
131
|
this.assertRunning();
|
|
120
132
|
return this.bridge.verifyRepository(requestArg);
|
|
121
133
|
}
|
|
134
|
+
async createRepositoryBundle(requestArg) {
|
|
135
|
+
this.assertRunning();
|
|
136
|
+
return this.bridge.createRepositoryBundle(requestArg);
|
|
137
|
+
}
|
|
138
|
+
async restoreRepositoryBundle(requestArg) {
|
|
139
|
+
this.assertRunning();
|
|
140
|
+
return this.bridge.restoreRepositoryBundle(requestArg);
|
|
141
|
+
}
|
|
122
142
|
async listRepositories() {
|
|
123
143
|
this.assertRunning();
|
|
124
144
|
return this.bridge.listRepositories();
|
|
@@ -190,4 +210,4 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
190
210
|
}
|
|
191
211
|
}
|
|
192
212
|
}
|
|
193
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
213
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5naXRtYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5naXRtYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBNkJ4QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVuRSxNQUFNLE9BQU8sVUFBVyxTQUFRLE9BQU8sQ0FBQyxZQUFZO0lBT2xELFlBQVksYUFBaUMsRUFBRTtRQUM3QyxLQUFLLEVBQUUsQ0FBQztRQVBGLFdBQU0sR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDcEMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixpQkFBWSxHQUF5QixJQUFJLENBQUM7UUFDMUMsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFLNUIsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU87ZUFDN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNqRSxNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUM7UUFDOUMsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLE9BQU87WUFDUCxXQUFXLEVBQUUsVUFBVSxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDO1lBQzlFLGNBQWMsRUFBRSxVQUFVLENBQUMsY0FBYyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUk7WUFDbkUsU0FBUyxFQUFFLGdCQUFnQixJQUFJLGdCQUFnQixDQUFDLE9BQU8sS0FBSyxLQUFLO2dCQUMvRCxDQUFDLENBQUM7b0JBQ0UsV0FBVyxFQUFFLGdCQUFnQixDQUFDLFdBQVcsSUFBSSxXQUFXO29CQUN4RCxJQUFJLEVBQUUsZ0JB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
|
package/dist_ts/models.d.ts
CHANGED
|
@@ -13,6 +13,12 @@ export interface IGitManagerSmartHttpOptions {
|
|
|
13
13
|
processTimeoutMs?: number;
|
|
14
14
|
idleTimeoutSeconds?: number;
|
|
15
15
|
gracefulShutdownMs?: number;
|
|
16
|
+
receivePack?: IGitManagerSmartHttpReceivePackOptions;
|
|
17
|
+
}
|
|
18
|
+
export interface IGitManagerSmartHttpReceivePackOptions {
|
|
19
|
+
enabled?: boolean;
|
|
20
|
+
trustedIngressToken: string;
|
|
21
|
+
maxRequestBodyBytes?: number;
|
|
16
22
|
}
|
|
17
23
|
export interface IGitManagerSmartHttpRepositoryAccess {
|
|
18
24
|
allowAllRepositories: boolean;
|
|
@@ -22,8 +28,18 @@ export interface IGitManagerSmartHttpRepositoryVisibility extends IGitManagerRep
|
|
|
22
28
|
public: boolean;
|
|
23
29
|
revision: number;
|
|
24
30
|
}
|
|
31
|
+
export interface IGitManagerRepositoryBundle extends IGitManagerRepositorySelector {
|
|
32
|
+
bundlePath: string;
|
|
33
|
+
sizeBytes: number;
|
|
34
|
+
}
|
|
35
|
+
export interface IGitManagerRestoreBundleRequest extends IGitManagerRepositorySelector {
|
|
36
|
+
bundlePath: string;
|
|
37
|
+
defaultBranch?: string;
|
|
38
|
+
}
|
|
25
39
|
export interface IGitManagerOptions {
|
|
26
40
|
dataDir?: string;
|
|
41
|
+
transferDir?: string;
|
|
42
|
+
maxBundleBytes?: number;
|
|
27
43
|
smartHttp?: IGitManagerSmartHttpOptions;
|
|
28
44
|
}
|
|
29
45
|
export interface IRustGitManagerSmartHttpConfig {
|
|
@@ -39,9 +55,16 @@ export interface IRustGitManagerSmartHttpConfig {
|
|
|
39
55
|
processTimeoutMs: number;
|
|
40
56
|
idleTimeoutSeconds: number;
|
|
41
57
|
gracefulShutdownMs: number;
|
|
58
|
+
receivePack?: IRustGitManagerSmartHttpReceivePackConfig;
|
|
59
|
+
}
|
|
60
|
+
export interface IRustGitManagerSmartHttpReceivePackConfig {
|
|
61
|
+
trustedIngressToken: string;
|
|
62
|
+
maxRequestBodyBytes: number;
|
|
42
63
|
}
|
|
43
64
|
export interface IRustGitManagerConfig {
|
|
44
65
|
dataDir: string;
|
|
66
|
+
transferDir: string;
|
|
67
|
+
maxBundleBytes: number;
|
|
45
68
|
smartHttp?: IRustGitManagerSmartHttpConfig;
|
|
46
69
|
}
|
|
47
70
|
export interface IGitManagerSmartHttpStatus {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
|
-
import type { IGitManagerCommitDetail, IGitManagerCommitRequest, IGitManagerCommitSummary, IGitManagerDiff, IGitManagerDiffRequest, IGitManagerFileContent, IGitManagerImportMirrorRequest, IGitManagerInitBareRepositoryRequest, IGitManagerListCommitsRequest, IGitManagerListTagsRequest, IGitManagerReadFileRequest, IGitManagerRef, IGitManagerRefRequest,
|
|
2
|
+
import type { IGitManagerCommitDetail, IGitManagerCommitRequest, IGitManagerCommitSummary, IGitManagerDiff, IGitManagerDiffRequest, IGitManagerFileContent, IGitManagerImportMirrorRequest, IGitManagerInitBareRepositoryRequest, IGitManagerListCommitsRequest, IGitManagerListTagsRequest, IGitManagerReadFileRequest, IGitManagerRef, IGitManagerRefRequest, IGitManagerRepositoryBundle, IGitManagerRepositoryInfo, IGitManagerRepositorySelector, IGitManagerRestoreBundleRequest, IGitManagerSmartHttpRepositoryAccess, IGitManagerSmartHttpRepositoryVisibility, IGitManagerStatus, IGitManagerTag, IGitManagerTagRequest, IGitManagerTreeEntry, IGitManagerTreeRequest, IRustGitManagerConfig } from './models.js';
|
|
3
3
|
export declare class RustGitManagerBridge extends plugins.EventEmitter {
|
|
4
4
|
private bridge;
|
|
5
5
|
constructor();
|
|
@@ -15,6 +15,8 @@ export declare class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
15
15
|
importMirror(requestArg: IGitManagerImportMirrorRequest): Promise<IGitManagerRepositoryInfo>;
|
|
16
16
|
refreshMirror(requestArg: IGitManagerRepositorySelector): Promise<IGitManagerRepositoryInfo>;
|
|
17
17
|
verifyRepository(requestArg: IGitManagerRepositorySelector): Promise<IGitManagerRepositoryInfo>;
|
|
18
|
+
createRepositoryBundle(requestArg: IGitManagerRepositorySelector): Promise<IGitManagerRepositoryBundle>;
|
|
19
|
+
restoreRepositoryBundle(requestArg: IGitManagerRestoreBundleRequest): Promise<IGitManagerRepositoryInfo>;
|
|
18
20
|
listRepositories(): Promise<IGitManagerRepositoryInfo[]>;
|
|
19
21
|
listRefs(requestArg: IGitManagerRefRequest): Promise<IGitManagerRef[]>;
|
|
20
22
|
listTree(requestArg: IGitManagerTreeRequest): Promise<IGitManagerTreeEntry[]>;
|
|
@@ -76,6 +76,12 @@ export class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
76
76
|
async verifyRepository(requestArg) {
|
|
77
77
|
return this.bridge.sendCommand('verifyRepository', requestArg);
|
|
78
78
|
}
|
|
79
|
+
async createRepositoryBundle(requestArg) {
|
|
80
|
+
return this.bridge.sendCommand('createRepositoryBundle', requestArg);
|
|
81
|
+
}
|
|
82
|
+
async restoreRepositoryBundle(requestArg) {
|
|
83
|
+
return this.bridge.sendCommand('restoreRepositoryBundle', requestArg);
|
|
84
|
+
}
|
|
79
85
|
async listRepositories() {
|
|
80
86
|
return this.bridge.sendCommand('listRepositories', {});
|
|
81
87
|
}
|
|
@@ -104,4 +110,4 @@ export class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
104
110
|
return this.bridge.sendCommand('getTag', requestArg);
|
|
105
111
|
}
|
|
106
112
|
}
|
|
107
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVzdC1naXRtYW5hZ2VyLWJyaWRnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3J1c3QtZ2l0bWFuYWdlci1icmlkZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFvRHhDLFNBQVMsY0FBYztJQUNyQixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakYsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVELFNBQVMsdUJBQXVCO0lBQzlCLE1BQU0sT0FBTyxHQUEyQixFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3pFLE1BQU0sS0FBSyxHQUEyQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDN0MsQ0FBQztBQUVELFNBQVMsZUFBZTtJQUN0QixNQUFNLFdBQVcsR0FBRyxjQUFjLEVBQUUsQ0FBQztJQUNyQyxNQUFNLE1BQU0sR0FBRyx1QkFBdUIsRUFBRSxDQUFDO0lBQ3pDLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUUzQixJQUFJLE1BQU0sRUFBRSxD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QUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBa0M7UUFDdEQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBc0M7UUFDMUQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsVUFBeUM7UUFDaEUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVNLEtBQUssQ0FBQyxTQUFTLENBQUMsVUFBb0M7UUFDekQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBa0M7UUFDckQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBc0M7UUFDMUQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVNLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBaUM7UUFDbkQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDdkQsQ0FBQztDQUNGIn0=
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -4,7 +4,7 @@ Headless Git manager for the foss.global Git platform.
|
|
|
4
4
|
|
|
5
5
|
This package follows the push.rocks Rust-backed package pattern: TypeScript owns the public package API and lifecycle, while Rust owns the Git/storage/protocol engine. TypeScript controls the Rust binary through `@push.rocks/smartrust`, and builds use `@git.zone/tsrust`.
|
|
6
6
|
|
|
7
|
-
The current implementation provides lifecycle IPC, local bare repository and mirror management, bounded read APIs,
|
|
7
|
+
The current implementation provides lifecycle IPC, local bare repository and mirror management, bounded read APIs, durable repository bundle transfer, public clone/fetch, and trusted-ingress receive-pack. User identity, permissions, TLS, and durable post-push storage remain the embedding service's responsibility.
|
|
8
8
|
|
|
9
9
|
## Issue Reporting and Security
|
|
10
10
|
|
|
@@ -47,7 +47,36 @@ const readme = await gitManager.readFile({
|
|
|
47
47
|
await gitManager.stop();
|
|
48
48
|
```
|
|
49
49
|
|
|
50
|
-
##
|
|
50
|
+
## Durable repository bundles
|
|
51
|
+
|
|
52
|
+
GitManager can export a repository as a full Git bundle and atomically restore it under a new managed repository identity. Bundle bytes never pass through JSON IPC: Rust writes or reads a temporary file inside the dedicated `transferDir`, and the caller streams that file to or from durable object storage.
|
|
53
|
+
|
|
54
|
+
```ts
|
|
55
|
+
const gitManager = new GitManager({
|
|
56
|
+
dataDir: '/run/foss-global/gitmanager',
|
|
57
|
+
transferDir: '/run/foss-global/git-transfers',
|
|
58
|
+
maxBundleBytes: 8 * 1024 * 1024 * 1024,
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
const bundle = await gitManager.createRepositoryBundle({
|
|
62
|
+
org: 'foss.global',
|
|
63
|
+
repo: 'interfaces',
|
|
64
|
+
});
|
|
65
|
+
// Stream bundle.bundlePath to durable object storage, then remove the temporary file.
|
|
66
|
+
|
|
67
|
+
await gitManager.restoreRepositoryBundle({
|
|
68
|
+
org: 'restored',
|
|
69
|
+
repo: 'interfaces',
|
|
70
|
+
bundlePath: '/run/foss-global/git-transfers/downloaded.bundle',
|
|
71
|
+
defaultBranch: 'main',
|
|
72
|
+
});
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
`transferDir` defaults to `<dataDir>/transfers`; both paths must be absolute. `maxBundleBytes` defaults to 8 GiB and is enforced after export and before restore. Restore accepts only a direct, non-empty `.bundle` file inside `transferDir`, requires the declared default branch, runs strict full `git fsck`, and moves the restored bare repository into place atomically. Empty repositories have no Git refs and therefore cannot produce a bundle; persist their catalog metadata and recreate them with `initBareRepository()`.
|
|
76
|
+
|
|
77
|
+
The transfer directory is disposable staging, not persistence. The caller owns upload/download completion and removal of finished transfer files. Durable repository bytes belong in managed object storage.
|
|
78
|
+
|
|
79
|
+
## Git Smart HTTP
|
|
51
80
|
|
|
52
81
|
Smart HTTP is disabled unless a `smartHttp` options object is provided. The safe defaults bind to loopback on an operating-system-assigned port and expose no repositories:
|
|
53
82
|
|
|
@@ -58,6 +87,9 @@ const gitManager = new GitManager({
|
|
|
58
87
|
allowedRepositories: [
|
|
59
88
|
{ org: 'foss.global', repo: 'interfaces' },
|
|
60
89
|
],
|
|
90
|
+
receivePack: {
|
|
91
|
+
trustedIngressToken: process.env.GITMANAGER_INGRESS_TOKEN!,
|
|
92
|
+
},
|
|
61
93
|
},
|
|
62
94
|
});
|
|
63
95
|
|
|
@@ -66,9 +98,11 @@ const status = await gitManager.getStatus();
|
|
|
66
98
|
console.log(status.smartHttp?.baseUrl);
|
|
67
99
|
```
|
|
68
100
|
|
|
69
|
-
The server implements `git-upload-pack` for clone and fetch with Git protocol versions 0, 1, and 2.
|
|
101
|
+
The server implements `git-upload-pack` for clone and fetch with Git protocol versions 0, 1, and 2. Missing and inaccessible read repositories both return the same not-found response. Receive-pack is disabled unless a loopback trusted ingress is configured.
|
|
102
|
+
|
|
103
|
+
Configuring `receivePack` enables streamed push only for requests carrying the exact `X-GitManager-Ingress-Token` value. Receive-pack requires a loopback bind even when `allowUnsafeNonLoopback` is set. The trusted ingress must remove client-supplied internal token headers, authorize the user and repository, serialize writes, persist the updated repository, and withhold success if persistence fails.
|
|
70
104
|
|
|
71
|
-
The transport
|
|
105
|
+
The transport does not terminate TLS or implement user identity. Keep it behind a bounded ingress. Read-only binding to a non-loopback IP is rejected unless `allowUnsafeNonLoopback: true` is set explicitly.
|
|
72
106
|
|
|
73
107
|
Smart HTTP option defaults and accepted ranges:
|
|
74
108
|
|
|
@@ -87,6 +121,8 @@ All numeric options must be integers.
|
|
|
87
121
|
- `processTimeoutMs`: 1,800,000; accepted range 1,000–86,400,000.
|
|
88
122
|
- `idleTimeoutSeconds`: `300`; accepted range 1–3,600.
|
|
89
123
|
- `gracefulShutdownMs`: `10,000`; accepted range 100–60,000.
|
|
124
|
+
- `receivePack.trustedIngressToken`: required when receive-pack is enabled; 32–512 non-whitespace characters.
|
|
125
|
+
- `receivePack.maxRequestBodyBytes`: 4 GiB; accepted range 1 KiB–16 TiB. Request bodies are streamed and counted.
|
|
90
126
|
|
|
91
127
|
While the service is running, access can be replaced atomically:
|
|
92
128
|
|
|
@@ -125,6 +161,10 @@ When enabled, `getStatus().smartHttp` reports `{ running, bindAddress, port, bas
|
|
|
125
161
|
- `GitManager.setSmartHttpRepositoryVisibility()`: applies one revision-ordered repository visibility update.
|
|
126
162
|
- `GitManager.initBareRepository()`: creates an empty local bare repository.
|
|
127
163
|
- `GitManager.importMirror()`: imports a remote repository with `git clone --mirror`. Supported remote forms are `https://`, `http://`, `ssh://`, `git://`, `file://`, and SCP-like `git@host:org/repo.git` URLs.
|
|
164
|
+
- `GitManager.refreshMirror()`: atomically fetches and verifies the configured mirror source.
|
|
165
|
+
- `GitManager.verifyRepository()`: runs a strict full integrity check.
|
|
166
|
+
- `GitManager.createRepositoryBundle()`: writes a bounded full Git bundle into `transferDir` and returns its temporary path and size.
|
|
167
|
+
- `GitManager.restoreRepositoryBundle()`: validates and atomically restores a bounded bundle from `transferDir`.
|
|
128
168
|
- `GitManager.listRepositories()`: lists local repositories managed below the configured data directory.
|
|
129
169
|
- `GitManager.listRefs()`: lists branch and tag refs.
|
|
130
170
|
- `GitManager.listTree()`: lists tree entries at a ref and optional path.
|
|
@@ -140,9 +180,9 @@ When enabled, `getStatus().smartHttp` reports `{ running, bindAddress, port, bas
|
|
|
140
180
|
|
|
141
181
|
Repository/read DTO contracts are re-exported from the published `@foss.global/interfaces` package.
|
|
142
182
|
|
|
143
|
-
Read/list APIs go through JSON IPC. Git packfile streaming
|
|
183
|
+
Read/list APIs go through JSON IPC. Git packfile streaming is served directly by the Rust engine through controlled `git upload-pack` and `git receive-pack` subprocesses; packfiles do not pass through JSON IPC.
|
|
144
184
|
|
|
145
|
-
Read APIs and Smart HTTP use the system `git` CLI with explicit arguments, non-interactive environment variables, command timeouts, ref-to-object-id resolution, path validation, bounded stdout/stderr capture, ref/tree result caps, and a 1 MiB file read cap.
|
|
185
|
+
Read APIs and Smart HTTP use the system `git` CLI with explicit arguments, non-interactive environment variables, command timeouts, ref-to-object-id resolution, path validation, bounded stdout/stderr capture, ref/tree result caps, and a 1 MiB file read cap. Receive-pack streams bounded requests, disables repository hooks, and enables incoming object fsck.
|
|
146
186
|
|
|
147
187
|
## Rust Build
|
|
148
188
|
|
|
@@ -163,7 +203,7 @@ pnpm run test:rust
|
|
|
163
203
|
pnpm run build
|
|
164
204
|
```
|
|
165
205
|
|
|
166
|
-
`pnpm test` runs the `pretest` hook first, which builds the Rust binaries with `tsrust`, and then runs lifecycle, local mirror/read API,
|
|
206
|
+
`pnpm test` runs the `pretest` hook first, which builds the Rust binaries with `tsrust`, and then runs lifecycle, local mirror/read API, clone/fetch denial, trusted receive-pack denial, and real push tests through `smartrust`.
|
|
167
207
|
|
|
168
208
|
## License and Legal Information
|
|
169
209
|
|
package/ts/00_commitinfo_data.ts
CHANGED
package/ts/classes.gitmanager.ts
CHANGED
|
@@ -13,8 +13,10 @@ import type {
|
|
|
13
13
|
IGitManagerReadFileRequest,
|
|
14
14
|
IGitManagerRef,
|
|
15
15
|
IGitManagerRefRequest,
|
|
16
|
-
|
|
16
|
+
IGitManagerRepositoryBundle,
|
|
17
17
|
IGitManagerRepositoryInfo,
|
|
18
|
+
IGitManagerRepositorySelector,
|
|
19
|
+
IGitManagerRestoreBundleRequest,
|
|
18
20
|
IGitManagerSmartHttpRepositoryAccess,
|
|
19
21
|
IGitManagerSmartHttpRepositoryVisibility,
|
|
20
22
|
IGitManagerStatus,
|
|
@@ -36,9 +38,13 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
36
38
|
|
|
37
39
|
constructor(optionsArg: IGitManagerOptions = {}) {
|
|
38
40
|
super();
|
|
41
|
+
const dataDir = optionsArg.dataDir
|
|
42
|
+
?? plugins.path.resolve(process.cwd(), '.nogit', 'gitmanager');
|
|
39
43
|
const smartHttpOptions = optionsArg.smartHttp;
|
|
40
44
|
this.config = {
|
|
41
|
-
dataDir
|
|
45
|
+
dataDir,
|
|
46
|
+
transferDir: optionsArg.transferDir ?? plugins.path.join(dataDir, 'transfers'),
|
|
47
|
+
maxBundleBytes: optionsArg.maxBundleBytes ?? 8 * 1024 * 1024 * 1024,
|
|
42
48
|
smartHttp: smartHttpOptions && smartHttpOptions.enabled !== false
|
|
43
49
|
? {
|
|
44
50
|
bindAddress: smartHttpOptions.bindAddress ?? '127.0.0.1',
|
|
@@ -56,6 +62,16 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
56
62
|
processTimeoutMs: smartHttpOptions.processTimeoutMs ?? 30 * 60 * 1000,
|
|
57
63
|
idleTimeoutSeconds: smartHttpOptions.idleTimeoutSeconds ?? 300,
|
|
58
64
|
gracefulShutdownMs: smartHttpOptions.gracefulShutdownMs ?? 10_000,
|
|
65
|
+
receivePack: smartHttpOptions.receivePack
|
|
66
|
+
&& smartHttpOptions.receivePack.enabled !== false
|
|
67
|
+
? {
|
|
68
|
+
trustedIngressToken:
|
|
69
|
+
smartHttpOptions.receivePack.trustedIngressToken,
|
|
70
|
+
maxRequestBodyBytes:
|
|
71
|
+
smartHttpOptions.receivePack.maxRequestBodyBytes
|
|
72
|
+
?? 4 * 1024 * 1024 * 1024,
|
|
73
|
+
}
|
|
74
|
+
: undefined,
|
|
59
75
|
}
|
|
60
76
|
: undefined,
|
|
61
77
|
};
|
|
@@ -162,6 +178,20 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
162
178
|
return this.bridge.verifyRepository(requestArg);
|
|
163
179
|
}
|
|
164
180
|
|
|
181
|
+
public async createRepositoryBundle(
|
|
182
|
+
requestArg: IGitManagerRepositorySelector,
|
|
183
|
+
): Promise<IGitManagerRepositoryBundle> {
|
|
184
|
+
this.assertRunning();
|
|
185
|
+
return this.bridge.createRepositoryBundle(requestArg);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
public async restoreRepositoryBundle(
|
|
189
|
+
requestArg: IGitManagerRestoreBundleRequest,
|
|
190
|
+
): Promise<IGitManagerRepositoryInfo> {
|
|
191
|
+
this.assertRunning();
|
|
192
|
+
return this.bridge.restoreRepositoryBundle(requestArg);
|
|
193
|
+
}
|
|
194
|
+
|
|
165
195
|
public async listRepositories(): Promise<IGitManagerRepositoryInfo[]> {
|
|
166
196
|
this.assertRunning();
|
|
167
197
|
return this.bridge.listRepositories();
|
package/ts/models.ts
CHANGED
|
@@ -14,6 +14,13 @@ export interface IGitManagerSmartHttpOptions {
|
|
|
14
14
|
processTimeoutMs?: number;
|
|
15
15
|
idleTimeoutSeconds?: number;
|
|
16
16
|
gracefulShutdownMs?: number;
|
|
17
|
+
receivePack?: IGitManagerSmartHttpReceivePackOptions;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface IGitManagerSmartHttpReceivePackOptions {
|
|
21
|
+
enabled?: boolean;
|
|
22
|
+
trustedIngressToken: string;
|
|
23
|
+
maxRequestBodyBytes?: number;
|
|
17
24
|
}
|
|
18
25
|
|
|
19
26
|
export interface IGitManagerSmartHttpRepositoryAccess {
|
|
@@ -27,8 +34,22 @@ export interface IGitManagerSmartHttpRepositoryVisibility
|
|
|
27
34
|
revision: number;
|
|
28
35
|
}
|
|
29
36
|
|
|
37
|
+
export interface IGitManagerRepositoryBundle
|
|
38
|
+
extends IGitManagerRepositorySelector {
|
|
39
|
+
bundlePath: string;
|
|
40
|
+
sizeBytes: number;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface IGitManagerRestoreBundleRequest
|
|
44
|
+
extends IGitManagerRepositorySelector {
|
|
45
|
+
bundlePath: string;
|
|
46
|
+
defaultBranch?: string;
|
|
47
|
+
}
|
|
48
|
+
|
|
30
49
|
export interface IGitManagerOptions {
|
|
31
50
|
dataDir?: string;
|
|
51
|
+
transferDir?: string;
|
|
52
|
+
maxBundleBytes?: number;
|
|
32
53
|
smartHttp?: IGitManagerSmartHttpOptions;
|
|
33
54
|
}
|
|
34
55
|
|
|
@@ -45,10 +66,18 @@ export interface IRustGitManagerSmartHttpConfig {
|
|
|
45
66
|
processTimeoutMs: number;
|
|
46
67
|
idleTimeoutSeconds: number;
|
|
47
68
|
gracefulShutdownMs: number;
|
|
69
|
+
receivePack?: IRustGitManagerSmartHttpReceivePackConfig;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface IRustGitManagerSmartHttpReceivePackConfig {
|
|
73
|
+
trustedIngressToken: string;
|
|
74
|
+
maxRequestBodyBytes: number;
|
|
48
75
|
}
|
|
49
76
|
|
|
50
77
|
export interface IRustGitManagerConfig {
|
|
51
78
|
dataDir: string;
|
|
79
|
+
transferDir: string;
|
|
80
|
+
maxBundleBytes: number;
|
|
52
81
|
smartHttp?: IRustGitManagerSmartHttpConfig;
|
|
53
82
|
}
|
|
54
83
|
|
|
@@ -13,8 +13,10 @@ import type {
|
|
|
13
13
|
IGitManagerReadFileRequest,
|
|
14
14
|
IGitManagerRef,
|
|
15
15
|
IGitManagerRefRequest,
|
|
16
|
-
|
|
16
|
+
IGitManagerRepositoryBundle,
|
|
17
17
|
IGitManagerRepositoryInfo,
|
|
18
|
+
IGitManagerRepositorySelector,
|
|
19
|
+
IGitManagerRestoreBundleRequest,
|
|
18
20
|
IGitManagerSmartHttpRepositoryAccess,
|
|
19
21
|
IGitManagerSmartHttpRepositoryVisibility,
|
|
20
22
|
IGitManagerStatus,
|
|
@@ -35,6 +37,8 @@ type TGitManagerCommands = {
|
|
|
35
37
|
importMirror: { params: IGitManagerImportMirrorRequest; result: IGitManagerRepositoryInfo };
|
|
36
38
|
refreshMirror: { params: IGitManagerRepositorySelector; result: IGitManagerRepositoryInfo };
|
|
37
39
|
verifyRepository: { params: IGitManagerRepositorySelector; result: IGitManagerRepositoryInfo };
|
|
40
|
+
createRepositoryBundle: { params: IGitManagerRepositorySelector; result: IGitManagerRepositoryBundle };
|
|
41
|
+
restoreRepositoryBundle: { params: IGitManagerRestoreBundleRequest; result: IGitManagerRepositoryInfo };
|
|
38
42
|
listRepositories: { params: Record<string, never>; result: IGitManagerRepositoryInfo[] };
|
|
39
43
|
listRefs: { params: IGitManagerRefRequest; result: IGitManagerRef[] };
|
|
40
44
|
listTree: { params: IGitManagerTreeRequest; result: IGitManagerTreeEntry[] };
|
|
@@ -146,6 +150,18 @@ export class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
146
150
|
return this.bridge.sendCommand('verifyRepository', requestArg);
|
|
147
151
|
}
|
|
148
152
|
|
|
153
|
+
public async createRepositoryBundle(
|
|
154
|
+
requestArg: IGitManagerRepositorySelector,
|
|
155
|
+
): Promise<IGitManagerRepositoryBundle> {
|
|
156
|
+
return this.bridge.sendCommand('createRepositoryBundle', requestArg);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
public async restoreRepositoryBundle(
|
|
160
|
+
requestArg: IGitManagerRestoreBundleRequest,
|
|
161
|
+
): Promise<IGitManagerRepositoryInfo> {
|
|
162
|
+
return this.bridge.sendCommand('restoreRepositoryBundle', requestArg);
|
|
163
|
+
}
|
|
164
|
+
|
|
149
165
|
public async listRepositories(): Promise<IGitManagerRepositoryInfo[]> {
|
|
150
166
|
return this.bridge.sendCommand('listRepositories', {});
|
|
151
167
|
}
|