From 939f3d6a8b8681bfe52b5ca5751ad213263e9441 Mon Sep 17 00:00:00 2001
From: Michael Kriese <michael.kriese@visualon.de>
Date: Thu, 1 Oct 2020 16:32:07 +0200
Subject: [PATCH] feat(git-submodules): fetch default branch (#7391)

---
 lib/manager/git-submodules/extract.spec.ts |  8 ++++++++
 lib/manager/git-submodules/extract.ts      | 18 +++++++++++++++---
 2 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/lib/manager/git-submodules/extract.spec.ts b/lib/manager/git-submodules/extract.spec.ts
index 6d0b92f8c3..82b219da63 100644
--- a/lib/manager/git-submodules/extract.spec.ts
+++ b/lib/manager/git-submodules/extract.spec.ts
@@ -27,6 +27,13 @@ describe('lib/manager/gitsubmodules/extract', () => {
           }
           return git.raw(options);
         },
+        listRemote(): Response<string> {
+          return partial<Response<string>>(
+            Promise.resolve(
+              'ref: refs/heads/main  HEAD\n5701164b9f5edba1f6ca114c491a564ffb55a964        HEAD'
+            )
+          );
+        },
       };
     });
   });
@@ -38,6 +45,7 @@ describe('lib/manager/gitsubmodules/extract', () => {
       ).toBeNull();
       res = await extractPackageFile('', '.gitmodules.2', { localDir });
       expect(res.deps).toHaveLength(1);
+      expect(res.deps[0].registryUrls[1]).toEqual('main');
       res = await extractPackageFile('', '.gitmodules.3', { localDir });
       expect(res.deps).toHaveLength(1);
       res = await extractPackageFile('', '.gitmodules.4', { localDir });
diff --git a/lib/manager/git-submodules/extract.ts b/lib/manager/git-submodules/extract.ts
index 1bf4b93495..7cdd9d9cbb 100644
--- a/lib/manager/git-submodules/extract.ts
+++ b/lib/manager/git-submodules/extract.ts
@@ -34,9 +34,17 @@ async function getUrl(
   return URL.resolve(`${remoteUrl}/`, path);
 }
 
+const headRefRe = /ref: refs\/heads\/(?<branch>\w+)\s/;
+
+async function getDefaultBranch(subModuleUrl: string): Promise<string> {
+  const val = await Git().listRemote(['--symref', subModuleUrl, 'HEAD']);
+  return headRefRe.exec(val)?.groups?.branch ?? 'master';
+}
+
 async function getBranch(
   gitModulesPath: string,
-  submoduleName: string
+  submoduleName: string,
+  subModuleUrl: string
 ): Promise<string> {
   return (
     (await Git().raw([
@@ -45,7 +53,7 @@ async function getBranch(
       gitModulesPath,
       '--get',
       `submodule.${submoduleName}.branch`,
-    ])) || 'master'
+    ])) || (await getDefaultBranch(subModuleUrl))
   ).trim();
 }
 
@@ -99,8 +107,12 @@ export default async function extractPackageFile(
           const [currentValue] = (await git.subModule(['status', path]))
             .trim()
             .split(/[+\s]/);
-          const submoduleBranch = await getBranch(gitModulesPath, name);
           const subModuleUrl = await getUrl(git, gitModulesPath, name);
+          const submoduleBranch = await getBranch(
+            gitModulesPath,
+            name,
+            subModuleUrl
+          );
           return {
             depName: path,
             registryUrls: [subModuleUrl, submoduleBranch],
-- 
GitLab