##// END OF EJS Templates
Work on walk code.
Work on walk code.

File last commit:

r705:57486910 merge default
r723:9e0f3ba4 default
Show More
util.py
126 lines | 3.3 KiB | text/x-python | PythonLexer
mpm@selenic.com
[PATCH] file seperator handling for the other 'OS'...
r419 # util.py - utility functions and platform specfic implementations
#
# Copyright 2005 K. Thananchayan <thananck@yahoo.com>
#
# This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference.
Thomas Arendsen Hein
Make makelock and readlock work on filesystems without symlink support....
r704 import os, errno
mpm@selenic.com
[PATCH] file seperator handling for the other 'OS'...
r419
mpm@selenic.com
Move dirstate.uniq to util.unique...
r556 def unique(g):
seen = {}
for f in g:
if f not in seen:
seen[f] = 1
yield f
mpm@selenic.com
[PATCH] Harden os.system...
r508 class CommandError(Exception): pass
def explain_exit(code):
"""return a 2-tuple (desc, code) describing a process's status"""
if os.WIFEXITED(code):
val = os.WEXITSTATUS(code)
return "exited with status %d" % val, val
elif os.WIFSIGNALED(code):
val = os.WTERMSIG(code)
return "killed by signal %d" % val, val
elif os.WIFSTOPPED(code):
mark.williamson@cl.cam.ac.uk
A number of minor fixes to problems that pychecker found....
r667 val = os.WSTOPSIG(code)
mpm@selenic.com
[PATCH] Harden os.system...
r508 return "stopped by signal %d" % val, val
raise ValueError("invalid exit code")
mpm@selenic.com
Whitespace cleanups...
r515
mpm@selenic.com
[PATCH] Fix use of util.CommandError...
r521 def system(cmd, errprefix=None):
mpm@selenic.com
[PATCH] Harden os.system...
r508 """execute a shell command that must succeed"""
rc = os.system(cmd)
if rc:
mpm@selenic.com
[PATCH] Fix use of util.CommandError...
r521 errmsg = "%s %s" % (os.path.basename(cmd.split(None, 1)[0]),
explain_exit(rc)[0])
if errprefix:
errmsg = "%s: %s" % (errprefix, errmsg)
mpm@selenic.com
[PATCH] Harden os.system...
r508 raise CommandError(errmsg)
mpm@selenic.com
[PATCH] rename under the other OS...
r421 def rename(src, dst):
try:
os.rename(src, dst)
except:
os.unlink(dst)
os.rename(src, dst)
Thomas Arendsen Hein
Use python function instead of external 'cp' command when cloning repos....
r698 def copytree(src, dst, copyfile):
"""Copy a directory tree, files are copied using 'copyfile'."""
names = os.listdir(src)
os.mkdir(dst)
for name in names:
srcname = os.path.join(src, name)
dstname = os.path.join(dst, name)
if os.path.isdir(srcname):
copytree(srcname, dstname, copyfile)
elif os.path.isfile(srcname):
copyfile(srcname, dstname)
else:
raise IOError("Not a regular file: %r" % srcname)
Thomas Arendsen Hein
Make makelock and readlock work on filesystems without symlink support....
r704 def _makelock_file(info, pathname):
ld = os.open(pathname, os.O_CREAT | os.O_WRONLY | os.O_EXCL)
os.write(ld, info)
os.close(ld)
def _readlock_file(pathname):
return file(pathname).read()
mpm@selenic.com
[PATCH] rename under the other OS...
r421 # Platfor specific varients
mpm@selenic.com
[PATCH] file seperator handling for the other 'OS'...
r419 if os.name == 'nt':
mpm@selenic.com
[PATCH] /dev/null for other OS...
r461 nulldev = 'NUL:'
mpm@selenic.com
Permission handling for the other OS...
r441 def is_exec(f, last):
return last
def set_exec(f, mode):
pass
mpm@selenic.com
Whitespace cleanups...
r515
mpm@selenic.com
[PATCH] file seperator handling for the other 'OS'...
r419 def pconvert(path):
return path.replace("\\", "/")
mpm@selenic.com
[PATCH] Enables lock work under the other 'OS'...
r422
Thomas Arendsen Hein
Make makelock and readlock work on filesystems without symlink support....
r704 makelock = _makelock_file
readlock = _readlock_file
mpm@selenic.com
[PATCH] /dev/null for other OS...
r461
mpm@selenic.com
[PATCH] file seperator handling for the other 'OS'...
r419 else:
mpm@selenic.com
[PATCH] /dev/null for other OS...
r461 nulldev = '/dev/null'
mpm@selenic.com
Permission handling for the other OS...
r441 def is_exec(f, last):
return (os.stat(f).st_mode & 0100 != 0)
def set_exec(f, mode):
s = os.stat(f).st_mode
if (s & 0100 != 0) == mode:
return
if mode:
# Turn on +x for every +r bit when making a file executable
# and obey umask.
umask = os.umask(0)
os.umask(umask)
os.chmod(f, s | (s & 0444) >> 2 & ~umask)
else:
os.chmod(f, s & 0666)
mpm@selenic.com
[PATCH] file seperator handling for the other 'OS'...
r419 def pconvert(path):
return path
mpm@selenic.com
[PATCH] Enables lock work under the other 'OS'...
r422 def makelock(info, pathname):
Thomas Arendsen Hein
Make makelock and readlock work on filesystems without symlink support....
r704 try:
os.symlink(info, pathname)
except OSError, why:
if why.errno == errno.EEXIST:
raise
else:
_makelock_file(info, pathname)
mpm@selenic.com
[PATCH] Enables lock work under the other 'OS'...
r422
def readlock(pathname):
Thomas Arendsen Hein
Make makelock and readlock work on filesystems without symlink support....
r704 try:
return os.readlink(pathname)
except OSError, why:
if why.errno == errno.EINVAL:
return _readlock_file(pathname)
else:
raise