view tests/test-convert-svn-branches.t @ 28240:1ac8ce137377

changegroup: fix treemanifests on merges The current code for generating treemanifest revisions takes the list of files in the changeset and finds the directories from them. This does not work for merges, since a merge may pick file A from one side and file B from another and neither of them would appear in the changeset's "files" list, but the manifest would still change. Fix this by instead walking the root manifest log for all needed revisions, storing all needed file and subdirectory revisions, then recursively visiting the subdirectories. This also turns out to be faster: cloning a version of hg core converted to treemanifests went from ~28s to ~19s (timing somewhat unfair: before this patch, timed until crash; after this patch, timed until manifests complete). The new algorithm is used only on treemanifest repos. Although it works equally well on flat manifests, we leave the iteration over files in the changeset for flat manifests for now.
author Martin von Zweigbergk <martinvonz@google.com>
date Fri, 12 Feb 2016 23:09:09 -0800
parents 584044e5ad57
children 46da52f4b820
line wrap: on
line source

#require svn svn-bindings

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

  $ svnadmin create svn-repo
  $ svnadmin load -q svn-repo < "$TESTDIR/svn/branches.svndump"

Convert trunk and branches

  $ cat > branchmap <<EOF
  > old3 newbranch
  > 
  > 
  > EOF
  $ hg convert --branchmap=branchmap --datesort -r 10 svn-repo A-hg
  initializing destination A-hg repository
  scanning source...
  sorting...
  converting...
  10 init projA
  9 hello
  8 branch trunk, remove c and dir
  7 change a
  6 change b
  5 move and update c
  4 move and update c
  3 change b again
  2 move to old2
  1 move back to old
  0 last change to a

Test template keywords

  $ hg -R A-hg log --template '{rev} {svnuuid}{svnpath}@{svnrev}\n'
  10 644ede6c-2b81-4367-9dc8-d786514f2cde/trunk@10
  9 644ede6c-2b81-4367-9dc8-d786514f2cde/branches/old@9
  8 644ede6c-2b81-4367-9dc8-d786514f2cde/branches/old2@8
  7 644ede6c-2b81-4367-9dc8-d786514f2cde/branches/old@7
  6 644ede6c-2b81-4367-9dc8-d786514f2cde/trunk@6
  5 644ede6c-2b81-4367-9dc8-d786514f2cde/branches/old@6
  4 644ede6c-2b81-4367-9dc8-d786514f2cde/branches/old@5
  3 644ede6c-2b81-4367-9dc8-d786514f2cde/trunk@4
  2 644ede6c-2b81-4367-9dc8-d786514f2cde/branches/old@3
  1 644ede6c-2b81-4367-9dc8-d786514f2cde/trunk@2
  0 644ede6c-2b81-4367-9dc8-d786514f2cde/trunk@1

Convert again

  $ hg convert --branchmap=branchmap --datesort svn-repo A-hg
  scanning source...
  sorting...
  converting...
  0 branch trunk@1 into old3

  $ cd A-hg
  $ hg log -G --template 'branch={branches} {rev} {desc|firstline} files: {files}\n'
  o  branch=newbranch 11 branch trunk@1 into old3 files:
  |
  | o  branch= 10 last change to a files: a
  | |
  | | o  branch=old 9 move back to old files:
  | | |
  | | o  branch=old2 8 move to old2 files:
  | | |
  | | o  branch=old 7 change b again files: b
  | | |
  | o |  branch= 6 move and update c files: b
  | | |
  | | o  branch=old 5 move and update c files: c
  | | |
  | | o  branch=old 4 change b files: b
  | | |
  | o |  branch= 3 change a files: a
  | | |
  | | o  branch=old 2 branch trunk, remove c and dir files: c
  | |/
  | o  branch= 1 hello files: a b c dir/e
  |/
  o  branch= 0 init projA files:
  

  $ hg branches
  newbranch                     11:a6d7cc050ad1
  default                       10:6e2b33404495
  old                            9:93c4b0f99529
  old2                           8:b52884d7bead (inactive)
  $ hg tags -q
  tip
  $ cd ..

Test hg failing to call itself

  $ HG=foobar hg convert svn-repo B-hg 2>&1 | grep abort
  abort: Mercurial failed to run itself, check hg executable is in PATH

Convert 'trunk' to branch other than 'default'

  $ cat > branchmap <<EOF
  > default hgtrunk
  > 
  > 
  > EOF
  $ hg convert --branchmap=branchmap --datesort -r 10 svn-repo C-hg
  initializing destination C-hg repository
  scanning source...
  sorting...
  converting...
  10 init projA
  9 hello
  8 branch trunk, remove c and dir
  7 change a
  6 change b
  5 move and update c
  4 move and update c
  3 change b again
  2 move to old2
  1 move back to old
  0 last change to a

  $ cd C-hg
  $ hg branches --template '{branch}\n'
  hgtrunk
  old
  old2
  $ cd ..