diff options
author | Guido Günther <agx@sigxcpu.org> | 2018-11-08 11:09:10 +0100 |
---|---|---|
committer | Guido Günther <agx@sigxcpu.org> | 2018-11-08 11:34:46 +0100 |
commit | 1994bb27cff3468816ad919803e7576eae259b26 (patch) | |
tree | d4e0e8455a563ed034743e311cd292fc2bf3b467 /gbp | |
parent | 370244733d44eaf509d242d30b5dddbb26f53fde (diff) |
PatchSeries: Only pass patch description and header to git-mailinfo
There are patches around that use
Content-Transfer-Encoding: base64
but the actual patch after '---' is unencoded ascii resulting in garbage
after the patch description when imported into a patch queue.
Since we're discarding the patch part of git-mailinfo anyway don't pass
this on in the first place.
Closes: #912426
Diffstat (limited to 'gbp')
-rw-r--r-- | gbp/patch_series.py | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/gbp/patch_series.py b/gbp/patch_series.py index c74a414a..ef373a83 100644 --- a/gbp/patch_series.py +++ b/gbp/patch_series.py @@ -19,9 +19,9 @@ import collections import os import re -import subprocess import tempfile from gbp.errors import GbpError +from gbp.git.repository import GitRepository VALID_DEP3_ENDS = re.compile(r'(?:---|\*\*\*|Index:)[ \t][^ \t]|^diff -|^---') @@ -68,17 +68,38 @@ class Patch(object): using I{git mailinfo} """ self.info = {} + self.long_desc = '' + body = tempfile.NamedTemporaryFile(prefix='gbp_') - pipe = subprocess.Popen("git mailinfo -k '%s' /dev/null 2>/dev/null < '%s'" % - (body.name, self.path), - shell=True, - stdout=subprocess.PIPE).stdout - for line in pipe: - line = line.decode() + + # No patch yet, file name information only + if not os.path.exists(self.path): + return + # The patch description might contain UTF-8 while the actual patch is ascii. + # To unconfuse git-mailinfo stop at the patch separator + toparse = [] + for line in open(self.path, 'rb'): + if line == b'---\n': + break + toparse.append(line) + + out, err, ret = GitRepository.git_inout(command='mailinfo', + args=['-k', body.name, '/dev/null'], + input=b''.join(toparse), + extra_env=None, + cwd=None, + capture_stderr=True) + if ret != 0: + raise GbpError("Failed to read patch header of '%s': %s" % + (self.path, err)) + + # Header + for line in out.decode().split('\n'): if ':' in line: rfc_header, value = line.split(" ", 1) header = rfc_header[:-1].lower() self.info[header] = value.strip() + # Body try: self.long_desc = "".join([l.decode("utf-8", "backslashreplace") for l in body]) except (IOError, UnicodeDecodeError) as msg: |