@procedures/git 0.2.3 → 0.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.
Files changed (141) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/README.md +77 -12
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/module.d.ts.map +1 -1
  5. package/dist/module.js +312 -2
  6. package/dist/module.js.map +1 -1
  7. package/dist/procedures/git/blame.d.ts +17 -0
  8. package/dist/procedures/git/blame.d.ts.map +1 -0
  9. package/dist/procedures/git/blame.js +69 -0
  10. package/dist/procedures/git/blame.js.map +1 -0
  11. package/dist/procedures/git/branch/add.d.ts +12 -0
  12. package/dist/procedures/git/branch/add.d.ts.map +1 -0
  13. package/dist/procedures/git/branch/add.js +21 -0
  14. package/dist/procedures/git/branch/add.js.map +1 -0
  15. package/dist/procedures/git/branch/delete.d.ts +13 -0
  16. package/dist/procedures/git/branch/delete.d.ts.map +1 -0
  17. package/dist/procedures/git/branch/delete.js +24 -0
  18. package/dist/procedures/git/branch/delete.js.map +1 -0
  19. package/dist/procedures/git/branch/list.d.ts +13 -0
  20. package/dist/procedures/git/branch/list.d.ts.map +1 -0
  21. package/dist/procedures/git/branch/list.js +37 -0
  22. package/dist/procedures/git/branch/list.js.map +1 -0
  23. package/dist/procedures/git/branch.d.ts +8 -2
  24. package/dist/procedures/git/branch.d.ts.map +1 -1
  25. package/dist/procedures/git/branch.js +18 -37
  26. package/dist/procedures/git/branch.js.map +1 -1
  27. package/dist/procedures/git/commit.d.ts.map +1 -1
  28. package/dist/procedures/git/commit.js +9 -11
  29. package/dist/procedures/git/commit.js.map +1 -1
  30. package/dist/procedures/git/index.d.ts +19 -0
  31. package/dist/procedures/git/index.d.ts.map +1 -1
  32. package/dist/procedures/git/index.js +19 -0
  33. package/dist/procedures/git/index.js.map +1 -1
  34. package/dist/procedures/git/init.d.ts +6 -2
  35. package/dist/procedures/git/init.d.ts.map +1 -1
  36. package/dist/procedures/git/init.js +8 -4
  37. package/dist/procedures/git/init.js.map +1 -1
  38. package/dist/procedures/git/merge/abort.d.ts +14 -0
  39. package/dist/procedures/git/merge/abort.d.ts.map +1 -0
  40. package/dist/procedures/git/merge/abort.js +18 -0
  41. package/dist/procedures/git/merge/abort.js.map +1 -0
  42. package/dist/procedures/git/merge.d.ts +16 -0
  43. package/dist/procedures/git/merge.d.ts.map +1 -0
  44. package/dist/procedures/git/merge.js +41 -0
  45. package/dist/procedures/git/merge.js.map +1 -0
  46. package/dist/procedures/git/push.d.ts.map +1 -1
  47. package/dist/procedures/git/push.js +4 -2
  48. package/dist/procedures/git/push.js.map +1 -1
  49. package/dist/procedures/git/rebase/abort.d.ts +13 -0
  50. package/dist/procedures/git/rebase/abort.d.ts.map +1 -0
  51. package/dist/procedures/git/rebase/abort.js +17 -0
  52. package/dist/procedures/git/rebase/abort.js.map +1 -0
  53. package/dist/procedures/git/rebase/continue.d.ts +13 -0
  54. package/dist/procedures/git/rebase/continue.d.ts.map +1 -0
  55. package/dist/procedures/git/rebase/continue.js +23 -0
  56. package/dist/procedures/git/rebase/continue.js.map +1 -0
  57. package/dist/procedures/git/rebase.d.ts +22 -0
  58. package/dist/procedures/git/rebase.d.ts.map +1 -0
  59. package/dist/procedures/git/rebase.js +46 -0
  60. package/dist/procedures/git/rebase.js.map +1 -0
  61. package/dist/procedures/git/refs.d.ts +31 -0
  62. package/dist/procedures/git/refs.d.ts.map +1 -0
  63. package/dist/procedures/git/refs.js +52 -0
  64. package/dist/procedures/git/refs.js.map +1 -0
  65. package/dist/procedures/git/reset.d.ts +13 -0
  66. package/dist/procedures/git/reset.d.ts.map +1 -0
  67. package/dist/procedures/git/reset.js +31 -0
  68. package/dist/procedures/git/reset.js.map +1 -0
  69. package/dist/procedures/git/restore.d.ts +13 -0
  70. package/dist/procedures/git/restore.d.ts.map +1 -0
  71. package/dist/procedures/git/restore.js +26 -0
  72. package/dist/procedures/git/restore.js.map +1 -0
  73. package/dist/procedures/git/revParse.d.ts +13 -0
  74. package/dist/procedures/git/revParse.d.ts.map +1 -0
  75. package/dist/procedures/git/revParse.js +23 -0
  76. package/dist/procedures/git/revParse.js.map +1 -0
  77. package/dist/procedures/git/run.d.ts +2 -0
  78. package/dist/procedures/git/run.d.ts.map +1 -1
  79. package/dist/procedures/git/run.js +1 -0
  80. package/dist/procedures/git/run.js.map +1 -1
  81. package/dist/procedures/git/show.d.ts +15 -0
  82. package/dist/procedures/git/show.d.ts.map +1 -0
  83. package/dist/procedures/git/show.js +49 -0
  84. package/dist/procedures/git/show.js.map +1 -0
  85. package/dist/procedures/git/tag/add.d.ts +12 -0
  86. package/dist/procedures/git/tag/add.d.ts.map +1 -0
  87. package/dist/procedures/git/tag/add.js +25 -0
  88. package/dist/procedures/git/tag/add.js.map +1 -0
  89. package/dist/procedures/git/tag/delete.d.ts +12 -0
  90. package/dist/procedures/git/tag/delete.d.ts.map +1 -0
  91. package/dist/procedures/git/tag/delete.js +19 -0
  92. package/dist/procedures/git/tag/delete.js.map +1 -0
  93. package/dist/procedures/git/tag/list.d.ts +12 -0
  94. package/dist/procedures/git/tag/list.d.ts.map +1 -0
  95. package/dist/procedures/git/tag/list.js +34 -0
  96. package/dist/procedures/git/tag/list.js.map +1 -0
  97. package/dist/procedures/git/worktree/add.d.ts +13 -0
  98. package/dist/procedures/git/worktree/add.d.ts.map +1 -0
  99. package/dist/procedures/git/worktree/add.js +35 -0
  100. package/dist/procedures/git/worktree/add.js.map +1 -0
  101. package/dist/procedures/git/worktree/list.d.ts +17 -0
  102. package/dist/procedures/git/worktree/list.d.ts.map +1 -0
  103. package/dist/procedures/git/worktree/list.js +52 -0
  104. package/dist/procedures/git/worktree/list.js.map +1 -0
  105. package/dist/procedures/git/worktree/remove.d.ts +13 -0
  106. package/dist/procedures/git/worktree/remove.d.ts.map +1 -0
  107. package/dist/procedures/git/worktree/remove.js +20 -0
  108. package/dist/procedures/git/worktree/remove.js.map +1 -0
  109. package/dist/types.d.ts +308 -0
  110. package/dist/types.d.ts.map +1 -1
  111. package/dist/types.js +265 -0
  112. package/dist/types.js.map +1 -1
  113. package/package.json +4 -4
  114. package/src/module.ts +411 -2
  115. package/src/procedures/git/blame.ts +68 -0
  116. package/src/procedures/git/branch/add.ts +24 -0
  117. package/src/procedures/git/branch/delete.ts +29 -0
  118. package/src/procedures/git/branch/list.ts +40 -0
  119. package/src/procedures/git/branch.ts +19 -40
  120. package/src/procedures/git/commit.ts +9 -11
  121. package/src/procedures/git/index.ts +19 -0
  122. package/src/procedures/git/init.ts +11 -10
  123. package/src/procedures/git/merge/abort.ts +20 -0
  124. package/src/procedures/git/merge.ts +42 -0
  125. package/src/procedures/git/push.ts +4 -2
  126. package/src/procedures/git/rebase/abort.ts +19 -0
  127. package/src/procedures/git/rebase/continue.ts +25 -0
  128. package/src/procedures/git/rebase.ts +48 -0
  129. package/src/procedures/git/refs.ts +55 -0
  130. package/src/procedures/git/reset.ts +34 -0
  131. package/src/procedures/git/restore.ts +27 -0
  132. package/src/procedures/git/revParse.ts +24 -0
  133. package/src/procedures/git/run.ts +3 -0
  134. package/src/procedures/git/show.ts +57 -0
  135. package/src/procedures/git/tag/add.ts +27 -0
  136. package/src/procedures/git/tag/delete.ts +22 -0
  137. package/src/procedures/git/tag/list.ts +36 -0
  138. package/src/procedures/git/worktree/add.ts +35 -0
  139. package/src/procedures/git/worktree/list.ts +48 -0
  140. package/src/procedures/git/worktree/remove.ts +21 -0
  141. package/src/types.ts +623 -0
@@ -0,0 +1,36 @@
1
+ /**
2
+ * git.tag.list procedure
3
+ *
4
+ * List the tags (roadmap R40).
5
+ */
6
+
7
+ import { gitArg } from "../args.js";
8
+ import { git, type GitContext } from "../run.js";
9
+ import type { GitTagInfo, GitTagListInput, GitTagListOutput } from "../../../types.js";
10
+
11
+ /**
12
+ * The fields of each tag, separated by NUL: the name, the type of the object, the commit of an
13
+ * annotated tag, the object, and the subject of the message.
14
+ */
15
+ const FORMAT = "--format=%(refname:strip=2)%00%(objecttype)%00%(*objectname)%00%(objectname)%00%(contents:subject)";
16
+
17
+ /**
18
+ * List the tags
19
+ */
20
+ export async function gitTagList(input: GitTagListInput, ctx: GitContext = {}): Promise<GitTagListOutput> {
21
+ const args = ["tag", "--list", FORMAT];
22
+ if (input.pattern) args.push(gitArg("pattern", input.pattern));
23
+
24
+ const output = await git(args, { cwd: input.cwd, signal: ctx.signal });
25
+ const tags: GitTagInfo[] = output
26
+ .split("\n")
27
+ .filter((line) => line.length > 0)
28
+ .map((line) => {
29
+ const [name = "", type = "", peeled = "", object = "", subject = ""] = line.split("\0");
30
+ const annotated = type === "tag";
31
+ const tag: GitTagInfo = { name, hash: annotated && peeled ? peeled : object, annotated };
32
+ if (annotated) tag.message = subject;
33
+ return tag;
34
+ });
35
+ return { tags };
36
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * git.worktree.add procedure
3
+ *
4
+ * Add a working tree (roadmap R40). Git refuses a folder that exists and is not empty. Without
5
+ * `ref`, `branch` and `detach`, git makes a branch with the name of the folder.
6
+ */
7
+
8
+ import { resolve } from "node:path";
9
+ import { gitArg } from "../args.js";
10
+ import { git, type GitContext } from "../run.js";
11
+ import { currentBranch, headHash } from "../refs.js";
12
+ import type { GitWorktreeAddInput, GitWorktreeAddOutput } from "../../../types.js";
13
+
14
+ /**
15
+ * Add a working tree
16
+ */
17
+ export async function gitWorktreeAdd(input: GitWorktreeAddInput, ctx: GitContext = {}): Promise<GitWorktreeAddOutput> {
18
+ const { ref, branch, detach, cwd } = input;
19
+ const path = resolve(cwd ?? process.cwd(), input.path);
20
+
21
+ const args = ["worktree", "add"];
22
+ if (branch) args.push("-b", gitArg("branch", branch));
23
+ if (detach) args.push("--detach");
24
+ // After "--", a path that starts with "-" stays a path
25
+ args.push("--", path);
26
+ if (ref) args.push(gitArg("ref", ref));
27
+ await git(args, { cwd, signal: ctx.signal });
28
+
29
+ // The new working tree gives its own HEAD
30
+ const inTree = { cwd: path, signal: ctx.signal };
31
+ const result: GitWorktreeAddOutput = { path, head: await headHash(inTree) };
32
+ const checkedOut = await currentBranch(inTree);
33
+ if (checkedOut !== "HEAD") result.branch = checkedOut;
34
+ return result;
35
+ }
@@ -0,0 +1,48 @@
1
+ /**
2
+ * git.worktree.list procedure
3
+ *
4
+ * List the working trees of the repository (roadmap R40). The main working tree is first.
5
+ */
6
+
7
+ import { resolve } from "node:path";
8
+ import { git, zFields, type GitContext } from "../run.js";
9
+ import type { GitWorktreeInfo, GitWorktreeListInput, GitWorktreeListOutput } from "../../../types.js";
10
+
11
+ /**
12
+ * This function reads the output of `git worktree list --porcelain -z`: the fields of one working
13
+ * tree, then an empty field.
14
+ */
15
+ export function parseWorktrees(output: string): GitWorktreeInfo[] {
16
+ const worktrees: GitWorktreeInfo[] = [];
17
+ let current: GitWorktreeInfo | undefined;
18
+ for (const field of zFields(output)) {
19
+ if (field === "") {
20
+ current = undefined;
21
+ continue;
22
+ }
23
+ const space = field.indexOf(" ");
24
+ const key = space < 0 ? field : field.slice(0, space);
25
+ const value = space < 0 ? "" : field.slice(space + 1);
26
+ if (key === "worktree") {
27
+ // Git gives "/" on Windows too: resolve gives the path of the platform
28
+ current = { path: resolve(value), detached: false, bare: false, locked: false, prunable: false };
29
+ worktrees.push(current);
30
+ } else if (current) {
31
+ if (key === "HEAD") current.head = value;
32
+ else if (key === "branch") current.branch = value.replace(/^refs\/heads\//, "");
33
+ else if (key === "detached") current.detached = true;
34
+ else if (key === "bare") current.bare = true;
35
+ else if (key === "locked") current.locked = true;
36
+ else if (key === "prunable") current.prunable = true;
37
+ }
38
+ }
39
+ return worktrees;
40
+ }
41
+
42
+ /**
43
+ * List the working trees of the repository
44
+ */
45
+ export async function gitWorktreeList(input: GitWorktreeListInput, ctx: GitContext = {}): Promise<GitWorktreeListOutput> {
46
+ const output = await git(["worktree", "list", "--porcelain", "-z"], { cwd: input.cwd, signal: ctx.signal });
47
+ return { worktrees: parseWorktrees(output) };
48
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * git.worktree.remove procedure
3
+ *
4
+ * Remove a working tree and its folder (roadmap R40). Git refuses a working tree with changes
5
+ * that are not committed, unless `force` is true. Then the changes are lost.
6
+ */
7
+
8
+ import { git, type GitContext } from "../run.js";
9
+ import type { GitWorktreeRemoveInput, GitWorktreeRemoveOutput } from "../../../types.js";
10
+
11
+ /**
12
+ * Remove a working tree
13
+ */
14
+ export async function gitWorktreeRemove(input: GitWorktreeRemoveInput, ctx: GitContext = {}): Promise<GitWorktreeRemoveOutput> {
15
+ const args = ["worktree", "remove"];
16
+ if (input.force) args.push("--force");
17
+ // After "--", a path that starts with "-" stays a path
18
+ args.push("--", input.path);
19
+ await git(args, { cwd: input.cwd, signal: ctx.signal });
20
+ return { path: input.path };
21
+ }