diff options
Diffstat (limited to 'tools/patman')
-rw-r--r-- | tools/patman/command.py | 31 | ||||
-rw-r--r-- | tools/patman/func_test.py | 12 | ||||
-rw-r--r-- | tools/patman/patchstream.py | 4 | ||||
-rwxr-xr-x | tools/patman/patman.py | 4 | ||||
-rw-r--r-- | tools/patman/series.py | 6 | ||||
-rw-r--r-- | tools/patman/settings.py | 4 | ||||
-rw-r--r-- | tools/patman/test.py | 4 | ||||
-rw-r--r-- | tools/patman/tools.py | 29 |
8 files changed, 61 insertions, 33 deletions
diff --git a/tools/patman/command.py b/tools/patman/command.py index 16299f3f5b..5fbd2c4a3e 100644 --- a/tools/patman/command.py +++ b/tools/patman/command.py @@ -4,6 +4,7 @@ import os import cros_subprocess +import tools """Shell command ease-ups for Python.""" @@ -31,6 +32,13 @@ class CommandResult: self.return_code = return_code self.exception = exception + def ToOutput(self, binary): + if not binary: + self.stdout = tools.ToString(self.stdout) + self.stderr = tools.ToString(self.stderr) + self.combined = tools.ToString(self.combined) + return self + # This permits interception of RunPipe for test purposes. If it is set to # a function, then that function is called with the pipe list being @@ -41,7 +49,7 @@ test_result = None def RunPipe(pipe_list, infile=None, outfile=None, capture=False, capture_stderr=False, oneline=False, - raise_on_error=True, cwd=None, **kwargs): + raise_on_error=True, cwd=None, binary=False, **kwargs): """ Perform a command pipeline, with optional input/output filenames. @@ -67,7 +75,7 @@ def RunPipe(pipe_list, infile=None, outfile=None, else: return test_result # No result: fall through to normal processing - result = CommandResult() + result = CommandResult(b'', b'', b'') last_pipe = None pipeline = list(pipe_list) user_pipestr = '|'.join([' '.join(pipe) for pipe in pipe_list]) @@ -93,29 +101,36 @@ def RunPipe(pipe_list, infile=None, outfile=None, if raise_on_error: raise Exception("Error running '%s': %s" % (user_pipestr, str)) result.return_code = 255 - return result + return result.ToOutput(binary) if capture: result.stdout, result.stderr, result.combined = ( last_pipe.CommunicateFilter(None)) if result.stdout and oneline: - result.output = result.stdout.rstrip('\r\n') + result.output = result.stdout.rstrip(b'\r\n') result.return_code = last_pipe.wait() else: result.return_code = os.waitpid(last_pipe.pid, 0)[1] if raise_on_error and result.return_code: raise Exception("Error running '%s'" % user_pipestr) - return result + return result.ToOutput(binary) def Output(*cmd, **kwargs): kwargs['raise_on_error'] = kwargs.get('raise_on_error', True) return RunPipe([cmd], capture=True, **kwargs).stdout def OutputOneLine(*cmd, **kwargs): + """Run a command and output it as a single-line string + + The command us expected to produce a single line of output + + Returns: + String containing output of command + """ raise_on_error = kwargs.pop('raise_on_error', True) - return (RunPipe([cmd], capture=True, oneline=True, - raise_on_error=raise_on_error, - **kwargs).stdout.strip()) + result = RunPipe([cmd], capture=True, oneline=True, + raise_on_error=raise_on_error, **kwargs).stdout.strip() + return result def Run(*cmd, **kwargs): return RunPipe([cmd], **kwargs).stdout diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 50a2741439..76319fff37 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -51,7 +51,7 @@ class TestFunctional(unittest.TestCase): @classmethod def GetText(self, fname): - return open(self.GetPath(fname)).read() + return open(self.GetPath(fname), encoding='utf-8').read() @classmethod def GetPatchName(self, subject): @@ -160,7 +160,7 @@ class TestFunctional(unittest.TestCase): dry_run, not ignore_bad_tags, cc_file, in_reply_to=in_reply_to, thread=None) series.ShowActions(args, cmd, process_tags) - cc_lines = open(cc_file).read().splitlines() + cc_lines = open(cc_file, encoding='utf-8').read().splitlines() os.remove(cc_file) lines = out[0].splitlines() @@ -198,9 +198,9 @@ class TestFunctional(unittest.TestCase): line += 4 self.assertEqual(expected, tools.ToUnicode(lines[line])) - self.assertEqual(('%s %s, %s' % (args[0], rick, stefan)), + self.assertEqual(('%s %s\0%s' % (args[0], rick, stefan)), tools.ToUnicode(cc_lines[0])) - self.assertEqual(('%s %s, %s, %s, %s' % (args[1], fred, ed, rick, + self.assertEqual(('%s %s\0%s\0%s\0%s' % (args[1], fred, ed, rick, stefan)), tools.ToUnicode(cc_lines[1])) expected = ''' @@ -229,14 +229,14 @@ Simon Glass (2): 2.7.4 ''' - lines = open(cover_fname).read().splitlines() + lines = open(cover_fname, encoding='utf-8').read().splitlines() self.assertEqual( 'Subject: [RFC PATCH v3 0/2] test: A test patch series', lines[3]) self.assertEqual(expected.splitlines(), lines[7:]) for i, fname in enumerate(args): - lines = open(fname).read().splitlines() + lines = open(fname, encoding='utf-8').read().splitlines() subject = [line for line in lines if line.startswith('Subject')] self.assertEqual('Subject: [RFC %d/%d]' % (i + 1, count), subject[0][:18]) diff --git a/tools/patman/patchstream.py b/tools/patman/patchstream.py index ef06606297..df3eb7483b 100644 --- a/tools/patman/patchstream.py +++ b/tools/patman/patchstream.py @@ -511,8 +511,8 @@ def FixPatch(backup_dir, fname, series, commit): A list of errors, or [] if all ok. """ handle, tmpname = tempfile.mkstemp() - outfd = os.fdopen(handle, 'w') - infd = open(fname, 'r') + outfd = os.fdopen(handle, 'w', encoding='utf-8') + infd = open(fname, 'r', encoding='utf-8') ps = PatchStream(series) ps.commit = commit ps.ProcessStream(infd, outfd) diff --git a/tools/patman/patman.py b/tools/patman/patman.py index 9605a36eff..cf53e532dd 100755 --- a/tools/patman/patman.py +++ b/tools/patman/patman.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # SPDX-License-Identifier: GPL-2.0+ # # Copyright (c) 2011 The Chromium OS Authors. @@ -112,7 +112,7 @@ elif options.cc_cmd: for line in fd.readlines(): match = re_line.match(line) if match and match.group(1) == args[0]: - for cc in match.group(2).split(', '): + for cc in match.group(2).split('\0'): cc = cc.strip() if cc: print(cc) diff --git a/tools/patman/series.py b/tools/patman/series.py index 67103f03e6..02a1113ad0 100644 --- a/tools/patman/series.py +++ b/tools/patman/series.py @@ -223,7 +223,7 @@ class Series(dict): col = terminal.Color() # Look for commit tags (of the form 'xxx:' at the start of the subject) fname = '/tmp/patman.%d' % os.getpid() - fd = open(fname, 'w') + fd = open(fname, 'w', encoding='utf-8') all_ccs = [] for commit in self.commits: cc = [] @@ -243,13 +243,13 @@ class Series(dict): if limit is not None: cc = cc[:limit] all_ccs += cc - print(commit.patch, ', '.join(sorted(set(cc))), file=fd) + print(commit.patch, '\0'.join(sorted(set(cc))), file=fd) self._generated_cc[commit.patch] = cc if cover_fname: cover_cc = gitutil.BuildEmailList(self.get('cover_cc', '')) cover_cc = [tools.FromUnicode(m) for m in cover_cc] - cc_list = ', '.join([tools.ToUnicode(x) + cc_list = '\0'.join([tools.ToUnicode(x) for x in sorted(set(cover_cc + all_ccs))]) print(cover_fname, cc_list.encode('utf-8'), file=fd) diff --git a/tools/patman/settings.py b/tools/patman/settings.py index c98911d522..5dc83a8500 100644 --- a/tools/patman/settings.py +++ b/tools/patman/settings.py @@ -165,7 +165,7 @@ def ReadGitAliases(fname): fname: Filename to read """ try: - fd = open(fname, 'r') + fd = open(fname, 'r', encoding='utf-8') except IOError: print("Warning: Cannot find alias file '%s'" % fname) return @@ -259,7 +259,7 @@ def _ReadAliasFile(fname): """ if os.path.exists(fname): bad_line = None - with open(fname) as fd: + with open(fname, encoding='utf-8') as fd: linenum = 0 for line in fd: linenum += 1 diff --git a/tools/patman/test.py b/tools/patman/test.py index cc61c20606..889e186606 100644 --- a/tools/patman/test.py +++ b/tools/patman/test.py @@ -72,12 +72,12 @@ Signed-off-by: Simon Glass <sjg@chromium.org> ''' out = '' inhandle, inname = tempfile.mkstemp() - infd = os.fdopen(inhandle, 'w') + infd = os.fdopen(inhandle, 'w', encoding='utf-8') infd.write(data) infd.close() exphandle, expname = tempfile.mkstemp() - expfd = os.fdopen(exphandle, 'w') + expfd = os.fdopen(exphandle, 'w', encoding='utf-8') expfd.write(expected) expfd.close() diff --git a/tools/patman/tools.py b/tools/patman/tools.py index 4a7fcdad21..3feddb292f 100644 --- a/tools/patman/tools.py +++ b/tools/patman/tools.py @@ -186,7 +186,7 @@ def PathHasFile(path_spec, fname): return True return False -def Run(name, *args): +def Run(name, *args, **kwargs): """Run a tool with some arguments This runs a 'tool', which is a program used by binman to process files and @@ -201,13 +201,14 @@ def Run(name, *args): CommandResult object """ try: + binary = kwargs.get('binary') env = None if tool_search_paths: env = dict(os.environ) env['PATH'] = ':'.join(tool_search_paths) + ':' + env['PATH'] all_args = (name,) + args result = command.RunPipe([all_args], capture=True, capture_stderr=True, - env=env, raise_on_error=False) + env=env, raise_on_error=False, binary=binary) if result.return_code: raise Exception("Error %d running '%s': %s" % (result.return_code,' '.join(all_args), @@ -375,7 +376,7 @@ def ToBytes(string): """Convert a str type into a bytes type Args: - string: string to convert value + string: string to convert Returns: Python 3: A bytes type @@ -385,6 +386,18 @@ def ToBytes(string): return string.encode('utf-8') return string +def ToString(bval): + """Convert a bytes type into a str type + + Args: + bval: bytes value to convert + + Returns: + Python 3: A bytes type + Python 2: A string type + """ + return bval.decode('utf-8') + def Compress(indata, algo, with_header=True): """Compress some data using a given algorithm @@ -406,14 +419,14 @@ def Compress(indata, algo, with_header=True): fname = GetOutputFilename('%s.comp.tmp' % algo) WriteFile(fname, indata) if algo == 'lz4': - data = Run('lz4', '--no-frame-crc', '-c', fname) + data = Run('lz4', '--no-frame-crc', '-c', fname, binary=True) # cbfstool uses a very old version of lzma elif algo == 'lzma': outfname = GetOutputFilename('%s.comp.otmp' % algo) Run('lzma_alone', 'e', fname, outfname, '-lc1', '-lp0', '-pb0', '-d8') data = ReadFile(outfname) elif algo == 'gzip': - data = Run('gzip', '-c', fname) + data = Run('gzip', '-c', fname, binary=True) else: raise ValueError("Unknown algorithm '%s'" % algo) if with_header: @@ -446,13 +459,13 @@ def Decompress(indata, algo, with_header=True): with open(fname, 'wb') as fd: fd.write(indata) if algo == 'lz4': - data = Run('lz4', '-dc', fname) + data = Run('lz4', '-dc', fname, binary=True) elif algo == 'lzma': outfname = GetOutputFilename('%s.decomp.otmp' % algo) Run('lzma_alone', 'd', fname, outfname) - data = ReadFile(outfname) + data = ReadFile(outfname, binary=True) elif algo == 'gzip': - data = Run('gzip', '-cd', fname) + data = Run('gzip', '-cd', fname, binary=True) else: raise ValueError("Unknown algorithm '%s'" % algo) return data |