sapling/tests/test-fb-hgext-fbamend-metaedit.t
Aida Getoeva b3aa0fe52d fix metaedit for non-continuous subsets of linear commits
Summary:
Assume the stack:
```
o - C
|
o - B
|
o - A
|
o - Root
```
then if we need to metaedit commits A and B the stack becomes:
```
o - C' (metaedited)
|  o - B'
|  |
|  o - A' (metaedited)
| /
o - Root
```
This bug affects also Jellyfish while submitting the stack of commits where some commit in the middle is already assotiated with Phab diff.

The bug is caused by the logic where we firstly metaedit and rebase the commits to metaedit in their topological order and only after all their descendants. So for now the given commits are processed with their descendants in topological order to track new parents for each commit.

Reviewed By: mitrandir77

Differential Revision: D8591897

fbshipit-source-id: 330a598e084af60cff42255510aca420bfe389de
2018-06-26 06:20:45 -07:00

390 lines
8.3 KiB
Perl

$ cat >> $HGRCPATH <<EOF
> [defaults]
> fold=--date "0 0"
> metaedit=--date "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]
> rebase=
> fbamend=
> [experimental]
> evolution=createmarkers, allowunstable
> EOF
$ mkcommit() {
> echo "$1" > "$1"
> hg add "$1"
> hg ci -m "$1"
> }
$ mkstack() {
> # Creates a stack of commit based on $1 with messages from $2, $3 ..
> hg update $1 -C
> shift
> mkcommits $*
> }
$ glog() {
> hg log -G -T '{rev}:{node|short}@{branch}({phase}) {desc|firstline}\n' "$@"
> }
$ shaof() {
> hg log -T {node} -r "first(desc($1))"
> }
$ mkcommits() {
> for i in $@; do mkcommit $i ; done
> }
##########################
importing Parren test
##########################
$ cat << EOF >> $HGRCPATH
> [ui]
> logtemplate = "{rev}\t{bookmarks}: {desc|firstline} - {author|user}\n"
> EOF
HG METAEDIT
===============================
Setup the Base Repo
-------------------
We start with a plain base repo::
$ hg init $TESTTMP/metaedit; cd $TESTTMP/metaedit
$ mkcommit "ROOT"
$ hg phase --public "desc(ROOT)"
$ mkcommit "A"
$ mkcommit "B"
$ hg up "desc(A)"
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ mkcommit "C"
$ mkcommit "D"
$ echo "D'" > D
$ hg commit --amend -m "D2"
$ hg up "desc(C)"
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ mkcommit "E"
$ mkcommit "F"
Test
----
$ hg log -G
@ 7 : F - test
|
o 6 : E - test
|
| o 5 : D2 - test
|/
o 3 : C - test
|
| o 2 : B - test
|/
o 1 : A - test
|
o 0 : ROOT - test
$ hg update --clean .
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg metaedit -r 0
abort: cannot edit commit information for public revisions
[255]
$ hg metaedit --fold
abort: revisions must be specified with --fold
[255]
$ hg metaedit -r 0 --fold
abort: cannot fold public revisions
[255]
$ hg metaedit 'desc(C) + desc(F)' --fold
abort: cannot fold non-linear revisions (multiple roots given)
[255]
$ hg metaedit "desc(C)::desc(D2) + desc(E)" --fold
abort: cannot fold non-linear revisions (multiple heads given)
[255]
$ hg metaedit --user foobar -T "{nodechanges|json}\n"
{"587528abfffe33d49f94f9d6223dbbd58d6197c6": ["212b2a2b87cdbae992f001e9baba64db389fbce7"]}
$ hg log --template '{rev}: {author}\n' -r 'desc(F):' --hidden
7: test
8: foobar
$ hg log --template '{rev}: {author}\n' -r .
8: foobar
$ HGEDITOR=cat hg metaedit '.^::.' --fold
HG: This is a fold of 2 changesets.
HG: Commit message of changeset 6.
E
HG: Commit message of changeset 8.
F
HG: Enter commit message. Lines beginning with 'HG:' are removed.
HG: Leave message empty to abort commit.
HG: --
HG: user: test
HG: branch 'default'
HG: added E
HG: added F
2 changesets folded
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ glog -r .
@ 9:a08d35fd7d9d@default(draft) E
|
~
no new commit is created here because the date is the same
$ HGEDITOR=cat hg metaedit
HG: Commit message of changeset a08d35fd7d9d
E
F
HG: Enter commit message. Lines beginning with 'HG:' are removed.
HG: Leave message empty to abort commit.
HG: --
HG: user: test
HG: branch 'default'
HG: added E
HG: added F
nothing changed
[1]
$ glog -r '.^::.'
@ 9:a08d35fd7d9d@default(draft) E
|
o 3:3260958f1169@default(draft) C
|
~
TODO: don't create a new commit in this case, we should take the date of the
old commit (we add a default date with a value to show that metaedit is taking
the current date to generate the hash, this way we still have a stable hash
but highlight the bug)
$ hg metaedit --config defaults.metaedit= --config devel.default-date="42 0"
$ hg log -r '.^::.' --template '{rev}: {desc|firstline}\n'
3: C
10: E
$ hg up '.^'
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
$ hg metaedit --user foobar2 tip
$ hg log --template '{rev}: {author}\n' -r "user(foobar):" --hidden
8: foobar
9: test
10: test
11: foobar2
$ hg diff -r "10" -r "11" --hidden
'fold' one commit
$ hg metaedit "desc(D2)" --fold --user foobar3
1 changesets folded
$ hg log -r "tip" --template '{rev}: {author}\n'
12: foobar3
metaedit a commit in the middle of the stack:
$ cd $TESTTMP
$ hg init metaedit2
$ cd metaedit2
$ hg debugbuilddag '+5'
$ hg update tip
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ glog -r 'all()'
@ 4:bebd167eb94d@default(draft) r4
|
o 3:2dc09a01254d@default(draft) r3
|
o 2:01241442b3c2@default(draft) r2
|
o 1:66f7d451a68b@default(draft) r1
|
o 0:1ea73414a91b@default(draft) r0
$ hg metaedit -m "metaedit" -r 2
$ glog -r 'all()'
@ 7:8c1f124031e7@default(draft) r4
|
o 6:af1447d6a312@default(draft) r3
|
o 5:1aed0f31debd@default(draft) metaedit
|
o 1:66f7d451a68b@default(draft) r1
|
o 0:1ea73414a91b@default(draft) r0
$ hg metaedit -m "metaedit" -r 1aed0f31debd
nothing changed
[1]
metaedit more than one commit at once without --fold
$ hg metaedit -m "metaedit" -r 5::
$ glog -r 'all()'
@ 9:972f190d63f3@default(draft) metaedit
|
o 8:a1c80e4c2636@default(draft) metaedit
|
o 5:1aed0f31debd@default(draft) metaedit
|
o 1:66f7d451a68b@default(draft) r1
|
o 0:1ea73414a91b@default(draft) r0
make the top commit non-empty
$ echo xx > xx
$ hg add xx
$ hg amend
$ glog -r 'all()'
@ 10:90ef4d40a825@default(draft) metaedit
|
o 8:a1c80e4c2636@default(draft) metaedit
|
o 5:1aed0f31debd@default(draft) metaedit
|
o 1:66f7d451a68b@default(draft) r1
|
o 0:1ea73414a91b@default(draft) r0
test histedit compat
$ echo '[extensions]' >> $HGRCPATH
$ echo "fbhistedit=" >> $HGRCPATH
$ echo "histedit=" >> $HGRCPATH
$ hg export -r .
# HG changeset patch
# User debugbuilddag
# Date 0 0
# Thu Jan 01 00:00:00 1970 +0000
# Node ID 90ef4d40a82572a220d8329eefb1d96a1fac3597
# Parent a1c80e4c26360f913ae3bdc5c70d6f29d465bfb0
metaedit
diff --git a/xx b/xx
new file mode 100644
--- /dev/null
+++ b/xx
@@ -0,0 +1,1 @@
+xx
$ hg histedit ".^^" --commands - <<EOF
> pick 1aed0f31debd
> x hg metaedit -m "histedit test"
> x hg commit --amend -m 'message from exec'
> pick a1c80e4c2636
> pick 90ef4d40a825
> EOF
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
a1c80e4c2636: skipping changeset (no changes)
$ glog -r 'all()'
@ 13:942d79297adf@default(draft) metaedit
|
o 12:b5e5d076151f@default(draft) message from exec
|
o 1:66f7d451a68b@default(draft) r1
|
o 0:1ea73414a91b@default(draft) r0
metaedit noncontinuous set of commits in the stack:
$ cd $TESTTMP
$ hg init metaeditnoncontinues
$ cd metaeditnoncontinues
$ hg debugbuilddag '+5'
$ hg update tip
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ glog -r 'all()'
@ 4:bebd167eb94d@default(draft) r4
|
o 3:2dc09a01254d@default(draft) r3
|
o 2:01241442b3c2@default(draft) r2
|
o 1:66f7d451a68b@default(draft) r1
|
o 0:1ea73414a91b@default(draft) r0
$ hg metaedit -m "metaedit" 0 2 4
$ glog -r 'all()'
@ 9:2b037168acb5@default(draft) metaedit
|
o 8:1a9c34db0e76@default(draft) r3
|
o 7:4d7251aa2bec@default(draft) metaedit
|
o 6:16ad2130f633@default(draft) r1
|
o 5:e37e0d87697f@default(draft) metaedit
Test copying obsmarkers
$ hg init $TESTTMP/autorel
$ cd $TESTTMP/autorel
$ hg debugdrawdag<<'EOS'
> D
> |
> C C1 # amend: C -> C1
> |/
> B
> |
> A
> EOS
$ hg metaedit -r B -m B1
$ rm .hg/localtags
$ glog -r 'all()'
o 8:52bc6136aa97@default(draft) D
|
| o 7:1be7301b35ae@default(draft) C1
| |
x | 6:19437442f9e4@default(draft) C
|/
o 5:888bb4818188@default(draft) B1
|
o 0:426bada5c675@default(draft) A
$ hg log -r 'successors(19437442f9e4)-19437442f9e4' -T '{node}\n'
1be7301b35ae8ac3543a07a5d0ce5ca615be709f
$ hg log -r 'precursors(19437442f9e4)-19437442f9e4' -T '{desc} {node}\n' --hidden
C 26805aba1e600a82e93661149f2313866a221a7b