@foss.global/gitmanager 1.1.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 +10 -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 +5 -1
- package/dist_ts/classes.gitmanager.js +25 -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 +18 -0
- package/dist_ts/plugins.d.ts +3 -1
- package/dist_ts/plugins.js +4 -2
- package/dist_ts/rust-gitmanager-bridge.d.ts +2 -1
- package/dist_ts/rust-gitmanager-bridge.js +4 -1
- package/package.json +1 -1
- package/readme.md +25 -3
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.gitmanager.ts +33 -0
- package/ts/classes.repositoryservice.ts +213 -0
- package/ts/index.ts +1 -0
- package/ts/models.ts +26 -0
- package/ts/plugins.ts +3 -1
- package/ts/rust-gitmanager-bridge.ts +9 -0
package/changelog.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
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
|
+
|
|
3
13
|
## 2026-07-20 - 1.1.0
|
|
4
14
|
|
|
5
15
|
### Features
|
|
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, IGitManagerRepositoryArchive, IGitManagerRepositoryArchiveRequest, 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>;
|
|
@@ -20,6 +22,7 @@ export declare class GitManager extends plugins.EventEmitter {
|
|
|
20
22
|
verifyRepository(requestArg: IGitManagerRepositorySelector): Promise<IGitManagerRepositoryInfo>;
|
|
21
23
|
createRepositoryBundle(requestArg: IGitManagerRepositorySelector): Promise<IGitManagerRepositoryBundle>;
|
|
22
24
|
createRepositoryArchive(requestArg: IGitManagerRepositoryArchiveRequest): Promise<IGitManagerRepositoryArchive>;
|
|
25
|
+
openRepositoryService(requestArg: IGitManagerRepositoryServiceRequest): Promise<GitManagerRepositoryService>;
|
|
23
26
|
restoreRepositoryBundle(requestArg: IGitManagerRestoreBundleRequest): Promise<IGitManagerRepositoryInfo>;
|
|
24
27
|
listRepositories(): Promise<IGitManagerRepositoryInfo[]>;
|
|
25
28
|
listRefs(requestArg: IGitManagerRefRequest): Promise<IGitManagerRef[]>;
|
|
@@ -32,4 +35,5 @@ export declare class GitManager extends plugins.EventEmitter {
|
|
|
32
35
|
getTag(requestArg: IGitManagerTagRequest): Promise<IGitManagerTag>;
|
|
33
36
|
private startInternal;
|
|
34
37
|
private assertRunning;
|
|
38
|
+
private closeRepositoryServices;
|
|
35
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;
|
|
@@ -79,10 +81,12 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
79
81
|
await this.startPromise.catch(() => undefined);
|
|
80
82
|
}
|
|
81
83
|
if (!this.bridge.running) {
|
|
84
|
+
await this.closeRepositoryServices();
|
|
82
85
|
this.started = false;
|
|
83
86
|
return;
|
|
84
87
|
}
|
|
85
88
|
try {
|
|
89
|
+
await this.closeRepositoryServices();
|
|
86
90
|
await this.bridge.stopGitManager();
|
|
87
91
|
}
|
|
88
92
|
finally {
|
|
@@ -160,6 +164,21 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
160
164
|
this.assertRunning();
|
|
161
165
|
return this.bridge.createRepositoryArchive(requestArg);
|
|
162
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
|
+
}
|
|
163
182
|
async restoreRepositoryBundle(requestArg) {
|
|
164
183
|
this.assertRunning();
|
|
165
184
|
return this.bridge.restoreRepositoryBundle(requestArg);
|
|
@@ -234,5 +253,10 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
234
253
|
throw new Error('GitManager is not running');
|
|
235
254
|
}
|
|
236
255
|
}
|
|
256
|
+
async closeRepositoryServices() {
|
|
257
|
+
const services = [...this.repositoryServices];
|
|
258
|
+
this.repositoryServices.clear();
|
|
259
|
+
await Promise.all(services.map((service) => service.close()));
|
|
260
|
+
}
|
|
237
261
|
}
|
|
238
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5naXRtYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5naXRtYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBaUN4QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVuRSxNQUFNLE9BQU8sVUFBVyxTQUFRLE9BQU8sQ0FBQyxZQUFZO0lBT2xELFlBQVksYUFBaUMsRUFBRTtRQUM3QyxLQUFLLEVBQUUsQ0FBQztRQVBGLFdBQU0sR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDcEMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixpQkFBWSxHQUF5QixJQUFJLENBQUM7UUFDMUMsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFLNUIsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU87ZUFDN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNqRSxNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUM7UUFDOUMsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLE9BQU87WUFDUCxXQUFXLEVBQUUsVUFBVSxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDO1lBQzlFLGNBQWMsRUFBRSxVQUFVLENBQUMsY0FBYyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUk7WUFDbkUsZUFBZSxFQUFFLFVBQVUsQ0FBQyxlQUFlLElBQUksR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJO1lBQ2hFLFNBQVMsRUFBRSxnQkFBZ0IsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLEtBQUssS0FBSztnQkFDL0QsQ0FBQyxDQUFDO29C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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
|
@@ -62,6 +62,24 @@ export interface IGitManagerRepositoryArchive extends IGitManagerRepositorySelec
|
|
|
62
62
|
sizeBytes: number;
|
|
63
63
|
sha256: string;
|
|
64
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
|
+
}
|
|
65
83
|
export interface IGitManagerRestoreBundleRequest extends IGitManagerRepositorySelector {
|
|
66
84
|
bundlePath: string;
|
|
67
85
|
defaultBranch?: string;
|
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, IGitManagerRepositoryArchive, IGitManagerRepositoryArchiveRequest, 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();
|
|
@@ -18,6 +18,7 @@ export declare class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
18
18
|
verifyRepository(requestArg: IGitManagerRepositorySelector): Promise<IGitManagerRepositoryInfo>;
|
|
19
19
|
createRepositoryBundle(requestArg: IGitManagerRepositorySelector): Promise<IGitManagerRepositoryBundle>;
|
|
20
20
|
createRepositoryArchive(requestArg: IGitManagerRepositoryArchiveRequest): Promise<IGitManagerRepositoryArchive>;
|
|
21
|
+
prepareRepositoryService(requestArg: IGitManagerRepositoryServiceRequest): Promise<IRustGitManagerRepositoryServiceDescriptor>;
|
|
21
22
|
restoreRepositoryBundle(requestArg: IGitManagerRestoreBundleRequest): Promise<IGitManagerRepositoryInfo>;
|
|
22
23
|
listRepositories(): Promise<IGitManagerRepositoryInfo[]>;
|
|
23
24
|
listRefs(requestArg: IGitManagerRefRequest): Promise<IGitManagerRef[]>;
|
|
@@ -85,6 +85,9 @@ export class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
85
85
|
async createRepositoryArchive(requestArg) {
|
|
86
86
|
return this.bridge.sendCommand('createRepositoryArchive', requestArg);
|
|
87
87
|
}
|
|
88
|
+
async prepareRepositoryService(requestArg) {
|
|
89
|
+
return this.bridge.sendCommand('prepareRepositoryService', requestArg);
|
|
90
|
+
}
|
|
88
91
|
async restoreRepositoryBundle(requestArg) {
|
|
89
92
|
return this.bridge.sendCommand('restoreRepositoryBundle', requestArg);
|
|
90
93
|
}
|
|
@@ -116,4 +119,4 @@ export class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
116
119
|
return this.bridge.sendCommand('getTag', requestArg);
|
|
117
120
|
}
|
|
118
121
|
}
|
|
119
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
122
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVzdC1naXRtYW5hZ2VyLWJyaWRnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3J1c3QtZ2l0bWFuYWdlci1icmlkZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUE2RHhDLFNBQVMsY0FBYztJQUNyQixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakYsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVELFNBQVMsdUJBQXVCO0lBQzlCLE1BQU0sT0FBTyxHQUEyQixFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3pFLE1BQU0sS0FBSyxHQUEyQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDN0MsQ0FBQztBQUVELFNBQVMsZUFBZTtJQUN0QixNQUFNLFdBQVcsR0FBRyxjQUFjLEVBQUUsQ0FBQztJQUNyQyxNQUFNLE1BQU0sR0FBRyx1QkFBdUIsRUFBRSxDQUFDO0lBQ3pDLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUUzQixJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1gsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFDMUUsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQy9GLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUU3RixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsT0FBTyxDQUFDLFlBQVk7SUFHNUQ7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBc0I7WUFDbEUsVUFBVSxFQUFFLGdCQUFnQjtZQUM1QixVQUFVLEVBQUUsd0JBQXdCO1lBQ3BDLHFCQUFxQixFQUFFLHlCQUF5QjtZQUNoRCxVQUFVLEVBQUUsZUFBZSxFQUFFO1lBQzdCLGdCQUFnQixFQUFFLE1BQU07WUFDeEIsY0FBYyxFQUFFLEtBQUs7U0FDdEIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBbUIsRUFBRSxNQUFxQixFQUFFLEVBQUU7WUFDcEUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBWSxFQUFFLEVBQUU7WUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUs7UUFDaEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTSxJQUFJO1FBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDN0IsQ0FBQztJQUVNLEtBQUssQ0FBQyxlQUFlLENBQUMsU0FBZ0M7UUFDM0QsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRU0sS0FBSyxDQUFDLGNBQWM7UUFDekIsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVNLEtBQUssQ0FBQyxTQUFTO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFTSxLQUFLLENBQUMsNEJBQTRCLENBQUMsU0FBK0M7UUFDdkYsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyw4QkFBOEIsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRU0sS0FBSyxDQUFDLGdDQUFnQyxDQUMzQyxhQUF1RDtRQUV2RCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLGtDQUFrQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFTSxLQUFLLENBQUMsbUNBQW1DLENBQzlDLGdCQUE2RDtRQUU3RCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUM1QixxQ0FBcUMsRUFDckMsZ0JBQWdCLENBQ2pCLENBQUM7SUFDSixDQUFDO0lBRU0sS0FBSyxDQUFDLGtCQUFrQixDQUFDLFVBQWdEO1FBQzlFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsb0JBQW9CLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVNLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBMEM7UUFDbEUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVNLEtBQUssQ0FBQyxhQUFhLENBQUMsVUFBeUM7UUFDbEUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVNLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxVQUF5QztRQUNyRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFTSxLQUFLLENBQUMsc0JBQXNCLENBQ2pDLFVBQXlDO1FBRXpDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsd0JBQXdCLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVNLEtBQUssQ0FBQyx1QkFBdUIsQ0FDbEMsVUFBK0M7UUFFL0MsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRU0sS0FBSyxDQUFDLHdCQUF3QixDQUNuQyxVQUErQztRQUUvQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLDBCQUEwQixFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFTSxLQUFLLENBQUMsdUJBQXVCLENBQ2xDLFVBQTJDO1FBRTNDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMseUJBQXlCLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVNLEtBQUssQ0FBQyxnQkFBZ0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFpQztRQUNyRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFrQztRQUN0RCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFzQztRQUMxRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxVQUF5QztRQUNoRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU0sS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFvQztRQUN6RCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFrQztRQUNyRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFzQztRQUMxRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFpQztRQUNuRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN2RCxDQUFDO0NBQ0YifQ==
|
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
|
@@ -18,6 +18,7 @@ import type {
|
|
|
18
18
|
IGitManagerRepositoryBundle,
|
|
19
19
|
IGitManagerRepositoryArchive,
|
|
20
20
|
IGitManagerRepositoryArchiveRequest,
|
|
21
|
+
IGitManagerRepositoryServiceRequest,
|
|
21
22
|
IGitManagerRepositoryInfo,
|
|
22
23
|
IGitManagerRepositorySelector,
|
|
23
24
|
IGitManagerRestoreBundleRequest,
|
|
@@ -32,6 +33,7 @@ import type {
|
|
|
32
33
|
IRustGitManagerConfig,
|
|
33
34
|
} from './models.js';
|
|
34
35
|
import { RustGitManagerBridge } from './rust-gitmanager-bridge.js';
|
|
36
|
+
import { GitManagerRepositoryService } from './classes.repositoryservice.js';
|
|
35
37
|
|
|
36
38
|
export class GitManager extends plugins.EventEmitter {
|
|
37
39
|
private bridge = new RustGitManagerBridge();
|
|
@@ -39,6 +41,7 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
39
41
|
private startPromise: Promise<void> | null = null;
|
|
40
42
|
private stopRequested = false;
|
|
41
43
|
private config: IRustGitManagerConfig;
|
|
44
|
+
private readonly repositoryServices = new Set<GitManagerRepositoryService>();
|
|
42
45
|
|
|
43
46
|
constructor(optionsArg: IGitManagerOptions = {}) {
|
|
44
47
|
super();
|
|
@@ -119,10 +122,12 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
119
122
|
await this.startPromise.catch(() => undefined);
|
|
120
123
|
}
|
|
121
124
|
if (!this.bridge.running) {
|
|
125
|
+
await this.closeRepositoryServices();
|
|
122
126
|
this.started = false;
|
|
123
127
|
return;
|
|
124
128
|
}
|
|
125
129
|
try {
|
|
130
|
+
await this.closeRepositoryServices();
|
|
126
131
|
await this.bridge.stopGitManager();
|
|
127
132
|
} finally {
|
|
128
133
|
this.bridge.kill();
|
|
@@ -221,6 +226,28 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
221
226
|
return this.bridge.createRepositoryArchive(requestArg);
|
|
222
227
|
}
|
|
223
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
|
+
|
|
224
251
|
public async restoreRepositoryBundle(
|
|
225
252
|
requestArg: IGitManagerRestoreBundleRequest,
|
|
226
253
|
): Promise<IGitManagerRepositoryInfo> {
|
|
@@ -307,4 +334,10 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
307
334
|
throw new Error('GitManager is not running');
|
|
308
335
|
}
|
|
309
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
|
+
}
|
|
310
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
|
@@ -83,6 +83,32 @@ export interface IGitManagerRepositoryArchive
|
|
|
83
83
|
sha256: string;
|
|
84
84
|
}
|
|
85
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
|
+
|
|
86
112
|
export interface IGitManagerRestoreBundleRequest
|
|
87
113
|
extends IGitManagerRepositorySelector {
|
|
88
114
|
bundlePath: string;
|
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';
|
|
@@ -18,6 +18,7 @@ import type {
|
|
|
18
18
|
IGitManagerRepositoryBundle,
|
|
19
19
|
IGitManagerRepositoryArchive,
|
|
20
20
|
IGitManagerRepositoryArchiveRequest,
|
|
21
|
+
IGitManagerRepositoryServiceRequest,
|
|
21
22
|
IGitManagerRepositoryInfo,
|
|
22
23
|
IGitManagerRepositorySelector,
|
|
23
24
|
IGitManagerRestoreBundleRequest,
|
|
@@ -29,6 +30,7 @@ import type {
|
|
|
29
30
|
IGitManagerTreeEntry,
|
|
30
31
|
IGitManagerTreeRequest,
|
|
31
32
|
IRustGitManagerConfig,
|
|
33
|
+
IRustGitManagerRepositoryServiceDescriptor,
|
|
32
34
|
} from './models.js';
|
|
33
35
|
|
|
34
36
|
type TGitManagerCommands = {
|
|
@@ -44,6 +46,7 @@ type TGitManagerCommands = {
|
|
|
44
46
|
verifyRepository: { params: IGitManagerRepositorySelector; result: IGitManagerRepositoryInfo };
|
|
45
47
|
createRepositoryBundle: { params: IGitManagerRepositorySelector; result: IGitManagerRepositoryBundle };
|
|
46
48
|
createRepositoryArchive: { params: IGitManagerRepositoryArchiveRequest; result: IGitManagerRepositoryArchive };
|
|
49
|
+
prepareRepositoryService: { params: IGitManagerRepositoryServiceRequest; result: IRustGitManagerRepositoryServiceDescriptor };
|
|
47
50
|
restoreRepositoryBundle: { params: IGitManagerRestoreBundleRequest; result: IGitManagerRepositoryInfo };
|
|
48
51
|
listRepositories: { params: Record<string, never>; result: IGitManagerRepositoryInfo[] };
|
|
49
52
|
listRefs: { params: IGitManagerRefRequest; result: IGitManagerRef[] };
|
|
@@ -177,6 +180,12 @@ export class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
177
180
|
return this.bridge.sendCommand('createRepositoryArchive', requestArg);
|
|
178
181
|
}
|
|
179
182
|
|
|
183
|
+
public async prepareRepositoryService(
|
|
184
|
+
requestArg: IGitManagerRepositoryServiceRequest,
|
|
185
|
+
): Promise<IRustGitManagerRepositoryServiceDescriptor> {
|
|
186
|
+
return this.bridge.sendCommand('prepareRepositoryService', requestArg);
|
|
187
|
+
}
|
|
188
|
+
|
|
180
189
|
public async restoreRepositoryBundle(
|
|
181
190
|
requestArg: IGitManagerRestoreBundleRequest,
|
|
182
191
|
): Promise<IGitManagerRepositoryInfo> {
|