diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py --- a/mercurial/bundle2.py +++ b/mercurial/bundle2.py @@ -2527,7 +2527,8 @@ def bundle2getvars(op, part): @parthandler(b'stream2', (b'requirements', b'filecount', b'bytecount')) def handlestreamv2bundle(op, part): - requirements = urlreq.unquote(part.params[b'requirements']).split(b',') + requirements = urlreq.unquote(part.params[b'requirements']) + requirements = requirements.split(b',') if requirements else [] filecount = int(part.params[b'filecount']) bytecount = int(part.params[b'bytecount']) diff --git a/mercurial/cext/parsers.c b/mercurial/cext/parsers.c --- a/mercurial/cext/parsers.c +++ b/mercurial/cext/parsers.c @@ -501,6 +501,8 @@ static PyObject *dirstate_item_set_track static PyObject *dirstate_item_set_untracked(dirstateItemObject *self) { self->flags &= ~dirstate_flag_wc_tracked; + self->flags &= ~dirstate_flag_has_meaningful_data; + self->flags &= ~dirstate_flag_has_mtime; self->mode = 0; self->size = 0; self->mtime_s = 0; diff --git a/mercurial/rewriteutil.py b/mercurial/rewriteutil.py --- a/mercurial/rewriteutil.py +++ b/mercurial/rewriteutil.py @@ -48,10 +48,13 @@ def _formatrevs(repo, revs, maxrevs=4): return summary -def precheck(repo, revs, action=b'rewrite'): +def precheck(repo, revs, action=b'rewrite', check_divergence=True): """check if revs can be rewritten action is used to control the error message. + check_divergence allows skipping the divergence checks in cases like adding + a prune marker (A, ()) to obsstore (which can't be diverging). + Make sure this function is called after taking the lock. """ if nullrev in revs: @@ -84,6 +87,9 @@ def precheck(repo, revs, action=b'rewrit hint=hint, ) + if not check_divergence: + return + if not obsolete.isenabled(repo, obsolete.allowdivergenceopt): new_divergence = _find_new_divergence(repo, revs) if new_divergence: diff --git a/mercurial/tags.py b/mercurial/tags.py --- a/mercurial/tags.py +++ b/mercurial/tags.py @@ -806,7 +806,7 @@ class hgtagsfnodescache: # There is some no-merge changeset where p1 is null and p2 is set # Processing them as merge is just slower, but still gives a good # result. - p2node = cl.node(p1rev) + p2node = cl.node(p2rev) p2fnode = self.getfnode(p2node, computemissing=False) if p1fnode != p2fnode: # we cannot rely on readfast because we don't know against what diff --git a/tests/test-clone-stream.t b/tests/test-clone-stream.t --- a/tests/test-clone-stream.t +++ b/tests/test-clone-stream.t @@ -817,3 +817,9 @@ Clone non-publishing with obsolescence $ killdaemons.py #endif + +Cloning a repo with no requirements doesn't give some obscure error + + $ mkdir -p empty-repo/.hg + $ hg clone -q --stream ssh://user@dummy/empty-repo empty-repo2 + $ hg --cwd empty-repo2 verify -q diff --git a/tests/test-tags.t b/tests/test-tags.t --- a/tests/test-tags.t +++ b/tests/test-tags.t @@ -933,3 +933,58 @@ Avoid writing logs on trying to delete a a8a82d372bb35b42ff736e74f07c23bcd99c371f a a8a82d372bb35b42ff736e74f07c23bcd99c371f a 0000000000000000000000000000000000000000 a + + $ cd .. + +.hgtags fnode should be properly resolved at merge revision (issue6673) + + $ hg init issue6673 + $ cd issue6673 + + $ touch a + $ hg ci -qAm a + $ hg branch -q stable + $ hg ci -m branch + + $ hg up -q default + $ hg merge -q stable + $ hg ci -m merge + + add tag to stable branch: + + $ hg up -q stable + $ echo a >> a + $ hg ci -m a + $ hg tag whatever + $ hg log -GT'{rev} {tags}\n' + @ 4 tip + | + o 3 whatever + | + | o 2 + |/| + o | 1 + |/ + o 0 + + + merge tagged stable into default: + + $ hg up -q default + $ hg merge -q stable + $ hg ci -m merge + $ hg log -GT'{rev} {tags}\n' + @ 5 tip + |\ + | o 4 + | | + | o 3 whatever + | | + o | 2 + |\| + | o 1 + |/ + o 0 + + + $ cd ..