diff --git a/fuzz/in/modern_git_version.txt b/fuzz/in/modern_git_version.txt new file mode 100644 index 0000000..630281d --- /dev/null +++ b/fuzz/in/modern_git_version.txt @@ -0,0 +1 @@ +TASK-42releaseygit version 2.50.1.windows.1 \ No newline at end of file diff --git a/fuzz/in/old_git_version.txt b/fuzz/in/old_git_version.txt new file mode 100644 index 0000000..3719e1a --- /dev/null +++ b/fuzz/in/old_git_version.txt @@ -0,0 +1 @@ +TASK-42releaseygit version 2.11.0 \ No newline at end of file diff --git a/lib/GitOld.js b/lib/GitOld.js index aae5533..81793a9 100644 --- a/lib/GitOld.js +++ b/lib/GitOld.js @@ -6,13 +6,24 @@ module.exports = class OldGit { this.gitRepo = o.gitRepo } + static isVersionAtLeast (version, minVersion) { + if (!version) return true + const cleaned = version.trim() + if (!cleaned) return true + const [vMajor, vMinor] = cleaned.split('.').map(n => parseInt(n, 10)) + const [minMajor, minMinor] = minVersion.split('.').map(n => parseInt(n, 10)) + if (vMajor > minMajor) return true + if (vMajor < minMajor) return false + return vMinor >= minMinor + } + async translate (o) { if (!o.version) { let v = await ShellCommand.withText (`git --version`).runSilent () o.version = v.split ('git version')[1] } - if (o.version > '2.23') { + if (OldGit.isVersionAtLeast (o.version, '2.23')) { return o } diff --git a/tests/GitOld.js b/tests/GitOld.js index f5d5440..61c14c3 100644 --- a/tests/GitOld.js +++ b/tests/GitOld.js @@ -77,4 +77,30 @@ describe('git old', () => { {todo: asIs, version} ) }) + + describe('isVersionAtLeast', () => { + it ('should handle leading space (real git output)', (t) => { + assert.strictEqual(GitOld.isVersionAtLeast(' 2.50.1.windows.1', '2.23'), true) + assert.strictEqual(GitOld.isVersionAtLeast(' 2.40.0', '2.23'), true) + }) + + it ('should compare versions correctly', (t) => { + assert.strictEqual(GitOld.isVersionAtLeast('2.50.1', '2.23'), true) + assert.strictEqual(GitOld.isVersionAtLeast('2.24.1', '2.23'), true) + assert.strictEqual(GitOld.isVersionAtLeast('2.23.0', '2.23'), true) + assert.strictEqual(GitOld.isVersionAtLeast('2.22.0', '2.23'), false) + assert.strictEqual(GitOld.isVersionAtLeast('2.11.0', '2.23'), false) + }) + + it ('should handle major version differences', (t) => { + assert.strictEqual(GitOld.isVersionAtLeast('3.0.0', '2.23'), true) + assert.strictEqual(GitOld.isVersionAtLeast('1.99.0', '2.23'), false) + }) + + it ('should return true for undefined/null (assume modern git)', (t) => { + assert.strictEqual(GitOld.isVersionAtLeast(undefined, '2.23'), true) + assert.strictEqual(GitOld.isVersionAtLeast(null, '2.23'), true) + assert.strictEqual(GitOld.isVersionAtLeast('', '2.23'), true) + }) + }) })