|
|
#!/bin/sh
|
|
|
|
|
|
hg init a
|
|
|
mkdir a/d1
|
|
|
mkdir a/d1/d2
|
|
|
echo line 1 > a/a
|
|
|
echo line 1 > a/d1/d2/a
|
|
|
hg --cwd a ci -Ama
|
|
|
|
|
|
echo line 2 >> a/a
|
|
|
hg --cwd a ci -u someone -d '1 0' -m'second change'
|
|
|
|
|
|
echo % import exported patch
|
|
|
hg clone -r0 a b
|
|
|
hg --cwd a export tip > tip.patch
|
|
|
hg --cwd b import ../tip.patch
|
|
|
echo % message should be same
|
|
|
hg --cwd b tip | grep 'second change'
|
|
|
echo % committer should be same
|
|
|
hg --cwd b tip | grep someone
|
|
|
rm -r b
|
|
|
|
|
|
echo % import exported patch with external patcher
|
|
|
cat > dummypatch.py <<EOF
|
|
|
print 'patching file a'
|
|
|
file('a', 'wb').write('line2\n')
|
|
|
EOF
|
|
|
chmod +x dummypatch.py
|
|
|
hg clone -r0 a b
|
|
|
hg --cwd a export tip > tip.patch
|
|
|
hg --config ui.patch='python ../dummypatch.py' --cwd b import ../tip.patch
|
|
|
cat b/a
|
|
|
rm -r b
|
|
|
|
|
|
echo % import of plain diff should fail without message
|
|
|
hg clone -r0 a b
|
|
|
hg --cwd a diff -r0:1 > tip.patch
|
|
|
hg --cwd b import ../tip.patch
|
|
|
rm -r b
|
|
|
|
|
|
echo % import of plain diff should be ok with message
|
|
|
hg clone -r0 a b
|
|
|
hg --cwd a diff -r0:1 > tip.patch
|
|
|
hg --cwd b import -mpatch ../tip.patch
|
|
|
rm -r b
|
|
|
|
|
|
echo % import of plain diff with specific date and user
|
|
|
hg clone -r0 a b
|
|
|
hg --cwd a diff -r0:1 > tip.patch
|
|
|
hg --cwd b import -mpatch -d '1 0' -u 'user@nowhere.net' ../tip.patch
|
|
|
hg -R b tip -pv
|
|
|
rm -r b
|
|
|
|
|
|
echo % import of plain diff should be ok with --no-commit
|
|
|
hg clone -r0 a b
|
|
|
hg --cwd a diff -r0:1 > tip.patch
|
|
|
hg --cwd b import --no-commit ../tip.patch
|
|
|
hg --cwd b diff --nodates
|
|
|
rm -r b
|
|
|
|
|
|
echo % hg -R repo import
|
|
|
# put the clone in a subdir - having a directory named "a"
|
|
|
# used to hide a bug.
|
|
|
mkdir dir
|
|
|
hg clone -r0 a dir/b
|
|
|
hg --cwd a export tip > dir/tip.patch
|
|
|
cd dir
|
|
|
hg -R b import tip.patch
|
|
|
cd ..
|
|
|
rm -r dir
|
|
|
|
|
|
echo % import from stdin
|
|
|
hg clone -r0 a b
|
|
|
hg --cwd a export tip | hg --cwd b import -
|
|
|
rm -r b
|
|
|
|
|
|
echo % import two patches in one stream
|
|
|
hg init b
|
|
|
hg --cwd a export 0:tip | hg --cwd b import -
|
|
|
hg --cwd a id
|
|
|
hg --cwd b id
|
|
|
rm -r b
|
|
|
|
|
|
echo % override commit message
|
|
|
hg clone -r0 a b
|
|
|
hg --cwd a export tip | hg --cwd b import -m 'override' -
|
|
|
hg --cwd b tip | grep override
|
|
|
rm -r b
|
|
|
|
|
|
cat > mkmsg.py <<EOF
|
|
|
import email.Message, sys
|
|
|
msg = email.Message.Message()
|
|
|
msg.set_payload('email commit message\n' + open('tip.patch', 'rb').read())
|
|
|
msg['Subject'] = 'email patch'
|
|
|
msg['From'] = 'email patcher'
|
|
|
sys.stdout.write(msg.as_string())
|
|
|
EOF
|
|
|
|
|
|
echo % plain diff in email, subject, message body
|
|
|
hg clone -r0 a b
|
|
|
hg --cwd a diff -r0:1 > tip.patch
|
|
|
python mkmsg.py > msg.patch
|
|
|
hg --cwd b import ../msg.patch
|
|
|
hg --cwd b tip | grep email
|
|
|
rm -r b
|
|
|
|
|
|
echo % plain diff in email, no subject, message body
|
|
|
hg clone -r0 a b
|
|
|
grep -v '^Subject:' msg.patch | hg --cwd b import -
|
|
|
rm -r b
|
|
|
|
|
|
echo % plain diff in email, subject, no message body
|
|
|
hg clone -r0 a b
|
|
|
grep -v '^email ' msg.patch | hg --cwd b import -
|
|
|
rm -r b
|
|
|
|
|
|
echo % plain diff in email, no subject, no message body, should fail
|
|
|
hg clone -r0 a b
|
|
|
egrep -v '^(Subject|email)' msg.patch | hg --cwd b import -
|
|
|
rm -r b
|
|
|
|
|
|
echo % hg export in email, should use patch header
|
|
|
hg clone -r0 a b
|
|
|
hg --cwd a export tip > tip.patch
|
|
|
python mkmsg.py | hg --cwd b import -
|
|
|
hg --cwd b tip | grep second
|
|
|
rm -r b
|
|
|
|
|
|
# subject: duplicate detection, removal of [PATCH]
|
|
|
# The '---' tests the gitsendmail handling without proper mail headers
|
|
|
cat > mkmsg2.py <<EOF
|
|
|
import email.Message, sys
|
|
|
msg = email.Message.Message()
|
|
|
msg.set_payload('email patch\n\nnext line\n---\n' + open('tip.patch').read())
|
|
|
msg['Subject'] = '[PATCH] email patch'
|
|
|
msg['From'] = 'email patcher'
|
|
|
sys.stdout.write(msg.as_string())
|
|
|
EOF
|
|
|
|
|
|
echo '% plain diff in email, [PATCH] subject, message body with subject'
|
|
|
hg clone -r0 a b
|
|
|
hg --cwd a diff -r0:1 > tip.patch
|
|
|
python mkmsg2.py | hg --cwd b import -
|
|
|
hg --cwd b tip --template '{desc}\n'
|
|
|
rm -r b
|
|
|
|
|
|
# We weren't backing up the correct dirstate file when importing many patches
|
|
|
# (issue963)
|
|
|
echo '% import patch1 patch2; rollback'
|
|
|
echo line 3 >> a/a
|
|
|
hg --cwd a ci -m'third change'
|
|
|
hg --cwd a export -o '../patch%R' 1 2
|
|
|
hg clone -qr0 a b
|
|
|
hg --cwd b parents --template 'parent: {rev}\n'
|
|
|
hg --cwd b import ../patch1 ../patch2
|
|
|
hg --cwd b rollback
|
|
|
hg --cwd b parents --template 'parent: {rev}\n'
|
|
|
rm -r b
|
|
|
|
|
|
# bug non regression test
|
|
|
# importing a patch in a subdirectory failed at the commit stage
|
|
|
echo line 2 >> a/d1/d2/a
|
|
|
hg --cwd a ci -u someoneelse -d '1 0' -m'subdir change'
|
|
|
echo % hg import in a subdirectory
|
|
|
hg clone -r0 a b
|
|
|
hg --cwd a export tip | sed -e 's/d1\/d2\///' > tip.patch
|
|
|
dir=`pwd`
|
|
|
cd b/d1/d2 2>&1 > /dev/null
|
|
|
hg import ../../../tip.patch
|
|
|
cd "$dir"
|
|
|
echo "% message should be 'subdir change'"
|
|
|
hg --cwd b tip | grep 'subdir change'
|
|
|
echo "% committer should be 'someoneelse'"
|
|
|
hg --cwd b tip | grep someoneelse
|
|
|
echo "% should be empty"
|
|
|
hg --cwd b status
|
|
|
|
|
|
|
|
|
# Test fuzziness (ambiguous patch location, fuzz=2)
|
|
|
echo % test fuzziness
|
|
|
hg init fuzzy
|
|
|
cd fuzzy
|
|
|
echo line1 > a
|
|
|
echo line0 >> a
|
|
|
echo line3 >> a
|
|
|
hg ci -Am adda
|
|
|
echo line1 > a
|
|
|
echo line2 >> a
|
|
|
echo line0 >> a
|
|
|
echo line3 >> a
|
|
|
hg ci -m change a
|
|
|
hg export tip > tip.patch
|
|
|
hg up -C 0
|
|
|
echo line1 > a
|
|
|
echo line0 >> a
|
|
|
echo line1 >> a
|
|
|
echo line0 >> a
|
|
|
hg ci -m brancha
|
|
|
hg import --no-commit -v tip.patch
|
|
|
hg revert -a
|
|
|
echo '% test fuzziness with eol=auto'
|
|
|
hg --config patch.eol=auto import --no-commit -v tip.patch
|
|
|
cd ..
|
|
|
|
|
|
# Test hunk touching empty files (issue906)
|
|
|
hg init empty
|
|
|
cd empty
|
|
|
touch a
|
|
|
touch b1
|
|
|
touch c1
|
|
|
echo d > d
|
|
|
hg ci -Am init
|
|
|
echo a > a
|
|
|
echo b > b1
|
|
|
hg mv b1 b2
|
|
|
echo c > c1
|
|
|
hg copy c1 c2
|
|
|
rm d
|
|
|
touch d
|
|
|
hg diff --git
|
|
|
hg ci -m empty
|
|
|
hg export --git tip > empty.diff
|
|
|
hg up -C 0
|
|
|
hg import empty.diff
|
|
|
for name in a b1 b2 c1 c2 d;
|
|
|
do
|
|
|
echo % $name file
|
|
|
test -f $name && cat $name
|
|
|
done
|
|
|
cd ..
|
|
|
|
|
|
# Test importing a patch ending with a binary file removal
|
|
|
echo % test trailing binary removal
|
|
|
hg init binaryremoval
|
|
|
cd binaryremoval
|
|
|
echo a > a
|
|
|
python -c "file('b', 'wb').write('a\x00b')"
|
|
|
hg ci -Am addall
|
|
|
hg rm a
|
|
|
hg rm b
|
|
|
hg st
|
|
|
hg ci -m remove
|
|
|
hg export --git . > remove.diff
|
|
|
cat remove.diff | grep git
|
|
|
hg up -C 0
|
|
|
hg import remove.diff
|
|
|
hg manifest
|
|
|
cd ..
|
|
|
|
|
|
echo % 'test update+rename with common name (issue 927)'
|
|
|
hg init t
|
|
|
cd t
|
|
|
touch a
|
|
|
hg ci -Am t
|
|
|
echo a > a
|
|
|
# Here, bfile.startswith(afile)
|
|
|
hg copy a a2
|
|
|
hg ci -m copya
|
|
|
hg export --git tip > copy.diff
|
|
|
hg up -C 0
|
|
|
hg import copy.diff
|
|
|
echo % view a
|
|
|
# a should contain an 'a'
|
|
|
cat a
|
|
|
echo % view a2
|
|
|
# and a2 should have duplicated it
|
|
|
cat a2
|
|
|
cd ..
|
|
|
|
|
|
echo % 'test -p0'
|
|
|
hg init p0
|
|
|
cd p0
|
|
|
echo a > a
|
|
|
hg ci -Am t
|
|
|
hg import -p0 - << EOF
|
|
|
foobar
|
|
|
--- a Sat Apr 12 22:43:58 2008 -0400
|
|
|
+++ a Sat Apr 12 22:44:05 2008 -0400
|
|
|
@@ -1,1 +1,1 @@
|
|
|
-a
|
|
|
+bb
|
|
|
EOF
|
|
|
hg status
|
|
|
cat a
|
|
|
cd ..
|
|
|
|
|
|
echo % 'test paths outside repo root'
|
|
|
mkdir outside
|
|
|
touch outside/foo
|
|
|
hg init inside
|
|
|
cd inside
|
|
|
hg import - <<EOF
|
|
|
diff --git a/a b/b
|
|
|
rename from ../outside/foo
|
|
|
rename to bar
|
|
|
EOF
|
|
|
cd ..
|
|
|
|
|
|
echo '% test import with similarity and git and strip (issue295 et al.)'
|
|
|
hg init sim
|
|
|
cd sim
|
|
|
echo 'this is a test' > a
|
|
|
hg ci -Ama
|
|
|
cat > ../rename.diff <<EOF
|
|
|
diff --git a/foo/a b/foo/a
|
|
|
deleted file mode 100644
|
|
|
--- a/foo/a
|
|
|
+++ /dev/null
|
|
|
@@ -1,1 +0,0 @@
|
|
|
-this is a test
|
|
|
diff --git a/foo/b b/foo/b
|
|
|
new file mode 100644
|
|
|
--- /dev/null
|
|
|
+++ b/foo/b
|
|
|
@@ -0,0 +1,2 @@
|
|
|
+this is a test
|
|
|
+foo
|
|
|
EOF
|
|
|
hg import --no-commit -v -s 1 ../rename.diff -p2
|
|
|
hg st -C
|
|
|
hg revert -a
|
|
|
rm b
|
|
|
hg import --no-commit -v -s 100 ../rename.diff -p2
|
|
|
hg st -C
|
|
|
cd ..
|
|
|
|
|
|
|
|
|
echo '% add empty file from the end of patch (issue 1495)'
|
|
|
hg init addemptyend
|
|
|
cd addemptyend
|
|
|
touch a
|
|
|
hg addremove
|
|
|
hg ci -m "commit"
|
|
|
cat > a.patch <<EOF
|
|
|
diff --git a/a b/a
|
|
|
--- a/a
|
|
|
+++ b/a
|
|
|
@@ -0,0 +1,1 @@
|
|
|
+a
|
|
|
diff --git a/b b/b
|
|
|
new file mode 100644
|
|
|
EOF
|
|
|
hg import --no-commit a.patch
|
|
|
cd ..
|
|
|
|
|
|
echo '% create file when source is not /dev/null'
|
|
|
cat > create.patch <<EOF
|
|
|
diff -Naur proj-orig/foo proj-new/foo
|
|
|
--- proj-orig/foo 1969-12-31 16:00:00.000000000 -0800
|
|
|
+++ proj-new/foo 2009-07-17 16:50:45.801368000 -0700
|
|
|
@@ -0,0 +1,1 @@
|
|
|
+a
|
|
|
EOF
|
|
|
# some people have patches like the following too
|
|
|
cat > create2.patch <<EOF
|
|
|
diff -Naur proj-orig/foo proj-new/foo
|
|
|
--- proj-orig/foo.orig 1969-12-31 16:00:00.000000000 -0800
|
|
|
+++ proj-new/foo 2009-07-17 16:50:45.801368000 -0700
|
|
|
@@ -0,0 +1,1 @@
|
|
|
+a
|
|
|
EOF
|
|
|
hg init oddcreate
|
|
|
cd oddcreate
|
|
|
hg import --no-commit ../create.patch
|
|
|
cat foo
|
|
|
rm foo
|
|
|
hg revert foo
|
|
|
hg import --no-commit ../create2.patch
|
|
|
cat foo
|
|
|
|
|
|
echo % 'first line mistaken for email headers (issue 1859)'
|
|
|
hg init emailconfusion
|
|
|
cd emailconfusion
|
|
|
cat > a.patch <<EOF
|
|
|
module: summary
|
|
|
|
|
|
description
|
|
|
|
|
|
|
|
|
diff -r 000000000000 -r 9b4c1e343b55 test.txt
|
|
|
--- /dev/null
|
|
|
+++ b/a
|
|
|
@@ -0,0 +1,1 @@
|
|
|
+a
|
|
|
EOF
|
|
|
hg import -d '0 0' a.patch
|
|
|
hg parents -v
|
|
|
cd ..
|
|
|
|
|
|
echo % '--- in commit message'
|
|
|
hg init commitconfusion
|
|
|
cd commitconfusion
|
|
|
cat > a.patch <<EOF
|
|
|
module: summary
|
|
|
|
|
|
--- description
|
|
|
|
|
|
diff --git a/a b/a
|
|
|
new file mode 100644
|
|
|
--- /dev/null
|
|
|
+++ b/a
|
|
|
@@ -0,0 +1,1 @@
|
|
|
+a
|
|
|
EOF
|
|
|
hg import -d '0 0' a.patch
|
|
|
hg parents -v
|
|
|
cd ..
|
|
|
|
|
|
echo '% tricky header splitting'
|
|
|
cat > trickyheaders.patch <<EOF
|
|
|
From: User A <user@a>
|
|
|
Subject: [PATCH] from: tricky!
|
|
|
|
|
|
# HG changeset patch
|
|
|
# User User B
|
|
|
# Date 1266264441 18000
|
|
|
# Branch stable
|
|
|
# Node ID f2be6a1170ac83bf31cb4ae0bad00d7678115bc0
|
|
|
# Parent 0000000000000000000000000000000000000000
|
|
|
from: tricky!
|
|
|
|
|
|
That is not a header.
|
|
|
|
|
|
diff -r 000000000000 -r f2be6a1170ac foo
|
|
|
--- /dev/null
|
|
|
+++ b/foo
|
|
|
@@ -0,0 +1,1 @@
|
|
|
+foo
|
|
|
EOF
|
|
|
|
|
|
hg init trickyheaders
|
|
|
cd trickyheaders
|
|
|
hg import -d '0 0' ../trickyheaders.patch
|
|
|
hg export --git tip
|
|
|
cd ..
|
|
|
|
|
|
echo '% issue2102'
|
|
|
hg init issue2102
|
|
|
cd issue2102
|
|
|
mkdir -p src/cmd/gc
|
|
|
touch src/cmd/gc/mksys.bash
|
|
|
hg ci -Am init
|
|
|
hg import - <<EOF
|
|
|
# HG changeset patch
|
|
|
# User Rob Pike
|
|
|
# Date 1216685449 25200
|
|
|
# Node ID 03aa2b206f499ad6eb50e6e207b9e710d6409c98
|
|
|
# Parent 93d10138ad8df586827ca90b4ddb5033e21a3a84
|
|
|
help management of empty pkg and lib directories in perforce
|
|
|
|
|
|
R=gri
|
|
|
DELTA=4 (4 added, 0 deleted, 0 changed)
|
|
|
OCL=13328
|
|
|
CL=13328
|
|
|
|
|
|
diff --git a/lib/place-holder b/lib/place-holder
|
|
|
new file mode 100644
|
|
|
--- /dev/null
|
|
|
+++ b/lib/place-holder
|
|
|
@@ -0,0 +1,2 @@
|
|
|
+perforce does not maintain empty directories.
|
|
|
+this file helps.
|
|
|
diff --git a/pkg/place-holder b/pkg/place-holder
|
|
|
new file mode 100644
|
|
|
--- /dev/null
|
|
|
+++ b/pkg/place-holder
|
|
|
@@ -0,0 +1,2 @@
|
|
|
+perforce does not maintain empty directories.
|
|
|
+this file helps.
|
|
|
diff --git a/src/cmd/gc/mksys.bash b/src/cmd/gc/mksys.bash
|
|
|
old mode 100644
|
|
|
new mode 100755
|
|
|
EOF
|
|
|
hg sum
|
|
|
hg diff --git -c tip
|
|
|
cd ..
|
|
|
|
|
|
echo '% diff lines looking like headers'
|
|
|
hg init difflineslikeheaders
|
|
|
cd difflineslikeheaders
|
|
|
echo a >a
|
|
|
echo b >b
|
|
|
echo c >c
|
|
|
hg ci -Am1
|
|
|
|
|
|
echo "key: value" >>a
|
|
|
echo "key: value" >>b
|
|
|
echo "foo" >>c
|
|
|
hg ci -m2
|
|
|
|
|
|
hg up -C 0
|
|
|
hg diff --git -c1 >want
|
|
|
hg diff -c1 | hg import --no-commit -
|
|
|
hg diff --git >have
|
|
|
diff want have
|
|
|
cd ..
|
|
|
|
|
|
|