forked from ai-coding-workshop/commit-msg
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcommit-msg.dev.ts
More file actions
153 lines (136 loc) · 4.8 KB
/
Copy pathcommit-msg.dev.ts
File metadata and controls
153 lines (136 loc) · 4.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#!/usr/bin/env node
// commit-msg CLI entry point for development
import { Command } from 'commander';
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
const packageJson = require('../../package.json');
async function loadCommands() {
// Dynamically import commands for development
const { install } = await import('../commands/install.ts');
const { exec } = await import('../commands/exec.ts');
const { checkAndUpgrade, checkForUpdatesOnly } = await import(
'../utils/version-checker.ts'
);
return { install, exec, checkAndUpgrade, checkForUpdatesOnly };
}
// Helper function to determine verbose mode
function getVerboseMode(options: { verbose?: boolean } = {}): boolean {
return options.verbose || process.env.COMMIT_MSG_VERBOSE === 'true';
}
async function main() {
const { install, exec, checkAndUpgrade, checkForUpdatesOnly } =
await loadCommands();
const program = new Command();
program
.name('commit-msg')
.description('CLI tool for managing Git commit-msg hooks')
.version(`${packageJson.name}: ${packageJson.version}`, '-v, --version')
.option('--verbose', 'Enable verbose output')
.exitOverride(async (err) => {
// Check for updates when command fails for any reason
const verbose = getVerboseMode(program.opts());
if (verbose) {
console.log(
'\n🔍 Checking for updates (in case a newer version fixes this issue)...'
);
}
try {
await checkAndUpgrade({ verbose, silent: !verbose });
} catch (updateError) {
if (verbose) {
console.log('Version check failed:', updateError);
}
}
// Re-throw the error to maintain original behavior
throw err;
});
program
.command('install')
.description('Install the commit-msg hook in the current Git repository')
.option('-v, --verbose', 'Enable verbose output')
.action(async (options) => {
const verbose = getVerboseMode({ ...program.opts(), ...options });
try {
await install();
// Check for updates after successful installation
try {
await checkAndUpgrade({ verbose });
} catch (updateError) {
// Version check failure should not affect main command status
if (verbose) {
console.log('Version check failed:', updateError);
}
}
} catch (error) {
// Check for updates when install command fails
if (verbose) {
console.log(
'\n🔍 Checking for updates (in case a newer version fixes this issue)...'
);
}
try {
await checkAndUpgrade({ verbose, silent: !verbose });
} catch (updateError) {
if (verbose) {
console.log('Version check failed:', updateError);
}
}
// Throw error instead of process.exit to allow update operations
throw error;
}
});
program
.command('exec')
.description('Execute the commit-msg hook logic')
.argument('<message-file>', 'path to the commit message file')
.option('-v, --verbose', 'Enable verbose output')
.action(async (messageFile, options) => {
const verbose = getVerboseMode({ ...program.opts(), ...options });
try {
await exec(messageFile);
// Check for updates after successful execution
try {
await checkAndUpgrade({ verbose });
} catch (updateError) {
// Version check failure should not affect main command status
if (verbose) {
console.log('Version check failed:', updateError);
}
}
} catch (error) {
// Check for updates when exec command fails
if (verbose) {
console.log(
'\n🔍 Checking for updates (in case a newer version fixes this issue)...'
);
}
try {
await checkAndUpgrade({ verbose, silent: !verbose });
} catch (updateError) {
if (verbose) {
console.log('Version check failed:', updateError);
}
}
// Throw error instead of process.exit to allow update operations
throw error;
}
});
// Add check-update command
program
.command('check-update')
.description('Check for available updates')
.option('--verbose', 'Enable verbose output', true) // Set verbose as default
.option('--no-verbose', 'Disable verbose output') // Allow disabling verbose
.action(async (options) => {
const verbose = getVerboseMode({ ...program.opts(), ...options });
const hasUpdate = await checkForUpdatesOnly(verbose);
if (!hasUpdate && !verbose) {
console.log('✅ You are using the latest version');
}
});
program.parse();
}
main().catch((error) => {
console.error('Error:', error);
process.exit(1);
});