view tests/test-merge6.t @ 25777:1c2a8db33b8f

hgweb: allow symbolic revisions with forward slashes in urls It's possible to have a branch/tag/bookmark with all kinds of special characters, such as {}/\!?. While not very conveniently, symbolic revisions with such characters work from command line if user correctly quotes the characters. These characters also work in hgweb, when they are properly encoded, with one exception: '/' (forward slash, urlencoded as '%2F'), which was getting decoded before hgweb could parse it as a part of PATH_INFO. Because of that, hgweb was seeing it as any other forward slash, that is, as just another url parts separator. For example, if user wanted to see the content of dir/file at bookmark 'feature/eggs', url could be: '/file/feature%2Feggs/dir/file'. But hgweb tried to find a revision 'feature' and get contents of 'eggs/dir/file'. To fix this, let's assume forward slashes are doubly-urlencoded (%252F), so CGI/WSGI server decodes it into %2F. Then we can decode %2F in the revision part of the url into an actual '/' character. Making hgweb produce such urls will be done in the next 2 patches.
author Anton Shestakov <av6@dwimlabs.net>
date Sun, 12 Jul 2015 16:06:57 +0800
parents f2719b387380
children 2428e8ec0793
line wrap: on
line source

  $ cat <<EOF > merge
  > import sys, os
  > print "merging for", os.path.basename(sys.argv[1])
  > EOF
  $ HGMERGE="python ../merge"; export HGMERGE

  $ hg init A1
  $ cd A1
  $ echo This is file foo1 > foo
  $ echo This is file bar1 > bar
  $ hg add foo bar
  $ hg commit -m "commit text"

  $ cd ..
  $ hg clone A1 B1
  updating to branch default
  2 files updated, 0 files merged, 0 files removed, 0 files unresolved

  $ cd A1
  $ rm bar
  $ hg remove bar
  $ hg commit -m "commit test"

  $ cd ../B1
  $ echo This is file foo22 > foo
  $ hg commit -m "commit test"

  $ cd ..
  $ hg clone A1 A2
  updating to branch default
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ hg clone B1 B2
  updating to branch default
  2 files updated, 0 files merged, 0 files removed, 0 files unresolved

  $ cd A1
  $ hg pull ../B1
  pulling from ../B1
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 1 changesets with 1 changes to 1 files (+1 heads)
  (run 'hg heads' to see heads, 'hg merge' to merge)
  $ hg merge
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  (branch merge, don't forget to commit)
  $ hg commit -m "commit test"
bar should remain deleted.
  $ hg manifest --debug
  f9b0e817f6a48de3564c6b2957687c5e7297c5a0 644   foo

  $ cd ../B2
  $ hg pull ../A2
  pulling from ../A2
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 1 changesets with 0 changes to 0 files (+1 heads)
  (run 'hg heads' to see heads, 'hg merge' to merge)
  $ hg merge
  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
  (branch merge, don't forget to commit)
  $ hg commit -m "commit test"
bar should remain deleted.
  $ hg manifest --debug
  f9b0e817f6a48de3564c6b2957687c5e7297c5a0 644   foo

  $ cd ..