summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJulien Stephan <jstephan@baylibre.com>2023-08-24 09:34:57 +0200
committerRichard Purdie <richard.purdie@linuxfoundation.org>2023-08-29 09:41:07 +0100
commit060f285e58509fd1f38bc4eca990d4643e648c1a (patch)
treebe3fd9a6cd58e1b992853057d7e90302116f5a2d
parent3664a232feb7dbe1bb19132a7d2d94d260fbf272 (diff)
downloadpoky-060f285e58509fd1f38bc4eca990d4643e648c1a.tar.gz
patch.py: use --absolute-git-dir instead of --show-toplevel to retrieve gitdir
[YOCTO #14141] Currently the gitdir is manually constructed using `git rev-parse --show-toplevel` and appending `.git`. This is most of the time correct but not always: `.git` can be a file with the following content: gitdir: <some_folder> This is the case for submodules, so when using devtool modify on a recipe using submodules *and* patching files inside one of the submodules, do_patch fails with the following error: ERROR: Error executing a python function in exec_func_python() autogenerated: The stack trace of python calls that resulted in this exception/failure was: File: 'exec_func_python() autogenerated', lineno: 2, function: <module> 0001: *** 0002:patch_do_patch(d) 0003: File: '<..>/poky/meta/classes-global/patch.bbclass', lineno: 157, function: patch_do_patch 0153: except Exception as exc: 0154: bb.utils.remove(process_tmpdir, True) 0155: bb.fatal("Importing patch '%s' with striplevel '%s'\n%s" % (parm['patchname'], parm['striplevel'], repr(exc).replace("\\n", "\n"))) 0156: try: *** 0157: resolver.Resolve() 0158: except bb.BBHandledException as e: 0159: bb.utils.remove(process_tmpdir, True) 0160: bb.fatal("Applying patch '%s' on target directory '%s'\n%s" % (parm['patchname'], patchdir, repr(e).replace("\\n", "\n"))) 0161: File: '<..>/poky/meta/lib/oe/patch.py', lineno: 769, function: Resolve 0765: def Resolve(self): 0766: olddir = os.path.abspath(os.curdir) 0767: os.chdir(self.patchset.dir) 0768: try: *** 0769: self.patchset.Push() 0770: except Exception: 0771: import sys 0772: os.chdir(olddir) 0773: raise File: '<..>/poky/meta/lib/oe/patch.py', lineno: 274, function: Push 0270: else: 0271: next = 0 0272: 0273: bb.note("applying patch %s" % self.patches[next]) *** 0274: ret = self._applypatch(self.patches[next], force) 0275: 0276: self._current = next 0277: return ret 0278: File: '<..>/poky/meta/lib/oe/patch.py', lineno: 556, function: _applypatch 0552: if os.path.lexists(hooks_dir_backup): 0553: raise Exception("Git hooks backup directory already exists: %s" % hooks_dir_backup) 0554: if os.path.lexists(hooks_dir): 0555: shutil.move(hooks_dir, hooks_dir_backup) *** 0556: os.mkdir(hooks_dir) 0557: commithook = os.path.join(hooks_dir, 'commit-msg') 0558: applyhook = os.path.join(hooks_dir, 'applypatch-msg') 0559: with open(commithook, 'w') as f: 0560: # NOTE: the formatting here is significant; if you change it you'll also need to Exception: NotADirectoryError: [Errno 20] Not a directory: '<..>/build/tmp/work/core2-64-poky-linux/vulkan-samples/git/devtooltmp-n87_zx1i/workdir/git/third_party/spdlog/.git/hooks' Using `git rev-parse --absolute-git-dir` instead of `git rev-parse --show-toplevel` ensure we get the correct gitdir (From OE-Core rev: f74879dd95b19504ce8a8554636d2310d0336806) Signed-off-by: Julien Stephan <jstephan@baylibre.com> Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/lib/oe/patch.py5
1 files changed, 4 insertions, 1 deletions
diff --git a/meta/lib/oe/patch.py b/meta/lib/oe/patch.py
index 5990896fdc..ff9afc9df9 100644
--- a/meta/lib/oe/patch.py
+++ b/meta/lib/oe/patch.py
@@ -547,7 +547,10 @@ class GitApplyTree(PatchTree):
547 reporoot = (runcmd("git rev-parse --show-toplevel".split(), self.dir) or '').strip() 547 reporoot = (runcmd("git rev-parse --show-toplevel".split(), self.dir) or '').strip()
548 if not reporoot: 548 if not reporoot:
549 raise Exception("Cannot get repository root for directory %s" % self.dir) 549 raise Exception("Cannot get repository root for directory %s" % self.dir)
550 hooks_dir = os.path.join(reporoot, '.git', 'hooks') 550 gitdir = (runcmd("git rev-parse --absolute-git-dir".split(), self.dir) or '').strip()
551 if not gitdir:
552 raise Exception("Cannot get gitdir for directory %s" % self.dir)
553 hooks_dir = os.path.join(gitdir, 'hooks')
551 hooks_dir_backup = hooks_dir + '.devtool-orig' 554 hooks_dir_backup = hooks_dir + '.devtool-orig'
552 if os.path.lexists(hooks_dir_backup): 555 if os.path.lexists(hooks_dir_backup):
553 raise Exception("Git hooks backup directory already exists: %s" % hooks_dir_backup) 556 raise Exception("Git hooks backup directory already exists: %s" % hooks_dir_backup)