sync-worktrees 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +55 -80
- package/dist/index.js +7 -4
- package/dist/index.js.map +1 -1
- package/dist/services/config-loader.service.js +7 -7
- package/dist/services/config-loader.service.js.map +1 -1
- package/dist/services/git.service.d.ts +3 -0
- package/dist/services/git.service.d.ts.map +1 -1
- package/dist/services/git.service.js +70 -19
- package/dist/services/git.service.js.map +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/cli.d.ts +1 -0
- package/dist/utils/cli.d.ts.map +1 -1
- package/dist/utils/cli.js +10 -12
- package/dist/utils/cli.js.map +1 -1
- package/dist/utils/config-generator.d.ts.map +1 -1
- package/dist/utils/config-generator.js +55 -20
- package/dist/utils/config-generator.js.map +1 -1
- package/dist/utils/git-url.d.ts +15 -0
- package/dist/utils/git-url.d.ts.map +1 -0
- package/dist/utils/git-url.js +41 -0
- package/dist/utils/git-url.js.map +1 -0
- package/dist/utils/interactive.d.ts.map +1 -1
- package/dist/utils/interactive.js +43 -28
- package/dist/utils/interactive.js.map +1 -1
- package/package.json +8 -5
- package/dist/__tests__/fixtures/git-responses.d.ts +0 -114
- package/dist/__tests__/fixtures/git-responses.d.ts.map +0 -1
- package/dist/__tests__/fixtures/git-responses.js +0 -119
- package/dist/__tests__/fixtures/git-responses.js.map +0 -1
- package/dist/__tests__/helpers/mock-helpers.d.ts +0 -29
- package/dist/__tests__/helpers/mock-helpers.d.ts.map +0 -1
- package/dist/__tests__/helpers/mock-helpers.js +0 -82
- package/dist/__tests__/helpers/mock-helpers.js.map +0 -1
- package/dist/__tests__/integration.test.d.ts +0 -2
- package/dist/__tests__/integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration.test.js +0 -300
- package/dist/__tests__/integration.test.js.map +0 -1
- package/dist/__tests__/setup.d.ts +0 -2
- package/dist/__tests__/setup.d.ts.map +0 -1
- package/dist/__tests__/setup.js +0 -18
- package/dist/__tests__/setup.js.map +0 -1
- package/dist/services/__tests__/config-loader.service.test.d.ts +0 -2
- package/dist/services/__tests__/config-loader.service.test.d.ts.map +0 -1
- package/dist/services/__tests__/config-loader.service.test.js +0 -222
- package/dist/services/__tests__/config-loader.service.test.js.map +0 -1
- package/dist/services/__tests__/git.service.test.d.ts +0 -2
- package/dist/services/__tests__/git.service.test.d.ts.map +0 -1
- package/dist/services/__tests__/git.service.test.js +0 -289
- package/dist/services/__tests__/git.service.test.js.map +0 -1
- package/dist/services/__tests__/worktree-sync.service.test.d.ts +0 -2
- package/dist/services/__tests__/worktree-sync.service.test.d.ts.map +0 -1
- package/dist/services/__tests__/worktree-sync.service.test.js +0 -342
- package/dist/services/__tests__/worktree-sync.service.test.js.map +0 -1
- package/dist/utils/__tests__/config-generator.test.d.ts +0 -2
- package/dist/utils/__tests__/config-generator.test.d.ts.map +0 -1
- package/dist/utils/__tests__/config-generator.test.js +0 -142
- package/dist/utils/__tests__/config-generator.test.js.map +0 -1
- package/dist/utils/__tests__/interactive.test.d.ts +0 -2
- package/dist/utils/__tests__/interactive.test.d.ts.map +0 -1
- package/dist/utils/__tests__/interactive.test.js +0 -281
- package/dist/utils/__tests__/interactive.test.js.map +0 -1
package/dist/utils/cli.js
CHANGED
|
@@ -26,15 +26,15 @@ function parseArguments() {
|
|
|
26
26
|
description: "List configured repositories and exit",
|
|
27
27
|
default: false,
|
|
28
28
|
})
|
|
29
|
-
.option("
|
|
30
|
-
alias: "
|
|
29
|
+
.option("bareRepoDir", {
|
|
30
|
+
alias: "b",
|
|
31
31
|
type: "string",
|
|
32
|
-
description: "
|
|
32
|
+
description: "Directory for storing bare repositories (default: .bare/<repo-name>).",
|
|
33
33
|
})
|
|
34
34
|
.option("repoUrl", {
|
|
35
35
|
alias: "u",
|
|
36
36
|
type: "string",
|
|
37
|
-
description: "Git repository URL (e.g., SSH or HTTPS).
|
|
37
|
+
description: "Git repository URL (e.g., SSH or HTTPS).",
|
|
38
38
|
})
|
|
39
39
|
.option("worktreeDir", {
|
|
40
40
|
alias: "w",
|
|
@@ -59,28 +59,26 @@ function parseArguments() {
|
|
|
59
59
|
config: argv.config,
|
|
60
60
|
filter: argv.filter,
|
|
61
61
|
list: argv.list,
|
|
62
|
-
repoPath: argv.repoPath,
|
|
63
62
|
repoUrl: argv.repoUrl,
|
|
64
63
|
worktreeDir: argv.worktreeDir,
|
|
65
64
|
cronSchedule: argv.cronSchedule,
|
|
66
65
|
runOnce: argv.runOnce,
|
|
66
|
+
bareRepoDir: argv.bareRepoDir,
|
|
67
67
|
};
|
|
68
68
|
}
|
|
69
69
|
function isInteractiveMode(config) {
|
|
70
|
-
return !config.
|
|
70
|
+
return !config.repoUrl || !config.worktreeDir;
|
|
71
71
|
}
|
|
72
72
|
function reconstructCliCommand(config) {
|
|
73
73
|
const executable = process.argv[1].includes("ts-node") ? "ts-node src/index.ts" : "sync-worktrees";
|
|
74
74
|
const args = [];
|
|
75
|
-
|
|
76
|
-
args.push(`--repoPath "${config.repoPath}"`);
|
|
77
|
-
}
|
|
78
|
-
if (config.repoUrl) {
|
|
79
|
-
args.push(`--repoUrl "${config.repoUrl}"`);
|
|
80
|
-
}
|
|
75
|
+
args.push(`--repoUrl "${config.repoUrl}"`);
|
|
81
76
|
if (config.worktreeDir) {
|
|
82
77
|
args.push(`--worktreeDir "${config.worktreeDir}"`);
|
|
83
78
|
}
|
|
79
|
+
if (config.bareRepoDir) {
|
|
80
|
+
args.push(`--bareRepoDir "${config.bareRepoDir}"`);
|
|
81
|
+
}
|
|
84
82
|
if (config.cronSchedule && config.cronSchedule !== "0 * * * *") {
|
|
85
83
|
args.push(`--cronSchedule "${config.cronSchedule}"`);
|
|
86
84
|
}
|
package/dist/utils/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/utils/cli.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/utils/cli.ts"],"names":[],"mappings":";;;;;AAYA,wCA0DC;AAED,8CAEC;AAED,sDAwBC;AApGD,kDAA0B;AAC1B,2CAAwC;AAWxC,SAAgB,cAAc;IAC5B,MAAM,IAAI,GAAG,IAAA,eAAK,EAAC,IAAA,iBAAO,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SACtC,MAAM,CAAC,QAAQ,EAAE;QAChB,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,gCAAgC;KAC9C,CAAC;SACD,MAAM,CAAC,QAAQ,EAAE;QAChB,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,6EAA6E;KAC3F,CAAC;SACD,MAAM,CAAC,MAAM,EAAE;QACd,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,uCAAuC;QACpD,OAAO,EAAE,KAAK;KACf,CAAC;SACD,MAAM,CAAC,aAAa,EAAE;QACrB,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,uEAAuE;KACrF,CAAC;SACD,MAAM,CAAC,SAAS,EAAE;QACjB,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,0CAA0C;KACxD,CAAC;SACD,MAAM,CAAC,aAAa,EAAE;QACrB,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,uDAAuD;KACrE,CAAC;SACD,MAAM,CAAC,cAAc,EAAE;QACtB,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,8CAA8C;QAC3D,OAAO,EAAE,WAAW;KACrB,CAAC;SACD,MAAM,CAAC,SAAS,EAAE;QACjB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,8DAA8D;QAC3E,OAAO,EAAE,KAAK;KACf,CAAC;SACD,IAAI,EAAE;SACN,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC;SAClB,SAAS,EAAE,CAAC;IAEf,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC;AACJ,CAAC;AAED,SAAgB,iBAAiB,CAAC,MAAuB;IACvD,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;AAChD,CAAC;AAED,SAAgB,qBAAqB,CAAC,MAAc;IAClD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAEnG,MAAM,IAAI,GAAa,EAAE,CAAC;IAE1B,IAAI,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IAE3C,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,KAAK,WAAW,EAAE,CAAC;QAC/D,IAAI,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,GAAG,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAC3C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-generator.d.ts","sourceRoot":"","sources":["../../src/utils/config-generator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config-generator.d.ts","sourceRoot":"","sources":["../../src/utils/config-generator.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AA2CvC,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2C1F;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C"}
|
|
@@ -37,37 +37,72 @@ exports.generateConfigFile = generateConfigFile;
|
|
|
37
37
|
exports.getDefaultConfigPath = getDefaultConfigPath;
|
|
38
38
|
const fs = __importStar(require("fs/promises"));
|
|
39
39
|
const path = __importStar(require("path"));
|
|
40
|
+
const git_url_1 = require("./git-url");
|
|
41
|
+
/**
|
|
42
|
+
* Serializes a JavaScript object to a clean module.exports format
|
|
43
|
+
*/
|
|
44
|
+
function serializeToModuleExports(obj, indent = 0) {
|
|
45
|
+
const spaces = " ".repeat(indent);
|
|
46
|
+
const innerSpaces = " ".repeat(indent + 2);
|
|
47
|
+
if (typeof obj === "string") {
|
|
48
|
+
return `"${obj}"`;
|
|
49
|
+
}
|
|
50
|
+
if (typeof obj === "number" || typeof obj === "boolean") {
|
|
51
|
+
return String(obj);
|
|
52
|
+
}
|
|
53
|
+
if (Array.isArray(obj)) {
|
|
54
|
+
if (obj.length === 0)
|
|
55
|
+
return "[]";
|
|
56
|
+
const items = obj.map((item) => `${innerSpaces}${serializeToModuleExports(item, indent + 2)}`).join(",\n");
|
|
57
|
+
return `[\n${items}\n${spaces}]`;
|
|
58
|
+
}
|
|
59
|
+
if (obj && typeof obj === "object") {
|
|
60
|
+
const entries = Object.entries(obj)
|
|
61
|
+
.filter(([_, value]) => value !== undefined)
|
|
62
|
+
.map(([key, value]) => {
|
|
63
|
+
const serializedValue = serializeToModuleExports(value, indent + 2);
|
|
64
|
+
return `${innerSpaces}${key}: ${serializedValue}`;
|
|
65
|
+
});
|
|
66
|
+
if (entries.length === 0)
|
|
67
|
+
return "{}";
|
|
68
|
+
return `{\n${entries.join(",\n")}\n${spaces}}`;
|
|
69
|
+
}
|
|
70
|
+
return String(obj);
|
|
71
|
+
}
|
|
40
72
|
async function generateConfigFile(config, configPath) {
|
|
41
73
|
const configDir = path.dirname(configPath);
|
|
42
74
|
await fs.mkdir(configDir, { recursive: true });
|
|
43
75
|
// Calculate relative paths from config file location
|
|
44
|
-
const repoPathRelative = path.relative(configDir, config.repoPath);
|
|
45
76
|
const worktreeDirRelative = path.relative(configDir, config.worktreeDir);
|
|
46
|
-
// Use relative paths if they don't go up too many levels
|
|
47
|
-
const useRelativeRepo = !repoPathRelative.startsWith("../../../");
|
|
48
77
|
const useRelativeWorktree = !worktreeDirRelative.startsWith("../../../");
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
const
|
|
78
|
+
const repoName = (0, git_url_1.extractRepoNameFromUrl)(config.repoUrl);
|
|
79
|
+
// Build the repository object
|
|
80
|
+
const repository = {
|
|
81
|
+
name: repoName,
|
|
82
|
+
repoUrl: config.repoUrl,
|
|
83
|
+
worktreeDir: useRelativeWorktree ? `./${worktreeDirRelative}` : config.worktreeDir,
|
|
84
|
+
};
|
|
85
|
+
// Add bareRepoDir if provided
|
|
86
|
+
if (config.bareRepoDir) {
|
|
87
|
+
const bareRepoDirRelative = path.relative(configDir, config.bareRepoDir);
|
|
88
|
+
const useRelativeBare = !bareRepoDirRelative.startsWith("../../../");
|
|
89
|
+
repository.bareRepoDir = useRelativeBare ? `./${bareRepoDirRelative}` : config.bareRepoDir;
|
|
90
|
+
}
|
|
91
|
+
// Build the complete config object
|
|
92
|
+
const configObject = {
|
|
93
|
+
defaults: {
|
|
94
|
+
cronSchedule: config.cronSchedule,
|
|
95
|
+
runOnce: config.runOnce,
|
|
96
|
+
},
|
|
97
|
+
repositories: [repository],
|
|
98
|
+
};
|
|
99
|
+
// Generate the config file content
|
|
52
100
|
const configContent = `/**
|
|
53
101
|
* Sync-worktrees configuration file
|
|
54
102
|
* Generated on ${new Date().toISOString()}
|
|
55
103
|
*/
|
|
56
104
|
|
|
57
|
-
module.exports = {
|
|
58
|
-
defaults: {
|
|
59
|
-
cronSchedule: "${config.cronSchedule}",
|
|
60
|
-
runOnce: ${config.runOnce}
|
|
61
|
-
},
|
|
62
|
-
|
|
63
|
-
repositories: [
|
|
64
|
-
{
|
|
65
|
-
name: "${path.basename(config.repoPath)}",
|
|
66
|
-
${repoUrlEntry}${repoPathEntry},
|
|
67
|
-
${worktreeDirEntry}
|
|
68
|
-
}
|
|
69
|
-
]
|
|
70
|
-
};
|
|
105
|
+
module.exports = ${serializeToModuleExports(configObject)};
|
|
71
106
|
`;
|
|
72
107
|
await fs.writeFile(configPath, configContent, "utf-8");
|
|
73
108
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-generator.js","sourceRoot":"","sources":["../../src/utils/config-generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"config-generator.js","sourceRoot":"","sources":["../../src/utils/config-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts the repository name from a Git URL
|
|
3
|
+
* @param gitUrl - The Git URL (HTTPS or SSH format)
|
|
4
|
+
* @returns The repository name without .git extension
|
|
5
|
+
* @throws Error if the URL format is invalid
|
|
6
|
+
*/
|
|
7
|
+
export declare function extractRepoNameFromUrl(gitUrl: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* Generates the default bare repository directory path
|
|
10
|
+
* @param repoUrl - The Git repository URL
|
|
11
|
+
* @param baseDir - The base directory for bare repos (default: .bare)
|
|
12
|
+
* @returns The path to the bare repository
|
|
13
|
+
*/
|
|
14
|
+
export declare function getDefaultBareRepoDir(repoUrl: string, baseDir?: string): string;
|
|
15
|
+
//# sourceMappingURL=git-url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-url.d.ts","sourceRoot":"","sources":["../../src/utils/git-url.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAuB7D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAgB,GAAG,MAAM,CAGxF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractRepoNameFromUrl = extractRepoNameFromUrl;
|
|
4
|
+
exports.getDefaultBareRepoDir = getDefaultBareRepoDir;
|
|
5
|
+
/**
|
|
6
|
+
* Extracts the repository name from a Git URL
|
|
7
|
+
* @param gitUrl - The Git URL (HTTPS or SSH format)
|
|
8
|
+
* @returns The repository name without .git extension
|
|
9
|
+
* @throws Error if the URL format is invalid
|
|
10
|
+
*/
|
|
11
|
+
function extractRepoNameFromUrl(gitUrl) {
|
|
12
|
+
// Remove trailing spaces
|
|
13
|
+
const url = gitUrl.trim();
|
|
14
|
+
// Handle SSH format: git@github.com:user/repo.git
|
|
15
|
+
const sshMatch = url.match(/^git@[^:]+:(?:.+\/)?([^/]+?)(?:\.git)?$/);
|
|
16
|
+
if (sshMatch) {
|
|
17
|
+
return sshMatch[1];
|
|
18
|
+
}
|
|
19
|
+
// Handle HTTPS format: https://github.com/user/repo.git
|
|
20
|
+
const httpsMatch = url.match(/^https?:\/\/[^/]+\/(?:.+\/)?([^/]+?)(?:\.git)?$/);
|
|
21
|
+
if (httpsMatch) {
|
|
22
|
+
return httpsMatch[1];
|
|
23
|
+
}
|
|
24
|
+
// Handle file:// URLs for local repositories
|
|
25
|
+
const fileMatch = url.match(/^file:\/\/(?:.+\/)?([^/]+?)(?:\.git)?$/);
|
|
26
|
+
if (fileMatch) {
|
|
27
|
+
return fileMatch[1];
|
|
28
|
+
}
|
|
29
|
+
throw new Error(`Invalid Git URL format: ${gitUrl}`);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Generates the default bare repository directory path
|
|
33
|
+
* @param repoUrl - The Git repository URL
|
|
34
|
+
* @param baseDir - The base directory for bare repos (default: .bare)
|
|
35
|
+
* @returns The path to the bare repository
|
|
36
|
+
*/
|
|
37
|
+
function getDefaultBareRepoDir(repoUrl, baseDir = ".bare") {
|
|
38
|
+
const repoName = extractRepoNameFromUrl(repoUrl);
|
|
39
|
+
return `${baseDir}/${repoName}`;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=git-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-url.js","sourceRoot":"","sources":["../../src/utils/git-url.ts"],"names":[],"mappings":";;AAMA,wDAuBC;AAQD,sDAGC;AAxCD;;;;;GAKG;AACH,SAAgB,sBAAsB,CAAC,MAAc;IACnD,yBAAyB;IACzB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAE1B,kDAAkD;IAClD,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;IACtE,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,wDAAwD;IACxD,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;IAChF,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,6CAA6C;IAC7C,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACtE,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,EAAE,CAAC,CAAC;AACvD,CAAC;AAED;;;;;GAKG;AACH,SAAgB,qBAAqB,CAAC,OAAe,EAAE,UAAkB,OAAO;IAC9E,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO,GAAG,OAAO,IAAI,QAAQ,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/utils/interactive.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/utils/interactive.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,wBAAsB,eAAe,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CA0JrF"}
|
|
@@ -34,37 +34,29 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.promptForConfig = promptForConfig;
|
|
37
|
-
const fs = __importStar(require("fs"));
|
|
38
37
|
const path = __importStar(require("path"));
|
|
39
38
|
const prompts_1 = require("@inquirer/prompts");
|
|
40
39
|
const config_generator_1 = require("./config-generator");
|
|
41
40
|
async function promptForConfig(partialConfig) {
|
|
42
41
|
console.log("🔧 Welcome to sync-worktrees interactive setup!\n");
|
|
43
|
-
let repoPath = partialConfig.repoPath;
|
|
44
|
-
if (!repoPath) {
|
|
45
|
-
repoPath = await (0, prompts_1.input)({
|
|
46
|
-
message: "Enter the path to your Git repository:",
|
|
47
|
-
validate: (value) => {
|
|
48
|
-
if (!value.trim()) {
|
|
49
|
-
return "Repository path is required";
|
|
50
|
-
}
|
|
51
|
-
return true;
|
|
52
|
-
},
|
|
53
|
-
});
|
|
54
|
-
if (!path.isAbsolute(repoPath)) {
|
|
55
|
-
repoPath = path.resolve(repoPath);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
42
|
let repoUrl = partialConfig.repoUrl;
|
|
59
|
-
if (
|
|
43
|
+
if (!repoUrl) {
|
|
60
44
|
repoUrl = await (0, prompts_1.input)({
|
|
61
|
-
message: "Enter the Git repository URL (
|
|
62
|
-
default: partialConfig.repoUrl || "",
|
|
45
|
+
message: "Enter the Git repository URL (e.g., https://github.com/user/repo.git):",
|
|
63
46
|
validate: (value) => {
|
|
64
47
|
if (!value.trim()) {
|
|
65
|
-
return "Repository URL is required
|
|
48
|
+
return "Repository URL is required";
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
// Basic URL validation
|
|
52
|
+
if (!value.match(/^(https?:\/\/|git@|file:\/\/).*$/)) {
|
|
53
|
+
return "Please enter a valid Git URL (https://, git@, or file://)";
|
|
54
|
+
}
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return "Please enter a valid URL";
|
|
66
59
|
}
|
|
67
|
-
return true;
|
|
68
60
|
},
|
|
69
61
|
});
|
|
70
62
|
}
|
|
@@ -83,6 +75,26 @@ async function promptForConfig(partialConfig) {
|
|
|
83
75
|
worktreeDir = path.resolve(worktreeDir);
|
|
84
76
|
}
|
|
85
77
|
}
|
|
78
|
+
let bareRepoDir = partialConfig.bareRepoDir;
|
|
79
|
+
const askForBareDir = await (0, prompts_1.confirm)({
|
|
80
|
+
message: "Would you like to specify a custom location for the bare repository?",
|
|
81
|
+
default: false,
|
|
82
|
+
});
|
|
83
|
+
if (askForBareDir) {
|
|
84
|
+
bareRepoDir = await (0, prompts_1.input)({
|
|
85
|
+
message: "Enter the directory for the bare repository:",
|
|
86
|
+
default: "",
|
|
87
|
+
validate: (value) => {
|
|
88
|
+
if (!value.trim()) {
|
|
89
|
+
return "Bare repository directory is required";
|
|
90
|
+
}
|
|
91
|
+
return true;
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
if (!path.isAbsolute(bareRepoDir)) {
|
|
95
|
+
bareRepoDir = path.resolve(bareRepoDir);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
86
98
|
let runOnce = partialConfig.runOnce;
|
|
87
99
|
let cronSchedule = partialConfig.cronSchedule || "0 * * * *";
|
|
88
100
|
if (runOnce === undefined) {
|
|
@@ -112,23 +124,26 @@ async function promptForConfig(partialConfig) {
|
|
|
112
124
|
}
|
|
113
125
|
}
|
|
114
126
|
const finalConfig = {
|
|
115
|
-
repoPath,
|
|
116
127
|
repoUrl,
|
|
117
128
|
worktreeDir,
|
|
118
129
|
cronSchedule,
|
|
119
130
|
runOnce: runOnce || false,
|
|
131
|
+
bareRepoDir,
|
|
120
132
|
};
|
|
121
133
|
console.log("\n📋 Configuration summary:");
|
|
122
|
-
console.log(` Repository: ${finalConfig.
|
|
123
|
-
|
|
124
|
-
|
|
134
|
+
console.log(` Repository URL: ${finalConfig.repoUrl}`);
|
|
135
|
+
console.log(` Worktrees: ${finalConfig.worktreeDir}`);
|
|
136
|
+
if (finalConfig.bareRepoDir) {
|
|
137
|
+
console.log(` Bare repo: ${finalConfig.bareRepoDir}`);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
console.log(` Bare repo: .bare/<repo-name> (default)`);
|
|
125
141
|
}
|
|
126
|
-
console.log(` Worktrees: ${finalConfig.worktreeDir}`);
|
|
127
142
|
if (finalConfig.runOnce) {
|
|
128
|
-
console.log(` Mode:
|
|
143
|
+
console.log(` Mode: Run once`);
|
|
129
144
|
}
|
|
130
145
|
else {
|
|
131
|
-
console.log(` Mode:
|
|
146
|
+
console.log(` Mode: Scheduled (${finalConfig.cronSchedule})`);
|
|
132
147
|
}
|
|
133
148
|
console.log("");
|
|
134
149
|
// Ask if user wants to save configuration to a file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../src/utils/interactive.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../src/utils/interactive.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sync-worktrees",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.5.0",
|
|
4
|
+
"description": "Automatically synchronize Git worktrees with remote branches - perfect for multi-branch development workflows",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"sync-worktrees": "./dist/index.js"
|
|
@@ -10,10 +10,13 @@
|
|
|
10
10
|
"git",
|
|
11
11
|
"worktree",
|
|
12
12
|
"sync",
|
|
13
|
-
"automation"
|
|
13
|
+
"automation",
|
|
14
|
+
"branch-management",
|
|
15
|
+
"git-worktrees",
|
|
16
|
+
"devops"
|
|
14
17
|
],
|
|
15
|
-
"author": "",
|
|
16
|
-
"license": "
|
|
18
|
+
"author": "Yordan Kanchelov <yordan.kanchelov@gmail.com>",
|
|
19
|
+
"license": "MIT",
|
|
17
20
|
"engines": {
|
|
18
21
|
"node": ">=22.0.0"
|
|
19
22
|
},
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Common git response fixtures for testing
|
|
3
|
-
*/
|
|
4
|
-
export declare const gitBranchResponses: {
|
|
5
|
-
withMultipleBranches: {
|
|
6
|
-
all: string[];
|
|
7
|
-
current: string;
|
|
8
|
-
branches: {};
|
|
9
|
-
detached: boolean;
|
|
10
|
-
};
|
|
11
|
-
withSingleBranch: {
|
|
12
|
-
all: string[];
|
|
13
|
-
current: string;
|
|
14
|
-
branches: {};
|
|
15
|
-
detached: boolean;
|
|
16
|
-
};
|
|
17
|
-
empty: {
|
|
18
|
-
all: never[];
|
|
19
|
-
current: string;
|
|
20
|
-
branches: {};
|
|
21
|
-
detached: boolean;
|
|
22
|
-
};
|
|
23
|
-
withLocalAndRemote: {
|
|
24
|
-
all: string[];
|
|
25
|
-
current: string;
|
|
26
|
-
branches: {};
|
|
27
|
-
detached: boolean;
|
|
28
|
-
};
|
|
29
|
-
};
|
|
30
|
-
export declare const gitStatusResponses: {
|
|
31
|
-
clean: {
|
|
32
|
-
isClean: () => boolean;
|
|
33
|
-
not_added: never[];
|
|
34
|
-
conflicted: never[];
|
|
35
|
-
created: never[];
|
|
36
|
-
deleted: never[];
|
|
37
|
-
modified: never[];
|
|
38
|
-
renamed: never[];
|
|
39
|
-
files: never[];
|
|
40
|
-
staged: never[];
|
|
41
|
-
ahead: number;
|
|
42
|
-
behind: number;
|
|
43
|
-
current: string;
|
|
44
|
-
tracking: string;
|
|
45
|
-
detached: boolean;
|
|
46
|
-
};
|
|
47
|
-
withChanges: {
|
|
48
|
-
isClean: () => boolean;
|
|
49
|
-
not_added: string[];
|
|
50
|
-
conflicted: never[];
|
|
51
|
-
created: never[];
|
|
52
|
-
deleted: never[];
|
|
53
|
-
modified: string[];
|
|
54
|
-
renamed: never[];
|
|
55
|
-
files: {
|
|
56
|
-
path: string;
|
|
57
|
-
index: string;
|
|
58
|
-
working_dir: string;
|
|
59
|
-
}[];
|
|
60
|
-
staged: never[];
|
|
61
|
-
ahead: number;
|
|
62
|
-
behind: number;
|
|
63
|
-
current: string;
|
|
64
|
-
tracking: string;
|
|
65
|
-
detached: boolean;
|
|
66
|
-
};
|
|
67
|
-
withStagedChanges: {
|
|
68
|
-
isClean: () => boolean;
|
|
69
|
-
not_added: never[];
|
|
70
|
-
conflicted: never[];
|
|
71
|
-
created: string[];
|
|
72
|
-
deleted: never[];
|
|
73
|
-
modified: string[];
|
|
74
|
-
renamed: never[];
|
|
75
|
-
files: {
|
|
76
|
-
path: string;
|
|
77
|
-
index: string;
|
|
78
|
-
working_dir: string;
|
|
79
|
-
}[];
|
|
80
|
-
staged: string[];
|
|
81
|
-
ahead: number;
|
|
82
|
-
behind: number;
|
|
83
|
-
current: string;
|
|
84
|
-
tracking: string;
|
|
85
|
-
detached: boolean;
|
|
86
|
-
};
|
|
87
|
-
};
|
|
88
|
-
export declare const worktreeScenarios: {
|
|
89
|
-
fresh: {
|
|
90
|
-
remoteBranches: string[];
|
|
91
|
-
existingWorktrees: never[];
|
|
92
|
-
expectedNewWorktrees: string[];
|
|
93
|
-
expectedRemovals: never[];
|
|
94
|
-
};
|
|
95
|
-
partial: {
|
|
96
|
-
remoteBranches: string[];
|
|
97
|
-
existingWorktrees: string[];
|
|
98
|
-
expectedNewWorktrees: string[];
|
|
99
|
-
expectedRemovals: never[];
|
|
100
|
-
};
|
|
101
|
-
withStale: {
|
|
102
|
-
remoteBranches: string[];
|
|
103
|
-
existingWorktrees: string[];
|
|
104
|
-
expectedNewWorktrees: never[];
|
|
105
|
-
expectedRemovals: string[];
|
|
106
|
-
};
|
|
107
|
-
mixed: {
|
|
108
|
-
remoteBranches: string[];
|
|
109
|
-
existingWorktrees: string[];
|
|
110
|
-
expectedNewWorktrees: string[];
|
|
111
|
-
expectedRemovals: string[];
|
|
112
|
-
};
|
|
113
|
-
};
|
|
114
|
-
//# sourceMappingURL=git-responses.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"git-responses.d.ts","sourceRoot":"","sources":["../../../src/__tests__/fixtures/git-responses.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;CAyB9B,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuD9B,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;CA6B7B,CAAC"}
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Common git response fixtures for testing
|
|
4
|
-
*/
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.worktreeScenarios = exports.gitStatusResponses = exports.gitBranchResponses = void 0;
|
|
7
|
-
exports.gitBranchResponses = {
|
|
8
|
-
withMultipleBranches: {
|
|
9
|
-
all: ["origin/main", "origin/feature-1", "origin/feature-2", "origin/bugfix/issue-123", "origin/release/v1.0.0"],
|
|
10
|
-
current: "main",
|
|
11
|
-
branches: {},
|
|
12
|
-
detached: false,
|
|
13
|
-
},
|
|
14
|
-
withSingleBranch: {
|
|
15
|
-
all: ["origin/main"],
|
|
16
|
-
current: "main",
|
|
17
|
-
branches: {},
|
|
18
|
-
detached: false,
|
|
19
|
-
},
|
|
20
|
-
empty: {
|
|
21
|
-
all: [],
|
|
22
|
-
current: "",
|
|
23
|
-
branches: {},
|
|
24
|
-
detached: false,
|
|
25
|
-
},
|
|
26
|
-
withLocalAndRemote: {
|
|
27
|
-
all: ["main", "feature-local", "origin/main", "origin/feature-1", "origin/feature-2"],
|
|
28
|
-
current: "main",
|
|
29
|
-
branches: {},
|
|
30
|
-
detached: false,
|
|
31
|
-
},
|
|
32
|
-
};
|
|
33
|
-
exports.gitStatusResponses = {
|
|
34
|
-
clean: {
|
|
35
|
-
isClean: () => true,
|
|
36
|
-
not_added: [],
|
|
37
|
-
conflicted: [],
|
|
38
|
-
created: [],
|
|
39
|
-
deleted: [],
|
|
40
|
-
modified: [],
|
|
41
|
-
renamed: [],
|
|
42
|
-
files: [],
|
|
43
|
-
staged: [],
|
|
44
|
-
ahead: 0,
|
|
45
|
-
behind: 0,
|
|
46
|
-
current: "main",
|
|
47
|
-
tracking: "origin/main",
|
|
48
|
-
detached: false,
|
|
49
|
-
},
|
|
50
|
-
withChanges: {
|
|
51
|
-
isClean: () => false,
|
|
52
|
-
not_added: ["new-file.txt"],
|
|
53
|
-
conflicted: [],
|
|
54
|
-
created: [],
|
|
55
|
-
deleted: [],
|
|
56
|
-
modified: ["existing-file.ts"],
|
|
57
|
-
renamed: [],
|
|
58
|
-
files: [
|
|
59
|
-
{ path: "new-file.txt", index: "?", working_dir: "?" },
|
|
60
|
-
{ path: "existing-file.ts", index: " ", working_dir: "M" },
|
|
61
|
-
],
|
|
62
|
-
staged: [],
|
|
63
|
-
ahead: 0,
|
|
64
|
-
behind: 0,
|
|
65
|
-
current: "feature-1",
|
|
66
|
-
tracking: "origin/feature-1",
|
|
67
|
-
detached: false,
|
|
68
|
-
},
|
|
69
|
-
withStagedChanges: {
|
|
70
|
-
isClean: () => false,
|
|
71
|
-
not_added: [],
|
|
72
|
-
conflicted: [],
|
|
73
|
-
created: ["new-file.txt"],
|
|
74
|
-
deleted: [],
|
|
75
|
-
modified: ["existing-file.ts"],
|
|
76
|
-
renamed: [],
|
|
77
|
-
files: [
|
|
78
|
-
{ path: "new-file.txt", index: "A", working_dir: " " },
|
|
79
|
-
{ path: "existing-file.ts", index: "M", working_dir: " " },
|
|
80
|
-
],
|
|
81
|
-
staged: ["new-file.txt", "existing-file.ts"],
|
|
82
|
-
ahead: 1,
|
|
83
|
-
behind: 0,
|
|
84
|
-
current: "feature-1",
|
|
85
|
-
tracking: "origin/feature-1",
|
|
86
|
-
detached: false,
|
|
87
|
-
},
|
|
88
|
-
};
|
|
89
|
-
exports.worktreeScenarios = {
|
|
90
|
-
// Scenario: Fresh repository with no worktrees
|
|
91
|
-
fresh: {
|
|
92
|
-
remoteBranches: ["main", "develop", "feature-1"],
|
|
93
|
-
existingWorktrees: [],
|
|
94
|
-
expectedNewWorktrees: ["main", "develop", "feature-1"],
|
|
95
|
-
expectedRemovals: [],
|
|
96
|
-
},
|
|
97
|
-
// Scenario: Some worktrees already exist
|
|
98
|
-
partial: {
|
|
99
|
-
remoteBranches: ["main", "develop", "feature-1", "feature-2"],
|
|
100
|
-
existingWorktrees: ["main", "develop"],
|
|
101
|
-
expectedNewWorktrees: ["feature-1", "feature-2"],
|
|
102
|
-
expectedRemovals: [],
|
|
103
|
-
},
|
|
104
|
-
// Scenario: Need to prune old worktrees
|
|
105
|
-
withStale: {
|
|
106
|
-
remoteBranches: ["main", "develop"],
|
|
107
|
-
existingWorktrees: ["main", "develop", "old-feature", "deleted-branch"],
|
|
108
|
-
expectedNewWorktrees: [],
|
|
109
|
-
expectedRemovals: ["old-feature", "deleted-branch"],
|
|
110
|
-
},
|
|
111
|
-
// Scenario: Mixed - add new and remove old
|
|
112
|
-
mixed: {
|
|
113
|
-
remoteBranches: ["main", "develop", "new-feature"],
|
|
114
|
-
existingWorktrees: ["main", "old-feature"],
|
|
115
|
-
expectedNewWorktrees: ["develop", "new-feature"],
|
|
116
|
-
expectedRemovals: ["old-feature"],
|
|
117
|
-
},
|
|
118
|
-
};
|
|
119
|
-
//# sourceMappingURL=git-responses.js.map
|