From 8fdbc4fd1c894a69df0cc7cb63b6e0c263ec236f Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Wed, 8 Apr 2020 10:56:37 +0200
Subject: [PATCH] refactor(sbt): use autoReplace

---
 .../sbt/__snapshots__/extract.spec.ts.snap    | 22 ---------
 lib/manager/sbt/extract.ts                    | 45 ++----------------
 lib/manager/sbt/index.ts                      |  4 +-
 lib/manager/sbt/update.spec.ts                | 47 -------------------
 lib/manager/sbt/update.ts                     |  9 ----
 5 files changed, 6 insertions(+), 121 deletions(-)
 delete mode 100644 lib/manager/sbt/update.spec.ts
 delete mode 100644 lib/manager/sbt/update.ts

diff --git a/lib/manager/sbt/__snapshots__/extract.spec.ts.snap b/lib/manager/sbt/__snapshots__/extract.spec.ts.snap
index 326c671709..faa6b6c584 100644
--- a/lib/manager/sbt/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/sbt/__snapshots__/extract.spec.ts.snap
@@ -7,7 +7,6 @@ Object {
       "currentValue": "0.7.1",
       "datasource": "sbt-package",
       "depName": "com.example:foo_2.13.0-RC5",
-      "fileReplacePosition": 168,
       "registryUrls": Array [
         "https://repo.maven.apache.org/maven2",
       ],
@@ -16,7 +15,6 @@ Object {
       "currentValue": "1.2.3",
       "datasource": "sbt-package",
       "depName": "com.abc:abc",
-      "fileReplacePosition": 120,
       "registryUrls": Array [
         "https://repo.maven.apache.org/maven2",
       ],
@@ -32,7 +30,6 @@ Object {
       "currentValue": "0.0.1",
       "datasource": "sbt-package",
       "depName": "org.example:foo",
-      "fileReplacePosition": 132,
       "registryUrls": Array [
         "https://repo.maven.apache.org/maven2",
         "https://example.com/repos/1/",
@@ -46,7 +43,6 @@ Object {
       "currentValue": "0.0.2",
       "datasource": "sbt-package",
       "depName": "org.example:bar_2.9.10",
-      "fileReplacePosition": 188,
       "registryUrls": Array [
         "https://repo.maven.apache.org/maven2",
         "https://example.com/repos/1/",
@@ -60,7 +56,6 @@ Object {
       "currentValue": "0.0.3",
       "datasource": "sbt-package",
       "depName": "org.example:baz_2.9.10",
-      "fileReplacePosition": 252,
       "registryUrls": Array [
         "https://repo.maven.apache.org/maven2",
         "https://example.com/repos/1/",
@@ -74,7 +69,6 @@ Object {
       "currentValue": "0.0.4",
       "datasource": "sbt-package",
       "depName": "org.example:qux",
-      "fileReplacePosition": 287,
       "registryUrls": Array [
         "https://repo.maven.apache.org/maven2",
         "https://example.com/repos/1/",
@@ -88,7 +82,6 @@ Object {
       "currentValue": "0.0.5",
       "datasource": "sbt-package",
       "depName": "org.example:quux",
-      "fileReplacePosition": 346,
       "registryUrls": Array [
         "https://repo.maven.apache.org/maven2",
         "https://example.com/repos/1/",
@@ -103,7 +96,6 @@ Object {
       "datasource": "sbt-package",
       "depName": "org.example:quuz_2.9.10",
       "depType": "test",
-      "fileReplacePosition": 526,
       "registryUrls": Array [
         "https://repo.maven.apache.org/maven2",
         "https://example.com/repos/1/",
@@ -118,7 +110,6 @@ Object {
       "datasource": "sbt-package",
       "depName": "org.example:corge",
       "depType": "Provided",
-      "fileReplacePosition": 584,
       "registryUrls": Array [
         "https://repo.maven.apache.org/maven2",
         "https://example.com/repos/1/",
@@ -133,7 +124,6 @@ Object {
       "datasource": "sbt-package",
       "depName": "org.example:grault",
       "depType": "Test",
-      "fileReplacePosition": 479,
       "registryUrls": Array [
         "https://repo.maven.apache.org/maven2",
         "https://example.com/repos/1/",
@@ -148,7 +138,6 @@ Object {
       "datasource": "sbt-plugin",
       "depName": "org.example:waldo",
       "depType": "plugin",
-      "fileReplacePosition": 986,
       "registryUrls": Array [
         "https://repo.maven.apache.org/maven2",
         "https://example.com/repos/1/",
@@ -169,7 +158,6 @@ Object {
       "currentValue": "0.0.1",
       "datasource": "sbt-package",
       "depName": "org.example:foo",
-      "fileReplacePosition": 195,
       "registryUrls": Array [
         "https://repo.maven.apache.org/maven2",
         "https://example.com/repos/1/",
@@ -183,7 +171,6 @@ Object {
       "currentValue": "0.0.2",
       "datasource": "sbt-package",
       "depName": "org.example:bar_2.12",
-      "fileReplacePosition": 251,
       "registryUrls": Array [
         "https://repo.maven.apache.org/maven2",
         "https://example.com/repos/1/",
@@ -197,7 +184,6 @@ Object {
       "currentValue": "0.0.3",
       "datasource": "sbt-package",
       "depName": "org.example:baz_2.12",
-      "fileReplacePosition": 315,
       "registryUrls": Array [
         "https://repo.maven.apache.org/maven2",
         "https://example.com/repos/1/",
@@ -211,7 +197,6 @@ Object {
       "currentValue": "0.0.4",
       "datasource": "sbt-package",
       "depName": "org.example:qux",
-      "fileReplacePosition": 350,
       "registryUrls": Array [
         "https://repo.maven.apache.org/maven2",
         "https://example.com/repos/1/",
@@ -225,7 +210,6 @@ Object {
       "currentValue": "0.0.5",
       "datasource": "sbt-package",
       "depName": "org.example:quux",
-      "fileReplacePosition": 409,
       "registryUrls": Array [
         "https://repo.maven.apache.org/maven2",
         "https://example.com/repos/1/",
@@ -240,7 +224,6 @@ Object {
       "datasource": "sbt-package",
       "depName": "org.example:quuz_2.12",
       "depType": "test",
-      "fileReplacePosition": 553,
       "registryUrls": Array [
         "https://repo.maven.apache.org/maven2",
         "https://example.com/repos/1/",
@@ -255,7 +238,6 @@ Object {
       "datasource": "sbt-package",
       "depName": "org.example:corge",
       "depType": "Provided",
-      "fileReplacePosition": 611,
       "registryUrls": Array [
         "https://repo.maven.apache.org/maven2",
         "https://example.com/repos/1/",
@@ -270,7 +252,6 @@ Object {
       "datasource": "sbt-package",
       "depName": "org.example:grault",
       "depType": "Test",
-      "fileReplacePosition": 51,
       "registryUrls": Array [
         "https://repo.maven.apache.org/maven2",
         "https://example.com/repos/1/",
@@ -285,7 +266,6 @@ Object {
       "datasource": "sbt-plugin",
       "depName": "org.example:waldo",
       "depType": "plugin",
-      "fileReplacePosition": 1013,
       "registryUrls": Array [
         "https://repo.maven.apache.org/maven2",
         "https://example.com/repos/1/",
@@ -306,7 +286,6 @@ Object {
       "currentValue": "3.0.0",
       "datasource": "sbt-package",
       "depName": "org.scalatest:scalatest",
-      "fileReplacePosition": 65,
       "registryUrls": Array [
         "https://repo.maven.apache.org/maven2",
       ],
@@ -316,7 +295,6 @@ Object {
       "datasource": "sbt-plugin",
       "depName": "com.github.gseitz:sbt-release",
       "depType": "plugin",
-      "fileReplacePosition": 100,
       "registryUrls": Array [
         "https://repo.maven.apache.org/maven2",
       ],
diff --git a/lib/manager/sbt/extract.ts b/lib/manager/sbt/extract.ts
index af6763b47a..21900178ab 100644
--- a/lib/manager/sbt/extract.ts
+++ b/lib/manager/sbt/extract.ts
@@ -77,22 +77,16 @@ const getVarName = (str: string): string =>
 const isVarName = (str: string): boolean =>
   /^[_a-zA-Z][_a-zA-Z0-9]*$/.test(str);
 
-const getVarInfo = (
-  str: string,
-  ctx: ParseContext
-): { val: string; fileReplacePosition: number } => {
-  const { fileOffset } = ctx;
+const getVarInfo = (str: string, ctx: ParseContext): { val: string } => {
   const rightPart = str.replace(
     /^\s*(lazy\s*)?val\s+[_a-zA-Z][_a-zA-Z0-9]*\s*=\s*"/,
     ''
   );
-  const fileReplacePosition = str.indexOf(rightPart) + fileOffset;
   const val = rightPart.replace(/"\s*$/, '');
-  return { val, fileReplacePosition };
+  return { val };
 };
 
 interface ParseContext {
-  fileOffset: number;
   scalaVersion: string;
   variables: any;
   depType?: string;
@@ -102,7 +96,7 @@ function parseDepExpr(
   expr: string,
   ctx: ParseContext
 ): PackageDependency | null {
-  const { scalaVersion, fileOffset, variables } = ctx;
+  const { scalaVersion, variables } = ctx;
   let { depType } = ctx;
 
   const isValidToken = (str: string): boolean =>
@@ -164,28 +158,9 @@ function parseDepExpr(
     depType = rawScope.replace(/^"/, '').replace(/"$/, '');
   }
 
-  let fileReplacePosition: number;
-  if (isStringLiteral(rawVersion)) {
-    // Calculate fileReplacePosition incrementally
-    // help us to avoid errors in updating phase.
-    fileReplacePosition = 0;
-    fileReplacePosition +=
-      expr.slice(fileReplacePosition).indexOf(rawGroupId) + rawGroupId.length;
-    fileReplacePosition +=
-      expr.slice(fileReplacePosition).indexOf(rawArtifactId) +
-      rawArtifactId.length;
-    fileReplacePosition += expr
-      .slice(fileReplacePosition)
-      .indexOf(currentValue);
-    fileReplacePosition += fileOffset;
-  } else {
-    fileReplacePosition = variables[rawVersion].fileReplacePosition;
-  }
-
   const result: PackageDependency = {
     depName,
     currentValue,
-    fileReplacePosition,
   };
 
   if (depType) {
@@ -195,7 +170,6 @@ function parseDepExpr(
   return result;
 }
 interface ParseOptions {
-  fileOffset?: number;
   isMultiDeps?: boolean;
   scalaVersion?: string;
   variables?: Record<string, any>;
@@ -207,13 +181,12 @@ function parseSbtLine(
   lineIndex: number,
   lines: string[]
 ): (PackageFile & ParseOptions) | null {
-  const { deps, registryUrls, fileOffset, variables } = acc;
+  const { deps, registryUrls, variables } = acc;
 
   let { isMultiDeps, scalaVersion } = acc;
 
   const ctx: ParseContext = {
     scalaVersion,
-    fileOffset,
     variables,
   };
 
@@ -238,38 +211,30 @@ function parseSbtLine(
         /^\s*(lazy\s*)?val\s[_a-zA-Z][_a-zA-Z0-9]*\s*=\s*/,
         ''
       );
-      const expOffset = line.length - depExpr.length;
       dep = parseDepExpr(depExpr, {
         ...ctx,
-        fileOffset: fileOffset + expOffset,
       });
     } else if (isSingleLineDep(line)) {
       isMultiDeps = false;
       const depExpr = line.replace(/^.*\+=\s*/, '');
-      const expOffset = line.length - depExpr.length;
       dep = parseDepExpr(depExpr, {
         ...ctx,
-        fileOffset: fileOffset + expOffset,
       });
     } else if (isPluginDep(line)) {
       isMultiDeps = false;
       const rightPart = line.replace(/^\s*addSbtPlugin\s*\(/, '');
-      const expOffset = line.length - rightPart.length;
       const depExpr = rightPart.replace(/\)\s*$/, '');
       dep = parseDepExpr(depExpr, {
         ...ctx,
         depType: 'plugin',
-        fileOffset: fileOffset + expOffset,
       });
     } else if (isDepsBegin(line)) {
       isMultiDeps = true;
     } else if (isMultiDeps) {
       const rightPart = line.replace(/^[\s,]*/, '');
-      const expOffset = line.length - rightPart.length;
       const depExpr = rightPart.replace(/[\s,]*$/, '');
       dep = parseDepExpr(depExpr, {
         ...ctx,
-        fileOffset: fileOffset + expOffset,
       });
     }
   }
@@ -289,7 +254,6 @@ function parseSbtLine(
   if (lineIndex + 1 < lines.length) {
     return {
       ...acc,
-      fileOffset: fileOffset + line.length + 1, // inc. newline
       isMultiDeps,
       scalaVersion:
         scalaVersion ||
@@ -310,7 +274,6 @@ export function extractPackageFile(content: string): PackageFile {
   }
   const lines = content.split(/\n/);
   return lines.reduce(parseSbtLine, {
-    fileOffset: 0,
     registryUrls: [MAVEN_REPO],
     deps: [],
     isMultiDeps: false,
diff --git a/lib/manager/sbt/index.ts b/lib/manager/sbt/index.ts
index 213eb810cb..424d3cecf4 100644
--- a/lib/manager/sbt/index.ts
+++ b/lib/manager/sbt/index.ts
@@ -1,10 +1,10 @@
 import * as ivyVersioning from '../../versioning/ivy';
 
 export { extractPackageFile } from './extract';
-export { updateDependency } from './update';
+
+export const autoReplace = true;
 
 export const defaultConfig = {
   fileMatch: ['\\.sbt$', 'project/[^/]*.scala$'],
-  timeout: 300,
   versioning: ivyVersioning.id,
 };
diff --git a/lib/manager/sbt/update.spec.ts b/lib/manager/sbt/update.spec.ts
deleted file mode 100644
index 3bee441996..0000000000
--- a/lib/manager/sbt/update.spec.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import { readFileSync } from 'fs';
-import { resolve } from 'path';
-import { extractPackageFile } from './extract';
-import { updateDependency } from './update';
-import { Upgrade } from '../common';
-
-const sbtPath = resolve(__dirname, `./__fixtures__/sample.sbt`);
-const fileContent = readFileSync(sbtPath, 'utf8');
-
-describe('lib/manager/sbt/extract', () => {
-  describe('updateDependency()', () => {
-    it('returns content untouched if versions are same', () => {
-      const { deps } = extractPackageFile(fileContent);
-      const upgrade: Upgrade = deps.shift();
-      upgrade.newValue = upgrade.currentValue;
-      const newFileContent = updateDependency({ fileContent, upgrade });
-      expect(newFileContent).toBe(fileContent);
-    });
-    it('returns null if content has been updated somewhere', () => {
-      const { deps } = extractPackageFile(fileContent);
-      const upgrade: Upgrade = deps.shift();
-      upgrade.newValue = '0.1.1';
-      const newFileContent = updateDependency({
-        fileContent: fileContent.replace('0.0.1', '0.1.0'),
-        upgrade,
-      });
-      expect(newFileContent).toBeNull();
-    });
-    it('updates old deps to newer ones', () => {
-      const { deps } = extractPackageFile(fileContent);
-      const upgrades = deps.map((dep, idx) => {
-        const minor = idx + 1;
-        const newValue = `123.456.${minor}`;
-        return {
-          ...dep,
-          newValue,
-        };
-      });
-      upgrades.forEach(upgrade => {
-        const { currentValue, newValue } = upgrade;
-        const newFileContent = updateDependency({ fileContent, upgrade });
-        const cmpContent = fileContent.replace(currentValue, newValue);
-        expect(newFileContent).toEqual(cmpContent);
-      });
-    });
-  });
-});
diff --git a/lib/manager/sbt/update.ts b/lib/manager/sbt/update.ts
deleted file mode 100644
index b12e6e44d7..0000000000
--- a/lib/manager/sbt/update.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { UpdateDependencyConfig } from '../common';
-import { updateAtPosition } from '../maven/update';
-
-export function updateDependency({
-  fileContent,
-  upgrade,
-}: UpdateDependencyConfig): string | null {
-  return updateAtPosition(fileContent, upgrade);
-}
-- 
GitLab