diff --git a/hgext3rd/fbamend/hiddenoverride.py b/hgext3rd/fbamend/hiddenoverride.py --- a/hgext3rd/fbamend/hiddenoverride.py +++ b/hgext3rd/fbamend/hiddenoverride.py @@ -10,6 +10,7 @@ import contextlib import os +from mercurial.node import short from mercurial import ( dispatch, error, @@ -44,6 +45,7 @@ unfi = repo.unfiltered() nodemap = unfi.changelog.nodemap offset = 0 + result = [] while True: node = content[offset:offset + 20] if not node: @@ -51,8 +53,9 @@ # remove unnecessary (non-obsoleted) nodes since pinnedrevs should only # affect obsoleted revs. if node in nodemap and unfi[node].obsolete(): - yield node + result.append(node) offset += 20 + return result def shouldpinnodes(repo): """get nodes that should be pinned: working parent + bookmarks for now""" @@ -92,15 +95,21 @@ fcntl.flock(lockfd, fcntl.LOCK_UN) os.close(lockfd) -def savepinnednodes(repo, newpin, newunpin): +def savepinnednodes(repo, newpin, newunpin, fullargs): # take a narrowed lock so it does not affect repo lock with flock(repo.svfs.join('obsinhibit.lock')): - nodes = set(loadpinnednodes(repo)) + orignodes = loadpinnednodes(repo) + nodes = set(orignodes) nodes |= set(newpin) nodes -= set(newunpin) with util.atomictempfile(repo.svfs.join('obsinhibit')) as f: f.write(''.join(nodes)) + desc = lambda s: [short(n) for n in s] + repo.ui.log('pinnednodes', 'pinnednodes: %r newpin=%r newunpin=%r ' + 'before=%r after=%r\n', fullargs, desc(newpin), + desc(newunpin), desc(orignodes), desc(nodes)) + def runcommand(orig, lui, repo, cmd, fullargs, *args): # return directly for non-repo command if not repo: @@ -118,7 +127,7 @@ newpin = set(n for n in newpin if unfi[n].obsolete()) # only do a write if something has changed if newpin or newunpin: - savepinnednodes(repo, newpin, newunpin) + savepinnednodes(repo, newpin, newunpin, fullargs) return result def createmarkers(orig, repo, rels, *args, **kwargs): diff --git a/tests/test-fbamend-hiddenoverride.t b/tests/test-fbamend-hiddenoverride.t --- a/tests/test-fbamend-hiddenoverride.t +++ b/tests/test-fbamend-hiddenoverride.t @@ -1,9 +1,13 @@ $ cat >> $HGRCPATH << EOF > [extensions] + > blackbox= > fbamend=$TESTDIR/../hgext3rd/fbamend > drawdag=$RUNTESTDIR/drawdag.py > [experimental] > evolution = all + > [blackbox] + > track = command, commandfinish, commandexception, + > pinnednodes > EOF $ hg init @@ -56,6 +60,37 @@ |/ @ 0 A +Check blackbox logs + + $ hg blackbox -l 10000 + *> debugdrawdag (glob) + *> pinnednodes: ['debugdrawdag'] newpin=[] newunpin=['112478962961'] before=[] after=[] (glob) + *> debugdrawdag exited 0 after * (glob) + *> log -G -T '{rev} {desc}\n' (glob) + *> log -G -T '{rev} {desc}\n' exited 0 after * (glob) + *> log -G -T '{rev} {desc}\n' --hidden (glob) + *> log -G -T '{rev} {desc}\n' --hidden exited 0 after * (glob) + *> update 1 --hidden -q (glob) + *> pinnednodes: ['update', '1', '--hidden', '-q'] newpin=['112478962961'] newunpin=[] before=[] after=['112478962961'] (glob) + *> update 1 --hidden -q exited 0 after * (glob) + *> update 0 -q (glob) + *> update 0 -q exited 0 after * (glob) + *> log -G -T '{rev} {desc}\n' (glob) + *> log -G -T '{rev} {desc}\n' exited 0 after * (glob) + *> prune 1 -q (glob) + *> pinnednodes: ['prune', '1', '-q'] newpin=[] newunpin=['112478962961'] before=['112478962961'] after=[] (glob) + *> prune 1 -q exited 0 after * (glob) + *> log -G -T '{rev} {desc}\n' (glob) + *> log -G -T '{rev} {desc}\n' exited 0 after * (glob) + *> bookmark -ir 1 BOOK --hidden -q (glob) + *> pinnednodes: ['bookmark', '-ir', '1', 'BOOK', '--hidden', '-q'] newpin=['112478962961'] newunpin=[] before=[] after=['112478962961'] (glob) + *> bookmark -ir 1 BOOK --hidden -q exited 0 after * (glob) + *> bookmark -d BOOK -q (glob) + *> bookmark -d BOOK -q exited 0 after * (glob) + *> log -G -T '{rev} {desc}\n' (glob) + *> log -G -T '{rev} {desc}\n' exited 0 after * (glob) + *> blackbox -l 10000 (glob) + The order matters - putting bookmarks or moving working copy on non-obsoleted commits do not pin them. Test this using "debugobsolete" which will not call "createmarkers".