view tests/test-convert-svn-sink.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 f98010f57a5e
children 43b3b761d9d1
line wrap: on
line source


  $ "$TESTDIR/hghave" svn svn-bindings no-outer-repo || exit 80

  $ fixpath()
  > {
  >     tr '\\' /
  > }
  $ svnupanddisplay()
  > {
  >     (
  >        cd $1;
  >        svn up;
  >        svn st -v | fixpath | sed 's/  */ /g'
  >        limit=''
  >        if [ $2 -gt 0 ]; then
  >            limit="--limit=$2"
  >        fi
  >        svn log --xml -v $limit \
  >            | fixpath \
  >            | sed 's,<date>.*,<date/>,' \
  >            | grep -v 'kind="'
  >     )
  > }

  $ cat > $HGRCPATH <<EOF
  > [extensions]
  > convert = 
  > graphlog =
  > EOF

  $ hg init a

Add

  $ echo a > a/a
  $ mkdir -p a/d1/d2
  $ echo b > a/d1/d2/b
  $ ln -s a/missing a/link
  $ hg --cwd a ci -d '0 0' -A -m 'add a file'
  adding a
  adding d1/d2/b
  adding link

Modify

  $ "$TESTDIR/svn-safe-append.py" a a/a
  $ hg --cwd a ci -d '1 0' -m 'modify a file'
  $ hg --cwd a tip -q
  1:8231f652da37

  $ hg convert -d svn a
  assuming destination a-hg
  initializing svn repository 'a-hg'
  initializing svn working copy 'a-hg-wc'
  scanning source...
  sorting...
  converting...
  1 add a file
  0 modify a file
  $ svnupanddisplay a-hg-wc 2
  At revision 2.
   2 2 test .
   2 2 test a
   2 1 test d1
   2 1 test d1/d2
   2 1 test d1/d2/b
   2 1 test link
  <?xml version="1.0"?>
  <log>
  <logentry
     revision="2">
  <author>test</author>
  <date/>
  <paths>
  <path
     action="M">/a</path>
  </paths>
  <msg>modify a file</msg>
  </logentry>
  <logentry
     revision="1">
  <author>test</author>
  <date/>
  <paths>
  <path
     action="A">/a</path>
  <path
     action="A">/d1</path>
  <path
     action="A">/d1/d2</path>
  <path
     action="A">/d1/d2/b</path>
  <path
     action="A">/link</path>
  </paths>
  <msg>add a file</msg>
  </logentry>
  </log>
  $ ls a a-hg-wc
  a:
  a
  d1
  link
  
  a-hg-wc:
  a
  d1
  link
  $ cmp a/a a-hg-wc/a

Rename

  $ hg --cwd a mv a b
  $ hg --cwd a mv link newlink

  $ hg --cwd a ci -d '2 0' -m 'rename a file'
  $ hg --cwd a tip -q
  2:a67e26ccec09

  $ hg convert -d svn a
  assuming destination a-hg
  initializing svn working copy 'a-hg-wc'
  scanning source...
  sorting...
  converting...
  0 rename a file
  $ svnupanddisplay a-hg-wc 1
  At revision 3.
   3 3 test .
   3 3 test b
   3 1 test d1
   3 1 test d1/d2
   3 1 test d1/d2/b
   3 3 test newlink
  <?xml version="1.0"?>
  <log>
  <logentry
     revision="3">
  <author>test</author>
  <date/>
  <paths>
  <path
     action="D">/a</path>
  <path
     copyfrom-path="/a"
     copyfrom-rev="2"
     action="A">/b</path>
  <path
     copyfrom-path="/link"
     copyfrom-rev="2"
     action="A">/newlink</path>
  <path
     action="D">/link</path>
  </paths>
  <msg>rename a file</msg>
  </logentry>
  </log>
  $ ls a a-hg-wc
  a:
  b
  d1
  newlink
  
  a-hg-wc:
  b
  d1
  newlink

Copy

  $ hg --cwd a cp b c

  $ hg --cwd a ci -d '3 0' -m 'copy a file'
  $ hg --cwd a tip -q
  3:0cf087b9ab02

  $ hg convert -d svn a
  assuming destination a-hg
  initializing svn working copy 'a-hg-wc'
  scanning source...
  sorting...
  converting...
  0 copy a file
  $ svnupanddisplay a-hg-wc 1
  At revision 4.
   4 4 test .
   4 3 test b
   4 4 test c
   4 1 test d1
   4 1 test d1/d2
   4 1 test d1/d2/b
   4 3 test newlink
  <?xml version="1.0"?>
  <log>
  <logentry
     revision="4">
  <author>test</author>
  <date/>
  <paths>
  <path
     copyfrom-path="/b"
     copyfrom-rev="3"
     action="A">/c</path>
  </paths>
  <msg>copy a file</msg>
  </logentry>
  </log>
  $ ls a a-hg-wc
  a:
  b
  c
  d1
  newlink
  
  a-hg-wc:
  b
  c
  d1
  newlink

  $ hg --cwd a rm b
  $ echo % remove
  % remove
  $ hg --cwd a ci -d '4 0' -m 'remove a file'
  $ hg --cwd a tip -q
  4:07b2e34a5b17

  $ hg convert -d svn a
  assuming destination a-hg
  initializing svn working copy 'a-hg-wc'
  scanning source...
  sorting...
  converting...
  0 remove a file
  $ svnupanddisplay a-hg-wc 1
  At revision 5.
   5 5 test .
   5 4 test c
   5 1 test d1
   5 1 test d1/d2
   5 1 test d1/d2/b
   5 3 test newlink
  <?xml version="1.0"?>
  <log>
  <logentry
     revision="5">
  <author>test</author>
  <date/>
  <paths>
  <path
     action="D">/b</path>
  </paths>
  <msg>remove a file</msg>
  </logentry>
  </log>
  $ ls a a-hg-wc
  a:
  c
  d1
  newlink
  
  a-hg-wc:
  c
  d1
  newlink

Exectutable

  $ chmod +x a/c
  $ hg --cwd a ci -d '5 0' -m 'make a file executable'
  $ hg --cwd a tip -q
  5:31093672760b

  $ hg convert -d svn a
  assuming destination a-hg
  initializing svn working copy 'a-hg-wc'
  scanning source...
  sorting...
  converting...
  0 make a file executable
  $ svnupanddisplay a-hg-wc 1
  At revision 6.
   6 6 test .
   6 6 test c
   6 1 test d1
   6 1 test d1/d2
   6 1 test d1/d2/b
   6 3 test newlink
  <?xml version="1.0"?>
  <log>
  <logentry
     revision="6">
  <author>test</author>
  <date/>
  <paths>
  <path
     action="M">/c</path>
  </paths>
  <msg>make a file executable</msg>
  </logentry>
  </log>
  $ test -x a-hg-wc/c

Executable in new directory

  $ rm -rf a a-hg a-hg-wc
  $ hg init a

  $ mkdir a/d1
  $ echo a > a/d1/a
  $ chmod +x a/d1/a
  $ hg --cwd a ci -d '0 0' -A -m 'add executable file in new directory'
  adding d1/a

  $ hg convert -d svn a
  assuming destination a-hg
  initializing svn repository 'a-hg'
  initializing svn working copy 'a-hg-wc'
  scanning source...
  sorting...
  converting...
  0 add executable file in new directory
  $ svnupanddisplay a-hg-wc 1
  At revision 1.
   1 1 test .
   1 1 test d1
   1 1 test d1/a
  <?xml version="1.0"?>
  <log>
  <logentry
     revision="1">
  <author>test</author>
  <date/>
  <paths>
  <path
     action="A">/d1</path>
  <path
     action="A">/d1/a</path>
  </paths>
  <msg>add executable file in new directory</msg>
  </logentry>
  </log>
  $ test -x a-hg-wc/d1/a

Copy to new directory

  $ mkdir a/d2
  $ hg --cwd a cp d1/a d2/a
  $ hg --cwd a ci -d '1 0' -A -m 'copy file to new directory'

  $ hg convert -d svn a
  assuming destination a-hg
  initializing svn working copy 'a-hg-wc'
  scanning source...
  sorting...
  converting...
  0 copy file to new directory
  $ svnupanddisplay a-hg-wc 1
  At revision 2.
   2 2 test .
   2 1 test d1
   2 1 test d1/a
   2 2 test d2
   2 2 test d2/a
  <?xml version="1.0"?>
  <log>
  <logentry
     revision="2">
  <author>test</author>
  <date/>
  <paths>
  <path
     action="A">/d2</path>
  <path
     copyfrom-path="/d1/a"
     copyfrom-rev="1"
     action="A">/d2/a</path>
  </paths>
  <msg>copy file to new directory</msg>
  </logentry>
  </log>

Branchy history

  $ hg init b
  $ echo base > b/b
  $ hg --cwd b ci -d '0 0' -Ambase
  adding b

  $ "$TESTDIR/svn-safe-append.py" left-1 b/b
  $ echo left-1 > b/left-1
  $ hg --cwd b ci -d '1 0' -Amleft-1
  adding left-1

  $ "$TESTDIR/svn-safe-append.py" left-2 b/b
  $ echo left-2 > b/left-2
  $ hg --cwd b ci -d '2 0' -Amleft-2
  adding left-2

  $ hg --cwd b up 0
  1 files updated, 0 files merged, 2 files removed, 0 files unresolved

  $ "$TESTDIR/svn-safe-append.py" right-1 b/b
  $ echo right-1 > b/right-1
  $ hg --cwd b ci -d '3 0' -Amright-1
  adding right-1
  created new head

  $ "$TESTDIR/svn-safe-append.py" right-2 b/b
  $ echo right-2 > b/right-2
  $ hg --cwd b ci -d '4 0' -Amright-2
  adding right-2

  $ hg --cwd b up -C 2
  3 files updated, 0 files merged, 2 files removed, 0 files unresolved
  $ hg --cwd b merge
  merging b
  warning: conflicts during merge.
  merging b failed!
  2 files updated, 0 files merged, 0 files removed, 1 files unresolved
  use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
  [1]
  $ hg --cwd b revert -r 2 b
  $ hg resolve -m b
  $ hg --cwd b ci -d '5 0' -m 'merge'

Expect 4 changes

  $ hg convert -d svn b
  assuming destination b-hg
  initializing svn repository 'b-hg'
  initializing svn working copy 'b-hg-wc'
  scanning source...
  sorting...
  converting...
  5 base
  4 left-1
  3 left-2
  2 right-1
  1 right-2
  0 merge

  $ svnupanddisplay b-hg-wc 0
  At revision 4.
   4 4 test .
   4 3 test b
   4 2 test left-1
   4 3 test left-2
   4 4 test right-1
   4 4 test right-2
  <?xml version="1.0"?>
  <log>
  <logentry
     revision="4">
  <author>test</author>
  <date/>
  <paths>
  <path
     action="A">/right-1</path>
  <path
     action="A">/right-2</path>
  </paths>
  <msg>merge</msg>
  </logentry>
  <logentry
     revision="3">
  <author>test</author>
  <date/>
  <paths>
  <path
     action="M">/b</path>
  <path
     action="A">/left-2</path>
  </paths>
  <msg>left-2</msg>
  </logentry>
  <logentry
     revision="2">
  <author>test</author>
  <date/>
  <paths>
  <path
     action="M">/b</path>
  <path
     action="A">/left-1</path>
  </paths>
  <msg>left-1</msg>
  </logentry>
  <logentry
     revision="1">
  <author>test</author>
  <date/>
  <paths>
  <path
     action="A">/b</path>
  </paths>
  <msg>base</msg>
  </logentry>
  </log>

Tags are not supported, but must not break conversion

  $ rm -rf a a-hg a-hg-wc
  $ hg init a
  $ echo a > a/a
  $ hg --cwd a ci -d '0 0' -A -m 'Add file a'
  adding a
  $ hg --cwd a tag -d '1 0' -m 'Tagged as v1.0' v1.0

  $ hg convert -d svn a
  assuming destination a-hg
  initializing svn repository 'a-hg'
  initializing svn working copy 'a-hg-wc'
  scanning source...
  sorting...
  converting...
  1 Add file a
  0 Tagged as v1.0
  writing Subversion tags is not yet implemented
  $ svnupanddisplay a-hg-wc 2
  At revision 2.
   2 2 test .
   2 1 test a
   2 2 test .hgtags
  <?xml version="1.0"?>
  <log>
  <logentry
     revision="2">
  <author>test</author>
  <date/>
  <paths>
  <path
     action="A">/.hgtags</path>
  </paths>
  <msg>Tagged as v1.0</msg>
  </logentry>
  <logentry
     revision="1">
  <author>test</author>
  <date/>
  <paths>
  <path
     action="A">/a</path>
  </paths>
  <msg>Add file a</msg>
  </logentry>
  </log>
  $ rm -rf a a-hg a-hg-wc