From 88ba9e9b4be7193209fdef52be986b72d5073532 Mon Sep 17 00:00:00 2001 From: Maksim Gruzdev Date: Sat, 25 Oct 2025 17:29:16 +0300 Subject: [PATCH 1/3] issue_173 add ver parse test --- tests/GitOld.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/GitOld.js b/tests/GitOld.js index f5d5440..b51b7c6 100644 --- a/tests/GitOld.js +++ b/tests/GitOld.js @@ -77,4 +77,24 @@ 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) + }) + }) }) From 180bb5345439ad6e901cc2dbf56d20d8740db6c1 Mon Sep 17 00:00:00 2001 From: Maksim Gruzdev Date: Sat, 25 Oct 2025 17:29:55 +0300 Subject: [PATCH 2/3] FIX #173 --- lib/GitOld.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/GitOld.js b/lib/GitOld.js index aae5533..76d9df2 100644 --- a/lib/GitOld.js +++ b/lib/GitOld.js @@ -6,13 +6,22 @@ module.exports = class OldGit { this.gitRepo = o.gitRepo } + static isVersionAtLeast (version, minVersion) { + const cleaned = version.trim() + 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 } From b975fa2aa3636972fd71f32abbfea592aa47f6bd Mon Sep 17 00:00:00 2001 From: Maksim Gruzdev Date: Sat, 25 Oct 2025 17:40:15 +0300 Subject: [PATCH 3/3] #173 FIX fuzz crash --- fuzz/in/modern_git_version.txt | 1 + fuzz/in/old_git_version.txt | 1 + lib/GitOld.js | 2 ++ tests/GitOld.js | 6 ++++++ 4 files changed, 10 insertions(+) create mode 100644 fuzz/in/modern_git_version.txt create mode 100644 fuzz/in/old_git_version.txt 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 76d9df2..81793a9 100644 --- a/lib/GitOld.js +++ b/lib/GitOld.js @@ -7,7 +7,9 @@ module.exports = class OldGit { } 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 diff --git a/tests/GitOld.js b/tests/GitOld.js index b51b7c6..61c14c3 100644 --- a/tests/GitOld.js +++ b/tests/GitOld.js @@ -96,5 +96,11 @@ describe('git old', () => { 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) + }) }) })