mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-13 23:17:57 +00:00
26bcfc7817
Version 1.1.0 obtained from https://code.google.com/p/which/ and added to tree without modifications aside from the removal of which.exe, which has no reason to be in the tree.
84 lines
2.2 KiB
Python
84 lines
2.2 KiB
Python
#!/usr/bin/env python
|
|
# Copyright (c) 2002-2003 ActiveState Corp.
|
|
# Author: Trent Mick (TrentM@ActiveState.com)
|
|
|
|
import os
|
|
import sys
|
|
import types
|
|
|
|
|
|
#---- Support routines
|
|
|
|
def _escapeArg(arg):
|
|
"""Escape the given command line argument for the shell."""
|
|
#XXX There is a *lot* more that we should escape here.
|
|
return arg.replace('"', r'\"')
|
|
|
|
|
|
def _joinArgv(argv):
|
|
r"""Join an arglist to a string appropriate for running.
|
|
>>> import os
|
|
>>> _joinArgv(['foo', 'bar "baz'])
|
|
'foo "bar \\"baz"'
|
|
"""
|
|
cmdstr = ""
|
|
for arg in argv:
|
|
if ' ' in arg:
|
|
cmdstr += '"%s"' % _escapeArg(arg)
|
|
else:
|
|
cmdstr += _escapeArg(arg)
|
|
cmdstr += ' '
|
|
if cmdstr.endswith(' '): cmdstr = cmdstr[:-1] # strip trailing space
|
|
return cmdstr
|
|
|
|
|
|
def run(argv):
|
|
"""Prepare and run the given arg vector, 'argv', and return the
|
|
results. Returns (<stdout lines>, <stderr lines>, <return value>).
|
|
Note: 'argv' may also just be the command string.
|
|
"""
|
|
if type(argv) in (types.ListType, types.TupleType):
|
|
cmd = _joinArgv(argv)
|
|
else:
|
|
cmd = argv
|
|
if sys.platform.startswith('win'):
|
|
i, o, e = os.popen3(cmd)
|
|
output = o.read()
|
|
error = e.read()
|
|
i.close()
|
|
e.close()
|
|
try:
|
|
retval = o.close()
|
|
except IOError:
|
|
# IOError is raised iff the spawned app returns -1. Go
|
|
# figure.
|
|
retval = -1
|
|
if retval is None:
|
|
retval = 0
|
|
else:
|
|
import popen2
|
|
p = popen2.Popen3(cmd, 1)
|
|
i, o, e = p.tochild, p.fromchild, p.childerr
|
|
output = o.read()
|
|
error = e.read()
|
|
i.close()
|
|
o.close()
|
|
e.close()
|
|
retval = (p.wait() & 0xFF00) >> 8
|
|
if retval > 2**7: # 8-bit signed 1's-complement conversion
|
|
retval -= 2**8
|
|
return output, error, retval
|
|
|
|
|
|
def _rmtreeOnError(rmFunction, filePath, excInfo):
|
|
if excInfo[0] == OSError:
|
|
# presuming because file is read-only
|
|
os.chmod(filePath, 0777)
|
|
rmFunction(filePath)
|
|
|
|
def rmtree(dirname):
|
|
import shutil
|
|
shutil.rmtree(dirname, 0, _rmtreeOnError)
|
|
|
|
|