From 6bf18be2bfaf4c61cecdd44fdf2929660d4ec828 Mon Sep 17 00:00:00 2001
From: Sergio Zharinov <zharinov@users.noreply.github.com>
Date: Wed, 29 Jan 2020 15:23:19 +0400
Subject: [PATCH] fix: Don't modify git-tags datasource results (#5251)

Co-authored-by: Jared Kauppila <Jared@Kauppi.la>
---
 lib/datasource/git-tags/index.ts |  2 +-
 lib/versioning/composer/index.ts | 11 ++++++-----
 lib/versioning/swift/index.ts    | 10 ++++++++--
 lib/versioning/swift/range.ts    |  2 +-
 test/datasource/git-tags.spec.ts |  2 +-
 test/versioning/composer.spec.ts | 12 ++++++++++++
 test/versioning/swift.spec.ts    | 13 +++++++++++++
 7 files changed, 42 insertions(+), 10 deletions(-)

diff --git a/lib/datasource/git-tags/index.ts b/lib/datasource/git-tags/index.ts
index 9f62f00da5..7346469cd6 100644
--- a/lib/datasource/git-tags/index.ts
+++ b/lib/datasource/git-tags/index.ts
@@ -36,7 +36,7 @@ export async function getPkgReleases({
     const result: ReleaseResult = {
       sourceUrl,
       releases: tags.map(tag => ({
-        version: semver.isValid(tag),
+        version: tag,
         gitRef: tag,
       })),
     };
diff --git a/lib/versioning/composer/index.ts b/lib/versioning/composer/index.ts
index a4a57a950f..bf7cdc5cd8 100644
--- a/lib/versioning/composer/index.ts
+++ b/lib/versioning/composer/index.ts
@@ -12,13 +12,14 @@ function padZeroes(input: string): string {
 }
 
 function composer2npm(input: string): string {
-  if (npm.isVersion(input)) {
-    return input;
+  const cleanInput = input.replace(/^v/, '');
+  if (npm.isVersion(cleanInput)) {
+    return cleanInput;
   }
-  if (npm.isVersion(padZeroes(input))) {
-    return padZeroes(input);
+  if (npm.isVersion(padZeroes(cleanInput))) {
+    return padZeroes(cleanInput);
   }
-  let output = input;
+  let output = cleanInput;
   // ~4 to ^4 and ~4.1 to ^4.1
   output = output.replace(/(?:^|\s)~([1-9][0-9]*(?:\.[0-9]*)?)(?: |$)/g, '^$1');
   // ~0.4 to >=0.4 <1
diff --git a/lib/versioning/swift/index.ts b/lib/versioning/swift/index.ts
index 8ec6dcc2f9..61b583bb71 100644
--- a/lib/versioning/swift/index.ts
+++ b/lib/versioning/swift/index.ts
@@ -24,9 +24,15 @@ export const isValid = (input: string): boolean =>
   !!valid(input) || !!validRange(toSemverRange(input));
 export const isVersion = (input: string): boolean => !!valid(input);
 const maxSatisfyingVersion = (versions: string[], range: string): string =>
-  maxSatisfying(versions, toSemverRange(range));
+  maxSatisfying(
+    versions.map(v => v.replace(/^v/, '')),
+    toSemverRange(range)
+  );
 const minSatisfyingVersion = (versions: string[], range: string): string =>
-  minSatisfying(versions, toSemverRange(range));
+  minSatisfying(
+    versions.map(v => v.replace(/^v/, '')),
+    toSemverRange(range)
+  );
 const isLessThanRange = (version: string, range: string): boolean =>
   ltr(version, toSemverRange(range));
 const matches = (version: string, range: string): boolean =>
diff --git a/lib/versioning/swift/range.ts b/lib/versioning/swift/range.ts
index 7f15bf564f..cca8135e8b 100644
--- a/lib/versioning/swift/range.ts
+++ b/lib/versioning/swift/range.ts
@@ -36,7 +36,7 @@ function toSemverRange(range: string): string {
 
 function getNewValue({ currentValue, toVersion }: NewValueConfig): string {
   if (fromParam.test(currentValue)) {
-    return toVersion;
+    return toVersion.replace(/^v/, '');
   }
   if (fromRange.test(currentValue)) {
     const [, version] = currentValue.match(fromRange);
diff --git a/test/datasource/git-tags.spec.ts b/test/datasource/git-tags.spec.ts
index c4a447da9b..ef6f0d3b3b 100644
--- a/test/datasource/git-tags.spec.ts
+++ b/test/datasource/git-tags.spec.ts
@@ -41,7 +41,7 @@ describe('datasource/git-tags', () => {
         lookupName,
       });
       const result = versions.releases.map(x => x.version).sort();
-      expect(result).toEqual(['0.0.1', '0.0.2']);
+      expect(result).toEqual(['0.0.1', 'v0.0.2']);
     });
   });
 });
diff --git a/test/versioning/composer.spec.ts b/test/versioning/composer.spec.ts
index a7c3a70c63..4496b70b6f 100644
--- a/test/versioning/composer.spec.ts
+++ b/test/versioning/composer.spec.ts
@@ -75,6 +75,12 @@ describe('semver.maxSatisfyingVersion()', () => {
         '~4'
       )
     ).toBe('4.2.0');
+    expect(
+      semver.maxSatisfyingVersion(
+        ['v0.4.0', 'v0.5.0', 'v4.0.0', 'v4.2.0', 'v5.0.0'],
+        '~4'
+      )
+    ).toBe('4.2.0');
     expect(
       semver.maxSatisfyingVersion(
         ['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0'],
@@ -91,6 +97,12 @@ describe('semver.minSatisfyingVersion()', () => {
         '~4'
       )
     ).toBe('4.0.0');
+    expect(
+      semver.minSatisfyingVersion(
+        ['v0.4.0', 'v0.5.0', 'v4.0.0', 'v4.2.0', 'v5.0.0'],
+        '~4'
+      )
+    ).toBe('4.0.0');
     expect(
       semver.minSatisfyingVersion(
         ['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0'],
diff --git a/test/versioning/swift.spec.ts b/test/versioning/swift.spec.ts
index 79a59835f0..64c5484007 100644
--- a/test/versioning/swift.spec.ts
+++ b/test/versioning/swift.spec.ts
@@ -38,6 +38,7 @@ describe('isValid(input)', () => {
   });
   it('should support simple semver', () => {
     expect(isValid('1.2.3')).toBe(true);
+    expect(isValid('v1.2.3')).toBe(true);
   });
   it('should support semver with dash', () => {
     expect(isValid('1.2.3-foo')).toBe(true);
@@ -58,22 +59,34 @@ describe('isValid(input)', () => {
     expect(
       minSatisfyingVersion(['1.2.3', '1.2.4', '1.2.5'], '..<"1.2.4"')
     ).toBe('1.2.3');
+    expect(
+      minSatisfyingVersion(['v1.2.3', 'v1.2.4', 'v1.2.5'], '..<"1.2.4"')
+    ).toBe('1.2.3');
     expect(
       maxSatisfyingVersion(['1.2.3', '1.2.4', '1.2.5'], '..<"1.2.4"')
     ).toBe('1.2.3');
+    expect(
+      maxSatisfyingVersion(['v1.2.3', 'v1.2.4', 'v1.2.5'], '..<"1.2.4"')
+    ).toBe('1.2.3');
     expect(
       maxSatisfyingVersion(['1.2.3', '1.2.4', '1.2.5'], '..."1.2.4"')
     ).toBe('1.2.4');
     expect(isLessThanRange('1.2.3', '..."1.2.4"')).toBe(false);
+    expect(isLessThanRange('v1.2.3', '..."1.2.4"')).toBe(false);
     expect(isLessThanRange('1.2.3', '"1.2.4"...')).toBe(true);
+    expect(isLessThanRange('v1.2.3', '"1.2.4"...')).toBe(true);
+
     expect(matches('1.2.4', '..."1.2.4"')).toBe(true);
+    expect(matches('v1.2.4', '..."1.2.4"')).toBe(true);
     expect(matches('1.2.4', '..."1.2.3"')).toBe(false);
+    expect(matches('v1.2.4', '..."1.2.3"')).toBe(false);
   });
 });
 describe('getNewValue()', () => {
   it('supports range update', () => {
     [
       ['1.2.3', 'auto', '1.2.3', '1.2.4', '1.2.3'],
+      ['v1.2.3', 'auto', 'v1.2.3', 'v1.2.4', 'v1.2.3'],
       ['from: "1.2.3"', 'auto', '1.2.3', '1.2.4', '1.2.4'],
       ['"1.2.3"...', 'auto', '1.2.3', '1.2.4', '"1.2.4"...'],
       ['"1.2.3"..."1.2.4"', 'auto', '1.2.3', '1.2.5', '"1.2.3"..."1.2.5"'],
-- 
GitLab