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,33 @@
|
|
|
1
|
+
//#region src/refs/shallow/memory.ts
|
|
2
|
+
/**
|
|
3
|
+
* 创建基于内存的 Shallow 存储
|
|
4
|
+
*
|
|
5
|
+
* @param initial - 初始 shallow 边界集合(可选)
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* const store = createMemoryShallowStore([hashA]);
|
|
10
|
+
* console.log(store.isShallow(hashA)); // true
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
function createMemoryShallowStore(initial) {
|
|
14
|
+
const shallowSet = new Set(initial ?? []);
|
|
15
|
+
return {
|
|
16
|
+
read() {
|
|
17
|
+
return Array.from(shallowSet).sort();
|
|
18
|
+
},
|
|
19
|
+
write(boundaries) {
|
|
20
|
+
shallowSet.clear();
|
|
21
|
+
for (const hash of boundaries) shallowSet.add(hash);
|
|
22
|
+
},
|
|
23
|
+
applyUpdate(update) {
|
|
24
|
+
for (const hash of update.unshallow) shallowSet.delete(hash);
|
|
25
|
+
for (const hash of update.shallow) shallowSet.add(hash);
|
|
26
|
+
},
|
|
27
|
+
isShallow(hash) {
|
|
28
|
+
return shallowSet.has(hash);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//#endregion
|
|
33
|
+
export { createMemoryShallowStore };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { RepositoryBackend } from "../backend/types.mjs";
|
|
2
|
+
import { Repository } from "./types.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/repository/create.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* 基于显式后端创建仓库实例
|
|
7
|
+
*
|
|
8
|
+
* Repository 不负责拼装 ObjectStore / RefStore,
|
|
9
|
+
* 调用方需要显式提供统一的 RepositoryBackend。
|
|
10
|
+
*
|
|
11
|
+
* @param backend - 仓库后端
|
|
12
|
+
* @returns 仓库实例
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* const backend = createMemoryRepositoryBackend();
|
|
17
|
+
* const repo = createRepository(backend);
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
declare function createRepository(backend: RepositoryBackend): Repository;
|
|
21
|
+
//#endregion
|
|
22
|
+
export { createRepository };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { createRepoImportOperations } from "./import/import-session.mjs";
|
|
2
|
+
import { createFetchRepositoryOperations } from "./ops/fetch-operations.mjs";
|
|
3
|
+
import { createMaintenanceRepositoryOperations } from "./ops/maintenance-operations.mjs";
|
|
4
|
+
import { createObjectRepositoryOperations } from "./ops/object-operations.mjs";
|
|
5
|
+
import { createPushRepositoryOperations } from "./ops/push-operations.mjs";
|
|
6
|
+
import { createRefRepositoryOperations } from "./ops/ref-operations.mjs";
|
|
7
|
+
//#region src/repository/create.ts
|
|
8
|
+
/**
|
|
9
|
+
* 仓库实例创建逻辑
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* 基于显式后端创建仓库实例
|
|
13
|
+
*
|
|
14
|
+
* Repository 不负责拼装 ObjectStore / RefStore,
|
|
15
|
+
* 调用方需要显式提供统一的 RepositoryBackend。
|
|
16
|
+
*
|
|
17
|
+
* @param backend - 仓库后端
|
|
18
|
+
* @returns 仓库实例
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* const backend = createMemoryRepositoryBackend();
|
|
23
|
+
* const repo = createRepository(backend);
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
function createRepository(backend) {
|
|
27
|
+
const { objects, refs, packs, shallow, gitDir } = backend;
|
|
28
|
+
return {
|
|
29
|
+
objects,
|
|
30
|
+
refs,
|
|
31
|
+
packs,
|
|
32
|
+
shallow,
|
|
33
|
+
gitDir,
|
|
34
|
+
...createObjectRepositoryOperations(objects),
|
|
35
|
+
...createRefRepositoryOperations(backend),
|
|
36
|
+
...createMaintenanceRepositoryOperations(objects, refs, packs),
|
|
37
|
+
...createPushRepositoryOperations(backend),
|
|
38
|
+
...createFetchRepositoryOperations(backend),
|
|
39
|
+
...createRepoImportOperations(backend)
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//#endregion
|
|
43
|
+
export { createRepository };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { FileRepository } from "./types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/repository/file.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* 初始化一个新的 bare Git 仓库
|
|
6
|
+
*
|
|
7
|
+
* 等价于 `git init --bare`,所有 Git 数据直接存放在传入路径下。
|
|
8
|
+
* 如需创建非 bare 仓库,请自行拼接 `.git` 子路径。
|
|
9
|
+
*
|
|
10
|
+
* @param path - bare 仓库根目录路径(Git 数据直接存放于此)
|
|
11
|
+
* @returns 仓库实例
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const repo = initRepository("/tmp/demo");
|
|
16
|
+
* console.log(repo.getCurrentBranch()); // => "main"
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
declare function initRepository(path: string): FileRepository;
|
|
20
|
+
/**
|
|
21
|
+
* 打开一个已有的 Git 仓库
|
|
22
|
+
*
|
|
23
|
+
* 传入的路径直接作为 `gitDir` 使用:
|
|
24
|
+
* - bare 仓库:传入仓库根路径
|
|
25
|
+
* - 非 bare 仓库:传入 `.git` 目录的完整路径
|
|
26
|
+
*
|
|
27
|
+
* 通过检测 `HEAD` 文件是否存在来判断是否为有效的 git 目录。
|
|
28
|
+
*
|
|
29
|
+
* @param path - git 目录路径(bare 仓库根路径,或非 bare 仓库的 `.git` 目录)
|
|
30
|
+
* @returns 仓库实例
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```ts
|
|
34
|
+
* // bare 仓库
|
|
35
|
+
* const bareRepo = openRepository("/path/to/bare-repo");
|
|
36
|
+
*
|
|
37
|
+
* // 非 bare 仓库(需显式传入 .git 路径)
|
|
38
|
+
* const nonBareRepo = openRepository("/path/to/repo/.git");
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
declare function openRepository(path: string): FileRepository;
|
|
42
|
+
//#endregion
|
|
43
|
+
export { initRepository, openRepository };
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { RepositoryError } from "../core/errors.mjs";
|
|
2
|
+
import { createFileRepositoryBackend } from "../backend/file-backend.mjs";
|
|
3
|
+
import { createRepository } from "./create.mjs";
|
|
4
|
+
import { createRepositoryFsObjectOperations } from "./ops/fs-object-operations.mjs";
|
|
5
|
+
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
//#region src/repository/file.ts
|
|
8
|
+
/**
|
|
9
|
+
* 文件仓库便捷创建函数
|
|
10
|
+
*
|
|
11
|
+
* 初始化或打开基于文件系统的 Git 仓库。
|
|
12
|
+
* 拉入 `node:fs` 和完整文件后端。
|
|
13
|
+
*
|
|
14
|
+
* 函数直接接受仓库根路径作为 `gitDir` 参数:
|
|
15
|
+
* - bare 仓库:传入仓库根路径即可
|
|
16
|
+
* - 非 bare 仓库:显式传入 `.git` 子路径
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* import { initRepository, openRepository } from "nano-git/repository/file";
|
|
21
|
+
*
|
|
22
|
+
* const repo = initRepository("/tmp/my-repo");
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* 初始化一个新的 bare Git 仓库
|
|
27
|
+
*
|
|
28
|
+
* 等价于 `git init --bare`,所有 Git 数据直接存放在传入路径下。
|
|
29
|
+
* 如需创建非 bare 仓库,请自行拼接 `.git` 子路径。
|
|
30
|
+
*
|
|
31
|
+
* @param path - bare 仓库根目录路径(Git 数据直接存放于此)
|
|
32
|
+
* @returns 仓库实例
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* const repo = initRepository("/tmp/demo");
|
|
37
|
+
* console.log(repo.getCurrentBranch()); // => "main"
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
function initRepository(path) {
|
|
41
|
+
mkdirSync(join(path, "objects"), { recursive: true });
|
|
42
|
+
mkdirSync(join(path, "refs", "heads"), { recursive: true });
|
|
43
|
+
mkdirSync(join(path, "refs", "tags"), { recursive: true });
|
|
44
|
+
writeFileSync(join(path, "HEAD"), "ref: refs/heads/main\n");
|
|
45
|
+
return createFileRepository(path);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 打开一个已有的 Git 仓库
|
|
49
|
+
*
|
|
50
|
+
* 传入的路径直接作为 `gitDir` 使用:
|
|
51
|
+
* - bare 仓库:传入仓库根路径
|
|
52
|
+
* - 非 bare 仓库:传入 `.git` 目录的完整路径
|
|
53
|
+
*
|
|
54
|
+
* 通过检测 `HEAD` 文件是否存在来判断是否为有效的 git 目录。
|
|
55
|
+
*
|
|
56
|
+
* @param path - git 目录路径(bare 仓库根路径,或非 bare 仓库的 `.git` 目录)
|
|
57
|
+
* @returns 仓库实例
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```ts
|
|
61
|
+
* // bare 仓库
|
|
62
|
+
* const bareRepo = openRepository("/path/to/bare-repo");
|
|
63
|
+
*
|
|
64
|
+
* // 非 bare 仓库(需显式传入 .git 路径)
|
|
65
|
+
* const nonBareRepo = openRepository("/path/to/repo/.git");
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
function openRepository(path) {
|
|
69
|
+
if (!existsSync(join(path, "HEAD"))) throw new RepositoryError(`Not a git repository: ${path}`);
|
|
70
|
+
return createFileRepository(path);
|
|
71
|
+
}
|
|
72
|
+
function createFileRepository(path) {
|
|
73
|
+
const backend = createFileRepositoryBackend(path);
|
|
74
|
+
const repo = createRepository(backend);
|
|
75
|
+
return {
|
|
76
|
+
...repo,
|
|
77
|
+
...createRepositoryFsObjectOperations(backend.objects, (data) => repo.writeBlob(data)),
|
|
78
|
+
gitDir: path
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//#endregion
|
|
82
|
+
export { initRepository, openRepository };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
//#region src/repository/import/import-glob.ts
|
|
2
|
+
/**
|
|
3
|
+
* Glob 模式匹配工具
|
|
4
|
+
*
|
|
5
|
+
* 提供将 glob 模式转换为正则表达式以及判断 ref 名称是否匹配 glob 模式的功能。
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* 将 glob 模式转换为正则表达式
|
|
9
|
+
*
|
|
10
|
+
* 只支持 `*` 通配符(匹配任意字符,包括 /)。
|
|
11
|
+
* 其他字符按字面量匹配。
|
|
12
|
+
*
|
|
13
|
+
* @param pattern - glob 模式,如 "refs/heads/*"
|
|
14
|
+
* @returns RegExp
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* const re = globToRegex("refs/heads/*");
|
|
19
|
+
* re.test("refs/heads/main"); // true
|
|
20
|
+
* re.test("refs/tags/v1"); // false
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
function globToRegex(pattern) {
|
|
24
|
+
const regexStr = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*");
|
|
25
|
+
return new RegExp(`^${regexStr}$`);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 判断 ref 名称是否匹配 glob 模式
|
|
29
|
+
*
|
|
30
|
+
* @param pattern - glob 模式
|
|
31
|
+
* @param refName - ref 名称
|
|
32
|
+
* @returns 是否匹配
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* matchRefGlob("refs/heads/*", "refs/heads/main"); // true
|
|
37
|
+
* matchRefGlob("refs/tags/v*", "refs/tags/v1.0"); // true
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
function matchRefGlob(pattern, refName) {
|
|
41
|
+
return globToRegex(pattern).test(refName);
|
|
42
|
+
}
|
|
43
|
+
//#endregion
|
|
44
|
+
export { globToRegex, matchRefGlob };
|