X-Git-Url: http://git.tremily.us/?p=update-copyright.git;a=blobdiff_plain;f=update_copyright%2Fvcs%2Futils.py;h=b497928597ad971931dca1f2368e6929efda5956;hp=3190f571b250b62b465f91aac62efad7328fc41a;hb=d50736b78316eeec5b575d298cc24f385b06603c;hpb=368d5040fedc7bbfe9e793dfb56aed1a067b2f18 diff --git a/update_copyright/vcs/utils.py b/update_copyright/vcs/utils.py index 3190f57..b497928 100644 --- a/update_copyright/vcs/utils.py +++ b/update_copyright/vcs/utils.py @@ -1,20 +1,19 @@ -# Copyright (C) 2012 W. Trevor King +# Copyright (C) 2012 W. Trevor King # # This file is part of update-copyright. # -# update-copyright is free software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. +# update-copyright is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your option) any +# later version. # -# update-copyright is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. +# update-copyright is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. # -# You should have received a copy of the GNU General Public License -# along with update-copyright. If not, see -# . +# You should have received a copy of the GNU General Public License along with +# update-copyright. If not, see . """Useful utilities for backend classes.""" @@ -23,29 +22,46 @@ import os.path as _os_path import subprocess as _subprocess import sys as _sys +from .. import LOG as LOG +from ..utils import ENCODING as _ENCODING + _MSWINDOWS = _sys.platform == 'win32' _POSIX = not _MSWINDOWS def invoke(args, stdin=None, stdout=_subprocess.PIPE, stderr=_subprocess.PIPE, - expect=(0,)): - """ - expect should be a tuple of allowed exit codes. + cwd=None, expect=(0,), unicode_output=False, encoding=None): + """Invoke an external program and return the results + + ``expect`` should be a tuple of allowed exit codes. + + When ``unicode_output`` is ``True``, convert stdout and stdin + strings to unicode before returing them. """ + LOG.debug('{}$ {}'.format(cwd, args)) try : if _POSIX: q = _subprocess.Popen(args, stdin=_subprocess.PIPE, - stdout=stdout, stderr=stderr) + stdout=stdout, stderr=stderr, + close_fds=True, cwd=cwd) else: assert _MSWINDOWS == True, 'invalid platform' # win32 don't have os.execvp() so run the command in a shell q = _subprocess.Popen(args, stdin=_subprocess.PIPE, - stdout=stdout, stderr=stderr, shell=True) + stdout=stdout, stderr=stderr, shell=True, + cwd=cwd) except OSError, e: raise ValueError([args, e]) stdout,stderr = q.communicate(input=stdin) status = q.wait() + if unicode_output == True: + if encoding is None: + encoding = _ENCODING + if stdout is not None: + stdout = unicode(stdout, encoding) + if stderr is not None: + stderr = unicode(stderr, encoding) if status not in expect: raise ValueError([args, status, stdout, stderr]) return status, stdout, stderr @@ -67,7 +83,7 @@ def splitpath(path): while True: dirname,basename = _os_path.split(path) elements.insert(0,basename) - if dirname in ['', '.']: + if dirname in ['/', '', '.']: break path = dirname return tuple(elements)