Mercurial > evolve
changeset 137:bbc653876876
fix evolve test
author | Pierre-Yves David <pierre-yves.david@logilab.fr> |
---|---|
date | Fri, 17 Feb 2012 19:01:25 +0100 |
parents | 915728be8afd |
children | 605ed785268a |
files | hgext/evolve.py tests/test-evolution.t tests/test-evolve.t |
diffstat | 3 files changed, 282 insertions(+), 243 deletions(-) [+] |
line wrap: on
line diff
--- a/hgext/evolve.py Fri Feb 17 17:55:12 2012 +0100 +++ b/hgext/evolve.py Fri Feb 17 19:01:25 2012 +0100 @@ -156,20 +156,34 @@ cmdtable = {} command = cmdutil.command(cmdtable) -@command('^evolve', +@command('^stabilize', [], '') -def evolve(ui, repo): +def stabilize(ui, repo): """suggest the next evolution step""" obsolete = extensions.find('obsolete') - next = min(obsolete.unstables(repo)) + unstable = repo.revs('unstable()') + if not unstable: + ui.write_err(_('no unstable changeset\n')) + return 1 + next = unstable[0] obs = repo[next].parents()[0] if not obs.obsolete(): obs = next.parents()[1] assert obs.obsolete() newer = obsolete.newerversion(repo, obs.node()) - target = newer[-1] - repo.ui.status('hg relocate --rev %s %s\n' % (repo[next], repo[target])) + if len(newer) > 1: + ui.write_err(_("conflict rewriting. can't choose destination\n")) + return 2 + targets = newer[0] + if not targets: + ui.write_err(_("does not handle kill parent yet\n")) + return 2 + if len(targets) > 1: + ui.write_err(_("does not handle splitted parent yet\n")) + return 2 + target = targets[0] + repo.ui.status('hg rebase -Dr %s -d %s\n' % (repo[next], repo[target])) shorttemplate = '[{rev}] {desc|firstline}\n' @@ -355,15 +369,25 @@ lock.release() def commitwrapper(orig, ui, repo, *arg, **kwargs): - obsoleted = kwargs.get('obsolete', []) - if obsoleted: - obsoleted = repo.set('%lr', obsoleted) - result = orig(ui, repo, *arg, **kwargs) - if not result: # commit successed - new = repo['-1'] - for old in obsoleted: - repo.addobsolete(new.node(), old.node()) - return result + lock = repo.lock() + try: + obsoleted = kwargs.get('obsolete', []) + if obsoleted: + obsoleted = repo.set('%lr', obsoleted) + result = orig(ui, repo, *arg, **kwargs) + if not result: # commit successed + new = repo['-1'] + oldbookmarks = [] + for old in obsoleted: + oldbookmarks.extend(repo.nodebookmarks(old.node())) + repo.addobsolete(new.node(), old.node()) + for book in oldbookmarks: + repo._bookmarks[book] = new.node() + if oldbookmarks: + bookmarks.write(repo) + return result + finally: + lock.release() def graftwrapper(orig, ui, repo, *revs, **kwargs): lock = repo.lock()
--- a/tests/test-evolution.t Fri Feb 17 17:55:12 2012 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,229 +0,0 @@ - $ cat >> $HGRCPATH <<EOF - > [defaults] - > amend=-d "0 0" - > [web] - > push_ssl = false - > allow_push = * - > [phases] - > publish = False - > [alias] - > qlog = log --template='{rev} - {node|short} {desc} ({phase})\n' - > [diff] - > git = 1 - > unified = 0 - > [extensions] - > hgext.rebase= - > hgext.graphlog= - > EOF - $ echo "obsolete=$(echo $(dirname $TESTDIR))/hgext/obsolete.py" >> $HGRCPATH - $ echo "evolution=$(echo $(dirname $TESTDIR))/hgext/evolution.py" >> $HGRCPATH - $ mkcommit() { - > echo "$1" > "$1" - > hg add "$1" - > hg ci -m "add $1" - > } - -various init - - $ hg init local - $ cd local - $ mkcommit a - $ mkcommit b - $ cat >> .hg/hgrc << EOF - > [phases] - > publish = True - > EOF - $ hg pull -q . # make 1 public - $ rm .hg/hgrc - $ mkcommit c - $ mkcommit d - $ hg up 1 - 0 files updated, 0 files merged, 2 files removed, 0 files unresolved - $ mkcommit e -q - created new head - $ mkcommit f - $ hg qlog - 5 - e44648563c73 add f (1) - 4 - fbb94e3a0ecf add e (1) - 3 - 47d2a3944de8 add d (1) - 2 - 4538525df7e2 add c (1) - 1 - 7c3bad9141dc add b (0) - 0 - 1f0dee641bb7 add a (0) - -test simple kill - - $ hg kill 5 - 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - working directory now at fbb94e3a0ecf - $ hg qlog - 4 - fbb94e3a0ecf add e (1) - 3 - 47d2a3944de8 add d (1) - 2 - 4538525df7e2 add c (1) - 1 - 7c3bad9141dc add b (0) - 0 - 1f0dee641bb7 add a (0) - -test multiple kill - - $ hg kill 4 3 - 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - working directory now at 7c3bad9141dc - $ hg qlog - 2 - 4538525df7e2 add c (1) - 1 - 7c3bad9141dc add b (0) - 0 - 1f0dee641bb7 add a (0) - $ cd .. - -########################## -importing Parren test -########################## - - $ cat << EOF >> $HGRCPATH - > [ui] - > logtemplate = "{rev}\t{bookmarks}: {desc|firstline} - {author|user}\n" - > EOF - -Creating And Updating Changeset -=============================== - -Setup the Base Repo -------------------- - -We start with a plain base repo:: - - $ hg init main; cd main - $ cat >main-file-1 <<-EOF - > One - > - > Two - > - > Three - > EOF - $ echo Two >main-file-2 - $ hg add - adding main-file-1 - adding main-file-2 - $ hg commit --message base - $ cd .. - -and clone this into a new repo where we do our work:: - - $ hg clone main work - updating to branch default - 2 files updated, 0 files merged, 0 files removed, 0 files unresolved - $ cd work - - -Create First Patch ------------------- - -To begin with, we just do the changes that will be the initial version of the changeset:: - - $ echo One >file-from-A - $ sed -i'' -e s/One/Eins/ main-file-1 - $ hg add file-from-A - -So this is what we would like our changeset to be:: - - $ hg diff - diff --git a/file-from-A b/file-from-A - new file mode 100644 - --- /dev/null - +++ b/file-from-A - @@ -0,0 +1,1 @@ - +One - diff --git a/main-file-1 b/main-file-1 - --- a/main-file-1 - +++ b/main-file-1 - @@ -1,1 +1,1 @@ - -One - +Eins - -To commit it we just - commit it:: - - $ hg commit --message "a nifty feature" - -and place a bookmark so we can easily refer to it again (which we could have done before the commit):: - - $ hg book feature-A - - -Create Second Patch -------------------- - -Let's do this again for the second changeset:: - - $ echo Two >file-from-B - $ sed -i'' -e s/Two/Zwie/ main-file-1 - $ hg add file-from-B - -Before committing, however, we need to switch to a new bookmark for the second -changeset. Otherwise we would inadvertently move the bookmark for our first changeset. -It is therefore advisable to always set the bookmark before committing:: - - $ hg book feature-B - $ hg commit --message "another feature" - -So here we are:: - - $ hg book - feature-A 1:568a468b60fc - * feature-B 2:7b36850622b2 - - -Fix The Second Patch --------------------- - -There's a typo in feature-B. We spelled *Zwie* instead of *Zwei*:: - - $ hg diff --change tip | grep -F Zwie - +Zwie - -Fixing this is very easy. Just change:: - - $ sed -i'' -e s/Zwie/Zwei/ main-file-1 - -and **amend**:: - - $ hg amend --note "fix spelling of Zwei" - -The `--note` is our commit message for the *update* only. So its only purpose -is to document the evolution of the changeset. If we use `--message` with -`amend`, it replaces the commit message of the changeset itself. - -This results in a new single changeset for our amended changeset, and the old -changeset plus the updating changeset are hidden from view by default:: - - $ hg log - 4 feature-B: another feature - test - 1 feature-A: a nifty feature - test - 0 : base - test - - $ hg up feature-A -q - $ sed -i'' -e s/Eins/Un/ main-file-1 - - $ hg amend --note 'french looks better' - $ hg log - 6 feature-A: a nifty feature - test - 4 feature-B: another feature - test - 1 : a nifty feature - test - 0 : base - test - $ hg evolve - hg relocate --rev f8111a076f09 23409eba69a0 - $ hg up feature-B -q #prevent feature-A bookmark to move grml - $ hg relocate -r 4 6 --traceback - merging main-file-1 - $ hg log - 7 feature-B: another feature - test - 6 feature-A: a nifty feature - test - 0 : base - test - -Test commit -o options - - $ hg up 6 - $ hg revert -r 7 --all - $ sed -i'' -e s/Zwei/deux/ main-file-1 - $ hg commit -m 'Feature B' -o 7 - $ hg log - 8 feature-B: another feature - test - 6 feature-A: a nifty feature - test - 0 : base - test
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-evolve.t Fri Feb 17 19:01:25 2012 +0100 @@ -0,0 +1,244 @@ + $ cat >> $HGRCPATH <<EOF + > [defaults] + > amend=-d "0 0" + > [web] + > push_ssl = false + > allow_push = * + > [phases] + > publish = False + > [alias] + > qlog = log --template='{rev} - {node|short} {desc} ({phase})\n' + > [diff] + > git = 1 + > unified = 0 + > [extensions] + > hgext.rebase= + > hgext.graphlog= + > EOF + $ echo "obsolete=$(echo $(dirname $TESTDIR))/hgext/obsolete.py" >> $HGRCPATH + $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH + $ mkcommit() { + > echo "$1" > "$1" + > hg add "$1" + > hg ci -m "add $1" + > } + +various init + + $ hg init local + $ cd local + $ mkcommit a + $ mkcommit b + $ cat >> .hg/hgrc << EOF + > [phases] + > publish = True + > EOF + $ hg pull -q . # make 1 public + $ rm .hg/hgrc + $ mkcommit c + $ mkcommit d + $ hg up 1 + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ mkcommit e -q + created new head + $ mkcommit f + $ hg qlog + 5 - e44648563c73 add f (draft) + 4 - fbb94e3a0ecf add e (draft) + 3 - 47d2a3944de8 add d (draft) + 2 - 4538525df7e2 add c (draft) + 1 - 7c3bad9141dc add b (public) + 0 - 1f0dee641bb7 add a (public) + +test simple kill + + $ hg kill 5 + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + working directory now at fbb94e3a0ecf + $ hg qlog + 4 - fbb94e3a0ecf add e (draft) + 3 - 47d2a3944de8 add d (draft) + 2 - 4538525df7e2 add c (draft) + 1 - 7c3bad9141dc add b (public) + 0 - 1f0dee641bb7 add a (public) + +test multiple kill + + $ hg kill 4 3 + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + working directory now at 7c3bad9141dc + $ hg qlog + 2 - 4538525df7e2 add c (draft) + 1 - 7c3bad9141dc add b (public) + 0 - 1f0dee641bb7 add a (public) + $ cd .. + +########################## +importing Parren test +########################## + + $ cat << EOF >> $HGRCPATH + > [ui] + > logtemplate = "{rev}\t{bookmarks}: {desc|firstline} - {author|user}\n" + > EOF + +Creating And Updating Changeset +=============================== + +Setup the Base Repo +------------------- + +We start with a plain base repo:: + + $ hg init main; cd main + $ cat >main-file-1 <<-EOF + > One + > + > Two + > + > Three + > EOF + $ echo Two >main-file-2 + $ hg add + adding main-file-1 + adding main-file-2 + $ hg commit --message base + $ cd .. + +and clone this into a new repo where we do our work:: + + $ hg clone main work + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cd work + + +Create First Patch +------------------ + +To begin with, we just do the changes that will be the initial version of the changeset:: + + $ echo One >file-from-A + $ sed -i'' -e s/One/Eins/ main-file-1 + $ hg add file-from-A + +So this is what we would like our changeset to be:: + + $ hg diff + diff --git a/file-from-A b/file-from-A + new file mode 100644 + --- /dev/null + +++ b/file-from-A + @@ -0,0 +1,1 @@ + +One + diff --git a/main-file-1 b/main-file-1 + --- a/main-file-1 + +++ b/main-file-1 + @@ -1,1 +1,1 @@ + -One + +Eins + +To commit it we just - commit it:: + + $ hg commit --message "a nifty feature" + +and place a bookmark so we can easily refer to it again (which we could have done before the commit):: + + $ hg book feature-A + + +Create Second Patch +------------------- + +Let's do this again for the second changeset:: + + $ echo Two >file-from-B + $ sed -i'' -e s/Two/Zwie/ main-file-1 + $ hg add file-from-B + +Before committing, however, we need to switch to a new bookmark for the second +changeset. Otherwise we would inadvertently move the bookmark for our first changeset. +It is therefore advisable to always set the bookmark before committing:: + + $ hg book feature-B + $ hg commit --message "another feature" + +So here we are:: + + $ hg book + feature-A 1:568a468b60fc + * feature-B 2:7b36850622b2 + + +Fix The Second Patch +-------------------- + +There's a typo in feature-B. We spelled *Zwie* instead of *Zwei*:: + + $ hg diff --change tip | grep -F Zwie + +Zwie + +Fixing this is very easy. Just change:: + + $ sed -i'' -e s/Zwie/Zwei/ main-file-1 + +and **amend**:: + + $ hg amend --note "fix spelling of Zwei" + +The `--note` is our commit message for the *update* only. So its only purpose +is to document the evolution of the changeset. If we use `--message` with +`amend`, it replaces the commit message of the changeset itself. + +This results in a new single changeset for our amended changeset, and the old +changeset plus the updating changeset are hidden from view by default:: + + $ hg log + 4 feature-B: another feature - test + 1 feature-A: a nifty feature - test + 0 : base - test + + $ hg up feature-A -q + $ sed -i'' -e s/Eins/Un/ main-file-1 + + $ hg amend --note 'french looks better' + $ hg log + 6 feature-A: a nifty feature - test + 4 feature-B: another feature - test + 1 : a nifty feature - test + 0 : base - test + $ hg stabilize + hg rebase -Dr f8111a076f09 -d 23409eba69a0 + $ hg up null -q #prevent feature-A bookmark to move # XXX grml + $ hg bookmark + feature-A 6:23409eba69a0 + feature-B 4:f8111a076f09 + $ hg up 6 + 3 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg bookmark + feature-A 6:23409eba69a0 + feature-B 4:f8111a076f09 + $ hg bookmark -if feature-A + $ hg graft -O 4 + grafting revision 4 + merging main-file-1 + $ hg bookmark -ifr 7 feature-B # XXX not bookmark support in rebase --keep :-/ + $ hg log + 7 feature-B: another feature - test + 6 feature-A: a nifty feature - test + 0 : base - test + +Test commit -o options + + $ hg up 6 + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg revert -r 7 --all + adding file-from-B + reverting main-file-1 + $ sed -i'' -e s/Zwei/deux/ main-file-1 + $ hg commit -m 'another feature that rox' -o 7 + created new head + $ hg log + 8 feature-B: another feature that rox - test + 6 feature-A: a nifty feature - test + 0 : base - test