sync-worktrees 1.7.4 → 1.7.5
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/dist/constants.d.ts +54 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +66 -0
- package/dist/constants.js.map +1 -0
- package/dist/errors/index.d.ts +51 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +119 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/services/git.service.d.ts.map +1 -1
- package/dist/services/git.service.js +49 -40
- package/dist/services/git.service.js.map +1 -1
- package/dist/services/path-resolution.service.d.ts +7 -0
- package/dist/services/path-resolution.service.d.ts.map +1 -0
- package/dist/services/path-resolution.service.js +58 -0
- package/dist/services/path-resolution.service.js.map +1 -0
- package/dist/services/worktree-metadata.service.d.ts +12 -0
- package/dist/services/worktree-metadata.service.d.ts.map +1 -1
- package/dist/services/worktree-metadata.service.js +162 -3
- package/dist/services/worktree-metadata.service.js.map +1 -1
- package/dist/services/worktree-status.service.d.ts +28 -0
- package/dist/services/worktree-status.service.d.ts.map +1 -0
- package/dist/services/worktree-status.service.js +229 -0
- package/dist/services/worktree-status.service.js.map +1 -0
- package/dist/services/worktree-sync.service.d.ts.map +1 -1
- package/dist/services/worktree-sync.service.js +6 -10
- package/dist/services/worktree-sync.service.js.map +1 -1
- package/dist/utils/lfs-error.d.ts +6 -0
- package/dist/utils/lfs-error.d.ts.map +1 -1
- package/dist/utils/lfs-error.js +16 -14
- package/dist/utils/lfs-error.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.PathResolutionService = void 0;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
class PathResolutionService {
|
|
39
|
+
sanitizeBranchName(branchName) {
|
|
40
|
+
return branchName.replace(/\//g, "-").replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
41
|
+
}
|
|
42
|
+
normalizeWorktreePath(worktreePath, worktreeBaseDir) {
|
|
43
|
+
const relativePath = path.relative(worktreeBaseDir, worktreePath);
|
|
44
|
+
if (relativePath.startsWith("..") || path.isAbsolute(relativePath)) {
|
|
45
|
+
throw new Error(`Worktree path '${worktreePath}' is outside base directory '${worktreeBaseDir}'`);
|
|
46
|
+
}
|
|
47
|
+
return relativePath;
|
|
48
|
+
}
|
|
49
|
+
isPathInsideBaseDir(targetPath, baseDir) {
|
|
50
|
+
const relative = path.relative(baseDir, targetPath);
|
|
51
|
+
return !relative.startsWith("..") && !path.isAbsolute(relative);
|
|
52
|
+
}
|
|
53
|
+
extractBranchFromWorktreePath(worktreePath, worktreeBaseDir) {
|
|
54
|
+
return this.normalizeWorktreePath(worktreePath, worktreeBaseDir);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.PathResolutionService = PathResolutionService;
|
|
58
|
+
//# sourceMappingURL=path-resolution.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-resolution.service.js","sourceRoot":"","sources":["../../src/services/path-resolution.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA6B;AAE7B,MAAa,qBAAqB;IAChC,kBAAkB,CAAC,UAAkB;QACnC,OAAO,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;IACxE,CAAC;IAED,qBAAqB,CAAC,YAAoB,EAAE,eAAuB;QACjE,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;QAClE,IAAI,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,kBAAkB,YAAY,gCAAgC,eAAe,GAAG,CAAC,CAAC;QACpG,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,mBAAmB,CAAC,UAAkB,EAAE,OAAe;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClE,CAAC;IAED,6BAA6B,CAAC,YAAoB,EAAE,eAAuB;QACzE,OAAO,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IACnE,CAAC;CACF;AArBD,sDAqBC"}
|
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
import type { SyncMetadata } from "../types/sync-metadata";
|
|
2
2
|
export declare class WorktreeMetadataService {
|
|
3
|
+
/**
|
|
4
|
+
* Gets the internal worktree directory name from a worktree path.
|
|
5
|
+
* Git uses the basename of the worktree path as the internal directory name.
|
|
6
|
+
* For example: /worktrees/fix/test-branch -> test-branch (not fix/test-branch)
|
|
7
|
+
*/
|
|
8
|
+
private getWorktreeDirectoryName;
|
|
3
9
|
getMetadataPath(bareRepoPath: string, worktreeName: string): Promise<string>;
|
|
10
|
+
getMetadataPathFromWorktreePath(bareRepoPath: string, worktreePath: string): Promise<string>;
|
|
4
11
|
saveMetadata(bareRepoPath: string, worktreeName: string, metadata: SyncMetadata): Promise<void>;
|
|
5
12
|
loadMetadata(bareRepoPath: string, worktreeName: string): Promise<SyncMetadata | null>;
|
|
13
|
+
loadMetadataFromPath(bareRepoPath: string, worktreePath: string): Promise<SyncMetadata | null>;
|
|
6
14
|
deleteMetadata(bareRepoPath: string, worktreeName: string): Promise<void>;
|
|
15
|
+
deleteMetadataFromPath(bareRepoPath: string, worktreePath: string): Promise<void>;
|
|
7
16
|
updateLastSync(bareRepoPath: string, worktreeName: string, commit: string, action?: "created" | "updated" | "fetched"): Promise<void>;
|
|
17
|
+
updateLastSyncFromPath(bareRepoPath: string, worktreePath: string, commit: string, action?: "created" | "updated" | "fetched", defaultBranch?: string): Promise<void>;
|
|
8
18
|
createInitialMetadata(bareRepoPath: string, worktreeName: string, commit: string, upstreamBranch: string, parentBranch: string, parentCommit: string): Promise<void>;
|
|
19
|
+
createInitialMetadataFromPath(bareRepoPath: string, worktreePath: string, commit: string, upstreamBranch: string, parentBranch: string, parentCommit: string): Promise<void>;
|
|
20
|
+
validateMetadata(metadata: SyncMetadata): Promise<boolean>;
|
|
9
21
|
}
|
|
10
22
|
//# sourceMappingURL=worktree-metadata.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/worktree-metadata.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"worktree-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/worktree-metadata.service.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,qBAAa,uBAAuB;IAClC;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAI1B,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAM5E,+BAA+B,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAM5F,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAU/F,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAYtF,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAoD9F,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAazE,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAajF,cAAc,CAClB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,SAAS,GAAG,SAAS,GAAG,SAAqB,GACpD,OAAO,CAAC,IAAI,CAAC;IA0BV,sBAAsB,CAC1B,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,SAAS,GAAG,SAAS,GAAG,SAAqB,EACrD,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC;IAqEV,qBAAqB,CACzB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC;IAqBV,6BAA6B,CACjC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC;IAsBV,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;CAejE"}
|
|
@@ -32,16 +32,34 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
32
32
|
return result;
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
35
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
39
|
exports.WorktreeMetadataService = void 0;
|
|
37
40
|
const fs = __importStar(require("fs/promises"));
|
|
38
41
|
const path = __importStar(require("path"));
|
|
42
|
+
const simple_git_1 = __importDefault(require("simple-git"));
|
|
43
|
+
const constants_1 = require("../constants");
|
|
39
44
|
class WorktreeMetadataService {
|
|
45
|
+
/**
|
|
46
|
+
* Gets the internal worktree directory name from a worktree path.
|
|
47
|
+
* Git uses the basename of the worktree path as the internal directory name.
|
|
48
|
+
* For example: /worktrees/fix/test-branch -> test-branch (not fix/test-branch)
|
|
49
|
+
*/
|
|
50
|
+
getWorktreeDirectoryName(worktreePath) {
|
|
51
|
+
return path.basename(worktreePath);
|
|
52
|
+
}
|
|
40
53
|
async getMetadataPath(bareRepoPath, worktreeName) {
|
|
41
54
|
// Git stores worktree metadata in .git/worktrees/[worktree-name]/
|
|
42
55
|
// We'll store our metadata alongside Git's metadata
|
|
43
56
|
return path.join(bareRepoPath, ".git", "worktrees", worktreeName, "sync-metadata.json");
|
|
44
57
|
}
|
|
58
|
+
async getMetadataPathFromWorktreePath(bareRepoPath, worktreePath) {
|
|
59
|
+
// Extract the worktree directory name (basename) that Git actually uses
|
|
60
|
+
const worktreeDirName = this.getWorktreeDirectoryName(worktreePath);
|
|
61
|
+
return this.getMetadataPath(bareRepoPath, worktreeDirName);
|
|
62
|
+
}
|
|
45
63
|
async saveMetadata(bareRepoPath, worktreeName, metadata) {
|
|
46
64
|
const metadataPath = await this.getMetadataPath(bareRepoPath, worktreeName);
|
|
47
65
|
// Ensure directory exists
|
|
@@ -60,6 +78,52 @@ class WorktreeMetadataService {
|
|
|
60
78
|
return null;
|
|
61
79
|
}
|
|
62
80
|
}
|
|
81
|
+
async loadMetadataFromPath(bareRepoPath, worktreePath) {
|
|
82
|
+
const metadataPath = await this.getMetadataPathFromWorktreePath(bareRepoPath, worktreePath);
|
|
83
|
+
try {
|
|
84
|
+
const content = await fs.readFile(metadataPath, "utf-8");
|
|
85
|
+
const metadata = JSON.parse(content);
|
|
86
|
+
if (!(await this.validateMetadata(metadata))) {
|
|
87
|
+
console.warn(`Corrupted metadata for ${worktreePath}, treating as missing`);
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
return metadata;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// Fallback: try loading from old path (using branch name with slashes)
|
|
94
|
+
// This handles migration from the old broken path structure
|
|
95
|
+
try {
|
|
96
|
+
const branchName = path.basename(worktreePath);
|
|
97
|
+
// Check if branch name might have had slashes (parent dir would exist)
|
|
98
|
+
const parentDir = path.dirname(worktreePath);
|
|
99
|
+
const possibleBranchWithSlash = path.join(path.basename(parentDir), branchName);
|
|
100
|
+
// Try the old path with potential slash in branch name
|
|
101
|
+
const oldPath = path.join(bareRepoPath, ".git", "worktrees", possibleBranchWithSlash, "sync-metadata.json");
|
|
102
|
+
const content = await fs.readFile(oldPath, "utf-8");
|
|
103
|
+
const metadata = JSON.parse(content);
|
|
104
|
+
if (!(await this.validateMetadata(metadata))) {
|
|
105
|
+
console.warn(`Corrupted metadata at old path ${oldPath}, treating as missing`);
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
// Migrate to new path
|
|
109
|
+
await this.saveMetadata(bareRepoPath, this.getWorktreeDirectoryName(worktreePath), metadata);
|
|
110
|
+
// Clean up old path
|
|
111
|
+
try {
|
|
112
|
+
await fs.unlink(oldPath);
|
|
113
|
+
// Try to remove empty parent directory
|
|
114
|
+
await fs.rm(path.dirname(oldPath), { recursive: false, force: true });
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// Ignore cleanup errors
|
|
118
|
+
}
|
|
119
|
+
return metadata;
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// Return null if file doesn't exist or can't be parsed
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
63
127
|
async deleteMetadata(bareRepoPath, worktreeName) {
|
|
64
128
|
const metadataPath = await this.getMetadataPath(bareRepoPath, worktreeName);
|
|
65
129
|
try {
|
|
@@ -72,6 +136,18 @@ class WorktreeMetadataService {
|
|
|
72
136
|
}
|
|
73
137
|
}
|
|
74
138
|
}
|
|
139
|
+
async deleteMetadataFromPath(bareRepoPath, worktreePath) {
|
|
140
|
+
const metadataPath = await this.getMetadataPathFromWorktreePath(bareRepoPath, worktreePath);
|
|
141
|
+
try {
|
|
142
|
+
await fs.unlink(metadataPath);
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
// Ignore errors if file doesn't exist
|
|
146
|
+
if (error.code !== "ENOENT") {
|
|
147
|
+
throw error;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
75
151
|
async updateLastSync(bareRepoPath, worktreeName, commit, action = "updated") {
|
|
76
152
|
const existing = await this.loadMetadata(bareRepoPath, worktreeName);
|
|
77
153
|
if (!existing) {
|
|
@@ -82,17 +158,68 @@ class WorktreeMetadataService {
|
|
|
82
158
|
// Update metadata
|
|
83
159
|
existing.lastSyncCommit = commit;
|
|
84
160
|
existing.lastSyncDate = new Date().toISOString();
|
|
85
|
-
// Add to history (limit to last 10 entries)
|
|
86
161
|
existing.syncHistory.push({
|
|
87
162
|
date: existing.lastSyncDate,
|
|
88
163
|
commit,
|
|
89
164
|
action,
|
|
90
165
|
});
|
|
91
|
-
if (existing.syncHistory.length >
|
|
92
|
-
existing.syncHistory = existing.syncHistory.slice(-
|
|
166
|
+
if (existing.syncHistory.length > constants_1.METADATA_CONSTANTS.MAX_HISTORY_ENTRIES) {
|
|
167
|
+
existing.syncHistory = existing.syncHistory.slice(-constants_1.METADATA_CONSTANTS.MAX_HISTORY_ENTRIES);
|
|
93
168
|
}
|
|
94
169
|
await this.saveMetadata(bareRepoPath, worktreeName, existing);
|
|
95
170
|
}
|
|
171
|
+
async updateLastSyncFromPath(bareRepoPath, worktreePath, commit, action = "updated", defaultBranch) {
|
|
172
|
+
const worktreeDirName = this.getWorktreeDirectoryName(worktreePath);
|
|
173
|
+
const existing = await this.loadMetadataFromPath(bareRepoPath, worktreePath);
|
|
174
|
+
if (!existing) {
|
|
175
|
+
console.warn(`No metadata found for worktree ${worktreeDirName}`);
|
|
176
|
+
console.log(` Attempting to create initial metadata...`);
|
|
177
|
+
try {
|
|
178
|
+
const worktreeGit = (0, simple_git_1.default)(worktreePath);
|
|
179
|
+
const currentCommit = await worktreeGit.revparse(["HEAD"]);
|
|
180
|
+
const branchSummary = await worktreeGit.branch();
|
|
181
|
+
const actualBranchName = branchSummary.current;
|
|
182
|
+
if (!actualBranchName) {
|
|
183
|
+
throw new Error("Could not determine current branch name");
|
|
184
|
+
}
|
|
185
|
+
let upstreamBranch = `origin/${actualBranchName}`;
|
|
186
|
+
try {
|
|
187
|
+
const configuredUpstream = await worktreeGit.raw([
|
|
188
|
+
"rev-parse",
|
|
189
|
+
"--abbrev-ref",
|
|
190
|
+
`${actualBranchName}@{upstream}`,
|
|
191
|
+
]);
|
|
192
|
+
if (configuredUpstream.trim()) {
|
|
193
|
+
upstreamBranch = configuredUpstream.trim();
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
// No configured upstream, use constructed value
|
|
198
|
+
}
|
|
199
|
+
const parentBranch = defaultBranch || "main";
|
|
200
|
+
await this.createInitialMetadataFromPath(bareRepoPath, worktreePath, currentCommit.trim(), upstreamBranch, parentBranch, currentCommit.trim());
|
|
201
|
+
console.log(` ✅ Created metadata for ${worktreeDirName}`);
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
console.error(` ❌ Failed to create metadata: ${error}`);
|
|
206
|
+
throw error;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// Update metadata
|
|
210
|
+
existing.lastSyncCommit = commit;
|
|
211
|
+
existing.lastSyncDate = new Date().toISOString();
|
|
212
|
+
existing.syncHistory.push({
|
|
213
|
+
date: existing.lastSyncDate,
|
|
214
|
+
commit,
|
|
215
|
+
action,
|
|
216
|
+
});
|
|
217
|
+
if (existing.syncHistory.length > constants_1.METADATA_CONSTANTS.MAX_HISTORY_ENTRIES) {
|
|
218
|
+
existing.syncHistory = existing.syncHistory.slice(-constants_1.METADATA_CONSTANTS.MAX_HISTORY_ENTRIES);
|
|
219
|
+
}
|
|
220
|
+
// Save using the directory name
|
|
221
|
+
await this.saveMetadata(bareRepoPath, worktreeDirName, existing);
|
|
222
|
+
}
|
|
96
223
|
async createInitialMetadata(bareRepoPath, worktreeName, commit, upstreamBranch, parentBranch, parentCommit) {
|
|
97
224
|
const metadata = {
|
|
98
225
|
lastSyncCommit: commit,
|
|
@@ -112,6 +239,38 @@ class WorktreeMetadataService {
|
|
|
112
239
|
};
|
|
113
240
|
await this.saveMetadata(bareRepoPath, worktreeName, metadata);
|
|
114
241
|
}
|
|
242
|
+
async createInitialMetadataFromPath(bareRepoPath, worktreePath, commit, upstreamBranch, parentBranch, parentCommit) {
|
|
243
|
+
const worktreeDirName = this.getWorktreeDirectoryName(worktreePath);
|
|
244
|
+
const metadata = {
|
|
245
|
+
lastSyncCommit: commit,
|
|
246
|
+
lastSyncDate: new Date().toISOString(),
|
|
247
|
+
upstreamBranch,
|
|
248
|
+
createdFrom: {
|
|
249
|
+
branch: parentBranch,
|
|
250
|
+
commit: parentCommit,
|
|
251
|
+
},
|
|
252
|
+
syncHistory: [
|
|
253
|
+
{
|
|
254
|
+
date: new Date().toISOString(),
|
|
255
|
+
commit,
|
|
256
|
+
action: "created",
|
|
257
|
+
},
|
|
258
|
+
],
|
|
259
|
+
};
|
|
260
|
+
await this.saveMetadata(bareRepoPath, worktreeDirName, metadata);
|
|
261
|
+
}
|
|
262
|
+
async validateMetadata(metadata) {
|
|
263
|
+
if (!metadata.lastSyncCommit || !metadata.lastSyncDate || !metadata.upstreamBranch) {
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
if (!/^[0-9a-f]+$/i.test(metadata.lastSyncCommit)) {
|
|
267
|
+
return false;
|
|
268
|
+
}
|
|
269
|
+
if (Number.isNaN(new Date(metadata.lastSyncDate).getTime())) {
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
return true;
|
|
273
|
+
}
|
|
115
274
|
}
|
|
116
275
|
exports.WorktreeMetadataService = WorktreeMetadataService;
|
|
117
276
|
//# sourceMappingURL=worktree-metadata.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree-metadata.service.js","sourceRoot":"","sources":["../../src/services/worktree-metadata.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"worktree-metadata.service.js","sourceRoot":"","sources":["../../src/services/worktree-metadata.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface WorktreeStatusResult {
|
|
2
|
+
isClean: boolean;
|
|
3
|
+
hasUnpushedCommits: boolean;
|
|
4
|
+
hasStashedChanges: boolean;
|
|
5
|
+
hasOperationInProgress: boolean;
|
|
6
|
+
hasModifiedSubmodules: boolean;
|
|
7
|
+
upstreamGone: boolean;
|
|
8
|
+
canRemove: boolean;
|
|
9
|
+
reasons: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare class WorktreeStatusService {
|
|
12
|
+
private readonly config;
|
|
13
|
+
constructor(config?: {
|
|
14
|
+
skipLfs?: boolean;
|
|
15
|
+
});
|
|
16
|
+
checkWorktreeStatus(worktreePath: string): Promise<boolean>;
|
|
17
|
+
getFullWorktreeStatus(worktreePath: string): Promise<WorktreeStatusResult>;
|
|
18
|
+
hasUnpushedCommits(worktreePath: string, lastSyncCommit?: string): Promise<boolean>;
|
|
19
|
+
hasUpstreamGone(worktreePath: string): Promise<boolean>;
|
|
20
|
+
hasStashedChanges(worktreePath: string): Promise<boolean>;
|
|
21
|
+
hasModifiedSubmodules(worktreePath: string): Promise<boolean>;
|
|
22
|
+
hasOperationInProgress(worktreePath: string): Promise<boolean>;
|
|
23
|
+
validateWorktreeForRemoval(worktreePath: string): Promise<void>;
|
|
24
|
+
private isDetachedHead;
|
|
25
|
+
private resolveGitDir;
|
|
26
|
+
private createGitInstance;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=worktree-status.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-status.service.d.ts","sourceRoot":"","sources":["../../src/services/worktree-status.service.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sBAAsB,EAAE,OAAO,CAAC;IAChC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,GAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAO;IAEzD,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM3D,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA8B1E,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA8BnF,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgCvD,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYzD,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmB7D,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4B9D,0BAA0B,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAQvD,cAAc;YASd,aAAa;IAwB3B,OAAO,CAAC,iBAAiB;CAI1B"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.WorktreeStatusService = void 0;
|
|
40
|
+
const fs = __importStar(require("fs/promises"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const simple_git_1 = __importDefault(require("simple-git"));
|
|
43
|
+
const constants_1 = require("../constants");
|
|
44
|
+
const errors_1 = require("../errors");
|
|
45
|
+
const lfs_error_1 = require("../utils/lfs-error");
|
|
46
|
+
class WorktreeStatusService {
|
|
47
|
+
config;
|
|
48
|
+
constructor(config = {}) {
|
|
49
|
+
this.config = config;
|
|
50
|
+
}
|
|
51
|
+
async checkWorktreeStatus(worktreePath) {
|
|
52
|
+
const worktreeGit = this.createGitInstance(worktreePath);
|
|
53
|
+
const status = await worktreeGit.status();
|
|
54
|
+
return status.isClean();
|
|
55
|
+
}
|
|
56
|
+
async getFullWorktreeStatus(worktreePath) {
|
|
57
|
+
const isClean = await this.checkWorktreeStatus(worktreePath);
|
|
58
|
+
const hasUnpushedCommits = await this.hasUnpushedCommits(worktreePath);
|
|
59
|
+
const hasStashedChanges = await this.hasStashedChanges(worktreePath);
|
|
60
|
+
const hasOperationInProgress = await this.hasOperationInProgress(worktreePath);
|
|
61
|
+
const hasModifiedSubmodules = await this.hasModifiedSubmodules(worktreePath);
|
|
62
|
+
const upstreamGone = await this.hasUpstreamGone(worktreePath);
|
|
63
|
+
const reasons = [];
|
|
64
|
+
if (!isClean)
|
|
65
|
+
reasons.push("uncommitted changes");
|
|
66
|
+
if (hasUnpushedCommits)
|
|
67
|
+
reasons.push("unpushed commits");
|
|
68
|
+
if (hasStashedChanges)
|
|
69
|
+
reasons.push("stashed changes");
|
|
70
|
+
if (hasOperationInProgress)
|
|
71
|
+
reasons.push("operation in progress");
|
|
72
|
+
if (hasModifiedSubmodules)
|
|
73
|
+
reasons.push("modified submodules");
|
|
74
|
+
const canRemove = isClean && !hasUnpushedCommits && !hasStashedChanges && !hasOperationInProgress && !hasModifiedSubmodules;
|
|
75
|
+
return {
|
|
76
|
+
isClean,
|
|
77
|
+
hasUnpushedCommits,
|
|
78
|
+
hasStashedChanges,
|
|
79
|
+
hasOperationInProgress,
|
|
80
|
+
hasModifiedSubmodules,
|
|
81
|
+
upstreamGone,
|
|
82
|
+
canRemove,
|
|
83
|
+
reasons,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
async hasUnpushedCommits(worktreePath, lastSyncCommit) {
|
|
87
|
+
const worktreeGit = this.createGitInstance(worktreePath);
|
|
88
|
+
try {
|
|
89
|
+
if (await this.isDetachedHead(worktreeGit)) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
const branchSummary = await worktreeGit.branch();
|
|
93
|
+
const currentBranch = branchSummary.current;
|
|
94
|
+
if (lastSyncCommit) {
|
|
95
|
+
try {
|
|
96
|
+
const newCommitsResult = await worktreeGit.raw(["rev-list", "--count", `${lastSyncCommit}..HEAD`]);
|
|
97
|
+
const newCommitsCount = parseInt(newCommitsResult.trim(), 10);
|
|
98
|
+
return newCommitsCount > 0;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Fall through to regular check
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const result = await worktreeGit.raw(["rev-list", "--count", currentBranch, "--not", "--remotes"]);
|
|
105
|
+
const unpushedCount = parseInt(result.trim(), 10);
|
|
106
|
+
return unpushedCount > 0;
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
console.error(`Error checking unpushed commits: ${error}`);
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async hasUpstreamGone(worktreePath) {
|
|
114
|
+
const worktreeGit = this.createGitInstance(worktreePath);
|
|
115
|
+
try {
|
|
116
|
+
if (await this.isDetachedHead(worktreeGit)) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
const branchSummary = await worktreeGit.branch();
|
|
120
|
+
const currentBranch = branchSummary.current;
|
|
121
|
+
const upstream = await worktreeGit.raw(["rev-parse", "--abbrev-ref", `${currentBranch}@{upstream}`]);
|
|
122
|
+
const remoteBranches = await worktreeGit.branch(["-r"]);
|
|
123
|
+
return !remoteBranches.all.includes(upstream.trim());
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
const errorMessage = (0, lfs_error_1.getErrorMessage)(error);
|
|
127
|
+
if (errorMessage.includes("fatal: no upstream configured") ||
|
|
128
|
+
errorMessage.includes("no upstream configured for branch") ||
|
|
129
|
+
errorMessage.includes("fatal: ambiguous argument") ||
|
|
130
|
+
errorMessage.includes("unknown revision or path")) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
console.error(`Unexpected error checking upstream status for ${worktreePath}: ${errorMessage}`);
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async hasStashedChanges(worktreePath) {
|
|
138
|
+
const worktreeGit = this.createGitInstance(worktreePath);
|
|
139
|
+
try {
|
|
140
|
+
const stashList = await worktreeGit.stashList();
|
|
141
|
+
return stashList.total > 0;
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
console.error(`Error checking stash: ${error}`);
|
|
145
|
+
return true; // Conservative: assume unsafe to delete
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async hasModifiedSubmodules(worktreePath) {
|
|
149
|
+
const worktreeGit = this.createGitInstance(worktreePath);
|
|
150
|
+
try {
|
|
151
|
+
const result = await worktreeGit.raw(["submodule", "status"]);
|
|
152
|
+
const lines = result.split("\n").filter((line) => line.trim());
|
|
153
|
+
for (const line of lines) {
|
|
154
|
+
const firstChar = line.charAt(0);
|
|
155
|
+
if (firstChar === "+" || firstChar === "-") {
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
async hasOperationInProgress(worktreePath) {
|
|
166
|
+
try {
|
|
167
|
+
const gitDir = await this.resolveGitDir(worktreePath);
|
|
168
|
+
const operationFiles = [
|
|
169
|
+
constants_1.GIT_OPERATIONS.MERGE_HEAD,
|
|
170
|
+
constants_1.GIT_OPERATIONS.CHERRY_PICK_HEAD,
|
|
171
|
+
constants_1.GIT_OPERATIONS.REVERT_HEAD,
|
|
172
|
+
constants_1.GIT_OPERATIONS.BISECT_LOG,
|
|
173
|
+
constants_1.GIT_OPERATIONS.REBASE_MERGE,
|
|
174
|
+
constants_1.GIT_OPERATIONS.REBASE_APPLY,
|
|
175
|
+
];
|
|
176
|
+
for (const file of operationFiles) {
|
|
177
|
+
try {
|
|
178
|
+
await fs.access(path.join(gitDir, file));
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
async validateWorktreeForRemoval(worktreePath) {
|
|
192
|
+
const status = await this.getFullWorktreeStatus(worktreePath);
|
|
193
|
+
if (!status.canRemove) {
|
|
194
|
+
throw new errors_1.WorktreeNotCleanError(worktreePath, status.reasons);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
async isDetachedHead(worktreeGit) {
|
|
198
|
+
try {
|
|
199
|
+
const branchSummary = await worktreeGit.branch();
|
|
200
|
+
return !branchSummary.current || branchSummary.detached;
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
async resolveGitDir(worktreePath) {
|
|
207
|
+
const gitPath = path.join(worktreePath, constants_1.PATH_CONSTANTS.GIT_DIR);
|
|
208
|
+
try {
|
|
209
|
+
const stat = await fs.stat(gitPath);
|
|
210
|
+
if (stat.isFile()) {
|
|
211
|
+
const content = await fs.readFile(gitPath, "utf-8");
|
|
212
|
+
const gitdirMatch = content.match(/^gitdir:\s*(.+)$/m);
|
|
213
|
+
if (gitdirMatch) {
|
|
214
|
+
return path.resolve(worktreePath, gitdirMatch[1].trim());
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return gitPath;
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
throw new errors_1.GitOperationError("resolve-git-dir", `Failed to resolve .git directory for ${worktreePath}`, error instanceof Error ? error : undefined);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
createGitInstance(worktreePath) {
|
|
224
|
+
const git = (0, simple_git_1.default)(worktreePath);
|
|
225
|
+
return this.config.skipLfs ? git.env({ GIT_LFS_SKIP_SMUDGE: "1" }) : git;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
exports.WorktreeStatusService = WorktreeStatusService;
|
|
229
|
+
//# sourceMappingURL=worktree-status.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-status.service.js","sourceRoot":"","sources":["../../src/services/worktree-status.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree-sync.service.d.ts","sourceRoot":"","sources":["../../src/services/worktree-sync.service.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGvC,qBAAa,mBAAmB;IAGlB,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,UAAU,CAAa;gBAEX,MAAM,EAAE,MAAM;IAI5B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"worktree-sync.service.d.ts","sourceRoot":"","sources":["../../src/services/worktree-sync.service.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGvC,qBAAa,mBAAmB;IAGlB,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,UAAU,CAAa;gBAEX,MAAM,EAAE,MAAM;IAI5B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAmHb,kBAAkB;YAoBlB,iBAAiB;YAmDjB,mBAAmB;YA6BnB,uBAAuB;YAiGvB,0BAA0B;YA2C1B,oBAAoB;YA2BpB,eAAe;CA+C9B"}
|