@foss.global/gitmanager 1.0.0 → 1.2.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 +19 -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 +6 -1
- package/dist_ts/classes.gitmanager.js +30 -1
- package/dist_ts/classes.repositoryservice.d.ts +15 -0
- package/dist_ts/classes.repositoryservice.js +167 -0
- package/dist_ts/index.d.ts +1 -0
- package/dist_ts/index.js +2 -1
- package/dist_ts/models.d.ts +29 -0
- package/dist_ts/plugins.d.ts +3 -1
- package/dist_ts/plugins.js +4 -2
- 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 +25 -3
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.gitmanager.ts +43 -0
- package/ts/classes.repositoryservice.ts +213 -0
- package/ts/index.ts +1 -0
- package/ts/models.ts +41 -0
- package/ts/plugins.ts +3 -1
- package/ts/rust-gitmanager-bridge.ts +18 -0
package/changelog.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-07-20 - 1.2.0
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- add bounded raw Git services for authenticated SSH ingress (repository-service)
|
|
8
|
+
- Prepare canonical repository paths and immutable protected-ref policy snapshots in Rust.
|
|
9
|
+
- Stream upload-pack and receive-pack through size-limited Node streams without sending pack data through JSON IPC.
|
|
10
|
+
- Isolate Git subprocess configuration, process groups, deadlines, stderr, and shutdown cleanup.
|
|
11
|
+
- Cover raw Git protocol v2 advertisement and protected receive-pack preparation in the transport integration test.
|
|
12
|
+
|
|
13
|
+
## 2026-07-20 - 1.1.0
|
|
14
|
+
|
|
15
|
+
### Features
|
|
16
|
+
|
|
17
|
+
- add exact-commit repository source archives (repository-archives)
|
|
18
|
+
- Generate deterministic gzip archives only from canonical full commit object IDs.
|
|
19
|
+
- Enforce configurable output limits, SHA-256 content identity, private transfer permissions, atomic finalization, and partial-file cleanup.
|
|
20
|
+
- Expose the archive operation through the TypeScript facade and Rust IPC bridge with integration coverage.
|
|
21
|
+
|
|
3
22
|
## 2026-07-20 - 1.0.0
|
|
4
23
|
|
|
5
24
|
### Breaking Changes
|
|
Binary file
|
|
Binary file
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@foss.global/gitmanager',
|
|
6
|
-
version: '1.
|
|
6
|
+
version: '1.2.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,11 +1,13 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
|
-
import type { IGitManagerCommitDetail, IGitManagerCommitRequest, IGitManagerCommitSummary, IGitManagerDiff, IGitManagerDiffRequest, IGitManagerFileContent, IGitManagerImportMirrorRequest, IGitManagerInitBareRepositoryRequest, IGitManagerListCommitsRequest, IGitManagerListTagsRequest, IGitManagerReadFileRequest, IGitManagerRef, IGitManagerRefRequest, IGitManagerProtectedRefsApplyResult, IGitManagerSmartHttpRepositoryProtectedRefs, IGitManagerRepositoryBundle, IGitManagerRepositoryInfo, IGitManagerRepositorySelector, IGitManagerRestoreBundleRequest, IGitManagerSmartHttpRepositoryAccess, IGitManagerSmartHttpRepositoryVisibility, IGitManagerStatus, IGitManagerTag, IGitManagerTagRequest, IGitManagerTreeEntry, IGitManagerTreeRequest, IGitManagerOptions } from './models.js';
|
|
2
|
+
import type { IGitManagerCommitDetail, IGitManagerCommitRequest, IGitManagerCommitSummary, IGitManagerDiff, IGitManagerDiffRequest, IGitManagerFileContent, IGitManagerImportMirrorRequest, IGitManagerInitBareRepositoryRequest, IGitManagerListCommitsRequest, IGitManagerListTagsRequest, IGitManagerReadFileRequest, IGitManagerRef, IGitManagerRefRequest, IGitManagerProtectedRefsApplyResult, IGitManagerSmartHttpRepositoryProtectedRefs, IGitManagerRepositoryBundle, IGitManagerRepositoryArchive, IGitManagerRepositoryArchiveRequest, IGitManagerRepositoryServiceRequest, IGitManagerRepositoryInfo, IGitManagerRepositorySelector, IGitManagerRestoreBundleRequest, IGitManagerSmartHttpRepositoryAccess, IGitManagerSmartHttpRepositoryVisibility, IGitManagerStatus, IGitManagerTag, IGitManagerTagRequest, IGitManagerTreeEntry, IGitManagerTreeRequest, IGitManagerOptions } from './models.js';
|
|
3
|
+
import { GitManagerRepositoryService } from './classes.repositoryservice.js';
|
|
3
4
|
export declare class GitManager extends plugins.EventEmitter {
|
|
4
5
|
private bridge;
|
|
5
6
|
private started;
|
|
6
7
|
private startPromise;
|
|
7
8
|
private stopRequested;
|
|
8
9
|
private config;
|
|
10
|
+
private readonly repositoryServices;
|
|
9
11
|
constructor(optionsArg?: IGitManagerOptions);
|
|
10
12
|
start(): Promise<void>;
|
|
11
13
|
stop(): Promise<void>;
|
|
@@ -19,6 +21,8 @@ export declare class GitManager extends plugins.EventEmitter {
|
|
|
19
21
|
refreshMirror(requestArg: IGitManagerRepositorySelector): Promise<IGitManagerRepositoryInfo>;
|
|
20
22
|
verifyRepository(requestArg: IGitManagerRepositorySelector): Promise<IGitManagerRepositoryInfo>;
|
|
21
23
|
createRepositoryBundle(requestArg: IGitManagerRepositorySelector): Promise<IGitManagerRepositoryBundle>;
|
|
24
|
+
createRepositoryArchive(requestArg: IGitManagerRepositoryArchiveRequest): Promise<IGitManagerRepositoryArchive>;
|
|
25
|
+
openRepositoryService(requestArg: IGitManagerRepositoryServiceRequest): Promise<GitManagerRepositoryService>;
|
|
22
26
|
restoreRepositoryBundle(requestArg: IGitManagerRestoreBundleRequest): Promise<IGitManagerRepositoryInfo>;
|
|
23
27
|
listRepositories(): Promise<IGitManagerRepositoryInfo[]>;
|
|
24
28
|
listRefs(requestArg: IGitManagerRefRequest): Promise<IGitManagerRef[]>;
|
|
@@ -31,4 +35,5 @@ export declare class GitManager extends plugins.EventEmitter {
|
|
|
31
35
|
getTag(requestArg: IGitManagerTagRequest): Promise<IGitManagerTag>;
|
|
32
36
|
private startInternal;
|
|
33
37
|
private assertRunning;
|
|
38
|
+
private closeRepositoryServices;
|
|
34
39
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
2
|
import { RustGitManagerBridge } from './rust-gitmanager-bridge.js';
|
|
3
|
+
import { GitManagerRepositoryService } from './classes.repositoryservice.js';
|
|
3
4
|
export class GitManager extends plugins.EventEmitter {
|
|
4
5
|
constructor(optionsArg = {}) {
|
|
5
6
|
super();
|
|
@@ -7,6 +8,7 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
7
8
|
this.started = false;
|
|
8
9
|
this.startPromise = null;
|
|
9
10
|
this.stopRequested = false;
|
|
11
|
+
this.repositoryServices = new Set();
|
|
10
12
|
const dataDir = optionsArg.dataDir
|
|
11
13
|
?? plugins.path.resolve(process.cwd(), '.nogit', 'gitmanager');
|
|
12
14
|
const smartHttpOptions = optionsArg.smartHttp;
|
|
@@ -14,6 +16,7 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
14
16
|
dataDir,
|
|
15
17
|
transferDir: optionsArg.transferDir ?? plugins.path.join(dataDir, 'transfers'),
|
|
16
18
|
maxBundleBytes: optionsArg.maxBundleBytes ?? 8 * 1024 * 1024 * 1024,
|
|
19
|
+
maxArchiveBytes: optionsArg.maxArchiveBytes ?? 128 * 1024 * 1024,
|
|
17
20
|
smartHttp: smartHttpOptions && smartHttpOptions.enabled !== false
|
|
18
21
|
? {
|
|
19
22
|
bindAddress: smartHttpOptions.bindAddress ?? '127.0.0.1',
|
|
@@ -78,10 +81,12 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
78
81
|
await this.startPromise.catch(() => undefined);
|
|
79
82
|
}
|
|
80
83
|
if (!this.bridge.running) {
|
|
84
|
+
await this.closeRepositoryServices();
|
|
81
85
|
this.started = false;
|
|
82
86
|
return;
|
|
83
87
|
}
|
|
84
88
|
try {
|
|
89
|
+
await this.closeRepositoryServices();
|
|
85
90
|
await this.bridge.stopGitManager();
|
|
86
91
|
}
|
|
87
92
|
finally {
|
|
@@ -155,6 +160,25 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
155
160
|
this.assertRunning();
|
|
156
161
|
return this.bridge.createRepositoryBundle(requestArg);
|
|
157
162
|
}
|
|
163
|
+
async createRepositoryArchive(requestArg) {
|
|
164
|
+
this.assertRunning();
|
|
165
|
+
return this.bridge.createRepositoryArchive(requestArg);
|
|
166
|
+
}
|
|
167
|
+
async openRepositoryService(requestArg) {
|
|
168
|
+
this.assertRunning();
|
|
169
|
+
const descriptor = await this.bridge.prepareRepositoryService({
|
|
170
|
+
org: requestArg.org,
|
|
171
|
+
repo: requestArg.repo,
|
|
172
|
+
service: requestArg.service,
|
|
173
|
+
...(requestArg.protocol ? { protocol: requestArg.protocol } : {}),
|
|
174
|
+
});
|
|
175
|
+
const service = new GitManagerRepositoryService(descriptor, requestArg, this.config.dataDir);
|
|
176
|
+
this.repositoryServices.add(service);
|
|
177
|
+
service.completed.finally(() => {
|
|
178
|
+
this.repositoryServices.delete(service);
|
|
179
|
+
}).catch(() => undefined);
|
|
180
|
+
return service;
|
|
181
|
+
}
|
|
158
182
|
async restoreRepositoryBundle(requestArg) {
|
|
159
183
|
this.assertRunning();
|
|
160
184
|
return this.bridge.restoreRepositoryBundle(requestArg);
|
|
@@ -229,5 +253,10 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
229
253
|
throw new Error('GitManager is not running');
|
|
230
254
|
}
|
|
231
255
|
}
|
|
256
|
+
async closeRepositoryServices() {
|
|
257
|
+
const services = [...this.repositoryServices];
|
|
258
|
+
this.repositoryServices.clear();
|
|
259
|
+
await Promise.all(services.map((service) => service.close()));
|
|
260
|
+
}
|
|
232
261
|
}
|
|
233
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5naXRtYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5naXRtYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBK0J4QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVuRSxNQUFNLE9BQU8sVUFBVyxTQUFRLE9BQU8sQ0FBQyxZQUFZO0lBT2xELFlBQVksYUFBaUMsRUFBRTtRQUM3QyxLQUFLLEVBQUUsQ0FBQztRQVBGLFdBQU0sR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDcEMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixpQkFBWSxHQUF5QixJQUFJLENBQUM7UUFDMUMsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFLNUIsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU87ZUFDN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNqRSxNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUM7UUFDOUMsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLE9BQU87WUFDUCxXQUFXLEVBQUUsVUFBVSxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDO1lBQzlFLGNBQWMsRUFBRSxVQUFVLENBQUMsY0FBYyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUk7WUFDbkUsU0FBUyxFQUFFLGdCQUFnQixJQUFJLGdCQUFnQixDQUFDLE9BQU8sS0FBSyxLQUFLO2dCQUMvRCxDQUFDLENBQUM7b0JBQ0UsV0FBVyxFQUFFLGdCQUFnQixDQUFDLFdBQVcsSUFBSSxXQUFXO29CQUN4RCxJQUFJLEVBQUUsZ0JB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
|
|
262
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5naXRtYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5naXRtYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBa0N4QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUU3RSxNQUFNLE9BQU8sVUFBVyxTQUFRLE9BQU8sQ0FBQyxZQUFZO0lBUWxELFlBQVksYUFBaUMsRUFBRTtRQUM3QyxLQUFLLEVBQUUsQ0FBQztRQVJGLFdBQU0sR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDcEMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixpQkFBWSxHQUF5QixJQUFJLENBQUM7UUFDMUMsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFFYix1QkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztRQUkzRSxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTztlQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUM5QyxJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ1osT0FBTztZQUNQLFdBQVcsRUFBRSxVQUFVLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUM7WUFDOUUsY0FBYyxFQUFFLFVBQVUsQ0FBQyxjQUFjLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtZQUNuRSxlQUFlLEVBQUUsVUFBVSxDQUFDLGVBQWUsSUFBSSxHQUFHLEdBQUcsSUFBSSxH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
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import type { IGitManagerRepositoryServiceRequest, IGitManagerRepositoryServiceResult, IRustGitManagerRepositoryServiceDescriptor } from './models.js';
|
|
3
|
+
export declare class GitManagerRepositoryService {
|
|
4
|
+
readonly stdin: plugins.stream.Writable;
|
|
5
|
+
readonly stdout: plugins.stream.Readable;
|
|
6
|
+
readonly stderr: plugins.stream.Readable;
|
|
7
|
+
readonly completed: Promise<IGitManagerRepositoryServiceResult>;
|
|
8
|
+
private readonly child;
|
|
9
|
+
private completionSettled;
|
|
10
|
+
private timeout?;
|
|
11
|
+
constructor(descriptorArg: IRustGitManagerRepositoryServiceDescriptor, requestArg: IGitManagerRepositoryServiceRequest, homeDirectoryArg: string);
|
|
12
|
+
terminate(): void;
|
|
13
|
+
close(): Promise<void>;
|
|
14
|
+
private clearTimeout;
|
|
15
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
class ByteLimitTransform extends plugins.stream.Transform {
|
|
3
|
+
constructor(maximumBytes, label, onLimit) {
|
|
4
|
+
super();
|
|
5
|
+
this.maximumBytes = maximumBytes;
|
|
6
|
+
this.label = label;
|
|
7
|
+
this.onLimit = onLimit;
|
|
8
|
+
this.bytes = 0;
|
|
9
|
+
}
|
|
10
|
+
_transform(chunkArg, encodingArg, callbackArg) {
|
|
11
|
+
const chunk = Buffer.isBuffer(chunkArg)
|
|
12
|
+
? chunkArg
|
|
13
|
+
: typeof chunkArg === 'string'
|
|
14
|
+
? Buffer.from(chunkArg, encodingArg)
|
|
15
|
+
: Buffer.from(chunkArg);
|
|
16
|
+
this.bytes += chunk.byteLength;
|
|
17
|
+
if (!Number.isSafeInteger(this.bytes) || this.bytes > this.maximumBytes) {
|
|
18
|
+
const error = new Error(this.label + ' exceeded the configured size limit');
|
|
19
|
+
this.onLimit(error);
|
|
20
|
+
callbackArg(error);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
callbackArg(null, chunk);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const validateDescriptor = (descriptorArg, requestArg) => {
|
|
27
|
+
if (descriptorArg.org !== requestArg.org
|
|
28
|
+
|| descriptorArg.repo !== requestArg.repo
|
|
29
|
+
|| descriptorArg.service !== requestArg.service
|
|
30
|
+
|| descriptorArg.protocol !== requestArg.protocol
|
|
31
|
+
|| !plugins.path.isAbsolute(descriptorArg.repositoryPath)
|
|
32
|
+
|| !Number.isSafeInteger(descriptorArg.maxRequestBytes)
|
|
33
|
+
|| descriptorArg.maxRequestBytes < 1024
|
|
34
|
+
|| !Number.isSafeInteger(descriptorArg.maxResponseBytes)
|
|
35
|
+
|| descriptorArg.maxResponseBytes < 1024 * 1024
|
|
36
|
+
|| !Number.isSafeInteger(descriptorArg.processTimeoutMs)
|
|
37
|
+
|| descriptorArg.processTimeoutMs < 1000
|
|
38
|
+
|| !Number.isSafeInteger(descriptorArg.idleTimeoutSeconds)
|
|
39
|
+
|| descriptorArg.idleTimeoutSeconds < 1) {
|
|
40
|
+
throw new Error('GitManager returned an invalid repository service descriptor');
|
|
41
|
+
}
|
|
42
|
+
if (descriptorArg.service === 'receive-pack') {
|
|
43
|
+
if (!descriptorArg.hookPath
|
|
44
|
+
|| !plugins.path.isAbsolute(descriptorArg.hookPath)
|
|
45
|
+
|| !descriptorArg.protectedRefsPolicy
|
|
46
|
+
|| !/^[A-Za-z0-9_-]{1,65536}$/.test(descriptorArg.protectedRefsPolicy)) {
|
|
47
|
+
throw new Error('GitManager returned an invalid receive-pack descriptor');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else if (descriptorArg.hookPath !== undefined
|
|
51
|
+
|| descriptorArg.protectedRefsPolicy !== undefined) {
|
|
52
|
+
throw new Error('GitManager returned unexpected upload-pack hook state');
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
export class GitManagerRepositoryService {
|
|
56
|
+
constructor(descriptorArg, requestArg, homeDirectoryArg) {
|
|
57
|
+
this.completionSettled = false;
|
|
58
|
+
validateDescriptor(descriptorArg, requestArg);
|
|
59
|
+
const args = descriptorArg.service === 'upload-pack'
|
|
60
|
+
? [
|
|
61
|
+
'upload-pack',
|
|
62
|
+
'--strict',
|
|
63
|
+
'--timeout',
|
|
64
|
+
String(descriptorArg.idleTimeoutSeconds),
|
|
65
|
+
descriptorArg.repositoryPath,
|
|
66
|
+
]
|
|
67
|
+
: [
|
|
68
|
+
'-c',
|
|
69
|
+
'core.hooksPath=' + descriptorArg.hookPath,
|
|
70
|
+
'-c',
|
|
71
|
+
'receive.fsckObjects=true',
|
|
72
|
+
'receive-pack',
|
|
73
|
+
descriptorArg.repositoryPath,
|
|
74
|
+
];
|
|
75
|
+
const environment = {
|
|
76
|
+
HOME: homeDirectoryArg,
|
|
77
|
+
LANG: 'C',
|
|
78
|
+
LC_ALL: 'C',
|
|
79
|
+
PATH: process.env.PATH ?? '/usr/local/bin:/usr/bin:/bin',
|
|
80
|
+
GIT_ASKPASS: 'true',
|
|
81
|
+
GIT_CONFIG_GLOBAL: '/dev/null',
|
|
82
|
+
GIT_CONFIG_NOSYSTEM: '1',
|
|
83
|
+
GIT_NO_LAZY_FETCH: '1',
|
|
84
|
+
GIT_TERMINAL_PROMPT: '0',
|
|
85
|
+
GCM_INTERACTIVE: 'Never',
|
|
86
|
+
SSH_ASKPASS: 'true',
|
|
87
|
+
...(descriptorArg.protocol
|
|
88
|
+
? { GIT_PROTOCOL: descriptorArg.protocol }
|
|
89
|
+
: {}),
|
|
90
|
+
...(descriptorArg.protectedRefsPolicy
|
|
91
|
+
? {
|
|
92
|
+
GITMANAGER_PROTECTED_REFS_POLICY: descriptorArg.protectedRefsPolicy,
|
|
93
|
+
}
|
|
94
|
+
: {}),
|
|
95
|
+
};
|
|
96
|
+
this.child = plugins.childProcess.spawn('git', args, {
|
|
97
|
+
detached: process.platform !== 'win32',
|
|
98
|
+
env: environment,
|
|
99
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
100
|
+
windowsHide: true,
|
|
101
|
+
});
|
|
102
|
+
const fail = (errorArg) => {
|
|
103
|
+
this.terminate();
|
|
104
|
+
return errorArg;
|
|
105
|
+
};
|
|
106
|
+
const input = new ByteLimitTransform(descriptorArg.maxRequestBytes, 'Git repository service request', fail);
|
|
107
|
+
const output = new ByteLimitTransform(descriptorArg.maxResponseBytes, 'Git repository service response', fail);
|
|
108
|
+
const stderr = new ByteLimitTransform(128 * 1024, 'Git repository service stderr', fail);
|
|
109
|
+
input.pipe(this.child.stdin);
|
|
110
|
+
this.child.stdout.pipe(output);
|
|
111
|
+
this.child.stderr.pipe(stderr);
|
|
112
|
+
this.stdin = input;
|
|
113
|
+
this.stdout = output;
|
|
114
|
+
this.stderr = stderr;
|
|
115
|
+
this.completed = new Promise((resolve, reject) => {
|
|
116
|
+
this.child.once('error', (error) => {
|
|
117
|
+
if (this.completionSettled)
|
|
118
|
+
return;
|
|
119
|
+
this.completionSettled = true;
|
|
120
|
+
this.clearTimeout();
|
|
121
|
+
reject(error);
|
|
122
|
+
});
|
|
123
|
+
this.child.once('close', (exitCode, signal) => {
|
|
124
|
+
if (this.completionSettled)
|
|
125
|
+
return;
|
|
126
|
+
this.completionSettled = true;
|
|
127
|
+
this.clearTimeout();
|
|
128
|
+
resolve({
|
|
129
|
+
exitCode,
|
|
130
|
+
signal: signal,
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
this.timeout = setTimeout(() => {
|
|
135
|
+
this.terminate();
|
|
136
|
+
}, descriptorArg.processTimeoutMs);
|
|
137
|
+
this.timeout.unref();
|
|
138
|
+
}
|
|
139
|
+
terminate() {
|
|
140
|
+
if (this.completionSettled || this.child.killed) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const pid = this.child.pid;
|
|
144
|
+
if (pid && process.platform !== 'win32') {
|
|
145
|
+
try {
|
|
146
|
+
process.kill(-pid, 'SIGKILL');
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// Fall through to the direct child kill.
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
this.child.kill('SIGKILL');
|
|
154
|
+
}
|
|
155
|
+
async close() {
|
|
156
|
+
this.stdin.destroy();
|
|
157
|
+
this.terminate();
|
|
158
|
+
await this.completed.catch(() => undefined);
|
|
159
|
+
}
|
|
160
|
+
clearTimeout() {
|
|
161
|
+
if (this.timeout) {
|
|
162
|
+
clearTimeout(this.timeout);
|
|
163
|
+
this.timeout = undefined;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yZXBvc2l0b3J5c2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMucmVwb3NpdG9yeXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFPeEMsTUFBTSxrQkFBbUIsU0FBUSxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVM7SUFHdkQsWUFDbUIsWUFBb0IsRUFDcEIsS0FBYSxFQUNiLE9BQWtDO1FBRW5ELEtBQUssRUFBRSxDQUFDO1FBSlMsaUJBQVksR0FBWixZQUFZLENBQVE7UUFDcEIsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUNiLFlBQU8sR0FBUCxPQUFPLENBQTJCO1FBTDdDLFVBQUssR0FBRyxDQUFDLENBQUM7SUFRbEIsQ0FBQztJQUVRLFVBQVUsQ0FDakIsUUFBc0MsRUFDdEMsV0FBMkIsRUFDM0IsV0FBNkM7UUFFN0MsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDckMsQ0FBQyxDQUFDLFFBQVE7WUFDVixDQUFDLENBQUMsT0FBTyxRQUFRLEtBQUssUUFBUTtnQkFDNUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQztnQkFDcEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4RSxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLHFDQUFxQyxDQUFDLENBQUM7WUFDNUUsSUFBSSxDQUFD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
|
package/dist_ts/index.d.ts
CHANGED
package/dist_ts/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export * from './models.js';
|
|
2
2
|
export * from './rust-gitmanager-bridge.js';
|
|
3
3
|
export * from './classes.gitmanager.js';
|
|
4
|
-
|
|
4
|
+
export * from './classes.repositoryservice.js';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxnQ0FBZ0MsQ0FBQyJ9
|
package/dist_ts/models.d.ts
CHANGED
|
@@ -53,6 +53,33 @@ export interface IGitManagerRepositoryBundle extends IGitManagerRepositorySelect
|
|
|
53
53
|
bundlePath: string;
|
|
54
54
|
sizeBytes: number;
|
|
55
55
|
}
|
|
56
|
+
export interface IGitManagerRepositoryArchiveRequest extends IGitManagerRepositorySelector {
|
|
57
|
+
objectId: string;
|
|
58
|
+
}
|
|
59
|
+
export interface IGitManagerRepositoryArchive extends IGitManagerRepositorySelector {
|
|
60
|
+
objectId: string;
|
|
61
|
+
archivePath: string;
|
|
62
|
+
sizeBytes: number;
|
|
63
|
+
sha256: string;
|
|
64
|
+
}
|
|
65
|
+
export type TGitManagerRepositoryService = 'upload-pack' | 'receive-pack';
|
|
66
|
+
export interface IGitManagerRepositoryServiceRequest extends IGitManagerRepositorySelector {
|
|
67
|
+
service: TGitManagerRepositoryService;
|
|
68
|
+
protocol?: 'version=0' | 'version=1' | 'version=2';
|
|
69
|
+
}
|
|
70
|
+
export interface IRustGitManagerRepositoryServiceDescriptor extends IGitManagerRepositoryServiceRequest {
|
|
71
|
+
repositoryPath: string;
|
|
72
|
+
hookPath?: string;
|
|
73
|
+
protectedRefsPolicy?: string;
|
|
74
|
+
maxRequestBytes: number;
|
|
75
|
+
maxResponseBytes: number;
|
|
76
|
+
processTimeoutMs: number;
|
|
77
|
+
idleTimeoutSeconds: number;
|
|
78
|
+
}
|
|
79
|
+
export interface IGitManagerRepositoryServiceResult {
|
|
80
|
+
exitCode: number | null;
|
|
81
|
+
signal: NodeJS.Signals | null;
|
|
82
|
+
}
|
|
56
83
|
export interface IGitManagerRestoreBundleRequest extends IGitManagerRepositorySelector {
|
|
57
84
|
bundlePath: string;
|
|
58
85
|
defaultBranch?: string;
|
|
@@ -61,6 +88,7 @@ export interface IGitManagerOptions {
|
|
|
61
88
|
dataDir?: string;
|
|
62
89
|
transferDir?: string;
|
|
63
90
|
maxBundleBytes?: number;
|
|
91
|
+
maxArchiveBytes?: number;
|
|
64
92
|
smartHttp?: IGitManagerSmartHttpOptions;
|
|
65
93
|
}
|
|
66
94
|
export interface IRustGitManagerSmartHttpConfig {
|
|
@@ -90,6 +118,7 @@ export interface IRustGitManagerConfig {
|
|
|
90
118
|
dataDir: string;
|
|
91
119
|
transferDir: string;
|
|
92
120
|
maxBundleBytes: number;
|
|
121
|
+
maxArchiveBytes: number;
|
|
93
122
|
smartHttp?: IRustGitManagerSmartHttpConfig;
|
|
94
123
|
}
|
|
95
124
|
export interface IGitManagerSmartHttpStatus {
|
package/dist_ts/plugins.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import * as childProcess from 'node:child_process';
|
|
1
2
|
import { EventEmitter } from 'node:events';
|
|
2
3
|
import * as path from 'node:path';
|
|
4
|
+
import * as stream from 'node:stream';
|
|
3
5
|
import * as url from 'node:url';
|
|
4
|
-
export { EventEmitter, path, url };
|
|
6
|
+
export { childProcess, EventEmitter, path, stream, url };
|
|
5
7
|
import * as smartrust from '@push.rocks/smartrust';
|
|
6
8
|
export { smartrust };
|
package/dist_ts/plugins.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
// node native scope
|
|
2
|
+
import * as childProcess from 'node:child_process';
|
|
2
3
|
import { EventEmitter } from 'node:events';
|
|
3
4
|
import * as path from 'node:path';
|
|
5
|
+
import * as stream from 'node:stream';
|
|
4
6
|
import * as url from 'node:url';
|
|
5
|
-
export { EventEmitter, path, url };
|
|
7
|
+
export { childProcess, EventEmitter, path, stream, url };
|
|
6
8
|
// @push.rocks scope
|
|
7
9
|
import * as smartrust from '@push.rocks/smartrust';
|
|
8
10
|
export { smartrust };
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxZQUFZLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEtBQUssTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEtBQUssR0FBRyxNQUFNLFVBQVUsQ0FBQztBQUVoQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRXpELG9CQUFvQjtBQUNwQixPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBRW5ELE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyJ9
|
|
@@ -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, IGitManagerProtectedRefsApplyResult, IGitManagerSmartHttpRepositoryProtectedRefs, IGitManagerRepositoryBundle, IGitManagerRepositoryInfo, IGitManagerRepositorySelector, IGitManagerRestoreBundleRequest, IGitManagerSmartHttpRepositoryAccess, IGitManagerSmartHttpRepositoryVisibility, IGitManagerStatus, IGitManagerTag, IGitManagerTagRequest, IGitManagerTreeEntry, IGitManagerTreeRequest, IRustGitManagerConfig } from './models.js';
|
|
2
|
+
import type { IGitManagerCommitDetail, IGitManagerCommitRequest, IGitManagerCommitSummary, IGitManagerDiff, IGitManagerDiffRequest, IGitManagerFileContent, IGitManagerImportMirrorRequest, IGitManagerInitBareRepositoryRequest, IGitManagerListCommitsRequest, IGitManagerListTagsRequest, IGitManagerReadFileRequest, IGitManagerRef, IGitManagerRefRequest, IGitManagerProtectedRefsApplyResult, IGitManagerSmartHttpRepositoryProtectedRefs, IGitManagerRepositoryBundle, IGitManagerRepositoryArchive, IGitManagerRepositoryArchiveRequest, IGitManagerRepositoryServiceRequest, IGitManagerRepositoryInfo, IGitManagerRepositorySelector, IGitManagerRestoreBundleRequest, IGitManagerSmartHttpRepositoryAccess, IGitManagerSmartHttpRepositoryVisibility, IGitManagerStatus, IGitManagerTag, IGitManagerTagRequest, IGitManagerTreeEntry, IGitManagerTreeRequest, IRustGitManagerConfig, IRustGitManagerRepositoryServiceDescriptor } from './models.js';
|
|
3
3
|
export declare class RustGitManagerBridge extends plugins.EventEmitter {
|
|
4
4
|
private bridge;
|
|
5
5
|
constructor();
|
|
@@ -17,6 +17,8 @@ export declare class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
17
17
|
refreshMirror(requestArg: IGitManagerRepositorySelector): Promise<IGitManagerRepositoryInfo>;
|
|
18
18
|
verifyRepository(requestArg: IGitManagerRepositorySelector): Promise<IGitManagerRepositoryInfo>;
|
|
19
19
|
createRepositoryBundle(requestArg: IGitManagerRepositorySelector): Promise<IGitManagerRepositoryBundle>;
|
|
20
|
+
createRepositoryArchive(requestArg: IGitManagerRepositoryArchiveRequest): Promise<IGitManagerRepositoryArchive>;
|
|
21
|
+
prepareRepositoryService(requestArg: IGitManagerRepositoryServiceRequest): Promise<IRustGitManagerRepositoryServiceDescriptor>;
|
|
20
22
|
restoreRepositoryBundle(requestArg: IGitManagerRestoreBundleRequest): Promise<IGitManagerRepositoryInfo>;
|
|
21
23
|
listRepositories(): Promise<IGitManagerRepositoryInfo[]>;
|
|
22
24
|
listRefs(requestArg: IGitManagerRefRequest): Promise<IGitManagerRef[]>;
|
|
@@ -82,6 +82,12 @@ export class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
82
82
|
async createRepositoryBundle(requestArg) {
|
|
83
83
|
return this.bridge.sendCommand('createRepositoryBundle', requestArg);
|
|
84
84
|
}
|
|
85
|
+
async createRepositoryArchive(requestArg) {
|
|
86
|
+
return this.bridge.sendCommand('createRepositoryArchive', requestArg);
|
|
87
|
+
}
|
|
88
|
+
async prepareRepositoryService(requestArg) {
|
|
89
|
+
return this.bridge.sendCommand('prepareRepositoryService', requestArg);
|
|
90
|
+
}
|
|
85
91
|
async restoreRepositoryBundle(requestArg) {
|
|
86
92
|
return this.bridge.sendCommand('restoreRepositoryBundle', requestArg);
|
|
87
93
|
}
|
|
@@ -113,4 +119,4 @@ export class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
113
119
|
return this.bridge.sendCommand('getTag', requestArg);
|
|
114
120
|
}
|
|
115
121
|
}
|
|
116
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
122
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVzdC1naXRtYW5hZ2VyLWJyaWRnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3J1c3QtZ2l0bWFuYWdlci1icmlkZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUE2RHhDLFNBQVMsY0FBYztJQUNyQixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakYsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVELFNBQVMsdUJBQXVCO0lBQzlCLE1BQU0sT0FBTyxHQUEyQixFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3pFLE1BQU0sS0FBSyxHQUEyQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDN0MsQ0FBQztBQUVELFNBQVMsZUFBZTtJQUN0QixNQUFNLFdBQVcsR0FBRyxjQUFjLEVBQUUsQ0FBQztJQUNyQyxNQUFNLE1BQU0sR0FBRyx1QkFBdUIsRUFBRSxDQUFDO0lBQ3pDLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUUzQixJQUFJLE1BQU0sRUFBRSxD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
|
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, durable repository bundle transfer, public and trusted-ingress private clone/fetch, trusted-ingress receive-pack, and revision-fenced protection for exact branch refs. User identity, permissions, TLS, durable protected-ref policy storage, and durable post-push repository storage remain the embedding service's responsibility.
|
|
7
|
+
The current implementation provides lifecycle IPC, local bare repository and mirror management, bounded read APIs, durable repository bundle transfer, public and trusted-ingress private clone/fetch, trusted-ingress receive-pack, bounded raw Git services for SSH ingress, and revision-fenced protection for exact branch refs. User identity, permissions, SSH/TLS termination, durable protected-ref policy storage, and durable post-push repository storage remain the embedding service's responsibility.
|
|
8
8
|
|
|
9
9
|
## Issue Reporting and Security
|
|
10
10
|
|
|
@@ -189,6 +189,26 @@ Receive-pack uses only GitManager's private, process-specific hook directory; re
|
|
|
189
189
|
|
|
190
190
|
When enabled, `getStatus().smartHttp` reports `{ running, bindAddress, port, baseUrl }`. The server also exposes `GET /healthz` for a local ingress health check.
|
|
191
191
|
|
|
192
|
+
## Raw Git services for SSH ingress
|
|
193
|
+
|
|
194
|
+
`openRepositoryService()` starts a bounded local `git upload-pack` or protected `git receive-pack` process for an already authenticated ingress. Rust validates the repository selector, canonical path, Git protocol version, receive-pack availability, and immutable protected-ref policy snapshot before the TypeScript facade starts the process. Pack bytes use Node streams and never pass through JSON IPC.
|
|
195
|
+
|
|
196
|
+
```ts
|
|
197
|
+
const service = await gitManager.openRepositoryService({
|
|
198
|
+
org: 'foss.global',
|
|
199
|
+
repo: 'gitmanager',
|
|
200
|
+
service: 'upload-pack',
|
|
201
|
+
protocol: 'version=2',
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
sshChannel.pipe(service.stdin);
|
|
205
|
+
service.stdout.pipe(sshChannel);
|
|
206
|
+
service.stderr.pipe(sshChannel.stderr);
|
|
207
|
+
const result = await service.completed;
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
The returned service counts request, response, and stderr bytes, runs with an isolated Git environment, has its own process group and deadline, and is terminated when `GitManager.stop()` runs. Receive-pack uses the same private managed pre-receive hook and exact policy snapshot as Smart HTTP. The caller must authenticate the SSH key, authorize the repository operation, cap sessions, serialize writes with HTTP pushes and policy changes, inspect refs, persist the repository, record downstream events, and withhold the final receive-pack status until all durable work succeeds.
|
|
211
|
+
|
|
192
212
|
## Public API
|
|
193
213
|
|
|
194
214
|
- `GitManager`: TypeScript facade for the Rust engine lifecycle.
|
|
@@ -203,7 +223,9 @@ When enabled, `getStatus().smartHttp` reports `{ running, bindAddress, port, bas
|
|
|
203
223
|
- `GitManager.refreshMirror()`: atomically fetches and verifies the configured mirror source.
|
|
204
224
|
- `GitManager.verifyRepository()`: runs a strict full integrity check.
|
|
205
225
|
- `GitManager.createRepositoryBundle()`: writes a bounded full Git bundle into `transferDir` and returns its temporary path and size.
|
|
226
|
+
- `GitManager.createRepositoryArchive()`: writes a bounded deterministic exact-commit `tar.gz` archive into `transferDir` and returns its digest, size, and temporary path.
|
|
206
227
|
- `GitManager.restoreRepositoryBundle()`: validates and atomically restores a bounded bundle from `transferDir`.
|
|
228
|
+
- `GitManager.openRepositoryService()`: opens a bounded upload-pack or protected receive-pack stream for an authenticated SSH-style ingress.
|
|
207
229
|
- `GitManager.listRepositories()`: lists local repositories managed below the configured data directory.
|
|
208
230
|
- `GitManager.listRefs()`: lists branch and tag refs.
|
|
209
231
|
- `GitManager.listTree()`: lists tree entries at a ref and optional path.
|
|
@@ -219,7 +241,7 @@ When enabled, `getStatus().smartHttp` reports `{ running, bindAddress, port, bas
|
|
|
219
241
|
|
|
220
242
|
Repository/read DTO contracts are re-exported from the published `@foss.global/interfaces` package.
|
|
221
243
|
|
|
222
|
-
Read/list APIs go through JSON IPC. Git packfile streaming
|
|
244
|
+
Read/list APIs and raw-service preparation go through JSON IPC. Git packfile streaming uses controlled `git upload-pack` and `git receive-pack` subprocesses behind bounded HTTP or Node streams; packfiles do not pass through JSON IPC.
|
|
223
245
|
|
|
224
246
|
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, replaces repository-configured hooks with GitManager's verified managed pre-receive hook, enables incoming object fsck, and rejects the complete push when policy evaluation cannot complete safely.
|
|
225
247
|
|
|
@@ -242,7 +264,7 @@ pnpm run test:rust
|
|
|
242
264
|
pnpm run build
|
|
243
265
|
```
|
|
244
266
|
|
|
245
|
-
`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, explicit policy initialization, protected create/delete/non-fast-forward enforcement, inherited self-test hardening, restart replay, and real push tests through `smartrust`.
|
|
267
|
+
`pnpm test` runs the `pretest` hook first, which builds the Rust binaries with `tsrust`, and then runs lifecycle, local mirror/read API, raw upload-pack/receive-pack preparation, clone/fetch denial, trusted receive-pack denial, explicit policy initialization, protected create/delete/non-fast-forward enforcement, inherited self-test hardening, restart replay, and real push tests through `smartrust`.
|
|
246
268
|
|
|
247
269
|
## License and Legal Information
|
|
248
270
|
|
package/ts/00_commitinfo_data.ts
CHANGED
package/ts/classes.gitmanager.ts
CHANGED
|
@@ -16,6 +16,9 @@ import type {
|
|
|
16
16
|
IGitManagerProtectedRefsApplyResult,
|
|
17
17
|
IGitManagerSmartHttpRepositoryProtectedRefs,
|
|
18
18
|
IGitManagerRepositoryBundle,
|
|
19
|
+
IGitManagerRepositoryArchive,
|
|
20
|
+
IGitManagerRepositoryArchiveRequest,
|
|
21
|
+
IGitManagerRepositoryServiceRequest,
|
|
19
22
|
IGitManagerRepositoryInfo,
|
|
20
23
|
IGitManagerRepositorySelector,
|
|
21
24
|
IGitManagerRestoreBundleRequest,
|
|
@@ -30,6 +33,7 @@ import type {
|
|
|
30
33
|
IRustGitManagerConfig,
|
|
31
34
|
} from './models.js';
|
|
32
35
|
import { RustGitManagerBridge } from './rust-gitmanager-bridge.js';
|
|
36
|
+
import { GitManagerRepositoryService } from './classes.repositoryservice.js';
|
|
33
37
|
|
|
34
38
|
export class GitManager extends plugins.EventEmitter {
|
|
35
39
|
private bridge = new RustGitManagerBridge();
|
|
@@ -37,6 +41,7 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
37
41
|
private startPromise: Promise<void> | null = null;
|
|
38
42
|
private stopRequested = false;
|
|
39
43
|
private config: IRustGitManagerConfig;
|
|
44
|
+
private readonly repositoryServices = new Set<GitManagerRepositoryService>();
|
|
40
45
|
|
|
41
46
|
constructor(optionsArg: IGitManagerOptions = {}) {
|
|
42
47
|
super();
|
|
@@ -47,6 +52,7 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
47
52
|
dataDir,
|
|
48
53
|
transferDir: optionsArg.transferDir ?? plugins.path.join(dataDir, 'transfers'),
|
|
49
54
|
maxBundleBytes: optionsArg.maxBundleBytes ?? 8 * 1024 * 1024 * 1024,
|
|
55
|
+
maxArchiveBytes: optionsArg.maxArchiveBytes ?? 128 * 1024 * 1024,
|
|
50
56
|
smartHttp: smartHttpOptions && smartHttpOptions.enabled !== false
|
|
51
57
|
? {
|
|
52
58
|
bindAddress: smartHttpOptions.bindAddress ?? '127.0.0.1',
|
|
@@ -116,10 +122,12 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
116
122
|
await this.startPromise.catch(() => undefined);
|
|
117
123
|
}
|
|
118
124
|
if (!this.bridge.running) {
|
|
125
|
+
await this.closeRepositoryServices();
|
|
119
126
|
this.started = false;
|
|
120
127
|
return;
|
|
121
128
|
}
|
|
122
129
|
try {
|
|
130
|
+
await this.closeRepositoryServices();
|
|
123
131
|
await this.bridge.stopGitManager();
|
|
124
132
|
} finally {
|
|
125
133
|
this.bridge.kill();
|
|
@@ -211,6 +219,35 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
211
219
|
return this.bridge.createRepositoryBundle(requestArg);
|
|
212
220
|
}
|
|
213
221
|
|
|
222
|
+
public async createRepositoryArchive(
|
|
223
|
+
requestArg: IGitManagerRepositoryArchiveRequest,
|
|
224
|
+
): Promise<IGitManagerRepositoryArchive> {
|
|
225
|
+
this.assertRunning();
|
|
226
|
+
return this.bridge.createRepositoryArchive(requestArg);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
public async openRepositoryService(
|
|
230
|
+
requestArg: IGitManagerRepositoryServiceRequest,
|
|
231
|
+
): Promise<GitManagerRepositoryService> {
|
|
232
|
+
this.assertRunning();
|
|
233
|
+
const descriptor = await this.bridge.prepareRepositoryService({
|
|
234
|
+
org: requestArg.org,
|
|
235
|
+
repo: requestArg.repo,
|
|
236
|
+
service: requestArg.service,
|
|
237
|
+
...(requestArg.protocol ? { protocol: requestArg.protocol } : {}),
|
|
238
|
+
});
|
|
239
|
+
const service = new GitManagerRepositoryService(
|
|
240
|
+
descriptor,
|
|
241
|
+
requestArg,
|
|
242
|
+
this.config.dataDir,
|
|
243
|
+
);
|
|
244
|
+
this.repositoryServices.add(service);
|
|
245
|
+
service.completed.finally(() => {
|
|
246
|
+
this.repositoryServices.delete(service);
|
|
247
|
+
}).catch(() => undefined);
|
|
248
|
+
return service;
|
|
249
|
+
}
|
|
250
|
+
|
|
214
251
|
public async restoreRepositoryBundle(
|
|
215
252
|
requestArg: IGitManagerRestoreBundleRequest,
|
|
216
253
|
): Promise<IGitManagerRepositoryInfo> {
|
|
@@ -297,4 +334,10 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
297
334
|
throw new Error('GitManager is not running');
|
|
298
335
|
}
|
|
299
336
|
}
|
|
337
|
+
|
|
338
|
+
private async closeRepositoryServices(): Promise<void> {
|
|
339
|
+
const services = [...this.repositoryServices];
|
|
340
|
+
this.repositoryServices.clear();
|
|
341
|
+
await Promise.all(services.map((service) => service.close()));
|
|
342
|
+
}
|
|
300
343
|
}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import type {
|
|
3
|
+
IGitManagerRepositoryServiceRequest,
|
|
4
|
+
IGitManagerRepositoryServiceResult,
|
|
5
|
+
IRustGitManagerRepositoryServiceDescriptor,
|
|
6
|
+
} from './models.js';
|
|
7
|
+
|
|
8
|
+
class ByteLimitTransform extends plugins.stream.Transform {
|
|
9
|
+
private bytes = 0;
|
|
10
|
+
|
|
11
|
+
constructor(
|
|
12
|
+
private readonly maximumBytes: number,
|
|
13
|
+
private readonly label: string,
|
|
14
|
+
private readonly onLimit: (errorArg: Error) => void,
|
|
15
|
+
) {
|
|
16
|
+
super();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
override _transform(
|
|
20
|
+
chunkArg: Buffer | Uint8Array | string,
|
|
21
|
+
encodingArg: BufferEncoding,
|
|
22
|
+
callbackArg: plugins.stream.TransformCallback,
|
|
23
|
+
): void {
|
|
24
|
+
const chunk = Buffer.isBuffer(chunkArg)
|
|
25
|
+
? chunkArg
|
|
26
|
+
: typeof chunkArg === 'string'
|
|
27
|
+
? Buffer.from(chunkArg, encodingArg)
|
|
28
|
+
: Buffer.from(chunkArg);
|
|
29
|
+
this.bytes += chunk.byteLength;
|
|
30
|
+
if (!Number.isSafeInteger(this.bytes) || this.bytes > this.maximumBytes) {
|
|
31
|
+
const error = new Error(this.label + ' exceeded the configured size limit');
|
|
32
|
+
this.onLimit(error);
|
|
33
|
+
callbackArg(error);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
callbackArg(null, chunk);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const validateDescriptor = (
|
|
41
|
+
descriptorArg: IRustGitManagerRepositoryServiceDescriptor,
|
|
42
|
+
requestArg: IGitManagerRepositoryServiceRequest,
|
|
43
|
+
): void => {
|
|
44
|
+
if (
|
|
45
|
+
descriptorArg.org !== requestArg.org
|
|
46
|
+
|| descriptorArg.repo !== requestArg.repo
|
|
47
|
+
|| descriptorArg.service !== requestArg.service
|
|
48
|
+
|| descriptorArg.protocol !== requestArg.protocol
|
|
49
|
+
|| !plugins.path.isAbsolute(descriptorArg.repositoryPath)
|
|
50
|
+
|| !Number.isSafeInteger(descriptorArg.maxRequestBytes)
|
|
51
|
+
|| descriptorArg.maxRequestBytes < 1024
|
|
52
|
+
|| !Number.isSafeInteger(descriptorArg.maxResponseBytes)
|
|
53
|
+
|| descriptorArg.maxResponseBytes < 1024 * 1024
|
|
54
|
+
|| !Number.isSafeInteger(descriptorArg.processTimeoutMs)
|
|
55
|
+
|| descriptorArg.processTimeoutMs < 1000
|
|
56
|
+
|| !Number.isSafeInteger(descriptorArg.idleTimeoutSeconds)
|
|
57
|
+
|| descriptorArg.idleTimeoutSeconds < 1
|
|
58
|
+
) {
|
|
59
|
+
throw new Error('GitManager returned an invalid repository service descriptor');
|
|
60
|
+
}
|
|
61
|
+
if (descriptorArg.service === 'receive-pack') {
|
|
62
|
+
if (
|
|
63
|
+
!descriptorArg.hookPath
|
|
64
|
+
|| !plugins.path.isAbsolute(descriptorArg.hookPath)
|
|
65
|
+
|| !descriptorArg.protectedRefsPolicy
|
|
66
|
+
|| !/^[A-Za-z0-9_-]{1,65536}$/.test(descriptorArg.protectedRefsPolicy)
|
|
67
|
+
) {
|
|
68
|
+
throw new Error('GitManager returned an invalid receive-pack descriptor');
|
|
69
|
+
}
|
|
70
|
+
} else if (
|
|
71
|
+
descriptorArg.hookPath !== undefined
|
|
72
|
+
|| descriptorArg.protectedRefsPolicy !== undefined
|
|
73
|
+
) {
|
|
74
|
+
throw new Error('GitManager returned unexpected upload-pack hook state');
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export class GitManagerRepositoryService {
|
|
79
|
+
public readonly stdin: plugins.stream.Writable;
|
|
80
|
+
public readonly stdout: plugins.stream.Readable;
|
|
81
|
+
public readonly stderr: plugins.stream.Readable;
|
|
82
|
+
public readonly completed: Promise<IGitManagerRepositoryServiceResult>;
|
|
83
|
+
private readonly child: plugins.childProcess.ChildProcessWithoutNullStreams;
|
|
84
|
+
private completionSettled = false;
|
|
85
|
+
private timeout?: NodeJS.Timeout;
|
|
86
|
+
|
|
87
|
+
constructor(
|
|
88
|
+
descriptorArg: IRustGitManagerRepositoryServiceDescriptor,
|
|
89
|
+
requestArg: IGitManagerRepositoryServiceRequest,
|
|
90
|
+
homeDirectoryArg: string,
|
|
91
|
+
) {
|
|
92
|
+
validateDescriptor(descriptorArg, requestArg);
|
|
93
|
+
const args = descriptorArg.service === 'upload-pack'
|
|
94
|
+
? [
|
|
95
|
+
'upload-pack',
|
|
96
|
+
'--strict',
|
|
97
|
+
'--timeout',
|
|
98
|
+
String(descriptorArg.idleTimeoutSeconds),
|
|
99
|
+
descriptorArg.repositoryPath,
|
|
100
|
+
]
|
|
101
|
+
: [
|
|
102
|
+
'-c',
|
|
103
|
+
'core.hooksPath=' + descriptorArg.hookPath!,
|
|
104
|
+
'-c',
|
|
105
|
+
'receive.fsckObjects=true',
|
|
106
|
+
'receive-pack',
|
|
107
|
+
descriptorArg.repositoryPath,
|
|
108
|
+
];
|
|
109
|
+
const environment: NodeJS.ProcessEnv = {
|
|
110
|
+
HOME: homeDirectoryArg,
|
|
111
|
+
LANG: 'C',
|
|
112
|
+
LC_ALL: 'C',
|
|
113
|
+
PATH: process.env.PATH ?? '/usr/local/bin:/usr/bin:/bin',
|
|
114
|
+
GIT_ASKPASS: 'true',
|
|
115
|
+
GIT_CONFIG_GLOBAL: '/dev/null',
|
|
116
|
+
GIT_CONFIG_NOSYSTEM: '1',
|
|
117
|
+
GIT_NO_LAZY_FETCH: '1',
|
|
118
|
+
GIT_TERMINAL_PROMPT: '0',
|
|
119
|
+
GCM_INTERACTIVE: 'Never',
|
|
120
|
+
SSH_ASKPASS: 'true',
|
|
121
|
+
...(descriptorArg.protocol
|
|
122
|
+
? { GIT_PROTOCOL: descriptorArg.protocol }
|
|
123
|
+
: {}),
|
|
124
|
+
...(descriptorArg.protectedRefsPolicy
|
|
125
|
+
? {
|
|
126
|
+
GITMANAGER_PROTECTED_REFS_POLICY:
|
|
127
|
+
descriptorArg.protectedRefsPolicy,
|
|
128
|
+
}
|
|
129
|
+
: {}),
|
|
130
|
+
};
|
|
131
|
+
this.child = plugins.childProcess.spawn('git', args, {
|
|
132
|
+
detached: process.platform !== 'win32',
|
|
133
|
+
env: environment,
|
|
134
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
135
|
+
windowsHide: true,
|
|
136
|
+
});
|
|
137
|
+
const fail = (errorArg: Error) => {
|
|
138
|
+
this.terminate();
|
|
139
|
+
return errorArg;
|
|
140
|
+
};
|
|
141
|
+
const input = new ByteLimitTransform(
|
|
142
|
+
descriptorArg.maxRequestBytes,
|
|
143
|
+
'Git repository service request',
|
|
144
|
+
fail,
|
|
145
|
+
);
|
|
146
|
+
const output = new ByteLimitTransform(
|
|
147
|
+
descriptorArg.maxResponseBytes,
|
|
148
|
+
'Git repository service response',
|
|
149
|
+
fail,
|
|
150
|
+
);
|
|
151
|
+
const stderr = new ByteLimitTransform(
|
|
152
|
+
128 * 1024,
|
|
153
|
+
'Git repository service stderr',
|
|
154
|
+
fail,
|
|
155
|
+
);
|
|
156
|
+
input.pipe(this.child.stdin);
|
|
157
|
+
this.child.stdout.pipe(output);
|
|
158
|
+
this.child.stderr.pipe(stderr);
|
|
159
|
+
this.stdin = input;
|
|
160
|
+
this.stdout = output;
|
|
161
|
+
this.stderr = stderr;
|
|
162
|
+
this.completed = new Promise((resolve, reject) => {
|
|
163
|
+
this.child.once('error', (error) => {
|
|
164
|
+
if (this.completionSettled) return;
|
|
165
|
+
this.completionSettled = true;
|
|
166
|
+
this.clearTimeout();
|
|
167
|
+
reject(error);
|
|
168
|
+
});
|
|
169
|
+
this.child.once('close', (exitCode, signal) => {
|
|
170
|
+
if (this.completionSettled) return;
|
|
171
|
+
this.completionSettled = true;
|
|
172
|
+
this.clearTimeout();
|
|
173
|
+
resolve({
|
|
174
|
+
exitCode,
|
|
175
|
+
signal: signal as NodeJS.Signals | null,
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
this.timeout = setTimeout(() => {
|
|
180
|
+
this.terminate();
|
|
181
|
+
}, descriptorArg.processTimeoutMs);
|
|
182
|
+
this.timeout.unref();
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
public terminate(): void {
|
|
186
|
+
if (this.completionSettled || this.child.killed) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
const pid = this.child.pid;
|
|
190
|
+
if (pid && process.platform !== 'win32') {
|
|
191
|
+
try {
|
|
192
|
+
process.kill(-pid, 'SIGKILL');
|
|
193
|
+
return;
|
|
194
|
+
} catch {
|
|
195
|
+
// Fall through to the direct child kill.
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
this.child.kill('SIGKILL');
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
public async close(): Promise<void> {
|
|
202
|
+
this.stdin.destroy();
|
|
203
|
+
this.terminate();
|
|
204
|
+
await this.completed.catch(() => undefined);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
private clearTimeout(): void {
|
|
208
|
+
if (this.timeout) {
|
|
209
|
+
clearTimeout(this.timeout);
|
|
210
|
+
this.timeout = undefined;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
package/ts/index.ts
CHANGED
package/ts/models.ts
CHANGED
|
@@ -70,6 +70,45 @@ export interface IGitManagerRepositoryBundle
|
|
|
70
70
|
sizeBytes: number;
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
+
export interface IGitManagerRepositoryArchiveRequest
|
|
74
|
+
extends IGitManagerRepositorySelector {
|
|
75
|
+
objectId: string;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export interface IGitManagerRepositoryArchive
|
|
79
|
+
extends IGitManagerRepositorySelector {
|
|
80
|
+
objectId: string;
|
|
81
|
+
archivePath: string;
|
|
82
|
+
sizeBytes: number;
|
|
83
|
+
sha256: string;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export type TGitManagerRepositoryService =
|
|
87
|
+
| 'upload-pack'
|
|
88
|
+
| 'receive-pack';
|
|
89
|
+
|
|
90
|
+
export interface IGitManagerRepositoryServiceRequest
|
|
91
|
+
extends IGitManagerRepositorySelector {
|
|
92
|
+
service: TGitManagerRepositoryService;
|
|
93
|
+
protocol?: 'version=0' | 'version=1' | 'version=2';
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface IRustGitManagerRepositoryServiceDescriptor
|
|
97
|
+
extends IGitManagerRepositoryServiceRequest {
|
|
98
|
+
repositoryPath: string;
|
|
99
|
+
hookPath?: string;
|
|
100
|
+
protectedRefsPolicy?: string;
|
|
101
|
+
maxRequestBytes: number;
|
|
102
|
+
maxResponseBytes: number;
|
|
103
|
+
processTimeoutMs: number;
|
|
104
|
+
idleTimeoutSeconds: number;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export interface IGitManagerRepositoryServiceResult {
|
|
108
|
+
exitCode: number | null;
|
|
109
|
+
signal: NodeJS.Signals | null;
|
|
110
|
+
}
|
|
111
|
+
|
|
73
112
|
export interface IGitManagerRestoreBundleRequest
|
|
74
113
|
extends IGitManagerRepositorySelector {
|
|
75
114
|
bundlePath: string;
|
|
@@ -80,6 +119,7 @@ export interface IGitManagerOptions {
|
|
|
80
119
|
dataDir?: string;
|
|
81
120
|
transferDir?: string;
|
|
82
121
|
maxBundleBytes?: number;
|
|
122
|
+
maxArchiveBytes?: number;
|
|
83
123
|
smartHttp?: IGitManagerSmartHttpOptions;
|
|
84
124
|
}
|
|
85
125
|
|
|
@@ -113,6 +153,7 @@ export interface IRustGitManagerConfig {
|
|
|
113
153
|
dataDir: string;
|
|
114
154
|
transferDir: string;
|
|
115
155
|
maxBundleBytes: number;
|
|
156
|
+
maxArchiveBytes: number;
|
|
116
157
|
smartHttp?: IRustGitManagerSmartHttpConfig;
|
|
117
158
|
}
|
|
118
159
|
|
package/ts/plugins.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
// node native scope
|
|
2
|
+
import * as childProcess from 'node:child_process';
|
|
2
3
|
import { EventEmitter } from 'node:events';
|
|
3
4
|
import * as path from 'node:path';
|
|
5
|
+
import * as stream from 'node:stream';
|
|
4
6
|
import * as url from 'node:url';
|
|
5
7
|
|
|
6
|
-
export { EventEmitter, path, url };
|
|
8
|
+
export { childProcess, EventEmitter, path, stream, url };
|
|
7
9
|
|
|
8
10
|
// @push.rocks scope
|
|
9
11
|
import * as smartrust from '@push.rocks/smartrust';
|
|
@@ -16,6 +16,9 @@ import type {
|
|
|
16
16
|
IGitManagerProtectedRefsApplyResult,
|
|
17
17
|
IGitManagerSmartHttpRepositoryProtectedRefs,
|
|
18
18
|
IGitManagerRepositoryBundle,
|
|
19
|
+
IGitManagerRepositoryArchive,
|
|
20
|
+
IGitManagerRepositoryArchiveRequest,
|
|
21
|
+
IGitManagerRepositoryServiceRequest,
|
|
19
22
|
IGitManagerRepositoryInfo,
|
|
20
23
|
IGitManagerRepositorySelector,
|
|
21
24
|
IGitManagerRestoreBundleRequest,
|
|
@@ -27,6 +30,7 @@ import type {
|
|
|
27
30
|
IGitManagerTreeEntry,
|
|
28
31
|
IGitManagerTreeRequest,
|
|
29
32
|
IRustGitManagerConfig,
|
|
33
|
+
IRustGitManagerRepositoryServiceDescriptor,
|
|
30
34
|
} from './models.js';
|
|
31
35
|
|
|
32
36
|
type TGitManagerCommands = {
|
|
@@ -41,6 +45,8 @@ type TGitManagerCommands = {
|
|
|
41
45
|
refreshMirror: { params: IGitManagerRepositorySelector; result: IGitManagerRepositoryInfo };
|
|
42
46
|
verifyRepository: { params: IGitManagerRepositorySelector; result: IGitManagerRepositoryInfo };
|
|
43
47
|
createRepositoryBundle: { params: IGitManagerRepositorySelector; result: IGitManagerRepositoryBundle };
|
|
48
|
+
createRepositoryArchive: { params: IGitManagerRepositoryArchiveRequest; result: IGitManagerRepositoryArchive };
|
|
49
|
+
prepareRepositoryService: { params: IGitManagerRepositoryServiceRequest; result: IRustGitManagerRepositoryServiceDescriptor };
|
|
44
50
|
restoreRepositoryBundle: { params: IGitManagerRestoreBundleRequest; result: IGitManagerRepositoryInfo };
|
|
45
51
|
listRepositories: { params: Record<string, never>; result: IGitManagerRepositoryInfo[] };
|
|
46
52
|
listRefs: { params: IGitManagerRefRequest; result: IGitManagerRef[] };
|
|
@@ -168,6 +174,18 @@ export class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
168
174
|
return this.bridge.sendCommand('createRepositoryBundle', requestArg);
|
|
169
175
|
}
|
|
170
176
|
|
|
177
|
+
public async createRepositoryArchive(
|
|
178
|
+
requestArg: IGitManagerRepositoryArchiveRequest,
|
|
179
|
+
): Promise<IGitManagerRepositoryArchive> {
|
|
180
|
+
return this.bridge.sendCommand('createRepositoryArchive', requestArg);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
public async prepareRepositoryService(
|
|
184
|
+
requestArg: IGitManagerRepositoryServiceRequest,
|
|
185
|
+
): Promise<IRustGitManagerRepositoryServiceDescriptor> {
|
|
186
|
+
return this.bridge.sendCommand('prepareRepositoryService', requestArg);
|
|
187
|
+
}
|
|
188
|
+
|
|
171
189
|
public async restoreRepositoryBundle(
|
|
172
190
|
requestArg: IGitManagerRestoreBundleRequest,
|
|
173
191
|
): Promise<IGitManagerRepositoryInfo> {
|