@foss.global/interfaces 0.12.0 → 1.0.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 +23 -0
- package/dist_ts/00_commitinfo_data.js +2 -2
- package/dist_ts/data/forgeinventory.d.ts +24 -0
- package/dist_ts/data/gitmanager.d.ts +84 -10
- package/package.json +6 -6
- package/readme.md +68 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/data/forgeinventory.ts +25 -0
- package/ts/data/gitmanager.ts +86 -10
package/changelog.md
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-09-25 - 1.0.0
|
|
4
|
+
|
|
5
|
+
### Breaking Changes
|
|
6
|
+
|
|
7
|
+
- replace the GitManager ref listing contract with a complete paginated ref inventory (gitmanager)
|
|
8
|
+
- `IGitManagerRefRequest` gains `prefixes`, `cursor`, and `limit`; without prefixes every ref under `refs/` is selected, overlapping prefixes select their de-duplicated union, an empty array is invalid, and a complete ref name as the only prefix is an exact lookup.
|
|
9
|
+
- `IGitManagerRef` now carries `name`, `objectId`, `objectType`, `peeledObjectId`, `peeledObjectType`, and `symbolicTarget`; `objectId` and `objectType` are null only for a symbolic ref whose target does not resolve. The per-ref `org`, `repo`, `shortName`, `refType`, `updatedAt`, and `subject` fields and `TGitManagerRefType` are removed.
|
|
10
|
+
- Add `TGitManagerRefInventoryResult`: an `IGitManagerRefInventoryPage` with HEAD, total count, inventory digest, and cursor pagination, or `IGitManagerRefInventoryStale` when the selected refs or HEAD changed between pages.
|
|
11
|
+
|
|
12
|
+
### Maintenance
|
|
13
|
+
|
|
14
|
+
- Update release tooling to pnpm 12.4.2, `@git.zone/tsbuild` 5.0.0, `@git.zone/tsrun` 3.0.0, `@git.zone/tstest` 6.2.0, `@git.zone/tsdoc` 2.2.2 and `@types/node` 26.6.1 (tooling)
|
|
15
|
+
- pnpm 12.5.x and `@types/node` 26.6.2 are inside the seven-day release-age window, so pnpm stays on 12.4.2 and `@types/node` on 26.6.1.
|
|
16
|
+
- No source migration is needed: no `ts*` folder carries its own `tsconfig.json` (tsbuild 5), no script reads `process.argv` (tsrun 3), and both test files end in `tap.start()` without `TapNodeTools` (tstest 5 and 6).
|
|
17
|
+
|
|
18
|
+
## 2026-09-05 - 0.13.0
|
|
19
|
+
|
|
20
|
+
### Features
|
|
21
|
+
|
|
22
|
+
- add issue observation contract (forgeinventory)
|
|
23
|
+
- Add IForgeInventoryIssue for provider issue identity, repository-local numbers, metadata, author identity and timestamps.
|
|
24
|
+
- Document issue inventory semantics and add type-level round-trip contract coverage.
|
|
25
|
+
|
|
3
26
|
## 2026-09-04 - 0.12.0
|
|
4
27
|
|
|
5
28
|
### Features
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@foss.global/interfaces',
|
|
6
|
-
version: '0.
|
|
6
|
+
version: '1.0.0',
|
|
7
7
|
description: 'Shared TypeScript interfaces and TypedRequest contracts for the foss.global Git platform ecosystem.'
|
|
8
8
|
};
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx5QkFBeUI7SUFDL0IsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLHFHQUFxRztDQUNuSCxDQUFBIn0=
|
|
@@ -79,6 +79,30 @@ export interface IForgeInventoryRepository {
|
|
|
79
79
|
/** Git storage bytes only; never an admission estimate for an outgoing push. */
|
|
80
80
|
gitSizeBytes: TForgeInventoryQuantity;
|
|
81
81
|
}
|
|
82
|
+
/** Issue metadata observed from a provider, never a complete historical import payload. */
|
|
83
|
+
export interface IForgeInventoryIssue {
|
|
84
|
+
/** Provider row identity; an issue's displayed number is a separate locator. */
|
|
85
|
+
identity: TForgeInventoryIdentity;
|
|
86
|
+
repository: TForgeInventoryIdentity;
|
|
87
|
+
location: IForgeInventoryLocation;
|
|
88
|
+
/** Canonical positive decimal repository-local number (GitLab iid). */
|
|
89
|
+
number: string;
|
|
90
|
+
title: string;
|
|
91
|
+
/** Provider text verbatim, including empty text; null means not exposed. */
|
|
92
|
+
body: string | null;
|
|
93
|
+
state: 'open' | 'closed' | null;
|
|
94
|
+
/** Provider issue classification, such as GitLab issue/incident/task; null if unknown. */
|
|
95
|
+
providerType: string | null;
|
|
96
|
+
/** null means unknown or unsupported, never implicit public visibility. */
|
|
97
|
+
confidential: boolean | null;
|
|
98
|
+
/** Reported provider author identity; does not establish an imported original author. */
|
|
99
|
+
author: TForgeInventoryIdentity;
|
|
100
|
+
/** ISO 8601 provider content times, distinct from inventory observation times. */
|
|
101
|
+
createdAt: string | null;
|
|
102
|
+
updatedAt: string | null;
|
|
103
|
+
/** null means no observed close time; state determines whether the issue is open. */
|
|
104
|
+
closedAt: string | null;
|
|
105
|
+
}
|
|
82
106
|
export type TForgeInventoryEntityClass = 'namespaces' | 'users' | 'teams' | 'memberships' | 'repositories' | 'gitRefs' | 'gitObjects' | 'protectedRefs' | 'publicSshKeys' | 'deployKeys' | 'issues' | 'issueComments' | 'pullRequests' | 'reviews' | 'reviewComments' | 'labels' | 'milestones' | 'assignees' | 'reactions' | 'releases' | 'releaseAssets' | 'lfsObjects' | 'packages' | 'packageVersions' | 'packageBlobs' | 'webhooks' | 'webhookDeliveries' | 'ciWorkflows' | 'ciRuns' | 'ciArtifacts' | 'wikis' | 'projects';
|
|
83
107
|
/** Availability of an inventory read, never a claim of write/import fidelity. */
|
|
84
108
|
export type TForgeInventoryCapability = {
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export type TGitManagerRefType = 'branch' | 'tag' | 'other';
|
|
2
1
|
export type TGitManagerObjectType = 'blob' | 'tree' | 'commit' | 'tag' | 'other';
|
|
3
2
|
export type TGitManagerTreeEntryType = 'file' | 'dir' | 'symlink' | 'submodule' | 'other';
|
|
4
3
|
export type TGitManagerDiffFileStatus = 'added' | 'modified' | 'deleted' | 'renamed' | 'copied' | 'typechange' | 'unmerged' | 'unknown';
|
|
@@ -18,17 +17,92 @@ export interface IGitManagerInitBareRepositoryRequest extends IGitManagerReposit
|
|
|
18
17
|
export interface IGitManagerImportMirrorRequest extends IGitManagerRepositorySelector {
|
|
19
18
|
remoteUrl: string;
|
|
20
19
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
20
|
+
/**
|
|
21
|
+
* One page request of a repository's complete ref inventory.
|
|
22
|
+
*
|
|
23
|
+
* Without `prefixes`, every ref under `refs/` is listed: branches, tags, and
|
|
24
|
+
* all other namespaces such as `refs/notes/*`, `refs/pull/*`,
|
|
25
|
+
* `refs/keep-around/*`, and provider-internal refs. A prefix selects refs on
|
|
26
|
+
* full path components: `refs/heads/` selects every branch, and a complete
|
|
27
|
+
* ref name such as `refs/heads/main` selects exactly that ref.
|
|
28
|
+
*/
|
|
30
29
|
export interface IGitManagerRefRequest extends IGitManagerRepositorySelector {
|
|
30
|
+
/**
|
|
31
|
+
* `refs/`-rooted prefixes; omit to list every ref. An empty array is
|
|
32
|
+
* rejected as invalid. Overlapping prefixes select the de-duplicated union,
|
|
33
|
+
* so each ref appears once.
|
|
34
|
+
*/
|
|
35
|
+
prefixes?: string[];
|
|
36
|
+
/** Opaque cursor from the preceding page; omit to start a new inventory. */
|
|
37
|
+
cursor?: string;
|
|
38
|
+
/** Maximum refs in this page. The engine owns the default and maximum. */
|
|
39
|
+
limit?: number;
|
|
31
40
|
}
|
|
41
|
+
export interface IGitManagerRef {
|
|
42
|
+
/** Full ref name, for example `refs/heads/main`. */
|
|
43
|
+
name: string;
|
|
44
|
+
/**
|
|
45
|
+
* Object the ref points at; for a symbolic ref, the object its target
|
|
46
|
+
* resolves to. Null only for a symbolic ref whose target does not resolve,
|
|
47
|
+
* such as `refs/remotes/origin/HEAD` pointing at a deleted branch; such refs
|
|
48
|
+
* are listed, never dropped.
|
|
49
|
+
*/
|
|
50
|
+
objectId: string | null;
|
|
51
|
+
/** Type of `objectId`; null exactly when `objectId` is null. */
|
|
52
|
+
objectType: TGitManagerObjectType | null;
|
|
53
|
+
/** Fully peeled object for annotated tags, including nested tags; otherwise null. */
|
|
54
|
+
peeledObjectId: string | null;
|
|
55
|
+
peeledObjectType: TGitManagerObjectType | null;
|
|
56
|
+
/** Target ref name when this ref is symbolic; otherwise null. */
|
|
57
|
+
symbolicTarget: string | null;
|
|
58
|
+
}
|
|
59
|
+
/** Repository HEAD, which is reported separately and never listed in `refs`. */
|
|
60
|
+
export interface IGitManagerRefHead {
|
|
61
|
+
/** Target ref name when HEAD is symbolic; null when detached. */
|
|
62
|
+
symbolicTarget: string | null;
|
|
63
|
+
/** Resolved object; null when HEAD points at an unborn branch. */
|
|
64
|
+
objectId: string | null;
|
|
65
|
+
}
|
|
66
|
+
export type TGitManagerRefInventoryPagination = {
|
|
67
|
+
status: 'more';
|
|
68
|
+
cursor: string;
|
|
69
|
+
} | {
|
|
70
|
+
status: 'exhausted';
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* A coherent page of the selected ref inventory, sorted by ref name in byte
|
|
74
|
+
* order. Every page carries the digest of the complete selection it was cut
|
|
75
|
+
* from; a cursor is honoured only while that digest is unchanged, so pages of
|
|
76
|
+
* one inventory never mix two ref states.
|
|
77
|
+
*
|
|
78
|
+
* `inventoryDigest` is the lowercase hex SHA-256 over the UTF-8 bytes of
|
|
79
|
+
* `HEAD\0<head.symbolicTarget or empty>\0<head.objectId or empty>\n` followed
|
|
80
|
+
* by `<name>\0<objectId or empty>\0<symbolicTarget or empty>\n` for each
|
|
81
|
+
* selected ref in ref-name byte order over the complete selection. Peeled
|
|
82
|
+
* values and object types follow from the object IDs and are not part of the
|
|
83
|
+
* digest.
|
|
84
|
+
*/
|
|
85
|
+
export interface IGitManagerRefInventoryPage extends IGitManagerRepositorySelector {
|
|
86
|
+
status: 'page';
|
|
87
|
+
inventoryDigest: string;
|
|
88
|
+
/** Number of refs in the complete selection, not in this page. */
|
|
89
|
+
refCount: number;
|
|
90
|
+
head: IGitManagerRefHead;
|
|
91
|
+
refs: IGitManagerRef[];
|
|
92
|
+
pagination: TGitManagerRefInventoryPagination;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* The selected refs or HEAD changed since the cursor was issued. The caller
|
|
96
|
+
* restarts the inventory without a cursor; no partial page is returned.
|
|
97
|
+
*/
|
|
98
|
+
export interface IGitManagerRefInventoryStale extends IGitManagerRepositorySelector {
|
|
99
|
+
status: 'stale';
|
|
100
|
+
/** Digest bound to the rejected cursor. */
|
|
101
|
+
expectedInventoryDigest: string;
|
|
102
|
+
/** Digest of the current selection. */
|
|
103
|
+
inventoryDigest: string;
|
|
104
|
+
}
|
|
105
|
+
export type TGitManagerRefInventoryResult = IGitManagerRefInventoryPage | IGitManagerRefInventoryStale;
|
|
32
106
|
export type TGitManagerMergeMethod = 'merge' | 'squash' | 'rebase';
|
|
33
107
|
export type TGitManagerMergeStatus = 'merged' | 'already_merged' | 'conflicting' | 'stale';
|
|
34
108
|
export interface IGitManagerMergeRequest extends IGitManagerRepositorySelector {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@foss.global/interfaces",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Shared TypeScript interfaces and TypedRequest contracts for the foss.global Git platform ecosystem.",
|
|
6
6
|
"exports": {
|
|
@@ -13,11 +13,11 @@
|
|
|
13
13
|
"@api.global/typedrequest-interfaces": "^7.1.0"
|
|
14
14
|
},
|
|
15
15
|
"devDependencies": {
|
|
16
|
-
"@git.zone/tsbuild": "^
|
|
17
|
-
"@git.zone/tsdoc": "^2.
|
|
18
|
-
"@git.zone/tsrun": "^
|
|
19
|
-
"@git.zone/tstest": "^
|
|
20
|
-
"@types/node": "^26.
|
|
16
|
+
"@git.zone/tsbuild": "^5.0.0",
|
|
17
|
+
"@git.zone/tsdoc": "^2.2.2",
|
|
18
|
+
"@git.zone/tsrun": "^3.0.0",
|
|
19
|
+
"@git.zone/tstest": "^6.2.0",
|
|
20
|
+
"@types/node": "^26.6.1"
|
|
21
21
|
},
|
|
22
22
|
"files": [
|
|
23
23
|
"ts/**/*",
|
package/readme.md
CHANGED
|
@@ -95,10 +95,68 @@ The runner lifecycle contracts cover registration, sessions, runner and job hear
|
|
|
95
95
|
|
|
96
96
|
Protocol v1 describes OCI execution with Docker or Podman and `tar.gz` source archives. Artifacts, caches, and service containers are explicitly unsupported in the v1 capability shape. Supported job network modes are `none` and `bridge`; the execution service remains responsible for enforcing the advertised capability.
|
|
97
97
|
|
|
98
|
+
### GitManager ref inventory contracts
|
|
99
|
+
|
|
100
|
+
`IGitManagerRefRequest`, `IGitManagerRef`, and `TGitManagerRefInventoryResult`
|
|
101
|
+
describe a complete, paginated ref inventory. Without `prefixes`, every ref
|
|
102
|
+
under `refs/` is listed, including notes, pull, keep-around, and
|
|
103
|
+
provider-internal namespaces. HEAD is reported separately in `head`. Annotated
|
|
104
|
+
tags carry their fully peeled object. Symbolic refs carry their target ref
|
|
105
|
+
name; a symbolic ref whose target does not resolve is still listed, with a null
|
|
106
|
+
`objectId` and `objectType`.
|
|
107
|
+
|
|
108
|
+
```ts
|
|
109
|
+
import type {
|
|
110
|
+
IGitManagerRef,
|
|
111
|
+
IGitManagerRefRequest,
|
|
112
|
+
TGitManagerRefInventoryResult,
|
|
113
|
+
} from '@foss.global/interfaces';
|
|
114
|
+
|
|
115
|
+
declare function listRefs(
|
|
116
|
+
request: IGitManagerRefRequest,
|
|
117
|
+
): Promise<TGitManagerRefInventoryResult>;
|
|
118
|
+
|
|
119
|
+
const collectRefs = async (): Promise<IGitManagerRef[]> => {
|
|
120
|
+
const refs: IGitManagerRef[] = [];
|
|
121
|
+
let cursor: string | undefined;
|
|
122
|
+
while (true) {
|
|
123
|
+
const result = await listRefs({ org: 'foss.global', repo: 'interfaces', cursor });
|
|
124
|
+
if (result.status === 'stale') {
|
|
125
|
+
refs.length = 0;
|
|
126
|
+
cursor = undefined;
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
refs.push(...result.refs);
|
|
130
|
+
if (result.pagination.status === 'exhausted') {
|
|
131
|
+
return refs;
|
|
132
|
+
}
|
|
133
|
+
cursor = result.pagination.cursor;
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// A complete ref name as the only prefix is an exact lookup.
|
|
138
|
+
const main = await listRefs({
|
|
139
|
+
org: 'foss.global',
|
|
140
|
+
repo: 'interfaces',
|
|
141
|
+
prefixes: ['refs/heads/main'],
|
|
142
|
+
});
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Prefixes match whole path components, so `refs/heads/ma` does not select
|
|
146
|
+
`refs/heads/main`. Overlapping prefixes select their de-duplicated union, and
|
|
147
|
+
an empty `prefixes` array is rejected as invalid. Pages are sorted by ref name
|
|
148
|
+
in byte order and each carries `inventoryDigest`, the SHA-256 of the complete
|
|
149
|
+
selection defined on `IGitManagerRefInventoryPage`. A cursor is opaque and
|
|
150
|
+
bound to the repository, the prefix set, and that digest. When the selected
|
|
151
|
+
refs or HEAD change between pages, the next call returns `status: 'stale'`
|
|
152
|
+
instead of a page that would mix two states; the caller restarts without a
|
|
153
|
+
cursor. A cursor is a transport continuation, not a durable replication
|
|
154
|
+
checkpoint.
|
|
155
|
+
|
|
98
156
|
### Forge inventory contracts
|
|
99
157
|
|
|
100
158
|
`IForgeInventoryReport`, `IForgeInventoryPage<TItem>`, `IForgeInventoryNamespace`,
|
|
101
|
-
and `
|
|
159
|
+
`IForgeInventoryRepository` and `IForgeInventoryIssue` describe operator inventory observations. They
|
|
102
160
|
are exported from both the package root and `data`. This package supplies types;
|
|
103
161
|
it does not scan a forge or validate network responses.
|
|
104
162
|
|
|
@@ -108,6 +166,15 @@ subgroups and literal hyphens. A source without a stable identifier reports an
|
|
|
108
166
|
unresolved identity. URLs must be credential-free, and inventory responses need
|
|
109
167
|
operator authorization rather than anonymous public exposure.
|
|
110
168
|
|
|
169
|
+
Issue observations separate the provider row ID from its repository-local
|
|
170
|
+
`number` (GitLab `iid`) and retain the repository identity. They preserve empty
|
|
171
|
+
body text, unknown metadata, open/closed state, provider issue classification,
|
|
172
|
+
confidentiality, reported author identity and provider content timestamps.
|
|
173
|
+
The reported author does not prove original attribution for previously imported
|
|
174
|
+
issues. Comments, labels, milestones, assignees, attachments and history require
|
|
175
|
+
their own inventory and preservation work; this metadata DTO does not claim
|
|
176
|
+
that those collections or external writes are implemented.
|
|
177
|
+
|
|
111
178
|
Every canonical entity class has an explicit capability and collection result,
|
|
112
179
|
including classes not inspected or unavailable. Additional provider features
|
|
113
180
|
have their own entries. `enumerated` means the selected collection was exhausted
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -81,6 +81,31 @@ export interface IForgeInventoryRepository {
|
|
|
81
81
|
gitSizeBytes: TForgeInventoryQuantity;
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
+
/** Issue metadata observed from a provider, never a complete historical import payload. */
|
|
85
|
+
export interface IForgeInventoryIssue {
|
|
86
|
+
/** Provider row identity; an issue's displayed number is a separate locator. */
|
|
87
|
+
identity: TForgeInventoryIdentity;
|
|
88
|
+
repository: TForgeInventoryIdentity;
|
|
89
|
+
location: IForgeInventoryLocation;
|
|
90
|
+
/** Canonical positive decimal repository-local number (GitLab iid). */
|
|
91
|
+
number: string;
|
|
92
|
+
title: string;
|
|
93
|
+
/** Provider text verbatim, including empty text; null means not exposed. */
|
|
94
|
+
body: string | null;
|
|
95
|
+
state: 'open' | 'closed' | null;
|
|
96
|
+
/** Provider issue classification, such as GitLab issue/incident/task; null if unknown. */
|
|
97
|
+
providerType: string | null;
|
|
98
|
+
/** null means unknown or unsupported, never implicit public visibility. */
|
|
99
|
+
confidential: boolean | null;
|
|
100
|
+
/** Reported provider author identity; does not establish an imported original author. */
|
|
101
|
+
author: TForgeInventoryIdentity;
|
|
102
|
+
/** ISO 8601 provider content times, distinct from inventory observation times. */
|
|
103
|
+
createdAt: string | null;
|
|
104
|
+
updatedAt: string | null;
|
|
105
|
+
/** null means no observed close time; state determines whether the issue is open. */
|
|
106
|
+
closedAt: string | null;
|
|
107
|
+
}
|
|
108
|
+
|
|
84
109
|
export type TForgeInventoryEntityClass =
|
|
85
110
|
| 'namespaces'
|
|
86
111
|
| 'users'
|
package/ts/data/gitmanager.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
export type TGitManagerRefType = 'branch' | 'tag' | 'other';
|
|
2
|
-
|
|
3
1
|
export type TGitManagerObjectType = 'blob' | 'tree' | 'commit' | 'tag' | 'other';
|
|
4
2
|
|
|
5
3
|
export type TGitManagerTreeEntryType = 'file' | 'dir' | 'symlink' | 'submodule' | 'other';
|
|
@@ -35,17 +33,95 @@ export interface IGitManagerImportMirrorRequest extends IGitManagerRepositorySel
|
|
|
35
33
|
remoteUrl: string;
|
|
36
34
|
}
|
|
37
35
|
|
|
38
|
-
|
|
36
|
+
/**
|
|
37
|
+
* One page request of a repository's complete ref inventory.
|
|
38
|
+
*
|
|
39
|
+
* Without `prefixes`, every ref under `refs/` is listed: branches, tags, and
|
|
40
|
+
* all other namespaces such as `refs/notes/*`, `refs/pull/*`,
|
|
41
|
+
* `refs/keep-around/*`, and provider-internal refs. A prefix selects refs on
|
|
42
|
+
* full path components: `refs/heads/` selects every branch, and a complete
|
|
43
|
+
* ref name such as `refs/heads/main` selects exactly that ref.
|
|
44
|
+
*/
|
|
45
|
+
export interface IGitManagerRefRequest extends IGitManagerRepositorySelector {
|
|
46
|
+
/**
|
|
47
|
+
* `refs/`-rooted prefixes; omit to list every ref. An empty array is
|
|
48
|
+
* rejected as invalid. Overlapping prefixes select the de-duplicated union,
|
|
49
|
+
* so each ref appears once.
|
|
50
|
+
*/
|
|
51
|
+
prefixes?: string[];
|
|
52
|
+
/** Opaque cursor from the preceding page; omit to start a new inventory. */
|
|
53
|
+
cursor?: string;
|
|
54
|
+
/** Maximum refs in this page. The engine owns the default and maximum. */
|
|
55
|
+
limit?: number;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface IGitManagerRef {
|
|
59
|
+
/** Full ref name, for example `refs/heads/main`. */
|
|
39
60
|
name: string;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
61
|
+
/**
|
|
62
|
+
* Object the ref points at; for a symbolic ref, the object its target
|
|
63
|
+
* resolves to. Null only for a symbolic ref whose target does not resolve,
|
|
64
|
+
* such as `refs/remotes/origin/HEAD` pointing at a deleted branch; such refs
|
|
65
|
+
* are listed, never dropped.
|
|
66
|
+
*/
|
|
67
|
+
objectId: string | null;
|
|
68
|
+
/** Type of `objectId`; null exactly when `objectId` is null. */
|
|
69
|
+
objectType: TGitManagerObjectType | null;
|
|
70
|
+
/** Fully peeled object for annotated tags, including nested tags; otherwise null. */
|
|
71
|
+
peeledObjectId: string | null;
|
|
72
|
+
peeledObjectType: TGitManagerObjectType | null;
|
|
73
|
+
/** Target ref name when this ref is symbolic; otherwise null. */
|
|
74
|
+
symbolicTarget: string | null;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Repository HEAD, which is reported separately and never listed in `refs`. */
|
|
78
|
+
export interface IGitManagerRefHead {
|
|
79
|
+
/** Target ref name when HEAD is symbolic; null when detached. */
|
|
80
|
+
symbolicTarget: string | null;
|
|
81
|
+
/** Resolved object; null when HEAD points at an unborn branch. */
|
|
82
|
+
objectId: string | null;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export type TGitManagerRefInventoryPagination =
|
|
86
|
+
| { status: 'more'; cursor: string }
|
|
87
|
+
| { status: 'exhausted' };
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* A coherent page of the selected ref inventory, sorted by ref name in byte
|
|
91
|
+
* order. Every page carries the digest of the complete selection it was cut
|
|
92
|
+
* from; a cursor is honoured only while that digest is unchanged, so pages of
|
|
93
|
+
* one inventory never mix two ref states.
|
|
94
|
+
*
|
|
95
|
+
* `inventoryDigest` is the lowercase hex SHA-256 over the UTF-8 bytes of
|
|
96
|
+
* `HEAD\0<head.symbolicTarget or empty>\0<head.objectId or empty>\n` followed
|
|
97
|
+
* by `<name>\0<objectId or empty>\0<symbolicTarget or empty>\n` for each
|
|
98
|
+
* selected ref in ref-name byte order over the complete selection. Peeled
|
|
99
|
+
* values and object types follow from the object IDs and are not part of the
|
|
100
|
+
* digest.
|
|
101
|
+
*/
|
|
102
|
+
export interface IGitManagerRefInventoryPage extends IGitManagerRepositorySelector {
|
|
103
|
+
status: 'page';
|
|
104
|
+
inventoryDigest: string;
|
|
105
|
+
/** Number of refs in the complete selection, not in this page. */
|
|
106
|
+
refCount: number;
|
|
107
|
+
head: IGitManagerRefHead;
|
|
108
|
+
refs: IGitManagerRef[];
|
|
109
|
+
pagination: TGitManagerRefInventoryPagination;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* The selected refs or HEAD changed since the cursor was issued. The caller
|
|
114
|
+
* restarts the inventory without a cursor; no partial page is returned.
|
|
115
|
+
*/
|
|
116
|
+
export interface IGitManagerRefInventoryStale extends IGitManagerRepositorySelector {
|
|
117
|
+
status: 'stale';
|
|
118
|
+
/** Digest bound to the rejected cursor. */
|
|
119
|
+
expectedInventoryDigest: string;
|
|
120
|
+
/** Digest of the current selection. */
|
|
121
|
+
inventoryDigest: string;
|
|
46
122
|
}
|
|
47
123
|
|
|
48
|
-
export
|
|
124
|
+
export type TGitManagerRefInventoryResult = IGitManagerRefInventoryPage | IGitManagerRefInventoryStale;
|
|
49
125
|
|
|
50
126
|
export type TGitManagerMergeMethod = 'merge' | 'squash' | 'rebase';
|
|
51
127
|
|