view tests/test-convert-hg-svn.t @ 16943:8d08a28aa63e

matcher: use re2 bindings if available There are two sets of Python re2 bindings available on the internet; this code works with both. Using re2 can greatly improve "hg status" performance when a .hgignore file becomes even modestly complex. Example: "hg status" on a clean tree with 134K files, where "hg debugignore" reports a regexp 4256 bytes in size. no .hgignore: 1.76 sec Python re: 2.79 re2: 1.82 The overhead of regexp matching drops from 1.03 seconds with stock re to 0.06 with re2. (For comparison, a git repo with the same contents and .gitignore file runs "git status -s" in 1.71 seconds, i.e. only slightly faster than hg with re2.)
author Bryan O'Sullivan <bryano@fb.com>
date Fri, 01 Jun 2012 15:26:20 -0700
parents 9a0528fd9172
children 0413f68da85c
line wrap: on
line source


  $ "$TESTDIR/hghave" svn svn-bindings || exit 80
  $ fix_path()
  > {
  >     tr '\\' /
  > }
  $ echo "[extensions]" >> $HGRCPATH
  $ echo "convert = " >> $HGRCPATH
  $ echo "mq = " >> $HGRCPATH
  $ svnpath=`pwd | fix_path`/svn-repo
  $ svnadmin create "$svnpath"
  $ cat > "$svnpath"/hooks/pre-revprop-change <<EOF
  > #!/bin/sh
  > 
  > REPOS="$1"
  > REV="$2"
  > USER="$3"
  > PROPNAME="$4"
  > ACTION="$5"
  > 
  > if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi
  > if [ "$ACTION" = "A" -a "$PROPNAME" = "hg:convert-branch" ]; then exit 0; fi
  > if [ "$ACTION" = "A" -a "$PROPNAME" = "hg:convert-rev" ]; then exit 0; fi
  > 
  > echo "Changing prohibited revision property" >&2
  > exit 1
  > EOF
  $ chmod +x "$svnpath"/hooks/pre-revprop-change
  $ 
  $ # SVN wants all paths to start with a slash. Unfortunately,
  $ # Windows ones don't. Handle that.
  $ svnurl="$svnpath"
  $ expr "$svnurl" : "\/" > /dev/null || svnurl="/$svnurl"
  $ svnurl="file://$svnurl"
  $ svn co "$svnurl" "$svnpath"-wc
  Checked out revision 0.
  $ cd "$svnpath"-wc
  $ echo a > a
  $ svn add a
  A         a
  $ svn ci -m'added a' a
  Adding         a
  Transmitting file data .
  Committed revision 1.
  $ cd ..

initial roundtrip

  $ hg convert -s svn -d hg "$svnpath"-wc "$svnpath"-hg | grep -v initializing
  scanning source...
  sorting...
  converting...
  0 added a
  $ hg convert -s hg -d svn "$svnpath"-hg "$svnpath"-wc
  scanning source...
  sorting...
  converting...

second roundtrip should do nothing

  $ hg convert -s svn -d hg "$svnpath"-wc "$svnpath"-hg
  scanning source...
  sorting...
  converting...
  $ hg convert -s hg -d svn "$svnpath"-hg "$svnpath"-wc
  scanning source...
  sorting...
  converting...

new hg rev

  $ hg clone "$svnpath"-hg "$svnpath"-work
  updating to branch default
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ cd "$svnpath"-work
  $ echo b > b
  $ hg add b
  $ hg ci -mb

adding an empty revision

  $ hg qnew -m emtpy empty
  $ hg qfinish -a
  $ cd ..

echo hg to svn

  $ hg --cwd "$svnpath"-hg pull -q "$svnpath"-work
  $ hg convert -s hg -d svn "$svnpath"-hg "$svnpath"-wc
  scanning source...
  sorting...
  converting...
  1 b
  0 emtpy

svn back to hg should do nothing

  $ hg convert -s svn -d hg "$svnpath"-wc "$svnpath"-hg
  scanning source...
  sorting...
  converting...

hg back to svn should do nothing

  $ hg convert -s hg -d svn "$svnpath"-hg "$svnpath"-wc
  scanning source...
  sorting...
  converting...