From 02a607260fdbaed7717935df68fb76b1a6e577c0 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 17 May 2013 16:10:07 -0500 Subject: remote-helpers: tests: use python directly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These remote helpers use 'env python', not PYTHON_PATH, so that's where we should check for the extensions. Otherwise, if 'python' is not PYTHON_PATH (e.g. /usr/bin/python: Makefile's default), there will be a mismatch between the python libraries actually accessible to the remote helpers. Suggested by: Torsten Bögershausen Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/test-bzr.sh | 2 +- contrib/remote-helpers/test-hg-bidi.sh | 2 +- contrib/remote-helpers/test-hg-hg-git.sh | 4 ++-- contrib/remote-helpers/test-hg.sh | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/test-bzr.sh b/contrib/remote-helpers/test-bzr.sh index 5dfa070b64..2c89caa354 100755 --- a/contrib/remote-helpers/test-bzr.sh +++ b/contrib/remote-helpers/test-bzr.sh @@ -12,7 +12,7 @@ if ! test_have_prereq PYTHON; then test_done fi -if ! "$PYTHON_PATH" -c 'import bzrlib'; then +if ! python -c 'import bzrlib'; then skip_all='skipping remote-bzr tests; bzr not available' test_done fi diff --git a/contrib/remote-helpers/test-hg-bidi.sh b/contrib/remote-helpers/test-hg-bidi.sh index f569697734..2c693d07d9 100755 --- a/contrib/remote-helpers/test-hg-bidi.sh +++ b/contrib/remote-helpers/test-hg-bidi.sh @@ -15,7 +15,7 @@ if ! test_have_prereq PYTHON; then test_done fi -if ! "$PYTHON_PATH" -c 'import mercurial'; then +if ! python -c 'import mercurial'; then skip_all='skipping remote-hg tests; mercurial not available' test_done fi diff --git a/contrib/remote-helpers/test-hg-hg-git.sh b/contrib/remote-helpers/test-hg-hg-git.sh index 7f579c8436..1a212b88b0 100755 --- a/contrib/remote-helpers/test-hg-hg-git.sh +++ b/contrib/remote-helpers/test-hg-hg-git.sh @@ -15,12 +15,12 @@ if ! test_have_prereq PYTHON; then test_done fi -if ! "$PYTHON_PATH" -c 'import mercurial'; then +if ! python -c 'import mercurial'; then skip_all='skipping remote-hg tests; mercurial not available' test_done fi -if ! "$PYTHON_PATH" -c 'import hggit'; then +if ! python -c 'import hggit'; then skip_all='skipping remote-hg tests; hg-git not available' test_done fi diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index 8de2aa7fec..ce03fa317e 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -15,7 +15,7 @@ if ! test_have_prereq PYTHON; then test_done fi -if ! "$PYTHON_PATH" -c 'import mercurial'; then +if ! python -c 'import mercurial'; then skip_all='skipping remote-hg tests; mercurial not available' test_done fi -- cgit v1.2.3 From 0c27c12d21c6af3163ac4253c815e62c6bdd37f3 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 17 May 2013 16:10:08 -0500 Subject: remote-hg: tests: fix hg merge Let's specify a merge tool, otherwise mercurial might open one and hang our tests waiting for user input. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/test-hg-hg-git.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/test-hg-hg-git.sh b/contrib/remote-helpers/test-hg-hg-git.sh index 1a212b88b0..e0dbebf050 100755 --- a/contrib/remote-helpers/test-hg-hg-git.sh +++ b/contrib/remote-helpers/test-hg-hg-git.sh @@ -104,11 +104,12 @@ setup () { git config --global remote-hg.hg-git-compat true git config --global remote-hg.track-branches false - HGEDITOR=/usr/bin/true + HGEDITOR=true + HGMERGE=true GIT_AUTHOR_DATE="2007-01-01 00:00:00 +0230" GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE" - export HGEDITOR GIT_AUTHOR_DATE GIT_COMMITTER_DATE + export HGEDITOR HGMERGE GIT_AUTHOR_DATE GIT_COMMITTER_DATE } setup @@ -198,7 +199,7 @@ test_expect_success 'merge conflict 1' ' echo C > afile && hg ci -m "A->C" && - hg merge -r1 || true && + hg merge -r1 && echo C > afile && hg resolve -m afile && hg ci -m "merge to C" -- cgit v1.2.3 From cf08a7e15fd473bc9853227f537f6fe5c6512370 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:17 -0500 Subject: remote-hg: test: be a little more quiet Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/test-hg.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index ce03fa317e..657e0dd433 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -109,10 +109,10 @@ test_expect_success 'update bookmark' ' ( git clone "hg::$PWD/hgrepo" gitrepo && cd gitrepo && - git checkout devel && + git checkout --quiet devel && echo devel > content && git commit -a -m devel && - git push + git push --quiet ) && hg -R hgrepo bookmarks | egrep "devel[ ]+3:" -- cgit v1.2.3 From 294ff7b233c3066041320b339f515af8ad58854f Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:18 -0500 Subject: remote-hg: trivial reorganization We only need to get the remote dict once. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index 1dd3d7030e..426c1fc54a 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -857,6 +857,7 @@ def do_export(parser): if peer: parser.repo.push(peer, force=force_push, newbranch=True) + remote_bmarks = peer.listkeys('bookmarks') # handle bookmarks for bmark, node in p_bmarks: @@ -883,8 +884,7 @@ def do_export(parser): continue if peer: - rb = peer.listkeys('bookmarks') - old = rb.get(bmark, '') + old = remote_bmarks.get(bmark, '') if not peer.pushkey('bookmarks', bmark, old, new): print "error %s" % ref continue -- cgit v1.2.3 From 4080ac81e5435ce0d1acbe08916190a7513aae2b Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:19 -0500 Subject: remote-helpers: test: cleanup white-spaces We prefer tabs to spaces. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/test-bzr.sh | 460 ++++++++++++++++++------------------- contrib/remote-helpers/test-hg.sh | 176 +++++++------- 2 files changed, 318 insertions(+), 318 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/test-bzr.sh b/contrib/remote-helpers/test-bzr.sh index 2c89caa354..2cfa4c97e9 100755 --- a/contrib/remote-helpers/test-bzr.sh +++ b/contrib/remote-helpers/test-bzr.sh @@ -29,69 +29,69 @@ check () { bzr whoami "A U Thor " test_expect_success 'cloning' ' - (bzr init bzrrepo && - cd bzrrepo && - echo one > content && - bzr add content && - bzr commit -m one - ) && - - git clone "bzr::$PWD/bzrrepo" gitrepo && - check gitrepo one master + (bzr init bzrrepo && + cd bzrrepo && + echo one > content && + bzr add content && + bzr commit -m one + ) && + + git clone "bzr::$PWD/bzrrepo" gitrepo && + check gitrepo one master ' test_expect_success 'pulling' ' - (cd bzrrepo && - echo two > content && - bzr commit -m two - ) && + (cd bzrrepo && + echo two > content && + bzr commit -m two + ) && - (cd gitrepo && git pull) && + (cd gitrepo && git pull) && - check gitrepo two master + check gitrepo two master ' test_expect_success 'pushing' ' - (cd gitrepo && - echo three > content && - git commit -a -m three && - git push - ) && - - echo three > expected && - cat bzrrepo/content > actual && - test_cmp expected actual + (cd gitrepo && + echo three > content && + git commit -a -m three && + git push + ) && + + echo three > expected && + cat bzrrepo/content > actual && + test_cmp expected actual ' test_expect_success 'roundtrip' ' - (cd gitrepo && - git pull && - git log --format="%s" -1 origin/master > actual) && - echo three > expected && - test_cmp expected actual && + (cd gitrepo && + git pull && + git log --format="%s" -1 origin/master > actual) && + echo three > expected && + test_cmp expected actual && - (cd gitrepo && git push && git pull) && + (cd gitrepo && git push && git pull) && - (cd bzrrepo && - echo four > content && - bzr commit -m four - ) && + (cd bzrrepo && + echo four > content && + bzr commit -m four + ) && - (cd gitrepo && git pull && git push) && + (cd gitrepo && git pull && git push) && - check gitrepo four master && + check gitrepo four master && - (cd gitrepo && - echo five > content && - git commit -a -m five && - git push && git pull - ) && + (cd gitrepo && + echo five > content && + git commit -a -m five && + git push && git pull + ) && - (cd bzrrepo && bzr revert) && + (cd bzrrepo && bzr revert) && - echo five > expected && - cat bzrrepo/content > actual && - test_cmp expected actual + echo five > expected && + cat bzrrepo/content > actual && + test_cmp expected actual ' cat > expected < expected < executable - chmod +x executable && - bzr add executable - bzr commit -m exec && - ln -s content link - bzr add link - bzr commit -m link && - mkdir dir && - bzr add dir && - bzr commit -m dir) && - - (cd gitrepo && - git pull - git ls-tree HEAD > ../actual) && - - test_cmp expected actual && - - (cd gitrepo && - git cat-file -p HEAD:link > ../actual) && - - printf content > expected && - test_cmp expected actual + (cd bzrrepo && + echo exec > executable + chmod +x executable && + bzr add executable + bzr commit -m exec && + ln -s content link + bzr add link + bzr commit -m link && + mkdir dir && + bzr add dir && + bzr commit -m dir) && + + (cd gitrepo && + git pull + git ls-tree HEAD > ../actual) && + + test_cmp expected actual && + + (cd gitrepo && + git cat-file -p HEAD:link > ../actual) && + + printf content > expected && + test_cmp expected actual ' cat > expected < expected < movedir/one && - echo two > movedir/two && - bzr add movedir && - bzr commit -m movedir && - bzr mv movedir movedir-new && - bzr commit -m movedir-new) && - - (cd gitrepo && - git pull && - git ls-tree HEAD > ../actual) && - - test_cmp expected actual + (cd bzrrepo && + mkdir movedir && + echo one > movedir/one && + echo two > movedir/two && + bzr add movedir && + bzr commit -m movedir && + bzr mv movedir movedir-new && + bzr commit -m movedir-new) && + + (cd gitrepo && + git pull && + git ls-tree HEAD > ../actual) && + + test_cmp expected actual ' test_expect_success 'different authors' ' - (cd bzrrepo && - echo john >> content && - bzr commit -m john \ - --author "Jane Rey " \ - --author "John Doe ") && - - (cd gitrepo && - git pull && - git show --format="%an <%ae>, %cn <%ce>" --quiet > ../actual) && - - echo "Jane Rey , A U Thor " > expected && - test_cmp expected actual + (cd bzrrepo && + echo john >> content && + bzr commit -m john \ + --author "Jane Rey " \ + --author "John Doe ") && + + (cd gitrepo && + git pull && + git show --format="%an <%ae>, %cn <%ce>" --quiet > ../actual) && + + echo "Jane Rey , A U Thor " > expected && + test_cmp expected actual ' test_expect_success 'fetch utf-8 filenames' ' - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp && LC_ALL=C" && - - LC_ALL=en_US.UTF-8 - export LC_ALL - ( - bzr init bzrrepo && - cd bzrrepo && - - echo test >> "ærø" && - bzr add "ærø" && - echo test >> "ø~?" && - bzr add "ø~?" && - bzr commit -m add-utf-8 && - echo test >> "ærø" && - bzr commit -m test-utf-8 && - bzr rm "ø~?" && - bzr mv "ærø" "ø~?" && - bzr commit -m bzr-mv-utf-8 - ) && - - ( - git clone "bzr::$PWD/bzrrepo" gitrepo && - cd gitrepo && - git -c core.quotepath=false ls-files > ../actual - ) && - echo "ø~?" > expected && - test_cmp expected actual + mkdir -p tmp && cd tmp && + test_when_finished "cd .. && rm -rf tmp && LC_ALL=C" && + + LC_ALL=en_US.UTF-8 + export LC_ALL + ( + bzr init bzrrepo && + cd bzrrepo && + + echo test >> "ærø" && + bzr add "ærø" && + echo test >> "ø~?" && + bzr add "ø~?" && + bzr commit -m add-utf-8 && + echo test >> "ærø" && + bzr commit -m test-utf-8 && + bzr rm "ø~?" && + bzr mv "ærø" "ø~?" && + bzr commit -m bzr-mv-utf-8 + ) && + + ( + git clone "bzr::$PWD/bzrrepo" gitrepo && + cd gitrepo && + git -c core.quotepath=false ls-files > ../actual + ) && + echo "ø~?" > expected && + test_cmp expected actual ' test_expect_success 'push utf-8 filenames' ' - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp && LC_ALL=C" && + mkdir -p tmp && cd tmp && + test_when_finished "cd .. && rm -rf tmp && LC_ALL=C" && - LC_ALL=en_US.UTF-8 - export LC_ALL + LC_ALL=en_US.UTF-8 + export LC_ALL - ( - bzr init bzrrepo && - cd bzrrepo && + ( + bzr init bzrrepo && + cd bzrrepo && - echo one >> content && - bzr add content && - bzr commit -m one - ) && + echo one >> content && + bzr add content && + bzr commit -m one + ) && - ( - git clone "bzr::$PWD/bzrrepo" gitrepo && - cd gitrepo && + ( + git clone "bzr::$PWD/bzrrepo" gitrepo && + cd gitrepo && - echo test >> "ærø" && - git add "ærø" && - git commit -m utf-8 && + echo test >> "ærø" && + git add "ærø" && + git commit -m utf-8 && - git push - ) && + git push + ) && - (cd bzrrepo && bzr ls > ../actual) && - printf "content\nærø\n" > expected && - test_cmp expected actual + (cd bzrrepo && bzr ls > ../actual) && + printf "content\nærø\n" > expected && + test_cmp expected actual ' test_expect_success 'pushing a merge' ' - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp" && - - ( - bzr init bzrrepo && - cd bzrrepo && - echo one > content && - bzr add content && - bzr commit -m one - ) && - - git clone "bzr::$PWD/bzrrepo" gitrepo && - - ( - cd bzrrepo && - echo two > content && - bzr commit -m two - ) && - - ( - cd gitrepo && - echo three > content && - git commit -a -m three && - git fetch && - git merge origin/master || true && - echo three > content && - git commit -a --no-edit && - git push - ) && - - echo three > expected && - cat bzrrepo/content > actual && - test_cmp expected actual + mkdir -p tmp && cd tmp && + test_when_finished "cd .. && rm -rf tmp" && + + ( + bzr init bzrrepo && + cd bzrrepo && + echo one > content && + bzr add content && + bzr commit -m one + ) && + + git clone "bzr::$PWD/bzrrepo" gitrepo && + + ( + cd bzrrepo && + echo two > content && + bzr commit -m two + ) && + + ( + cd gitrepo && + echo three > content && + git commit -a -m three && + git fetch && + git merge origin/master || true && + echo three > content && + git commit -a --no-edit && + git push + ) && + + echo three > expected && + cat bzrrepo/content > actual && + test_cmp expected actual ' cat > expected <> content && - bzr add content && - bzr commit -m one - ) && - - bzr branch bzrrepo/trunk bzrrepo/branch && - ( - cd bzrrepo/branch && - echo two >> content && - bzr commit -m one - ) && - - git clone "bzr::$PWD/bzrrepo" gitrepo && - ( - cd gitrepo && - git for-each-ref --format "%(refname:short)" refs/remotes/origin > ../actual - ) && - - test_cmp ../expected actual + mkdir -p tmp && cd tmp && + test_when_finished "cd .. && rm -rf tmp" && + + bzr init-repo bzrrepo && + + bzr init bzrrepo/trunk && + ( + cd bzrrepo/trunk && + echo one >> content && + bzr add content && + bzr commit -m one + ) && + + bzr branch bzrrepo/trunk bzrrepo/branch && + ( + cd bzrrepo/branch && + echo two >> content && + bzr commit -m one + ) && + + git clone "bzr::$PWD/bzrrepo" gitrepo && + ( + cd gitrepo && + git for-each-ref --format "%(refname:short)" refs/remotes/origin > ../actual + ) && + + test_cmp ../expected actual ' test_expect_success 'strip' ' - # Do not imitate this style; always chdir inside a subshell instead - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp" && + # Do not imitate this style; always chdir inside a subshell instead + mkdir -p tmp && cd tmp && + test_when_finished "cd .. && rm -rf tmp" && - ( - bzr init bzrrepo && - cd bzrrepo && + ( + bzr init bzrrepo && + cd bzrrepo && - echo one >> content && - bzr add content && - bzr commit -m one && + echo one >> content && + bzr add content && + bzr commit -m one && - echo two >> content && - bzr commit -m two - ) && + echo two >> content && + bzr commit -m two + ) && - git clone "bzr::$PWD/bzrrepo" gitrepo && + git clone "bzr::$PWD/bzrrepo" gitrepo && - ( - cd bzrrepo && - bzr uncommit --force && + ( + cd bzrrepo && + bzr uncommit --force && - echo three >> content && - bzr commit -m three && + echo three >> content && + bzr commit -m three && - echo four >> content && - bzr commit -m four && - bzr log --line | sed -e "s/^[0-9][0-9]*: //" > ../expected - ) && + echo four >> content && + bzr commit -m four && + bzr log --line | sed -e "s/^[0-9][0-9]*: //" > ../expected + ) && - (cd gitrepo && - git fetch && - git log --format="%an %ad %s" --date=short origin/master > ../actual) && + (cd gitrepo && + git fetch && + git log --format="%an %ad %s" --date=short origin/master > ../actual) && - test_cmp expected actual + test_cmp expected actual ' test_done diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index 657e0dd433..7419b52f4f 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -39,119 +39,119 @@ setup () { setup test_expect_success 'cloning' ' - test_when_finished "rm -rf gitrepo*" && - - ( - hg init hgrepo && - cd hgrepo && - echo zero > content && - hg add content && - hg commit -m zero - ) && - - git clone "hg::$PWD/hgrepo" gitrepo && - check gitrepo zero master + test_when_finished "rm -rf gitrepo*" && + + ( + hg init hgrepo && + cd hgrepo && + echo zero > content && + hg add content && + hg commit -m zero + ) && + + git clone "hg::$PWD/hgrepo" gitrepo && + check gitrepo zero master ' test_expect_success 'cloning with branches' ' - test_when_finished "rm -rf gitrepo*" && + test_when_finished "rm -rf gitrepo*" && - ( - cd hgrepo && - hg branch next && - echo next > content && - hg commit -m next - ) && + ( + cd hgrepo && + hg branch next && + echo next > content && + hg commit -m next + ) && - git clone "hg::$PWD/hgrepo" gitrepo && - check gitrepo next next && + git clone "hg::$PWD/hgrepo" gitrepo && + check gitrepo next next && - (cd hgrepo && hg checkout default) && + (cd hgrepo && hg checkout default) && - git clone "hg::$PWD/hgrepo" gitrepo2 && - check gitrepo2 zero master + git clone "hg::$PWD/hgrepo" gitrepo2 && + check gitrepo2 zero master ' test_expect_success 'cloning with bookmarks' ' - test_when_finished "rm -rf gitrepo*" && - - ( - cd hgrepo && - hg bookmark feature-a && - echo feature-a > content && - hg commit -m feature-a - ) && + test_when_finished "rm -rf gitrepo*" && - git clone "hg::$PWD/hgrepo" gitrepo && - check gitrepo feature-a feature-a + ( + cd hgrepo && + hg bookmark feature-a && + echo feature-a > content && + hg commit -m feature-a + ) && + + git clone "hg::$PWD/hgrepo" gitrepo && + check gitrepo feature-a feature-a ' test_expect_success 'cloning with detached head' ' - test_when_finished "rm -rf gitrepo*" && + test_when_finished "rm -rf gitrepo*" && - ( - cd hgrepo && - hg update -r 0 - ) && + ( + cd hgrepo && + hg update -r 0 + ) && - git clone "hg::$PWD/hgrepo" gitrepo && - check gitrepo zero master + git clone "hg::$PWD/hgrepo" gitrepo && + check gitrepo zero master ' test_expect_success 'update bookmark' ' - test_when_finished "rm -rf gitrepo*" && - - ( - cd hgrepo && - hg bookmark devel - ) && - - ( - git clone "hg::$PWD/hgrepo" gitrepo && - cd gitrepo && - git checkout --quiet devel && - echo devel > content && - git commit -a -m devel && - git push --quiet - ) && - - hg -R hgrepo bookmarks | egrep "devel[ ]+3:" + test_when_finished "rm -rf gitrepo*" && + + ( + cd hgrepo && + hg bookmark devel + ) && + + ( + git clone "hg::$PWD/hgrepo" gitrepo && + cd gitrepo && + git checkout --quiet devel && + echo devel > content && + git commit -a -m devel && + git push --quiet + ) && + + hg -R hgrepo bookmarks | egrep "devel[ ]+3:" ' author_test () { - echo $1 >> content && - hg commit -u "$2" -m "add $1" && - echo "$3" >> ../expected + echo $1 >> content && + hg commit -u "$2" -m "add $1" && + echo "$3" >> ../expected } test_expect_success 'authors' ' - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp" && - - ( - hg init hgrepo && - cd hgrepo && - - touch content && - hg add content && - - author_test alpha "" "H G Wells " && - author_test beta "test" "test " && - author_test beta "test (comment)" "test " && - author_test gamma "" "Unknown " && - author_test delta "name" "name " && - author_test epsilon "name " && - author_test zeta " test " "test " && - author_test eta "test < test@example.com >" "test " && - author_test theta "test >test@example.com>" "test " && - author_test iota "test < test example com>" "test " && - author_test kappa "test@example.com" "Unknown " - ) && - - git clone "hg::$PWD/hgrepo" gitrepo && - git --git-dir=gitrepo/.git log --reverse --format="%an <%ae>" > actual && - - test_cmp expected actual + mkdir -p tmp && cd tmp && + test_when_finished "cd .. && rm -rf tmp" && + + ( + hg init hgrepo && + cd hgrepo && + + touch content && + hg add content && + + author_test alpha "" "H G Wells " && + author_test beta "test" "test " && + author_test beta "test (comment)" "test " && + author_test gamma "" "Unknown " && + author_test delta "name" "name " && + author_test epsilon "name " && + author_test zeta " test " "test " && + author_test eta "test < test@example.com >" "test " && + author_test theta "test >test@example.com>" "test " && + author_test iota "test < test example com>" "test " && + author_test kappa "test@example.com" "Unknown " + ) && + + git clone "hg::$PWD/hgrepo" gitrepo && + git --git-dir=gitrepo/.git log --reverse --format="%an <%ae>" > actual && + + test_cmp expected actual ' test_done -- cgit v1.2.3 From dde67d794c2600fee74aef289332257742f28cfa Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:20 -0500 Subject: remote-helpers: test: cleanup style So it's more standardized between all the tests. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/test-bzr.sh | 88 +++++++++++++++++++++++++------------- contrib/remote-helpers/test-hg.sh | 12 ++++-- 2 files changed, 66 insertions(+), 34 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/test-bzr.sh b/contrib/remote-helpers/test-bzr.sh index 2cfa4c97e9..4ab73ec4e5 100755 --- a/contrib/remote-helpers/test-bzr.sh +++ b/contrib/remote-helpers/test-bzr.sh @@ -18,18 +18,23 @@ if ! python -c 'import bzrlib'; then fi check () { - (cd $1 && + ( + cd $1 && git log --format='%s' -1 && - git symbolic-ref HEAD) > actual && - (echo $2 && - echo "refs/heads/$3") > expected && + git symbolic-ref HEAD + ) > actual && + ( + echo $2 && + echo "refs/heads/$3" + ) > expected && test_cmp expected actual } bzr whoami "A U Thor " test_expect_success 'cloning' ' - (bzr init bzrrepo && + ( + bzr init bzrrepo && cd bzrrepo && echo one > content && bzr add content && @@ -41,7 +46,8 @@ test_expect_success 'cloning' ' ' test_expect_success 'pulling' ' - (cd bzrrepo && + ( + cd bzrrepo && echo two > content && bzr commit -m two ) && @@ -52,7 +58,8 @@ test_expect_success 'pulling' ' ' test_expect_success 'pushing' ' - (cd gitrepo && + ( + cd gitrepo && echo three > content && git commit -a -m three && git push @@ -64,15 +71,18 @@ test_expect_success 'pushing' ' ' test_expect_success 'roundtrip' ' - (cd gitrepo && + ( + cd gitrepo && git pull && - git log --format="%s" -1 origin/master > actual) && + git log --format="%s" -1 origin/master > actual + ) && echo three > expected && test_cmp expected actual && (cd gitrepo && git push && git pull) && - (cd bzrrepo && + ( + cd bzrrepo && echo four > content && bzr commit -m four ) && @@ -81,7 +91,8 @@ test_expect_success 'roundtrip' ' check gitrepo four master && - (cd gitrepo && + ( + cd gitrepo && echo five > content && git commit -a -m five && git push && git pull @@ -101,7 +112,8 @@ cat > expected < executable chmod +x executable && bzr add executable @@ -111,16 +123,21 @@ test_expect_success 'special modes' ' bzr commit -m link && mkdir dir && bzr add dir && - bzr commit -m dir) && + bzr commit -m dir + ) && - (cd gitrepo && + ( + cd gitrepo && git pull - git ls-tree HEAD > ../actual) && + git ls-tree HEAD > ../actual + ) && test_cmp expected actual && - (cd gitrepo && - git cat-file -p HEAD:link > ../actual) && + ( + cd gitrepo && + git cat-file -p HEAD:link > ../actual + ) && printf content > expected && test_cmp expected actual @@ -134,32 +151,40 @@ cat > expected < movedir/one && echo two > movedir/two && bzr add movedir && bzr commit -m movedir && bzr mv movedir movedir-new && - bzr commit -m movedir-new) && + bzr commit -m movedir-new + ) && - (cd gitrepo && + ( + cd gitrepo && git pull && - git ls-tree HEAD > ../actual) && + git ls-tree HEAD > ../actual + ) && test_cmp expected actual ' test_expect_success 'different authors' ' - (cd bzrrepo && + ( + cd bzrrepo && echo john >> content && bzr commit -m john \ --author "Jane Rey " \ - --author "John Doe ") && + --author "John Doe " + ) && - (cd gitrepo && + ( + cd gitrepo && git pull && - git show --format="%an <%ae>, %cn <%ce>" --quiet > ../actual) && + git show --format="%an <%ae>, %cn <%ce>" --quiet > ../actual + ) && echo "Jane Rey , A U Thor " > expected && test_cmp expected actual @@ -171,6 +196,7 @@ test_expect_success 'fetch utf-8 filenames' ' LC_ALL=en_US.UTF-8 export LC_ALL + ( bzr init bzrrepo && cd bzrrepo && @@ -276,23 +302,23 @@ test_expect_success 'proper bzr repo' ' bzr init-repo bzrrepo && - bzr init bzrrepo/trunk && ( + bzr init bzrrepo/trunk && cd bzrrepo/trunk && echo one >> content && bzr add content && bzr commit -m one ) && - bzr branch bzrrepo/trunk bzrrepo/branch && ( + bzr branch bzrrepo/trunk bzrrepo/branch && cd bzrrepo/branch && echo two >> content && bzr commit -m one ) && - git clone "bzr::$PWD/bzrrepo" gitrepo && ( + git clone "bzr::$PWD/bzrrepo" gitrepo && cd gitrepo && git for-each-ref --format "%(refname:short)" refs/remotes/origin > ../actual ) && @@ -331,9 +357,11 @@ test_expect_success 'strip' ' bzr log --line | sed -e "s/^[0-9][0-9]*: //" > ../expected ) && - (cd gitrepo && + ( + cd gitrepo && git fetch && - git log --format="%an %ad %s" --date=short origin/master > ../actual) && + git log --format="%an %ad %s" --date=short origin/master > ../actual + ) && test_cmp expected actual ' diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index 7419b52f4f..e278dfde0f 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -21,11 +21,15 @@ if ! python -c 'import mercurial'; then fi check () { - (cd $1 && + ( + cd $1 && git log --format='%s' -1 && - git symbolic-ref HEAD) > actual && - (echo $2 && - echo "refs/heads/$3") > expected && + git symbolic-ref HEAD + ) > actual && + ( + echo $2 && + echo "refs/heads/$3" + ) > expected && test_cmp expected actual } -- cgit v1.2.3 From 531594e5aad738fa46cfad417bcef0fbd1520fbd Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:21 -0500 Subject: remote-helpers: tests: general improvements So that we don't need a temporary directory. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/test-bzr.sh | 21 ++++++++++---------- contrib/remote-helpers/test-hg-bidi.sh | 15 +++++---------- contrib/remote-helpers/test-hg-hg-git.sh | 33 +++++++++++--------------------- contrib/remote-helpers/test-hg.sh | 7 +++++-- 4 files changed, 31 insertions(+), 45 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/test-bzr.sh b/contrib/remote-helpers/test-bzr.sh index 4ab73ec4e5..b54313e69e 100755 --- a/contrib/remote-helpers/test-bzr.sh +++ b/contrib/remote-helpers/test-bzr.sh @@ -190,9 +190,11 @@ test_expect_success 'different authors' ' test_cmp expected actual ' +# cleanup previous stuff +rm -rf bzrrepo gitrepo + test_expect_success 'fetch utf-8 filenames' ' - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp && LC_ALL=C" && + test_when_finished "rm -rf bzrrepo gitrepo && LC_ALL=C" && LC_ALL=en_US.UTF-8 export LC_ALL @@ -223,8 +225,9 @@ test_expect_success 'fetch utf-8 filenames' ' ' test_expect_success 'push utf-8 filenames' ' + test_when_finished "rm -rf bzrrepo gitrepo && LC_ALL=C" && + mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp && LC_ALL=C" && LC_ALL=en_US.UTF-8 export LC_ALL @@ -255,8 +258,7 @@ test_expect_success 'push utf-8 filenames' ' ' test_expect_success 'pushing a merge' ' - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp" && + test_when_finished "rm -rf bzrrepo gitrepo" && ( bzr init bzrrepo && @@ -297,8 +299,7 @@ origin/trunk EOF test_expect_success 'proper bzr repo' ' - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp" && + test_when_finished "rm -rf bzrrepo gitrepo" && bzr init-repo bzrrepo && @@ -323,13 +324,11 @@ test_expect_success 'proper bzr repo' ' git for-each-ref --format "%(refname:short)" refs/remotes/origin > ../actual ) && - test_cmp ../expected actual + test_cmp expected actual ' test_expect_success 'strip' ' - # Do not imitate this style; always chdir inside a subshell instead - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp" && + test_when_finished "rm -rf bzrrepo gitrepo" && ( bzr init bzrrepo && diff --git a/contrib/remote-helpers/test-hg-bidi.sh b/contrib/remote-helpers/test-hg-bidi.sh index 2c693d07d9..676b1ab478 100755 --- a/contrib/remote-helpers/test-hg-bidi.sh +++ b/contrib/remote-helpers/test-hg-bidi.sh @@ -77,8 +77,7 @@ setup () { setup test_expect_success 'encoding' ' - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp" && + test_when_finished "rm -rf gitrepo* hgrepo*" && ( git init -q gitrepo && @@ -115,8 +114,7 @@ test_expect_success 'encoding' ' ' test_expect_success 'file removal' ' - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp" && + test_when_finished "rm -rf gitrepo* hgrepo*" && ( git init -q gitrepo && @@ -148,8 +146,7 @@ test_expect_success 'file removal' ' ' test_expect_success 'git tags' ' - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp" && + test_when_finished "rm -rf gitrepo* hgrepo*" && ( git init -q gitrepo && @@ -177,8 +174,7 @@ test_expect_success 'git tags' ' ' test_expect_success 'hg branch' ' - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp" && + test_when_finished "rm -rf gitrepo* hgrepo*" && ( git init -q gitrepo && @@ -214,8 +210,7 @@ test_expect_success 'hg branch' ' ' test_expect_success 'hg tags' ' - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp" && + test_when_finished "rm -rf gitrepo* hgrepo*" && ( git init -q gitrepo && diff --git a/contrib/remote-helpers/test-hg-hg-git.sh b/contrib/remote-helpers/test-hg-hg-git.sh index e0dbebf050..041041ddb1 100755 --- a/contrib/remote-helpers/test-hg-hg-git.sh +++ b/contrib/remote-helpers/test-hg-hg-git.sh @@ -115,8 +115,7 @@ setup () { setup test_expect_success 'executable bit' ' - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp" && + test_when_finished "rm -rf gitrepo* hgrepo*" && ( git init -q gitrepo && @@ -151,8 +150,7 @@ test_expect_success 'executable bit' ' ' test_expect_success 'symlink' ' - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp" && + test_when_finished "rm -rf gitrepo* hgrepo*" && ( git init -q gitrepo && @@ -182,8 +180,7 @@ test_expect_success 'symlink' ' ' test_expect_success 'merge conflict 1' ' - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp" && + test_when_finished "rm -rf gitrepo* hgrepo*" && ( hg init hgrepo1 && @@ -217,8 +214,7 @@ test_expect_success 'merge conflict 1' ' ' test_expect_success 'merge conflict 2' ' - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp" && + test_when_finished "rm -rf gitrepo* hgrepo*" && ( hg init hgrepo1 && @@ -252,8 +248,7 @@ test_expect_success 'merge conflict 2' ' ' test_expect_success 'converged merge' ' - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp" && + test_when_finished "rm -rf gitrepo* hgrepo*" && ( hg init hgrepo1 && @@ -288,8 +283,7 @@ test_expect_success 'converged merge' ' ' test_expect_success 'encoding' ' - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp" && + test_when_finished "rm -rf gitrepo* hgrepo*" && ( git init -q gitrepo && @@ -328,8 +322,7 @@ test_expect_success 'encoding' ' ' test_expect_success 'file removal' ' - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp" && + test_when_finished "rm -rf gitrepo* hgrepo*" && ( git init -q gitrepo && @@ -368,8 +361,7 @@ test_expect_success 'file removal' ' ' test_expect_success 'git tags' ' - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp" && + test_when_finished "rm -rf gitrepo* hgrepo*" && ( git init -q gitrepo && @@ -395,8 +387,7 @@ test_expect_success 'git tags' ' ' test_expect_success 'hg author' ' - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp" && + test_when_finished "rm -rf gitrepo* hgrepo*" && for x in hg git; do ( @@ -462,8 +453,7 @@ test_expect_success 'hg author' ' ' test_expect_success 'hg branch' ' - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp" && + test_when_finished "rm -rf gitrepo* hgrepo*" && for x in hg git; do ( @@ -499,8 +489,7 @@ test_expect_success 'hg branch' ' ' test_expect_success 'hg tags' ' - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp" && + test_when_finished "rm -rf gitrepo* hgrepo*" && for x in hg git; do ( diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index e278dfde0f..f986db0ff0 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -122,6 +122,9 @@ test_expect_success 'update bookmark' ' hg -R hgrepo bookmarks | egrep "devel[ ]+3:" ' +# cleanup previous stuff +rm -rf hgrepo + author_test () { echo $1 >> content && hg commit -u "$2" -m "add $1" && @@ -129,8 +132,7 @@ author_test () { } test_expect_success 'authors' ' - mkdir -p tmp && cd tmp && - test_when_finished "cd .. && rm -rf tmp" && + test_when_finished "rm -rf hgrepo gitrepo" && ( hg init hgrepo && @@ -139,6 +141,7 @@ test_expect_success 'authors' ' touch content && hg add content && + > ../expected && author_test alpha "" "H G Wells " && author_test beta "test" "test " && author_test beta "test (comment)" "test " && -- cgit v1.2.3 From 5f5e92fb7954c0bd258563541fed394bc5f88544 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:22 -0500 Subject: remote-helpers: test: simplify remote URLs No need to specify $PWD any more. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/test-bzr.sh | 12 ++++++------ contrib/remote-helpers/test-hg-bidi.sh | 6 +++--- contrib/remote-helpers/test-hg-hg-git.sh | 6 +++--- contrib/remote-helpers/test-hg.sh | 14 +++++++------- 4 files changed, 19 insertions(+), 19 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/test-bzr.sh b/contrib/remote-helpers/test-bzr.sh index b54313e69e..f215b26bac 100755 --- a/contrib/remote-helpers/test-bzr.sh +++ b/contrib/remote-helpers/test-bzr.sh @@ -41,7 +41,7 @@ test_expect_success 'cloning' ' bzr commit -m one ) && - git clone "bzr::$PWD/bzrrepo" gitrepo && + git clone "bzr::bzrrepo" gitrepo && check gitrepo one master ' @@ -216,7 +216,7 @@ test_expect_success 'fetch utf-8 filenames' ' ) && ( - git clone "bzr::$PWD/bzrrepo" gitrepo && + git clone "bzr::bzrrepo" gitrepo && cd gitrepo && git -c core.quotepath=false ls-files > ../actual ) && @@ -242,7 +242,7 @@ test_expect_success 'push utf-8 filenames' ' ) && ( - git clone "bzr::$PWD/bzrrepo" gitrepo && + git clone "bzr::bzrrepo" gitrepo && cd gitrepo && echo test >> "ærø" && @@ -268,7 +268,7 @@ test_expect_success 'pushing a merge' ' bzr commit -m one ) && - git clone "bzr::$PWD/bzrrepo" gitrepo && + git clone "bzr::bzrrepo" gitrepo && ( cd bzrrepo && @@ -319,7 +319,7 @@ test_expect_success 'proper bzr repo' ' ) && ( - git clone "bzr::$PWD/bzrrepo" gitrepo && + git clone "bzr::bzrrepo" gitrepo && cd gitrepo && git for-each-ref --format "%(refname:short)" refs/remotes/origin > ../actual ) && @@ -342,7 +342,7 @@ test_expect_success 'strip' ' bzr commit -m two ) && - git clone "bzr::$PWD/bzrrepo" gitrepo && + git clone "bzr::bzrrepo" gitrepo && ( cd bzrrepo && diff --git a/contrib/remote-helpers/test-hg-bidi.sh b/contrib/remote-helpers/test-hg-bidi.sh index 676b1ab478..1aadf35eb2 100755 --- a/contrib/remote-helpers/test-hg-bidi.sh +++ b/contrib/remote-helpers/test-hg-bidi.sh @@ -22,7 +22,7 @@ fi # clone to a git repo git_clone () { - git clone -q "hg::$PWD/$1" $2 + git clone -q "hg::$1" $2 } # clone to an hg repo @@ -31,7 +31,7 @@ hg_clone () { hg init $2 && hg -R $2 bookmark -i master && cd $1 && - git push -q "hg::$PWD/../$2" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*' + git push -q "hg::../$2" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*' ) && (cd $2 && hg -q update) @@ -43,7 +43,7 @@ hg_push () { cd $2 old=$(git symbolic-ref --short HEAD) git checkout -q -b tmp && - git fetch -q "hg::$PWD/../$1" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*' && + git fetch -q "hg::../$1" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*' && git checkout -q $old && git branch -q -D tmp 2> /dev/null || true ) diff --git a/contrib/remote-helpers/test-hg-hg-git.sh b/contrib/remote-helpers/test-hg-hg-git.sh index 041041ddb1..c2e7316385 100755 --- a/contrib/remote-helpers/test-hg-hg-git.sh +++ b/contrib/remote-helpers/test-hg-hg-git.sh @@ -27,7 +27,7 @@ fi # clone to a git repo with git git_clone_git () { - git clone -q "hg::$PWD/$1" $2 + git clone -q "hg::$1" $2 } # clone to an hg repo with git @@ -36,7 +36,7 @@ hg_clone_git () { hg init $2 && hg -R $2 bookmark -i master && cd $1 && - git push -q "hg::$PWD/../$2" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*' + git push -q "hg::../$2" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*' ) && (cd $2 && hg -q update) @@ -63,7 +63,7 @@ hg_push_git () { cd $2 old=$(git symbolic-ref --short HEAD) git checkout -q -b tmp && - git fetch -q "hg::$PWD/../$1" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*' && + git fetch -q "hg::../$1" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*' && git checkout -q $old && git branch -q -D tmp 2> /dev/null || true ) diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index f986db0ff0..c54adb6fee 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -53,7 +53,7 @@ test_expect_success 'cloning' ' hg commit -m zero ) && - git clone "hg::$PWD/hgrepo" gitrepo && + git clone "hg::hgrepo" gitrepo && check gitrepo zero master ' @@ -67,12 +67,12 @@ test_expect_success 'cloning with branches' ' hg commit -m next ) && - git clone "hg::$PWD/hgrepo" gitrepo && + git clone "hg::hgrepo" gitrepo && check gitrepo next next && (cd hgrepo && hg checkout default) && - git clone "hg::$PWD/hgrepo" gitrepo2 && + git clone "hg::hgrepo" gitrepo2 && check gitrepo2 zero master ' @@ -86,7 +86,7 @@ test_expect_success 'cloning with bookmarks' ' hg commit -m feature-a ) && - git clone "hg::$PWD/hgrepo" gitrepo && + git clone "hg::hgrepo" gitrepo && check gitrepo feature-a feature-a ' @@ -98,7 +98,7 @@ test_expect_success 'cloning with detached head' ' hg update -r 0 ) && - git clone "hg::$PWD/hgrepo" gitrepo && + git clone "hg::hgrepo" gitrepo && check gitrepo zero master ' @@ -111,7 +111,7 @@ test_expect_success 'update bookmark' ' ) && ( - git clone "hg::$PWD/hgrepo" gitrepo && + git clone "hg::hgrepo" gitrepo && cd gitrepo && git checkout --quiet devel && echo devel > content && @@ -155,7 +155,7 @@ test_expect_success 'authors' ' author_test kappa "test@example.com" "Unknown " ) && - git clone "hg::$PWD/hgrepo" gitrepo && + git clone "hg::hgrepo" gitrepo && git --git-dir=gitrepo/.git log --reverse --format="%an <%ae>" > actual && test_cmp expected actual -- cgit v1.2.3 From f6f00b46aed220517df3c9808f81ea7ca9576643 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:23 -0500 Subject: remote-hg: test: simplify previous branch checkout @{-1} does the same thing. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/test-hg-bidi.sh | 3 +-- contrib/remote-helpers/test-hg-hg-git.sh | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/test-hg-bidi.sh b/contrib/remote-helpers/test-hg-bidi.sh index 1aadf35eb2..f0aa3c06c1 100755 --- a/contrib/remote-helpers/test-hg-bidi.sh +++ b/contrib/remote-helpers/test-hg-bidi.sh @@ -41,10 +41,9 @@ hg_clone () { hg_push () { ( cd $2 - old=$(git symbolic-ref --short HEAD) git checkout -q -b tmp && git fetch -q "hg::../$1" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*' && - git checkout -q $old && + git checkout -q @{-1} && git branch -q -D tmp 2> /dev/null || true ) } diff --git a/contrib/remote-helpers/test-hg-hg-git.sh b/contrib/remote-helpers/test-hg-hg-git.sh index c2e7316385..37e59d8fe8 100755 --- a/contrib/remote-helpers/test-hg-hg-git.sh +++ b/contrib/remote-helpers/test-hg-hg-git.sh @@ -61,10 +61,9 @@ hg_clone_hg () { hg_push_git () { ( cd $2 - old=$(git symbolic-ref --short HEAD) git checkout -q -b tmp && git fetch -q "hg::../$1" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*' && - git checkout -q $old && + git checkout -q @{-1} && git branch -q -D tmp 2> /dev/null || true ) } -- cgit v1.2.3 From cab3829d2b29b9cd750afd0e342d6f3cae359639 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:24 -0500 Subject: remote-hg: load all extensions The user might have then configured differently, plus, all of them will be loaded anyway later on. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index 426c1fc54a..21f8acdda8 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -339,11 +339,7 @@ def get_repo(url, alias): if get_config_bool('remote-hg.insecure'): myui.setconfig('web', 'cacerts', '') - try: - mod = extensions.load(myui, 'hgext.schemes', None) - mod.extsetup(myui) - except ImportError: - pass + extensions.loadall(myui) if hg.islocal(url): repo = hg.repository(myui, url) -- cgit v1.2.3 From 6796d49ed01c214d4eeb5b9f2ffd2a49b54a7207 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:25 -0500 Subject: remote-hg: use a shared repository store This way we don't have to have duplicated Mercurial objects. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index 21f8acdda8..75079762bd 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -343,21 +343,29 @@ def get_repo(url, alias): if hg.islocal(url): repo = hg.repository(myui, url) + if not os.path.exists(dirname): + os.makedirs(dirname) else: - local_path = os.path.join(dirname, 'clone') - if not os.path.exists(local_path): + shared_path = os.path.join(gitdir, 'hg') + if not os.path.exists(shared_path): try: - peer, dstpeer = hg.clone(myui, {}, url, local_path, update=True, pull=True) + hg.clone(myui, {}, url, shared_path, update=False, pull=True) except: die('Repository error') - repo = dstpeer.local() - else: - repo = hg.repository(myui, local_path) - try: - peer = hg.peer(myui, {}, url) - except: - die('Repository error') - repo.pull(peer, heads=None, force=True) + + if not os.path.exists(dirname): + os.makedirs(dirname) + + local_path = os.path.join(dirname, 'clone') + if not os.path.exists(local_path): + hg.share(myui, shared_path, local_path, update=False) + + repo = hg.repository(myui, local_path) + try: + peer = hg.peer(myui, {}, url) + except: + die('Repository error') + repo.pull(peer, heads=None, force=True) return repo @@ -898,7 +906,7 @@ def fix_path(alias, repo, orig_url): subprocess.call(cmd) def main(args): - global prefix, dirname, branches, bmarks + global prefix, gitdir, dirname, branches, bmarks global marks, blob_marks, parsed_refs global peer, mode, bad_mail, bad_name global track_branches, force_push, is_tmp @@ -944,9 +952,6 @@ def main(args): if not is_tmp: fix_path(alias, peer or repo, url) - if not os.path.exists(dirname): - os.makedirs(dirname) - marks_path = os.path.join(dirname, 'marks-hg') marks = Marks(marks_path) -- cgit v1.2.3 From 52036431ff630ba9de9430fb6982a6869473d002 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:26 -0500 Subject: remote-hg: shuffle some code In preparation to shift to SHA-1's. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index 75079762bd..62520eeb51 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -75,6 +75,9 @@ def hgmode(mode): def hghex(node): return hg.node.hex(node) +def hgbin(node): + return hg.node.bin(node) + def hgref(ref): return ref.replace('___', ' ') @@ -261,7 +264,7 @@ def get_filechanges(repo, ctx, parent): removed = set() # load earliest manifest first for caching reasons - prev = repo[parent].manifest().copy() + prev = parent.manifest().copy() cur = ctx.manifest() for fn in cur: @@ -401,7 +404,7 @@ def export_ref(repo, name, kind, head): else: committer = author - parents = [p for p in repo.changelog.parentrevs(rev) if p >= 0] + parents = [repo[p] for p in repo.changelog.parentrevs(rev) if p >= 0] if len(parents) == 0: modified = c.manifest().keys() @@ -450,9 +453,9 @@ def export_ref(repo, name, kind, head): print desc if len(parents) > 0: - print "from :%s" % (rev_to_mark(parents[0])) + print "from :%s" % (rev_to_mark(parents[0].rev())) if len(parents) > 1: - print "merge :%s" % (rev_to_mark(parents[1])) + print "merge :%s" % (rev_to_mark(parents[1].rev())) for f in modified_final: print "M %s :%u %s" % f @@ -466,10 +469,10 @@ def export_ref(repo, name, kind, head): # make sure the ref is updated print "reset %s/%s" % (prefix, ename) - print "from :%u" % rev_to_mark(rev) + print "from :%u" % rev_to_mark(head.rev()) print - marks.set_tip(ename, rev) + marks.set_tip(ename, head.rev()) def export_tag(repo, tag): export_ref(repo, tag, 'tags', repo[hgref(tag)]) @@ -739,7 +742,7 @@ def parse_commit(parser): tmp = encoding.encoding encoding.encoding = 'utf-8' - node = repo.commitctx(ctx) + node = hghex(repo.commitctx(ctx)) encoding.encoding = tmp @@ -763,7 +766,7 @@ def parse_reset(parser): parser.next() node = parser.repo.changelog.node(mark_to_rev(from_mark)) - parsed_refs[ref] = node + parsed_refs[ref] = hghex(node) def parse_tag(parser): name = parser[1] @@ -788,7 +791,7 @@ def write_tag(repo, tag, node, msg, author): data = fctx.data() except error.ManifestLookupError: data = "" - content = data + "%s %s\n" % (hghex(node), tag) + content = data + "%s %s\n" % (node, tag) return context.memfilectx(f, content, False, False, None) p1 = tip.hex() @@ -832,9 +835,10 @@ def do_export(parser): die('unhandled export command: %s' % line) for ref, node in parsed_refs.iteritems(): + bnode = hgbin(node) if ref.startswith('refs/heads/branches'): branch = ref[len('refs/heads/branches/'):] - if branch in branches and node in branches[branch]: + if branch in branches and bnode in branches[branch]: # up to date continue print "ok %s" % ref @@ -848,11 +852,11 @@ def do_export(parser): author, msg = parsed_tags.get(tag, (None, None)) if mode == 'git': if not msg: - msg = 'Added tag %s for changeset %s' % (tag, hghex(node[:6])); + msg = 'Added tag %s for changeset %s' % (tag, node[:12]); write_tag(parser.repo, tag, node, msg, author) else: fp = parser.repo.opener('localtags', 'a') - fp.write('%s %s\n' % (hghex(node), tag)) + fp.write('%s %s\n' % (node, tag)) fp.close() print "ok %s" % ref else: @@ -866,7 +870,7 @@ def do_export(parser): # handle bookmarks for bmark, node in p_bmarks: ref = 'refs/heads/' + bmark - new = hghex(node) + new = node if bmark in bmarks: old = bmarks[bmark].hex() -- cgit v1.2.3 From e936a5d4842e9bbfeaf5792efc0db5965bf9e7ee Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:27 -0500 Subject: remote-hg: improve node traversing We won't be able to count the unmarked commits, but we are not going to be able to do that anyway when we switch to SHA-1 ids. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index 62520eeb51..07ea104e43 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -389,12 +389,16 @@ def export_ref(repo, name, kind, head): revs = xrange(tip, head.rev() + 1) count = 0 - revs = [rev for rev in revs if not marks.is_marked(rev)] - for rev in revs: c = repo[rev] - (manifest, user, (time, tz), files, desc, extra) = repo.changelog.read(c.node()) + node = c.node() + + if marks.is_marked(c.hex()): + count += 1 + continue + + (manifest, user, (time, tz), files, desc, extra) = repo.changelog.read(node) rev_branch = extra['branch'] author = "%s %d %s" % (fixup_user(user), time, gittz(tz)) -- cgit v1.2.3 From c43c06b1869c40e2a95a23f6b87dc38861e9d776 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:28 -0500 Subject: remote-hg: add version checks to the marks Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index 07ea104e43..e2bef7ffa7 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -55,6 +55,8 @@ EMAIL_RE = re.compile('^([^<>]+[^ \\\t<>])?\\b(?:[ \\t<>]*?)\\b([^ \\t<>]+@[^ \\ AUTHOR_HG_RE = re.compile('^(.*?) ?<(.*?)(?:>(.+)?)?$') RAW_AUTHOR_RE = re.compile('^(\w+) (?:(.+)? )?<(.*)> (\d+) ([+-]\d+)') +VERSION = 1 + def die(msg, *args): sys.stderr.write('ERROR: %s\n' % (msg % args)) sys.exit(1) @@ -103,12 +105,19 @@ class Marks: def __init__(self, path): self.path = path + self.clear() + self.load() + + if self.version < VERSION: + self.clear() + self.version = VERSION + + def clear(self): self.tips = {} self.marks = {} self.rev_marks = {} self.last_mark = 0 - - self.load() + self.version = 0 def load(self): if not os.path.exists(self.path): @@ -119,12 +128,13 @@ class Marks: self.tips = tmp['tips'] self.marks = tmp['marks'] self.last_mark = tmp['last-mark'] + self.version = tmp.get('version', 1) for rev, mark in self.marks.iteritems(): self.rev_marks[mark] = int(rev) def dict(self): - return { 'tips': self.tips, 'marks': self.marks, 'last-mark' : self.last_mark } + return { 'tips': self.tips, 'marks': self.marks, 'last-mark' : self.last_mark, 'version' : self.version } def store(self): json.dump(self.dict(), open(self.path, 'w')) -- cgit v1.2.3 From 93ae203495ded111bb0206fb50e54d0812df1cd5 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:29 -0500 Subject: remote-hg: switch from revisions to SHA-1 noteids Otherwise we won't know if revisions are replaced. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 42 +++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 20 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index e2bef7ffa7..ae7699c5b4 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -55,7 +55,7 @@ EMAIL_RE = re.compile('^([^<>]+[^ \\\t<>])?\\b(?:[ \\t<>]*?)\\b([^ \\t<>]+@[^ \\ AUTHOR_HG_RE = re.compile('^(.*?) ?<(.*?)(?:>(.+)?)?$') RAW_AUTHOR_RE = re.compile('^(\w+) (?:(.+)? )?<(.*)> (\d+) ([+-]\d+)') -VERSION = 1 +VERSION = 2 def die(msg, *args): sys.stderr.write('ERROR: %s\n' % (msg % args)) @@ -131,7 +131,7 @@ class Marks: self.version = tmp.get('version', 1) for rev, mark in self.marks.iteritems(): - self.rev_marks[mark] = int(rev) + self.rev_marks[mark] = rev def dict(self): return { 'tips': self.tips, 'marks': self.marks, 'last-mark' : self.last_mark, 'version' : self.version } @@ -143,7 +143,7 @@ class Marks: return str(self.dict()) def from_rev(self, rev): - return self.marks[str(rev)] + return self.marks[rev] def to_rev(self, mark): return self.rev_marks[mark] @@ -154,19 +154,19 @@ class Marks: def get_mark(self, rev): self.last_mark += 1 - self.marks[str(rev)] = self.last_mark + self.marks[rev] = self.last_mark return self.last_mark def new_mark(self, rev, mark): - self.marks[str(rev)] = mark + self.marks[rev] = mark self.rev_marks[mark] = rev self.last_mark = mark def is_marked(self, rev): - return str(rev) in self.marks + return rev in self.marks def get_tip(self, branch): - return self.tips.get(branch, 0) + return self.tips.get(branch, None) def set_tip(self, branch, tip): self.tips[branch] = tip @@ -384,7 +384,7 @@ def get_repo(url, alias): def rev_to_mark(rev): global marks - return marks.from_rev(rev) + return marks.from_rev(rev.hex()) def mark_to_rev(mark): global marks @@ -395,6 +395,10 @@ def export_ref(repo, name, kind, head): ename = '%s/%s' % (kind, name) tip = marks.get_tip(ename) + if tip and tip in repo: + tip = repo[tip].rev() + else: + tip = 0 revs = xrange(tip, head.rev() + 1) count = 0 @@ -460,16 +464,16 @@ def export_ref(repo, name, kind, head): modified_final = export_files(c.filectx(f) for f in modified) print "commit %s/%s" % (prefix, ename) - print "mark :%d" % (marks.get_mark(rev)) + print "mark :%d" % (marks.get_mark(c.hex())) print "author %s" % (author) print "committer %s" % (committer) print "data %d" % (len(desc)) print desc if len(parents) > 0: - print "from :%s" % (rev_to_mark(parents[0].rev())) + print "from :%s" % (rev_to_mark(parents[0])) if len(parents) > 1: - print "merge :%s" % (rev_to_mark(parents[1].rev())) + print "merge :%s" % (rev_to_mark(parents[1])) for f in modified_final: print "M %s :%u %s" % f @@ -483,10 +487,10 @@ def export_ref(repo, name, kind, head): # make sure the ref is updated print "reset %s/%s" % (prefix, ename) - print "from :%u" % rev_to_mark(head.rev()) + print "from :%u" % rev_to_mark(head) print - marks.set_tip(ename, head.rev()) + marks.set_tip(ename, head.hex()) def export_tag(repo, tag): export_ref(repo, tag, 'tags', repo[hgref(tag)]) @@ -713,12 +717,12 @@ def parse_commit(parser): extra['committer'] = "%s %u %u" % committer if from_mark: - p1 = repo.changelog.node(mark_to_rev(from_mark)) + p1 = mark_to_rev(from_mark) else: p1 = '\0' * 20 if merge_mark: - p2 = repo.changelog.node(mark_to_rev(merge_mark)) + p2 = mark_to_rev(merge_mark) else: p2 = '\0' * 20 @@ -760,10 +764,8 @@ def parse_commit(parser): encoding.encoding = tmp - rev = repo[node].rev() - parsed_refs[ref] = node - marks.new_mark(rev, commit_mark) + marks.new_mark(node, commit_mark) def parse_reset(parser): global parsed_refs @@ -779,8 +781,8 @@ def parse_reset(parser): from_mark = parser.get_mark() parser.next() - node = parser.repo.changelog.node(mark_to_rev(from_mark)) - parsed_refs[ref] = hghex(node) + rev = mark_to_rev(from_mark) + parsed_refs[ref] = rev def parse_tag(parser): name = parser[1] -- cgit v1.2.3 From 68b161167841c43c138604429f9981cb453aff8a Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:30 -0500 Subject: remote-hg: upgrade version 1 marks As suggested by Jed Brown; there's no need to re-import all the commits. Cc: Jed Brown Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index ae7699c5b4..2e4f7ca425 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -103,14 +103,20 @@ def get_config_bool(config, default=False): class Marks: - def __init__(self, path): + def __init__(self, path, repo): self.path = path + self.repo = repo self.clear() self.load() if self.version < VERSION: - self.clear() - self.version = VERSION + if self.version == 1: + self.upgrade_one() + + # upgraded? + if self.version < VERSION: + self.clear() + self.version = VERSION def clear(self): self.tips = {} @@ -133,6 +139,14 @@ class Marks: for rev, mark in self.marks.iteritems(): self.rev_marks[mark] = rev + def upgrade_one(self): + def get_id(rev): + return hghex(self.repo.changelog.node(int(rev))) + self.tips = dict((name, get_id(rev)) for name, rev in self.tips.iteritems()) + self.marks = dict((get_id(rev), mark) for rev, mark in self.marks.iteritems()) + self.rev_marks = dict((mark, get_id(rev)) for mark, rev in self.rev_marks.iteritems()) + self.version = 2 + def dict(self): return { 'tips': self.tips, 'marks': self.marks, 'last-mark' : self.last_mark, 'version' : self.version } @@ -973,7 +987,7 @@ def main(args): fix_path(alias, peer or repo, url) marks_path = os.path.join(dirname, 'marks-hg') - marks = Marks(marks_path) + marks = Marks(marks_path, repo) if sys.platform == 'win32': import msvcrt -- cgit v1.2.3 From 9529cce86e508d1910395d7493b7b8706ea7cd37 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:31 -0500 Subject: remote-hg: ensure remote rebasing works Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 1 + contrib/remote-helpers/test-hg.sh | 40 ++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index 2e4f7ca425..e0e68eff2c 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -621,6 +621,7 @@ def do_import(parser): if os.path.exists(path): print "feature import-marks=%s" % path print "feature export-marks=%s" % path + print "feature force" sys.stdout.flush() tmp = encoding.encoding diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index c54adb6fee..af27a0f65f 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -37,6 +37,8 @@ setup () { ( echo "[ui]" echo "username = H G Wells " + echo "[extensions]" + echo "mq =" ) >> "$HOME"/.hgrc } @@ -161,4 +163,42 @@ test_expect_success 'authors' ' test_cmp expected actual ' +test_expect_success 'strip' ' + test_when_finished "rm -rf hgrepo gitrepo" && + + ( + hg init hgrepo && + cd hgrepo && + + echo one >> content && + hg add content && + hg commit -m one && + + echo two >> content && + hg commit -m two + ) && + + git clone "hg::hgrepo" gitrepo && + + ( + cd hgrepo && + hg strip 1 && + + echo three >> content && + hg commit -m three && + + echo four >> content && + hg commit -m four + ) && + + ( + cd gitrepo && + git fetch && + git log --format="%s" origin/master > ../actual + ) && + + hg -R hgrepo log --template "{desc}\n" > expected && + test_cmp actual expected +' + test_done -- cgit v1.2.3 From 34d75e78f407c85f948dc74806a6505cd1f001ec Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:32 -0500 Subject: remote-hg: trivial cleanups Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index e0e68eff2c..ee60dbf047 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -74,11 +74,11 @@ def hgmode(mode): m = { '100755': 'x', '120000': 'l' } return m.get(mode, '') -def hghex(node): - return hg.node.hex(node) +def hghex(n): + return node.hex(n) -def hgbin(node): - return hg.node.bin(node) +def hgbin(n): + return node.bin(n) def hgref(ref): return ref.replace('___', ' ') @@ -734,12 +734,12 @@ def parse_commit(parser): if from_mark: p1 = mark_to_rev(from_mark) else: - p1 = '\0' * 20 + p1 = '0' * 40 if merge_mark: p2 = mark_to_rev(merge_mark) else: - p2 = '\0' * 20 + p2 = '0' * 40 # # If files changed from any of the parents, hg wants to know, but in git if @@ -826,7 +826,7 @@ def write_tag(repo, tag, node, msg, author): return context.memfilectx(f, content, False, False, None) p1 = tip.hex() - p2 = '\0' * 20 + p2 = '0' * 40 if not author: author = (None, 0, 0) user, date, tz = author -- cgit v1.2.3 From 63f54cf216944e8cadd7c762e624b0a7b1d0c3a2 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:33 -0500 Subject: remote-hg: improve progress calculation No need to manually keep track of the revision count. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index ee60dbf047..48edf3b562 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -415,7 +415,7 @@ def export_ref(repo, name, kind, head): tip = 0 revs = xrange(tip, head.rev() + 1) - count = 0 + total = len(revs) for rev in revs: @@ -423,7 +423,6 @@ def export_ref(repo, name, kind, head): node = c.node() if marks.is_marked(c.hex()): - count += 1 continue (manifest, user, (time, tz), files, desc, extra) = repo.changelog.read(node) @@ -495,9 +494,9 @@ def export_ref(repo, name, kind, head): print "D %s" % (fix_file_path(f)) print - count += 1 - if (count % 100 == 0): - print "progress revision %d '%s' (%d/%d)" % (rev, name, count, len(revs)) + progress = (rev - tip) + if (progress % 100 == 0): + print "progress revision %d '%s' (%d/%d)" % (rev, name, progress, total) # make sure the ref is updated print "reset %s/%s" % (prefix, ename) -- cgit v1.2.3 From 91347ea3e17b853155f9cab31f0c2a28143284ed Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:34 -0500 Subject: remote-hg: always point HEAD to master Mercurial always checks out the 'default' branch, so there's no point in complicating our lives trying to do something fancier, which causes different behavior depending on whether the repository is local or remote. So let's always use 'default' (which we translate to 'master'), unless we are in hg-git mode, which expects us to use the 'master' bookmark instead. Also, update the tests that used to check for different checkout behaviors to simply check that the refs are there, remove unnecessary ones, and fix the ones that expect something different. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 30 ++++++++++++--------------- contrib/remote-helpers/test-hg-bidi.sh | 9 ++++---- contrib/remote-helpers/test-hg-hg-git.sh | 4 +++- contrib/remote-helpers/test-hg.sh | 35 ++++++-------------------------- 4 files changed, 26 insertions(+), 52 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index 48edf3b562..7c859b82e8 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -560,22 +560,16 @@ def get_branch_tip(repo, branch): return heads[0] def list_head(repo, cur): - global g_head, bmarks + global g_head, bmarks, fake_bmark - head = bookmarks.readcurrent(repo) - if head: - node = repo[head] - else: - # fake bookmark from current branch - head = cur - node = repo['.'] - if not node: - node = repo['tip'] - if not node: - return - if head == 'default': - head = 'master' - bmarks[head] = node + if 'default' not in repo: + # empty repo + return + + node = repo['default'] + head = 'master' if not 'master' in bmarks else 'default' + fake_bmark = head + bmarks[head] = node head = gitref(head) print "@refs/heads/%s HEAD" % head @@ -910,8 +904,8 @@ def do_export(parser): if old == new: continue - if bmark == 'master' and 'master' not in parser.repo._bookmarks: - # fake bookmark + if bmark == fake_bmark or \ + bmark == 'master' and 'master' not in parser.repo._bookmarks: print "ok %s" % ref continue elif bookmarks.pushbookmark(parser.repo, bmark, old, new): @@ -946,6 +940,7 @@ def main(args): global track_branches, force_push, is_tmp global parsed_tags global filenodes + global fake_bmark alias = args[1] url = args[2] @@ -979,6 +974,7 @@ def main(args): marks = None parsed_tags = {} filenodes = {} + fake_bmark = None repo = get_repo(url, alias) prefix = 'refs/hg/%s' % alias diff --git a/contrib/remote-helpers/test-hg-bidi.sh b/contrib/remote-helpers/test-hg-bidi.sh index f0aa3c06c1..f83d67d74f 100755 --- a/contrib/remote-helpers/test-hg-bidi.sh +++ b/contrib/remote-helpers/test-hg-bidi.sh @@ -29,7 +29,6 @@ git_clone () { hg_clone () { ( hg init $2 && - hg -R $2 bookmark -i master && cd $1 && git push -q "hg::../$2" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*' ) && @@ -49,8 +48,7 @@ hg_push () { } hg_log () { - hg -R $1 log --graph --debug >log && - grep -v 'tag: *default/' log + hg -R $1 log --graph --debug } setup () { @@ -66,6 +64,7 @@ setup () { echo "graphlog =" ) >> "$HOME"/.hgrc && git config --global remote-hg.hg-git-compat true + git config --global remote-hg.track-branches true HGEDITOR=/usr/bin/true GIT_AUTHOR_DATE="2007-01-01 00:00:00 +0230" @@ -189,7 +188,7 @@ test_expect_success 'hg branch' ' hg_clone gitrepo hgrepo && cd hgrepo && - hg -q co master && + hg -q co default && hg mv alpha beta && hg -q commit -m "rename alpha to beta" && hg branch gamma | grep -v "permanent and global" && @@ -225,7 +224,7 @@ test_expect_success 'hg tags' ' hg_clone gitrepo hgrepo && cd hgrepo && - hg co master && + hg co default && hg tag alpha ) && diff --git a/contrib/remote-helpers/test-hg-hg-git.sh b/contrib/remote-helpers/test-hg-hg-git.sh index 37e59d8fe8..2219284382 100755 --- a/contrib/remote-helpers/test-hg-hg-git.sh +++ b/contrib/remote-helpers/test-hg-hg-git.sh @@ -27,7 +27,8 @@ fi # clone to a git repo with git git_clone_git () { - git clone -q "hg::$1" $2 + git clone -q "hg::$1" $2 && + (cd $2 && git checkout master && git branch -D default) } # clone to an hg repo with git @@ -63,6 +64,7 @@ hg_push_git () { cd $2 git checkout -q -b tmp && git fetch -q "hg::../$1" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*' && + git branch -D default && git checkout -q @{-1} && git branch -q -D tmp 2> /dev/null || true ) diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index af27a0f65f..4d5aba20a0 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -21,15 +21,8 @@ if ! python -c 'import mercurial'; then fi check () { - ( - cd $1 && - git log --format='%s' -1 && - git symbolic-ref HEAD - ) > actual && - ( - echo $2 && - echo "refs/heads/$3" - ) > expected && + echo $3 > expected && + git --git-dir=$1/.git log --format='%s' -1 $2 > actual test_cmp expected actual } @@ -56,7 +49,7 @@ test_expect_success 'cloning' ' ) && git clone "hg::hgrepo" gitrepo && - check gitrepo zero master + check gitrepo HEAD zero ' test_expect_success 'cloning with branches' ' @@ -70,12 +63,7 @@ test_expect_success 'cloning with branches' ' ) && git clone "hg::hgrepo" gitrepo && - check gitrepo next next && - - (cd hgrepo && hg checkout default) && - - git clone "hg::hgrepo" gitrepo2 && - check gitrepo2 zero master + check gitrepo origin/branches/next next ' test_expect_success 'cloning with bookmarks' ' @@ -83,25 +71,14 @@ test_expect_success 'cloning with bookmarks' ' ( cd hgrepo && + hg checkout default && hg bookmark feature-a && echo feature-a > content && hg commit -m feature-a ) && git clone "hg::hgrepo" gitrepo && - check gitrepo feature-a feature-a -' - -test_expect_success 'cloning with detached head' ' - test_when_finished "rm -rf gitrepo*" && - - ( - cd hgrepo && - hg update -r 0 - ) && - - git clone "hg::hgrepo" gitrepo && - check gitrepo zero master + check gitrepo origin/feature-a feature-a ' test_expect_success 'update bookmark' ' -- cgit v1.2.3 From 9f36d61e7b63618cc7931f948b7b57cdcd11bd7a Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:35 -0500 Subject: remote-hg: add tests for 'master' bookmark We want to make sure everything works correctly, even if there's a 'master' bookmark in Mercurial. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/test-hg.sh | 68 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index 4d5aba20a0..d244e236f6 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -26,13 +26,23 @@ check () { test_cmp expected actual } +check_branch () { + echo $3 > expected && + hg -R $1 log -r $2 --template '{desc}\n' > actual && + test_cmp expected actual +} + setup () { ( echo "[ui]" echo "username = H G Wells " echo "[extensions]" echo "mq =" - ) >> "$HOME"/.hgrc + ) >> "$HOME"/.hgrc && + + GIT_AUTHOR_DATE="2007-01-01 00:00:00 +0230" && + GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE" && + export GIT_COMMITTER_DATE GIT_AUTHOR_DATE } setup @@ -178,4 +188,60 @@ test_expect_success 'strip' ' test_cmp actual expected ' +test_expect_success 'remote push with master bookmark' ' + test_when_finished "rm -rf hgrepo gitrepo*" && + + ( + hg init hgrepo && + cd hgrepo && + echo zero > content && + hg add content && + hg commit -m zero && + hg bookmark master && + echo one > content && + hg commit -m one + ) && + + ( + git clone "hg::hgrepo" gitrepo && + cd gitrepo && + echo two > content && + git commit -a -m two && + git push + ) && + + check_branch hgrepo default two +' + +cat > expected < +date: Mon Jan 01 00:00:00 2007 +0230 +summary: one + +EOF + +test_expect_success 'remote push from master branch' ' + test_when_finished "rm -rf hgrepo gitrepo*" && + + hg init hgrepo && + + ( + git init gitrepo && + cd gitrepo && + git remote add origin "hg::../hgrepo" && + echo one > content && + git add content && + git commit -a -m one && + git push origin master + ) && + + hg -R hgrepo log > actual && + cat actual && + test_cmp expected actual && + + check_branch hgrepo default one +' + test_done -- cgit v1.2.3 From 0067ecc82b2dbef64d3768484eb6a1b4ca2c27d2 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:36 -0500 Subject: remote-bzr: simplify test checks Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/test-bzr.sh | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/test-bzr.sh b/contrib/remote-helpers/test-bzr.sh index f215b26bac..dce281f911 100755 --- a/contrib/remote-helpers/test-bzr.sh +++ b/contrib/remote-helpers/test-bzr.sh @@ -18,15 +18,8 @@ if ! python -c 'import bzrlib'; then fi check () { - ( - cd $1 && - git log --format='%s' -1 && - git symbolic-ref HEAD - ) > actual && - ( - echo $2 && - echo "refs/heads/$3" - ) > expected && + echo $3 > expected && + git --git-dir=$1/.git log --format='%s' -1 $2 > actual test_cmp expected actual } @@ -42,7 +35,7 @@ test_expect_success 'cloning' ' ) && git clone "bzr::bzrrepo" gitrepo && - check gitrepo one master + check gitrepo HEAD one ' test_expect_success 'pulling' ' @@ -54,7 +47,7 @@ test_expect_success 'pulling' ' (cd gitrepo && git pull) && - check gitrepo two master + check gitrepo HEAD two ' test_expect_success 'pushing' ' @@ -89,7 +82,7 @@ test_expect_success 'roundtrip' ' (cd gitrepo && git pull && git push) && - check gitrepo four master && + check gitrepo HEAD four && ( cd gitrepo && -- cgit v1.2.3 From b082b4f94ff1a82ce42223f7a46c9423e99c48e9 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:37 -0500 Subject: remote-hg: add check_bookmark() test helper And check in a more proper way. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/test-hg.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index d244e236f6..4e56640101 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -32,6 +32,12 @@ check_branch () { test_cmp expected actual } +check_bookmark () { + echo $3 > expected && + hg -R $1 log -r "bookmark('$2')" --template '{desc}\n' > actual && + test_cmp expected actual +} + setup () { ( echo "[ui]" @@ -108,7 +114,7 @@ test_expect_success 'update bookmark' ' git push --quiet ) && - hg -R hgrepo bookmarks | egrep "devel[ ]+3:" + check_bookmark hgrepo devel devel ' # cleanup previous stuff -- cgit v1.2.3 From 731ce6cf75d304bc14c1ee0ad45e5846f5db6834 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:38 -0500 Subject: remote-hg: update bookmarks when using a remote Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index 7c859b82e8..76438a6870 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -356,6 +356,21 @@ def fixup_user(user): return '%s <%s>' % (name, mail) +def updatebookmarks(repo, peer): + remotemarks = peer.listkeys('bookmarks') + localmarks = repo._bookmarks + + if not remotemarks: + return + + for k, v in remotemarks.iteritems(): + localmarks[k] = hgbin(v) + + if hasattr(localmarks, 'write'): + localmarks.write() + else: + bookmarks.write(repo) + def get_repo(url, alias): global dirname, peer @@ -394,6 +409,8 @@ def get_repo(url, alias): die('Repository error') repo.pull(peer, heads=None, force=True) + updatebookmarks(repo, peer) + return repo def rev_to_mark(rev): -- cgit v1.2.3 From e6e803be79123dff163900c5a55e556cf6d6c9c0 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:39 -0500 Subject: remote-hg: add remote tests The logic when working with a local repository is totally different from the one where we work with a remote repository; we need to pull and push from it. All this logic is currently not tested at all, so let's introduce a variable to force the remote behavior. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 2 +- contrib/remote-helpers/test-hg.sh | 38 ++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index 76438a6870..61e6c87724 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -383,7 +383,7 @@ def get_repo(url, alias): extensions.loadall(myui) - if hg.islocal(url): + if hg.islocal(url) and not os.environ.get('GIT_REMOTE_HG_TEST_REMOTE'): repo = hg.repository(myui, url) if not os.path.exists(dirname): os.makedirs(dirname) diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index 4e56640101..c36b729770 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -250,4 +250,42 @@ test_expect_success 'remote push from master branch' ' check_branch hgrepo default one ' +GIT_REMOTE_HG_TEST_REMOTE=1 +export GIT_REMOTE_HG_TEST_REMOTE + +test_expect_success 'remote cloning' ' + test_when_finished "rm -rf gitrepo*" && + + ( + hg init hgrepo && + cd hgrepo && + echo zero > content && + hg add content && + hg commit -m zero + ) && + + git clone "hg::hgrepo" gitrepo && + check gitrepo HEAD zero +' + +test_expect_success 'remote update bookmark' ' + test_when_finished "rm -rf gitrepo*" && + + ( + cd hgrepo && + hg bookmark devel + ) && + + ( + git clone "hg::hgrepo" gitrepo && + cd gitrepo && + git checkout --quiet devel && + echo devel > content && + git commit -a -m devel && + git push --quiet + ) && + + check_bookmark hgrepo devel devel +' + test_done -- cgit v1.2.3 From e14432f798d6575b5c8269982758c0916a5f13c5 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:40 -0500 Subject: remote-hg: add test to push new bookmark Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/test-hg.sh | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'contrib') diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index c36b729770..8d70f4aefc 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -117,6 +117,21 @@ test_expect_success 'update bookmark' ' check_bookmark hgrepo devel devel ' +test_expect_success 'new bookmark' ' + test_when_finished "rm -rf gitrepo*" && + + ( + git clone "hg::hgrepo" gitrepo && + cd gitrepo && + git checkout --quiet -b feature-b && + echo feature-b > content && + git commit -a -m feature-b && + git push --quiet origin feature-b + ) && + + check_bookmark hgrepo feature-b feature-b +' + # cleanup previous stuff rm -rf hgrepo @@ -288,4 +303,19 @@ test_expect_success 'remote update bookmark' ' check_bookmark hgrepo devel devel ' +test_expect_success 'remote new bookmark' ' + test_when_finished "rm -rf gitrepo*" && + + ( + git clone "hg::hgrepo" gitrepo && + cd gitrepo && + git checkout --quiet -b feature-b && + echo feature-b > content && + git commit -a -m feature-b && + git push --quiet origin feature-b + ) && + + check_bookmark hgrepo feature-b feature-b +' + test_done -- cgit v1.2.3 From 1a810864e87b78c08295acca124eb66b8cf2a973 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:41 -0500 Subject: remote-hg: add test for diverged push Neither mercurial nor git allows pushing to a remote when it's a non-fast-forward push. We should be able to detect these errors and report them properly, as opposed to throwing an exception stack-trace. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/test-hg.sh | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'contrib') diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index 8d70f4aefc..f4dac526ee 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -318,4 +318,27 @@ test_expect_success 'remote new bookmark' ' check_bookmark hgrepo feature-b feature-b ' +test_expect_failure 'remote push diverged' ' + test_when_finished "rm -rf gitrepo*" && + + git clone "hg::hgrepo" gitrepo && + + ( + cd hgrepo && + hg checkout default && + echo bump > content && + hg commit -m bump + ) && + + ( + cd gitrepo && + echo diverge > content && + git commit -a -m diverged && + test_expect_code 1 git push 2> error && + grep "^ ! \[rejected\] *master -> master (non-fast-forward)$" error + ) && + + check_branch hgrepo default bump +' + test_done -- cgit v1.2.3 From 747b61c6a66b5af279fdc1f919e9519045ed097a Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:42 -0500 Subject: remote-hg: add test for bookmark diverge Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/test-hg.sh | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'contrib') diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index f4dac526ee..5b54e4b5c8 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -341,4 +341,33 @@ test_expect_failure 'remote push diverged' ' check_branch hgrepo default bump ' +test_expect_failure 'remote update bookmark diverge' ' + test_when_finished "rm -rf gitrepo*" && + + ( + cd hgrepo && + hg checkout tip^ && + hg bookmark diverge + ) && + + git clone "hg::hgrepo" gitrepo && + + ( + cd hgrepo && + echo "bump bookmark" > content && + hg commit -m "bump bookmark" + ) && + + ( + cd gitrepo && + git checkout --quiet diverge && + echo diverge > content && + git commit -a -m diverge && + test_expect_code 1 git push 2> error && + grep "^ ! \[rejected\] *diverge -> diverge (non-fast-forward)$" error + ) && + + check_bookmark hgrepo diverge "bump bookmark" +' + test_done -- cgit v1.2.3 From ad22b92a810bd793e4a357d0230beefb865e929e Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:43 -0500 Subject: remote-hg: add test for new bookmark special From the point of view of Mercurial, this creates a new branch head, and requires a forced push. Ideally, however, we would want it to work just like in git; new branches can be pushed without problems. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/test-hg.sh | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'contrib') diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index 5b54e4b5c8..7a6e5dab51 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -370,4 +370,19 @@ test_expect_failure 'remote update bookmark diverge' ' check_bookmark hgrepo diverge "bump bookmark" ' +test_expect_failure 'remote new bookmark multiple branch head' ' + test_when_finished "rm -rf gitrepo*" && + + ( + git clone "hg::hgrepo" gitrepo && + cd gitrepo && + git checkout --quiet -b feature-c HEAD^ && + echo feature-c > content && + git commit -a -m feature-c && + git push --quiet origin feature-c + ) && + + check_bookmark hgrepo feature-c feature-c +' + test_done -- cgit v1.2.3 From d2c76330286c8bd604f9fbbb7818cecce893b769 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:44 -0500 Subject: remote-hg: add test for big push With lots branches and bookmarks, non-ff, updated and new. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/test-hg.sh | 113 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 107 insertions(+), 6 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index 7a6e5dab51..66e37af09a 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -27,15 +27,25 @@ check () { } check_branch () { - echo $3 > expected && - hg -R $1 log -r $2 --template '{desc}\n' > actual && - test_cmp expected actual + if [ -n "$3" ]; then + echo $3 > expected && + hg -R $1 log -r $2 --template '{desc}\n' > actual && + test_cmp expected actual + else + hg -R $1 branches > out && + ! grep $2 out + fi } check_bookmark () { - echo $3 > expected && - hg -R $1 log -r "bookmark('$2')" --template '{desc}\n' > actual && - test_cmp expected actual + if [ -n "$3" ]; then + echo $3 > expected && + hg -R $1 log -r "bookmark('$2')" --template '{desc}\n' > actual && + test_cmp expected actual + else + hg -R $1 bookmarks > out && + ! grep $2 out + fi } setup () { @@ -385,4 +395,95 @@ test_expect_failure 'remote new bookmark multiple branch head' ' check_bookmark hgrepo feature-c feature-c ' +# cleanup previous stuff +rm -rf hgrepo + +test_expect_failure 'remote big push' ' + test_when_finished "rm -rf hgrepo gitrepo*" && + + ( + hg init hgrepo && + cd hgrepo && + echo zero > content && + hg add content && + hg commit -m zero && + hg bookmark bad_bmark1 && + echo one > content && + hg commit -m one && + hg bookmark bad_bmark2 && + hg bookmark good_bmark && + hg bookmark -i good_bmark && + hg -q branch good_branch && + echo "good branch" > content && + hg commit -m "good branch" && + hg -q branch bad_branch && + echo "bad branch" > content && + hg commit -m "bad branch" + ) && + + git clone "hg::hgrepo" gitrepo && + + ( + cd gitrepo && + echo two > content && + git commit -q -a -m two && + + git checkout -q good_bmark && + echo three > content && + git commit -q -a -m three && + + git checkout -q bad_bmark1 && + git reset --hard HEAD^ && + echo four > content && + git commit -q -a -m four && + + git checkout -q bad_bmark2 && + git reset --hard HEAD^ && + echo five > content && + git commit -q -a -m five && + + git checkout -q -b new_bmark master && + echo six > content && + git commit -q -a -m six && + + git checkout -q branches/good_branch && + echo seven > content && + git commit -q -a -m seven && + echo eight > content && + git commit -q -a -m eight && + + git checkout -q branches/bad_branch && + git reset --hard HEAD^ && + echo nine > content && + git commit -q -a -m nine && + + git checkout -q -b branches/new_branch master && + echo ten > content && + git commit -q -a -m ten && + + test_expect_code 1 git push origin master \ + good_bmark bad_bmark1 bad_bmark2 new_bmark \ + branches/good_branch branches/bad_branch \ + branches/new_branch 2> error && + + grep "^ [a-f0-9]*\.\.[a-f0-9]* *master -> master$" error && + grep "^ [a-f0-9]*\.\.[a-f0-9]* *good_bmark -> good_bmark$" error && + grep "^ \* \[new branch\] *new_bmark -> new_bmark$" error && + grep "^ ! \[rejected\] *bad_bmark2 -> bad_bmark2 (non-fast-forward)$" error && + grep "^ ! \[rejected\] *bad_bmark1 -> bad_bmark1 (non-fast-forward)$" error && + grep "^ [a-f0-9]*\.\.[a-f0-9]* *branches/good_branch -> branches/good_branch$" error && + grep "^ ! \[rejected\] *branches/bad_branch -> branches/bad_branch (non-fast-forward)$" error && + grep "^ \* \[new branch\] *branches/new_branch -> branches/new_branch$" error + ) && + + check_branch hgrepo default one && + check_branch hgrepo good_branch "good branch" && + check_branch hgrepo bad_branch "bad branch" && + check_branch hgrepo new_branch '' && + check_bookmark hgrepo good_bmark one && + check_bookmark hgrepo bad_bmark1 one && + check_bookmark hgrepo bad_bmark2 one && + check_bookmark hgrepo new_bmark '' +' + test_done -- cgit v1.2.3 From 0bf9ee5720c6d98be8bee93ab3e1a80451de767c Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:45 -0500 Subject: remote-hg: add test for failed double push Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/test-hg.sh | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'contrib') diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index 66e37af09a..cbaac51c27 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -486,4 +486,28 @@ test_expect_failure 'remote big push' ' check_bookmark hgrepo new_bmark '' ' +test_expect_failure 'remote double failed push' ' + test_when_finished "rm -rf hgrepo gitrepo*" && + + ( + hg init hgrepo && + cd hgrepo && + echo zero > content && + hg add content && + hg commit -m zero && + echo one > content && + hg commit -m one + ) && + + ( + git clone "hg::hgrepo" gitrepo && + cd gitrepo && + git reset --hard HEAD^ && + echo two > content && + git commit -a -m two && + test_expect_code 1 git push && + test_expect_code 1 git push + ) +' + test_done -- cgit v1.2.3 From aaadca28b6148c262385c258c761e166eff6fbeb Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:46 -0500 Subject: remote-hg: reorganize bookmark handling We don't need to update both internal and remote bookmarks, so let's do one or the other, and move the shared code earlier, so it's simpler. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 50 ++++++++++++++---------------------- 1 file changed, 19 insertions(+), 31 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index 61e6c87724..99de7c2ff0 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -885,8 +885,17 @@ def do_export(parser): print "ok %s" % ref elif ref.startswith('refs/heads/'): bmark = ref[len('refs/heads/'):] - p_bmarks.append((bmark, node)) - continue + new = node + old = bmarks[bmark].hex() if bmark in bmarks else '' + + if old == new: + continue + + print "ok %s" % ref + if bmark != fake_bmark and \ + not (bmark == 'master' and bmark not in parser.repo._bookmarks): + p_bmarks.append((ref, bmark, old, new)) + elif ref.startswith('refs/tags/'): tag = ref[len('refs/tags/'):] tag = hgref(tag) @@ -906,39 +915,18 @@ def do_export(parser): if peer: parser.repo.push(peer, force=force_push, newbranch=True) - remote_bmarks = peer.listkeys('bookmarks') - - # handle bookmarks - for bmark, node in p_bmarks: - ref = 'refs/heads/' + bmark - new = node - - if bmark in bmarks: - old = bmarks[bmark].hex() - else: - old = '' - - if old == new: - continue - if bmark == fake_bmark or \ - bmark == 'master' and 'master' not in parser.repo._bookmarks: - print "ok %s" % ref - continue - elif bookmarks.pushbookmark(parser.repo, bmark, old, new): - # updated locally - pass - else: - print "error %s" % ref - continue - - if peer: + # update remote bookmarks + remote_bmarks = peer.listkeys('bookmarks') + for ref, bmark, old, new in p_bmarks: old = remote_bmarks.get(bmark, '') if not peer.pushkey('bookmarks', bmark, old, new): print "error %s" % ref - continue - - print "ok %s" % ref + else: + # update local bookmarks + for ref, bmark, old, new in p_bmarks: + if not bookmarks.pushbookmark(parser.repo, bmark, old, new): + print "error %s" % ref print -- cgit v1.2.3 From dfcef29f2f32046f3edbcaee47a03d94bc237eb8 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:47 -0500 Subject: remote-hg: force remote bookmark push selectively If we update the 'old' node, we might be updating the remote bookmark even when our 'new' node is not related at all to what the remote has, effectively forcing an update. Let's do that only when forced push is configured. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index 99de7c2ff0..4d650b5f60 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -919,7 +919,8 @@ def do_export(parser): # update remote bookmarks remote_bmarks = peer.listkeys('bookmarks') for ref, bmark, old, new in p_bmarks: - old = remote_bmarks.get(bmark, '') + if force_push: + old = remote_bmarks.get(bmark, '') if not peer.pushkey('bookmarks', bmark, old, new): print "error %s" % ref else: -- cgit v1.2.3 From d226945471d6c2d5ec6b42bdac78a4e6518c1be9 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:48 -0500 Subject: remote-hg: only update necessary revisions We don't care about the rest, and in fact, we shouldn't try to push everything, as there might be garbage from previous failed pushes. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index 4d650b5f60..7added3b33 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -858,6 +858,7 @@ def do_export(parser): global parsed_refs, bmarks, peer p_bmarks = [] + p_revs = set() parser.next() @@ -882,6 +883,7 @@ def do_export(parser): if branch in branches and bnode in branches[branch]: # up to date continue + p_revs.add(bnode) print "ok %s" % ref elif ref.startswith('refs/heads/'): bmark = ref[len('refs/heads/'):] @@ -896,6 +898,7 @@ def do_export(parser): not (bmark == 'master' and bmark not in parser.repo._bookmarks): p_bmarks.append((ref, bmark, old, new)) + p_revs.add(bnode) elif ref.startswith('refs/tags/'): tag = ref[len('refs/tags/'):] tag = hgref(tag) @@ -903,18 +906,20 @@ def do_export(parser): if mode == 'git': if not msg: msg = 'Added tag %s for changeset %s' % (tag, node[:12]); - write_tag(parser.repo, tag, node, msg, author) + tagnode = write_tag(parser.repo, tag, node, msg, author) + p_revs.add(tagnode) else: fp = parser.repo.opener('localtags', 'a') fp.write('%s %s\n' % (node, tag)) fp.close() + p_revs.add(bnode) print "ok %s" % ref else: # transport-helper/fast-export bugs continue if peer: - parser.repo.push(peer, force=force_push, newbranch=True) + parser.repo.push(peer, force=force_push, newbranch=True, revs=list(p_revs)) # update remote bookmarks remote_bmarks = peer.listkeys('bookmarks') -- cgit v1.2.3 From 4f37bdbdb6229931c464b99eb9f6e198de01d0a7 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:49 -0500 Subject: remote-hg: implement custom push() The one from mercurial does a ton of things we are not interested in, and we need some special modifications which are impossible otherwise. Most of the code is borrowed from Mercurial, and cleaned up, but should be functionally the same for our purposes, except that multiple heads are not detected. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 44 ++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index 7added3b33..c2c1cb8b52 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -12,7 +12,7 @@ # For remote repositories a local clone is stored in # "$GIT_DIR/hg/origin/clone/.hg/". -from mercurial import hg, ui, bookmarks, context, encoding, node, error, extensions +from mercurial import hg, ui, bookmarks, context, encoding, node, error, extensions, discovery import re import sys @@ -854,6 +854,46 @@ def write_tag(repo, tag, node, msg, author): return tagnode +def push_unsafe(repo, remote, parsed_refs, p_revs): + + force = force_push + + fci = discovery.findcommonincoming + commoninc = fci(repo, remote, force=force) + common, _, remoteheads = commoninc + + # TODO checkheads + + cg = repo.getbundle('push', heads=list(p_revs), common=common) + + unbundle = remote.capable('unbundle') + if unbundle: + if force: + remoteheads = ['force'] + return remote.unbundle(cg, remoteheads, 'push') + else: + return remote.addchangegroup(cg, 'push', repo.url()) + +def push(repo, remote, parsed_refs, p_revs): + if hasattr(remote, 'canpush') and not remote.canpush(): + print "error cannot push" + + if not p_revs: + # nothing to push + return + + lock = None + unbundle = remote.capable('unbundle') + if not unbundle: + lock = remote.lock() + try: + ret = push_unsafe(repo, remote, parsed_refs, p_revs) + finally: + if lock is not None: + lock.release() + + return ret + def do_export(parser): global parsed_refs, bmarks, peer @@ -919,7 +959,7 @@ def do_export(parser): continue if peer: - parser.repo.push(peer, force=force_push, newbranch=True, revs=list(p_revs)) + push(parser.repo, peer, parsed_refs, p_revs) # update remote bookmarks remote_bmarks = peer.listkeys('bookmarks') -- cgit v1.2.3 From 19a8cefc44b216db5cf8faf790d197c85db6395e Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:50 -0500 Subject: remote-hg: implement custom checkheads() The version from Mercurial is extremely inefficient and convoluted, this version achieves basically the same, at least for our purposes. No functional changes. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 52 +++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 3 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index c2c1cb8b52..7eb809b2ce 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -12,7 +12,7 @@ # For remote repositories a local clone is stored in # "$GIT_DIR/hg/origin/clone/.hg/". -from mercurial import hg, ui, bookmarks, context, encoding, node, error, extensions, discovery +from mercurial import hg, ui, bookmarks, context, encoding, node, error, extensions, discovery, util import re import sys @@ -86,6 +86,11 @@ def hgref(ref): def gitref(ref): return ref.replace(' ', '___') +def check_version(*check): + if not hg_version: + return True + return hg_version >= check + def get_config(config): cmd = ['git', 'config', '--get', config] process = subprocess.Popen(cmd, stdout=subprocess.PIPE) @@ -854,6 +859,42 @@ def write_tag(repo, tag, node, msg, author): return tagnode +def checkheads(repo, remote, p_revs): + + remotemap = remote.branchmap() + if not remotemap: + # empty repo + return + + new = {} + + for node in p_revs: + ctx = repo[node] + branch = ctx.branch() + if not branch in remotemap: + # new branch + continue + new.setdefault(branch, []).append(ctx.rev()) + + for branch, heads in new.iteritems(): + old = [repo.changelog.rev(x) for x in remotemap[branch]] + for rev in heads: + if check_version(2, 3): + ancestors = repo.changelog.ancestors([rev], stoprev=min(old)) + else: + ancestors = repo.changelog.ancestors(rev) + found = False + + for x in old: + if x in ancestors: + found = True + break + + if found: + continue + + raise Exception("non-fast-forward") + def push_unsafe(repo, remote, parsed_refs, p_revs): force = force_push @@ -862,7 +903,8 @@ def push_unsafe(repo, remote, parsed_refs, p_revs): commoninc = fci(repo, remote, force=force) common, _, remoteheads = commoninc - # TODO checkheads + if not force: + checkheads(repo, remote, p_revs) cg = repo.getbundle('push', heads=list(p_revs), common=common) @@ -991,7 +1033,7 @@ def main(args): global track_branches, force_push, is_tmp global parsed_tags global filenodes - global fake_bmark + global fake_bmark, hg_version alias = args[1] url = args[2] @@ -1026,6 +1068,10 @@ def main(args): parsed_tags = {} filenodes = {} fake_bmark = None + try: + hg_version = tuple(int(e) for e in util.version().split('.')) + except: + hg_version = None repo = get_repo(url, alias) prefix = 'refs/hg/%s' % alias -- cgit v1.2.3 From 883d7be110968c0d319dfa7c595c640e616da9c5 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:51 -0500 Subject: remote-hg: pass around revision refs So that when a diverge is detected, we know which ref to report an error for. Also, since we are not throwing an exception, return a proper error code. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 34 +++++++++++++++++++++------------- contrib/remote-helpers/test-hg.sh | 6 +++--- 2 files changed, 24 insertions(+), 16 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index 7eb809b2ce..b6f85b2712 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -857,18 +857,19 @@ def write_tag(repo, tag, node, msg, author): encoding.encoding = tmp - return tagnode + return (tagnode, branch) def checkheads(repo, remote, p_revs): remotemap = remote.branchmap() if not remotemap: # empty repo - return + return True new = {} + ret = True - for node in p_revs: + for node, ref in p_revs.iteritems(): ctx = repo[node] branch = ctx.branch() if not branch in remotemap: @@ -893,7 +894,11 @@ def checkheads(repo, remote, p_revs): if found: continue - raise Exception("non-fast-forward") + node = repo.changelog.node(rev) + print "error %s non-fast forward" % p_revs[node] + ret = False + + return ret def push_unsafe(repo, remote, parsed_refs, p_revs): @@ -903,8 +908,8 @@ def push_unsafe(repo, remote, parsed_refs, p_revs): commoninc = fci(repo, remote, force=force) common, _, remoteheads = commoninc - if not force: - checkheads(repo, remote, p_revs) + if not force and not checkheads(repo, remote, p_revs): + return None cg = repo.getbundle('push', heads=list(p_revs), common=common) @@ -940,7 +945,7 @@ def do_export(parser): global parsed_refs, bmarks, peer p_bmarks = [] - p_revs = set() + p_revs = {} parser.next() @@ -965,7 +970,7 @@ def do_export(parser): if branch in branches and bnode in branches[branch]: # up to date continue - p_revs.add(bnode) + p_revs[bnode] = ref print "ok %s" % ref elif ref.startswith('refs/heads/'): bmark = ref[len('refs/heads/'):] @@ -980,7 +985,7 @@ def do_export(parser): not (bmark == 'master' and bmark not in parser.repo._bookmarks): p_bmarks.append((ref, bmark, old, new)) - p_revs.add(bnode) + p_revs[bnode] = ref elif ref.startswith('refs/tags/'): tag = ref[len('refs/tags/'):] tag = hgref(tag) @@ -988,20 +993,23 @@ def do_export(parser): if mode == 'git': if not msg: msg = 'Added tag %s for changeset %s' % (tag, node[:12]); - tagnode = write_tag(parser.repo, tag, node, msg, author) - p_revs.add(tagnode) + tagnode, branch = write_tag(parser.repo, tag, node, msg, author) + p_revs[tagnode] = 'refs/heads/branches/' + gitref(branch) else: fp = parser.repo.opener('localtags', 'a') fp.write('%s %s\n' % (node, tag)) fp.close() - p_revs.add(bnode) + p_revs[bnode] = ref print "ok %s" % ref else: # transport-helper/fast-export bugs continue if peer: - push(parser.repo, peer, parsed_refs, p_revs) + if not push(parser.repo, peer, parsed_refs, p_revs): + # do not update bookmarks + print + return # update remote bookmarks remote_bmarks = peer.listkeys('bookmarks') diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index cbaac51c27..608b1bbbfa 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -328,7 +328,7 @@ test_expect_success 'remote new bookmark' ' check_bookmark hgrepo feature-b feature-b ' -test_expect_failure 'remote push diverged' ' +test_expect_success 'remote push diverged' ' test_when_finished "rm -rf gitrepo*" && git clone "hg::hgrepo" gitrepo && @@ -351,7 +351,7 @@ test_expect_failure 'remote push diverged' ' check_branch hgrepo default bump ' -test_expect_failure 'remote update bookmark diverge' ' +test_expect_success 'remote update bookmark diverge' ' test_when_finished "rm -rf gitrepo*" && ( @@ -398,7 +398,7 @@ test_expect_failure 'remote new bookmark multiple branch head' ' # cleanup previous stuff rm -rf hgrepo -test_expect_failure 'remote big push' ' +test_expect_success 'remote big push' ' test_when_finished "rm -rf hgrepo gitrepo*" && ( -- cgit v1.2.3 From d3c460b5b43ab67de894c9d3b6d6ce20f3f00070 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:52 -0500 Subject: remote-hg: check diverged bookmarks So that we can report a proper error. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 24 ++++++++++++++++++++++++ contrib/remote-helpers/test-hg.sh | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index b6f85b2712..e8ebc17e75 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -859,6 +859,23 @@ def write_tag(repo, tag, node, msg, author): return (tagnode, branch) +def checkheads_bmark(repo, ref, ctx): + if force_push: + return True + + bmark = ref[len('refs/heads/'):] + if not bmark in bmarks: + # new bmark + return True + + ctx_old = bmarks[bmark] + ctx_new = ctx + if not repo.changelog.descendant(ctx_old.rev(), ctx_new.rev()): + print "error %s non-fast forward" % ref + return False + + return True + def checkheads(repo, remote, p_revs): remotemap = remote.branchmap() @@ -875,6 +892,13 @@ def checkheads(repo, remote, p_revs): if not branch in remotemap: # new branch continue + if not ref.startswith('refs/heads/branches'): + if ref.startswith('refs/heads/'): + if not checkheads_bmark(repo, ref, ctx): + ret = False + + # only check branches + continue new.setdefault(branch, []).append(ctx.rev()) for branch, heads in new.iteritems(): diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index 608b1bbbfa..20f5b32123 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -380,7 +380,7 @@ test_expect_success 'remote update bookmark diverge' ' check_bookmark hgrepo diverge "bump bookmark" ' -test_expect_failure 'remote new bookmark multiple branch head' ' +test_expect_success 'remote new bookmark multiple branch head' ' test_when_finished "rm -rf gitrepo*" && ( -- cgit v1.2.3 From 611024e606c8019d348ab1821a1fbb1898384a25 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:53 -0500 Subject: remote-hg: simplify branch_tip() It simply picks the last head that is not closed, but we have a stored list of open heads. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index e8ebc17e75..8df72d90c8 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -560,12 +560,8 @@ def do_capabilities(parser): print -def branch_tip(repo, branch): - # older versions of mercurial don't have this - if hasattr(repo, 'branchtip'): - return repo.branchtip(branch) - else: - return repo.branchtags()[branch] +def branch_tip(branch): + return branches[branch][-1] def get_branch_tip(repo, branch): global branches @@ -577,7 +573,7 @@ def get_branch_tip(repo, branch): # verify there's only one head if (len(heads) > 1): warn("Branch '%s' has more than one head, consider merging" % branch) - return branch_tip(repo, hgref(branch)) + return branch_tip(hgref(branch)) return heads[0] @@ -828,7 +824,7 @@ def parse_tag(parser): def write_tag(repo, tag, node, msg, author): branch = repo[node].branch() - tip = branch_tip(repo, branch) + tip = branch_tip(branch) tip = repo[tip] def getfilectx(repo, memctx, f): -- cgit v1.2.3 From c2f7a82032bff3f516aa7d029506aed096a01e0b Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:54 -0500 Subject: remote-hg: improve branch listing We want to show the remote heads, not the internal ones, which might have garbage. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index 8df72d90c8..5ad5c1e1a3 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -605,9 +605,12 @@ def do_list(parser): list_head(repo, cur) if track_branches: - for branch in repo.branchmap(): - heads = repo.branchheads(branch) - if len(heads): + orig = peer if peer else repo + + for branch, heads in orig.branchmap().iteritems(): + # only open heads + heads = [h for h in heads if 'close' not in repo.changelog.read(h)[5]] + if heads: branches[branch] = heads for branch in branches: -- cgit v1.2.3 From b688911a789e4eb1cfb97e1a59df0b14817b9d1a Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:55 -0500 Subject: remote-hg: use remote 'default' not local one Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 19 +++++++++---------- contrib/remote-helpers/test-hg.sh | 2 +- 2 files changed, 10 insertions(+), 11 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index 5ad5c1e1a3..a1b22f7c6c 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -580,11 +580,11 @@ def get_branch_tip(repo, branch): def list_head(repo, cur): global g_head, bmarks, fake_bmark - if 'default' not in repo: + if 'default' not in branches: # empty repo return - node = repo['default'] + node = repo[branch_tip('default')] head = 'master' if not 'master' in bmarks else 'default' fake_bmark = head bmarks[head] = node @@ -601,18 +601,17 @@ def do_list(parser): bmarks[bmark] = repo[node] cur = repo.dirstate.branch() + orig = peer if peer else repo + + for branch, heads in orig.branchmap().iteritems(): + # only open heads + heads = [h for h in heads if 'close' not in repo.changelog.read(h)[5]] + if heads: + branches[branch] = heads list_head(repo, cur) if track_branches: - orig = peer if peer else repo - - for branch, heads in orig.branchmap().iteritems(): - # only open heads - heads = [h for h in heads if 'close' not in repo.changelog.read(h)[5]] - if heads: - branches[branch] = heads - for branch in branches: print "? refs/heads/branches/%s" % gitref(branch) diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index 20f5b32123..b887233658 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -486,7 +486,7 @@ test_expect_success 'remote big push' ' check_bookmark hgrepo new_bmark '' ' -test_expect_failure 'remote double failed push' ' +test_expect_success 'remote double failed push' ' test_when_finished "rm -rf hgrepo gitrepo*" && ( -- cgit v1.2.3 From d462469b4dd724b162a6ef29d0907eb133a5d56e Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:56 -0500 Subject: remote-hg: improve lightweight tag author Use git's committer. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index a1b22f7c6c..fa76b3f610 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -840,13 +840,23 @@ def write_tag(repo, tag, node, msg, author): p1 = tip.hex() p2 = '0' * 40 - if not author: - author = (None, 0, 0) - user, date, tz = author + if author: + user, date, tz = author + date_tz = (date, tz) + else: + cmd = ['git', 'var', 'GIT_COMMITTER_IDENT'] + process = subprocess.Popen(cmd, stdout=subprocess.PIPE) + output, _ = process.communicate() + m = re.match('^.* <.*>', output) + if m: + user = m.group(0) + else: + user = repo.ui.username() + date_tz = None ctx = context.memctx(repo, (p1, p2), msg, ['.hgtags'], getfilectx, - user, (date, tz), {'branch' : branch}) + user, date_tz, {'branch' : branch}) tmp = encoding.encoding encoding.encoding = 'utf-8' -- cgit v1.2.3 From 66f46aa14fa48e5d17885b46e80250e155c255e3 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:57 -0500 Subject: remote-hg: remove files before modifications Otherwise replacing a file with a directory doesn't work. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index fa76b3f610..bd545aa380 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -510,10 +510,10 @@ def export_ref(repo, name, kind, head): if len(parents) > 1: print "merge :%s" % (rev_to_mark(parents[1])) - for f in modified_final: - print "M %s :%u %s" % f for f in removed: print "D %s" % (fix_file_path(f)) + for f in modified_final: + print "M %s :%u %s" % f print progress = (rev - tip) -- cgit v1.2.3 From 2b02a40587a4a8b7f8bd0542b57c61ec97d0ef2a Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:58 -0500 Subject: remote-hg: add setup_big_push() helper So we don't duplicate these commands. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/test-hg.sh | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index b887233658..52c76ae0d7 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -398,9 +398,7 @@ test_expect_success 'remote new bookmark multiple branch head' ' # cleanup previous stuff rm -rf hgrepo -test_expect_success 'remote big push' ' - test_when_finished "rm -rf hgrepo gitrepo*" && - +setup_big_push () { ( hg init hgrepo && cd hgrepo && @@ -459,8 +457,17 @@ test_expect_success 'remote big push' ' git checkout -q -b branches/new_branch master && echo ten > content && - git commit -q -a -m ten && + git commit -q -a -m ten + ) +} +test_expect_success 'remote big push' ' + test_when_finished "rm -rf hgrepo gitrepo*" && + + setup_big_push + + ( + cd gitrepo && test_expect_code 1 git push origin master \ good_bmark bad_bmark1 bad_bmark2 new_bmark \ branches/good_branch branches/bad_branch \ -- cgit v1.2.3 From 42cbbcc73b312e2306f051f89702799546aa7953 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:29:59 -0500 Subject: remote-hg: add check_push() helper Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/test-hg.sh | 66 +++++++++++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 17 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index 52c76ae0d7..53d2504e12 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -48,6 +48,38 @@ check_bookmark () { fi } +check_push () { + local expected_ret=$1 ret=0 ref_ret=0 IFS=':' + + shift + git push origin "$@" 2> error + ret=$? + cat error + + while read branch kind + do + case "$kind" in + 'new') + grep "^ \* \[new branch\] *${branch} -> ${branch}$" error || ref_ret=1 + ;; + 'non-fast-forward') + grep "^ ! \[rejected\] *${branch} -> ${branch} (non-fast-forward)$" error || ref_ret=1 + ;; + '') + grep "^ [a-f0-9]*\.\.[a-f0-9]* *${branch} -> ${branch}$" error || ref_ret=1 + ;; + esac + let 'ref_ret' && echo "match for '$branch' failed" && break + done + + if let 'expected_ret != ret || ref_ret' + then + return 1 + fi + + return 0 +} + setup () { ( echo "[ui]" @@ -344,8 +376,9 @@ test_expect_success 'remote push diverged' ' cd gitrepo && echo diverge > content && git commit -a -m diverged && - test_expect_code 1 git push 2> error && - grep "^ ! \[rejected\] *master -> master (non-fast-forward)$" error + check_push 1 <<-EOF + master:non-fast-forward + EOF ) && check_branch hgrepo default bump @@ -373,8 +406,9 @@ test_expect_success 'remote update bookmark diverge' ' git checkout --quiet diverge && echo diverge > content && git commit -a -m diverge && - test_expect_code 1 git push 2> error && - grep "^ ! \[rejected\] *diverge -> diverge (non-fast-forward)$" error + check_push 1 <<-EOF + diverge:non-fast-forward + EOF ) && check_bookmark hgrepo diverge "bump bookmark" @@ -468,19 +502,17 @@ test_expect_success 'remote big push' ' ( cd gitrepo && - test_expect_code 1 git push origin master \ - good_bmark bad_bmark1 bad_bmark2 new_bmark \ - branches/good_branch branches/bad_branch \ - branches/new_branch 2> error && - - grep "^ [a-f0-9]*\.\.[a-f0-9]* *master -> master$" error && - grep "^ [a-f0-9]*\.\.[a-f0-9]* *good_bmark -> good_bmark$" error && - grep "^ \* \[new branch\] *new_bmark -> new_bmark$" error && - grep "^ ! \[rejected\] *bad_bmark2 -> bad_bmark2 (non-fast-forward)$" error && - grep "^ ! \[rejected\] *bad_bmark1 -> bad_bmark1 (non-fast-forward)$" error && - grep "^ [a-f0-9]*\.\.[a-f0-9]* *branches/good_branch -> branches/good_branch$" error && - grep "^ ! \[rejected\] *branches/bad_branch -> branches/bad_branch (non-fast-forward)$" error && - grep "^ \* \[new branch\] *branches/new_branch -> branches/new_branch$" error + + check_push 1 --all <<-EOF + master + good_bmark + branches/good_branch + new_bmark:new + branches/new_branch:new + bad_bmark1:non-fast-forward + bad_bmark2:non-fast-forward + branches/bad_branch:non-fast-forward + EOF ) && check_branch hgrepo default one && -- cgit v1.2.3 From 8316d18da324f44b93faf36cddbf19411b53d101 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:30:00 -0500 Subject: remote-helpers: improve marks usage Always convert to strings (they are unicode because they come from JSON). Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-bzr | 5 ++++- contrib/remote-helpers/git-remote-hg | 7 +++++-- 2 files changed, 9 insertions(+), 3 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-bzr b/contrib/remote-helpers/git-remote-bzr index 10300c63d1..f0e5be1d24 100755 --- a/contrib/remote-helpers/git-remote-bzr +++ b/contrib/remote-helpers/git-remote-bzr @@ -116,7 +116,10 @@ class Marks: self.last_mark = mark def get_tip(self, branch): - return self.tips.get(branch, None) + try: + return str(self.tips[branch]) + except KeyError: + return None def set_tip(self, branch, tip): self.tips[branch] = tip diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index bd545aa380..1e61f4327a 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -165,7 +165,7 @@ class Marks: return self.marks[rev] def to_rev(self, mark): - return self.rev_marks[mark] + return str(self.rev_marks[mark]) def next_mark(self): self.last_mark += 1 @@ -185,7 +185,10 @@ class Marks: return rev in self.marks def get_tip(self, branch): - return self.tips.get(branch, None) + try: + return str(self.tips[branch]) + except KeyError: + return None def set_tip(self, branch, tip): self.tips[branch] = tip -- cgit v1.2.3 From ab64bc9d21957d2ab30cd4a5e5359fb3f9155704 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:30:01 -0500 Subject: remote-hg: trivial cleanup It's better to catch the exception later on. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index 1e61f4327a..b08f909076 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -185,10 +185,7 @@ class Marks: return rev in self.marks def get_tip(self, branch): - try: - return str(self.tips[branch]) - except KeyError: - return None + return str(self.tips[branch]) def set_tip(self, branch, tip): self.tips[branch] = tip @@ -433,10 +430,10 @@ def export_ref(repo, name, kind, head): global prefix, marks, mode ename = '%s/%s' % (kind, name) - tip = marks.get_tip(ename) - if tip and tip in repo: + try: + tip = marks.get_tip(ename) tip = repo[tip].rev() - else: + except: tip = 0 revs = xrange(tip, head.rev() + 1) -- cgit v1.2.3 From ba091c200d88b27a0bd9027f24a7250f196fc304 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:30:02 -0500 Subject: remote-hg: check if a fetch is needed Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 39 ++++++++++++++++++++ contrib/remote-helpers/test-hg.sh | 71 +++++++++++++++++++++++++++++++++++- 2 files changed, 109 insertions(+), 1 deletion(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index b08f909076..b983627ce3 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -973,6 +973,15 @@ def push(repo, remote, parsed_refs, p_revs): return ret +def check_tip(ref, kind, name, heads): + try: + ename = '%s/%s' % (kind, name) + tip = marks.get_tip(ename) + except KeyError: + return True + else: + return tip in heads + def do_export(parser): global parsed_refs, bmarks, peer @@ -995,6 +1004,8 @@ def do_export(parser): else: die('unhandled export command: %s' % line) + need_fetch = False + for ref, node in parsed_refs.iteritems(): bnode = hgbin(node) if ref.startswith('refs/heads/branches'): @@ -1002,6 +1013,16 @@ def do_export(parser): if branch in branches and bnode in branches[branch]: # up to date continue + + if peer: + remotemap = peer.branchmap() + if remotemap and branch in remotemap: + heads = [hghex(e) for e in remotemap[branch]] + if not check_tip(ref, 'branches', branch, heads): + print "error %s fetch first" % ref + need_fetch = True + continue + p_revs[bnode] = ref print "ok %s" % ref elif ref.startswith('refs/heads/'): @@ -1017,6 +1038,14 @@ def do_export(parser): not (bmark == 'master' and bmark not in parser.repo._bookmarks): p_bmarks.append((ref, bmark, old, new)) + if peer: + remote_old = peer.listkeys('bookmarks').get(bmark) + if remote_old: + if not check_tip(ref, 'bookmarks', bmark, remote_old): + print "error %s fetch first" % ref + need_fetch = True + continue + p_revs[bnode] = ref elif ref.startswith('refs/tags/'): tag = ref[len('refs/tags/'):] @@ -1037,6 +1066,16 @@ def do_export(parser): # transport-helper/fast-export bugs continue + if need_fetch: + print + return + + if dry_run: + if peer and not force_push: + checkheads(parser.repo, peer, p_revs) + print + return + if peer: if not push(parser.repo, peer, parsed_refs, p_revs): # do not update bookmarks diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index 53d2504e12..41ea2e8083 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -65,6 +65,9 @@ check_push () { 'non-fast-forward') grep "^ ! \[rejected\] *${branch} -> ${branch} (non-fast-forward)$" error || ref_ret=1 ;; + 'fetch-first') + grep "^ ! \[rejected\] *${branch} -> ${branch} (fetch first)$" error || ref_ret=1 + ;; '') grep "^ [a-f0-9]*\.\.[a-f0-9]* *${branch} -> ${branch}$" error || ref_ret=1 ;; @@ -407,7 +410,7 @@ test_expect_success 'remote update bookmark diverge' ' echo diverge > content && git commit -a -m diverge && check_push 1 <<-EOF - diverge:non-fast-forward + diverge:fetch-first EOF ) && @@ -525,6 +528,72 @@ test_expect_success 'remote big push' ' check_bookmark hgrepo new_bmark '' ' +test_expect_success 'remote big push fetch first' ' + test_when_finished "rm -rf hgrepo gitrepo*" && + + ( + hg init hgrepo && + cd hgrepo && + echo zero > content && + hg add content && + hg commit -m zero && + hg bookmark bad_bmark && + hg bookmark good_bmark && + hg bookmark -i good_bmark && + hg -q branch good_branch && + echo "good branch" > content && + hg commit -m "good branch" && + hg -q branch bad_branch && + echo "bad branch" > content && + hg commit -m "bad branch" + ) && + + git clone "hg::hgrepo" gitrepo && + + ( + cd hgrepo && + hg bookmark -f bad_bmark && + echo update_bmark > content && + hg commit -m "update bmark" + ) && + + ( + cd gitrepo && + echo two > content && + git commit -q -a -m two && + + git checkout -q good_bmark && + echo three > content && + git commit -q -a -m three && + + git checkout -q bad_bmark && + echo four > content && + git commit -q -a -m four && + + git checkout -q branches/bad_branch && + echo five > content && + git commit -q -a -m five && + + check_push 1 --all <<-EOF + master + good_bmark + new_bmark:new + new_branch:new + bad_bmark:fetch-first + branches/bad_branch:festch-first + EOF + + git fetch && + + check_push 1 --all <<-EOF + master + good_bmark + bad_bmark:non-fast-forward + branches/bad_branch:non-fast-forward + EOF + ) +' + test_expect_success 'remote double failed push' ' test_when_finished "rm -rf hgrepo gitrepo*" && -- cgit v1.2.3 From e3751a1763112b301f2269dd268190900d7ddd29 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:30:03 -0500 Subject: remote-hg: add support for --dry-run This needs a specific patch from Git not applied yet. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 29 +++++++++++++++++++++++++-- contrib/remote-helpers/test-hg.sh | 38 ++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 2 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index b983627ce3..20abb34801 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -557,6 +557,7 @@ def do_capabilities(parser): if os.path.exists(path): print "*import-marks %s" % path print "*export-marks %s" % path + print "option" print @@ -724,6 +725,11 @@ def parse_commit(parser): die('Unknown file command: %s' % line) files[path] = f + # only export the commits if we are on an internal proxy repo + if dry_run and not peer: + parsed_refs[ref] = None + return + def getfilectx(repo, memctx, f): of = files[f] if 'deleted' in of: @@ -809,7 +815,10 @@ def parse_reset(parser): from_mark = parser.get_mark() parser.next() - rev = mark_to_rev(from_mark) + try: + rev = mark_to_rev(from_mark) + except KeyError: + rev = None parsed_refs[ref] = rev def parse_tag(parser): @@ -1007,7 +1016,7 @@ def do_export(parser): need_fetch = False for ref, node in parsed_refs.iteritems(): - bnode = hgbin(node) + bnode = hgbin(node) if node else None if ref.startswith('refs/heads/branches'): branch = ref[len('refs/heads/branches/'):] if branch in branches and bnode in branches[branch]: @@ -1048,6 +1057,9 @@ def do_export(parser): p_revs[bnode] = ref elif ref.startswith('refs/tags/'): + if dry_run: + print "ok %s" % ref + continue tag = ref[len('refs/tags/'):] tag = hgref(tag) author, msg = parsed_tags.get(tag, (None, None)) @@ -1097,6 +1109,15 @@ def do_export(parser): print +def do_option(parser): + global dry_run + _, key, value = parser.line.split(' ') + if key == 'dry-run': + dry_run = (value == 'true') + print 'ok' + else: + print 'unsupported' + def fix_path(alias, repo, orig_url): url = urlparse.urlparse(orig_url, 'file') if url.scheme != 'file' or os.path.isabs(url.path): @@ -1113,6 +1134,7 @@ def main(args): global parsed_tags global filenodes global fake_bmark, hg_version + global dry_run alias = args[1] url = args[2] @@ -1151,6 +1173,7 @@ def main(args): hg_version = tuple(int(e) for e in util.version().split('.')) except: hg_version = None + dry_run = False repo = get_repo(url, alias) prefix = 'refs/hg/%s' % alias @@ -1175,6 +1198,8 @@ def main(args): do_import(parser) elif parser.check('export'): do_export(parser) + elif parser.check('option'): + do_option(parser) else: die('unhandled command: %s' % line) sys.stdout.flush() diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index 41ea2e8083..51f3c03875 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -594,6 +594,44 @@ test_expect_success 'remote big push fetch first' ' ) ' +test_expect_failure 'remote big push dry-run' ' + test_when_finished "rm -rf hgrepo gitrepo*" && + + setup_big_push + + ( + cd gitrepo && + + check_push 0 --dry-run --all <<-EOF + master + good_bmark + branches/good_branch + new_bmark:new + branches/new_branch:new + bad_bmark1:non-fast-forward + bad_bmark2:non-fast-forward + branches/bad_branch:non-fast-forward + EOF + + check_push 0 --dry-run master good_bmark new_bmark branches/good_branch branches/new_branch <<-EOF + master + good_bmark + branches/good_branch + new_bmark:new + branches/new_branch:new + EOF + ) && + + check_branch hgrepo default one && + check_branch hgrepo good_branch "good branch" && + check_branch hgrepo bad_branch "bad branch" && + check_branch hgrepo new_branch '' && + check_bookmark hgrepo good_bmark one && + check_bookmark hgrepo bad_bmark1 one && + check_bookmark hgrepo bad_bmark2 one && + check_bookmark hgrepo new_bmark '' +' + test_expect_success 'remote double failed push' ' test_when_finished "rm -rf hgrepo gitrepo*" && -- cgit v1.2.3 From c9eaef125bbecd60a8b328d58e66306d5db1357a Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 24 May 2013 21:30:04 -0500 Subject: remote-hg: add support for --force And get rid of the remote-hg.force-push option hack. Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- contrib/remote-helpers/git-remote-hg | 30 +++++++++++++++++------------- contrib/remote-helpers/test-hg.sh | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 13 deletions(-) (limited to 'contrib') diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index 20abb34801..0194c67fb1 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -29,9 +29,6 @@ import urlparse, hashlib # named branches: # git config --global remote-hg.track-branches false # -# If you don't want to force pushes (and thus risk creating new remote heads): -# git config --global remote-hg.force-push false -# # If you want the equivalent of hg's clone/pull--insecure option: # git config --global remote-hg.insecure true # @@ -877,9 +874,6 @@ def write_tag(repo, tag, node, msg, author): return (tagnode, branch) def checkheads_bmark(repo, ref, ctx): - if force_push: - return True - bmark = ref[len('refs/heads/'):] if not bmark in bmarks: # new bmark @@ -888,8 +882,11 @@ def checkheads_bmark(repo, ref, ctx): ctx_old = bmarks[bmark] ctx_new = ctx if not repo.changelog.descendant(ctx_old.rev(), ctx_new.rev()): - print "error %s non-fast forward" % ref - return False + if force_push: + print "ok %s forced update" % ref + else: + print "error %s non-fast forward" % ref + return False return True @@ -936,8 +933,12 @@ def checkheads(repo, remote, p_revs): continue node = repo.changelog.node(rev) - print "error %s non-fast forward" % p_revs[node] - ret = False + ref = p_revs[node] + if force_push: + print "ok %s forced update" % ref + else: + print "error %s non-fast forward" % ref + ret = False return ret @@ -949,7 +950,7 @@ def push_unsafe(repo, remote, parsed_refs, p_revs): commoninc = fci(repo, remote, force=force) common, _, remoteheads = commoninc - if not force and not checkheads(repo, remote, p_revs): + if not checkheads(repo, remote, p_revs): return None cg = repo.getbundle('push', heads=list(p_revs), common=common) @@ -1110,11 +1111,14 @@ def do_export(parser): print def do_option(parser): - global dry_run + global dry_run, force_push _, key, value = parser.line.split(' ') if key == 'dry-run': dry_run = (value == 'true') print 'ok' + elif key == 'force': + force_push = (value == 'true') + print 'ok' else: print 'unsupported' @@ -1142,7 +1146,7 @@ def main(args): hg_git_compat = get_config_bool('remote-hg.hg-git-compat') track_branches = get_config_bool('remote-hg.track-branches', True) - force_push = get_config_bool('remote-hg.force-push') + force_push = False if hg_git_compat: mode = 'hg' diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index 51f3c03875..f7ce8aa853 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -68,6 +68,9 @@ check_push () { 'fetch-first') grep "^ ! \[rejected\] *${branch} -> ${branch} (fetch first)$" error || ref_ret=1 ;; + 'forced-update') + grep "^ + [a-f0-9]*\.\.\.[a-f0-9]* *${branch} -> ${branch} (forced update)$" error || ref_ret=1 + ;; '') grep "^ [a-f0-9]*\.\.[a-f0-9]* *${branch} -> ${branch}$" error || ref_ret=1 ;; @@ -594,6 +597,36 @@ test_expect_success 'remote big push fetch first' ' ) ' +test_expect_failure 'remote big push force' ' + test_when_finished "rm -rf hgrepo gitrepo*" && + + setup_big_push + + ( + cd gitrepo && + + check_push 0 --force --all <<-EOF + master + good_bmark + branches/good_branch + new_bmark:new + branches/new_branch:new + bad_bmark1:forced-update + bad_bmark2:forced-update + branches/bad_branch:forced-update + EOF + ) && + + check_branch hgrepo default six && + check_branch hgrepo good_branch eight && + check_branch hgrepo bad_branch nine && + check_branch hgrepo new_branch ten && + check_bookmark hgrepo good_bmark three && + check_bookmark hgrepo bad_bmark1 four && + check_bookmark hgrepo bad_bmark2 five && + check_bookmark hgrepo new_bmark six +' + test_expect_failure 'remote big push dry-run' ' test_when_finished "rm -rf hgrepo gitrepo*" && -- cgit v1.2.3