Don't pass a path removal parameter to git am since it always applies patches from the root of the git repo, not from each individual patchdir (like quilt).
GitApplyTree uses `git rev-parse --show-toplevel` to find the root of the repo no matter which patchdir is passed into the GitApplyTree instance. But for recipes who set S to a subdirectory within their repo, patches may be added to SRC_URI using a striplevel parameter to match the depth of S. Currently when these patches are applied with git am in GitApplyTree instead of quilt, the striplevel still takes effect even though git applies the patch itself from the repo root, not from within S. In most cases when a patch modifies existing files within a repo, git am works fine and the desired outcome is still achieved because the three-way merge figures out which file the patch was intended to modify based on the repo history. An exception to this occurs if the patch adds a new file to the repo. For example, consider a patch that adds a new file src/foo to a repo. Additionally, assume the recipe for this repo sets S = "${WORKDIR}/git/src", and the patch is added to SRC_URI using "striplevel=2" since the default patch tool, quilt, applies each patch at its patchdir, ${S}. --- /dev/null +++ b/src/foo @@ -0,0 +1 @@ +new file test When the GitApplyTree patch class is used (through either devtool or PATCHTOOL = "git"), the root of the repo is passed to git as the work tree, in addition to the path removal paramter. In the case above, GitApplyTree creates ${WORKDIR}/git/foo instead of ${WORKDIR}/git/src/foo. This is demonstrated with the included selftest. By not passing the striplevel parameter to git am, the patch creates the new file at the intended depth in the repo. --- .../llvm/files/0001-Test-new-file.patch | 17 +++++++++++++++++ .../recipes-test/llvm/llvm_%.bbappend | 2 ++ meta/lib/oe/patch.py | 2 +- meta/lib/oeqa/selftest/cases/bbtests.py | 18 ++++++++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 meta-selftest/recipes-test/llvm/files/0001-Test-new-file.patch create mode 100644 meta-selftest/recipes-test/llvm/llvm_%.bbappend diff --git a/meta-selftest/recipes-test/llvm/files/0001-Test-new-file.patch b/meta-selftest/recipes-test/llvm/files/0001-Test-new-file.patch new file mode 100644 index 0000000000..8af0afeb12 --- /dev/null +++ b/meta-selftest/recipes-test/llvm/files/0001-Test-new-file.patch @@ -0,0 +1,17 @@ +From 057c3da44affb47c154ec1ef67bd11646a6429fa Mon Sep 17 00:00:00 2001 +From: Kyle Russell <bkyleruss...@gmail.com> +Date: Tue, 28 Apr 2020 15:18:43 -0400 +Subject: [PATCH] Test new file + +--- + llvm/README.new | 1 + + 1 file changed, 1 insertion(+) + create mode 100644 llvm/README.new + +diff --git a/llvm/README.new b/llvm/README.new +new file mode 100644 +index 00000000000..0527e6bd2d7 +--- /dev/null ++++ b/llvm/README.new +@@ -0,0 +1 @@ ++This is a test diff --git a/meta-selftest/recipes-test/llvm/llvm_%.bbappend b/meta-selftest/recipes-test/llvm/llvm_%.bbappend new file mode 100644 index 0000000000..205720982c --- /dev/null +++ b/meta-selftest/recipes-test/llvm/llvm_%.bbappend @@ -0,0 +1,2 @@ +# This bbappend is used to alter the recipe using the test_recipe.inc file created by tests. +include test_recipe.inc diff --git a/meta/lib/oe/patch.py b/meta/lib/oe/patch.py index 2b1eee1003..7b9fd67194 100644 --- a/meta/lib/oe/patch.py +++ b/meta/lib/oe/patch.py @@ -517,7 +517,7 @@ class GitApplyTree(PatchTree): try: shellcmd = [patchfilevar, "git", "--work-tree=%s" % reporoot] self.gitCommandUserOptions(shellcmd, self.commituser, self.commitemail) - shellcmd += ["am", "-3", "--keep-cr", "-p%s" % patch['strippath']] + shellcmd += ["am", "-3", "--keep-cr"] return _applypatchhelper(shellcmd, patch, force, reverse, run) except CmdError: # Need to abort the git am, or we'll still be within it at the end diff --git a/meta/lib/oeqa/selftest/cases/bbtests.py b/meta/lib/oeqa/selftest/cases/bbtests.py index dc423ec439..6d863b425a 100644 --- a/meta/lib/oeqa/selftest/cases/bbtests.py +++ b/meta/lib/oeqa/selftest/cases/bbtests.py @@ -4,6 +4,7 @@ import os import re +import tempfile import oeqa.utils.ftools as ftools from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars @@ -81,6 +82,23 @@ class BitbakeTests(OESelftestTestCase): found = l self.assertTrue(found and found.startswith("ERROR:"), msg = "Incorrectly formed patch application didn't fail. bitbake output: %s" % result.output) + def test_patchtool_git(self): + test_recipe = 'llvm' + tmpdir = tempfile.mkdtemp(prefix='bitbakeqa') + bb_vars = get_bb_vars(['S'], test_recipe) + src_dir = bb_vars['S'] + + self.write_recipeinc('llvm', 'FILESEXTRAPATHS_prepend := "${THISDIR}/files:"\nSRC_URI += "file://0001-Test-new-file.patch;striplevel=2"') + bitbake('llvm -c patch') + self.assertExists('%s/README.new' % src_dir) + + bitbake('%s -c clean' % test_recipe) + self.append_recipeinc('llvm', 'PATCHTOOL = "git"') + bitbake('llvm -c patch') + self.assertExists('%s/README.new' % src_dir) + + self.delete_recipeinc('llvm') + def test_force_task_1(self): # test 1 from bug 5875 test_recipe = 'zlib' -- 2.17.1
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#137626): https://lists.openembedded.org/g/openembedded-core/message/137626 Mute This Topic: https://lists.openembedded.org/mt/73366012/21656 Group Owner: openembedded-core+ow...@lists.openembedded.org Unsubscribe: https://lists.openembedded.org/g/openembedded-core/leave/8023207/1426099254/xyzzy [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-