view tests/test-relink.t @ 14050:9e8a9d45945c stable

subrepo: handle svn tracked/unknown directory collisions This happens more often than expected. Say you have an svn subrepository with python code. Python would have generated unknown .pyc files. Now, you rebase this setup on a revision where a directory containing python code does not exist. Subversion is first asked to remove this directory when updating, but will not because it contains untracked items. Then it will have to bring back the directory after the merge but will fail because it now collides with an untracked directory. Using --force is not very elegant and only works with svn >= 1.5 but the only alternative I can think of is to write our own purge command for subversion.
author Patrick Mezard <pmezard@gmail.com>
date Fri, 04 Mar 2011 14:00:49 +0100
parents b69102740e57
children a73f38d8bbdb
line wrap: on
line source

  $ echo "[extensions]" >> $HGRCPATH
  $ echo "relink=" >> $HGRCPATH

  $ fix_path() {
  >     tr '\\' /
  > }

  $ cat > arelinked.py <<EOF
  > import sys, os
  > from mercurial import util
  > path1, path2 = sys.argv[1:3]
  > if util.samefile(path1, path2):
  >     print '%s == %s' % (path1, path2)
  > else:
  >     print '%s != %s' % (path1, path2)
  > EOF


create source repository

  $ hg init repo
  $ cd repo
  $ echo '[ui]' > .hg/hgrc
  $ echo 'username= A. Foo <a.foo@bar.com>' >> .hg/hgrc
  $ echo a > a
  $ echo b > b
  $ hg ci -Am addfile
  adding a
  adding b
  $ echo a >> a
  $ echo a >> b
  $ hg ci -Am changefiles

don't sit forever trying to double-lock the source repo

  $ hg relink .
  relinking $TESTTMP/repo/.hg/store to $TESTTMP/repo/.hg/store
  there is nothing to relink

Test files are read in binary mode

  $ python -c "file('.hg/store/data/dummy.i', 'wb').write('a\r\nb\n')"
  $ cd ..


clone and pull to break links

  $ hg clone --pull -r0 repo clone
  adding changesets
  adding manifests
  adding file changes
  added 1 changesets with 2 changes to 2 files
  updating to branch default
  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ cd clone
  $ echo '[ui]' >> .hg/hgrc
  $ echo 'username= A. Baz <a.baz@bar.com>' >> .hg/hgrc
  $ hg pull -q
  $ echo b >> b
  $ hg ci -m changeb
  created new head
  $ python -c "file('.hg/store/data/dummy.i', 'wb').write('a\nb\r\n')"


relink

  $ hg relink --debug | fix_path
  relinking $TESTTMP/repo/.hg/store to $TESTTMP/clone/.hg/store
  tip has 2 files, estimated total number of files: 3
  collecting: 00changelog.i 1/3 files (33.33%)
  collecting: 00manifest.i 2/3 files (66.67%)
  collecting: a.i 3/3 files (100.00%)
  collecting: b.i 4/3 files (133.33%)
  collecting: dummy.i 5/3 files (166.67%)
  collected 5 candidate storage files
  not linkable: 00changelog.i
  not linkable: 00manifest.i
  pruning: data/a.i 3/5 files (60.00%)
  not linkable: data/b.i
  pruning: data/dummy.i 5/5 files (100.00%)
  pruned down to 2 probably relinkable files
  relinking: data/a.i 1/2 files (50.00%)
  not linkable: data/dummy.i
  relinked 1 files (136 bytes reclaimed)
  $ cd ..


check hardlinks

  $ python arelinked.py repo/.hg/store/data/a.i clone/.hg/store/data/a.i
  repo/.hg/store/data/a.i == clone/.hg/store/data/a.i
  $ python arelinked.py repo/.hg/store/data/b.i clone/.hg/store/data/b.i
  repo/.hg/store/data/b.i != clone/.hg/store/data/b.i