--- a/mercurial/util.py Thu Apr 16 22:33:53 2015 +0900
+++ b/mercurial/util.py Thu Apr 16 20:57:51 2015 -0500
@@ -15,7 +15,7 @@
import i18n
_ = i18n._
-import error, osutil, encoding
+import error, osutil, encoding, parsers
import errno, shutil, sys, tempfile, traceback
import re as remod
import os, time, datetime, calendar, textwrap, signal, collections
@@ -48,6 +48,8 @@
nlinks = platform.nlinks
normpath = platform.normpath
normcase = platform.normcase
+normcasespec = platform.normcasespec
+normcasefallback = platform.normcasefallback
openhardlinks = platform.openhardlinks
oslink = platform.oslink
parsepatchoutput = platform.parsepatchoutput
@@ -57,6 +59,7 @@
quotecommand = platform.quotecommand
readpipe = platform.readpipe
rename = platform.rename
+removedirs = platform.removedirs
samedevice = platform.samedevice
samefile = platform.samefile
samestat = platform.samestat
@@ -359,8 +362,10 @@
def __iter__(self):
return self._list.__iter__()
def update(self, src):
- for k in src:
- self[k] = src[k]
+ if isinstance(src, dict):
+ src = src.iteritems()
+ for k, v in src:
+ self[k] = v
def clear(self):
dict.clear(self)
self._list = []
@@ -737,20 +742,27 @@
except shutil.Error, inst:
raise Abort(str(inst))
-def copyfiles(src, dst, hardlink=None):
- """Copy a directory tree using hardlinks if possible"""
+def copyfiles(src, dst, hardlink=None, progress=lambda t, pos: None):
+ """Copy a directory tree using hardlinks if possible."""
+ num = 0
if hardlink is None:
hardlink = (os.stat(src).st_dev ==
os.stat(os.path.dirname(dst)).st_dev)
+ if hardlink:
+ topic = _('linking')
+ else:
+ topic = _('copying')
- num = 0
if os.path.isdir(src):
os.mkdir(dst)
for name, kind in osutil.listdir(src):
srcname = os.path.join(src, name)
dstname = os.path.join(dst, name)
- hardlink, n = copyfiles(srcname, dstname, hardlink)
+ def nprog(t, pos):
+ if pos is not None:
+ return progress(t, pos + num)
+ hardlink, n = copyfiles(srcname, dstname, hardlink, progress=nprog)
num += n
else:
if hardlink:
@@ -762,6 +774,8 @@
else:
shutil.copy(src, dst)
num += 1
+ progress(topic, num)
+ progress(topic, None)
return hardlink, num
@@ -1352,11 +1366,11 @@
formats = defaultdateformats
date = date.strip()
- if date == _('now'):
+ if date == 'now' or date == _('now'):
return makedate()
- if date == _('today'):
+ if date == 'today' or date == _('today'):
date = datetime.date.today().strftime('%b %d')
- elif date == _('yesterday'):
+ elif date == 'yesterday' or date == _('yesterday'):
date = (datetime.date.today() -
datetime.timedelta(days=1)).strftime('%b %d')
@@ -2227,5 +2241,50 @@
f.write(' %-*s in %s\n' % (fnmax, fnln, func))
f.flush()
+class dirs(object):
+ '''a multiset of directory names from a dirstate or manifest'''
+
+ def __init__(self, map, skip=None):
+ self._dirs = {}
+ addpath = self.addpath
+ if safehasattr(map, 'iteritems') and skip is not None:
+ for f, s in map.iteritems():
+ if s[0] != skip:
+ addpath(f)
+ else:
+ for f in map:
+ addpath(f)
+
+ def addpath(self, path):
+ dirs = self._dirs
+ for base in finddirs(path):
+ if base in dirs:
+ dirs[base] += 1
+ return
+ dirs[base] = 1
+
+ def delpath(self, path):
+ dirs = self._dirs
+ for base in finddirs(path):
+ if dirs[base] > 1:
+ dirs[base] -= 1
+ return
+ del dirs[base]
+
+ def __iter__(self):
+ return self._dirs.iterkeys()
+
+ def __contains__(self, d):
+ return d in self._dirs
+
+if safehasattr(parsers, 'dirs'):
+ dirs = parsers.dirs
+
+def finddirs(path):
+ pos = path.rfind('/')
+ while pos != -1:
+ yield path[:pos]
+ pos = path.rfind('/', 0, pos)
+
# convenient shortcut
dst = debugstacktrace