From 5e7844fb8109ebe1b1b78f9ece34498527e45ffe Mon Sep 17 00:00:00 2001
From: Maxime Brunet <max@brnt.mx>
Date: Wed, 12 Oct 2022 23:53:02 -0700
Subject: [PATCH] feat(jsonnet-bundler)!: Use absolute import format for
 depName (#14525)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Use absolute import format for depName in jsonnet-bundler.

Closes #13568

BREAKING CHANGE: `depName` now uses the "absolute import" format (e.g. `bar` → `github.com/foo/bar/baz-wow`)
---
 .../__snapshots__/extract.spec.ts.snap        |  6 ++---
 .../manager/jsonnet-bundler/artifacts.spec.ts |  4 +--
 .../manager/jsonnet-bundler/extract.spec.ts   | 27 ++++++++++++++++---
 .../manager/jsonnet-bundler/extract.ts        | 22 +++++++++------
 4 files changed, 43 insertions(+), 16 deletions(-)

diff --git a/lib/modules/manager/jsonnet-bundler/__snapshots__/extract.spec.ts.snap b/lib/modules/manager/jsonnet-bundler/__snapshots__/extract.spec.ts.snap
index 7961011859..638ef47fdf 100644
--- a/lib/modules/manager/jsonnet-bundler/__snapshots__/extract.spec.ts.snap
+++ b/lib/modules/manager/jsonnet-bundler/__snapshots__/extract.spec.ts.snap
@@ -5,7 +5,7 @@ exports[`modules/manager/jsonnet-bundler/extract extractPackageFile() extracts d
   "deps": [
     {
       "currentValue": "v0.50.0",
-      "depName": "prometheus-operator",
+      "depName": "github.com/prometheus-operator/prometheus-operator/jsonnet/prometheus-operator",
       "managerData": {
         "subdir": "jsonnet/prometheus-operator",
       },
@@ -13,7 +13,7 @@ exports[`modules/manager/jsonnet-bundler/extract extractPackageFile() extracts d
     },
     {
       "currentValue": "v0.9.0",
-      "depName": "kube-prometheus",
+      "depName": "github.com/prometheus-operator/kube-prometheus/jsonnet/kube-prometheus",
       "managerData": {
         "subdir": "jsonnet/kube-prometheus",
       },
@@ -28,7 +28,7 @@ exports[`modules/manager/jsonnet-bundler/extract extractPackageFile() extracts d
   "deps": [
     {
       "currentValue": "v0.50.0",
-      "depName": "prometheus-operator-mixin",
+      "depName": "github.com/prometheus-operator/prometheus-operator/jsonnet/mixin",
       "managerData": {
         "subdir": "jsonnet/mixin",
       },
diff --git a/lib/modules/manager/jsonnet-bundler/artifacts.spec.ts b/lib/modules/manager/jsonnet-bundler/artifacts.spec.ts
index b0910faa26..6a0a5f83f9 100644
--- a/lib/modules/manager/jsonnet-bundler/artifacts.spec.ts
+++ b/lib/modules/manager/jsonnet-bundler/artifacts.spec.ts
@@ -82,11 +82,11 @@ describe('modules/manager/jsonnet-bundler/artifacts', () => {
         packageFileName: 'jsonnetfile.json',
         updatedDeps: [
           {
-            depName: 'foo',
+            depName: 'github.com/foo/foo',
             packageName: 'https://github.com/foo/foo.git',
           },
           {
-            depName: 'foo',
+            depName: 'github.com/foo/foo',
             packageName: 'ssh://git@github.com/foo/foo.git',
             managerData: {
               subdir: 'bar',
diff --git a/lib/modules/manager/jsonnet-bundler/extract.spec.ts b/lib/modules/manager/jsonnet-bundler/extract.spec.ts
index 43d69003d5..9e130501bc 100644
--- a/lib/modules/manager/jsonnet-bundler/extract.spec.ts
+++ b/lib/modules/manager/jsonnet-bundler/extract.spec.ts
@@ -9,6 +9,15 @@ const jsonnetfileNoDependencies = Fixtures.get(
 const jsonnetfileLocalDependencies = Fixtures.get(
   'jsonnetfile-local-dependencies.json'
 );
+const jsonnetfileEmptyGitSource = JSON.stringify({
+  version: 1,
+  dependencies: [
+    {
+      source: { git: {} },
+      version: 'v0.50.0',
+    },
+  ],
+});
 
 describe('modules/manager/jsonnet-bundler/extract', () => {
   describe('extractPackageFile()', () => {
@@ -36,18 +45,29 @@ describe('modules/manager/jsonnet-bundler/extract', () => {
       ).toBeNull();
     });
 
+    it('returns null for dependencies with empty Git source', () => {
+      expect(
+        extractPackageFile(
+          jsonnetfileEmptyGitSource,
+          'jsonnetfile-empty-git-source.json'
+        )
+      ).toBeNull();
+    });
+
     it('extracts dependency', () => {
       const res = extractPackageFile(jsonnetfile, 'jsonnetfile.json');
       expect(res).toMatchSnapshot({
         deps: [
           {
-            depName: 'prometheus-operator',
+            depName:
+              'github.com/prometheus-operator/prometheus-operator/jsonnet/prometheus-operator',
             packageName:
               'https://github.com/prometheus-operator/prometheus-operator.git',
             currentValue: 'v0.50.0',
           },
           {
-            depName: 'kube-prometheus',
+            depName:
+              'github.com/prometheus-operator/kube-prometheus/jsonnet/kube-prometheus',
             packageName:
               'ssh://git@github.com/prometheus-operator/kube-prometheus.git',
             currentValue: 'v0.9.0',
@@ -61,7 +81,8 @@ describe('modules/manager/jsonnet-bundler/extract', () => {
       expect(res).toMatchSnapshot({
         deps: [
           {
-            depName: 'prometheus-operator-mixin',
+            depName:
+              'github.com/prometheus-operator/prometheus-operator/jsonnet/mixin',
             packageName:
               'https://github.com/prometheus-operator/prometheus-operator',
             currentValue: 'v0.50.0',
diff --git a/lib/modules/manager/jsonnet-bundler/extract.ts b/lib/modules/manager/jsonnet-bundler/extract.ts
index 0907faff28..167327910c 100644
--- a/lib/modules/manager/jsonnet-bundler/extract.ts
+++ b/lib/modules/manager/jsonnet-bundler/extract.ts
@@ -1,13 +1,10 @@
+import { join } from 'upath';
 import { logger } from '../../../logger';
 import { coerceArray } from '../../../util/array';
-import { regEx } from '../../../util/regex';
+import { parseUrl } from '../../../util/url';
 import type { PackageDependency, PackageFile } from '../types';
 import type { Dependency, JsonnetFile } from './types';
 
-const gitUrl = regEx(
-  /(ssh:\/\/git@|https:\/\/)([\w.]+)\/([\w:/\-~]*)\/(?<depName>[\w:/-]+)(\.git)?/
-);
-
 export function extractPackageFile(
   content: string,
   packageFile: string
@@ -46,11 +43,20 @@ function extractDependency(dependency: Dependency): PackageDependency | null {
     return null;
   }
 
-  const match = gitUrl.exec(dependency.source.git.remote);
+  const gitRemote = parseUrl(dependency.source.git.remote);
+  if (gitRemote === null) {
+    logger.debug({ dependency }, 'Invalid Git remote URL');
+    return null;
+  }
+
+  const depName = join(
+    gitRemote.host,
+    gitRemote.pathname.replace(/\.git$/, ''),
+    dependency.source.git.subdir
+  );
 
   return {
-    depName:
-      dependency.name ?? match?.groups?.depName ?? dependency.source.git.remote,
+    depName,
     packageName: dependency.source.git.remote,
     currentValue: dependency.version,
     managerData: { subdir: dependency.source.git.subdir },
-- 
GitLab