@camaradesuk/git-worktree-tools 1.0.3
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/LICENSE +21 -0
- package/README.md +259 -0
- package/dist/cli/cleanpr.d.ts +13 -0
- package/dist/cli/cleanpr.d.ts.map +1 -0
- package/dist/cli/cleanpr.js +441 -0
- package/dist/cli/cleanpr.js.map +1 -0
- package/dist/cli/lswt.d.ts +11 -0
- package/dist/cli/lswt.d.ts.map +1 -0
- package/dist/cli/lswt.js +313 -0
- package/dist/cli/lswt.js.map +1 -0
- package/dist/cli/newpr.d.ts +11 -0
- package/dist/cli/newpr.d.ts.map +1 -0
- package/dist/cli/newpr.js +888 -0
- package/dist/cli/newpr.js.map +1 -0
- package/dist/cli/wtlink.d.ts +15 -0
- package/dist/cli/wtlink.d.ts.map +1 -0
- package/dist/cli/wtlink.js +124 -0
- package/dist/cli/wtlink.js.map +1 -0
- package/dist/e2e/cli.e2e.test.d.ts +2 -0
- package/dist/e2e/cli.e2e.test.d.ts.map +1 -0
- package/dist/e2e/cli.e2e.test.js +215 -0
- package/dist/e2e/cli.e2e.test.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/integration/git.integration.test.d.ts +2 -0
- package/dist/integration/git.integration.test.d.ts.map +1 -0
- package/dist/integration/git.integration.test.js +333 -0
- package/dist/integration/git.integration.test.js.map +1 -0
- package/dist/lib/colors.d.ts +59 -0
- package/dist/lib/colors.d.ts.map +1 -0
- package/dist/lib/colors.js +145 -0
- package/dist/lib/colors.js.map +1 -0
- package/dist/lib/colors.test.d.ts +2 -0
- package/dist/lib/colors.test.d.ts.map +1 -0
- package/dist/lib/colors.test.js +69 -0
- package/dist/lib/colors.test.js.map +1 -0
- package/dist/lib/config.d.ts +58 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +91 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/config.test.d.ts +2 -0
- package/dist/lib/config.test.d.ts.map +1 -0
- package/dist/lib/config.test.js +84 -0
- package/dist/lib/config.test.js.map +1 -0
- package/dist/lib/constants.d.ts +37 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +37 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/errors.d.ts +88 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +112 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/errors.test.d.ts +2 -0
- package/dist/lib/errors.test.d.ts.map +1 -0
- package/dist/lib/errors.test.js +117 -0
- package/dist/lib/errors.test.js.map +1 -0
- package/dist/lib/git.d.ts +224 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +524 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/git.test.d.ts +2 -0
- package/dist/lib/git.test.d.ts.map +1 -0
- package/dist/lib/git.test.js +402 -0
- package/dist/lib/git.test.js.map +1 -0
- package/dist/lib/github.d.ts +82 -0
- package/dist/lib/github.d.ts.map +1 -0
- package/dist/lib/github.js +254 -0
- package/dist/lib/github.js.map +1 -0
- package/dist/lib/github.test.d.ts +2 -0
- package/dist/lib/github.test.d.ts.map +1 -0
- package/dist/lib/github.test.js +258 -0
- package/dist/lib/github.test.js.map +1 -0
- package/dist/lib/prompts.d.ts +39 -0
- package/dist/lib/prompts.d.ts.map +1 -0
- package/dist/lib/prompts.js +213 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/lib/prompts.test.d.ts +2 -0
- package/dist/lib/prompts.test.d.ts.map +1 -0
- package/dist/lib/prompts.test.js +250 -0
- package/dist/lib/prompts.test.js.map +1 -0
- package/dist/lib/state-detection.d.ts +65 -0
- package/dist/lib/state-detection.d.ts.map +1 -0
- package/dist/lib/state-detection.js +186 -0
- package/dist/lib/state-detection.js.map +1 -0
- package/dist/lib/state-detection.test.d.ts +2 -0
- package/dist/lib/state-detection.test.d.ts.map +1 -0
- package/dist/lib/state-detection.test.js +164 -0
- package/dist/lib/state-detection.test.js.map +1 -0
- package/dist/lib/wtlink/index.d.ts +5 -0
- package/dist/lib/wtlink/index.d.ts.map +1 -0
- package/dist/lib/wtlink/index.js +7 -0
- package/dist/lib/wtlink/index.js.map +1 -0
- package/dist/lib/wtlink/link-configs.d.ts +10 -0
- package/dist/lib/wtlink/link-configs.d.ts.map +1 -0
- package/dist/lib/wtlink/link-configs.js +411 -0
- package/dist/lib/wtlink/link-configs.js.map +1 -0
- package/dist/lib/wtlink/link-configs.test.d.ts +2 -0
- package/dist/lib/wtlink/link-configs.test.d.ts.map +1 -0
- package/dist/lib/wtlink/link-configs.test.js +179 -0
- package/dist/lib/wtlink/link-configs.test.js.map +1 -0
- package/dist/lib/wtlink/main-menu.d.ts +2 -0
- package/dist/lib/wtlink/main-menu.d.ts.map +1 -0
- package/dist/lib/wtlink/main-menu.js +149 -0
- package/dist/lib/wtlink/main-menu.js.map +1 -0
- package/dist/lib/wtlink/manage-manifest.d.ts +9 -0
- package/dist/lib/wtlink/manage-manifest.d.ts.map +1 -0
- package/dist/lib/wtlink/manage-manifest.js +1262 -0
- package/dist/lib/wtlink/manage-manifest.js.map +1 -0
- package/dist/lib/wtlink/validate-manifest.d.ts +6 -0
- package/dist/lib/wtlink/validate-manifest.d.ts.map +1 -0
- package/dist/lib/wtlink/validate-manifest.js +51 -0
- package/dist/lib/wtlink/validate-manifest.js.map +1 -0
- package/dist/lib/wtlink/validate-manifest.test.d.ts +2 -0
- package/dist/lib/wtlink/validate-manifest.test.d.ts.map +1 -0
- package/dist/lib/wtlink/validate-manifest.test.js +115 -0
- package/dist/lib/wtlink/validate-manifest.test.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
import { describe, it, expect, beforeAll, afterAll, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { execSync } from 'child_process';
|
|
3
|
+
import fs from 'fs';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import os from 'os';
|
|
6
|
+
import * as git from '../lib/git.js';
|
|
7
|
+
/**
|
|
8
|
+
* Integration tests for git operations using a real git repository.
|
|
9
|
+
* These tests create a temporary git repo and perform actual git operations.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Normalize a path for cross-platform comparison.
|
|
13
|
+
* Handles: macOS symlinks (/var -> /private/var), Windows short paths (RUNNER~1 -> runneradmin)
|
|
14
|
+
*/
|
|
15
|
+
function normalizePath(p) {
|
|
16
|
+
try {
|
|
17
|
+
// fs.realpathSync resolves symlinks and normalizes paths
|
|
18
|
+
return path.normalize(fs.realpathSync(p)).toLowerCase();
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// If path doesn't exist, just normalize it
|
|
22
|
+
return path.normalize(p).toLowerCase();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
describe('git integration', () => {
|
|
26
|
+
let tempDir;
|
|
27
|
+
let repoDir;
|
|
28
|
+
// Create temp directory and git repo before all tests
|
|
29
|
+
beforeAll(() => {
|
|
30
|
+
// Use realpathSync to resolve symlinks (e.g., /var -> /private/var on macOS)
|
|
31
|
+
tempDir = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'git-worktree-tools-test-')));
|
|
32
|
+
repoDir = path.join(tempDir, 'test-repo');
|
|
33
|
+
fs.mkdirSync(repoDir);
|
|
34
|
+
// Initialize git repo
|
|
35
|
+
execSync('git init', { cwd: repoDir });
|
|
36
|
+
execSync('git config user.email "test@test.com"', { cwd: repoDir });
|
|
37
|
+
execSync('git config user.name "Test User"', { cwd: repoDir });
|
|
38
|
+
// Create initial commit
|
|
39
|
+
fs.writeFileSync(path.join(repoDir, 'README.md'), '# Test Repo\n');
|
|
40
|
+
execSync('git add .', { cwd: repoDir });
|
|
41
|
+
execSync('git commit -m "Initial commit"', { cwd: repoDir });
|
|
42
|
+
});
|
|
43
|
+
// Clean up after all tests
|
|
44
|
+
afterAll(() => {
|
|
45
|
+
// Remove worktrees first
|
|
46
|
+
try {
|
|
47
|
+
execSync('git worktree prune', { cwd: repoDir, stdio: 'ignore' });
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Ignore errors
|
|
51
|
+
}
|
|
52
|
+
// Remove temp directory
|
|
53
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
54
|
+
});
|
|
55
|
+
describe('getRepoRoot', () => {
|
|
56
|
+
it('returns repo root directory', () => {
|
|
57
|
+
const result = git.getRepoRoot(repoDir);
|
|
58
|
+
expect(normalizePath(result)).toBe(normalizePath(repoDir));
|
|
59
|
+
});
|
|
60
|
+
it('works from subdirectory', () => {
|
|
61
|
+
const subDir = path.join(repoDir, 'subdir');
|
|
62
|
+
fs.mkdirSync(subDir, { recursive: true });
|
|
63
|
+
const result = git.getRepoRoot(subDir);
|
|
64
|
+
expect(normalizePath(result)).toBe(normalizePath(repoDir));
|
|
65
|
+
});
|
|
66
|
+
it('throws for non-repo directory', () => {
|
|
67
|
+
expect(() => git.getRepoRoot(tempDir)).toThrow();
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe('getRepoName', () => {
|
|
71
|
+
it('returns directory name when no remote', () => {
|
|
72
|
+
const result = git.getRepoName(repoDir);
|
|
73
|
+
expect(result).toBe('test-repo');
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe('getCurrentBranch', () => {
|
|
77
|
+
it('returns current branch name', () => {
|
|
78
|
+
// Ensure we're on a known branch
|
|
79
|
+
try {
|
|
80
|
+
execSync('git checkout -b main 2>/dev/null || git checkout main', {
|
|
81
|
+
cwd: repoDir,
|
|
82
|
+
stdio: 'ignore',
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Branch might already exist
|
|
87
|
+
}
|
|
88
|
+
const result = git.getCurrentBranch(repoDir);
|
|
89
|
+
// Could be 'main' or 'master' depending on git default
|
|
90
|
+
expect(result).toMatch(/^(main|master)$/);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe('getWorkingTreeStatus', () => {
|
|
94
|
+
beforeEach(() => {
|
|
95
|
+
// Reset working tree
|
|
96
|
+
execSync('git checkout -- .', { cwd: repoDir, stdio: 'ignore' });
|
|
97
|
+
execSync('git clean -fd', { cwd: repoDir, stdio: 'ignore' });
|
|
98
|
+
});
|
|
99
|
+
it('returns clean for clean working tree', () => {
|
|
100
|
+
const result = git.getWorkingTreeStatus(repoDir);
|
|
101
|
+
expect(result).toBe('clean');
|
|
102
|
+
});
|
|
103
|
+
it('returns staged_only for staged changes', () => {
|
|
104
|
+
fs.writeFileSync(path.join(repoDir, 'README.md'), '# Updated\n');
|
|
105
|
+
execSync('git add README.md', { cwd: repoDir });
|
|
106
|
+
const result = git.getWorkingTreeStatus(repoDir);
|
|
107
|
+
expect(result).toBe('staged_only');
|
|
108
|
+
// Reset
|
|
109
|
+
execSync('git reset HEAD README.md', { cwd: repoDir, stdio: 'ignore' });
|
|
110
|
+
execSync('git checkout -- README.md', { cwd: repoDir, stdio: 'ignore' });
|
|
111
|
+
});
|
|
112
|
+
it('returns unstaged_only for unstaged changes', () => {
|
|
113
|
+
fs.writeFileSync(path.join(repoDir, 'README.md'), '# Modified\n');
|
|
114
|
+
const result = git.getWorkingTreeStatus(repoDir);
|
|
115
|
+
expect(result).toBe('unstaged_only');
|
|
116
|
+
// Reset
|
|
117
|
+
execSync('git checkout -- README.md', { cwd: repoDir, stdio: 'ignore' });
|
|
118
|
+
});
|
|
119
|
+
it('returns unstaged_only for untracked files', () => {
|
|
120
|
+
fs.writeFileSync(path.join(repoDir, 'new-file.txt'), 'content');
|
|
121
|
+
const result = git.getWorkingTreeStatus(repoDir);
|
|
122
|
+
expect(result).toBe('unstaged_only');
|
|
123
|
+
// Clean up
|
|
124
|
+
fs.unlinkSync(path.join(repoDir, 'new-file.txt'));
|
|
125
|
+
});
|
|
126
|
+
it('returns both for staged and unstaged changes', () => {
|
|
127
|
+
fs.writeFileSync(path.join(repoDir, 'README.md'), '# First change\n');
|
|
128
|
+
execSync('git add README.md', { cwd: repoDir });
|
|
129
|
+
fs.writeFileSync(path.join(repoDir, 'README.md'), '# Second change\n');
|
|
130
|
+
const result = git.getWorkingTreeStatus(repoDir);
|
|
131
|
+
expect(result).toBe('both');
|
|
132
|
+
// Reset
|
|
133
|
+
execSync('git reset HEAD README.md', { cwd: repoDir, stdio: 'ignore' });
|
|
134
|
+
execSync('git checkout -- README.md', { cwd: repoDir, stdio: 'ignore' });
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
describe('getStagedFiles and getUnstagedFiles', () => {
|
|
138
|
+
beforeEach(() => {
|
|
139
|
+
execSync('git checkout -- .', { cwd: repoDir, stdio: 'ignore' });
|
|
140
|
+
execSync('git clean -fd', { cwd: repoDir, stdio: 'ignore' });
|
|
141
|
+
});
|
|
142
|
+
it('returns staged files correctly', () => {
|
|
143
|
+
fs.writeFileSync(path.join(repoDir, 'staged.txt'), 'content');
|
|
144
|
+
execSync('git add staged.txt', { cwd: repoDir });
|
|
145
|
+
const result = git.getStagedFiles(repoDir);
|
|
146
|
+
expect(result).toContain('staged.txt');
|
|
147
|
+
// Clean up
|
|
148
|
+
execSync('git reset HEAD staged.txt', { cwd: repoDir, stdio: 'ignore' });
|
|
149
|
+
fs.unlinkSync(path.join(repoDir, 'staged.txt'));
|
|
150
|
+
});
|
|
151
|
+
it('returns unstaged files correctly', () => {
|
|
152
|
+
fs.writeFileSync(path.join(repoDir, 'unstaged.txt'), 'content');
|
|
153
|
+
const result = git.getUnstagedFiles(repoDir);
|
|
154
|
+
expect(result).toContain('unstaged.txt');
|
|
155
|
+
// Clean up
|
|
156
|
+
fs.unlinkSync(path.join(repoDir, 'unstaged.txt'));
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
describe('branch operations', () => {
|
|
160
|
+
it('creates and deletes branches', () => {
|
|
161
|
+
git.createBranch('test-branch', undefined, repoDir);
|
|
162
|
+
expect(git.branchExists('test-branch', repoDir)).toBe(true);
|
|
163
|
+
git.deleteBranch('test-branch', { cwd: repoDir });
|
|
164
|
+
expect(git.branchExists('test-branch', repoDir)).toBe(false);
|
|
165
|
+
});
|
|
166
|
+
it('checks if branch exists', () => {
|
|
167
|
+
expect(git.branchExists('nonexistent-branch', repoDir)).toBe(false);
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
describe('commit operations', () => {
|
|
171
|
+
beforeEach(() => {
|
|
172
|
+
execSync('git checkout -- .', { cwd: repoDir, stdio: 'ignore' });
|
|
173
|
+
execSync('git clean -fd', { cwd: repoDir, stdio: 'ignore' });
|
|
174
|
+
});
|
|
175
|
+
it('creates commit with message', () => {
|
|
176
|
+
fs.writeFileSync(path.join(repoDir, 'commit-test.txt'), 'test content');
|
|
177
|
+
execSync('git add commit-test.txt', { cwd: repoDir });
|
|
178
|
+
const sha = git.commit({ message: 'Test commit message' }, repoDir);
|
|
179
|
+
expect(sha).toMatch(/^[a-f0-9]{40}$/);
|
|
180
|
+
// Verify commit exists
|
|
181
|
+
const log = execSync('git log --oneline -1', { cwd: repoDir, encoding: 'utf8' });
|
|
182
|
+
expect(log).toContain('Test commit message');
|
|
183
|
+
});
|
|
184
|
+
it('creates empty commit when allowed', () => {
|
|
185
|
+
const beforeSha = git.getHeadCommit(repoDir);
|
|
186
|
+
const afterSha = git.commit({ message: 'Empty commit', allowEmpty: true }, repoDir);
|
|
187
|
+
expect(afterSha).not.toBe(beforeSha);
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
describe('worktree operations', () => {
|
|
191
|
+
let worktreePath;
|
|
192
|
+
beforeEach(() => {
|
|
193
|
+
worktreePath = path.join(tempDir, 'worktree-test');
|
|
194
|
+
});
|
|
195
|
+
afterEach(() => {
|
|
196
|
+
// Clean up worktree
|
|
197
|
+
try {
|
|
198
|
+
execSync(`git worktree remove --force "${worktreePath}"`, {
|
|
199
|
+
cwd: repoDir,
|
|
200
|
+
stdio: 'ignore',
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
// Ignore errors
|
|
205
|
+
}
|
|
206
|
+
// Also try to delete the branch
|
|
207
|
+
try {
|
|
208
|
+
execSync('git branch -D worktree-branch', { cwd: repoDir, stdio: 'ignore' });
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
// Ignore errors
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
it('lists worktrees', () => {
|
|
215
|
+
const worktrees = git.listWorktrees(repoDir);
|
|
216
|
+
expect(worktrees.length).toBeGreaterThanOrEqual(1);
|
|
217
|
+
expect(worktrees[0].isMain).toBe(true);
|
|
218
|
+
expect(normalizePath(worktrees[0].path)).toBe(normalizePath(repoDir));
|
|
219
|
+
});
|
|
220
|
+
it('creates and removes worktree', () => {
|
|
221
|
+
git.addWorktree(worktreePath, 'worktree-branch', {
|
|
222
|
+
createBranch: true,
|
|
223
|
+
cwd: repoDir,
|
|
224
|
+
});
|
|
225
|
+
// Verify worktree exists
|
|
226
|
+
expect(fs.existsSync(worktreePath)).toBe(true);
|
|
227
|
+
const worktrees = git.listWorktrees(repoDir);
|
|
228
|
+
const newWorktree = worktrees.find((w) => normalizePath(w.path) === normalizePath(worktreePath));
|
|
229
|
+
expect(newWorktree).toBeDefined();
|
|
230
|
+
expect(newWorktree?.branch).toBe('worktree-branch');
|
|
231
|
+
// Remove worktree
|
|
232
|
+
git.removeWorktree(worktreePath, { cwd: repoDir });
|
|
233
|
+
// Verify worktree removed
|
|
234
|
+
const afterWorktrees = git.listWorktrees(repoDir);
|
|
235
|
+
const removed = afterWorktrees.find((w) => normalizePath(w.path) === normalizePath(worktreePath));
|
|
236
|
+
expect(removed).toBeUndefined();
|
|
237
|
+
});
|
|
238
|
+
it('gets main worktree', () => {
|
|
239
|
+
const mainWorktree = git.getMainWorktree(repoDir);
|
|
240
|
+
expect(mainWorktree).toBeDefined();
|
|
241
|
+
expect(mainWorktree?.isMain).toBe(true);
|
|
242
|
+
expect(normalizePath(mainWorktree.path)).toBe(normalizePath(repoDir));
|
|
243
|
+
});
|
|
244
|
+
it('detects if current directory is a worktree', () => {
|
|
245
|
+
// Main repo should not be considered "a worktree" (it's the main worktree)
|
|
246
|
+
expect(git.isWorktree(repoDir)).toBe(false);
|
|
247
|
+
// Create a secondary worktree
|
|
248
|
+
git.addWorktree(worktreePath, 'worktree-branch', {
|
|
249
|
+
createBranch: true,
|
|
250
|
+
cwd: repoDir,
|
|
251
|
+
});
|
|
252
|
+
// Secondary worktree should be detected as a worktree
|
|
253
|
+
expect(git.isWorktree(worktreePath)).toBe(true);
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
describe('stash operations', () => {
|
|
257
|
+
beforeEach(() => {
|
|
258
|
+
// Reset index and working tree completely
|
|
259
|
+
execSync('git reset HEAD', { cwd: repoDir, stdio: 'ignore' });
|
|
260
|
+
execSync('git checkout -- .', { cwd: repoDir, stdio: 'ignore' });
|
|
261
|
+
execSync('git clean -fd', { cwd: repoDir, stdio: 'ignore' });
|
|
262
|
+
// Clear any existing stashes
|
|
263
|
+
try {
|
|
264
|
+
execSync('git stash clear', { cwd: repoDir, stdio: 'ignore' });
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
// Ignore
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
it('stashes changes and returns reference', () => {
|
|
271
|
+
fs.writeFileSync(path.join(repoDir, 'stash-test.txt'), 'stash content');
|
|
272
|
+
execSync('git add stash-test.txt', { cwd: repoDir });
|
|
273
|
+
const stashRef = git.stash({}, repoDir);
|
|
274
|
+
expect(stashRef).toBe('stash@{0}');
|
|
275
|
+
// Verify file is no longer present
|
|
276
|
+
expect(fs.existsSync(path.join(repoDir, 'stash-test.txt'))).toBe(false);
|
|
277
|
+
// Clean up - apply and reset
|
|
278
|
+
git.stashPop(stashRef, repoDir);
|
|
279
|
+
execSync('git reset HEAD stash-test.txt', { cwd: repoDir, stdio: 'ignore' });
|
|
280
|
+
fs.unlinkSync(path.join(repoDir, 'stash-test.txt'));
|
|
281
|
+
});
|
|
282
|
+
it('returns null when nothing to stash', () => {
|
|
283
|
+
const stashRef = git.stash({}, repoDir);
|
|
284
|
+
expect(stashRef).toBeNull();
|
|
285
|
+
});
|
|
286
|
+
it('stashes with keep-index', () => {
|
|
287
|
+
// Create a staged file
|
|
288
|
+
fs.writeFileSync(path.join(repoDir, 'staged.txt'), 'staged content');
|
|
289
|
+
execSync('git add staged.txt', { cwd: repoDir });
|
|
290
|
+
// Create an unstaged modification to a tracked file
|
|
291
|
+
fs.writeFileSync(path.join(repoDir, 'README.md'), '# Modified README\n');
|
|
292
|
+
git.stash({ keepIndex: true }, repoDir);
|
|
293
|
+
// Staged file should still be present (keep-index preserves staged changes)
|
|
294
|
+
expect(fs.existsSync(path.join(repoDir, 'staged.txt'))).toBe(true);
|
|
295
|
+
// README should be reverted to its last committed state (unstaged changes stashed)
|
|
296
|
+
const readmeContent = fs.readFileSync(path.join(repoDir, 'README.md'), 'utf8');
|
|
297
|
+
// Normalize line endings for cross-platform compatibility
|
|
298
|
+
expect(readmeContent.replace(/\r\n/g, '\n')).toBe('# Test Repo\n');
|
|
299
|
+
// Clean up
|
|
300
|
+
git.stashDrop(undefined, repoDir);
|
|
301
|
+
execSync('git reset HEAD', { cwd: repoDir, stdio: 'ignore' });
|
|
302
|
+
execSync('git checkout -- .', { cwd: repoDir, stdio: 'ignore' });
|
|
303
|
+
if (fs.existsSync(path.join(repoDir, 'staged.txt'))) {
|
|
304
|
+
fs.unlinkSync(path.join(repoDir, 'staged.txt'));
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
describe('checkout', () => {
|
|
309
|
+
beforeEach(() => {
|
|
310
|
+
execSync('git checkout -- .', { cwd: repoDir, stdio: 'ignore' });
|
|
311
|
+
});
|
|
312
|
+
it('switches branches', () => {
|
|
313
|
+
git.createBranch('checkout-test', undefined, repoDir);
|
|
314
|
+
git.checkout('checkout-test', repoDir);
|
|
315
|
+
expect(git.getCurrentBranch(repoDir)).toBe('checkout-test');
|
|
316
|
+
// Switch back
|
|
317
|
+
git.checkout('main', repoDir);
|
|
318
|
+
// Clean up
|
|
319
|
+
git.deleteBranch('checkout-test', { cwd: repoDir });
|
|
320
|
+
});
|
|
321
|
+
});
|
|
322
|
+
describe('getHeadCommit and getShortCommit', () => {
|
|
323
|
+
it('returns full commit SHA', () => {
|
|
324
|
+
const sha = git.getHeadCommit(repoDir);
|
|
325
|
+
expect(sha).toMatch(/^[a-f0-9]{40}$/);
|
|
326
|
+
});
|
|
327
|
+
it('returns short commit SHA', () => {
|
|
328
|
+
const shortSha = git.getShortCommit(repoDir);
|
|
329
|
+
expect(shortSha).toMatch(/^[a-f0-9]{7,8}$/);
|
|
330
|
+
});
|
|
331
|
+
});
|
|
332
|
+
});
|
|
333
|
+
//# sourceMappingURL=git.integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.integration.test.js","sourceRoot":"","sources":["../../src/integration/git.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ANSI color codes for terminal output
|
|
3
|
+
*/
|
|
4
|
+
export declare const codes: {
|
|
5
|
+
readonly reset: "\u001B[0m";
|
|
6
|
+
readonly bold: "\u001B[1m";
|
|
7
|
+
readonly dim: "\u001B[2m";
|
|
8
|
+
readonly italic: "\u001B[3m";
|
|
9
|
+
readonly underline: "\u001B[4m";
|
|
10
|
+
readonly black: "\u001B[30m";
|
|
11
|
+
readonly red: "\u001B[31m";
|
|
12
|
+
readonly green: "\u001B[32m";
|
|
13
|
+
readonly yellow: "\u001B[33m";
|
|
14
|
+
readonly blue: "\u001B[34m";
|
|
15
|
+
readonly magenta: "\u001B[35m";
|
|
16
|
+
readonly cyan: "\u001B[36m";
|
|
17
|
+
readonly white: "\u001B[37m";
|
|
18
|
+
readonly brightBlack: "\u001B[90m";
|
|
19
|
+
readonly brightRed: "\u001B[91m";
|
|
20
|
+
readonly brightGreen: "\u001B[92m";
|
|
21
|
+
readonly brightYellow: "\u001B[93m";
|
|
22
|
+
readonly brightBlue: "\u001B[94m";
|
|
23
|
+
readonly brightMagenta: "\u001B[95m";
|
|
24
|
+
readonly brightCyan: "\u001B[96m";
|
|
25
|
+
readonly brightWhite: "\u001B[97m";
|
|
26
|
+
readonly bgBlack: "\u001B[40m";
|
|
27
|
+
readonly bgRed: "\u001B[41m";
|
|
28
|
+
readonly bgGreen: "\u001B[42m";
|
|
29
|
+
readonly bgYellow: "\u001B[43m";
|
|
30
|
+
readonly bgBlue: "\u001B[44m";
|
|
31
|
+
readonly bgMagenta: "\u001B[45m";
|
|
32
|
+
readonly bgCyan: "\u001B[46m";
|
|
33
|
+
readonly bgWhite: "\u001B[47m";
|
|
34
|
+
};
|
|
35
|
+
export declare function red(text: string): string;
|
|
36
|
+
export declare function green(text: string): string;
|
|
37
|
+
export declare function yellow(text: string): string;
|
|
38
|
+
export declare function blue(text: string): string;
|
|
39
|
+
export declare function cyan(text: string): string;
|
|
40
|
+
export declare function magenta(text: string): string;
|
|
41
|
+
export declare function white(text: string): string;
|
|
42
|
+
export declare function gray(text: string): string;
|
|
43
|
+
export declare function black(text: string): string;
|
|
44
|
+
export declare function bgBlue(text: string): string;
|
|
45
|
+
export declare function bgYellow(text: string): string;
|
|
46
|
+
export declare function bgRed(text: string): string;
|
|
47
|
+
export declare function bgGreen(text: string): string;
|
|
48
|
+
export declare function bold(text: string): string;
|
|
49
|
+
export declare function dim(text: string): string;
|
|
50
|
+
export declare function italic(text: string): string;
|
|
51
|
+
export declare function underline(text: string): string;
|
|
52
|
+
export declare function success(text: string): string;
|
|
53
|
+
export declare function warning(text: string): string;
|
|
54
|
+
export declare function error(text: string): string;
|
|
55
|
+
export declare function info(text: string): string;
|
|
56
|
+
export declare function debug(text: string): string;
|
|
57
|
+
export declare function header(text: string): string;
|
|
58
|
+
export declare function highlight(text: string): string;
|
|
59
|
+
//# sourceMappingURL=colors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/lib/colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCR,CAAC;AAiCX,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExC;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1C;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1C;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1C;AAGD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAGD,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExC;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAGD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG5C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG5C;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG1C;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGzC;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1C;AAGD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3C;AAGD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ANSI color codes for terminal output
|
|
3
|
+
*/
|
|
4
|
+
export const codes = {
|
|
5
|
+
reset: '\x1b[0m',
|
|
6
|
+
bold: '\x1b[1m',
|
|
7
|
+
dim: '\x1b[2m',
|
|
8
|
+
italic: '\x1b[3m',
|
|
9
|
+
underline: '\x1b[4m',
|
|
10
|
+
// Foreground colors
|
|
11
|
+
black: '\x1b[30m',
|
|
12
|
+
red: '\x1b[31m',
|
|
13
|
+
green: '\x1b[32m',
|
|
14
|
+
yellow: '\x1b[33m',
|
|
15
|
+
blue: '\x1b[34m',
|
|
16
|
+
magenta: '\x1b[35m',
|
|
17
|
+
cyan: '\x1b[36m',
|
|
18
|
+
white: '\x1b[37m',
|
|
19
|
+
// Bright foreground colors
|
|
20
|
+
brightBlack: '\x1b[90m',
|
|
21
|
+
brightRed: '\x1b[91m',
|
|
22
|
+
brightGreen: '\x1b[92m',
|
|
23
|
+
brightYellow: '\x1b[93m',
|
|
24
|
+
brightBlue: '\x1b[94m',
|
|
25
|
+
brightMagenta: '\x1b[95m',
|
|
26
|
+
brightCyan: '\x1b[96m',
|
|
27
|
+
brightWhite: '\x1b[97m',
|
|
28
|
+
// Background colors
|
|
29
|
+
bgBlack: '\x1b[40m',
|
|
30
|
+
bgRed: '\x1b[41m',
|
|
31
|
+
bgGreen: '\x1b[42m',
|
|
32
|
+
bgYellow: '\x1b[43m',
|
|
33
|
+
bgBlue: '\x1b[44m',
|
|
34
|
+
bgMagenta: '\x1b[45m',
|
|
35
|
+
bgCyan: '\x1b[46m',
|
|
36
|
+
bgWhite: '\x1b[47m',
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Check if colors should be enabled based on environment
|
|
40
|
+
*/
|
|
41
|
+
function shouldUseColors() {
|
|
42
|
+
// Respect NO_COLOR environment variable
|
|
43
|
+
if (process.env.NO_COLOR !== undefined) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
// Respect FORCE_COLOR environment variable
|
|
47
|
+
if (process.env.FORCE_COLOR !== undefined) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
// Check if stdout is a TTY
|
|
51
|
+
return process.stdout.isTTY ?? false;
|
|
52
|
+
}
|
|
53
|
+
const useColors = shouldUseColors();
|
|
54
|
+
/**
|
|
55
|
+
* Wrap text with ANSI color codes
|
|
56
|
+
*/
|
|
57
|
+
function colorize(text, code) {
|
|
58
|
+
if (!useColors) {
|
|
59
|
+
return text;
|
|
60
|
+
}
|
|
61
|
+
return `${code}${text}${codes.reset}`;
|
|
62
|
+
}
|
|
63
|
+
// Color functions
|
|
64
|
+
export function red(text) {
|
|
65
|
+
return colorize(text, codes.red);
|
|
66
|
+
}
|
|
67
|
+
export function green(text) {
|
|
68
|
+
return colorize(text, codes.green);
|
|
69
|
+
}
|
|
70
|
+
export function yellow(text) {
|
|
71
|
+
return colorize(text, codes.yellow);
|
|
72
|
+
}
|
|
73
|
+
export function blue(text) {
|
|
74
|
+
return colorize(text, codes.blue);
|
|
75
|
+
}
|
|
76
|
+
export function cyan(text) {
|
|
77
|
+
return colorize(text, codes.cyan);
|
|
78
|
+
}
|
|
79
|
+
export function magenta(text) {
|
|
80
|
+
return colorize(text, codes.magenta);
|
|
81
|
+
}
|
|
82
|
+
export function white(text) {
|
|
83
|
+
return colorize(text, codes.white);
|
|
84
|
+
}
|
|
85
|
+
export function gray(text) {
|
|
86
|
+
return colorize(text, codes.brightBlack);
|
|
87
|
+
}
|
|
88
|
+
export function black(text) {
|
|
89
|
+
return colorize(text, codes.black);
|
|
90
|
+
}
|
|
91
|
+
// Background color functions
|
|
92
|
+
export function bgBlue(text) {
|
|
93
|
+
return colorize(text, codes.bgBlue);
|
|
94
|
+
}
|
|
95
|
+
export function bgYellow(text) {
|
|
96
|
+
return colorize(text, codes.bgYellow);
|
|
97
|
+
}
|
|
98
|
+
export function bgRed(text) {
|
|
99
|
+
return colorize(text, codes.bgRed);
|
|
100
|
+
}
|
|
101
|
+
export function bgGreen(text) {
|
|
102
|
+
return colorize(text, codes.bgGreen);
|
|
103
|
+
}
|
|
104
|
+
// Style functions
|
|
105
|
+
export function bold(text) {
|
|
106
|
+
return colorize(text, codes.bold);
|
|
107
|
+
}
|
|
108
|
+
export function dim(text) {
|
|
109
|
+
return colorize(text, codes.dim);
|
|
110
|
+
}
|
|
111
|
+
export function italic(text) {
|
|
112
|
+
return colorize(text, codes.italic);
|
|
113
|
+
}
|
|
114
|
+
export function underline(text) {
|
|
115
|
+
return colorize(text, codes.underline);
|
|
116
|
+
}
|
|
117
|
+
// Semantic output functions with icons
|
|
118
|
+
export function success(text) {
|
|
119
|
+
const icon = useColors ? '✓' : '[OK]';
|
|
120
|
+
return `${green(icon)} ${text}`;
|
|
121
|
+
}
|
|
122
|
+
export function warning(text) {
|
|
123
|
+
const icon = useColors ? '⚠' : '[WARN]';
|
|
124
|
+
return `${yellow(icon)} ${yellow(text)}`;
|
|
125
|
+
}
|
|
126
|
+
export function error(text) {
|
|
127
|
+
const icon = useColors ? '✗' : '[ERROR]';
|
|
128
|
+
return `${red(icon)} ${red(text)}`;
|
|
129
|
+
}
|
|
130
|
+
export function info(text) {
|
|
131
|
+
const icon = useColors ? 'ℹ' : '[INFO]';
|
|
132
|
+
return `${blue(icon)} ${text}`;
|
|
133
|
+
}
|
|
134
|
+
export function debug(text) {
|
|
135
|
+
return dim(`[DEBUG] ${text}`);
|
|
136
|
+
}
|
|
137
|
+
// Utility for headers/titles
|
|
138
|
+
export function header(text) {
|
|
139
|
+
return bold(cyan(text));
|
|
140
|
+
}
|
|
141
|
+
// Utility for highlighting values
|
|
142
|
+
export function highlight(text) {
|
|
143
|
+
return bold(white(text));
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=colors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/lib/colors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.test.d.ts","sourceRoot":"","sources":["../../src/lib/colors.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import * as colors from './colors.js';
|
|
3
|
+
describe('colors', () => {
|
|
4
|
+
describe('codes', () => {
|
|
5
|
+
it('should export ANSI color codes', () => {
|
|
6
|
+
expect(colors.codes.red).toBe('\x1b[31m');
|
|
7
|
+
expect(colors.codes.green).toBe('\x1b[32m');
|
|
8
|
+
expect(colors.codes.yellow).toBe('\x1b[33m');
|
|
9
|
+
expect(colors.codes.blue).toBe('\x1b[34m');
|
|
10
|
+
expect(colors.codes.cyan).toBe('\x1b[36m');
|
|
11
|
+
expect(colors.codes.reset).toBe('\x1b[0m');
|
|
12
|
+
expect(colors.codes.bold).toBe('\x1b[1m');
|
|
13
|
+
expect(colors.codes.dim).toBe('\x1b[2m');
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
describe('color functions', () => {
|
|
17
|
+
// In CI/test environments, colors are typically disabled (no TTY)
|
|
18
|
+
// So we test that the functions return strings containing the input
|
|
19
|
+
it('red should return text', () => {
|
|
20
|
+
const result = colors.red('test');
|
|
21
|
+
expect(result).toContain('test');
|
|
22
|
+
});
|
|
23
|
+
it('green should return text', () => {
|
|
24
|
+
const result = colors.green('test');
|
|
25
|
+
expect(result).toContain('test');
|
|
26
|
+
});
|
|
27
|
+
it('yellow should return text', () => {
|
|
28
|
+
const result = colors.yellow('test');
|
|
29
|
+
expect(result).toContain('test');
|
|
30
|
+
});
|
|
31
|
+
it('blue should return text', () => {
|
|
32
|
+
const result = colors.blue('test');
|
|
33
|
+
expect(result).toContain('test');
|
|
34
|
+
});
|
|
35
|
+
it('cyan should return text', () => {
|
|
36
|
+
const result = colors.cyan('test');
|
|
37
|
+
expect(result).toContain('test');
|
|
38
|
+
});
|
|
39
|
+
it('bold should return text', () => {
|
|
40
|
+
const result = colors.bold('test');
|
|
41
|
+
expect(result).toContain('test');
|
|
42
|
+
});
|
|
43
|
+
it('dim should return text', () => {
|
|
44
|
+
const result = colors.dim('test');
|
|
45
|
+
expect(result).toContain('test');
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe('semantic functions', () => {
|
|
49
|
+
it('success should include the text and a marker', () => {
|
|
50
|
+
const result = colors.success('done');
|
|
51
|
+
expect(result).toContain('done');
|
|
52
|
+
// Should have some marker (either checkmark or [OK])
|
|
53
|
+
expect(result.length).toBeGreaterThan('done'.length);
|
|
54
|
+
});
|
|
55
|
+
it('warning should include the text', () => {
|
|
56
|
+
const result = colors.warning('caution');
|
|
57
|
+
expect(result).toContain('caution');
|
|
58
|
+
});
|
|
59
|
+
it('error should include the text', () => {
|
|
60
|
+
const result = colors.error('failed');
|
|
61
|
+
expect(result).toContain('failed');
|
|
62
|
+
});
|
|
63
|
+
it('info should include the text', () => {
|
|
64
|
+
const result = colors.info('note');
|
|
65
|
+
expect(result).toContain('note');
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
//# sourceMappingURL=colors.test.js.map
|