-# Copyright (C) 2012 W. Trevor King
+# Copyright (C) 2012 W. Trevor King <wking@tremily.us>
#
# 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
-# <http://www.gnu.org/licenses/>.
+# You should have received a copy of the GNU General Public License along with
+# update-copyright. If not, see <http://www.gnu.org/licenses/>.
"""Useful utilities for backend classes."""
import subprocess as _subprocess
import sys as _sys
+from .. import LOG as LOG
from ..utils import ENCODING as _ENCODING
def invoke(args, stdin=None, stdout=_subprocess.PIPE, stderr=_subprocess.PIPE,
- expect=(0,), unicode_output=False, encoding=None):
+ 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)
while True:
dirname,basename = _os_path.split(path)
elements.insert(0,basename)
- if dirname in ['', '.']:
+ if dirname in ['/', '', '.']:
break
path = dirname
return tuple(elements)