merge with crew.
--- a/contrib/hbisect.py Mon Feb 20 11:06:41 2006 -0800
+++ b/contrib/hbisect.py Mon Feb 20 11:07:09 2006 -0800
@@ -187,7 +187,7 @@
check_clean(self.ui, self.repo)
rev = self.next()
self.ui.write("Now testing %s\n" % hg.hex(rev))
- return self.repo.update(rev, allow=True, force=True)
+ return self.repo.update(rev, force=True)
def good(self, rev):
self.goodrevs.append(rev)
@@ -232,7 +232,7 @@
b.good(new_rev)
ui.write("it is good\n")
anc = b.ancestors()
- repo.update(new_rev, allow=True, force=True)
+ repo.update(new_rev, force=True)
for v in anc:
if v != rev:
ui.warn("fail to found cset! :(\n")
--- a/mercurial/commands.py Mon Feb 20 11:06:41 2006 -0800
+++ b/mercurial/commands.py Mon Feb 20 11:07:09 2006 -0800
@@ -115,8 +115,8 @@
yield rev
minrev, maxrev = min(revs), max(revs)
- for file in files:
- filelog = repo.file(file)
+ for file_ in files:
+ filelog = repo.file(file_)
# A zero count may be a directory or deleted file, so
# try to find matching entries on the slow path.
if filelog.count() == 0:
@@ -127,7 +127,7 @@
if rev < minrev:
break
fncache.setdefault(rev, [])
- fncache[rev].append(file)
+ fncache[rev].append(file_)
wanted[rev] = 1
if slowpath:
# The slow path checks files modified in every changeset.
@@ -447,7 +447,6 @@
f = f.lstrip("^")
if not ui.debugflag and f.startswith("debug"):
continue
- d = ""
doc = e[0].__doc__
if not doc:
doc = _("(No help text available)")
@@ -725,8 +724,8 @@
# can end up with extra data in the cloned revlogs that's
# not pointed to by changesets, thus causing verify to
# fail
- l1 = lock.lock(os.path.join(source, ".hg", "lock"))
- except OSError:
+ l1 = other.lock()
+ except lock.LockException:
copy = False
if copy:
@@ -986,6 +985,18 @@
a = r.ancestor(r.lookup(rev1), r.lookup(rev2))
ui.write("%d:%s\n" % (r.rev(a), hex(a)))
+def debugrebuildstate(ui, repo, rev=None):
+ """rebuild the dirstate as it would look like for the given revision"""
+ if not rev:
+ rev = repo.changelog.tip()
+ else:
+ rev = repo.lookup(rev)
+ change = repo.changelog.read(rev)
+ n = change[0]
+ files = repo.manifest.readflags(n)
+ wlock = self.repo.wlock()
+ repo.dirstate.rebuild(rev, files.iteritems())
+
def debugcheckstate(ui, repo):
"""validate the correctness of the current dirstate"""
parent1, parent2 = repo.dirstate.parents()
@@ -1290,6 +1301,7 @@
s = linestate(line, lnum, cstart, cend)
m[s] = s
+ # FIXME: prev isn't used, why ?
prev = {}
ucache = {}
def display(fn, rev, states, prevstates):
@@ -2373,6 +2385,10 @@
_('forcibly copy over an existing managed file'))],
_('hg copy [OPTION]... [SOURCE]... DEST')),
"debugancestor": (debugancestor, [], _('debugancestor INDEX REV1 REV2')),
+ "debugrebuildstate":
+ (debugrebuildstate,
+ [('r', 'rev', "", _("revision to rebuild to"))],
+ _('debugrebuildstate [-r REV] [REV]')),
"debugcheckstate": (debugcheckstate, [], _('debugcheckstate')),
"debugconfig": (debugconfig, [], _('debugconfig')),
"debugsetparents": (debugsetparents, [], _('debugsetparents REV1 [REV2]')),
--- a/mercurial/dirstate.py Mon Feb 20 11:06:41 2006 -0800
+++ b/mercurial/dirstate.py Mon Feb 20 11:07:09 2006 -0800
@@ -197,6 +197,19 @@
def clear(self):
self.map = {}
+ self.copies = {}
+ self.markdirty()
+
+ def rebuild(self, parent, files):
+ self.clear()
+ umask = os.umask(0)
+ os.umask(umask)
+ for f, mode in files:
+ if mode:
+ self.map[f] = ('n', ~umask, -1, 0)
+ else:
+ self.map[f] = ('n', ~umask & 0666, -1, 0)
+ self.pl = (parent, nullid)
self.markdirty()
def write(self):
@@ -270,11 +283,11 @@
elif not dc:
dc = self.filterfiles(files)
- def statmatch(file, stat):
- file = util.pconvert(file)
- if file not in dc and self.ignore(file):
+ def statmatch(file_, stat):
+ file_ = util.pconvert(file_)
+ if file_ not in dc and self.ignore(file_):
return False
- return match(file)
+ return match(file_)
return self.walkhelper(files=files, statmatch=statmatch, dc=dc)
@@ -350,9 +363,9 @@
continue
if stat.S_ISDIR(st.st_mode):
cmp1 = (lambda x, y: cmp(x[1], y[1]))
- sorted = [ x for x in findfiles(f) ]
- sorted.sort(cmp1)
- for e in sorted:
+ sorted_ = [ x for x in findfiles(f) ]
+ sorted_.sort(cmp1)
+ for e in sorted_:
yield e
else:
ff = util.normpath(ff)
@@ -380,7 +393,7 @@
for src, fn, st in self.statwalk(files, match):
try:
- type, mode, size, time = self[fn]
+ type_, mode, size, time = self[fn]
except KeyError:
unknown.append(fn)
continue
@@ -399,22 +412,23 @@
nonexistent = False
# XXX: what to do with file no longer present in the fs
# who are not removed in the dirstate ?
- if nonexistent and type in "nm":
+ if nonexistent and type_ in "nm":
deleted.append(fn)
continue
# check the common case first
- if type == 'n':
+ if type_ == 'n':
if not st:
st = os.stat(fn)
- if size != st.st_size or (mode ^ st.st_mode) & 0100:
+ if size >= 0 and (size != st.st_size
+ or (mode ^ st.st_mode) & 0100):
modified.append(fn)
elif time != st.st_mtime:
lookup.append(fn)
- elif type == 'm':
+ elif type_ == 'm':
modified.append(fn)
- elif type == 'a':
+ elif type_ == 'a':
added.append(fn)
- elif type == 'r':
+ elif type_ == 'r':
removed.append(fn)
return (lookup, modified, added, removed, deleted, unknown)
--- a/mercurial/localrepo.py Mon Feb 20 11:06:41 2006 -0800
+++ b/mercurial/localrepo.py Mon Feb 20 11:07:09 2006 -0800
@@ -231,7 +231,7 @@
self.join("journal"), after)
def recover(self):
- lock = self.lock()
+ l = self.lock()
if os.path.exists(self.join("journal")):
self.ui.status(_("rolling back interrupted transaction\n"))
transaction.rollback(self.opener, self.join("journal"))
@@ -245,7 +245,7 @@
def undo(self, wlock=None):
if not wlock:
wlock = self.wlock()
- lock = self.lock()
+ l = self.lock()
if os.path.exists(self.join("undo")):
self.ui.status(_("rolling back last transaction\n"))
transaction.rollback(self.opener, self.join("undo"))
@@ -254,25 +254,25 @@
else:
self.ui.warn(_("no undo information available\n"))
- def lock(self, wait=1):
+ def do_lock(self, lockname, wait, releasefn=None, acquirefn=None):
try:
- return lock.lock(self.join("lock"), 0)
- except lock.LockHeld, inst:
- if wait:
- self.ui.warn(_("waiting for lock held by %s\n") % inst.args[0])
- return lock.lock(self.join("lock"), wait)
- raise inst
-
- def wlock(self, wait=1):
- try:
- wlock = lock.lock(self.join("wlock"), 0, self.dirstate.write)
+ l = lock.lock(self.join(lockname), 0, releasefn)
except lock.LockHeld, inst:
if not wait:
raise inst
self.ui.warn(_("waiting for lock held by %s\n") % inst.args[0])
- wlock = lock.lock(self.join("wlock"), wait, self.dirstate.write)
- self.dirstate.read()
- return wlock
+ l = lock.lock(self.join(lockname), wait, releasefn)
+ if acquirefn:
+ acquirefn()
+ return l
+
+ def lock(self, wait=1):
+ return self.do_lock("lock", wait)
+
+ def wlock(self, wait=1):
+ return self.do_lock("wlock", wait,
+ self.dirstate.write,
+ self.dirstate.read)
def checkfilemerge(self, filename, text, filelog, manifest1, manifest2):
"determine whether a new filenode is needed"
@@ -311,7 +311,7 @@
if not wlock:
wlock = self.wlock()
- lock = self.lock()
+ l = self.lock()
tr = self.transaction()
mm = m1.copy()
mfm = mf1.copy()
@@ -388,7 +388,7 @@
if not wlock:
wlock = self.wlock()
- lock = self.lock()
+ l = self.lock()
tr = self.transaction()
# check in files
@@ -508,7 +508,7 @@
if not wlock:
try:
wlock = self.wlock(wait=0)
- except lock.LockHeld:
+ except lock.LockException:
wlock = None
lookup, modified, added, removed, deleted, unknown = (
self.dirstate.changes(files, match))
@@ -931,7 +931,7 @@
return subset
def pull(self, remote, heads=None):
- lock = self.lock()
+ l = self.lock()
# if we have an empty repo, fetch everything
if self.changelog.tip() == nullid:
@@ -951,7 +951,7 @@
return self.addchangegroup(cg)
def push(self, remote, force=False):
- lock = remote.lock()
+ l = remote.lock()
base = {}
heads = remote.heads()
--- a/mercurial/lock.py Mon Feb 20 11:06:41 2006 -0800
+++ b/mercurial/lock.py Mon Feb 20 11:07:09 2006 -0800
@@ -5,10 +5,14 @@
# This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference.
-import os, time
+import errno, os, time
import util
-class LockHeld(Exception):
+class LockException(Exception):
+ pass
+class LockHeld(LockException):
+ pass
+class LockUnavailable(LockException):
pass
class lock(object):
@@ -38,8 +42,11 @@
try:
util.makelock(str(pid), self.f)
self.held = 1
- except (OSError, IOError):
- raise LockHeld(util.readlock(self.f))
+ except (OSError, IOError), why:
+ if why.errno == errno.EEXIST:
+ raise LockHeld(util.readlock(self.f))
+ else:
+ raise LockUnavailable(why)
def release(self):
if self.held:
--- a/mercurial/revlog.py Mon Feb 20 11:06:41 2006 -0800
+++ b/mercurial/revlog.py Mon Feb 20 11:07:09 2006 -0800
@@ -624,12 +624,10 @@
# we store negative distances because heap returns smallest member
h = [(-dist[node], node)]
seen = {}
- earliest = self.count()
while h:
d, n = heapq.heappop(h)
if n not in seen:
seen[n] = 1
- r = self.rev(n)
yield (-d, n)
for p in self.parents(n):
heapq.heappush(h, (-dist[p], p))
@@ -690,11 +688,6 @@
p = self.parents(self.node(revs[0]))[0]
revs.insert(0, self.rev(p))
- # helper to reconstruct intermediate versions
- def construct(text, base, rev):
- bins = [self.chunk(r) for r in xrange(base + 1, rev + 1)]
- return mdiff.patches(text, bins)
-
# build deltas
for d in xrange(0, len(revs) - 1):
a, b = revs[d], revs[d + 1]
@@ -738,10 +731,10 @@
base = prev = -1
start = end = measure = 0
if r:
- start = self.start(self.base(t))
+ base = self.base(t)
+ start = self.start(base)
end = self.end(t)
- measure = self.length(self.base(t))
- base = self.base(t)
+ measure = self.length(base)
prev = self.tip()
transaction.add(self.datafile, end)
@@ -793,14 +786,15 @@
raise RevlogError(_("consistency error adding group"))
measure = len(text)
else:
- e = (end, len(cdelta), self.base(t), link, p1, p2, node)
+ e = (end, len(cdelta), base, link, p1, p2, node)
self.index.append(e)
self.nodemap[node] = r
dfh.write(cdelta)
ifh.write(struct.pack(indexformat, *e))
t, r, chain, prev = r, r + 1, node, node
- start = self.start(self.base(t))
+ base = self.base(t)
+ start = self.start(base)
end = self.end(t)
dfh.close()
--- a/tests/test-pull-permission Mon Feb 20 11:06:41 2006 -0800
+++ b/tests/test-pull-permission Mon Feb 20 11:07:09 2006 -0800
@@ -12,9 +12,8 @@
cd ..
hg clone a b
+
+chmod +w a/.hg # let test clean up
+
cd b
hg verify
-
-cd ..
-
-chmod +w a/.hg # let test clean up