nano-git 0.1.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/README.md +407 -0
- package/dist/backend/file-backend.d.mts +26 -0
- package/dist/backend/file-backend.mjs +83 -0
- package/dist/backend/file.d.mts +2 -0
- package/dist/backend/file.mjs +2 -0
- package/dist/backend/index.d.mts +2 -0
- package/dist/backend/index.mjs +1 -0
- package/dist/backend/memory-backend.d.mts +25 -0
- package/dist/backend/memory-backend.mjs +33 -0
- package/dist/backend/memory.d.mts +2 -0
- package/dist/backend/memory.mjs +2 -0
- package/dist/backend/types.d.mts +90 -0
- package/dist/core/errors.d.mts +124 -0
- package/dist/core/errors.mjs +168 -0
- package/dist/core/hash-digest.d.mts +35 -0
- package/dist/core/hash-digest.mjs +50 -0
- package/dist/core/hash-file.d.mts +20 -0
- package/dist/core/hash-file.mjs +27 -0
- package/dist/core/hash-path.d.mts +17 -0
- package/dist/core/hash-path.mjs +35 -0
- package/dist/core/types/odb.d.mts +63 -0
- package/dist/core/types/refs.d.mts +140 -0
- package/dist/core/types/refs.mjs +19 -0
- package/dist/core/types/shallow.d.mts +52 -0
- package/dist/core/types.d.mts +154 -0
- package/dist/core/types.mjs +43 -0
- package/dist/errors.d.mts +2 -0
- package/dist/errors.mjs +2 -0
- package/dist/hash-file.d.mts +2 -0
- package/dist/hash-file.mjs +2 -0
- package/dist/index.d.mts +16 -0
- package/dist/index.mjs +14 -0
- package/dist/objects/author.d.mts +25 -0
- package/dist/objects/author.mjs +45 -0
- package/dist/objects/blob.d.mts +15 -0
- package/dist/objects/blob.mjs +20 -0
- package/dist/objects/codec.d.mts +46 -0
- package/dist/objects/codec.mjs +84 -0
- package/dist/objects/commit.d.mts +26 -0
- package/dist/objects/commit.mjs +160 -0
- package/dist/objects/index.d.mts +8 -0
- package/dist/objects/index.mjs +8 -0
- package/dist/objects/raw.d.mts +85 -0
- package/dist/objects/raw.mjs +111 -0
- package/dist/objects/tag.d.mts +26 -0
- package/dist/objects/tag.mjs +148 -0
- package/dist/objects/tree.d.mts +22 -0
- package/dist/objects/tree.mjs +66 -0
- package/dist/odb/file-utils.mjs +136 -0
- package/dist/odb/file.d.mts +22 -0
- package/dist/odb/file.mjs +66 -0
- package/dist/odb/memory.d.mts +22 -0
- package/dist/odb/memory.mjs +54 -0
- package/dist/pack/composite-store.d.mts +76 -0
- package/dist/pack/composite-store.mjs +133 -0
- package/dist/pack/constants.mjs +48 -0
- package/dist/pack/crc32.mjs +38 -0
- package/dist/pack/delta-apply.d.mts +21 -0
- package/dist/pack/delta-apply.mjs +71 -0
- package/dist/pack/delta-create.d.mts +28 -0
- package/dist/pack/delta-create.mjs +151 -0
- package/dist/pack/index.d.mts +16 -0
- package/dist/pack/index.mjs +13 -0
- package/dist/pack/object-header.d.mts +36 -0
- package/dist/pack/object-header.mjs +72 -0
- package/dist/pack/ofs-delta-offset.d.mts +35 -0
- package/dist/pack/ofs-delta-offset.mjs +59 -0
- package/dist/pack/pack-builder-types.d.mts +19 -0
- package/dist/pack/pack-builder.d.mts +52 -0
- package/dist/pack/pack-builder.mjs +80 -0
- package/dist/pack/pack-encoding.mjs +76 -0
- package/dist/pack/pack-index-reader.d.mts +57 -0
- package/dist/pack/pack-index-reader.mjs +90 -0
- package/dist/pack/pack-index-types.d.mts +16 -0
- package/dist/pack/pack-index-writer.d.mts +45 -0
- package/dist/pack/pack-index-writer.mjs +106 -0
- package/dist/pack/pack-reader-resolver.mjs +104 -0
- package/dist/pack/pack-reader-types.d.mts +31 -0
- package/dist/pack/pack-reader-types.mjs +22 -0
- package/dist/pack/pack-reader-utils.mjs +61 -0
- package/dist/pack/pack-reader.d.mts +81 -0
- package/dist/pack/pack-reader.mjs +171 -0
- package/dist/pack/pack-store-loader.mjs +79 -0
- package/dist/pack/pack-store-types.d.mts +16 -0
- package/dist/pack/pack-store.d.mts +55 -0
- package/dist/pack/pack-store.mjs +114 -0
- package/dist/pack/pack-writer.mjs +96 -0
- package/dist/pack/varint.d.mts +34 -0
- package/dist/pack/varint.mjs +57 -0
- package/dist/refs/file.d.mts +6 -0
- package/dist/refs/file.mjs +222 -0
- package/dist/refs/fs-utils.mjs +30 -0
- package/dist/refs/memory.d.mts +14 -0
- package/dist/refs/memory.mjs +104 -0
- package/dist/refs/names.d.mts +57 -0
- package/dist/refs/names.mjs +80 -0
- package/dist/refs/resolve.d.mts +33 -0
- package/dist/refs/resolve.mjs +55 -0
- package/dist/refs/shallow/file.d.mts +17 -0
- package/dist/refs/shallow/file.mjs +61 -0
- package/dist/refs/shallow/memory.d.mts +18 -0
- package/dist/refs/shallow/memory.mjs +33 -0
- package/dist/repository/core.d.mts +3 -0
- package/dist/repository/core.mjs +2 -0
- package/dist/repository/create.d.mts +22 -0
- package/dist/repository/create.mjs +43 -0
- package/dist/repository/file.d.mts +43 -0
- package/dist/repository/file.mjs +82 -0
- package/dist/repository/import/import-glob.mjs +44 -0
- package/dist/repository/import/import-plan-builder.mjs +625 -0
- package/dist/repository/import/import-session-types.d.mts +280 -0
- package/dist/repository/import/import-session.mjs +96 -0
- package/dist/repository/import/import-view.mjs +133 -0
- package/dist/repository/memory.d.mts +17 -0
- package/dist/repository/memory.mjs +33 -0
- package/dist/repository/ops/fetch-operations.mjs +20 -0
- package/dist/repository/ops/fetch-types.d.mts +82 -0
- package/dist/repository/ops/fetch-url.mjs +82 -0
- package/dist/repository/ops/fs-object-operations.mjs +31 -0
- package/dist/repository/ops/maintenance-operations.mjs +62 -0
- package/dist/repository/ops/maintenance-types.d.mts +42 -0
- package/dist/repository/ops/object-operations.mjs +65 -0
- package/dist/repository/ops/object-types.d.mts +109 -0
- package/dist/repository/ops/push-operations.mjs +16 -0
- package/dist/repository/ops/push-resolution.mjs +17 -0
- package/dist/repository/ops/push-types.d.mts +72 -0
- package/dist/repository/ops/push-url.mjs +45 -0
- package/dist/repository/ops/reachability.mjs +60 -0
- package/dist/repository/ops/ref-operations.mjs +86 -0
- package/dist/repository/ops/ref-types.d.mts +70 -0
- package/dist/repository/tree/tree-patch.d.mts +64 -0
- package/dist/repository/tree/tree-patch.mjs +268 -0
- package/dist/repository/tree/tree-walk.d.mts +46 -0
- package/dist/repository/tree/tree-walk.mjs +65 -0
- package/dist/repository/tree/tree-writer.mjs +68 -0
- package/dist/repository/types.d.mts +36 -0
- package/dist/sha1.d.mts +4 -0
- package/dist/sha1.mjs +4 -0
- package/dist/transport/client/receive-pack/http.d.mts +33 -0
- package/dist/transport/client/receive-pack/http.mjs +99 -0
- package/dist/transport/client/receive-pack/push-error.d.mts +23 -0
- package/dist/transport/client/receive-pack/push-error.mjs +32 -0
- package/dist/transport/client/receive-pack/push-pack-plan.d.mts +28 -0
- package/dist/transport/client/receive-pack/push-pack-plan.mjs +60 -0
- package/dist/transport/client/receive-pack/push-policy.d.mts +19 -0
- package/dist/transport/client/receive-pack/push-policy.mjs +64 -0
- package/dist/transport/client/receive-pack/push-ref-plan.d.mts +45 -0
- package/dist/transport/client/receive-pack/push-ref-plan.mjs +108 -0
- package/dist/transport/client/receive-pack/push-report.d.mts +28 -0
- package/dist/transport/client/receive-pack/push-report.mjs +84 -0
- package/dist/transport/client/receive-pack/push-request-plan.mjs +52 -0
- package/dist/transport/client/receive-pack/push.d.mts +32 -0
- package/dist/transport/client/receive-pack/push.mjs +97 -0
- package/dist/transport/client/receive-pack/request.d.mts +39 -0
- package/dist/transport/client/receive-pack/request.mjs +46 -0
- package/dist/transport/client/receive-pack/response.d.mts +26 -0
- package/dist/transport/client/receive-pack/response.mjs +52 -0
- package/dist/transport/client/receive-pack/result.d.mts +34 -0
- package/dist/transport/client/receive-pack/result.mjs +100 -0
- package/dist/transport/client/upload-pack/capability-advertisement.d.mts +56 -0
- package/dist/transport/client/upload-pack/capability-advertisement.mjs +130 -0
- package/dist/transport/client/upload-pack/fetch.d.mts +109 -0
- package/dist/transport/client/upload-pack/fetch.mjs +392 -0
- package/dist/transport/client/upload-pack/http.d.mts +29 -0
- package/dist/transport/client/upload-pack/http.mjs +79 -0
- package/dist/transport/client/upload-pack/ls-refs.d.mts +75 -0
- package/dist/transport/client/upload-pack/ls-refs.mjs +150 -0
- package/dist/transport/client/upload-pack/object-info.d.mts +65 -0
- package/dist/transport/client/upload-pack/object-info.mjs +111 -0
- package/dist/transport/client/upload-pack/types.d.mts +153 -0
- package/dist/transport/http/index.d.mts +3 -0
- package/dist/transport/http/index.mjs +2 -0
- package/dist/transport/http/smart-http.d.mts +46 -0
- package/dist/transport/http/smart-http.mjs +176 -0
- package/dist/transport/http/types.d.mts +27 -0
- package/dist/transport/index.d.mts +9 -0
- package/dist/transport/index.mjs +8 -0
- package/dist/transport/protocol/object-graph.d.mts +63 -0
- package/dist/transport/protocol/object-graph.mjs +149 -0
- package/dist/transport/protocol/pkt-line.d.mts +109 -0
- package/dist/transport/protocol/pkt-line.mjs +195 -0
- package/dist/transport/protocol/ref-advertisement.mjs +185 -0
- package/dist/transport/protocol/ref-collection.d.mts +38 -0
- package/dist/transport/protocol/ref-collection.mjs +63 -0
- package/dist/transport/protocol/ref-match.d.mts +39 -0
- package/dist/transport/protocol/ref-match.mjs +42 -0
- package/dist/transport/protocol/refspec.d.mts +44 -0
- package/dist/transport/protocol/refspec.mjs +79 -0
- package/dist/transport/protocol/side-band.d.mts +65 -0
- package/dist/transport/protocol/side-band.mjs +142 -0
- package/dist/transport/protocol/transport-capabilities.mjs +46 -0
- package/dist/transport/protocol/types.d.mts +148 -0
- package/dist/transport/protocol/update-refs.d.mts +68 -0
- package/dist/transport/protocol/update-refs.mjs +126 -0
- package/dist/transport/receive-pack.d.mts +11 -0
- package/dist/transport/receive-pack.mjs +11 -0
- package/dist/transport/server/receive-pack/advertise.d.mts +28 -0
- package/dist/transport/server/receive-pack/advertise.mjs +88 -0
- package/dist/transport/server/receive-pack/handler.d.mts +30 -0
- package/dist/transport/server/receive-pack/handler.mjs +156 -0
- package/dist/transport/server/receive-pack/index.d.mts +6 -0
- package/dist/transport/server/receive-pack/index.mjs +6 -0
- package/dist/transport/server/receive-pack/parse.d.mts +17 -0
- package/dist/transport/server/receive-pack/parse.mjs +80 -0
- package/dist/transport/server/receive-pack/report-status.mjs +64 -0
- package/dist/transport/server/receive-pack/service.d.mts +41 -0
- package/dist/transport/server/receive-pack/service.mjs +39 -0
- package/dist/transport/server/receive-pack/types.d.mts +56 -0
- package/dist/transport/server/receive-pack/types.mjs +25 -0
- package/dist/transport/server/receive-pack/unpack.mjs +119 -0
- package/dist/transport/server/upload-pack/advertise.d.mts +20 -0
- package/dist/transport/server/upload-pack/advertise.mjs +30 -0
- package/dist/transport/server/upload-pack/command.d.mts +43 -0
- package/dist/transport/server/upload-pack/command.mjs +56 -0
- package/dist/transport/server/upload-pack/fetch.d.mts +43 -0
- package/dist/transport/server/upload-pack/fetch.mjs +217 -0
- package/dist/transport/server/upload-pack/index.d.mts +7 -0
- package/dist/transport/server/upload-pack/index.mjs +7 -0
- package/dist/transport/server/upload-pack/ls-refs.d.mts +38 -0
- package/dist/transport/server/upload-pack/ls-refs.mjs +113 -0
- package/dist/transport/server/upload-pack/service.d.mts +40 -0
- package/dist/transport/server/upload-pack/service.mjs +51 -0
- package/dist/transport/server/upload-pack/types.d.mts +11 -0
- package/dist/transport/server/upload-pack/types.mjs +21 -0
- package/dist/transport/upload-pack.d.mts +7 -0
- package/dist/transport/upload-pack.mjs +6 -0
- package/package.json +98 -0
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { SHA1 } from "../../core/types.mjs";
|
|
2
|
+
import { RefAdvertisement, RemoteRef } from "../../transport/protocol/types.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/repository/import/import-session-types.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* 远端 Git 数据来源
|
|
7
|
+
*
|
|
8
|
+
* 只描述"从哪里读",不描述"写到哪里"。
|
|
9
|
+
* ImportSource 不包含命名空间映射规则。
|
|
10
|
+
*/
|
|
11
|
+
interface ImportSource {
|
|
12
|
+
/** 远端仓库 URL */
|
|
13
|
+
readonly url: string;
|
|
14
|
+
/** 认证 token(用于 bearer 或 basic auth) */
|
|
15
|
+
readonly token?: string;
|
|
16
|
+
/** 自定义请求头 */
|
|
17
|
+
readonly headers?: Record<string, string>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 远端 ref 视图
|
|
21
|
+
*
|
|
22
|
+
* 一个可命名、可复用、冻结的远端 ref 集合。
|
|
23
|
+
* view 是冻结集合,不是活查询。
|
|
24
|
+
* view 可以被多个物化步骤复用。
|
|
25
|
+
*/
|
|
26
|
+
interface ImportView {
|
|
27
|
+
/** 视图包含的远端 ref 列表(冻结快照) */
|
|
28
|
+
readonly refs: readonly RemoteRef[];
|
|
29
|
+
/**
|
|
30
|
+
* 通过谓词过滤当前视图
|
|
31
|
+
*
|
|
32
|
+
* @param predicate - 过滤谓词,返回 true 的 ref 保留
|
|
33
|
+
* @returns 新的 ImportView
|
|
34
|
+
*/
|
|
35
|
+
where(predicate: (ref: RemoteRef) => boolean): ImportView;
|
|
36
|
+
/**
|
|
37
|
+
* 排除匹配指定 glob 模式的 ref
|
|
38
|
+
*
|
|
39
|
+
* @param pattern - glob 模式,如 "refs/tags/*beta*"
|
|
40
|
+
* @returns 新的 ImportView
|
|
41
|
+
*/
|
|
42
|
+
exclude(pattern: string): ImportView;
|
|
43
|
+
/**
|
|
44
|
+
* 与另一个 view 取并集
|
|
45
|
+
*
|
|
46
|
+
* @param other - 另一个 view
|
|
47
|
+
* @returns 新的 ImportView(含两个 view 的 refs,去重保留首次出现的 ref)
|
|
48
|
+
*/
|
|
49
|
+
union(other: ImportView): ImportView;
|
|
50
|
+
/**
|
|
51
|
+
* 为当前视图命名
|
|
52
|
+
*
|
|
53
|
+
* 命名后的 view 可用于 plan 阶段引用。
|
|
54
|
+
*
|
|
55
|
+
* @param label - 视图名称
|
|
56
|
+
* @returns NamedImportView
|
|
57
|
+
*/
|
|
58
|
+
name(label: string): NamedImportView;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 命名的远端 ref 视图
|
|
62
|
+
*
|
|
63
|
+
* 在 ImportView 基础上增加 label 属性,用于 plan 阶段的语义引用。
|
|
64
|
+
*/
|
|
65
|
+
interface NamedImportView extends ImportView {
|
|
66
|
+
/** 视图名称 */
|
|
67
|
+
readonly label: string;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Ref 更新策略
|
|
71
|
+
*/
|
|
72
|
+
type RefUpdatePolicy = {
|
|
73
|
+
mode: "fast-forward";
|
|
74
|
+
} | {
|
|
75
|
+
mode: "replace";
|
|
76
|
+
} | {
|
|
77
|
+
mode: "create-only";
|
|
78
|
+
} | {
|
|
79
|
+
mode: "mirror";
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* 命名空间物化选项
|
|
83
|
+
*/
|
|
84
|
+
interface NamespaceMaterializationOptions {
|
|
85
|
+
readonly policy?: RefUpdatePolicy;
|
|
86
|
+
readonly prune?: boolean;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Branch 物化选项
|
|
90
|
+
*/
|
|
91
|
+
interface BranchMaterializationOptions {
|
|
92
|
+
readonly policy?: RefUpdatePolicy;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Tag 物化选项
|
|
96
|
+
*/
|
|
97
|
+
interface TagMaterializationOptions {
|
|
98
|
+
readonly policy?: RefUpdatePolicy;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* HEAD 物化选项
|
|
102
|
+
*
|
|
103
|
+
* setHead() 只能绑定到同一 plan 中已物化出的 `refs/heads/*`。
|
|
104
|
+
* `detach` 仅改变 HEAD 最终写入方式,不放宽目标命名空间。
|
|
105
|
+
*/
|
|
106
|
+
interface HeadMaterializationOptions {
|
|
107
|
+
readonly detach?: boolean;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Ref 物化构建器
|
|
111
|
+
*/
|
|
112
|
+
interface RefMaterializationBuilder {
|
|
113
|
+
toNamespace(targetPattern: string, options?: NamespaceMaterializationOptions): ImportPlanBuilder;
|
|
114
|
+
toBranch(branchName: string, options?: BranchMaterializationOptions): ImportPlanBuilder;
|
|
115
|
+
toTag(tagName: string, options?: TagMaterializationOptions): ImportPlanBuilder;
|
|
116
|
+
setHead(options?: HeadMaterializationOptions): ImportPlanBuilder;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* 导入计划构建器
|
|
120
|
+
*/
|
|
121
|
+
interface ImportPlanBuilder {
|
|
122
|
+
materialize(view: ImportView): RefMaterializationBuilder;
|
|
123
|
+
preview(): Promise<ImportPreview>;
|
|
124
|
+
apply(): Promise<ImportApplyResult>;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* 计划中的远端 ref 项
|
|
128
|
+
*/
|
|
129
|
+
interface PlannedRemoteRef {
|
|
130
|
+
readonly remoteRef: RemoteRef;
|
|
131
|
+
readonly localTarget: string;
|
|
132
|
+
readonly policy: RefUpdatePolicy;
|
|
133
|
+
readonly viewLabel?: string;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* 本地前置条件
|
|
137
|
+
*/
|
|
138
|
+
interface LocalPrecondition {
|
|
139
|
+
readonly refName: string;
|
|
140
|
+
readonly expectedHash: SHA1 | null;
|
|
141
|
+
/**
|
|
142
|
+
* 原始 ref 值快照
|
|
143
|
+
*
|
|
144
|
+
* 用于 HEAD 这类可能是符号引用的特殊 ref。
|
|
145
|
+
* 普通 hash ref 通常不需要此字段。
|
|
146
|
+
*/
|
|
147
|
+
readonly expectedValue?: string | null;
|
|
148
|
+
/**
|
|
149
|
+
* 命名空间快照前缀
|
|
150
|
+
*
|
|
151
|
+
* 用于 prune ownership 场景。
|
|
152
|
+
* 当此字段存在时,表示该前置条件校验的是整个命名空间下的 ref 集合,
|
|
153
|
+
* 而不是单个 ref。
|
|
154
|
+
*/
|
|
155
|
+
readonly namespacePrefix?: string;
|
|
156
|
+
/**
|
|
157
|
+
* 命名空间 ownership 模式
|
|
158
|
+
*
|
|
159
|
+
* 当 prune 目标不是简单的前缀投影(例如 `refs/mirrors/*-backup`)时,
|
|
160
|
+
* 需要记录完整目标模式,以便 apply() 按同一集合重新校验和 prune。
|
|
161
|
+
*/
|
|
162
|
+
readonly namespacePattern?: string;
|
|
163
|
+
/**
|
|
164
|
+
* 命名空间内全部 ref 的原始值快照
|
|
165
|
+
*
|
|
166
|
+
* 与 namespacePrefix 配合使用,用于检测 preview() 后
|
|
167
|
+
* 该命名空间下 ref 的新增、删除或内容漂移。
|
|
168
|
+
* 若存在 namespacePattern,则按完整模式而不是简单前缀匹配。
|
|
169
|
+
*/
|
|
170
|
+
readonly expectedRefs?: readonly {
|
|
171
|
+
readonly refName: string;
|
|
172
|
+
readonly expectedValue: string | null;
|
|
173
|
+
}[];
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* 计划中的 ref 操作
|
|
177
|
+
*/
|
|
178
|
+
interface PlannedRefOperation {
|
|
179
|
+
readonly localRef: string;
|
|
180
|
+
readonly newHash: SHA1;
|
|
181
|
+
readonly policy: RefUpdatePolicy;
|
|
182
|
+
readonly viewLabel?: string;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* 计划中的 HEAD 操作
|
|
186
|
+
*
|
|
187
|
+
* targetRef 始终是同一计划内已物化成功的本地 branch ref,
|
|
188
|
+
* 且必须位于 `refs/heads/*`。
|
|
189
|
+
*/
|
|
190
|
+
interface PlannedHeadOperation {
|
|
191
|
+
readonly targetRef: string;
|
|
192
|
+
readonly detach: boolean;
|
|
193
|
+
readonly viewLabel?: string;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* 计划中的 ref 删除
|
|
197
|
+
*/
|
|
198
|
+
interface PlannedRefDeletion {
|
|
199
|
+
readonly refName: string;
|
|
200
|
+
readonly reason: string;
|
|
201
|
+
readonly namespacePattern: string;
|
|
202
|
+
readonly viewLabel?: string;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* 导入诊断信息
|
|
206
|
+
*/
|
|
207
|
+
interface ImportDiagnostic {
|
|
208
|
+
readonly level: "info" | "warn" | "error";
|
|
209
|
+
readonly message: string;
|
|
210
|
+
readonly refName?: string;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* 导入预览结果
|
|
214
|
+
*
|
|
215
|
+
* preview() 的目标是明确展示将会发生什么,
|
|
216
|
+
* 让调用者在 apply() 前有完整的认识。
|
|
217
|
+
*/
|
|
218
|
+
interface ImportPreview {
|
|
219
|
+
readonly remoteSnapshot: RefAdvertisement;
|
|
220
|
+
readonly selectedRefs: readonly PlannedRemoteRef[];
|
|
221
|
+
readonly objectRoots: readonly SHA1[];
|
|
222
|
+
readonly prefetchedObjects: number;
|
|
223
|
+
readonly localPreconditions: readonly LocalPrecondition[];
|
|
224
|
+
readonly refOperations: readonly PlannedRefOperation[];
|
|
225
|
+
readonly headOperation?: PlannedHeadOperation;
|
|
226
|
+
readonly pruneOperations: readonly PlannedRefDeletion[];
|
|
227
|
+
readonly diagnostics: readonly ImportDiagnostic[];
|
|
228
|
+
readonly canApply: boolean;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* 导入执行结果
|
|
232
|
+
*/
|
|
233
|
+
interface ImportApplyResult {
|
|
234
|
+
readonly importedObjects: number;
|
|
235
|
+
readonly updatedRefs: ReadonlyMap<string, SHA1>;
|
|
236
|
+
readonly deletedRefs: readonly string[];
|
|
237
|
+
readonly headTarget?: string;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* 导入会话
|
|
241
|
+
*
|
|
242
|
+
* 一次冻结的远端快照。
|
|
243
|
+
* 在创建时拉取一次 advertisement,所有派生 view 和 plan 都基于该快照。
|
|
244
|
+
* 想刷新远端状态时,必须重新创建 session。
|
|
245
|
+
*/
|
|
246
|
+
interface ImportSession {
|
|
247
|
+
readonly source: ImportSource;
|
|
248
|
+
readonly advertisement: RefAdvertisement;
|
|
249
|
+
select(pattern: string): ImportView;
|
|
250
|
+
selectRefs(patterns: readonly string[]): ImportView;
|
|
251
|
+
defaultBranch(): ImportView;
|
|
252
|
+
headTarget(): ImportView;
|
|
253
|
+
allRefs(): ImportView;
|
|
254
|
+
plan(): ImportPlanBuilder;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* 仓库导入操作
|
|
258
|
+
*/
|
|
259
|
+
interface RepoImportOperations {
|
|
260
|
+
/**
|
|
261
|
+
* 打开一次导入会话
|
|
262
|
+
*
|
|
263
|
+
* 创建时自动拉取远端 advertisement。
|
|
264
|
+
* 会话及其所有派生 view 都是基于该快照的冻结视图。
|
|
265
|
+
*
|
|
266
|
+
* @param source - 导入源配置
|
|
267
|
+
* @returns ImportSession
|
|
268
|
+
*
|
|
269
|
+
* @example
|
|
270
|
+
* ```ts
|
|
271
|
+
* const session = await repo.openImportSession({
|
|
272
|
+
* url: "https://example.com/repo.git",
|
|
273
|
+
* });
|
|
274
|
+
* const branches = session.select("refs/heads/*");
|
|
275
|
+
* ```
|
|
276
|
+
*/
|
|
277
|
+
openImportSession(source: ImportSource): Promise<ImportSession>;
|
|
278
|
+
}
|
|
279
|
+
//#endregion
|
|
280
|
+
export { RepoImportOperations };
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { createV2HttpTransport } from "../../transport/client/upload-pack/http.mjs";
|
|
2
|
+
import { lsRefs, lsRefsToRefAdvertisement } from "../../transport/client/upload-pack/ls-refs.mjs";
|
|
3
|
+
import { matchRefGlob } from "./import-glob.mjs";
|
|
4
|
+
import { createImportView } from "./import-view.mjs";
|
|
5
|
+
import { createPlanBuilder } from "./import-plan-builder.mjs";
|
|
6
|
+
//#region src/repository/import/import-session.ts
|
|
7
|
+
/**
|
|
8
|
+
* Import Session 实现
|
|
9
|
+
*
|
|
10
|
+
* 包含 session 创建和仓库级别导入操作工厂。
|
|
11
|
+
* 使用 Git Wire 协议 v2 ls-refs + fetch 获取远端数据。
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* 创建 ImportSession
|
|
15
|
+
*
|
|
16
|
+
* @param source - 导入源配置
|
|
17
|
+
* @param backend - 仓库后端
|
|
18
|
+
* @param advertisement - 已获取的远端广告快照
|
|
19
|
+
* @returns ImportSession
|
|
20
|
+
*/
|
|
21
|
+
function createImportSession(source, backend, advertisement, transportFactory, v2Transport) {
|
|
22
|
+
const frozenSource = Object.freeze({
|
|
23
|
+
url: source.url,
|
|
24
|
+
token: source.token,
|
|
25
|
+
headers: source.headers ? Object.freeze({ ...source.headers }) : void 0
|
|
26
|
+
});
|
|
27
|
+
const frozenRefs = Object.freeze(advertisement.refs.map((ref) => Object.freeze({ ...ref })));
|
|
28
|
+
const frozenAdvertisement = Object.freeze({
|
|
29
|
+
...advertisement,
|
|
30
|
+
refs: frozenRefs,
|
|
31
|
+
capabilities: Object.freeze({ ...advertisement.capabilities })
|
|
32
|
+
});
|
|
33
|
+
const allRefs = frozenAdvertisement.refs;
|
|
34
|
+
return {
|
|
35
|
+
source: frozenSource,
|
|
36
|
+
get advertisement() {
|
|
37
|
+
return frozenAdvertisement;
|
|
38
|
+
},
|
|
39
|
+
select(pattern) {
|
|
40
|
+
return createImportView(allRefs.filter((ref) => matchRefGlob(pattern, ref.name)));
|
|
41
|
+
},
|
|
42
|
+
selectRefs(patterns) {
|
|
43
|
+
const seen = /* @__PURE__ */ new Set();
|
|
44
|
+
const result = [];
|
|
45
|
+
for (const pattern of patterns) for (const ref of allRefs) if (matchRefGlob(pattern, ref.name) && !seen.has(ref.name)) {
|
|
46
|
+
seen.add(ref.name);
|
|
47
|
+
result.push(ref);
|
|
48
|
+
}
|
|
49
|
+
return createImportView(result);
|
|
50
|
+
},
|
|
51
|
+
defaultBranch() {
|
|
52
|
+
if (!frozenAdvertisement.defaultBranch) return createImportView([]);
|
|
53
|
+
const ref = allRefs.find((r) => r.name === frozenAdvertisement.defaultBranch);
|
|
54
|
+
return createImportView(ref ? [ref] : []);
|
|
55
|
+
},
|
|
56
|
+
headTarget() {
|
|
57
|
+
const headRef = allRefs.find((r) => r.name === "HEAD");
|
|
58
|
+
if (!headRef?.symrefTarget) return createImportView([]);
|
|
59
|
+
const target = allRefs.find((r) => r.name === headRef.symrefTarget);
|
|
60
|
+
return createImportView(target ? [target] : []);
|
|
61
|
+
},
|
|
62
|
+
allRefs() {
|
|
63
|
+
return createImportView(allRefs.filter((r) => r.name !== "HEAD"));
|
|
64
|
+
},
|
|
65
|
+
plan() {
|
|
66
|
+
return createPlanBuilder(backend, frozenAdvertisement, frozenSource, transportFactory, v2Transport);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 创建仓库导入操作
|
|
72
|
+
*
|
|
73
|
+
* 使用 v2 Git Wire 协议,直接构造 v2 transport 并通过 ls-refs 获取远端引用。
|
|
74
|
+
*
|
|
75
|
+
* @param backend - 仓库后端
|
|
76
|
+
* @returns RepoImportOperations
|
|
77
|
+
*/
|
|
78
|
+
function createRepoImportOperations(backend, transportFactory, testV2Transport) {
|
|
79
|
+
return { async openImportSession(source) {
|
|
80
|
+
const v2Transport = testV2Transport ?? createV2HttpTransport(source.url, {
|
|
81
|
+
token: source.token,
|
|
82
|
+
headers: source.headers
|
|
83
|
+
});
|
|
84
|
+
return createImportSession(source, backend, lsRefsToRefAdvertisement(await lsRefs(v2Transport, {
|
|
85
|
+
symrefs: true,
|
|
86
|
+
peel: true,
|
|
87
|
+
refPrefixes: [
|
|
88
|
+
"HEAD",
|
|
89
|
+
"refs/heads/",
|
|
90
|
+
"refs/tags/"
|
|
91
|
+
]
|
|
92
|
+
})), transportFactory, v2Transport);
|
|
93
|
+
} };
|
|
94
|
+
}
|
|
95
|
+
//#endregion
|
|
96
|
+
export { createRepoImportOperations };
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { matchRefGlob } from "./import-glob.mjs";
|
|
2
|
+
//#region src/repository/import/import-view.ts
|
|
3
|
+
/**
|
|
4
|
+
* Import View 实现
|
|
5
|
+
*
|
|
6
|
+
* 提供远端 ref 视图的创建和操作功能,包括视图过滤、排除、合并和命名,
|
|
7
|
+
* 以及路径前缀计算和命名空间目标解析。
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* 创建 ImportView
|
|
11
|
+
*
|
|
12
|
+
* @param refs - 冻结的远端 ref 列表
|
|
13
|
+
* @param label - 可选的视图标签
|
|
14
|
+
* @returns ImportView 或 NamedImportView
|
|
15
|
+
*/
|
|
16
|
+
function createImportView(refs, label) {
|
|
17
|
+
const frozenRefs = Object.freeze(refs.map((ref) => Object.freeze({ ...ref })));
|
|
18
|
+
return {
|
|
19
|
+
get refs() {
|
|
20
|
+
return frozenRefs;
|
|
21
|
+
},
|
|
22
|
+
where(predicate) {
|
|
23
|
+
return createImportView(frozenRefs.filter(predicate));
|
|
24
|
+
},
|
|
25
|
+
exclude(pattern) {
|
|
26
|
+
return createImportView(frozenRefs.filter((ref) => !matchRefGlob(pattern, ref.name)));
|
|
27
|
+
},
|
|
28
|
+
union(other) {
|
|
29
|
+
const seen = /* @__PURE__ */ new Set();
|
|
30
|
+
const merged = [];
|
|
31
|
+
for (const ref of frozenRefs) if (!seen.has(ref.name)) {
|
|
32
|
+
seen.add(ref.name);
|
|
33
|
+
merged.push(ref);
|
|
34
|
+
}
|
|
35
|
+
for (const ref of other.refs) if (!seen.has(ref.name)) {
|
|
36
|
+
seen.add(ref.name);
|
|
37
|
+
merged.push(ref);
|
|
38
|
+
}
|
|
39
|
+
return createImportView(merged);
|
|
40
|
+
},
|
|
41
|
+
name(n) {
|
|
42
|
+
return createImportView(frozenRefs, n);
|
|
43
|
+
},
|
|
44
|
+
get label() {
|
|
45
|
+
return label;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 计算多个 ref 名称的最长公共路径前缀
|
|
51
|
+
*
|
|
52
|
+
* 结果保证以 `/` 结尾。单个 ref 时取其目录前缀。
|
|
53
|
+
*
|
|
54
|
+
* @param names - ref 名称列表
|
|
55
|
+
* @returns 最长公共路径前缀(含末尾 /),如 "refs/heads/"
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```ts
|
|
59
|
+
* longestCommonRefPrefix(["refs/heads/main", "refs/heads/develop"]); // "refs/heads/"
|
|
60
|
+
* longestCommonRefPrefix(["refs/heads/main", "refs/tags/v1"]); // "refs/"
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
function longestCommonRefPrefix(names) {
|
|
64
|
+
if (names.length === 0) return "";
|
|
65
|
+
if (names.length === 1) {
|
|
66
|
+
const lastSlash = names[0].lastIndexOf("/");
|
|
67
|
+
return lastSlash >= 0 ? names[0].slice(0, lastSlash + 1) : "";
|
|
68
|
+
}
|
|
69
|
+
let prefix = names[0];
|
|
70
|
+
for (let i = 1; i < names.length; i++) while (names[i].indexOf(prefix) !== 0) {
|
|
71
|
+
prefix = prefix.slice(0, -1);
|
|
72
|
+
if (prefix === "") return "";
|
|
73
|
+
}
|
|
74
|
+
const lastSlash = prefix.lastIndexOf("/");
|
|
75
|
+
return lastSlash >= 0 ? prefix.slice(0, lastSlash + 1) : "";
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 判断两个远端 ref 是否表示同一条广告项
|
|
79
|
+
*
|
|
80
|
+
* @param left - 左侧 ref
|
|
81
|
+
* @param right - 右侧 ref
|
|
82
|
+
* @returns 是否相同
|
|
83
|
+
*/
|
|
84
|
+
function isSameRemoteRef(left, right) {
|
|
85
|
+
return left.name === right.name && left.hash === right.hash && left.peeled === right.peeled && left.symrefTarget === right.symrefTarget;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* 解析命名空间物化:将 view 中的 refs 映射到目标命名空间
|
|
89
|
+
*
|
|
90
|
+
* 对每个 ref,计算其相对于 view 公共前缀的偏移,
|
|
91
|
+
* 并用该偏移替换目标模式中的 `*`。
|
|
92
|
+
*
|
|
93
|
+
* @param refs - view 中的远端 refs
|
|
94
|
+
* @param targetPattern - 目标模式,如 "refs/mirrors/upstream/*"
|
|
95
|
+
* @returns 映射结果列表
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```ts
|
|
99
|
+
* const targets = resolveNamespaceTargets(
|
|
100
|
+
* [refs/heads/main, refs/heads/develop],
|
|
101
|
+
* "refs/mirrors/upstream/*",
|
|
102
|
+
* );
|
|
103
|
+
* // => [{ localRef: "refs/mirrors/upstream/main" }, { localRef: "refs/mirrors/upstream/develop" }]
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
function resolveNamespaceTargets(refs, targetPattern) {
|
|
107
|
+
if (refs.length === 0) return [];
|
|
108
|
+
if (!targetPattern.includes("*")) return refs.map((r) => ({
|
|
109
|
+
remoteRef: r,
|
|
110
|
+
localRef: targetPattern
|
|
111
|
+
}));
|
|
112
|
+
const [beforeStar, afterStar] = targetPattern.split("*", 2);
|
|
113
|
+
const commonPrefix = longestCommonRefPrefix(refs.map((r) => r.name));
|
|
114
|
+
const after = afterStar ?? "";
|
|
115
|
+
return refs.map((r) => {
|
|
116
|
+
return {
|
|
117
|
+
remoteRef: r,
|
|
118
|
+
localRef: `${beforeStar}${r.name.slice(commonPrefix.length)}${after}`
|
|
119
|
+
};
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* 截取命名空间目标模式的固定前缀
|
|
124
|
+
*
|
|
125
|
+
* @param targetPattern - 目标模式
|
|
126
|
+
* @returns `*` 之前的固定前缀;无 `*` 时返回 null
|
|
127
|
+
*/
|
|
128
|
+
function getNamespacePatternPrefix(targetPattern) {
|
|
129
|
+
const starIdx = targetPattern.indexOf("*");
|
|
130
|
+
return starIdx >= 0 ? targetPattern.slice(0, starIdx) : null;
|
|
131
|
+
}
|
|
132
|
+
//#endregion
|
|
133
|
+
export { createImportView, getNamespacePatternPrefix, isSameRemoteRef, resolveNamespaceTargets };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Repository } from "./types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/repository/memory.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* 创建内存仓库
|
|
6
|
+
*
|
|
7
|
+
* @returns 仓库实例
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* const repo = createMemoryRepository();
|
|
12
|
+
* repo.createBranch("main", repo.createTree([]));
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
declare function createMemoryRepository(): Repository;
|
|
16
|
+
//#endregion
|
|
17
|
+
export { createMemoryRepository };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { createMemoryRepositoryBackend } from "../backend/memory-backend.mjs";
|
|
2
|
+
import { createRepository } from "./create.mjs";
|
|
3
|
+
//#region src/repository/memory.ts
|
|
4
|
+
/**
|
|
5
|
+
* 内存仓库便捷创建函数
|
|
6
|
+
*
|
|
7
|
+
* 一键创建完全在内存中的 Git 仓库,无需任何文件系统操作。
|
|
8
|
+
* 适用于测试和临时操作场景。
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { createMemoryRepository } from "nano-git/repository/memory";
|
|
13
|
+
*
|
|
14
|
+
* const repo = createMemoryRepository();
|
|
15
|
+
* const hash = repo.writeBlob(Buffer.from("hello world"));
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* 创建内存仓库
|
|
20
|
+
*
|
|
21
|
+
* @returns 仓库实例
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* const repo = createMemoryRepository();
|
|
26
|
+
* repo.createBranch("main", repo.createTree([]));
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
function createMemoryRepository() {
|
|
30
|
+
return createRepository(createMemoryRepositoryBackend());
|
|
31
|
+
}
|
|
32
|
+
//#endregion
|
|
33
|
+
export { createMemoryRepository };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { runFetchToUrl } from "./fetch-url.mjs";
|
|
2
|
+
//#region src/repository/ops/fetch-operations.ts
|
|
3
|
+
/**
|
|
4
|
+
* Fetch 操作编排
|
|
5
|
+
*
|
|
6
|
+
* repository 层只保留显式 URL 的 fetch 入口。
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* 创建仓库 fetch 操作集合
|
|
10
|
+
*
|
|
11
|
+
* @param backend - 仓库后端
|
|
12
|
+
* @returns fetch 操作集合
|
|
13
|
+
*/
|
|
14
|
+
function createFetchRepositoryOperations(backend) {
|
|
15
|
+
return { async fetch(url, options) {
|
|
16
|
+
return runFetchToUrl(backend, url, options);
|
|
17
|
+
} };
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { createFetchRepositoryOperations };
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { SHA1 } from "../../core/types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/repository/ops/fetch-types.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* 仓库 fetch 操作选项
|
|
6
|
+
*/
|
|
7
|
+
interface RepositoryFetchOptions {
|
|
8
|
+
/**
|
|
9
|
+
* RefSpec 列表,格式如 "refs/heads/main:refs/heads/main"
|
|
10
|
+
* 传入后完全取代默认映射(远端所有 branches → refs/heads/* + tags → refs/tags/*)。
|
|
11
|
+
*/
|
|
12
|
+
readonly refSpecs?: string[];
|
|
13
|
+
/**
|
|
14
|
+
* 仅 fetch 匹配指定 glob 模式的远端 refs(如 "refs/heads/feature/*"),
|
|
15
|
+
* 不 fetch 全部。不可与 refSpecs 同时使用。
|
|
16
|
+
*/
|
|
17
|
+
readonly refPatterns?: string[];
|
|
18
|
+
/** 认证 token(用于 bearer 或 basic auth) */
|
|
19
|
+
readonly token?: string;
|
|
20
|
+
/** 自定义请求头 */
|
|
21
|
+
readonly headers?: Record<string, string>;
|
|
22
|
+
/** 不自动 fetch 远端 tags(对标 `git fetch --no-tags`) */
|
|
23
|
+
readonly noTags?: boolean;
|
|
24
|
+
/** 删除本地有但远端已不存在的 refs(对标 `git fetch --prune`) */
|
|
25
|
+
readonly prune?: boolean;
|
|
26
|
+
/** 强制更新(对标 `git fetch --force`,等价于所有 refspec 加 + 前缀) */
|
|
27
|
+
readonly force?: boolean;
|
|
28
|
+
/** 浅 fetch 深度(⚠️ ImportSession 当前不支持,传此值会静默忽略) */
|
|
29
|
+
readonly depth?: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 单条引用更新结果
|
|
33
|
+
*/
|
|
34
|
+
interface FetchRefUpdateResult {
|
|
35
|
+
/** 引用名称,如 "refs/heads/main" */
|
|
36
|
+
readonly refName: string;
|
|
37
|
+
/** 更新前的哈希 */
|
|
38
|
+
readonly oldHash: SHA1 | null;
|
|
39
|
+
/** 更新后的哈希 */
|
|
40
|
+
readonly newHash: SHA1 | null;
|
|
41
|
+
/** 是否成功 */
|
|
42
|
+
readonly success: boolean;
|
|
43
|
+
/** 是否强制更新 */
|
|
44
|
+
readonly forced: boolean;
|
|
45
|
+
/** 失败时的错误消息 */
|
|
46
|
+
readonly error?: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 仓库 fetch 操作结果
|
|
50
|
+
*/
|
|
51
|
+
interface RepositoryFetchResult {
|
|
52
|
+
/** 已更新的引用列表 */
|
|
53
|
+
readonly updatedRefs: readonly FetchRefUpdateResult[];
|
|
54
|
+
/** 导入的对象数量 */
|
|
55
|
+
readonly objectCount: number;
|
|
56
|
+
/** 服务端返回的进度消息 */
|
|
57
|
+
readonly progress: readonly string[];
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 仓库 fetch 操作接口
|
|
61
|
+
*/
|
|
62
|
+
interface RepositoryFetchOperations {
|
|
63
|
+
/**
|
|
64
|
+
* 从远端仓库拉取 refs 和对象
|
|
65
|
+
*
|
|
66
|
+
* 等价于 `git fetch <url>`。
|
|
67
|
+
* 默认行为:拉取所有远端分支(fast-forward)+ 标签 + 设置 HEAD。
|
|
68
|
+
*
|
|
69
|
+
* @param url - 远端仓库 URL
|
|
70
|
+
* @param options - 可选参数
|
|
71
|
+
* @returns fetch 结果
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```ts
|
|
75
|
+
* const result = await repo.fetch("https://github.com/user/repo.git");
|
|
76
|
+
* console.log(`Updated ${result.updatedRefs.length} refs`);
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
fetch(url: string, options?: RepositoryFetchOptions): Promise<RepositoryFetchResult>;
|
|
80
|
+
}
|
|
81
|
+
//#endregion
|
|
82
|
+
export { RepositoryFetchOperations };
|