@foss.global/gitmanager 0.2.0 → 0.4.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 +22 -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 +9 -1
- package/dist_ts/classes.gitmanager.js +64 -1
- package/dist_ts/models.d.ts +48 -1
- package/dist_ts/rust-gitmanager-bridge.d.ts +9 -1
- package/dist_ts/rust-gitmanager-bridge.js +25 -1
- package/package.json +5 -5
- package/readme.md +79 -5
- package/thirdparty.md +30 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.gitmanager.ts +85 -0
- package/ts/models.ts +67 -0
- package/ts/rust-gitmanager-bridge.ts +52 -0
package/changelog.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-07-20 - 0.4.0
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- add bounded read-only Git Smart HTTP transport (git)
|
|
8
|
+
- Serve clone and fetch through the Rust engine with Git protocol v0, v1, and v2 upload-pack support.
|
|
9
|
+
- Add default-deny repository access, revision-aware visibility updates, loopback-safe binding, transfer concurrency, request/response limits, timeouts, and graceful shutdown.
|
|
10
|
+
- Reject receive-pack and mask unavailable repositories with the same not-found response.
|
|
11
|
+
|
|
12
|
+
### Maintenance
|
|
13
|
+
|
|
14
|
+
- adopt `@foss.global/interfaces` 0.4 and update policy-eligible development tooling versions (tooling)
|
|
15
|
+
|
|
16
|
+
## 2026-06-23 - 0.3.0
|
|
17
|
+
|
|
18
|
+
### Features
|
|
19
|
+
|
|
20
|
+
- add commit detail, diff, and tag APIs (api)
|
|
21
|
+
- Expose getCommit, getDiff, listTags, and getTag through the TypeScript facade and Rust bridge.
|
|
22
|
+
- Implement Rust IPC handlers and git operations for commit metadata, structured diffs, and lightweight or annotated tag metadata.
|
|
23
|
+
- Update README coverage and integration tests for the new APIs.
|
|
24
|
+
|
|
3
25
|
## 2026-06-22 - 0.2.0
|
|
4
26
|
|
|
5
27
|
### Features
|
|
Binary file
|
|
Binary file
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@foss.global/gitmanager',
|
|
6
|
-
version: '0.
|
|
6
|
+
version: '0.4.0',
|
|
7
7
|
description: 'Headless Git manager for the foss.global Git platform, with a TypeScript API and Rust engine.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx5QkFBeUI7SUFDL0IsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLCtGQUErRjtDQUM3RyxDQUFBIn0=
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
|
-
import type { IGitManagerCommitSummary, IGitManagerFileContent, IGitManagerImportMirrorRequest, IGitManagerInitBareRepositoryRequest, IGitManagerListCommitsRequest, IGitManagerReadFileRequest, IGitManagerRef, IGitManagerRefRequest, IGitManagerRepositoryInfo, IGitManagerStatus, IGitManagerTreeEntry, IGitManagerTreeRequest, IGitManagerOptions } from './models.js';
|
|
2
|
+
import type { IGitManagerCommitDetail, IGitManagerCommitRequest, IGitManagerCommitSummary, IGitManagerDiff, IGitManagerDiffRequest, IGitManagerFileContent, IGitManagerImportMirrorRequest, IGitManagerInitBareRepositoryRequest, IGitManagerListCommitsRequest, IGitManagerListTagsRequest, IGitManagerReadFileRequest, IGitManagerRef, IGitManagerRefRequest, IGitManagerRepositorySelector, IGitManagerRepositoryInfo, IGitManagerSmartHttpRepositoryAccess, IGitManagerSmartHttpRepositoryVisibility, IGitManagerStatus, IGitManagerTag, IGitManagerTagRequest, IGitManagerTreeEntry, IGitManagerTreeRequest, IGitManagerOptions } from './models.js';
|
|
3
3
|
export declare class GitManager extends plugins.EventEmitter {
|
|
4
4
|
private bridge;
|
|
5
5
|
private started;
|
|
@@ -10,14 +10,22 @@ export declare class GitManager extends plugins.EventEmitter {
|
|
|
10
10
|
start(): Promise<void>;
|
|
11
11
|
stop(): Promise<void>;
|
|
12
12
|
getStatus(): Promise<IGitManagerStatus>;
|
|
13
|
+
setSmartHttpRepositoryAccess(accessArg: IGitManagerSmartHttpRepositoryAccess): Promise<void>;
|
|
14
|
+
setSmartHttpRepositoryVisibility(visibilityArg: IGitManagerSmartHttpRepositoryVisibility): Promise<void>;
|
|
13
15
|
get running(): boolean;
|
|
14
16
|
initBareRepository(requestArg: IGitManagerInitBareRepositoryRequest): Promise<IGitManagerRepositoryInfo>;
|
|
15
17
|
importMirror(requestArg: IGitManagerImportMirrorRequest): Promise<IGitManagerRepositoryInfo>;
|
|
18
|
+
refreshMirror(requestArg: IGitManagerRepositorySelector): Promise<IGitManagerRepositoryInfo>;
|
|
19
|
+
verifyRepository(requestArg: IGitManagerRepositorySelector): Promise<IGitManagerRepositoryInfo>;
|
|
16
20
|
listRepositories(): Promise<IGitManagerRepositoryInfo[]>;
|
|
17
21
|
listRefs(requestArg: IGitManagerRefRequest): Promise<IGitManagerRef[]>;
|
|
18
22
|
listTree(requestArg: IGitManagerTreeRequest): Promise<IGitManagerTreeEntry[]>;
|
|
19
23
|
readFile(requestArg: IGitManagerReadFileRequest): Promise<IGitManagerFileContent>;
|
|
20
24
|
listCommits(requestArg: IGitManagerListCommitsRequest): Promise<IGitManagerCommitSummary[]>;
|
|
25
|
+
getCommit(requestArg: IGitManagerCommitRequest): Promise<IGitManagerCommitDetail>;
|
|
26
|
+
getDiff(requestArg: IGitManagerDiffRequest): Promise<IGitManagerDiff>;
|
|
27
|
+
listTags(requestArg: IGitManagerListTagsRequest): Promise<IGitManagerTag[]>;
|
|
28
|
+
getTag(requestArg: IGitManagerTagRequest): Promise<IGitManagerTag>;
|
|
21
29
|
private startInternal;
|
|
22
30
|
private assertRunning;
|
|
23
31
|
}
|
|
@@ -7,8 +7,28 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
7
7
|
this.started = false;
|
|
8
8
|
this.startPromise = null;
|
|
9
9
|
this.stopRequested = false;
|
|
10
|
+
const smartHttpOptions = optionsArg.smartHttp;
|
|
10
11
|
this.config = {
|
|
11
12
|
dataDir: optionsArg.dataDir ?? plugins.path.resolve(process.cwd(), '.nogit', 'gitmanager'),
|
|
13
|
+
smartHttp: smartHttpOptions && smartHttpOptions.enabled !== false
|
|
14
|
+
? {
|
|
15
|
+
bindAddress: smartHttpOptions.bindAddress ?? '127.0.0.1',
|
|
16
|
+
port: smartHttpOptions.port ?? 0,
|
|
17
|
+
allowUnsafeNonLoopback: smartHttpOptions.allowUnsafeNonLoopback ?? false,
|
|
18
|
+
allowAllRepositories: smartHttpOptions.allowAllRepositories ?? false,
|
|
19
|
+
allowedRepositories: smartHttpOptions.allowedRepositories?.map((repository) => ({
|
|
20
|
+
org: repository.org,
|
|
21
|
+
repo: repository.repo,
|
|
22
|
+
})) ?? [],
|
|
23
|
+
maxConcurrentTransfers: smartHttpOptions.maxConcurrentTransfers ?? 32,
|
|
24
|
+
maxRequestBodyBytes: smartHttpOptions.maxRequestBodyBytes ?? 16 * 1024 * 1024,
|
|
25
|
+
maxAdvertisementBytes: smartHttpOptions.maxAdvertisementBytes ?? 4 * 1024 * 1024,
|
|
26
|
+
maxResponseBytes: smartHttpOptions.maxResponseBytes ?? 4 * 1024 * 1024 * 1024,
|
|
27
|
+
processTimeoutMs: smartHttpOptions.processTimeoutMs ?? 30 * 60 * 1000,
|
|
28
|
+
idleTimeoutSeconds: smartHttpOptions.idleTimeoutSeconds ?? 300,
|
|
29
|
+
gracefulShutdownMs: smartHttpOptions.gracefulShutdownMs ?? 10_000,
|
|
30
|
+
}
|
|
31
|
+
: undefined,
|
|
12
32
|
};
|
|
13
33
|
this.bridge.on('exit', (code, signal) => {
|
|
14
34
|
this.started = false;
|
|
@@ -61,6 +81,25 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
61
81
|
}
|
|
62
82
|
return this.bridge.getStatus();
|
|
63
83
|
}
|
|
84
|
+
async setSmartHttpRepositoryAccess(accessArg) {
|
|
85
|
+
this.assertRunning();
|
|
86
|
+
return this.bridge.setSmartHttpRepositoryAccess({
|
|
87
|
+
allowAllRepositories: accessArg.allowAllRepositories,
|
|
88
|
+
allowedRepositories: accessArg.allowedRepositories.map((repository) => ({
|
|
89
|
+
org: repository.org,
|
|
90
|
+
repo: repository.repo,
|
|
91
|
+
})),
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
async setSmartHttpRepositoryVisibility(visibilityArg) {
|
|
95
|
+
this.assertRunning();
|
|
96
|
+
return this.bridge.setSmartHttpRepositoryVisibility({
|
|
97
|
+
org: visibilityArg.org,
|
|
98
|
+
repo: visibilityArg.repo,
|
|
99
|
+
public: visibilityArg.public,
|
|
100
|
+
revision: visibilityArg.revision,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
64
103
|
get running() {
|
|
65
104
|
return this.started && this.bridge.running;
|
|
66
105
|
}
|
|
@@ -72,6 +111,14 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
72
111
|
this.assertRunning();
|
|
73
112
|
return this.bridge.importMirror(requestArg);
|
|
74
113
|
}
|
|
114
|
+
async refreshMirror(requestArg) {
|
|
115
|
+
this.assertRunning();
|
|
116
|
+
return this.bridge.refreshMirror(requestArg);
|
|
117
|
+
}
|
|
118
|
+
async verifyRepository(requestArg) {
|
|
119
|
+
this.assertRunning();
|
|
120
|
+
return this.bridge.verifyRepository(requestArg);
|
|
121
|
+
}
|
|
75
122
|
async listRepositories() {
|
|
76
123
|
this.assertRunning();
|
|
77
124
|
return this.bridge.listRepositories();
|
|
@@ -92,6 +139,22 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
92
139
|
this.assertRunning();
|
|
93
140
|
return this.bridge.listCommits(requestArg);
|
|
94
141
|
}
|
|
142
|
+
async getCommit(requestArg) {
|
|
143
|
+
this.assertRunning();
|
|
144
|
+
return this.bridge.getCommit(requestArg);
|
|
145
|
+
}
|
|
146
|
+
async getDiff(requestArg) {
|
|
147
|
+
this.assertRunning();
|
|
148
|
+
return this.bridge.getDiff(requestArg);
|
|
149
|
+
}
|
|
150
|
+
async listTags(requestArg) {
|
|
151
|
+
this.assertRunning();
|
|
152
|
+
return this.bridge.listTags(requestArg);
|
|
153
|
+
}
|
|
154
|
+
async getTag(requestArg) {
|
|
155
|
+
this.assertRunning();
|
|
156
|
+
return this.bridge.getTag(requestArg);
|
|
157
|
+
}
|
|
95
158
|
async startInternal() {
|
|
96
159
|
const spawned = await this.bridge.spawn();
|
|
97
160
|
if (!spawned) {
|
|
@@ -127,4 +190,4 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
127
190
|
}
|
|
128
191
|
}
|
|
129
192
|
}
|
|
130
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
193
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5naXRtYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5naXRtYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBMkJ4QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVuRSxNQUFNLE9BQU8sVUFBVyxTQUFRLE9BQU8sQ0FBQyxZQUFZO0lBT2xELFlBQVksYUFBaUMsRUFBRTtRQUM3QyxLQUFLLEVBQUUsQ0FBQztRQVBGLFdBQU0sR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDcEMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixpQkFBWSxHQUF5QixJQUFJLENBQUM7UUFDMUMsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFLNUIsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDO1FBQzlDLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDWixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsUUFBUSxFQUFFLFlBQVksQ0FBQztZQUMxRixTQUFTLEVBQUUsZ0JBQWdCLElBQUksZ0JBQWdCLENBQUMsT0FBTyxLQUFLLEtBQUs7Z0JBQy9ELENBQUMsQ0FBQztvQkFDRSxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsV0FBVyxJQUFJLFdBQVc7b0JBQ3hELElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLElBQUksQ0FBQztvQkFDaEMsc0JBQXNCLEVBQUUsZ0JBQWdCLENBQUMsc0JBQXNCLElBQUksS0FBSztvQkFDeEUsb0JBQW9CLEVBQUUsZ0JBQWdCLENBQUMsb0JBQW9CLElBQUksS0FBSztvQkFDcEUsbUJBQW1CLEVBQUUsZ0JBQWdCLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLENBQUMs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
|
package/dist_ts/models.d.ts
CHANGED
|
@@ -1,12 +1,59 @@
|
|
|
1
|
+
import type { IGitManagerRepositorySelector } from '@foss.global/interfaces';
|
|
2
|
+
export interface IGitManagerSmartHttpOptions {
|
|
3
|
+
enabled?: boolean;
|
|
4
|
+
bindAddress?: string;
|
|
5
|
+
port?: number;
|
|
6
|
+
allowUnsafeNonLoopback?: boolean;
|
|
7
|
+
allowAllRepositories?: boolean;
|
|
8
|
+
allowedRepositories?: IGitManagerRepositorySelector[];
|
|
9
|
+
maxConcurrentTransfers?: number;
|
|
10
|
+
maxRequestBodyBytes?: number;
|
|
11
|
+
maxAdvertisementBytes?: number;
|
|
12
|
+
maxResponseBytes?: number;
|
|
13
|
+
processTimeoutMs?: number;
|
|
14
|
+
idleTimeoutSeconds?: number;
|
|
15
|
+
gracefulShutdownMs?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface IGitManagerSmartHttpRepositoryAccess {
|
|
18
|
+
allowAllRepositories: boolean;
|
|
19
|
+
allowedRepositories: IGitManagerRepositorySelector[];
|
|
20
|
+
}
|
|
21
|
+
export interface IGitManagerSmartHttpRepositoryVisibility extends IGitManagerRepositorySelector {
|
|
22
|
+
public: boolean;
|
|
23
|
+
revision: number;
|
|
24
|
+
}
|
|
1
25
|
export interface IGitManagerOptions {
|
|
2
26
|
dataDir?: string;
|
|
27
|
+
smartHttp?: IGitManagerSmartHttpOptions;
|
|
28
|
+
}
|
|
29
|
+
export interface IRustGitManagerSmartHttpConfig {
|
|
30
|
+
bindAddress: string;
|
|
31
|
+
port: number;
|
|
32
|
+
allowUnsafeNonLoopback: boolean;
|
|
33
|
+
allowAllRepositories: boolean;
|
|
34
|
+
allowedRepositories: IGitManagerRepositorySelector[];
|
|
35
|
+
maxConcurrentTransfers: number;
|
|
36
|
+
maxRequestBodyBytes: number;
|
|
37
|
+
maxAdvertisementBytes: number;
|
|
38
|
+
maxResponseBytes: number;
|
|
39
|
+
processTimeoutMs: number;
|
|
40
|
+
idleTimeoutSeconds: number;
|
|
41
|
+
gracefulShutdownMs: number;
|
|
3
42
|
}
|
|
4
43
|
export interface IRustGitManagerConfig {
|
|
5
44
|
dataDir: string;
|
|
45
|
+
smartHttp?: IRustGitManagerSmartHttpConfig;
|
|
46
|
+
}
|
|
47
|
+
export interface IGitManagerSmartHttpStatus {
|
|
48
|
+
running: boolean;
|
|
49
|
+
bindAddress: string;
|
|
50
|
+
port: number;
|
|
51
|
+
baseUrl: string;
|
|
6
52
|
}
|
|
7
53
|
export interface IGitManagerStatus {
|
|
8
54
|
running: boolean;
|
|
9
55
|
dataDir: string;
|
|
10
56
|
uptimeMs: number;
|
|
57
|
+
smartHttp?: IGitManagerSmartHttpStatus;
|
|
11
58
|
}
|
|
12
|
-
export type { IGitManagerCommitSummary, IGitManagerFileContent, IGitManagerImportMirrorRequest, IGitManagerInitBareRepositoryRequest, IGitManagerListCommitsRequest, IGitManagerReadFileRequest, IGitManagerRef, IGitManagerRefRequest, IGitManagerRepositoryInfo, IGitManagerRepositorySelector, IGitManagerTreeEntry, IGitManagerTreeRequest, TGitManagerObjectType, TGitManagerRefType, TGitManagerTreeEntryType, } from '@foss.global/interfaces';
|
|
59
|
+
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';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
|
-
import type { IGitManagerCommitSummary, IGitManagerFileContent, IGitManagerImportMirrorRequest, IGitManagerInitBareRepositoryRequest, IGitManagerListCommitsRequest, IGitManagerReadFileRequest, IGitManagerRef, IGitManagerRefRequest, IGitManagerRepositoryInfo, IGitManagerStatus, IGitManagerTreeEntry, IGitManagerTreeRequest, IRustGitManagerConfig } from './models.js';
|
|
2
|
+
import type { IGitManagerCommitDetail, IGitManagerCommitRequest, IGitManagerCommitSummary, IGitManagerDiff, IGitManagerDiffRequest, IGitManagerFileContent, IGitManagerImportMirrorRequest, IGitManagerInitBareRepositoryRequest, IGitManagerListCommitsRequest, IGitManagerListTagsRequest, IGitManagerReadFileRequest, IGitManagerRef, IGitManagerRefRequest, IGitManagerRepositorySelector, IGitManagerRepositoryInfo, IGitManagerSmartHttpRepositoryAccess, IGitManagerSmartHttpRepositoryVisibility, IGitManagerStatus, IGitManagerTag, IGitManagerTagRequest, IGitManagerTreeEntry, IGitManagerTreeRequest, IRustGitManagerConfig } from './models.js';
|
|
3
3
|
export declare class RustGitManagerBridge extends plugins.EventEmitter {
|
|
4
4
|
private bridge;
|
|
5
5
|
constructor();
|
|
@@ -9,11 +9,19 @@ export declare class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
9
9
|
startGitManager(configArg: IRustGitManagerConfig): Promise<void>;
|
|
10
10
|
stopGitManager(): Promise<void>;
|
|
11
11
|
getStatus(): Promise<IGitManagerStatus>;
|
|
12
|
+
setSmartHttpRepositoryAccess(accessArg: IGitManagerSmartHttpRepositoryAccess): Promise<void>;
|
|
13
|
+
setSmartHttpRepositoryVisibility(visibilityArg: IGitManagerSmartHttpRepositoryVisibility): Promise<void>;
|
|
12
14
|
initBareRepository(requestArg: IGitManagerInitBareRepositoryRequest): Promise<IGitManagerRepositoryInfo>;
|
|
13
15
|
importMirror(requestArg: IGitManagerImportMirrorRequest): Promise<IGitManagerRepositoryInfo>;
|
|
16
|
+
refreshMirror(requestArg: IGitManagerRepositorySelector): Promise<IGitManagerRepositoryInfo>;
|
|
17
|
+
verifyRepository(requestArg: IGitManagerRepositorySelector): Promise<IGitManagerRepositoryInfo>;
|
|
14
18
|
listRepositories(): Promise<IGitManagerRepositoryInfo[]>;
|
|
15
19
|
listRefs(requestArg: IGitManagerRefRequest): Promise<IGitManagerRef[]>;
|
|
16
20
|
listTree(requestArg: IGitManagerTreeRequest): Promise<IGitManagerTreeEntry[]>;
|
|
17
21
|
readFile(requestArg: IGitManagerReadFileRequest): Promise<IGitManagerFileContent>;
|
|
18
22
|
listCommits(requestArg: IGitManagerListCommitsRequest): Promise<IGitManagerCommitSummary[]>;
|
|
23
|
+
getCommit(requestArg: IGitManagerCommitRequest): Promise<IGitManagerCommitDetail>;
|
|
24
|
+
getDiff(requestArg: IGitManagerDiffRequest): Promise<IGitManagerDiff>;
|
|
25
|
+
listTags(requestArg: IGitManagerListTagsRequest): Promise<IGitManagerTag[]>;
|
|
26
|
+
getTag(requestArg: IGitManagerTagRequest): Promise<IGitManagerTag>;
|
|
19
27
|
}
|
|
@@ -58,12 +58,24 @@ export class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
58
58
|
async getStatus() {
|
|
59
59
|
return this.bridge.sendCommand('getStatus', {});
|
|
60
60
|
}
|
|
61
|
+
async setSmartHttpRepositoryAccess(accessArg) {
|
|
62
|
+
await this.bridge.sendCommand('setSmartHttpRepositoryAccess', accessArg);
|
|
63
|
+
}
|
|
64
|
+
async setSmartHttpRepositoryVisibility(visibilityArg) {
|
|
65
|
+
await this.bridge.sendCommand('setSmartHttpRepositoryVisibility', visibilityArg);
|
|
66
|
+
}
|
|
61
67
|
async initBareRepository(requestArg) {
|
|
62
68
|
return this.bridge.sendCommand('initBareRepository', requestArg);
|
|
63
69
|
}
|
|
64
70
|
async importMirror(requestArg) {
|
|
65
71
|
return this.bridge.sendCommand('importMirror', requestArg);
|
|
66
72
|
}
|
|
73
|
+
async refreshMirror(requestArg) {
|
|
74
|
+
return this.bridge.sendCommand('refreshMirror', requestArg);
|
|
75
|
+
}
|
|
76
|
+
async verifyRepository(requestArg) {
|
|
77
|
+
return this.bridge.sendCommand('verifyRepository', requestArg);
|
|
78
|
+
}
|
|
67
79
|
async listRepositories() {
|
|
68
80
|
return this.bridge.sendCommand('listRepositories', {});
|
|
69
81
|
}
|
|
@@ -79,5 +91,17 @@ export class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
79
91
|
async listCommits(requestArg) {
|
|
80
92
|
return this.bridge.sendCommand('listCommits', requestArg);
|
|
81
93
|
}
|
|
94
|
+
async getCommit(requestArg) {
|
|
95
|
+
return this.bridge.sendCommand('getCommit', requestArg);
|
|
96
|
+
}
|
|
97
|
+
async getDiff(requestArg) {
|
|
98
|
+
return this.bridge.sendCommand('getDiff', requestArg);
|
|
99
|
+
}
|
|
100
|
+
async listTags(requestArg) {
|
|
101
|
+
return this.bridge.sendCommand('listTags', requestArg);
|
|
102
|
+
}
|
|
103
|
+
async getTag(requestArg) {
|
|
104
|
+
return this.bridge.sendCommand('getTag', requestArg);
|
|
105
|
+
}
|
|
82
106
|
}
|
|
83
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVzdC1naXRtYW5hZ2VyLWJyaWRnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3J1c3QtZ2l0bWFuYWdlci1icmlkZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFnRHhDLFNBQVMsY0FBYztJQUNyQixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakYsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVELFNBQVMsdUJBQXVCO0lBQzlCLE1BQU0sT0FBTyxHQUEyQixFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3pFLE1BQU0sS0FBSyxHQUEyQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDN0MsQ0FBQztBQUVELFNBQVMsZUFBZTtJQUN0QixNQUFNLFdBQVcsR0FBRyxjQUFjLEVBQUUsQ0FBQztJQUNyQyxNQUFNLE1BQU0sR0FBRyx1QkFBdUIsRUFBRSxDQUFDO0lBQ3pDLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUUzQixJQUFJLE1BQU0sRUFBRSxD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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@foss.global/gitmanager",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.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,16 +10,16 @@
|
|
|
10
10
|
"author": "Task Venture Capital GmbH",
|
|
11
11
|
"license": "MIT",
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@foss.global/interfaces": "^0.
|
|
13
|
+
"@foss.global/interfaces": "^0.4.0",
|
|
14
14
|
"@push.rocks/smartrust": "^1.4.0"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
17
|
"@git.zone/tsbuild": "^4.4.2",
|
|
18
18
|
"@git.zone/tsdoc": "^2.1.1",
|
|
19
|
-
"@git.zone/tsrun": "^2.0.
|
|
20
|
-
"@git.zone/tsrust": "^1.
|
|
19
|
+
"@git.zone/tsrun": "^2.0.5",
|
|
20
|
+
"@git.zone/tsrust": "^1.6.0",
|
|
21
21
|
"@git.zone/tstest": "^3.6.6",
|
|
22
|
-
"@types/node": "^26.
|
|
22
|
+
"@types/node": "^26.1.1"
|
|
23
23
|
},
|
|
24
24
|
"files": [
|
|
25
25
|
"ts/**/*",
|
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
|
|
7
|
+
The current implementation provides lifecycle IPC, local bare repository and mirror management, bounded read APIs, and a read-only Git Smart HTTP transport for clone and fetch. SSH transport, authenticated private-repository serving, and write/admin features are outside this package's current scope.
|
|
8
8
|
|
|
9
9
|
## Issue Reporting and Security
|
|
10
10
|
|
|
@@ -47,12 +47,82 @@ const readme = await gitManager.readFile({
|
|
|
47
47
|
await gitManager.stop();
|
|
48
48
|
```
|
|
49
49
|
|
|
50
|
+
## Read-only Git Smart HTTP
|
|
51
|
+
|
|
52
|
+
Smart HTTP is disabled unless a `smartHttp` options object is provided. The safe defaults bind to loopback on an operating-system-assigned port and expose no repositories:
|
|
53
|
+
|
|
54
|
+
```ts
|
|
55
|
+
const gitManager = new GitManager({
|
|
56
|
+
dataDir: '/var/lib/foss-global/gitmanager',
|
|
57
|
+
smartHttp: {
|
|
58
|
+
allowedRepositories: [
|
|
59
|
+
{ org: 'foss.global', repo: 'interfaces' },
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
await gitManager.start();
|
|
65
|
+
const status = await gitManager.getStatus();
|
|
66
|
+
console.log(status.smartHttp?.baseUrl);
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
The server implements `git-upload-pack` for clone and fetch with Git protocol versions 0, 1, and 2. `git-receive-pack` is disabled. Missing and inaccessible repositories both return the same not-found response.
|
|
70
|
+
|
|
71
|
+
The transport has no TLS termination or authenticated private-repository access. Keep it on loopback behind a bounded ingress that owns TLS and authentication. Binding to a non-loopback IP is rejected unless `allowUnsafeNonLoopback: true` is set explicitly.
|
|
72
|
+
|
|
73
|
+
Smart HTTP option defaults and accepted ranges:
|
|
74
|
+
|
|
75
|
+
All numeric options must be integers.
|
|
76
|
+
|
|
77
|
+
- `enabled`: enabled when the `smartHttp` object is present unless explicitly `false`.
|
|
78
|
+
- `bindAddress`: `127.0.0.1`; must be an IP address.
|
|
79
|
+
- `port`: `0`, allowing the operating system to select an available port; accepted range 0–65,535.
|
|
80
|
+
- `allowUnsafeNonLoopback`: `false`.
|
|
81
|
+
- `allowAllRepositories`: `false`.
|
|
82
|
+
- `allowedRepositories`: `[]`, with at most 100,000 entries.
|
|
83
|
+
- `maxConcurrentTransfers`: `32`; accepted range 1–1,024.
|
|
84
|
+
- `maxRequestBodyBytes`: 16 MiB; accepted range 1 KiB–64 MiB.
|
|
85
|
+
- `maxAdvertisementBytes`: 4 MiB; accepted range 1 KiB–64 MiB.
|
|
86
|
+
- `maxResponseBytes`: 4 GiB; accepted range 1 MiB–16 TiB.
|
|
87
|
+
- `processTimeoutMs`: 1,800,000; accepted range 1,000–86,400,000.
|
|
88
|
+
- `idleTimeoutSeconds`: `300`; accepted range 1–3,600.
|
|
89
|
+
- `gracefulShutdownMs`: `10,000`; accepted range 100–60,000.
|
|
90
|
+
|
|
91
|
+
While the service is running, access can be replaced atomically:
|
|
92
|
+
|
|
93
|
+
```ts
|
|
94
|
+
await gitManager.setSmartHttpRepositoryAccess({
|
|
95
|
+
allowAllRepositories: false,
|
|
96
|
+
allowedRepositories: [
|
|
97
|
+
{ org: 'foss.global', repo: 'interfaces' },
|
|
98
|
+
{ org: 'foss.global', repo: 'gitmanager' },
|
|
99
|
+
],
|
|
100
|
+
});
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
`setSmartHttpRepositoryAccess()` replaces the complete allow-all/allowlist state and resets per-repository visibility revision watermarks. For ordered visibility events, keep `allowAllRepositories` disabled and update one repository at a time:
|
|
104
|
+
|
|
105
|
+
```ts
|
|
106
|
+
await gitManager.setSmartHttpRepositoryVisibility({
|
|
107
|
+
org: 'foss.global',
|
|
108
|
+
repo: 'gitmanager',
|
|
109
|
+
public: true,
|
|
110
|
+
revision: 42,
|
|
111
|
+
});
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Use monotonic, non-negative safe integers for `revision`. Stale revisions are ignored, equal revisions are idempotent when their visibility matches, conflicting equal revisions fail, and newer revisions replace the previous visibility state.
|
|
115
|
+
|
|
116
|
+
When enabled, `getStatus().smartHttp` reports `{ running, bindAddress, port, baseUrl }`. The server also exposes `GET /healthz` for a local ingress health check.
|
|
117
|
+
|
|
50
118
|
## Public API
|
|
51
119
|
|
|
52
120
|
- `GitManager`: TypeScript facade for the Rust engine lifecycle.
|
|
53
121
|
- `GitManager.start()`: spawns the Rust binary through `smartrust` and starts the engine.
|
|
54
122
|
- `GitManager.stop()`: asks the engine to stop and always kills the bridge process in cleanup.
|
|
55
|
-
- `GitManager.getStatus()`: returns `{ running, dataDir, uptimeMs }`.
|
|
123
|
+
- `GitManager.getStatus()`: returns `{ running, dataDir, uptimeMs, smartHttp? }`.
|
|
124
|
+
- `GitManager.setSmartHttpRepositoryAccess()`: atomically replaces the running Smart HTTP allow-all/allowlist state.
|
|
125
|
+
- `GitManager.setSmartHttpRepositoryVisibility()`: applies one revision-ordered repository visibility update.
|
|
56
126
|
- `GitManager.initBareRepository()`: creates an empty local bare repository.
|
|
57
127
|
- `GitManager.importMirror()`: imports a remote repository with `git clone --mirror`. Supported remote forms are `https://`, `http://`, `ssh://`, `git://`, `file://`, and SCP-like `git@host:org/repo.git` URLs.
|
|
58
128
|
- `GitManager.listRepositories()`: lists local repositories managed below the configured data directory.
|
|
@@ -60,15 +130,19 @@ await gitManager.stop();
|
|
|
60
130
|
- `GitManager.listTree()`: lists tree entries at a ref and optional path.
|
|
61
131
|
- `GitManager.readFile()`: reads a blob as base64 after checking the blob size limit.
|
|
62
132
|
- `GitManager.listCommits()`: lists commit summaries for a ref.
|
|
133
|
+
- `GitManager.getCommit()`: reads commit detail metadata, parents, author/committer data, and diff stats for a ref.
|
|
134
|
+
- `GitManager.getDiff()`: returns a structured unified diff between a head ref and its first parent or an explicit base ref.
|
|
135
|
+
- `GitManager.listTags()`: lists lightweight and annotated tags with target object metadata.
|
|
136
|
+
- `GitManager.getTag()`: reads one tag by exact name.
|
|
63
137
|
- `GitManager.running`: local facade running state.
|
|
64
138
|
- `RustGitManagerBridge`: lower-level typed bridge around `@push.rocks/smartrust`.
|
|
65
139
|
- `IGitManagerOptions`, `IGitManagerStatus`, `IRustGitManagerConfig`: exported option/status contracts.
|
|
66
140
|
|
|
67
141
|
Repository/read DTO contracts are re-exported from the published `@foss.global/interfaces` package.
|
|
68
142
|
|
|
69
|
-
Read/list APIs go through JSON IPC. Git packfile streaming for clone
|
|
143
|
+
Read/list APIs go through JSON IPC. Git packfile streaming for clone and fetch is served directly by the Rust engine through controlled `git upload-pack` subprocesses; packfiles do not pass through JSON IPC. Push is not supported.
|
|
70
144
|
|
|
71
|
-
|
|
145
|
+
Read APIs and Smart HTTP use the system `git` CLI with explicit arguments, non-interactive environment variables, command timeouts, ref-to-object-id resolution, path validation, bounded stdout/stderr capture, ref/tree result caps, and a 1 MiB file read cap.
|
|
72
146
|
|
|
73
147
|
## Rust Build
|
|
74
148
|
|
|
@@ -89,7 +163,7 @@ pnpm run test:rust
|
|
|
89
163
|
pnpm run build
|
|
90
164
|
```
|
|
91
165
|
|
|
92
|
-
`pnpm test` runs the `pretest` hook first, which builds the Rust binaries with `tsrust`, and then runs lifecycle
|
|
166
|
+
`pnpm test` runs the `pretest` hook first, which builds the Rust binaries with `tsrust`, and then runs lifecycle, local mirror/read API, and bounded Smart HTTP clone/fetch tests through `smartrust`.
|
|
93
167
|
|
|
94
168
|
## License and Legal Information
|
|
95
169
|
|
package/thirdparty.md
CHANGED
|
@@ -11,6 +11,9 @@ This package bundles Rust binaries in `dist_rust/`. Those binaries are built fro
|
|
|
11
11
|
| anstyle-query | 1.1.5 | Apache-2.0 OR MIT |
|
|
12
12
|
| anstyle-wincon | 3.0.11 | Apache-2.0 OR MIT |
|
|
13
13
|
| anyhow | 1.0.102 | Apache-2.0 OR MIT |
|
|
14
|
+
| atomic-waker | 1.1.2 | Apache-2.0 OR MIT |
|
|
15
|
+
| axum | 0.8.9 | MIT |
|
|
16
|
+
| axum-core | 0.5.6 | MIT |
|
|
14
17
|
| base64 | 0.22.1 | Apache-2.0 OR MIT |
|
|
15
18
|
| bitflags | 2.13.0 | Apache-2.0 OR MIT |
|
|
16
19
|
| bytes | 1.12.0 | MIT |
|
|
@@ -21,7 +24,21 @@ This package bundles Rust binaries in `dist_rust/`. Those binaries are built fro
|
|
|
21
24
|
| clap_lex | 1.1.0 | Apache-2.0 OR MIT |
|
|
22
25
|
| colorchoice | 1.0.5 | Apache-2.0 OR MIT |
|
|
23
26
|
| errno | 0.3.14 | Apache-2.0 OR MIT |
|
|
27
|
+
| form_urlencoded | 1.2.2 | Apache-2.0 OR MIT |
|
|
28
|
+
| futures-channel | 0.3.33 | Apache-2.0 OR MIT |
|
|
29
|
+
| futures-core | 0.3.33 | Apache-2.0 OR MIT |
|
|
30
|
+
| futures-macro | 0.3.33 | Apache-2.0 OR MIT |
|
|
31
|
+
| futures-sink | 0.3.33 | Apache-2.0 OR MIT |
|
|
32
|
+
| futures-task | 0.3.33 | Apache-2.0 OR MIT |
|
|
33
|
+
| futures-util | 0.3.33 | Apache-2.0 OR MIT |
|
|
24
34
|
| heck | 0.5.0 | Apache-2.0 OR MIT |
|
|
35
|
+
| http | 1.4.2 | Apache-2.0 OR MIT |
|
|
36
|
+
| http-body | 1.1.0 | MIT |
|
|
37
|
+
| http-body-util | 0.1.4 | MIT |
|
|
38
|
+
| httparse | 1.10.1 | Apache-2.0 OR MIT |
|
|
39
|
+
| httpdate | 1.0.3 | Apache-2.0 OR MIT |
|
|
40
|
+
| hyper | 1.10.1 | MIT |
|
|
41
|
+
| hyper-util | 0.1.20 | MIT |
|
|
25
42
|
| is_terminal_polyfill | 1.70.2 | Apache-2.0 OR MIT |
|
|
26
43
|
| itoa | 1.0.18 | Apache-2.0 OR MIT |
|
|
27
44
|
| lazy_static | 1.5.0 | Apache-2.0 OR MIT |
|
|
@@ -29,33 +46,46 @@ This package bundles Rust binaries in `dist_rust/`. Those binaries are built fro
|
|
|
29
46
|
| lock_api | 0.4.14 | Apache-2.0 OR MIT |
|
|
30
47
|
| log | 0.4.33 | Apache-2.0 OR MIT |
|
|
31
48
|
| matchers | 0.2.0 | MIT |
|
|
49
|
+
| matchit | 0.8.4 | BSD-3-Clause AND MIT |
|
|
32
50
|
| memchr | 2.8.2 | MIT OR Unlicense |
|
|
51
|
+
| mime | 0.3.17 | Apache-2.0 OR MIT |
|
|
33
52
|
| mio | 1.2.1 | MIT |
|
|
34
53
|
| nu-ansi-term | 0.50.3 | MIT |
|
|
35
54
|
| once_cell | 1.21.4 | Apache-2.0 OR MIT |
|
|
36
55
|
| once_cell_polyfill | 1.70.2 | Apache-2.0 OR MIT |
|
|
37
56
|
| parking_lot | 0.12.5 | Apache-2.0 OR MIT |
|
|
38
57
|
| parking_lot_core | 0.9.12 | Apache-2.0 OR MIT |
|
|
58
|
+
| percent-encoding | 2.3.2 | Apache-2.0 OR MIT |
|
|
39
59
|
| pin-project-lite | 0.2.17 | Apache-2.0 OR MIT |
|
|
40
60
|
| proc-macro2 | 1.0.106 | Apache-2.0 OR MIT |
|
|
41
61
|
| quote | 1.0.45 | Apache-2.0 OR MIT |
|
|
42
62
|
| redox_syscall | 0.5.18 | MIT |
|
|
43
63
|
| regex-automata | 0.4.14 | Apache-2.0 OR MIT |
|
|
44
64
|
| regex-syntax | 0.8.11 | Apache-2.0 OR MIT |
|
|
65
|
+
| ryu | 1.0.23 | Apache-2.0 OR BSL-1.0 |
|
|
45
66
|
| scopeguard | 1.2.0 | Apache-2.0 OR MIT |
|
|
46
67
|
| serde | 1.0.228 | Apache-2.0 OR MIT |
|
|
47
68
|
| serde_core | 1.0.228 | Apache-2.0 OR MIT |
|
|
48
69
|
| serde_derive | 1.0.228 | Apache-2.0 OR MIT |
|
|
49
70
|
| serde_json | 1.0.150 | Apache-2.0 OR MIT |
|
|
71
|
+
| serde_path_to_error | 0.1.20 | Apache-2.0 OR MIT |
|
|
72
|
+
| serde_urlencoded | 0.7.1 | Apache-2.0 OR MIT |
|
|
50
73
|
| sharded-slab | 0.1.7 | MIT |
|
|
51
74
|
| signal-hook-registry | 1.4.8 | Apache-2.0 OR MIT |
|
|
75
|
+
| slab | 0.4.12 | MIT |
|
|
52
76
|
| smallvec | 1.15.2 | Apache-2.0 OR MIT |
|
|
53
77
|
| socket2 | 0.6.4 | Apache-2.0 OR MIT |
|
|
54
78
|
| strsim | 0.11.1 | MIT |
|
|
55
79
|
| syn | 2.0.118 | Apache-2.0 OR MIT |
|
|
80
|
+
| sync_wrapper | 1.0.2 | Apache-2.0 |
|
|
56
81
|
| thread_local | 1.1.9 | Apache-2.0 OR MIT |
|
|
57
82
|
| tokio | 1.52.3 | MIT |
|
|
58
83
|
| tokio-macros | 2.7.0 | MIT |
|
|
84
|
+
| tokio-stream | 0.1.18 | MIT |
|
|
85
|
+
| tokio-util | 0.7.18 | MIT |
|
|
86
|
+
| tower | 0.5.3 | MIT |
|
|
87
|
+
| tower-layer | 0.3.3 | MIT |
|
|
88
|
+
| tower-service | 0.3.3 | MIT |
|
|
59
89
|
| tracing | 0.1.44 | MIT |
|
|
60
90
|
| tracing-attributes | 0.1.31 | MIT |
|
|
61
91
|
| tracing-core | 0.1.36 | MIT |
|
package/ts/00_commitinfo_data.ts
CHANGED
package/ts/classes.gitmanager.ts
CHANGED
|
@@ -1,15 +1,25 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
2
|
import type {
|
|
3
|
+
IGitManagerCommitDetail,
|
|
4
|
+
IGitManagerCommitRequest,
|
|
3
5
|
IGitManagerCommitSummary,
|
|
6
|
+
IGitManagerDiff,
|
|
7
|
+
IGitManagerDiffRequest,
|
|
4
8
|
IGitManagerFileContent,
|
|
5
9
|
IGitManagerImportMirrorRequest,
|
|
6
10
|
IGitManagerInitBareRepositoryRequest,
|
|
7
11
|
IGitManagerListCommitsRequest,
|
|
12
|
+
IGitManagerListTagsRequest,
|
|
8
13
|
IGitManagerReadFileRequest,
|
|
9
14
|
IGitManagerRef,
|
|
10
15
|
IGitManagerRefRequest,
|
|
16
|
+
IGitManagerRepositorySelector,
|
|
11
17
|
IGitManagerRepositoryInfo,
|
|
18
|
+
IGitManagerSmartHttpRepositoryAccess,
|
|
19
|
+
IGitManagerSmartHttpRepositoryVisibility,
|
|
12
20
|
IGitManagerStatus,
|
|
21
|
+
IGitManagerTag,
|
|
22
|
+
IGitManagerTagRequest,
|
|
13
23
|
IGitManagerTreeEntry,
|
|
14
24
|
IGitManagerTreeRequest,
|
|
15
25
|
IGitManagerOptions,
|
|
@@ -26,8 +36,28 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
26
36
|
|
|
27
37
|
constructor(optionsArg: IGitManagerOptions = {}) {
|
|
28
38
|
super();
|
|
39
|
+
const smartHttpOptions = optionsArg.smartHttp;
|
|
29
40
|
this.config = {
|
|
30
41
|
dataDir: optionsArg.dataDir ?? plugins.path.resolve(process.cwd(), '.nogit', 'gitmanager'),
|
|
42
|
+
smartHttp: smartHttpOptions && smartHttpOptions.enabled !== false
|
|
43
|
+
? {
|
|
44
|
+
bindAddress: smartHttpOptions.bindAddress ?? '127.0.0.1',
|
|
45
|
+
port: smartHttpOptions.port ?? 0,
|
|
46
|
+
allowUnsafeNonLoopback: smartHttpOptions.allowUnsafeNonLoopback ?? false,
|
|
47
|
+
allowAllRepositories: smartHttpOptions.allowAllRepositories ?? false,
|
|
48
|
+
allowedRepositories: smartHttpOptions.allowedRepositories?.map((repository) => ({
|
|
49
|
+
org: repository.org,
|
|
50
|
+
repo: repository.repo,
|
|
51
|
+
})) ?? [],
|
|
52
|
+
maxConcurrentTransfers: smartHttpOptions.maxConcurrentTransfers ?? 32,
|
|
53
|
+
maxRequestBodyBytes: smartHttpOptions.maxRequestBodyBytes ?? 16 * 1024 * 1024,
|
|
54
|
+
maxAdvertisementBytes: smartHttpOptions.maxAdvertisementBytes ?? 4 * 1024 * 1024,
|
|
55
|
+
maxResponseBytes: smartHttpOptions.maxResponseBytes ?? 4 * 1024 * 1024 * 1024,
|
|
56
|
+
processTimeoutMs: smartHttpOptions.processTimeoutMs ?? 30 * 60 * 1000,
|
|
57
|
+
idleTimeoutSeconds: smartHttpOptions.idleTimeoutSeconds ?? 300,
|
|
58
|
+
gracefulShutdownMs: smartHttpOptions.gracefulShutdownMs ?? 10_000,
|
|
59
|
+
}
|
|
60
|
+
: undefined,
|
|
31
61
|
};
|
|
32
62
|
this.bridge.on('exit', (code: number | null, signal: string | null) => {
|
|
33
63
|
this.started = false;
|
|
@@ -83,6 +113,31 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
83
113
|
return this.bridge.getStatus();
|
|
84
114
|
}
|
|
85
115
|
|
|
116
|
+
public async setSmartHttpRepositoryAccess(
|
|
117
|
+
accessArg: IGitManagerSmartHttpRepositoryAccess,
|
|
118
|
+
): Promise<void> {
|
|
119
|
+
this.assertRunning();
|
|
120
|
+
return this.bridge.setSmartHttpRepositoryAccess({
|
|
121
|
+
allowAllRepositories: accessArg.allowAllRepositories,
|
|
122
|
+
allowedRepositories: accessArg.allowedRepositories.map((repository) => ({
|
|
123
|
+
org: repository.org,
|
|
124
|
+
repo: repository.repo,
|
|
125
|
+
})),
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
public async setSmartHttpRepositoryVisibility(
|
|
130
|
+
visibilityArg: IGitManagerSmartHttpRepositoryVisibility,
|
|
131
|
+
): Promise<void> {
|
|
132
|
+
this.assertRunning();
|
|
133
|
+
return this.bridge.setSmartHttpRepositoryVisibility({
|
|
134
|
+
org: visibilityArg.org,
|
|
135
|
+
repo: visibilityArg.repo,
|
|
136
|
+
public: visibilityArg.public,
|
|
137
|
+
revision: visibilityArg.revision,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
|
|
86
141
|
public get running(): boolean {
|
|
87
142
|
return this.started && this.bridge.running;
|
|
88
143
|
}
|
|
@@ -97,6 +152,16 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
97
152
|
return this.bridge.importMirror(requestArg);
|
|
98
153
|
}
|
|
99
154
|
|
|
155
|
+
public async refreshMirror(requestArg: IGitManagerRepositorySelector): Promise<IGitManagerRepositoryInfo> {
|
|
156
|
+
this.assertRunning();
|
|
157
|
+
return this.bridge.refreshMirror(requestArg);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
public async verifyRepository(requestArg: IGitManagerRepositorySelector): Promise<IGitManagerRepositoryInfo> {
|
|
161
|
+
this.assertRunning();
|
|
162
|
+
return this.bridge.verifyRepository(requestArg);
|
|
163
|
+
}
|
|
164
|
+
|
|
100
165
|
public async listRepositories(): Promise<IGitManagerRepositoryInfo[]> {
|
|
101
166
|
this.assertRunning();
|
|
102
167
|
return this.bridge.listRepositories();
|
|
@@ -122,6 +187,26 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
122
187
|
return this.bridge.listCommits(requestArg);
|
|
123
188
|
}
|
|
124
189
|
|
|
190
|
+
public async getCommit(requestArg: IGitManagerCommitRequest): Promise<IGitManagerCommitDetail> {
|
|
191
|
+
this.assertRunning();
|
|
192
|
+
return this.bridge.getCommit(requestArg);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
public async getDiff(requestArg: IGitManagerDiffRequest): Promise<IGitManagerDiff> {
|
|
196
|
+
this.assertRunning();
|
|
197
|
+
return this.bridge.getDiff(requestArg);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
public async listTags(requestArg: IGitManagerListTagsRequest): Promise<IGitManagerTag[]> {
|
|
201
|
+
this.assertRunning();
|
|
202
|
+
return this.bridge.listTags(requestArg);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
public async getTag(requestArg: IGitManagerTagRequest): Promise<IGitManagerTag> {
|
|
206
|
+
this.assertRunning();
|
|
207
|
+
return this.bridge.getTag(requestArg);
|
|
208
|
+
}
|
|
209
|
+
|
|
125
210
|
private async startInternal(): Promise<void> {
|
|
126
211
|
const spawned = await this.bridge.spawn();
|
|
127
212
|
if (!spawned) {
|
package/ts/models.ts
CHANGED
|
@@ -1,30 +1,97 @@
|
|
|
1
|
+
import type { IGitManagerRepositorySelector } from '@foss.global/interfaces';
|
|
2
|
+
|
|
3
|
+
export interface IGitManagerSmartHttpOptions {
|
|
4
|
+
enabled?: boolean;
|
|
5
|
+
bindAddress?: string;
|
|
6
|
+
port?: number;
|
|
7
|
+
allowUnsafeNonLoopback?: boolean;
|
|
8
|
+
allowAllRepositories?: boolean;
|
|
9
|
+
allowedRepositories?: IGitManagerRepositorySelector[];
|
|
10
|
+
maxConcurrentTransfers?: number;
|
|
11
|
+
maxRequestBodyBytes?: number;
|
|
12
|
+
maxAdvertisementBytes?: number;
|
|
13
|
+
maxResponseBytes?: number;
|
|
14
|
+
processTimeoutMs?: number;
|
|
15
|
+
idleTimeoutSeconds?: number;
|
|
16
|
+
gracefulShutdownMs?: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface IGitManagerSmartHttpRepositoryAccess {
|
|
20
|
+
allowAllRepositories: boolean;
|
|
21
|
+
allowedRepositories: IGitManagerRepositorySelector[];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface IGitManagerSmartHttpRepositoryVisibility
|
|
25
|
+
extends IGitManagerRepositorySelector {
|
|
26
|
+
public: boolean;
|
|
27
|
+
revision: number;
|
|
28
|
+
}
|
|
29
|
+
|
|
1
30
|
export interface IGitManagerOptions {
|
|
2
31
|
dataDir?: string;
|
|
32
|
+
smartHttp?: IGitManagerSmartHttpOptions;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface IRustGitManagerSmartHttpConfig {
|
|
36
|
+
bindAddress: string;
|
|
37
|
+
port: number;
|
|
38
|
+
allowUnsafeNonLoopback: boolean;
|
|
39
|
+
allowAllRepositories: boolean;
|
|
40
|
+
allowedRepositories: IGitManagerRepositorySelector[];
|
|
41
|
+
maxConcurrentTransfers: number;
|
|
42
|
+
maxRequestBodyBytes: number;
|
|
43
|
+
maxAdvertisementBytes: number;
|
|
44
|
+
maxResponseBytes: number;
|
|
45
|
+
processTimeoutMs: number;
|
|
46
|
+
idleTimeoutSeconds: number;
|
|
47
|
+
gracefulShutdownMs: number;
|
|
3
48
|
}
|
|
4
49
|
|
|
5
50
|
export interface IRustGitManagerConfig {
|
|
6
51
|
dataDir: string;
|
|
52
|
+
smartHttp?: IRustGitManagerSmartHttpConfig;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface IGitManagerSmartHttpStatus {
|
|
56
|
+
running: boolean;
|
|
57
|
+
bindAddress: string;
|
|
58
|
+
port: number;
|
|
59
|
+
baseUrl: string;
|
|
7
60
|
}
|
|
8
61
|
|
|
9
62
|
export interface IGitManagerStatus {
|
|
10
63
|
running: boolean;
|
|
11
64
|
dataDir: string;
|
|
12
65
|
uptimeMs: number;
|
|
66
|
+
smartHttp?: IGitManagerSmartHttpStatus;
|
|
13
67
|
}
|
|
14
68
|
|
|
15
69
|
export type {
|
|
70
|
+
IGitManagerCommitDetail,
|
|
71
|
+
IGitManagerCommitRequest,
|
|
16
72
|
IGitManagerCommitSummary,
|
|
73
|
+
IGitManagerDiff,
|
|
74
|
+
IGitManagerDiffFile,
|
|
75
|
+
IGitManagerDiffHunk,
|
|
76
|
+
IGitManagerDiffLine,
|
|
77
|
+
IGitManagerDiffRequest,
|
|
78
|
+
IGitManagerDiffStats,
|
|
17
79
|
IGitManagerFileContent,
|
|
18
80
|
IGitManagerImportMirrorRequest,
|
|
19
81
|
IGitManagerInitBareRepositoryRequest,
|
|
20
82
|
IGitManagerListCommitsRequest,
|
|
83
|
+
IGitManagerListTagsRequest,
|
|
21
84
|
IGitManagerReadFileRequest,
|
|
22
85
|
IGitManagerRef,
|
|
23
86
|
IGitManagerRefRequest,
|
|
24
87
|
IGitManagerRepositoryInfo,
|
|
25
88
|
IGitManagerRepositorySelector,
|
|
89
|
+
IGitManagerTag,
|
|
90
|
+
IGitManagerTagRequest,
|
|
26
91
|
IGitManagerTreeEntry,
|
|
27
92
|
IGitManagerTreeRequest,
|
|
93
|
+
TGitManagerDiffFileStatus,
|
|
94
|
+
TGitManagerDiffLineKind,
|
|
28
95
|
TGitManagerObjectType,
|
|
29
96
|
TGitManagerRefType,
|
|
30
97
|
TGitManagerTreeEntryType,
|
|
@@ -1,15 +1,25 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
2
|
import type {
|
|
3
|
+
IGitManagerCommitDetail,
|
|
4
|
+
IGitManagerCommitRequest,
|
|
3
5
|
IGitManagerCommitSummary,
|
|
6
|
+
IGitManagerDiff,
|
|
7
|
+
IGitManagerDiffRequest,
|
|
4
8
|
IGitManagerFileContent,
|
|
5
9
|
IGitManagerImportMirrorRequest,
|
|
6
10
|
IGitManagerInitBareRepositoryRequest,
|
|
7
11
|
IGitManagerListCommitsRequest,
|
|
12
|
+
IGitManagerListTagsRequest,
|
|
8
13
|
IGitManagerReadFileRequest,
|
|
9
14
|
IGitManagerRef,
|
|
10
15
|
IGitManagerRefRequest,
|
|
16
|
+
IGitManagerRepositorySelector,
|
|
11
17
|
IGitManagerRepositoryInfo,
|
|
18
|
+
IGitManagerSmartHttpRepositoryAccess,
|
|
19
|
+
IGitManagerSmartHttpRepositoryVisibility,
|
|
12
20
|
IGitManagerStatus,
|
|
21
|
+
IGitManagerTag,
|
|
22
|
+
IGitManagerTagRequest,
|
|
13
23
|
IGitManagerTreeEntry,
|
|
14
24
|
IGitManagerTreeRequest,
|
|
15
25
|
IRustGitManagerConfig,
|
|
@@ -19,13 +29,21 @@ type TGitManagerCommands = {
|
|
|
19
29
|
start: { params: { config: IRustGitManagerConfig }; result: Record<string, never> };
|
|
20
30
|
stop: { params: Record<string, never>; result: Record<string, never> };
|
|
21
31
|
getStatus: { params: Record<string, never>; result: IGitManagerStatus };
|
|
32
|
+
setSmartHttpRepositoryAccess: { params: IGitManagerSmartHttpRepositoryAccess; result: Record<string, never> };
|
|
33
|
+
setSmartHttpRepositoryVisibility: { params: IGitManagerSmartHttpRepositoryVisibility; result: Record<string, never> };
|
|
22
34
|
initBareRepository: { params: IGitManagerInitBareRepositoryRequest; result: IGitManagerRepositoryInfo };
|
|
23
35
|
importMirror: { params: IGitManagerImportMirrorRequest; result: IGitManagerRepositoryInfo };
|
|
36
|
+
refreshMirror: { params: IGitManagerRepositorySelector; result: IGitManagerRepositoryInfo };
|
|
37
|
+
verifyRepository: { params: IGitManagerRepositorySelector; result: IGitManagerRepositoryInfo };
|
|
24
38
|
listRepositories: { params: Record<string, never>; result: IGitManagerRepositoryInfo[] };
|
|
25
39
|
listRefs: { params: IGitManagerRefRequest; result: IGitManagerRef[] };
|
|
26
40
|
listTree: { params: IGitManagerTreeRequest; result: IGitManagerTreeEntry[] };
|
|
27
41
|
readFile: { params: IGitManagerReadFileRequest; result: IGitManagerFileContent };
|
|
28
42
|
listCommits: { params: IGitManagerListCommitsRequest; result: IGitManagerCommitSummary[] };
|
|
43
|
+
getCommit: { params: IGitManagerCommitRequest; result: IGitManagerCommitDetail };
|
|
44
|
+
getDiff: { params: IGitManagerDiffRequest; result: IGitManagerDiff };
|
|
45
|
+
listTags: { params: IGitManagerListTagsRequest; result: IGitManagerTag[] };
|
|
46
|
+
getTag: { params: IGitManagerTagRequest; result: IGitManagerTag };
|
|
29
47
|
};
|
|
30
48
|
|
|
31
49
|
function getPackageRoot(): string {
|
|
@@ -102,6 +120,16 @@ export class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
102
120
|
return this.bridge.sendCommand('getStatus', {});
|
|
103
121
|
}
|
|
104
122
|
|
|
123
|
+
public async setSmartHttpRepositoryAccess(accessArg: IGitManagerSmartHttpRepositoryAccess): Promise<void> {
|
|
124
|
+
await this.bridge.sendCommand('setSmartHttpRepositoryAccess', accessArg);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
public async setSmartHttpRepositoryVisibility(
|
|
128
|
+
visibilityArg: IGitManagerSmartHttpRepositoryVisibility,
|
|
129
|
+
): Promise<void> {
|
|
130
|
+
await this.bridge.sendCommand('setSmartHttpRepositoryVisibility', visibilityArg);
|
|
131
|
+
}
|
|
132
|
+
|
|
105
133
|
public async initBareRepository(requestArg: IGitManagerInitBareRepositoryRequest): Promise<IGitManagerRepositoryInfo> {
|
|
106
134
|
return this.bridge.sendCommand('initBareRepository', requestArg);
|
|
107
135
|
}
|
|
@@ -110,6 +138,14 @@ export class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
110
138
|
return this.bridge.sendCommand('importMirror', requestArg);
|
|
111
139
|
}
|
|
112
140
|
|
|
141
|
+
public async refreshMirror(requestArg: IGitManagerRepositorySelector): Promise<IGitManagerRepositoryInfo> {
|
|
142
|
+
return this.bridge.sendCommand('refreshMirror', requestArg);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
public async verifyRepository(requestArg: IGitManagerRepositorySelector): Promise<IGitManagerRepositoryInfo> {
|
|
146
|
+
return this.bridge.sendCommand('verifyRepository', requestArg);
|
|
147
|
+
}
|
|
148
|
+
|
|
113
149
|
public async listRepositories(): Promise<IGitManagerRepositoryInfo[]> {
|
|
114
150
|
return this.bridge.sendCommand('listRepositories', {});
|
|
115
151
|
}
|
|
@@ -129,4 +165,20 @@ export class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
129
165
|
public async listCommits(requestArg: IGitManagerListCommitsRequest): Promise<IGitManagerCommitSummary[]> {
|
|
130
166
|
return this.bridge.sendCommand('listCommits', requestArg);
|
|
131
167
|
}
|
|
168
|
+
|
|
169
|
+
public async getCommit(requestArg: IGitManagerCommitRequest): Promise<IGitManagerCommitDetail> {
|
|
170
|
+
return this.bridge.sendCommand('getCommit', requestArg);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
public async getDiff(requestArg: IGitManagerDiffRequest): Promise<IGitManagerDiff> {
|
|
174
|
+
return this.bridge.sendCommand('getDiff', requestArg);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
public async listTags(requestArg: IGitManagerListTagsRequest): Promise<IGitManagerTag[]> {
|
|
178
|
+
return this.bridge.sendCommand('listTags', requestArg);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
public async getTag(requestArg: IGitManagerTagRequest): Promise<IGitManagerTag> {
|
|
182
|
+
return this.bridge.sendCommand('getTag', requestArg);
|
|
183
|
+
}
|
|
132
184
|
}
|