From 645977573865c03cf4d65cf03e855f8406ffe3ba Mon Sep 17 00:00:00 2001 From: Rhys Arkins Date: Wed, 15 Jan 2020 07:24:57 +0100 Subject: [PATCH] fix(sbt): normalize scala versions (#5154) --- lib/manager/sbt/extract.ts | 24 ++++- .../sbt/__snapshots__/extract.spec.ts.snap | 92 +++++++++---------- test/manager/sbt/_fixtures/sample.sbt | 2 +- .../sbt/_fixtures/scala-version-variable.sbt | 2 +- 4 files changed, 70 insertions(+), 50 deletions(-) diff --git a/lib/manager/sbt/extract.ts b/lib/manager/sbt/extract.ts index 347f1d801b8165..b1ffc6ba3ac3b6 100644 --- a/lib/manager/sbt/extract.ts +++ b/lib/manager/sbt/extract.ts @@ -1,5 +1,6 @@ import { DEFAULT_MAVEN_REPO } from '../maven/extract'; import { PackageFile, PackageDependency } from '../common'; +import { get } from '../../versioning'; const isComment = (str: string): boolean => /^\s*\/\//.test(str); @@ -20,6 +21,25 @@ const isScalaVersion = (str: string): boolean => const getScalaVersion = (str: string): string => str.replace(/^\s*scalaVersion\s*:=\s*"/, '').replace(/"\s*$/, ''); +/* + https://www.scala-sbt.org/release/docs/Cross-Build.html#Publishing+conventions + */ +const normalizeScalaVersion = (str: string): string => { + // istanbul ignore if + if (!str) return str; + const versioning = get('maven'); + if (versioning.isVersion(str)) { + // Do not normalize unstable versions + if (!versioning.isStable(str)) return str; + // Do not normalize versions prior to 2.10 + if (!versioning.isGreaterThan(str, '2.10.0')) return str; + } + if (/^\d+\.\d+\.\d+$/.test(str)) + return str.replace(/^(\d+)\.(\d+)\.\d+$/, '$1.$2'); + // istanbul ignore next + return str; +}; + const isScalaVersionVariable = (str: string): boolean => /^\s*scalaVersion\s*:=\s*[_a-zA-Z][_a-zA-Z0-9]*\s*$/.test(str); @@ -176,7 +196,7 @@ function parseSbtLine( if (!isComment(line)) { if (isScalaVersion(line)) { isMultiDeps = false; - scalaVersion = getScalaVersion(line); + scalaVersion = normalizeScalaVersion(getScalaVersion(line)); } else if (isScalaVersionVariable(line)) { isMultiDeps = false; scalaVersionVariable = getScalaVersionVariable(line); @@ -244,7 +264,7 @@ function parseSbtLine( scalaVersion || (scalaVersionVariable && variables[scalaVersionVariable] && - variables[scalaVersionVariable].val), + normalizeScalaVersion(variables[scalaVersionVariable].val)), }; if (deps.length) return { deps }; return null; diff --git a/test/manager/sbt/__snapshots__/extract.spec.ts.snap b/test/manager/sbt/__snapshots__/extract.spec.ts.snap index 1877fc2ae5f903..77e5bb6c507e17 100644 --- a/test/manager/sbt/__snapshots__/extract.spec.ts.snap +++ b/test/manager/sbt/__snapshots__/extract.spec.ts.snap @@ -1,5 +1,30 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`lib/manager/sbt/extract extractPackageFile() extract deps from native scala file with variables 1`] = ` +Object { + "deps": Array [ + Object { + "currentValue": "0.7.1", + "datasource": "sbt", + "depName": "com.example:foo_2.13.0-RC5", + "fileReplacePosition": 168, + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2", + ], + }, + Object { + "currentValue": "1.2.3", + "datasource": "sbt", + "depName": "com.abc:abc", + "fileReplacePosition": 120, + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2", + ], + }, + ], +} +`; + exports[`lib/manager/sbt/extract extractPackageFile() extracts deps for generic use-cases 1`] = ` Object { "deps": Array [ @@ -7,7 +32,7 @@ Object { "currentValue": "0.0.1", "datasource": "sbt", "depName": "org.example:foo", - "fileReplacePosition": 133, + "fileReplacePosition": 132, "registryUrls": Array [ "https://repo.maven.apache.org/maven2", "https://example.com/repos/1/", @@ -20,8 +45,8 @@ Object { Object { "currentValue": "0.0.2", "datasource": "sbt", - "depName": "org.example:bar_2.12", - "fileReplacePosition": 189, + "depName": "org.example:bar_2.9.10", + "fileReplacePosition": 188, "registryUrls": Array [ "https://repo.maven.apache.org/maven2", "https://example.com/repos/1/", @@ -34,8 +59,8 @@ Object { Object { "currentValue": "0.0.3", "datasource": "sbt", - "depName": "org.example:baz_2.12", - "fileReplacePosition": 253, + "depName": "org.example:baz_2.9.10", + "fileReplacePosition": 252, "registryUrls": Array [ "https://repo.maven.apache.org/maven2", "https://example.com/repos/1/", @@ -49,7 +74,7 @@ Object { "currentValue": "0.0.4", "datasource": "sbt", "depName": "org.example:qux", - "fileReplacePosition": 288, + "fileReplacePosition": 287, "registryUrls": Array [ "https://repo.maven.apache.org/maven2", "https://example.com/repos/1/", @@ -63,7 +88,7 @@ Object { "currentValue": "0.0.5", "datasource": "sbt", "depName": "org.example:quux", - "fileReplacePosition": 347, + "fileReplacePosition": 346, "registryUrls": Array [ "https://repo.maven.apache.org/maven2", "https://example.com/repos/1/", @@ -76,9 +101,9 @@ Object { Object { "currentValue": "0.0.6", "datasource": "sbt", - "depName": "org.example:quuz_2.12", + "depName": "org.example:quuz_2.9.10", "depType": "test", - "fileReplacePosition": 527, + "fileReplacePosition": 526, "registryUrls": Array [ "https://repo.maven.apache.org/maven2", "https://example.com/repos/1/", @@ -93,7 +118,7 @@ Object { "datasource": "sbt", "depName": "org.example:corge", "depType": "Provided", - "fileReplacePosition": 585, + "fileReplacePosition": 584, "registryUrls": Array [ "https://repo.maven.apache.org/maven2", "https://example.com/repos/1/", @@ -108,7 +133,7 @@ Object { "datasource": "sbt", "depName": "org.example:grault", "depType": "Test", - "fileReplacePosition": 480, + "fileReplacePosition": 479, "registryUrls": Array [ "https://repo.maven.apache.org/maven2", "https://example.com/repos/1/", @@ -123,7 +148,7 @@ Object { "datasource": "sbt", "depName": "org.example:waldo", "depType": "plugin", - "fileReplacePosition": 987, + "fileReplacePosition": 986, "registryUrls": Array [ "https://repo.maven.apache.org/maven2", "https://example.com/repos/1/", @@ -144,7 +169,7 @@ Object { "currentValue": "0.0.1", "datasource": "sbt", "depName": "org.example:foo", - "fileReplacePosition": 192, + "fileReplacePosition": 195, "registryUrls": Array [ "https://repo.maven.apache.org/maven2", "https://example.com/repos/1/", @@ -158,7 +183,7 @@ Object { "currentValue": "0.0.2", "datasource": "sbt", "depName": "org.example:bar_2.12", - "fileReplacePosition": 248, + "fileReplacePosition": 251, "registryUrls": Array [ "https://repo.maven.apache.org/maven2", "https://example.com/repos/1/", @@ -172,7 +197,7 @@ Object { "currentValue": "0.0.3", "datasource": "sbt", "depName": "org.example:baz_2.12", - "fileReplacePosition": 312, + "fileReplacePosition": 315, "registryUrls": Array [ "https://repo.maven.apache.org/maven2", "https://example.com/repos/1/", @@ -186,7 +211,7 @@ Object { "currentValue": "0.0.4", "datasource": "sbt", "depName": "org.example:qux", - "fileReplacePosition": 347, + "fileReplacePosition": 350, "registryUrls": Array [ "https://repo.maven.apache.org/maven2", "https://example.com/repos/1/", @@ -200,7 +225,7 @@ Object { "currentValue": "0.0.5", "datasource": "sbt", "depName": "org.example:quux", - "fileReplacePosition": 406, + "fileReplacePosition": 409, "registryUrls": Array [ "https://repo.maven.apache.org/maven2", "https://example.com/repos/1/", @@ -215,7 +240,7 @@ Object { "datasource": "sbt", "depName": "org.example:quuz_2.12", "depType": "test", - "fileReplacePosition": 550, + "fileReplacePosition": 553, "registryUrls": Array [ "https://repo.maven.apache.org/maven2", "https://example.com/repos/1/", @@ -230,7 +255,7 @@ Object { "datasource": "sbt", "depName": "org.example:corge", "depType": "Provided", - "fileReplacePosition": 608, + "fileReplacePosition": 611, "registryUrls": Array [ "https://repo.maven.apache.org/maven2", "https://example.com/repos/1/", @@ -245,7 +270,7 @@ Object { "datasource": "sbt", "depName": "org.example:grault", "depType": "Test", - "fileReplacePosition": 48, + "fileReplacePosition": 51, "registryUrls": Array [ "https://repo.maven.apache.org/maven2", "https://example.com/repos/1/", @@ -260,7 +285,7 @@ Object { "datasource": "sbt", "depName": "org.example:waldo", "depType": "plugin", - "fileReplacePosition": 1010, + "fileReplacePosition": 1013, "registryUrls": Array [ "https://repo.maven.apache.org/maven2", "https://example.com/repos/1/", @@ -299,28 +324,3 @@ Object { ], } `; - -exports[`lib/manager/sbt/extract extractPackageFile() extract deps from native scala file with variables 1`] = ` -Object { - "deps": Array [ - Object { - "currentValue": "0.7.1", - "datasource": "sbt", - "depName": "com.example:foo_2.13.0-RC5", - "fileReplacePosition": 168, - "registryUrls": Array [ - "https://repo.maven.apache.org/maven2", - ], - }, - Object { - "currentValue": "1.2.3", - "datasource": "sbt", - "depName": "com.abc:abc", - "fileReplacePosition": 120, - "registryUrls": Array [ - "https://repo.maven.apache.org/maven2", - ], - }, - ], -} -`; diff --git a/test/manager/sbt/_fixtures/sample.sbt b/test/manager/sbt/_fixtures/sample.sbt index 8f7f31c69a8f93..8fbd8eba3c2b55 100644 --- a/test/manager/sbt/_fixtures/sample.sbt +++ b/test/manager/sbt/_fixtures/sample.sbt @@ -1,4 +1,4 @@ -scalaVersion := "2.12.10" +scalaVersion := "2.9.10" // libraryDependencies += "org.example" % "foo" % "0.0.0" libraryDependencies += "org.example" % "foo" % "0.0.1" diff --git a/test/manager/sbt/_fixtures/scala-version-variable.sbt b/test/manager/sbt/_fixtures/scala-version-variable.sbt index 9cdeb6bb716a29..fd0abe2efd43aa 100644 --- a/test/manager/sbt/_fixtures/scala-version-variable.sbt +++ b/test/manager/sbt/_fixtures/scala-version-variable.sbt @@ -1,4 +1,4 @@ -val ScalaVersion = "2.12" +val ScalaVersion = "2.12.10" val versionExample = "0.0.8" scalaVersion := ScalaVersion