[PATCH 4 of 4 evolve-ext] evolve: add --rev option to the evolve command
Laurent Charignon
lcharignon at fb.com
Tue May 5 17:52:22 CDT 2015
On 5/5/15, 3:18 PM, "Pierre-Yves David" <pierre-yves.david at ens-lyon.org>
wrote:
>
>
>On 05/05/2015 02:29 PM, Laurent Charignon wrote:
>> # HG changeset patch
>> # User Laurent Charignon <lcharignon at fb.com>
>> # Date 1430861159 25200
>> # Tue May 05 14:25:59 2015 -0700
>> # Node ID 0e29ac55b21ab929cca0d68045a98c490a6bac23
>> # Parent 0af82f6387fce507cd856aa0866534af0be65c98
>> evolve: add --rev option to the evolve command
>>
>> This patch is part of a series of patches to refactor the evolve method
>>and
>> make it more readable. We introduce a new --rev flag to specify a revset
>> where to solve the troubles instead of looking from the parent
>>changeset.
>> All add a test checks that --rev works with several commits
>>
>> diff --git a/hgext/evolve.py b/hgext/evolve.py
>> --- a/hgext/evolve.py
>> +++ b/hgext/evolve.py
>> @@ -1213,12 +1213,14 @@
>> else:
>> ui.write_err(_('no troubled changesets\n'))
>> return 1
>> +
>> @command('^evolve|stabilize|solve',
>> [('n', 'dry-run', False,
>> 'do not perform actions, just print what would be done'),
>> ('', 'confirm', False,
>> 'ask for confirmation before performing the action'),
>> ('A', 'any', False, 'also consider troubled changesets unrelated
>>to current working directory'),
>> + ('r', 'rev', '', 'revset to find troubles in'),
>
>Not sure if using "revset" is very clear here. you usually just talk
>about "revs". What about
>
> 'revisions to be evolved'
>
>or
>
> 'solves troubles of theses revisions'
>
>> ('a', 'all', False, 'evolve all troubled changesets in the repo '
>> '(implies any)'),
>> ('c', 'continue', False, 'continue an interrupted evolution'),
>> @@ -1249,12 +1251,14 @@
>> The working directory is updated to the newly created revision.
>> """
>>
>> + # Options
>> contopt = opts['continue']
>> anyopt = opts['any']
>> allopt = opts['all']
>> startnode = repo['.']
>> dryrunopt = opts['dry_run']
>> confirmopt = opts['confirm']
>> + revopt = opts['rev']
>> ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), 'evolve')
>> troubled = set(repo.revs('troubled()'))
>>
>> @@ -1264,7 +1268,7 @@
>> showprogress = allopt
>>
>> def progresscb():
>> - if allopt:
>> + if revopt or allopt:
>> ui.progress('evolve', seen, unit='changesets',
>>total=count)
>>
>> def cleanup(ui, repo, startnode, showprogress):
>> @@ -1281,9 +1285,25 @@
>> raise util.Abort('cannot specify both "--all" and
>>"--continue"')
>> graftcmd = commands.table['graft'][0]
>> return graftcmd(ui, repo, old_obsolete=True, **{'continue':
>>True})
>> -
>> + # Rev specified on the commands line
>> + if revopt:
>> + revs = set(repo.revs(revopt))
>> + troubled = set(repo.revs('troubled()'))
>> + _revs = revs & troubled
>> + if not _revs:
>> + ui.write_err("No troubled changes in the specified revset")
>> + else:
>> + # For the progress bar to show
>> + count = len(_revs)
>> + for rev in _revs:
>> + progresscb()
>> + _solveone(ui, repo, repo[rev], dryrunopt, confirmopt,
>> + progresscb)
>> + seen += 1
>> + progresscb()
>> + cleanup(ui, repo, startnode, showprogress)
>> + return
>
>I'm a bit sad to see a whole new block added instead of moving to a:
>
>1) list revision we need to evolve
>1.a) if --rev, then use this list (well, all unstable in it).
>1.b) if --all, then use all unstables.
>2.c) else just pick the next one.
>
>This approach would probably cause a couple of issue where evolve won't
>evolve everything (case where stuff are evolved in the wrong order,
>multiple troubles on a revision, etc), but is would more in the right
>direction.
>
>I would be okay with evolve --all "regressing" for such corner case
>during a couple of revision in such case is it help moving in the right
>direction and we have the rest of the stack making things up to a
>sensible behavior.
>In all case you planning to unify the case soon, taking the above corner
>case in consideration ?
I am actually doing exactly what you describe in the patch series coming
up after :).
I just wanted to do it bit by bit as we usually do.
>
>(also, usual growling about 'return' statement in the middle of a
>function)
>
>
>> nexttrouble = _picknexttroubled(ui, repo, anyopt or allopt)
>> -
>> # No trouble to resolve
>> if not nexttrouble:
>> return handlenotrouble(ui, repo, startnode, dryrunopt)
>> diff --git a/tests/test-evolve.t b/tests/test-evolve.t
>> --- a/tests/test-evolve.t
>> +++ b/tests/test-evolve.t
>> @@ -887,3 +887,140 @@
>> working directory is now at f37ed7a60f43
>> $ ls .hg/bookmarks*
>> .hg/bookmarks
>> +
>> +Possibility to select what trouble to solve first, asking for bumped
>>before
>> +divergent
>> + $ hg up 10
>> + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
>> + $ hg revert -r 11 --all
>> + reverting a
>> + $ hg log -G --template '{rev} [{branch}] {desc|firstline}\n'
>> + o 11 [mybranch] a2
>> + |
>> + @ 10 [default] a1__
>> + |
>> + | o 9 [mybranch] a3
>> + | |
>> + | x 8 [mybranch] a2
>> + | |
>> + | x 7 [default] a1_
>> + |/
>> + o 0 [default] a0
>> +
>> + $ echo "hello world" > newfile
>> + $ hg add newfile
>> + $ hg commit -m "add new file bumped" -o 11
>> + $ hg phase --hidden --public 11
>> + 1 new bumped changesets
>> + $ hg glog
>> + @ 12 : add new file bumped - test
>> + |
>> + | o 11 : a2 - test
>> + |/
>> + o 10 testbookmark: a1__ - test
>> + |
>> + | o 9 : a3 - test
>> + | |
>> + | x 8 : a2 - test
>> + | |
>> + | x 7 : a1_ - test
>> + |/
>> + o 0 : a0 - test
>> +
>> +
>> +Now we have a bumped and an unstable changeset, we solve the bumped
>>first
>> +normally the unstable changeset would be solve first
>> +
>> + $ hg glog
>> + @ 12 : add new file bumped - test
>> + |
>> + | o 11 : a2 - test
>> + |/
>> + o 10 testbookmark: a1__ - test
>> + |
>> + | o 9 : a3 - test
>> + | |
>> + | x 8 : a2 - test
>> + | |
>> + | x 7 : a1_ - test
>> + |/
>> + o 0 : a0 - test
>> +
>> + $ hg evolve -r 12 --hidden
>
>You should not need the --hidden there.
>
>> + recreate:[12] add new file bumped
>> + atop:[11] a2
>> + computing new diff
>> + committed as d66b1e328488
>> + working directory is now at d66b1e328488
>> + $ hg evolve --any
>> + move:[9] a3
>> + atop:[13] bumped update to f37ed7a60f43:
>> + working directory is now at 7d2ce5f38f9b
>> +Check that we can resolve troubles in a revset with more than one
>>commit
>
>What is the current implementation behavior is there is multiple
>troubles on a the changeset in --rev. What is your final plan?
>
>> + $ hg up 14 -C
>> + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
>> + $ mkcommit gg
>> + $ hg up 14
>> + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
>> + $ mkcommit gh
>> + created new head
>> + $ hg up 14
>> + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
>> + $ echo "newline\nnewline" >> a
>> + $ hg glog
>> + o 16 : add gh - test
>> + |
>> + | o 15 : add gg - test
>> + |/
>> + @ 14 : a3 - test
>> + |
>> + o 13 : bumped update to f37ed7a60f43: - test
>> + |
>> + o 11 : a2 - test
>> + |
>> + o 10 testbookmark: a1__ - test
>> + |
>> + o 0 : a0 - test
>> +
>> + $ hg amend
>> + 2 new unstable changesets
>> + $ hg glog
>> + @ 18 : a3 - test
>> + |
>> + | o 16 : add gh - test
>> + | |
>> + | | o 15 : add gg - test
>> + | |/
>> + | x 14 : a3 - test
>> + |/
>> + o 13 : bumped update to f37ed7a60f43: - test
>> + |
>> + o 11 : a2 - test
>> + |
>> + o 10 testbookmark: a1__ - test
>> + |
>> + o 0 : a0 - test
>> +
>> + $ hg evolve --rev "14::" --hidden
>
>Same non-necessary --hidden things
>
>> + move:[16] add gh
>> + atop:[18] a3
>> + move:[15] add gg
>> + atop:[18] a3
>> + working directory is now at 10ffdd7e3cc9
>> + $ hg glog
>> + @ 20 : add gg - test
>> + |
>> + | o 19 : add gh - test
>> + |/
>> + o 18 : a3 - test
>> + |
>> + o 13 : bumped update to f37ed7a60f43: - test
>> + |
>> + o 11 : a2 - test
>> + |
>> + o 10 testbookmark: a1__ - test
>> + |
>> + o 0 : a0 - test
>> +
>> +
>> +
>
>--
>Pierre-Yves David
More information about the Mercurial-devel
mailing list