Mercurial > hg
changeset 10049:5b9709f81986
Merge with stable
author | Martin Geisler <mg@lazybytes.net> |
---|---|
date | Sat, 12 Dec 2009 23:03:05 +0100 |
parents | 0c23b0b3516b (current diff) 46de82e50790 (diff) |
children | dd37f044f1fa |
files | mercurial/revlog.py |
diffstat | 4 files changed, 72 insertions(+), 27 deletions(-) [+] |
line wrap: on
line diff
--- a/hgext/mq.py Fri Dec 11 11:04:31 2009 +0100 +++ b/hgext/mq.py Sat Dec 12 23:03:05 2009 +0100 @@ -1096,12 +1096,6 @@ m, a, r, d = repo.status(qp, top)[:4] if d: raise util.Abort(_("deletions found between repo revs")) - for f in m: - getfile(f, mmap[f], mmap.flags(f)) - for f in r: - getfile(f, mmap[f], mmap.flags(f)) - for f in m + r: - repo.dirstate.normal(f) for f in a: try: os.unlink(repo.wjoin(f)) @@ -1111,6 +1105,12 @@ try: os.removedirs(os.path.dirname(repo.wjoin(f))) except: pass repo.dirstate.forget(f) + for f in m: + getfile(f, mmap[f], mmap.flags(f)) + for f in r: + getfile(f, mmap[f], mmap.flags(f)) + for f in m + r: + repo.dirstate.normal(f) repo.dirstate.setparents(qp, nullid) for patch in reversed(self.applied[start:end]): self.ui.status(_("popping %s\n") % patch.name)
--- a/mercurial/revlog.py Fri Dec 11 11:04:31 2009 +0100 +++ b/mercurial/revlog.py Sat Dec 12 23:03:05 2009 +0100 @@ -579,7 +579,13 @@ return reachable def ancestors(self, *revs): - 'Generate the ancestors of revs using a breadth-first visit' + """Generate the ancestors of 'revs' in reverse topological order. + + Yield a sequence of revision numbers starting with the parents + of each revision in revs, i.e., each revision is *not* considered + an ancestor of itself. Results are in breadth-first order: + parents of each rev in revs, then parents of those, etc. Result + does not include the null revision.""" visit = list(revs) seen = set([nullrev]) while visit: @@ -590,7 +596,12 @@ yield parent def descendants(self, *revs): - 'Generate the descendants of revs in topological order' + """Generate the descendants of 'revs' in revision order. + + Yield a sequence of revision numbers starting with a child of + some rev in revs, i.e., each revision is *not* considered a + descendant of itself. Results are ordered by revision number (a + topological sort).""" seen = set(revs) for i in xrange(min(revs) + 1, len(self)): for x in self.parentrevs(i): @@ -600,15 +611,20 @@ break def findmissing(self, common=None, heads=None): - ''' - returns the topologically sorted list of nodes from the set: - missing = (ancestors(heads) \ ancestors(common)) + """Return the ancestors of heads that are not ancestors of common. + + More specifically, return a list of nodes N such that every N + satisfies the following constraints: - where ancestors() is the set of ancestors from heads, heads included + 1. N is an ancestor of some node in 'heads' + 2. N is not an ancestor of any node in 'common' - if heads is None, the heads of the revlog are used - if common is None, nullid is assumed to be a common node - ''' + The list is sorted by revision number, meaning it is + topologically sorted. + + 'heads' and 'common' are both lists of node IDs. If heads is + not supplied, uses all of the revlog's heads. If common is not + supplied, uses nullid.""" if common is None: common = [nullid] if heads is None: @@ -639,20 +655,26 @@ return [self.node(r) for r in missing] def nodesbetween(self, roots=None, heads=None): - """Return a tuple containing three elements. Elements 1 and 2 contain - a final list bases and heads after all the unreachable ones have been - pruned. Element 0 contains a topologically sorted list of all + """Return a topological path from 'roots' to 'heads'. + + Return a tuple (nodes, outroots, outheads) where 'nodes' is a + topologically sorted list of all nodes N that satisfy both of + these constraints: + + 1. N is a descendant of some node in 'roots' + 2. N is an ancestor of some node in 'heads' - nodes that satisfy these constraints: - 1. All nodes must be descended from a node in roots (the nodes on - roots are considered descended from themselves). - 2. All nodes must also be ancestors of a node in heads (the nodes in - heads are considered to be their own ancestors). + Every node is considered to be both a descendant and an ancestor + of itself, so every reachable node in 'roots' and 'heads' will be + included in 'nodes'. - If roots is unspecified, nullid is assumed as the only root. - If heads is unspecified, it is taken to be the output of the - heads method (i.e. a list of all nodes in the repository that - have no children).""" + 'outroots' is the list of reachable nodes in 'roots', i.e., the + subset of 'roots' that is returned in 'nodes'. Likewise, + 'outheads' is the subset of 'heads' that is also in 'nodes'. + + 'roots' and 'heads' are both lists of node IDs. If 'roots' is + unspecified, uses nullid as the only root. If 'heads' is + unspecified, uses list of all of the revlog's heads.""" nonodes = ([], [], []) if roots is not None: roots = list(roots)
--- a/tests/test-mq Fri Dec 11 11:04:31 2009 +0100 +++ b/tests/test-mq Sat Dec 12 23:03:05 2009 +0100 @@ -561,3 +561,23 @@ hg qseries -v hg up qparent hg qpop + +cd .. +hg init deletion-order +cd deletion-order + +touch a +hg ci -Aqm0 + +hg qnew rename-dir +hg rm a +hg qrefresh + +mkdir a b +touch a/a b/b +hg add -q a b +hg qrefresh + +echo % test popping must remove files added in subdirectories first +hg qpop +cd ..
--- a/tests/test-mq.out Fri Dec 11 11:04:31 2009 +0100 +++ b/tests/test-mq.out Sat Dec 12 23:03:05 2009 +0100 @@ -612,3 +612,6 @@ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved popping empty patch queue now empty +% test popping must remove files added in subdirectories first +popping rename-dir +patch queue now empty