@ibgib/vcs-gib 0.0.6
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 +94 -0
- package/VCS_CLI_USER_GUIDE.md +198 -0
- package/dist/AUTO-GENERATED-version.d.mts +6 -0
- package/dist/AUTO-GENERATED-version.d.mts.map +1 -0
- package/dist/AUTO-GENERATED-version.mjs +6 -0
- package/dist/AUTO-GENERATED-version.mjs.map +1 -0
- package/dist/assumptions.respec.d.mts +2 -0
- package/dist/assumptions.respec.d.mts.map +1 -0
- package/dist/assumptions.respec.mjs +41 -0
- package/dist/assumptions.respec.mjs.map +1 -0
- package/dist/bootstrap/node-bootstrap.d.mts +35 -0
- package/dist/bootstrap/node-bootstrap.d.mts.map +1 -0
- package/dist/bootstrap/node-bootstrap.mjs +165 -0
- package/dist/bootstrap/node-bootstrap.mjs.map +1 -0
- package/dist/bootstrap/node-bootstrap.respec.node.d.mts +7 -0
- package/dist/bootstrap/node-bootstrap.respec.node.d.mts.map +1 -0
- package/dist/bootstrap/node-bootstrap.respec.node.mjs +28 -0
- package/dist/bootstrap/node-bootstrap.respec.node.mjs.map +1 -0
- package/dist/cli/cli-arg-parser.d.mts +27 -0
- package/dist/cli/cli-arg-parser.d.mts.map +1 -0
- package/dist/cli/cli-arg-parser.mjs +96 -0
- package/dist/cli/cli-arg-parser.mjs.map +1 -0
- package/dist/cli/cli-arg-parser.respec.node.d.mts +7 -0
- package/dist/cli/cli-arg-parser.respec.node.d.mts.map +1 -0
- package/dist/cli/cli-arg-parser.respec.node.mjs +35 -0
- package/dist/cli/cli-arg-parser.respec.node.mjs.map +1 -0
- package/dist/cli/cli-constants.d.mts +26 -0
- package/dist/cli/cli-constants.d.mts.map +1 -0
- package/dist/cli/cli-constants.mjs +67 -0
- package/dist/cli/cli-constants.mjs.map +1 -0
- package/dist/cli/cli-e2e.respec.node.d.mts +8 -0
- package/dist/cli/cli-e2e.respec.node.d.mts.map +1 -0
- package/dist/cli/cli-e2e.respec.node.mjs +263 -0
- package/dist/cli/cli-e2e.respec.node.mjs.map +1 -0
- package/dist/cli/commands/add-cmd.d.mts +20 -0
- package/dist/cli/commands/add-cmd.d.mts.map +1 -0
- package/dist/cli/commands/add-cmd.mjs +333 -0
- package/dist/cli/commands/add-cmd.mjs.map +1 -0
- package/dist/cli/commands/branch-checkout-cmd.respec.node.d.mts +7 -0
- package/dist/cli/commands/branch-checkout-cmd.respec.node.d.mts.map +1 -0
- package/dist/cli/commands/branch-checkout-cmd.respec.node.mjs +288 -0
- package/dist/cli/commands/branch-checkout-cmd.respec.node.mjs.map +1 -0
- package/dist/cli/commands/branch-cmd.d.mts +25 -0
- package/dist/cli/commands/branch-cmd.d.mts.map +1 -0
- package/dist/cli/commands/branch-cmd.mjs +187 -0
- package/dist/cli/commands/branch-cmd.mjs.map +1 -0
- package/dist/cli/commands/checkout-cmd.d.mts +21 -0
- package/dist/cli/commands/checkout-cmd.d.mts.map +1 -0
- package/dist/cli/commands/checkout-cmd.mjs +154 -0
- package/dist/cli/commands/checkout-cmd.mjs.map +1 -0
- package/dist/cli/commands/commit-cmd.d.mts +23 -0
- package/dist/cli/commands/commit-cmd.d.mts.map +1 -0
- package/dist/cli/commands/commit-cmd.mjs +326 -0
- package/dist/cli/commands/commit-cmd.mjs.map +1 -0
- package/dist/cli/commands/commit-log-cmd.respec.node.d.mts +7 -0
- package/dist/cli/commands/commit-log-cmd.respec.node.d.mts.map +1 -0
- package/dist/cli/commands/commit-log-cmd.respec.node.mjs +251 -0
- package/dist/cli/commands/commit-log-cmd.respec.node.mjs.map +1 -0
- package/dist/cli/commands/init-cmd.d.mts +20 -0
- package/dist/cli/commands/init-cmd.d.mts.map +1 -0
- package/dist/cli/commands/init-cmd.mjs +119 -0
- package/dist/cli/commands/init-cmd.mjs.map +1 -0
- package/dist/cli/commands/init-cmd.respec.node.d.mts +7 -0
- package/dist/cli/commands/init-cmd.respec.node.d.mts.map +1 -0
- package/dist/cli/commands/init-cmd.respec.node.mjs +40 -0
- package/dist/cli/commands/init-cmd.respec.node.mjs.map +1 -0
- package/dist/cli/commands/log-cmd.d.mts +27 -0
- package/dist/cli/commands/log-cmd.d.mts.map +1 -0
- package/dist/cli/commands/log-cmd.mjs +146 -0
- package/dist/cli/commands/log-cmd.mjs.map +1 -0
- package/dist/cli/commands/status-add-cmd.respec.node.d.mts +7 -0
- package/dist/cli/commands/status-add-cmd.respec.node.d.mts.map +1 -0
- package/dist/cli/commands/status-add-cmd.respec.node.mjs +215 -0
- package/dist/cli/commands/status-add-cmd.respec.node.mjs.map +1 -0
- package/dist/cli/commands/status-cmd.d.mts +25 -0
- package/dist/cli/commands/status-cmd.d.mts.map +1 -0
- package/dist/cli/commands/status-cmd.mjs +286 -0
- package/dist/cli/commands/status-cmd.mjs.map +1 -0
- package/dist/cli/vcs-cli-main.d.mts +14 -0
- package/dist/cli/vcs-cli-main.d.mts.map +1 -0
- package/dist/cli/vcs-cli-main.mjs +136 -0
- package/dist/cli/vcs-cli-main.mjs.map +1 -0
- package/dist/engine/branch/branch-graph-helper.d.mts +19 -0
- package/dist/engine/branch/branch-graph-helper.d.mts.map +1 -0
- package/dist/engine/branch/branch-graph-helper.mjs +49 -0
- package/dist/engine/branch/branch-graph-helper.mjs.map +1 -0
- package/dist/engine/branch/branch-helper.d.mts +26 -0
- package/dist/engine/branch/branch-helper.d.mts.map +1 -0
- package/dist/engine/branch/branch-helper.mjs +57 -0
- package/dist/engine/branch/branch-helper.mjs.map +1 -0
- package/dist/engine/branch/branch-space-helper.d.mts +22 -0
- package/dist/engine/branch/branch-space-helper.d.mts.map +1 -0
- package/dist/engine/branch/branch-space-helper.mjs +77 -0
- package/dist/engine/branch/branch-space-helper.mjs.map +1 -0
- package/dist/engine/branch/branch-space.respec.node.d.mts +8 -0
- package/dist/engine/branch/branch-space.respec.node.d.mts.map +1 -0
- package/dist/engine/branch/branch-space.respec.node.mjs +138 -0
- package/dist/engine/branch/branch-space.respec.node.mjs.map +1 -0
- package/dist/engine/branch/branch-types.d.mts +26 -0
- package/dist/engine/branch/branch-types.d.mts.map +1 -0
- package/dist/engine/branch/branch-types.mjs +7 -0
- package/dist/engine/branch/branch-types.mjs.map +1 -0
- package/dist/engine/diff/line-diff-helper.d.mts +76 -0
- package/dist/engine/diff/line-diff-helper.d.mts.map +1 -0
- package/dist/engine/diff/line-diff-helper.mjs +144 -0
- package/dist/engine/diff/line-diff-helper.mjs.map +1 -0
- package/dist/engine/diff/line-diff-helper.respec.node.d.mts +7 -0
- package/dist/engine/diff/line-diff-helper.respec.node.d.mts.map +1 -0
- package/dist/engine/diff/line-diff-helper.respec.node.mjs +66 -0
- package/dist/engine/diff/line-diff-helper.respec.node.mjs.map +1 -0
- package/dist/engine/filter/glob-helper.d.mts +51 -0
- package/dist/engine/filter/glob-helper.d.mts.map +1 -0
- package/dist/engine/filter/glob-helper.mjs +132 -0
- package/dist/engine/filter/glob-helper.mjs.map +1 -0
- package/dist/engine/filter/glob-helper.respec.node.d.mts +7 -0
- package/dist/engine/filter/glob-helper.respec.node.d.mts.map +1 -0
- package/dist/engine/filter/glob-helper.respec.node.mjs +78 -0
- package/dist/engine/filter/glob-helper.respec.node.mjs.map +1 -0
- package/dist/engine/index/index-helper.d.mts +78 -0
- package/dist/engine/index/index-helper.d.mts.map +1 -0
- package/dist/engine/index/index-helper.mjs +289 -0
- package/dist/engine/index/index-helper.mjs.map +1 -0
- package/dist/engine/index/index-types.d.mts +63 -0
- package/dist/engine/index/index-types.d.mts.map +1 -0
- package/dist/engine/index/index-types.mjs +7 -0
- package/dist/engine/index/index-types.mjs.map +1 -0
- package/dist/engine/item/item-atom-helper.d.mts +20 -0
- package/dist/engine/item/item-atom-helper.d.mts.map +1 -0
- package/dist/engine/item/item-atom-helper.mjs +30 -0
- package/dist/engine/item/item-atom-helper.mjs.map +1 -0
- package/dist/engine/item/item-helper.d.mts +37 -0
- package/dist/engine/item/item-helper.d.mts.map +1 -0
- package/dist/engine/item/item-helper.mjs +194 -0
- package/dist/engine/item/item-helper.mjs.map +1 -0
- package/dist/engine/item/item-types.d.mts +127 -0
- package/dist/engine/item/item-types.d.mts.map +1 -0
- package/dist/engine/item/item-types.mjs +16 -0
- package/dist/engine/item/item-types.mjs.map +1 -0
- package/dist/index.d.mts +7 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +7 -0
- package/dist/index.mjs.map +1 -0
- package/dist/respec-gib.node.d.mts +7 -0
- package/dist/respec-gib.node.d.mts.map +1 -0
- package/dist/respec-gib.node.mjs +11 -0
- package/dist/respec-gib.node.mjs.map +1 -0
- package/dist/vcs-gib-constants.d.mts +7 -0
- package/dist/vcs-gib-constants.d.mts.map +1 -0
- package/dist/vcs-gib-constants.mjs +7 -0
- package/dist/vcs-gib-constants.mjs.map +1 -0
- package/dist/vcs-gib.respec.node.d.mts +8 -0
- package/dist/vcs-gib.respec.node.d.mts.map +1 -0
- package/dist/vcs-gib.respec.node.mjs +82 -0
- package/dist/vcs-gib.respec.node.mjs.map +1 -0
- package/generate-version-file.js +20 -0
- package/package.json +28 -0
- package/src/AUTO-GENERATED-version.mts +5 -0
- package/src/assumptions.respec.mts +50 -0
- package/src/bootstrap/node-bootstrap.mts +198 -0
- package/src/bootstrap/node-bootstrap.respec.node.mts +35 -0
- package/src/cli/cli-arg-parser.mts +119 -0
- package/src/cli/cli-arg-parser.respec.node.mts +45 -0
- package/src/cli/cli-constants.mts +77 -0
- package/src/cli/cli-e2e.respec.node.mts +318 -0
- package/src/cli/commands/add-cmd.mts +415 -0
- package/src/cli/commands/branch-checkout-cmd.respec.node.mts +322 -0
- package/src/cli/commands/branch-cmd.mts +243 -0
- package/src/cli/commands/checkout-cmd.mts +202 -0
- package/src/cli/commands/commit-cmd.mts +421 -0
- package/src/cli/commands/commit-log-cmd.respec.node.mts +276 -0
- package/src/cli/commands/init-cmd.mts +152 -0
- package/src/cli/commands/init-cmd.respec.node.mts +49 -0
- package/src/cli/commands/log-cmd.mts +197 -0
- package/src/cli/commands/status-add-cmd.respec.node.mts +246 -0
- package/src/cli/commands/status-cmd.mts +366 -0
- package/src/cli/vcs-cli-main.mts +153 -0
- package/src/engine/branch/branch-graph-helper.mts +69 -0
- package/src/engine/branch/branch-helper.mts +79 -0
- package/src/engine/branch/branch-space-helper.mts +104 -0
- package/src/engine/branch/branch-space.respec.node.mts +158 -0
- package/src/engine/branch/branch-types.mts +29 -0
- package/src/engine/diff/line-diff-helper.mts +210 -0
- package/src/engine/diff/line-diff-helper.respec.node.mts +84 -0
- package/src/engine/filter/glob-helper.mts +165 -0
- package/src/engine/filter/glob-helper.respec.node.mts +94 -0
- package/src/engine/index/index-helper.mts +378 -0
- package/src/engine/index/index-types.mts +66 -0
- package/src/engine/item/item-atom-helper.mts +30 -0
- package/src/engine/item/item-helper.mts +239 -0
- package/src/engine/item/item-types.mts +136 -0
- package/src/index.mts +7 -0
- package/src/respec-gib.node.mts +12 -0
- package/src/vcs-gib-constants.mts +7 -0
- package/src/vcs-gib.respec.node.mts +96 -0
- package/test_runs/001-hello-node/20260728_090100_0001-flow-core-main.md +39 -0
- package/test_runs/001-hello-node/20260728_090200_0003-flow-branching-worktree.md +54 -0
- package/test_runs/001-hello-node/20260728_090300_0002-flow-selective-add.md +45 -0
- package/test_runs/001-hello-node/20260728_142100_0007-flow-edge-cases.md +44 -0
- package/test_runs/001-hello-node/20260728_142400_0005-flow-hardcoded-ignores.md +36 -0
- package/tools/pack-for-test.mjs +73 -0
- package/tsconfig.json +18 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module add-cmd
|
|
3
|
+
*
|
|
4
|
+
* Command handler for `vcs add <path...>`.
|
|
5
|
+
* Stages files and directories into candidate B2tFSItemIbGib_V1 and BinIbGib_V1 graph nodes
|
|
6
|
+
* and updates B2tFSIndexIbGib_V1 in localSpace.
|
|
7
|
+
*/
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import fs from 'node:fs/promises';
|
|
10
|
+
import crypto from 'node:crypto';
|
|
11
|
+
import { extractErrorMsg, getUUID } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
|
|
12
|
+
import { Factory_V1 } from '@ibgib/ts-gib/dist/V1/factory.mjs';
|
|
13
|
+
import { ROOT } from '@ibgib/ts-gib/dist/V1/constants.mjs';
|
|
14
|
+
import { getGib } from '@ibgib/ts-gib/dist/V1/transforms/transform-helper.mjs';
|
|
15
|
+
import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
|
|
16
|
+
import { putInSpace, persistTransformResult } from '@ibgib/core-gib/dist/witness/space/space-helper.mjs';
|
|
17
|
+
import { bootstrapVcsMetaspace } from '../../bootstrap/node-bootstrap.mjs';
|
|
18
|
+
import { getOrCreateBranchSpace } from '../../engine/branch/branch-space-helper.mjs';
|
|
19
|
+
import { getB2tFSItemIb } from '../../engine/item/item-atom-helper.mjs';
|
|
20
|
+
import { B2TFS_CHILD_ITEM_REL8N_NAME } from '../../engine/item/item-types.mjs';
|
|
21
|
+
import { getIbGibWithMetaspaceFallback } from '../../engine/item/item-helper.mjs';
|
|
22
|
+
import { isPathFiltered, parseFilterFileContent, globToRegExp } from '../../engine/filter/glob-helper.mjs';
|
|
23
|
+
import { getB2tFSIndexIbGib, updateB2tFSIndexIbGib } from '../../engine/index/index-helper.mjs';
|
|
24
|
+
import { GLOBAL_LOG_A_LOT } from '../../vcs-gib-constants.mjs';
|
|
25
|
+
const lcFile = `[add-cmd]`;
|
|
26
|
+
const logalot = GLOBAL_LOG_A_LOT;
|
|
27
|
+
export async function executeAddCmd({ paths = [], targetDir = process.cwd(), vcsFolderName = '.vcsgib', all = false, quiet = false, } = {}) {
|
|
28
|
+
const lc = `${lcFile}[${executeAddCmd.name}]`;
|
|
29
|
+
try {
|
|
30
|
+
if (logalot) {
|
|
31
|
+
console.log(`${lc} starting... (I: 1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d)`);
|
|
32
|
+
}
|
|
33
|
+
const absTargetDir = path.resolve(targetDir);
|
|
34
|
+
const { metaspace, localSpace, vcsPath, repoRoot } = await bootstrapVcsMetaspace({
|
|
35
|
+
repoPath: absTargetDir,
|
|
36
|
+
vcsFolderName,
|
|
37
|
+
});
|
|
38
|
+
// Verify repo exists
|
|
39
|
+
try {
|
|
40
|
+
await fs.access(vcsPath);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
throw new Error(`Not an ibgib repository (directory ${vcsPath} does not exist) (E: 2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d)`);
|
|
44
|
+
}
|
|
45
|
+
// Retrieve authoritative B2tFSIndexIbGib_V1 from space
|
|
46
|
+
const indexIbGib = await getB2tFSIndexIbGib({ space: localSpace, vcsPath });
|
|
47
|
+
if (!indexIbGib) {
|
|
48
|
+
throw new Error(`Repository not initialized. Run 'vcs init' first. (E: 2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e)`);
|
|
49
|
+
}
|
|
50
|
+
const activeBranch = indexIbGib.data?.activeBranch || 'main';
|
|
51
|
+
const activeWorktreeDir = activeBranch === 'main' ? repoRoot : path.join(repoRoot, 'b', activeBranch);
|
|
52
|
+
// Target active branch space b2s_<activeBranch>
|
|
53
|
+
const { space: activeSpace } = await getOrCreateBranchSpace({
|
|
54
|
+
metaspace,
|
|
55
|
+
vcsPath,
|
|
56
|
+
branchName: activeBranch,
|
|
57
|
+
});
|
|
58
|
+
// Read .ibgibignore if present in active worktree
|
|
59
|
+
let filterPatterns = [];
|
|
60
|
+
const ignorePath = path.join(activeWorktreeDir, '.ibgibignore');
|
|
61
|
+
try {
|
|
62
|
+
const ignoreContent = await fs.readFile(ignorePath, 'utf8');
|
|
63
|
+
filterPatterns = parseFilterFileContent(ignoreContent);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Ignore file not found is fine
|
|
67
|
+
}
|
|
68
|
+
// Walk active branch graph items to find committed files in snapshot
|
|
69
|
+
const committedBranchItemsMap = new Map();
|
|
70
|
+
const branchAddrs = [
|
|
71
|
+
...(indexIbGib?.rel8ns?.branch || []),
|
|
72
|
+
...(indexIbGib?.rel8ns?.branch_tjp || []),
|
|
73
|
+
];
|
|
74
|
+
if (branchAddrs.length > 0) {
|
|
75
|
+
let branchIbGibs = [];
|
|
76
|
+
for (const bAddr of branchAddrs) {
|
|
77
|
+
const bIbGib = await getIbGibWithMetaspaceFallback({
|
|
78
|
+
addr: bAddr,
|
|
79
|
+
space: activeSpace,
|
|
80
|
+
metaspace,
|
|
81
|
+
});
|
|
82
|
+
if (bIbGib) {
|
|
83
|
+
branchIbGibs.push(bIbGib);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const activeBranchIbGib = branchIbGibs.find((b) => b?.data?.name === activeBranch) || branchIbGibs.at(0);
|
|
87
|
+
const rootItemAddr = activeBranchIbGib?.rel8ns?.b2tfs_item?.at(0);
|
|
88
|
+
if (rootItemAddr) {
|
|
89
|
+
const rootItem = await getIbGibWithMetaspaceFallback({
|
|
90
|
+
addr: rootItemAddr,
|
|
91
|
+
space: activeSpace,
|
|
92
|
+
metaspace,
|
|
93
|
+
});
|
|
94
|
+
if (rootItem) {
|
|
95
|
+
await addCmd_walkBranchGraph({
|
|
96
|
+
item: rootItem,
|
|
97
|
+
space: activeSpace,
|
|
98
|
+
metaspace,
|
|
99
|
+
currentRelPath: '',
|
|
100
|
+
outMap: committedBranchItemsMap,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Determine candidate file paths to stage
|
|
106
|
+
const targetFilePaths = [];
|
|
107
|
+
if (all || paths.length === 0 || (paths.length === 1 && paths[0] === '.')) {
|
|
108
|
+
await addCmd_collectFilesRecursively({
|
|
109
|
+
dirPath: activeWorktreeDir,
|
|
110
|
+
baseDir: activeWorktreeDir,
|
|
111
|
+
vcsFolderName,
|
|
112
|
+
filterPatterns,
|
|
113
|
+
outFiles: targetFilePaths,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
for (const relOrAbs of paths) {
|
|
118
|
+
if (relOrAbs.includes('*') || relOrAbs.includes('?')) {
|
|
119
|
+
const rx = globToRegExp(relOrAbs);
|
|
120
|
+
const candidateFiles = [];
|
|
121
|
+
await addCmd_collectFilesRecursively({
|
|
122
|
+
dirPath: activeWorktreeDir,
|
|
123
|
+
baseDir: activeWorktreeDir,
|
|
124
|
+
vcsFolderName,
|
|
125
|
+
filterPatterns,
|
|
126
|
+
outFiles: candidateFiles,
|
|
127
|
+
});
|
|
128
|
+
let matchedCount = 0;
|
|
129
|
+
for (const candidateAbsPath of candidateFiles) {
|
|
130
|
+
const candidateRelPath = path.relative(activeWorktreeDir, candidateAbsPath).replace(/\\/g, '/');
|
|
131
|
+
const pathBasename = candidateRelPath.split('/').pop() || candidateRelPath;
|
|
132
|
+
if (rx.test(candidateRelPath) || rx.test(pathBasename)) {
|
|
133
|
+
if (!targetFilePaths.includes(candidateAbsPath)) {
|
|
134
|
+
targetFilePaths.push(candidateAbsPath);
|
|
135
|
+
}
|
|
136
|
+
matchedCount++;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (matchedCount === 0) {
|
|
140
|
+
throw new Error(`No files matched glob pattern: ${relOrAbs} (E: e23d4c5f6a7b8c9d0e1f2a3b4c5d6e7f)`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
const fullPath = path.resolve(activeWorktreeDir, relOrAbs);
|
|
145
|
+
let stat;
|
|
146
|
+
try {
|
|
147
|
+
stat = await fs.stat(fullPath);
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
throw new Error(`Path does not exist: ${relOrAbs} (E: 10c11d12e13f14a15b16c17d18e19f20)`);
|
|
151
|
+
}
|
|
152
|
+
const relPath = path.relative(activeWorktreeDir, fullPath).replace(/\\/g, '/');
|
|
153
|
+
if (isPathFiltered({ relativePath: relPath, isDirectory: stat.isDirectory(), filterPatterns })) {
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
if (stat.isDirectory()) {
|
|
157
|
+
await addCmd_collectFilesRecursively({
|
|
158
|
+
dirPath: fullPath,
|
|
159
|
+
baseDir: activeWorktreeDir,
|
|
160
|
+
vcsFolderName,
|
|
161
|
+
filterPatterns,
|
|
162
|
+
outFiles: targetFilePaths,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
else if (stat.isFile()) {
|
|
166
|
+
if (!targetFilePaths.includes(fullPath)) {
|
|
167
|
+
targetFilePaths.push(fullPath);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
const stagedItemAddrs = [...(indexIbGib.data?.staged_item || [])];
|
|
174
|
+
const stagedPathsMap = { ...(indexIbGib.data?.stagedPaths || {}) };
|
|
175
|
+
const newlyStagedPaths = [];
|
|
176
|
+
for (const absFilePath of targetFilePaths) {
|
|
177
|
+
const relPath = path.relative(activeWorktreeDir, absFilePath).replace(/\\/g, '/');
|
|
178
|
+
// Read file data & compute hash
|
|
179
|
+
const fileData = await fs.readFile(absFilePath);
|
|
180
|
+
const fileHash = crypto.createHash('sha256').update(fileData).digest('hex');
|
|
181
|
+
// Skip staging if candidate file matches active branch committed snapshot
|
|
182
|
+
const committedItem = committedBranchItemsMap.get(relPath);
|
|
183
|
+
if (committedItem && committedItem.fileHash && committedItem.fileHash === fileHash) {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
// 1. Create BinIbGib_V1 graph node as Uint8Array
|
|
187
|
+
const binData = new Uint8Array(fileData);
|
|
188
|
+
const binIb = `bin ${fileHash}`;
|
|
189
|
+
const binGib = await getGib({ ibGib: { ib: binIb, data: binData } });
|
|
190
|
+
const binIbGib = {
|
|
191
|
+
ib: binIb,
|
|
192
|
+
gib: binGib,
|
|
193
|
+
data: binData,
|
|
194
|
+
};
|
|
195
|
+
const binAddr = getIbGibAddr({ ibGib: binIbGib });
|
|
196
|
+
await putInSpace({ ibGib: binIbGib, space: activeSpace });
|
|
197
|
+
await metaspace.registerNewIbGib({ ibGib: binIbGib, space: activeSpace });
|
|
198
|
+
// 2. Create B2tFSItemIbGib_V1 candidate graph node
|
|
199
|
+
const fileName = path.basename(absFilePath);
|
|
200
|
+
const fileNameSansExt = path.parse(fileName).name;
|
|
201
|
+
const fileExt = path.parse(fileName).ext.replace(/^\./, '');
|
|
202
|
+
const nameHash = crypto.createHash('sha256').update(fileName).digest('hex');
|
|
203
|
+
const itemRes = await Factory_V1.firstGen({
|
|
204
|
+
parentIbGib: ROOT,
|
|
205
|
+
ib: getB2tFSItemIb('file', fileName, nameHash),
|
|
206
|
+
data: {
|
|
207
|
+
name: fileName,
|
|
208
|
+
nameHash,
|
|
209
|
+
fsType: 'file',
|
|
210
|
+
fileNameSansExt,
|
|
211
|
+
fileExt,
|
|
212
|
+
fileHash,
|
|
213
|
+
fileEncoding: 'utf8',
|
|
214
|
+
diffTransactionId: await getUUID(),
|
|
215
|
+
uuid: await getUUID(),
|
|
216
|
+
classname: 'B2tFSItemIbGib_V1',
|
|
217
|
+
},
|
|
218
|
+
rel8ns: {
|
|
219
|
+
bin: [binAddr],
|
|
220
|
+
},
|
|
221
|
+
});
|
|
222
|
+
const itemIbGib = itemRes.newIbGib;
|
|
223
|
+
const itemAddr = getIbGibAddr({ ibGib: itemIbGib });
|
|
224
|
+
await persistTransformResult({ resTransform: itemRes, space: activeSpace });
|
|
225
|
+
await metaspace.registerNewIbGib({ ibGib: itemIbGib, space: activeSpace });
|
|
226
|
+
if (!stagedItemAddrs.includes(itemAddr)) {
|
|
227
|
+
stagedItemAddrs.push(itemAddr);
|
|
228
|
+
}
|
|
229
|
+
stagedPathsMap[relPath] = {
|
|
230
|
+
itemAddr,
|
|
231
|
+
binAddr,
|
|
232
|
+
fileHash,
|
|
233
|
+
fsType: 'file',
|
|
234
|
+
stagedAt: new Date().toISOString(),
|
|
235
|
+
};
|
|
236
|
+
newlyStagedPaths.push(relPath);
|
|
237
|
+
if (!quiet) {
|
|
238
|
+
console.log(`staged: ${relPath}`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// 3. Update B2tFSIndexIbGib_V1 in activeSpace & localSpace
|
|
242
|
+
const updatedIndex = await updateB2tFSIndexIbGib({
|
|
243
|
+
space: activeSpace,
|
|
244
|
+
metaspace,
|
|
245
|
+
indexIbGib,
|
|
246
|
+
dataToUpdate: {
|
|
247
|
+
stagedPaths: stagedPathsMap,
|
|
248
|
+
staged_item: stagedItemAddrs,
|
|
249
|
+
},
|
|
250
|
+
vcsPath,
|
|
251
|
+
});
|
|
252
|
+
if (localSpace !== activeSpace) {
|
|
253
|
+
await putInSpace({ space: localSpace, ibGib: updatedIndex });
|
|
254
|
+
}
|
|
255
|
+
return {
|
|
256
|
+
stagedPaths: newlyStagedPaths,
|
|
257
|
+
stagedCount: newlyStagedPaths.length,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
console.error(`${lc} ${extractErrorMsg(error)} (E: 3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f)`);
|
|
262
|
+
throw error;
|
|
263
|
+
}
|
|
264
|
+
finally {
|
|
265
|
+
if (logalot) {
|
|
266
|
+
console.log(`${lc} complete. (I: 4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a)`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// #region addCmd_walkBranchGraph
|
|
271
|
+
async function addCmd_walkBranchGraph({ item, space, metaspace, currentRelPath, outMap, }) {
|
|
272
|
+
if (!item || !item.data) {
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
const { fsType, fileHash } = item.data;
|
|
276
|
+
if (currentRelPath) {
|
|
277
|
+
outMap.set(currentRelPath, { relPath: currentRelPath, fileHash, fsType });
|
|
278
|
+
}
|
|
279
|
+
if (fsType === 'folder') {
|
|
280
|
+
const childAddrs = item.rel8ns?.[B2TFS_CHILD_ITEM_REL8N_NAME] || [];
|
|
281
|
+
for (const childAddr of childAddrs) {
|
|
282
|
+
const childItem = await getIbGibWithMetaspaceFallback({
|
|
283
|
+
addr: childAddr,
|
|
284
|
+
space,
|
|
285
|
+
metaspace,
|
|
286
|
+
});
|
|
287
|
+
if (childItem && childItem.data) {
|
|
288
|
+
const childRelPath = currentRelPath
|
|
289
|
+
? `${currentRelPath}/${childItem.data.name}`
|
|
290
|
+
: childItem.data.name;
|
|
291
|
+
await addCmd_walkBranchGraph({
|
|
292
|
+
item: childItem,
|
|
293
|
+
space,
|
|
294
|
+
metaspace,
|
|
295
|
+
currentRelPath: childRelPath,
|
|
296
|
+
outMap,
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
// #endregion addCmd_walkBranchGraph
|
|
303
|
+
// #region addCmd_collectFilesRecursively
|
|
304
|
+
async function addCmd_collectFilesRecursively({ dirPath, baseDir, vcsFolderName, filterPatterns, outFiles, }) {
|
|
305
|
+
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
306
|
+
for (const entry of entries) {
|
|
307
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
308
|
+
const relPath = path.relative(baseDir, fullPath).replace(/\\/g, '/');
|
|
309
|
+
// Ignore vcs storage folder, .git, and worktrees folder b
|
|
310
|
+
if (relPath === vcsFolderName || relPath.startsWith(vcsFolderName + '/') ||
|
|
311
|
+
relPath === '.git' || relPath.startsWith('.git/') ||
|
|
312
|
+
relPath === 'b' || relPath.startsWith('b/')) {
|
|
313
|
+
continue;
|
|
314
|
+
}
|
|
315
|
+
if (isPathFiltered({ relativePath: relPath, isDirectory: entry.isDirectory(), filterPatterns })) {
|
|
316
|
+
continue;
|
|
317
|
+
}
|
|
318
|
+
if (entry.isDirectory()) {
|
|
319
|
+
await addCmd_collectFilesRecursively({
|
|
320
|
+
dirPath: fullPath,
|
|
321
|
+
baseDir,
|
|
322
|
+
vcsFolderName,
|
|
323
|
+
filterPatterns,
|
|
324
|
+
outFiles,
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
else if (entry.isFile()) {
|
|
328
|
+
outFiles.push(fullPath);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
// #endregion addCmd_collectFilesRecursively
|
|
333
|
+
//# sourceMappingURL=add-cmd.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-cmd.mjs","sourceRoot":"","sources":["../../../src/cli/commands/add-cmd.mts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-checkout-cmd.respec.node.d.mts","sourceRoot":"","sources":["../../../src/cli/commands/branch-checkout-cmd.respec.node.mts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module branch-checkout-cmd.respec
|
|
3
|
+
*
|
|
4
|
+
* Unit tests for `vcs branch` and `vcs checkout` command handlers & worktree projections.
|
|
5
|
+
*/
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import fs from 'node:fs/promises';
|
|
8
|
+
import { respecfully, ifWe, iReckon } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
|
|
9
|
+
import { executeInitCmd } from './init-cmd.mjs';
|
|
10
|
+
import { executeAddCmd } from './add-cmd.mjs';
|
|
11
|
+
import { executeCommitCmd } from './commit-cmd.mjs';
|
|
12
|
+
import { executeBranchCmd } from './branch-cmd.mjs';
|
|
13
|
+
import { executeCheckoutCmd } from './checkout-cmd.mjs';
|
|
14
|
+
import { executeStatusCmd } from './status-cmd.mjs';
|
|
15
|
+
const lc = `[apps/vcs-gib/src/cli/commands/branch-checkout-cmd.respec.node.mts]`;
|
|
16
|
+
await respecfully(lc, `vcs branch and vcs checkout Command Handlers`, async () => {
|
|
17
|
+
await ifWe(lc, `lists default branch main for new repository`, async () => {
|
|
18
|
+
const testDir = path.join(process.cwd(), '.test_branch_checkout_1');
|
|
19
|
+
const vcsFolderName = '.vcsgib_test_bc_1';
|
|
20
|
+
try {
|
|
21
|
+
await executeInitCmd({
|
|
22
|
+
targetDir: testDir,
|
|
23
|
+
vcsFolderName,
|
|
24
|
+
quiet: true,
|
|
25
|
+
});
|
|
26
|
+
const branchRes = await executeBranchCmd({
|
|
27
|
+
targetDir: testDir,
|
|
28
|
+
vcsFolderName,
|
|
29
|
+
quiet: true,
|
|
30
|
+
});
|
|
31
|
+
iReckon(lc, branchRes.branches.length).willEqual(1);
|
|
32
|
+
iReckon(lc, branchRes.branches[0].name).willEqual('main');
|
|
33
|
+
iReckon(lc, branchRes.branches[0].isActive).isGonnaBeTrue();
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
await fs.rm(testDir, { recursive: true, force: true });
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
await ifWe(lc, `creates new branch from active branch root item and rejects duplicates`, async () => {
|
|
40
|
+
const testDir = path.join(process.cwd(), '.test_branch_checkout_2');
|
|
41
|
+
const vcsFolderName = '.vcsgib_test_bc_2';
|
|
42
|
+
try {
|
|
43
|
+
await executeInitCmd({
|
|
44
|
+
targetDir: testDir,
|
|
45
|
+
vcsFolderName,
|
|
46
|
+
quiet: true,
|
|
47
|
+
});
|
|
48
|
+
// Create feature branch
|
|
49
|
+
const createRes = await executeBranchCmd({
|
|
50
|
+
branchName: 'feature-auth',
|
|
51
|
+
targetDir: testDir,
|
|
52
|
+
vcsFolderName,
|
|
53
|
+
quiet: true,
|
|
54
|
+
});
|
|
55
|
+
iReckon(lc, createRes.createdBranchName).willEqual('feature-auth');
|
|
56
|
+
iReckon(lc, Boolean(createRes.createdBranchAddr)).isGonnaBeTrue();
|
|
57
|
+
// List branches
|
|
58
|
+
const listRes = await executeBranchCmd({
|
|
59
|
+
targetDir: testDir,
|
|
60
|
+
vcsFolderName,
|
|
61
|
+
quiet: true,
|
|
62
|
+
});
|
|
63
|
+
iReckon(lc, listRes.branches.length).willEqual(2);
|
|
64
|
+
const featureBranch = listRes.branches.find(b => b.name === 'feature-auth');
|
|
65
|
+
iReckon(lc, Boolean(featureBranch)).isGonnaBeTrue();
|
|
66
|
+
iReckon(lc, featureBranch?.isActive).isGonnaBeFalse();
|
|
67
|
+
// Verify dedicated branch space subfolders exist in .vcsgib
|
|
68
|
+
const mainSpaceDir = path.join(testDir, vcsFolderName, 'ibgib', 'b2s_main');
|
|
69
|
+
const featureSpaceDir = path.join(testDir, vcsFolderName, 'ibgib', 'b2s_feature-auth');
|
|
70
|
+
const mainSpaceExists = await fs.stat(mainSpaceDir).then(s => s.isDirectory()).catch(() => fs.stat(path.join(testDir, vcsFolderName, 'b2s_main')).then(s => s.isDirectory()).catch(() => false));
|
|
71
|
+
const featureSpaceExists = await fs.stat(featureSpaceDir).then(s => s.isDirectory()).catch(() => fs.stat(path.join(testDir, vcsFolderName, 'b2s_feature-auth')).then(s => s.isDirectory()).catch(() => false));
|
|
72
|
+
iReckon(lc, mainSpaceExists).isGonnaBeTrue();
|
|
73
|
+
iReckon(lc, featureSpaceExists).isGonnaBeTrue();
|
|
74
|
+
// Duplicate branch attempt
|
|
75
|
+
let errorThrown = false;
|
|
76
|
+
try {
|
|
77
|
+
await executeBranchCmd({
|
|
78
|
+
branchName: 'feature-auth',
|
|
79
|
+
targetDir: testDir,
|
|
80
|
+
vcsFolderName,
|
|
81
|
+
quiet: true,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
errorThrown = true;
|
|
86
|
+
iReckon(lc, err.message).includes("already exists");
|
|
87
|
+
}
|
|
88
|
+
iReckon(lc, errorThrown).isGonnaBeTrue();
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
await fs.rm(testDir, { recursive: true, force: true });
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
await ifWe(lc, `switches active branch with checkout and projects branch snapshot onto worktree subfolder`, async () => {
|
|
95
|
+
const testDir = path.join(process.cwd(), '.test_branch_checkout_3');
|
|
96
|
+
const vcsFolderName = '.vcsgib_test_bc_3';
|
|
97
|
+
try {
|
|
98
|
+
await executeInitCmd({
|
|
99
|
+
targetDir: testDir,
|
|
100
|
+
vcsFolderName,
|
|
101
|
+
quiet: true,
|
|
102
|
+
});
|
|
103
|
+
// Commit a file on main
|
|
104
|
+
await fs.writeFile(path.join(testDir, 'app.ts'), 'console.log("Main");', 'utf8');
|
|
105
|
+
await executeAddCmd({
|
|
106
|
+
paths: ['app.ts'],
|
|
107
|
+
targetDir: testDir,
|
|
108
|
+
vcsFolderName,
|
|
109
|
+
quiet: true,
|
|
110
|
+
});
|
|
111
|
+
await executeCommitCmd({
|
|
112
|
+
message: 'Add app.ts on main',
|
|
113
|
+
targetDir: testDir,
|
|
114
|
+
vcsFolderName,
|
|
115
|
+
quiet: true,
|
|
116
|
+
});
|
|
117
|
+
// Create branch feature-ui
|
|
118
|
+
await executeBranchCmd({
|
|
119
|
+
branchName: 'feature-ui',
|
|
120
|
+
targetDir: testDir,
|
|
121
|
+
vcsFolderName,
|
|
122
|
+
quiet: true,
|
|
123
|
+
});
|
|
124
|
+
// Checkout feature-ui
|
|
125
|
+
const checkoutRes = await executeCheckoutCmd({
|
|
126
|
+
branchName: 'feature-ui',
|
|
127
|
+
targetDir: testDir,
|
|
128
|
+
vcsFolderName,
|
|
129
|
+
quiet: true,
|
|
130
|
+
});
|
|
131
|
+
iReckon(lc, checkoutRes.previousBranch).willEqual('main');
|
|
132
|
+
iReckon(lc, checkoutRes.currentBranch).willEqual('feature-ui');
|
|
133
|
+
const expectedWorktree = path.join(testDir, 'b', 'feature-ui');
|
|
134
|
+
iReckon(lc, checkoutRes.worktreePath).willEqual(expectedWorktree);
|
|
135
|
+
// Verify project file exists in worktree path
|
|
136
|
+
const projectedFile = path.join(expectedWorktree, 'app.ts');
|
|
137
|
+
const fileContent = await fs.readFile(projectedFile, 'utf8');
|
|
138
|
+
iReckon(lc, fileContent).willEqual('console.log("Main");');
|
|
139
|
+
// Verify active branch in status
|
|
140
|
+
const statusRes = await executeStatusCmd({
|
|
141
|
+
targetDir: testDir,
|
|
142
|
+
vcsFolderName,
|
|
143
|
+
quiet: true,
|
|
144
|
+
});
|
|
145
|
+
iReckon(lc, statusRes.branchName).willEqual('feature-ui');
|
|
146
|
+
// Verify branch list displays ALL branches while on feature-ui
|
|
147
|
+
const branchListOnFeature = await executeBranchCmd({
|
|
148
|
+
targetDir: testDir,
|
|
149
|
+
vcsFolderName,
|
|
150
|
+
quiet: true,
|
|
151
|
+
});
|
|
152
|
+
iReckon(lc, branchListOnFeature.branches.length).willEqual(2);
|
|
153
|
+
iReckon(lc, branchListOnFeature.branches.map(b => b.name)).includes('main');
|
|
154
|
+
iReckon(lc, branchListOnFeature.branches.map(b => b.name)).includes('feature-ui');
|
|
155
|
+
// Make a commit on feature-ui branch
|
|
156
|
+
await fs.writeFile(path.join(expectedWorktree, 'ui.ts'), 'export const ui = 1;', 'utf8');
|
|
157
|
+
await executeAddCmd({
|
|
158
|
+
paths: ['ui.ts'],
|
|
159
|
+
targetDir: expectedWorktree,
|
|
160
|
+
vcsFolderName,
|
|
161
|
+
quiet: true,
|
|
162
|
+
});
|
|
163
|
+
await executeCommitCmd({
|
|
164
|
+
message: 'Add ui.ts on feature-ui',
|
|
165
|
+
targetDir: expectedWorktree,
|
|
166
|
+
vcsFolderName,
|
|
167
|
+
quiet: true,
|
|
168
|
+
});
|
|
169
|
+
// Verify branch list after commit on feature-ui still displays ALL branches
|
|
170
|
+
const branchListAfterCommit = await executeBranchCmd({
|
|
171
|
+
targetDir: expectedWorktree,
|
|
172
|
+
vcsFolderName,
|
|
173
|
+
quiet: true,
|
|
174
|
+
});
|
|
175
|
+
iReckon(lc, branchListAfterCommit.branches.length).willEqual(2);
|
|
176
|
+
// Switch back to main
|
|
177
|
+
const switchBackRes = await executeCheckoutCmd({
|
|
178
|
+
branchName: 'main',
|
|
179
|
+
targetDir: expectedWorktree,
|
|
180
|
+
vcsFolderName,
|
|
181
|
+
quiet: true,
|
|
182
|
+
});
|
|
183
|
+
iReckon(lc, switchBackRes.currentBranch).willEqual('main');
|
|
184
|
+
iReckon(lc, switchBackRes.worktreePath).willEqual(testDir);
|
|
185
|
+
// Verify branch list displays ALL branches while on main after feature-ui commit
|
|
186
|
+
const branchListOnMain = await executeBranchCmd({
|
|
187
|
+
targetDir: testDir,
|
|
188
|
+
vcsFolderName,
|
|
189
|
+
quiet: true,
|
|
190
|
+
});
|
|
191
|
+
iReckon(lc, branchListOnMain.branches.length).willEqual(2);
|
|
192
|
+
iReckon(lc, branchListOnMain.branches.map(b => b.name)).includes('main');
|
|
193
|
+
iReckon(lc, branchListOnMain.branches.map(b => b.name)).includes('feature-ui');
|
|
194
|
+
// Switch back to feature-ui seamlessly
|
|
195
|
+
const switchAgainRes = await executeCheckoutCmd({
|
|
196
|
+
branchName: 'feature-ui',
|
|
197
|
+
targetDir: testDir,
|
|
198
|
+
vcsFolderName,
|
|
199
|
+
quiet: true,
|
|
200
|
+
});
|
|
201
|
+
iReckon(lc, switchAgainRes.currentBranch).willEqual('feature-ui');
|
|
202
|
+
}
|
|
203
|
+
finally {
|
|
204
|
+
await fs.rm(testDir, { recursive: true, force: true });
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
await ifWe(lc, `rejects checkout when branch does not exist or branchName missing`, async () => {
|
|
208
|
+
const testDir = path.join(process.cwd(), '.test_branch_checkout_4');
|
|
209
|
+
const vcsFolderName = '.vcsgib_test_bc_4';
|
|
210
|
+
try {
|
|
211
|
+
await executeInitCmd({
|
|
212
|
+
targetDir: testDir,
|
|
213
|
+
vcsFolderName,
|
|
214
|
+
quiet: true,
|
|
215
|
+
});
|
|
216
|
+
let err1 = false;
|
|
217
|
+
try {
|
|
218
|
+
await executeCheckoutCmd({
|
|
219
|
+
branchName: '',
|
|
220
|
+
targetDir: testDir,
|
|
221
|
+
vcsFolderName,
|
|
222
|
+
quiet: true,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
catch (err) {
|
|
226
|
+
err1 = true;
|
|
227
|
+
iReckon(lc, err.message).includes('Branch name is required');
|
|
228
|
+
}
|
|
229
|
+
iReckon(lc, err1).isGonnaBeTrue();
|
|
230
|
+
let err2 = false;
|
|
231
|
+
try {
|
|
232
|
+
await executeCheckoutCmd({
|
|
233
|
+
branchName: 'non-existent-branch',
|
|
234
|
+
targetDir: testDir,
|
|
235
|
+
vcsFolderName,
|
|
236
|
+
quiet: true,
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
catch (err) {
|
|
240
|
+
err2 = true;
|
|
241
|
+
iReckon(lc, err.message).includes("does not exist");
|
|
242
|
+
}
|
|
243
|
+
iReckon(lc, err2).isGonnaBeTrue();
|
|
244
|
+
}
|
|
245
|
+
finally {
|
|
246
|
+
await fs.rm(testDir, { recursive: true, force: true });
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
await ifWe(lc, `lists branches silently on secondary branch without error noise`, async () => {
|
|
250
|
+
const testDir = path.join(process.cwd(), '.test_branch_checkout_secondary');
|
|
251
|
+
const vcsFolderName = '.vcsgib_test_bc_sec';
|
|
252
|
+
try {
|
|
253
|
+
await executeInitCmd({
|
|
254
|
+
targetDir: testDir,
|
|
255
|
+
vcsFolderName,
|
|
256
|
+
quiet: true,
|
|
257
|
+
});
|
|
258
|
+
// Create and checkout secondary branch feature-math
|
|
259
|
+
await executeBranchCmd({
|
|
260
|
+
branchName: 'feature-math',
|
|
261
|
+
targetDir: testDir,
|
|
262
|
+
vcsFolderName,
|
|
263
|
+
quiet: true,
|
|
264
|
+
});
|
|
265
|
+
await executeCheckoutCmd({
|
|
266
|
+
branchName: 'feature-math',
|
|
267
|
+
targetDir: testDir,
|
|
268
|
+
vcsFolderName,
|
|
269
|
+
quiet: true,
|
|
270
|
+
});
|
|
271
|
+
// Run branch list while on secondary branch
|
|
272
|
+
const listRes = await executeBranchCmd({
|
|
273
|
+
targetDir: testDir,
|
|
274
|
+
vcsFolderName,
|
|
275
|
+
quiet: true,
|
|
276
|
+
});
|
|
277
|
+
iReckon(lc, listRes.branches.length).willEqual(2);
|
|
278
|
+
const mathBranch = listRes.branches.find(b => b.name === 'feature-math');
|
|
279
|
+
const mainBranch = listRes.branches.find(b => b.name === 'main');
|
|
280
|
+
iReckon(lc, mathBranch?.isActive).isGonnaBeTrue();
|
|
281
|
+
iReckon(lc, mainBranch?.isActive).isGonnaBeFalse();
|
|
282
|
+
}
|
|
283
|
+
finally {
|
|
284
|
+
await fs.rm(testDir, { recursive: true, force: true });
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
});
|
|
288
|
+
//# sourceMappingURL=branch-checkout-cmd.respec.node.mjs.map
|