@foss.global/gitmanager 1.1.0 → 1.3.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 +20 -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 +29 -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 +19 -1
- 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 +2 -2
- package/readme.md +25 -3
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.gitmanager.ts +42 -0
- package/ts/classes.repositoryservice.ts +213 -0
- package/ts/index.ts +1 -0
- package/ts/models.ts +30 -0
- package/ts/plugins.ts +3 -1
- package/ts/rust-gitmanager-bridge.ts +18 -0
package/changelog.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-07-21 - 1.3.0
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- add atomic pull request merge execution (repository-merge)
|
|
8
|
+
- Execute merge commits, squash commits, and rebases inside the Rust engine without exposing Git subprocesses to callers.
|
|
9
|
+
- Fence target updates by the expected commit object ID and return explicit stale, conflict, already-merged, and merged outcomes.
|
|
10
|
+
- Reject mirror mutations, validate canonical target refs and actor metadata, disable hooks and signing, and clean isolated rebase worktrees.
|
|
11
|
+
- Add end-to-end coverage for all merge methods, target races, already-merged commits, conflicts, parent topology, and rebase cleanup.
|
|
12
|
+
|
|
13
|
+
## 2026-07-20 - 1.2.0
|
|
14
|
+
|
|
15
|
+
### Features
|
|
16
|
+
|
|
17
|
+
- add bounded raw Git services for authenticated SSH ingress (repository-service)
|
|
18
|
+
- Prepare canonical repository paths and immutable protected-ref policy snapshots in Rust.
|
|
19
|
+
- Stream upload-pack and receive-pack through size-limited Node streams without sending pack data through JSON IPC.
|
|
20
|
+
- Isolate Git subprocess configuration, process groups, deadlines, stderr, and shutdown cleanup.
|
|
21
|
+
- Cover raw Git protocol v2 advertisement and protected receive-pack preparation in the transport integration test.
|
|
22
|
+
|
|
3
23
|
## 2026-07-20 - 1.1.0
|
|
4
24
|
|
|
5
25
|
### 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.3.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, IGitManagerMergeRequest, IGitManagerMergeResult, 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,9 +22,11 @@ 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[]>;
|
|
29
|
+
mergeRepository(requestArg: IGitManagerMergeRequest): Promise<IGitManagerMergeResult>;
|
|
26
30
|
listTree(requestArg: IGitManagerTreeRequest): Promise<IGitManagerTreeEntry[]>;
|
|
27
31
|
readFile(requestArg: IGitManagerReadFileRequest): Promise<IGitManagerFileContent>;
|
|
28
32
|
listCommits(requestArg: IGitManagerListCommitsRequest): Promise<IGitManagerCommitSummary[]>;
|
|
@@ -32,4 +36,5 @@ export declare class GitManager extends plugins.EventEmitter {
|
|
|
32
36
|
getTag(requestArg: IGitManagerTagRequest): Promise<IGitManagerTag>;
|
|
33
37
|
private startInternal;
|
|
34
38
|
private assertRunning;
|
|
39
|
+
private closeRepositoryServices;
|
|
35
40
|
}
|
|
@@ -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);
|
|
@@ -172,6 +191,10 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
172
191
|
this.assertRunning();
|
|
173
192
|
return this.bridge.listRefs(requestArg);
|
|
174
193
|
}
|
|
194
|
+
async mergeRepository(requestArg) {
|
|
195
|
+
this.assertRunning();
|
|
196
|
+
return this.bridge.mergeRepository(requestArg);
|
|
197
|
+
}
|
|
175
198
|
async listTree(requestArg) {
|
|
176
199
|
this.assertRunning();
|
|
177
200
|
return this.bridge.listTree(requestArg);
|
|
@@ -234,5 +257,10 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
234
257
|
throw new Error('GitManager is not running');
|
|
235
258
|
}
|
|
236
259
|
}
|
|
260
|
+
async closeRepositoryServices() {
|
|
261
|
+
const services = [...this.repositoryServices];
|
|
262
|
+
this.repositoryServices.clear();
|
|
263
|
+
await Promise.all(services.map((service) => service.close()));
|
|
264
|
+
}
|
|
237
265
|
}
|
|
238
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5naXRtYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5naXRtYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBaUN4QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVuRSxNQUFNLE9BQU8sVUFBVyxTQUFRLE9BQU8sQ0FBQyxZQUFZO0lBT2xELFlBQVksYUFBaUMsRUFBRTtRQUM3QyxLQUFLLEVBQUUsQ0FBQztRQVBGLFdBQU0sR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDcEMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixpQkFBWSxHQUF5QixJQUFJLENBQUM7UUFDMUMsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFLNUIsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU87ZUFDN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNqRSxNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUM7UUFDOUMsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLE9BQU87WUFDUCxXQUFXLEVBQUUsVUFBVSxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDO1lBQzlFLGNBQWMsRUFBRSxVQUFVLENBQUMsY0FBYyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUk7WUFDbkUsZUFBZSxFQUFFLFVBQVUsQ0FBQyxlQUFlLElBQUksR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJO1lBQ2hFLFNBQVMsRUFBRSxnQkFBZ0IsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLEtBQUssS0FBSztnQkFDL0QsQ0FBQyxDQUFDO29C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
|
|
266
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5naXRtYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5naXRtYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBb0N4QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUU3RSxNQUFNLE9BQU8sVUFBVyxTQUFRLE9BQU8sQ0FBQyxZQUFZO0lBUWxELFlBQVksYUFBaUMsRUFBRTtRQUM3QyxLQUFLLEVBQUUsQ0FBQztRQVJGLFdBQU0sR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDcEMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixpQkFBWSxHQUF5QixJQUFJLENBQUM7UUFDMUMsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFFYix1QkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztRQUkzRSxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTztlQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUM5QyxJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ1osT0FBTztZQUNQLFdBQVcsRUFBRSxVQUFVLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUM7WUFDOUUsY0FBYyxFQUFFLFVBQVUsQ0FBQyxjQUFjLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtZQUNuRSxlQUFlLEVBQUUsVUFBVSxDQUFDLGVBQWUsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUk7WUFDaEUsU0FBUyxFQUFFLGdCQUFnQixJQUFJLGdCQUFnQixDQUFDLE9BQU8sS0FBSyxLQUFLO2dCQUMvRCxDQUFDLENBQUM7b0JBQ0UsV0FBVyxFQUFFLGdCQUFnQixDQUFDLFdBQVcsSUFBSSxXQUFXO29CQUN4RCxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxJQUFJLENBQUM7b0JBQ2hDLHNCQUFzQixFQUFFLGdCQUFnQixDQUFDLHNCQUFzQixJQUFJLEtBQUs7b0JBQ3hFLG9CQUFvQixFQUFFLGdCQUFnQixDQUFDLG9CQUFvQixJQUFJLEtBQUs7b0JBQ3BFLG1CQUFtQixFQUFFLGdCQUFnQixDQUFDLG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFDOUUsR0FBRyxFQUFFLFVBQVUsQ0FBQyxHQUFHO3dCQUNuQixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7cUJBQ3RCLENBQUMsQ0FBQyxJQUFJLEVBQUU7b0JBQ1Qsc0JBQXNCLEVBQUUsZ0JBQWdCLENBQUMsc0JBQXNCLElBQUksRUFBRTtvQkFDckUsbUJBQW1CLEVBQUUsZ0JBQWdCLENBQUMsbUJBQW1CLElBQUksRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJO29CQUM3RSxxQkFBcUIsRUFBRSxnQkFBZ0IsQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUk7b0JBQ2hGLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLGdCQUFnQixJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUk7b0JBQzdFLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLGdCQUFnQixJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTtvQkFDckUsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUMsa0JBQWtCLElBQUksR0FBRztvQkFDOUQsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUMsa0JBQWtCLElBQUksTUFBTTtvQkFDakUsV0FBVyxFQUFFLGdCQUFnQixDQUFDLFdBQVc7MkJBQ3BDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxPQUFPLEtBQUssS0FBSzt3QkFDakQsQ0FBQyxDQUFDOzRCQUNFLG1CQUFtQixFQUNqQixnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsbUJBQW1CO3lCQUNuRDt3QkFDSCxDQUFDLENBQUMsU0FBUztvQkFDYixXQUFXLEVBQUUsZ0JBQWdCLENBQUMsV0FBVzsyQkFDcEMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLE9BQU8sS0FBSyxLQUFLO3dCQUNqRCxDQUFDLENBQUM7NEJBQ0UsbUJBQW1CLEVBQ2pCLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxtQkFBbUI7NEJBQ2xELG1CQUFtQixFQUNqQixnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsbUJBQW1CO21DQUM3QyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJO3lCQUM1Qjt3QkFDSCxDQUFDLENBQUMsU0FBUztpQkFDZDtnQkFDSCxDQUFDLENBQUMsU0FBUztTQUNkLENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFtQixFQUFFLE1BQXFCLEVBQUUsRUFBRTtZQUNwRSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFZLEVBQUUsRUFBRTtZQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSztRQUNoQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzFCLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQUk7UUFDZixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUNyQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDckMsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxTQUFTO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pCLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTztnQkFDNUIsUUFBUSxFQUFFLENBQUM7YUFDWixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRU0sS0FBSyxDQUFDLDRCQUE0QixDQUN2QyxTQUErQztRQUUvQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLDRCQUE0QixDQUFDO1lBQzlDLG9CQUFvQixFQUFFLFNBQVMsQ0FBQyxvQkFBb0I7WUFDcEQsbUJBQW1CLEVBQUUsU0FBUyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDdEUsR0FBRyxFQUFFLFVBQVUsQ0FBQyxHQUFHO2dCQUNuQixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7YUFDdEIsQ0FBQyxDQUFDO1NBQ0osQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FDM0MsYUFBdUQ7UUFFdkQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FBQztZQUNsRCxHQUFHLEVBQUUsYUFBYSxDQUFDLEdBQUc7WUFDdEIsSUFBSSxFQUFFLGFBQWEsQ0FBQyxJQUFJO1lBQ3hCLE1BQU0sRUFBRSxhQUFhLENBQUMsTUFBTTtZQUM1QixRQUFRLEVBQUUsYUFBYSxDQUFDLFFBQVE7U0FDakMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLEtBQUssQ0FBQyxtQ0FBbUMsQ0FDOUMsZ0JBQTZEO1FBRTdELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsbUNBQW1DLENBQUM7WUFDckQsR0FBRyxFQUFFLGdCQUFnQixDQUFDLEdBQUc7WUFDekIsSUFBSSxFQUFFLGdCQUFnQixDQUFDLElBQUk7WUFDM0IsUUFBUSxFQUFFLGdCQUFnQixDQUFDLFFBQVE7WUFDbkMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzNDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDckIsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO2dCQUMvQixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7Z0JBQy9CLGdCQUFnQixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7YUFDeEMsQ0FBQyxDQUFDO1NBQ0osQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDN0MsQ0FBQztJQUVNLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxVQUFnRDtRQUM5RSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFTSxLQUFLLENBQUMsWUFBWSxDQUFDLFVBQTBDO1FBQ2xFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQXlDO1FBQ2xFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFTSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsVUFBeUM7UUFDckUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU0sS0FBSyxDQUFDLHNCQUFzQixDQUNqQyxVQUF5QztRQUV6QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFTSxLQUFLLENBQUMsdUJBQXVCLENBQ2xDLFVBQStDO1FBRS9DLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVNLEtBQUssQ0FBQyxxQkFBcUIsQ0FDaEMsVUFBK0M7UUFFL0MsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQztZQUM1RCxHQUFHLEVBQUUsVUFBVSxDQUFDLEdBQUc7WUFDbkIsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJO1lBQ3JCLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTztZQUMzQixHQUFHLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDbEUsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQkFBMkIsQ0FDN0MsVUFBVSxFQUNWLFVBQVUsRUFDVixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FDcEIsQ0FBQztRQUNGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO1lBQzdCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFCLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFTSxLQUFLLENBQUMsdUJBQXVCLENBQ2xDLFVBQTJDO1FBRTNDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVNLEtBQUssQ0FBQyxnQkFBZ0I7UUFDM0IsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFTSxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQWlDO1FBQ3JELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTSxLQUFLLENBQUMsZUFBZSxDQUMxQixVQUFtQztRQUVuQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFrQztRQUN0RCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFzQztRQUMxRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxVQUF5QztRQUNoRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRU0sS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFvQztRQUN6RCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFrQztRQUNyRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFzQztRQUMxRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFpQztRQUNuRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU8sS0FBSyxDQUFDLGFBQWE7UUFDekIsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9DLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUM7b0JBQ0gsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNyQyxDQUFDO3dCQUFTLENBQUM7b0JBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ3ZCLENBQUM7Z0JBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1lBQ3BELENBQUM7WUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUN0QixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDckIsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVPLGFBQWE7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsdUJBQXVCO1FBQ25DLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztDQUNGIn0=
|
|
@@ -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;
|
|
@@ -115,4 +133,4 @@ export interface IGitManagerStatus {
|
|
|
115
133
|
uptimeMs: number;
|
|
116
134
|
smartHttp?: IGitManagerSmartHttpStatus;
|
|
117
135
|
}
|
|
118
|
-
export type { IGitManagerCommitDetail, IGitManagerCommitRequest, IGitManagerCommitSummary, IGitManagerDiff, IGitManagerDiffFile, IGitManagerDiffHunk, IGitManagerDiffLine, IGitManagerDiffRequest, IGitManagerDiffStats, IGitManagerFileContent, IGitManagerImportMirrorRequest, IGitManagerInitBareRepositoryRequest, IGitManagerListCommitsRequest, IGitManagerListTagsRequest, IGitManagerReadFileRequest, IGitManagerRef, IGitManagerRefRequest, IGitManagerRepositoryInfo, IGitManagerRepositorySelector, IGitManagerTag, IGitManagerTagRequest, IGitManagerTreeEntry, IGitManagerTreeRequest, TGitManagerDiffFileStatus, TGitManagerDiffLineKind, TGitManagerObjectType, TGitManagerRefType, TGitManagerTreeEntryType, } from '@foss.global/interfaces';
|
|
136
|
+
export type { IGitManagerCommitDetail, IGitManagerCommitRequest, IGitManagerCommitSummary, IGitManagerDiff, IGitManagerDiffFile, IGitManagerDiffHunk, IGitManagerDiffLine, IGitManagerDiffRequest, IGitManagerDiffStats, IGitManagerFileContent, IGitManagerImportMirrorRequest, IGitManagerInitBareRepositoryRequest, IGitManagerListCommitsRequest, IGitManagerListTagsRequest, IGitManagerMergeRequest, IGitManagerMergeResult, IGitManagerReadFileRequest, IGitManagerRef, IGitManagerRefRequest, IGitManagerRepositoryInfo, IGitManagerRepositorySelector, IGitManagerTag, IGitManagerTagRequest, IGitManagerTreeEntry, IGitManagerTreeRequest, TGitManagerDiffFileStatus, TGitManagerDiffLineKind, TGitManagerMergeMethod, TGitManagerMergeStatus, TGitManagerObjectType, TGitManagerRefType, TGitManagerTreeEntryType, } from '@foss.global/interfaces';
|
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, IGitManagerMergeRequest, IGitManagerMergeResult, 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,9 +18,11 @@ 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[]>;
|
|
25
|
+
mergeRepository(requestArg: IGitManagerMergeRequest): Promise<IGitManagerMergeResult>;
|
|
24
26
|
listTree(requestArg: IGitManagerTreeRequest): Promise<IGitManagerTreeEntry[]>;
|
|
25
27
|
readFile(requestArg: IGitManagerReadFileRequest): Promise<IGitManagerFileContent>;
|
|
26
28
|
listCommits(requestArg: IGitManagerListCommitsRequest): Promise<IGitManagerCommitSummary[]>;
|
|
@@ -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
|
}
|
|
@@ -94,6 +97,9 @@ export class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
94
97
|
async listRefs(requestArg) {
|
|
95
98
|
return this.bridge.sendCommand('listRefs', requestArg);
|
|
96
99
|
}
|
|
100
|
+
async mergeRepository(requestArg) {
|
|
101
|
+
return this.bridge.sendCommand('mergeRepository', requestArg);
|
|
102
|
+
}
|
|
97
103
|
async listTree(requestArg) {
|
|
98
104
|
return this.bridge.sendCommand('listTree', requestArg);
|
|
99
105
|
}
|
|
@@ -116,4 +122,4 @@ export class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
116
122
|
return this.bridge.sendCommand('getTag', requestArg);
|
|
117
123
|
}
|
|
118
124
|
}
|
|
119
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVzdC1naXRtYW5hZ2VyLWJyaWRnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3J1c3QtZ2l0bWFuYWdlci1icmlkZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFnRXhDLFNBQVMsY0FBYztJQUNyQixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakYsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVELFNBQVMsdUJBQXVCO0lBQzlCLE1BQU0sT0FBTyxHQUEyQixFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3pFLE1BQU0sS0FBSyxHQUEyQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDN0MsQ0FBQztBQUVELFNBQVMsZUFBZTtJQUN0QixNQUFNLFdBQVcsR0FBRyxjQUFjLEVBQUUsQ0FBQztJQUNyQyxNQUFNLE1BQU0sR0FBRyx1QkFBdUIsRUFBRSxDQUFDO0lBQ3pDLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUUzQixJQUFJLE1BQU0sRUFBRSxD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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@foss.global/gitmanager",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Headless Git manager for the foss.global Git platform, with a TypeScript API and Rust engine.",
|
|
6
6
|
"exports": {
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"author": "Task Venture Capital GmbH",
|
|
11
11
|
"license": "MIT",
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@foss.global/interfaces": "^0.
|
|
13
|
+
"@foss.global/interfaces": "^0.10.0",
|
|
14
14
|
"@push.rocks/smartrust": "^1.4.0"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
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
|
@@ -10,6 +10,8 @@ import type {
|
|
|
10
10
|
IGitManagerInitBareRepositoryRequest,
|
|
11
11
|
IGitManagerListCommitsRequest,
|
|
12
12
|
IGitManagerListTagsRequest,
|
|
13
|
+
IGitManagerMergeRequest,
|
|
14
|
+
IGitManagerMergeResult,
|
|
13
15
|
IGitManagerReadFileRequest,
|
|
14
16
|
IGitManagerRef,
|
|
15
17
|
IGitManagerRefRequest,
|
|
@@ -18,6 +20,7 @@ import type {
|
|
|
18
20
|
IGitManagerRepositoryBundle,
|
|
19
21
|
IGitManagerRepositoryArchive,
|
|
20
22
|
IGitManagerRepositoryArchiveRequest,
|
|
23
|
+
IGitManagerRepositoryServiceRequest,
|
|
21
24
|
IGitManagerRepositoryInfo,
|
|
22
25
|
IGitManagerRepositorySelector,
|
|
23
26
|
IGitManagerRestoreBundleRequest,
|
|
@@ -32,6 +35,7 @@ import type {
|
|
|
32
35
|
IRustGitManagerConfig,
|
|
33
36
|
} from './models.js';
|
|
34
37
|
import { RustGitManagerBridge } from './rust-gitmanager-bridge.js';
|
|
38
|
+
import { GitManagerRepositoryService } from './classes.repositoryservice.js';
|
|
35
39
|
|
|
36
40
|
export class GitManager extends plugins.EventEmitter {
|
|
37
41
|
private bridge = new RustGitManagerBridge();
|
|
@@ -39,6 +43,7 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
39
43
|
private startPromise: Promise<void> | null = null;
|
|
40
44
|
private stopRequested = false;
|
|
41
45
|
private config: IRustGitManagerConfig;
|
|
46
|
+
private readonly repositoryServices = new Set<GitManagerRepositoryService>();
|
|
42
47
|
|
|
43
48
|
constructor(optionsArg: IGitManagerOptions = {}) {
|
|
44
49
|
super();
|
|
@@ -119,10 +124,12 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
119
124
|
await this.startPromise.catch(() => undefined);
|
|
120
125
|
}
|
|
121
126
|
if (!this.bridge.running) {
|
|
127
|
+
await this.closeRepositoryServices();
|
|
122
128
|
this.started = false;
|
|
123
129
|
return;
|
|
124
130
|
}
|
|
125
131
|
try {
|
|
132
|
+
await this.closeRepositoryServices();
|
|
126
133
|
await this.bridge.stopGitManager();
|
|
127
134
|
} finally {
|
|
128
135
|
this.bridge.kill();
|
|
@@ -221,6 +228,28 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
221
228
|
return this.bridge.createRepositoryArchive(requestArg);
|
|
222
229
|
}
|
|
223
230
|
|
|
231
|
+
public async openRepositoryService(
|
|
232
|
+
requestArg: IGitManagerRepositoryServiceRequest,
|
|
233
|
+
): Promise<GitManagerRepositoryService> {
|
|
234
|
+
this.assertRunning();
|
|
235
|
+
const descriptor = await this.bridge.prepareRepositoryService({
|
|
236
|
+
org: requestArg.org,
|
|
237
|
+
repo: requestArg.repo,
|
|
238
|
+
service: requestArg.service,
|
|
239
|
+
...(requestArg.protocol ? { protocol: requestArg.protocol } : {}),
|
|
240
|
+
});
|
|
241
|
+
const service = new GitManagerRepositoryService(
|
|
242
|
+
descriptor,
|
|
243
|
+
requestArg,
|
|
244
|
+
this.config.dataDir,
|
|
245
|
+
);
|
|
246
|
+
this.repositoryServices.add(service);
|
|
247
|
+
service.completed.finally(() => {
|
|
248
|
+
this.repositoryServices.delete(service);
|
|
249
|
+
}).catch(() => undefined);
|
|
250
|
+
return service;
|
|
251
|
+
}
|
|
252
|
+
|
|
224
253
|
public async restoreRepositoryBundle(
|
|
225
254
|
requestArg: IGitManagerRestoreBundleRequest,
|
|
226
255
|
): Promise<IGitManagerRepositoryInfo> {
|
|
@@ -238,6 +267,13 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
238
267
|
return this.bridge.listRefs(requestArg);
|
|
239
268
|
}
|
|
240
269
|
|
|
270
|
+
public async mergeRepository(
|
|
271
|
+
requestArg: IGitManagerMergeRequest,
|
|
272
|
+
): Promise<IGitManagerMergeResult> {
|
|
273
|
+
this.assertRunning();
|
|
274
|
+
return this.bridge.mergeRepository(requestArg);
|
|
275
|
+
}
|
|
276
|
+
|
|
241
277
|
public async listTree(requestArg: IGitManagerTreeRequest): Promise<IGitManagerTreeEntry[]> {
|
|
242
278
|
this.assertRunning();
|
|
243
279
|
return this.bridge.listTree(requestArg);
|
|
@@ -307,4 +343,10 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
307
343
|
throw new Error('GitManager is not running');
|
|
308
344
|
}
|
|
309
345
|
}
|
|
346
|
+
|
|
347
|
+
private async closeRepositoryServices(): Promise<void> {
|
|
348
|
+
const services = [...this.repositoryServices];
|
|
349
|
+
this.repositoryServices.clear();
|
|
350
|
+
await Promise.all(services.map((service) => service.close()));
|
|
351
|
+
}
|
|
310
352
|
}
|
|
@@ -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;
|
|
@@ -160,6 +186,8 @@ export type {
|
|
|
160
186
|
IGitManagerInitBareRepositoryRequest,
|
|
161
187
|
IGitManagerListCommitsRequest,
|
|
162
188
|
IGitManagerListTagsRequest,
|
|
189
|
+
IGitManagerMergeRequest,
|
|
190
|
+
IGitManagerMergeResult,
|
|
163
191
|
IGitManagerReadFileRequest,
|
|
164
192
|
IGitManagerRef,
|
|
165
193
|
IGitManagerRefRequest,
|
|
@@ -171,6 +199,8 @@ export type {
|
|
|
171
199
|
IGitManagerTreeRequest,
|
|
172
200
|
TGitManagerDiffFileStatus,
|
|
173
201
|
TGitManagerDiffLineKind,
|
|
202
|
+
TGitManagerMergeMethod,
|
|
203
|
+
TGitManagerMergeStatus,
|
|
174
204
|
TGitManagerObjectType,
|
|
175
205
|
TGitManagerRefType,
|
|
176
206
|
TGitManagerTreeEntryType,
|
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';
|
|
@@ -10,6 +10,8 @@ import type {
|
|
|
10
10
|
IGitManagerInitBareRepositoryRequest,
|
|
11
11
|
IGitManagerListCommitsRequest,
|
|
12
12
|
IGitManagerListTagsRequest,
|
|
13
|
+
IGitManagerMergeRequest,
|
|
14
|
+
IGitManagerMergeResult,
|
|
13
15
|
IGitManagerReadFileRequest,
|
|
14
16
|
IGitManagerRef,
|
|
15
17
|
IGitManagerRefRequest,
|
|
@@ -18,6 +20,7 @@ import type {
|
|
|
18
20
|
IGitManagerRepositoryBundle,
|
|
19
21
|
IGitManagerRepositoryArchive,
|
|
20
22
|
IGitManagerRepositoryArchiveRequest,
|
|
23
|
+
IGitManagerRepositoryServiceRequest,
|
|
21
24
|
IGitManagerRepositoryInfo,
|
|
22
25
|
IGitManagerRepositorySelector,
|
|
23
26
|
IGitManagerRestoreBundleRequest,
|
|
@@ -29,6 +32,7 @@ import type {
|
|
|
29
32
|
IGitManagerTreeEntry,
|
|
30
33
|
IGitManagerTreeRequest,
|
|
31
34
|
IRustGitManagerConfig,
|
|
35
|
+
IRustGitManagerRepositoryServiceDescriptor,
|
|
32
36
|
} from './models.js';
|
|
33
37
|
|
|
34
38
|
type TGitManagerCommands = {
|
|
@@ -44,9 +48,11 @@ type TGitManagerCommands = {
|
|
|
44
48
|
verifyRepository: { params: IGitManagerRepositorySelector; result: IGitManagerRepositoryInfo };
|
|
45
49
|
createRepositoryBundle: { params: IGitManagerRepositorySelector; result: IGitManagerRepositoryBundle };
|
|
46
50
|
createRepositoryArchive: { params: IGitManagerRepositoryArchiveRequest; result: IGitManagerRepositoryArchive };
|
|
51
|
+
prepareRepositoryService: { params: IGitManagerRepositoryServiceRequest; result: IRustGitManagerRepositoryServiceDescriptor };
|
|
47
52
|
restoreRepositoryBundle: { params: IGitManagerRestoreBundleRequest; result: IGitManagerRepositoryInfo };
|
|
48
53
|
listRepositories: { params: Record<string, never>; result: IGitManagerRepositoryInfo[] };
|
|
49
54
|
listRefs: { params: IGitManagerRefRequest; result: IGitManagerRef[] };
|
|
55
|
+
mergeRepository: { params: IGitManagerMergeRequest; result: IGitManagerMergeResult };
|
|
50
56
|
listTree: { params: IGitManagerTreeRequest; result: IGitManagerTreeEntry[] };
|
|
51
57
|
readFile: { params: IGitManagerReadFileRequest; result: IGitManagerFileContent };
|
|
52
58
|
listCommits: { params: IGitManagerListCommitsRequest; result: IGitManagerCommitSummary[] };
|
|
@@ -177,6 +183,12 @@ export class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
177
183
|
return this.bridge.sendCommand('createRepositoryArchive', requestArg);
|
|
178
184
|
}
|
|
179
185
|
|
|
186
|
+
public async prepareRepositoryService(
|
|
187
|
+
requestArg: IGitManagerRepositoryServiceRequest,
|
|
188
|
+
): Promise<IRustGitManagerRepositoryServiceDescriptor> {
|
|
189
|
+
return this.bridge.sendCommand('prepareRepositoryService', requestArg);
|
|
190
|
+
}
|
|
191
|
+
|
|
180
192
|
public async restoreRepositoryBundle(
|
|
181
193
|
requestArg: IGitManagerRestoreBundleRequest,
|
|
182
194
|
): Promise<IGitManagerRepositoryInfo> {
|
|
@@ -191,6 +203,12 @@ export class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
191
203
|
return this.bridge.sendCommand('listRefs', requestArg);
|
|
192
204
|
}
|
|
193
205
|
|
|
206
|
+
public async mergeRepository(
|
|
207
|
+
requestArg: IGitManagerMergeRequest,
|
|
208
|
+
): Promise<IGitManagerMergeResult> {
|
|
209
|
+
return this.bridge.sendCommand('mergeRepository', requestArg);
|
|
210
|
+
}
|
|
211
|
+
|
|
194
212
|
public async listTree(requestArg: IGitManagerTreeRequest): Promise<IGitManagerTreeEntry[]> {
|
|
195
213
|
return this.bridge.sendCommand('listTree', requestArg);
|
|
196
214
|
}
|