[PATCH 3 of 3 RFC] revert: clear the flagstate entry when reverting a file

Adrian Klaver adrian.klaver at aklaver.com
Mon Jul 4 00:15:01 UTC 2016


I believe this and the two previous emails go here:

https://www.mercurial-scm.org/wiki/MailingLists#The_Mercurial-Devel_list

On 07/03/2016 02:44 PM, Matt Harbison wrote:
> # HG changeset patch
> # User Matt Harbison <matt_harbison at yahoo.com>
> # Date 1467574478 14400
> #      Sun Jul 03 15:34:38 2016 -0400
> # Node ID 94ecafb966d765fc05750380b706f13fadea362a
> # Parent  e6da62c6d4b29f29a1cad36e72d98d9208186e51
> revert: clear the flagstate entry when reverting a file
>
> This allows the file to resume the state manufactured from the manifest on
> platforms without native flags support.
>
> The point at which the state file is being written is when an individual file
> is reverted.  The tradeoff here is writing the state file N times vs. once.  But
> in the case of once, it would be possible for revert to say that it reverted
> some files, an error occurs causing it to bail, and then those same files have
> their old state (but I suspect wouldn't on Unix in the same scenario).
>
> I had to comment out the transaction backup because there is no transaction
> occurring at this time in revert.  I'm a bit surprised that dirstate.write() is
> forcing a transaction to be supplied, but then lets it supply None.  I didn't
> pay a lot of attention to the dirstate transaction code when it was changed, so
> I need to be clued in on how to proceed.
>
> diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
> --- a/mercurial/cmdutil.py
> +++ b/mercurial/cmdutil.py
> @@ -3247,9 +3247,12 @@
>      excluded_files = []
>      matcher_opts = {"exclude": excluded_files}
>
> +    fs = repo[None].flagstate
>      def checkout(f):
>          fc = ctx[f]
>          repo.wwrite(f, fc.data(), fc.flags())
> +        fs[f] = fc.flags()
> +        fs.write(repo.currenttransaction())  # XXX: val is None, but no warning
>
>      audit_path = pathutil.pathauditor(repo.root)
>      for f in actions['forget'][0]:
> diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py
> --- a/mercurial/scmutil.py
> +++ b/mercurial/scmutil.py
> @@ -290,7 +290,7 @@
>
>      def write(self, tr):
>          if self._dirty:
> -            tr.addbackup('flagstate')  # was fncache
> +            #tr.addbackup('flagstate')  # was fncache
>              fp = self._repo.svfs('flagstate', mode='wb', atomictemp=True)
>              try:
>                  for k, v in self._entries.iteritems():
> diff --git a/tests/test-flags2.t b/tests/test-flags2.t
> --- a/tests/test-flags2.t
> +++ b/tests/test-flags2.t
> @@ -56,11 +56,29 @@
>    $ hg files -v
>             7 x noexec.txt
>             7   noexec2.txt
> +  $ hg revert --no-backup noexec.txt
> +  $ hg files -v
> +           7   noexec.txt
> +           7   noexec2.txt
> +
> +Revert to +x
> +
> +  $ hg flags -x noexec.txt
> +  $ hg ci -m "+x"
> +  $ hg flags -n noexec.txt
> +  $ hg files -v
> +           7   noexec.txt
> +           7   noexec2.txt
> +  $ hg revert --no-backup noexec.txt
> +  $ hg files -v
> +           7 x noexec.txt
> +           7   noexec2.txt
>
>  Update -C to nuke it
> +  $ hg flags -n noexec.txt
>    $ hg update -C
>    1 files updated, 0 files merged, 0 files removed, 0 files unresolved
>    $ hg files -v
> -           7   noexec.txt
> +           7 x noexec.txt
>             7   noexec2.txt
>
> _______________________________________________
> Mercurial mailing list
> Mercurial at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial
>


-- 
Adrian Klaver
adrian.klaver at aklaver.com



More information about the Mercurial mailing list