@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 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
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@foss.global/gitmanager',
6
- version: '1.1.0',
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5naXRtYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5naXRtYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBb0N4QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUU3RSxNQUFNLE9BQU8sVUFBVyxTQUFRLE9BQU8sQ0FBQyxZQUFZO0lBUWxELFlBQVksYUFBaUMsRUFBRTtRQUM3QyxLQUFLLEVBQUUsQ0FBQztRQVJGLFdBQU0sR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDcEMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixpQkFBWSxHQUF5QixJQUFJLENBQUM7UUFDMUMsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFFYix1QkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztRQUkzRSxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTztlQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUM5QyxJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ1osT0FBTztZQUNQLFdBQVcsRUFBRSxVQUFVLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUM7WUFDOUUsY0FBYyxFQUFFLFVBQVUsQ0FBQyxjQUFjLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtZQUNuRSxlQUFlLEVBQUUsVUFBVSxDQUFDLGVBQWUsSUFBSSxHQUFHLEdBQUcsSUFBSSxH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
@@ -0,0 +1,15 @@
1
+ import * as plugins from './plugins.js';
2
+ import type { IGitManagerRepositoryServiceRequest, IGitManagerRepositoryServiceResult, IRustGitManagerRepositoryServiceDescriptor } from './models.js';
3
+ export declare class GitManagerRepositoryService {
4
+ readonly stdin: plugins.stream.Writable;
5
+ readonly stdout: plugins.stream.Readable;
6
+ readonly stderr: plugins.stream.Readable;
7
+ readonly completed: Promise<IGitManagerRepositoryServiceResult>;
8
+ private readonly child;
9
+ private completionSettled;
10
+ private timeout?;
11
+ constructor(descriptorArg: IRustGitManagerRepositoryServiceDescriptor, requestArg: IGitManagerRepositoryServiceRequest, homeDirectoryArg: string);
12
+ terminate(): void;
13
+ close(): Promise<void>;
14
+ private clearTimeout;
15
+ }
@@ -0,0 +1,167 @@
1
+ import * as plugins from './plugins.js';
2
+ class ByteLimitTransform extends plugins.stream.Transform {
3
+ constructor(maximumBytes, label, onLimit) {
4
+ super();
5
+ this.maximumBytes = maximumBytes;
6
+ this.label = label;
7
+ this.onLimit = onLimit;
8
+ this.bytes = 0;
9
+ }
10
+ _transform(chunkArg, encodingArg, callbackArg) {
11
+ const chunk = Buffer.isBuffer(chunkArg)
12
+ ? chunkArg
13
+ : typeof chunkArg === 'string'
14
+ ? Buffer.from(chunkArg, encodingArg)
15
+ : Buffer.from(chunkArg);
16
+ this.bytes += chunk.byteLength;
17
+ if (!Number.isSafeInteger(this.bytes) || this.bytes > this.maximumBytes) {
18
+ const error = new Error(this.label + ' exceeded the configured size limit');
19
+ this.onLimit(error);
20
+ callbackArg(error);
21
+ return;
22
+ }
23
+ callbackArg(null, chunk);
24
+ }
25
+ }
26
+ const validateDescriptor = (descriptorArg, requestArg) => {
27
+ if (descriptorArg.org !== requestArg.org
28
+ || descriptorArg.repo !== requestArg.repo
29
+ || descriptorArg.service !== requestArg.service
30
+ || descriptorArg.protocol !== requestArg.protocol
31
+ || !plugins.path.isAbsolute(descriptorArg.repositoryPath)
32
+ || !Number.isSafeInteger(descriptorArg.maxRequestBytes)
33
+ || descriptorArg.maxRequestBytes < 1024
34
+ || !Number.isSafeInteger(descriptorArg.maxResponseBytes)
35
+ || descriptorArg.maxResponseBytes < 1024 * 1024
36
+ || !Number.isSafeInteger(descriptorArg.processTimeoutMs)
37
+ || descriptorArg.processTimeoutMs < 1000
38
+ || !Number.isSafeInteger(descriptorArg.idleTimeoutSeconds)
39
+ || descriptorArg.idleTimeoutSeconds < 1) {
40
+ throw new Error('GitManager returned an invalid repository service descriptor');
41
+ }
42
+ if (descriptorArg.service === 'receive-pack') {
43
+ if (!descriptorArg.hookPath
44
+ || !plugins.path.isAbsolute(descriptorArg.hookPath)
45
+ || !descriptorArg.protectedRefsPolicy
46
+ || !/^[A-Za-z0-9_-]{1,65536}$/.test(descriptorArg.protectedRefsPolicy)) {
47
+ throw new Error('GitManager returned an invalid receive-pack descriptor');
48
+ }
49
+ }
50
+ else if (descriptorArg.hookPath !== undefined
51
+ || descriptorArg.protectedRefsPolicy !== undefined) {
52
+ throw new Error('GitManager returned unexpected upload-pack hook state');
53
+ }
54
+ };
55
+ export class GitManagerRepositoryService {
56
+ constructor(descriptorArg, requestArg, homeDirectoryArg) {
57
+ this.completionSettled = false;
58
+ validateDescriptor(descriptorArg, requestArg);
59
+ const args = descriptorArg.service === 'upload-pack'
60
+ ? [
61
+ 'upload-pack',
62
+ '--strict',
63
+ '--timeout',
64
+ String(descriptorArg.idleTimeoutSeconds),
65
+ descriptorArg.repositoryPath,
66
+ ]
67
+ : [
68
+ '-c',
69
+ 'core.hooksPath=' + descriptorArg.hookPath,
70
+ '-c',
71
+ 'receive.fsckObjects=true',
72
+ 'receive-pack',
73
+ descriptorArg.repositoryPath,
74
+ ];
75
+ const environment = {
76
+ HOME: homeDirectoryArg,
77
+ LANG: 'C',
78
+ LC_ALL: 'C',
79
+ PATH: process.env.PATH ?? '/usr/local/bin:/usr/bin:/bin',
80
+ GIT_ASKPASS: 'true',
81
+ GIT_CONFIG_GLOBAL: '/dev/null',
82
+ GIT_CONFIG_NOSYSTEM: '1',
83
+ GIT_NO_LAZY_FETCH: '1',
84
+ GIT_TERMINAL_PROMPT: '0',
85
+ GCM_INTERACTIVE: 'Never',
86
+ SSH_ASKPASS: 'true',
87
+ ...(descriptorArg.protocol
88
+ ? { GIT_PROTOCOL: descriptorArg.protocol }
89
+ : {}),
90
+ ...(descriptorArg.protectedRefsPolicy
91
+ ? {
92
+ GITMANAGER_PROTECTED_REFS_POLICY: descriptorArg.protectedRefsPolicy,
93
+ }
94
+ : {}),
95
+ };
96
+ this.child = plugins.childProcess.spawn('git', args, {
97
+ detached: process.platform !== 'win32',
98
+ env: environment,
99
+ stdio: ['pipe', 'pipe', 'pipe'],
100
+ windowsHide: true,
101
+ });
102
+ const fail = (errorArg) => {
103
+ this.terminate();
104
+ return errorArg;
105
+ };
106
+ const input = new ByteLimitTransform(descriptorArg.maxRequestBytes, 'Git repository service request', fail);
107
+ const output = new ByteLimitTransform(descriptorArg.maxResponseBytes, 'Git repository service response', fail);
108
+ const stderr = new ByteLimitTransform(128 * 1024, 'Git repository service stderr', fail);
109
+ input.pipe(this.child.stdin);
110
+ this.child.stdout.pipe(output);
111
+ this.child.stderr.pipe(stderr);
112
+ this.stdin = input;
113
+ this.stdout = output;
114
+ this.stderr = stderr;
115
+ this.completed = new Promise((resolve, reject) => {
116
+ this.child.once('error', (error) => {
117
+ if (this.completionSettled)
118
+ return;
119
+ this.completionSettled = true;
120
+ this.clearTimeout();
121
+ reject(error);
122
+ });
123
+ this.child.once('close', (exitCode, signal) => {
124
+ if (this.completionSettled)
125
+ return;
126
+ this.completionSettled = true;
127
+ this.clearTimeout();
128
+ resolve({
129
+ exitCode,
130
+ signal: signal,
131
+ });
132
+ });
133
+ });
134
+ this.timeout = setTimeout(() => {
135
+ this.terminate();
136
+ }, descriptorArg.processTimeoutMs);
137
+ this.timeout.unref();
138
+ }
139
+ terminate() {
140
+ if (this.completionSettled || this.child.killed) {
141
+ return;
142
+ }
143
+ const pid = this.child.pid;
144
+ if (pid && process.platform !== 'win32') {
145
+ try {
146
+ process.kill(-pid, 'SIGKILL');
147
+ return;
148
+ }
149
+ catch {
150
+ // Fall through to the direct child kill.
151
+ }
152
+ }
153
+ this.child.kill('SIGKILL');
154
+ }
155
+ async close() {
156
+ this.stdin.destroy();
157
+ this.terminate();
158
+ await this.completed.catch(() => undefined);
159
+ }
160
+ clearTimeout() {
161
+ if (this.timeout) {
162
+ clearTimeout(this.timeout);
163
+ this.timeout = undefined;
164
+ }
165
+ }
166
+ }
167
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yZXBvc2l0b3J5c2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMucmVwb3NpdG9yeXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFPeEMsTUFBTSxrQkFBbUIsU0FBUSxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVM7SUFHdkQsWUFDbUIsWUFBb0IsRUFDcEIsS0FBYSxFQUNiLE9BQWtDO1FBRW5ELEtBQUssRUFBRSxDQUFDO1FBSlMsaUJBQVksR0FBWixZQUFZLENBQVE7UUFDcEIsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUNiLFlBQU8sR0FBUCxPQUFPLENBQTJCO1FBTDdDLFVBQUssR0FBRyxDQUFDLENBQUM7SUFRbEIsQ0FBQztJQUVRLFVBQVUsQ0FDakIsUUFBc0MsRUFDdEMsV0FBMkIsRUFDM0IsV0FBNkM7UUFFN0MsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDckMsQ0FBQyxDQUFDLFFBQVE7WUFDVixDQUFDLENBQUMsT0FBTyxRQUFRLEtBQUssUUFBUTtnQkFDNUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQztnQkFDcEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4RSxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLHFDQUFxQyxDQUFDLENBQUM7WUFDNUUsSUFBSSxDQUFD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
@@ -1,3 +1,4 @@
1
1
  export * from './models.js';
2
2
  export * from './rust-gitmanager-bridge.js';
3
3
  export * from './classes.gitmanager.js';
4
+ export * from './classes.repositoryservice.js';
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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMseUJBQXlCLENBQUMifQ==
4
+ export * from './classes.repositoryservice.js';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxnQ0FBZ0MsQ0FBQyJ9
@@ -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';
@@ -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 };
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxVQUFVLENBQUM7QUFFaEMsT0FBTyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFFbkMsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFFbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDIn0=
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVzdC1naXRtYW5hZ2VyLWJyaWRnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3J1c3QtZ2l0bWFuYWdlci1icmlkZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUEwRHhDLFNBQVMsY0FBYztJQUNyQixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakYsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVELFNBQVMsdUJBQXVCO0lBQzlCLE1BQU0sT0FBTyxHQUEyQixFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3pFLE1BQU0sS0FBSyxHQUEyQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDN0MsQ0FBQztBQUVELFNBQVMsZUFBZTtJQUN0QixNQUFNLFdBQVcsR0FBRyxjQUFjLEVBQUUsQ0FBQztJQUNyQyxNQUFNLE1BQU0sR0FBRyx1QkFBdUIsRUFBRSxDQUFDO0lBQ3pDLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUUzQixJQUFJLE1BQU0sRUFBRSxD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
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.1.0",
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.4.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 is served directly by the Rust engine through controlled `git upload-pack` and `git receive-pack` subprocesses; packfiles do not pass through JSON IPC.
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
 
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@foss.global/gitmanager',
6
- version: '1.1.0',
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
  }
@@ -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
@@ -1,3 +1,4 @@
1
1
  export * from './models.js';
2
2
  export * from './rust-gitmanager-bridge.js';
3
3
  export * from './classes.gitmanager.js';
4
+ export * from './classes.repositoryservice.js';
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
  }