After removing PATCHFILE from the git-am command, the GitApplyTree apply and commit commands no longer need shell syntax. Build the commands as argv lists and pass them directly to runcmd().
Remove shell quoting from git -c, --author and --date arguments now that those values are passed directly to Git instead of through sh -c. Update the devtool upgrade caller to use shlex.join() when it still embeds those options in a shell command string. Keep run=False command generation as argv lists and avoid adding notes or committing fallback changes when no command was run. Run the dirty-tree status check from self.dir so it inspects the patch tree consistently. Reviewed-by: Daniel Turull <[email protected]> Signed-off-by: Anders Heimer <[email protected]> --- meta/lib/oe/patch.py | 50 +++++++++++++++++++--------------- scripts/lib/devtool/upgrade.py | 2 +- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/meta/lib/oe/patch.py b/meta/lib/oe/patch.py index 9240637189..c76b78fcac 100644 --- a/meta/lib/oe/patch.py +++ b/meta/lib/oe/patch.py @@ -419,9 +419,9 @@ class GitApplyTree(PatchTree): commituser = d.getVar('PATCH_GIT_USER_NAME') commitemail = d.getVar('PATCH_GIT_USER_EMAIL') if commituser: - cmd += ['-c', 'user.name="%s"' % commituser] + cmd += ['-c', 'user.name=%s' % commituser] if commitemail: - cmd += ['-c', 'user.email="%s"' % commitemail] + cmd += ['-c', 'user.email=%s' % commitemail] @staticmethod def prepareCommit(patchfile, commituser=None, commitemail=None): @@ -464,9 +464,9 @@ class GitApplyTree(PatchTree): cmd += ["commit", "-F", tmpfile, "--no-verify", "--no-gpg-sign"] # git doesn't like plain email addresses as authors if author and '<' in author: - cmd.append('--author="%s"' % author) + cmd.append('--author=%s' % author) if date: - cmd.append('--date="%s"' % date) + cmd.append('--date=%s' % date) return (tmpfile, cmd) @staticmethod @@ -593,9 +593,9 @@ class GitApplyTree(PatchTree): cmd = ["git", "reset", "HEAD", self.patchdir] output += runcmd(cmd, self.dir) # Commit the result - (tmpfile, shellcmd) = self.prepareCommit(patch['file'], self.commituser, self.commitemail) + (tmpfile, cmd) = self.prepareCommit(patch['file'], self.commituser, self.commitemail) try: - output += runcmd(["sh", "-c", " ".join(shellcmd)], self.dir) + output += runcmd(cmd, self.dir) finally: os.remove(tmpfile) return output @@ -603,16 +603,24 @@ class GitApplyTree(PatchTree): def _applypatch(self, patch, force = False, reverse = False, run = True): import shutil - def _applypatchhelper(shellcmd, patch, force = False, reverse = False, run = True): + def _applypatchhelper(cmd, patch, force = False, reverse = False, run = True): + cmd = list(cmd) + if reverse: - shellcmd.append('-R') + cmd.append('-R') - shellcmd.append(patch['file']) + cmd.append(patch['file']) if not run: - return "sh" + "-c" + " ".join(shellcmd) + return cmd - return runcmd(["sh", "-c", " ".join(shellcmd)], self.dir) + return runcmd(cmd, self.dir) + + def _committed_fallback_output(output): + if not run: + return output + output += self._commitpatch(patch) + return output reporoot = (runcmd("git rev-parse --show-toplevel".split(), self.dir) or '').strip() if not reporoot: @@ -623,7 +631,7 @@ class GitApplyTree(PatchTree): if self._need_dirty_check(): # Check dirtyness of the tree try: - output = runcmd(["git", "--work-tree=%s" % reporoot, "status", "--short"]) + output = runcmd(["git", "--work-tree=%s" % reporoot, "status", "--short"], self.dir) except CmdError: pass else: @@ -631,14 +639,13 @@ class GitApplyTree(PatchTree): # The tree is dirty, no need to try to apply patches with git anymore # since they fail, fallback directly to patch output = PatchTree._applypatch(self, patch, force, reverse, run) - output += self._commitpatch(patch) - return output + return _committed_fallback_output(output) try: - shellcmd = ["git", "--work-tree=%s" % reporoot] - self.gitCommandUserOptions(shellcmd, self.commituser, self.commitemail) - shellcmd += ["am", "--committer-date-is-author-date", - "-3", "--keep-cr", "--no-scissors", "-p%s" % patch['strippath']] - return _applypatchhelper(shellcmd, patch, force, reverse, run) + cmd = ["git", "--work-tree=%s" % reporoot] + self.gitCommandUserOptions(cmd, self.commituser, self.commitemail) + cmd += ["am", "--committer-date-is-author-date", + "-3", "--keep-cr", "--no-scissors", "-p%s" % patch['strippath']] + return _applypatchhelper(cmd, patch, force, reverse, run) except CmdError: # Need to abort the git am, or we'll still be within it at the end try: @@ -660,13 +667,12 @@ class GitApplyTree(PatchTree): except CmdError: # Fall back to patch output = PatchTree._applypatch(self, patch, force, reverse, run) - output += self._commitpatch(patch) - return output + return _committed_fallback_output(output) except: patch_applied = False raise finally: - if patch_applied: + if patch_applied and run: GitApplyTree.addNote(self.dir, "HEAD", GitApplyTree.original_patch, os.path.basename(patch['file']), self.commituser, self.commitemail) diff --git a/scripts/lib/devtool/upgrade.py b/scripts/lib/devtool/upgrade.py index 061a1ce2a0..74adb29402 100644 --- a/scripts/lib/devtool/upgrade.py +++ b/scripts/lib/devtool/upgrade.py @@ -283,7 +283,7 @@ def _extract_new_source(newpv, srctree, no_patch, srcrev, srcbranch, branch, kee useroptions = [] oe.patch.GitApplyTree.gitCommandUserOptions(useroptions, d=rd) - __run('git %s commit -q -m "Commit of upstream changes at version %s" --allow-empty' % (' '.join(useroptions), newpv)) + __run('git %s commit -q -m "Commit of upstream changes at version %s" --allow-empty' % (shlex.join(useroptions), newpv)) __run('git tag -f --no-sign devtool-base-%s' % newpv) revs = {}
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#239400): https://lists.openembedded.org/g/openembedded-core/message/239400 Mute This Topic: https://lists.openembedded.org/mt/119940619/21656 Group Owner: [email protected] Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [[email protected]] -=-=-=-=-=-=-=-=-=-=-=-
