test-commit-multiple.t
132 lines
| 3.7 KiB
| text/troff
|
Tads3Lexer
/ tests / test-commit-multiple.t
Greg Ward
|
r13704 | # reproduce issue2264, issue2516 | ||
create test repo | ||||
$ cat <<EOF >> $HGRCPATH | ||||
> [extensions] | ||||
> transplant = | ||||
> EOF | ||||
$ hg init repo | ||||
$ cd repo | ||||
$ template="{rev} {desc|firstline} [{branch}]\n" | ||||
# we need to start out with two changesets on the default branch | ||||
# in order to avoid the cute little optimization where transplant | ||||
# pulls rather than transplants | ||||
add initial changesets | ||||
$ echo feature1 > file1 | ||||
$ hg ci -Am"feature 1" | ||||
adding file1 | ||||
$ echo feature2 >> file2 | ||||
$ hg ci -Am"feature 2" | ||||
adding file2 | ||||
# The changes to 'bugfix' are enough to show the bug: in fact, with only | ||||
# those changes, it's a very noisy crash ("RuntimeError: nothing | ||||
# committed after transplant"). But if we modify a second file in the | ||||
# transplanted changesets, the bug is much more subtle: transplant | ||||
# silently drops the second change to 'bugfix' on the floor, and we only | ||||
# see it when we run 'hg status' after transplanting. Subtle data loss | ||||
# bugs are worse than crashes, so reproduce the subtle case here. | ||||
commit bug fixes on bug fix branch | ||||
$ hg branch fixes | ||||
marked working directory as branch fixes | ||||
Matt Mackall
|
r15615 | (branches are permanent and global, did you want a bookmark?) | ||
Greg Ward
|
r13704 | $ echo fix1 > bugfix | ||
$ echo fix1 >> file1 | ||||
$ hg ci -Am"fix 1" | ||||
adding bugfix | ||||
$ echo fix2 > bugfix | ||||
$ echo fix2 >> file1 | ||||
$ hg ci -Am"fix 2" | ||||
Martin Geisler
|
r20117 | $ hg log -G --template="$template" | ||
Greg Ward
|
r13704 | @ 3 fix 2 [fixes] | ||
| | ||||
o 2 fix 1 [fixes] | ||||
| | ||||
o 1 feature 2 [default] | ||||
| | ||||
o 0 feature 1 [default] | ||||
transplant bug fixes onto release branch | ||||
$ hg update 0 | ||||
1 files updated, 0 files merged, 2 files removed, 0 files unresolved | ||||
$ hg branch release | ||||
marked working directory as branch release | ||||
$ hg transplant 2 3 | ||||
applying [0-9a-f]{12} (re) | ||||
[0-9a-f]{12} transplanted to [0-9a-f]{12} (re) | ||||
applying [0-9a-f]{12} (re) | ||||
[0-9a-f]{12} transplanted to [0-9a-f]{12} (re) | ||||
Martin Geisler
|
r20117 | $ hg log -G --template="$template" | ||
Greg Ward
|
r13704 | @ 5 fix 2 [release] | ||
| | ||||
o 4 fix 1 [release] | ||||
| | ||||
| o 3 fix 2 [fixes] | ||||
| | | ||||
| o 2 fix 1 [fixes] | ||||
| | | ||||
| o 1 feature 2 [default] | ||||
|/ | ||||
o 0 feature 1 [default] | ||||
$ hg status | ||||
$ hg status --rev 0:4 | ||||
M file1 | ||||
A bugfix | ||||
$ hg status --rev 4:5 | ||||
M bugfix | ||||
M file1 | ||||
now test that we fixed the bug for all scripts/extensions | ||||
$ cat > $TESTTMP/committwice.py <<__EOF__ | ||||
Matt Harbison
|
r40405 | > import time | ||
> from mercurial import hg, match, node, ui as uimod | ||||
Greg Ward
|
r13704 | > | ||
> def replacebyte(fn, b): | ||||
Adrian Buehlmann
|
r13749 | > f = open(fn, "rb+") | ||
Greg Ward
|
r13704 | > f.seek(0, 0) | ||
> f.write(b) | ||||
> f.close() | ||||
> | ||||
Adrian Buehlmann
|
r13749 | > def printfiles(repo, rev): | ||
Yuya Nishihara
|
r36803 | > repo.ui.status(b"revision %d files: [%s]\n" | ||
> % (rev, b', '.join(b"'%s'" % f | ||||
> for f in repo[rev].files()))) | ||||
Adrian Buehlmann
|
r13749 | > | ||
Matt Harbison
|
r40405 | > repo = hg.repository(uimod.ui.load(), b'.') | ||
FUJIWARA Katsunori
|
r41986 | > assert len(repo) == 6, "initial: len(repo): %d, expected: 6" % len(repo) | ||
Adrian Buehlmann
|
r13749 | > | ||
Yuya Nishihara
|
r36803 | > replacebyte(b"bugfix", b"u") | ||
Matt Harbison
|
r40405 | > time.sleep(2) | ||
Greg Ward
|
r13704 | > try: | ||
Yuya Nishihara
|
r36803 | > repo.ui.status(b"PRE: len(repo): %d\n" % len(repo)) | ||
Greg Ward
|
r13704 | > wlock = repo.wlock() | ||
> lock = repo.lock() | ||||
Yuya Nishihara
|
r36803 | > replacebyte(b"file1", b"x") | ||
> repo.commit(text=b"x", user=b"test", date=(0, 0)) | ||||
> replacebyte(b"file1", b"y") | ||||
> repo.commit(text=b"y", user=b"test", date=(0, 0)) | ||||
> repo.ui.status(b"POST: len(repo): %d\n" % len(repo)) | ||||
Greg Ward
|
r13704 | > finally: | ||
> lock.release() | ||||
> wlock.release() | ||||
Adrian Buehlmann
|
r13749 | > printfiles(repo, 6) | ||
> printfiles(repo, 7) | ||||
Greg Ward
|
r13704 | > __EOF__ | ||
Matt Harbison
|
r39743 | $ "$PYTHON" $TESTTMP/committwice.py | ||
Adrian Buehlmann
|
r13749 | PRE: len(repo): 6 | ||
POST: len(repo): 8 | ||||
revision 6 files: ['bugfix', 'file1'] | ||||
revision 7 files: ['file1'] | ||||
Greg Ward
|
r13704 | |||
Do a size-preserving modification outside of that process | ||||
$ echo abcd > bugfix | ||||
$ hg status | ||||
M bugfix | ||||
$ hg log --template "{rev} {desc} {files}\n" -r5: | ||||
5 fix 2 bugfix file1 | ||||
Adrian Buehlmann
|
r13749 | 6 x bugfix file1 | ||
Greg Ward
|
r13704 | 7 y file1 | ||
Mads Kiilerich
|
r16913 | |||
$ cd .. | ||||