# HG changeset patch # User FUJIWARA Katsunori # Date 1499695791 -32400 # Node ID 774beab915fea19e4667ea1245715a2442d98eb9 # Parent b107a7660f4ea4b6a55ae314b65e5a862754f493 journal: execute setup procedures for already instantiated dirstate If dirstate is instantiated before reposetup() of journal extension, it doesn't have "journalstorage" property, even if it is instantiated via wrapdirstate() wrapping repo.dirstate(), because wrapdirstate() works as same as original one before marking repo as "journal"-ing in reposetup(). This issue can be reproduced by running test-journal.t or test-journal-share.t with fsmonitor-run-tests.py. On the other hand, just discarding already instantiated dirstate in reposetup() prevents chg from filling dirstate before reposetup() (see bf3af0eced44 for detail). Therefore, this patch executes setup procedures for already instantiated dirstate explicitly in reposetup(). To centralize setup procedures for dirstate, this patch also factors them out from wrapdirstate(). diff -r b107a7660f4e -r 774beab915fe hgext/journal.py --- a/hgext/journal.py Mon Jul 10 23:09:51 2017 +0900 +++ b/hgext/journal.py Mon Jul 10 23:09:51 2017 +0900 @@ -70,18 +70,28 @@ if repo.local(): repo.journal = journalstorage(repo) + dirstate, cached = localrepo.isfilecached(repo, 'dirstate') + if cached: + # already instantiated dirstate isn't yet marked as + # "journal"-ing, even though repo.dirstate() was already + # wrapped by own wrapdirstate() + _setupdirstate(repo, dirstate) + def runcommand(orig, lui, repo, cmd, fullargs, *args): """Track the command line options for recording in the journal""" journalstorage.recordcommand(*fullargs) return orig(lui, repo, cmd, fullargs, *args) +def _setupdirstate(repo, dirstate): + dirstate.journalstorage = repo.journal + dirstate.addparentchangecallback('journal', recorddirstateparents) + # hooks to record dirstate changes def wrapdirstate(orig, repo): """Make journal storage available to the dirstate object""" dirstate = orig(repo) if util.safehasattr(repo, 'journal'): - dirstate.journalstorage = repo.journal - dirstate.addparentchangecallback('journal', recorddirstateparents) + _setupdirstate(repo, dirstate) return dirstate def recorddirstateparents(dirstate, old, new):