diff mbox series

externalsrc: Always ask Git for location of .git directory

Message ID 20250702105658.3862855-1-mac@mcrowe.com
State New
Headers show
Series externalsrc: Always ask Git for location of .git directory | expand

Commit Message

Mike Crowe July 2, 2025, 10:56 a.m. UTC
From: Mike Crowe <mac@mcrowe.com>

externalsrc_configure_prefunc assumed that the .git directory is
${S}/.git. This isn't true for submodules at least.

srctree_hash_files already contained code to ask Git for the correct
path to the .git directory. Let's move that code to a new find_git_dir
function and call it from both places and make the behaviour consistent.

Signed-off-by: Mike Crowe <mac@mcrowe.com>
---
 meta/classes/externalsrc.bbclass | 44 ++++++++++++++++++--------------
 1 file changed, 25 insertions(+), 19 deletions(-)
diff mbox series

Patch

diff --git a/meta/classes/externalsrc.bbclass b/meta/classes/externalsrc.bbclass
index 70e27a8d35..527c99ab69 100644
--- a/meta/classes/externalsrc.bbclass
+++ b/meta/classes/externalsrc.bbclass
@@ -28,6 +28,20 @@ 
 SRCTREECOVEREDTASKS ?= "do_patch do_unpack do_fetch"
 EXTERNALSRC_SYMLINKS ?= "oe-workdir:${WORKDIR} oe-logs:${T}"
 
+def find_git_dir(d, s_dir):
+    import subprocess
+    git_dir = None
+    try:
+        git_dir = os.path.join(s_dir,
+            subprocess.check_output(['git', '-C', s_dir, 'rev-parse', '--git-dir'], stderr=subprocess.DEVNULL).decode("utf-8").rstrip())
+        top_git_dir = os.path.join(d.getVar("TOPDIR"),
+            subprocess.check_output(['git', '-C', d.getVar("TOPDIR"), 'rev-parse', '--git-dir'], stderr=subprocess.DEVNULL).decode("utf-8").rstrip())
+        if git_dir == top_git_dir:
+            git_dir = None
+    except subprocess.CalledProcessError:
+        pass
+    return git_dir
+
 python () {
     externalsrc = d.getVar('EXTERNALSRC')
     externalsrcbuild = d.getVar('EXTERNALSRC_BUILD')
@@ -169,14 +183,16 @@  python externalsrc_configure_prefunc() {
             newlinks.append(symsplit[0])
     # Hide the symlinks from git
     try:
-        git_exclude_file = os.path.join(s_dir, '.git/info/exclude')
-        if os.path.exists(git_exclude_file):
-            with open(git_exclude_file, 'r+') as efile:
-                elines = efile.readlines()
-                for link in newlinks:
-                    if link in elines or '/'+link in elines:
-                        continue
-                    efile.write('/' + link + '\n')
+        git_dir = find_git_dir(d, s_dir)
+        if git_dir:
+            git_exclude_file = os.path.join(git_dir, 'info/exclude')
+            if os.path.exists(git_exclude_file):
+                with open(git_exclude_file, 'r+') as efile:
+                    elines = efile.readlines()
+                    for link in newlinks:
+                        if link in elines or '/'+link in elines:
+                            continue
+                        efile.write('/' + link + '\n')
     except IOError as ioe:
         bb.note('Failed to hide EXTERNALSRC_SYMLINKS from git')
 }
@@ -207,17 +223,7 @@  def srctree_hash_files(d, srcdir=None):
     import hashlib
 
     s_dir = srcdir or d.getVar('EXTERNALSRC')
-    git_dir = None
-
-    try:
-        git_dir = os.path.join(s_dir,
-            subprocess.check_output(['git', '-C', s_dir, 'rev-parse', '--git-dir'], stderr=subprocess.DEVNULL).decode("utf-8").rstrip())
-        top_git_dir = os.path.join(d.getVar("TOPDIR"),
-            subprocess.check_output(['git', '-C', d.getVar("TOPDIR"), 'rev-parse', '--git-dir'], stderr=subprocess.DEVNULL).decode("utf-8").rstrip())
-        if git_dir == top_git_dir:
-            git_dir = None
-    except subprocess.CalledProcessError:
-        pass
+    git_dir = find_git_dir(d, s_dir)
 
     ret = " "
     if git_dir is not None: