diff --git a/mercurial/discovery.py b/mercurial/discovery.py --- a/mercurial/discovery.py +++ b/mercurial/discovery.py @@ -240,15 +240,16 @@ def _oldheadssummary(repo, remoteheads, def _nowarnheads(pushop): # Compute newly pushed bookmarks. We don't warn about bookmarked heads. - - # internal config: bookmarks.pushing - newbookmarks = pushop.ui.configlist('bookmarks', 'pushing') - repo = pushop.repo.unfiltered() remote = pushop.remote localbookmarks = repo._bookmarks remotebookmarks = remote.listkeys('bookmarks') bookmarkedheads = set() + + # internal config: bookmarks.pushing + newbookmarks = [localbookmarks.expandname(b) + for b in pushop.ui.configlist('bookmarks', 'pushing')] + for bm in localbookmarks: rnode = remotebookmarks.get(bm) if rnode and rnode in repo: diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -1388,6 +1388,8 @@ class localrepository(object): node = fctx.filenode() if node in [fparent1, fparent2]: self.ui.debug('reusing %s filelog entry\n' % fname) + if manifest1.flags(fname) != fctx.flags(): + changelist.append(fname) return node flog = self.file(fname) diff --git a/mercurial/repair.py b/mercurial/repair.py --- a/mercurial/repair.py +++ b/mercurial/repair.py @@ -194,6 +194,7 @@ def strip(ui, repo, nodelist, backup=Tru if not repo.ui.verbose: repo.ui.popbuffer() f.close() + repo._phasecache.invalidate() for m in updatebm: bm[m] = repo[newbmtarget].node() diff --git a/tests/test-bookmarks-pushpull.t b/tests/test-bookmarks-pushpull.t --- a/tests/test-bookmarks-pushpull.t +++ b/tests/test-bookmarks-pushpull.t @@ -690,7 +690,7 @@ pushing a new bookmark on a new head doe $ echo c5 > f2 $ hg ci -Am5 created new head - $ hg push -B W + $ hg push -B . pushing to http://localhost:$HGPORT/ searching for changes remote: adding changesets diff --git a/tests/test-commit-amend.t b/tests/test-commit-amend.t --- a/tests/test-commit-amend.t +++ b/tests/test-commit-amend.t @@ -1156,3 +1156,21 @@ directory) rev offset length delta linkrev nodeid p1 p2 0 0 88 -1 3 34a4d536c0c0 000000000000 000000000000 +Test if amend preserves executable bit changes + $ chmod +x newdirname/commonfile.py + $ hg ci -m chmod + $ hg ci --amend -m "chmod amended" + $ hg ci --amend -m "chmod amended second time" + $ hg log -p --git -r . + changeset: 8:b1326f52dddf + branch: newdirname + tag: tip + parent: 5:7fd235f7cb2f + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: chmod amended second time + + diff --git a/newdirname/commonfile.py b/newdirname/commonfile.py + old mode 100644 + new mode 100755 + diff --git a/tests/test-commit-interactive.t b/tests/test-commit-interactive.t --- a/tests/test-commit-interactive.t +++ b/tests/test-commit-interactive.t @@ -895,11 +895,24 @@ This tests that translated help message $ LANGUAGE=ja $ export LANGUAGE - $ hg commit -i --encoding cp932 2>&1 < $TESTTMP/escape.py < from __future__ import absolute_import + > import sys + > def escape(c): + > o = ord(c) + > if o < 0x80: + > return c + > else: + > return r'\x%02x' % o # escape char setting MSB + > for l in sys.stdin: + > sys.stdout.write(''.join(escape(c) for c in l)) + > EOF + + $ hg commit -i --encoding cp932 2>&1 < ? > q > EOF - y - \x82\xb1\x82\xcc\x95\xcf\x8dX\x82\xf0\x8bL\x98^(yes) (esc) + y - \x82\xb1\x82\xcc\x95\xcf\x8dX\x82\xf0\x8bL\x98^(yes) $ LANGUAGE= #endif diff --git a/tests/test-strip.t b/tests/test-strip.t --- a/tests/test-strip.t +++ b/tests/test-strip.t @@ -838,6 +838,41 @@ strip backup content date: Thu Jan 01 00:00:00 1970 +0000 summary: mergeCD +Check that the phase cache is properly invalidated after a strip with bookmark. + + $ cat > ../stripstalephasecache.py << EOF + > from mercurial import extensions, localrepo + > def transactioncallback(orig, repo, desc, *args, **kwargs): + > def test(transaction): + > # observe cache inconsistency + > try: + > [repo.changelog.node(r) for r in repo.revs("not public()")] + > except IndexError: + > repo.ui.status("Index error!\n") + > transaction = orig(repo, desc, *args, **kwargs) + > # warm up the phase cache + > list(repo.revs("not public()")) + > if desc != 'strip': + > transaction.addpostclose("phase invalidation test", test) + > return transaction + > def extsetup(ui): + > extensions.wrapfunction(localrepo.localrepository, "transaction", + > transactioncallback) + > EOF + $ hg up -C 2 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ echo k > k + $ hg add k + $ hg commit -m commitK + $ echo l > l + $ hg add l + $ hg commit -m commitL + $ hg book -r tip blah + $ hg strip ".^" --config extensions.crash=$TESTTMP/stripstalephasecache.py + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + saved backup bundle to $TESTTMP/issue4736/.hg/strip-backup/8f0b4384875c-4fa10deb-backup.hg (glob) + $ hg up -C 1 + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved Error during post-close callback of the strip transaction (They should be gracefully handled and reported)