view tests/test-commit-multiple.t @ 13731:5d0cdf4ec338

bdiff.c: use unsigned arithmetic for hash computation Signed integer overflow is undefined in C.
author Markus F.X.J. Oberhumer <markus@oberhumer.com>
date Wed, 23 Mar 2011 02:33:23 +0100
parents a464763e99f1
children 8bb03283e9b9
line wrap: on
line source

# reproduce issue2264, issue2516

create test repo
  $ cat <<EOF >> $HGRCPATH
  > [extensions]
  > transplant =
  > graphlog =
  > 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
  $ echo fix1 > bugfix
  $ echo fix1 >> file1
  $ hg ci -Am"fix 1"
  adding bugfix
  $ echo fix2 > bugfix
  $ echo fix2 >> file1
  $ hg ci -Am"fix 2"
  $ hg glog --template="$template"
  @  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)
  $ hg glog --template="$template"
  @  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__
  > from mercurial import ui, hg, match, node
  > 
  > def replacebyte(fn, b):
  >     f = open("file1", "rb+")
  >     f.seek(0, 0)
  >     f.write(b)
  >     f.close()
  > 
  > repo = hg.repository(ui.ui(), '.')
  > assert len(repo) == 6, \
  >        "initial: len(repo) == %d, expected 6" % len(repo)
  > try:
  >     wlock = repo.wlock()
  >     lock = repo.lock()
  >     m = match.exact(repo.root, '', ['file1'])
  >     replacebyte("file1", "x")
  >     n = repo.commit(text="x", user="test", date=(0, 0), match=m)
  >     print "commit 1: len(repo) == %d" % len(repo)
  >     replacebyte("file1", "y")
  >     n = repo.commit(text="y", user="test", date=(0, 0), match=m)
  >     print "commit 2: len(repo) == %d" % len(repo)
  > finally:
  >     lock.release()
  >     wlock.release()
  > __EOF__
  $ $PYTHON $TESTTMP/committwice.py
  commit 1: len(repo) == 7
  commit 2: len(repo) == 8

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
  6  x  file1
  7  y  file1