Skip to content

Instantly share code, notes, and snippets.

@cwalther
Created December 9, 2012 18:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save cwalther/4246319 to your computer and use it in GitHub Desktop.
Save cwalther/4246319 to your computer and use it in GitHub Desktop.
CWE-ou & H-uru/Plasma History Rewrite
#!/bin/bash
if test "x$1" = x -o "x$2" = x; then
echo "Usage: $0 <original CWE-ou repo> <original H-uru/Plasma repo>"
exit 1
fi
if ! hg --version -q | grep -q "2\.[3-9]"; then
echo "Mercurial >= 2.3 is required, you have"
hg --version -q
exit 1
fi
TODELETE=
if test -e old-hg -o -e uncorrupt-git -o -e uncorrupt-hg -o -e filemap1 -o -e filemap2 -o -e filtered-git; then
echo "Output files/folders exist."
read -p "OK to delete? (y/n) " REPLY
if test "x$REPLY" != "xy"; then
exit 1
fi
TODELETE="old-hg uncorrupt-git uncorrupt-hg filemap1 filemap2 filtered-git"
fi
if test -e filtered-hg; then
echo "Output folder filtered-hg (OU part) exists."
read -p "Try to [u]se it or [d]elete and recreate it? ([u]/d) " REPLY
if test "x$REPLY" = "xd"; then
TODELETE="$TODELETE filtered-hg"
fi
fi
if ! test -z "$TODELETE"; then
set -x
rm -rf $TODELETE
fi
set -x
set -e
#### OU part
if ! test -e filtered-hg; then
# pull the first few revisions from which we also want to remove the empty .hgignore file
hg init old-hg
hg -R old-hg pull -r e106bb4cef24 "$1"
# fix the corrupted 'Merge "Open source re-licensing" into OpenUru base' commit so that it will successfully round-trip-convert with Hg-Git (the way of doing it completely in Mercurial I showed in http://forums.openuru.org/viewtopic.php?p=5024#p5024 no longer works with Mercurial 2.2 and later due to http://selenic.com/pipermail/mercurial-devel/2012-April/039570.html - do it by pushing to Git and back instead)
git init --bare uncorrupt-git
cd old-hg
hg push ../uncorrupt-git
hg bookmark --delete master
cd ../uncorrupt-git
# pull back in pieces to get the commits in the same order as in the original repository (not strictly necessary, since it doesn't affect the commit ids, but it makes visual comparison easier)
git branch ob1 a2f42c3fdce88da8c538570a666c07359670edd8
git branch ob2 5c3cab7f4f1134925283dd526233131856b7a894
cd ..
hg init uncorrupt-hg
cd uncorrupt-hg
# this may error out with "ValueError: 20-byte hash required", you can ignore that
hg pull -r ob1 ../uncorrupt-git || true
hg pull -r ob2 ../uncorrupt-git
hg pull -r master ../uncorrupt-git
hg gclear
# remove the tags created by Hg-Git, otherwise 'hg convert' will fabricate commits that put them into .hgtags
rm .hg/git-remote-refs
rm .hg/git-tags
hg bookmark --delete ob1
hg bookmark --delete ob2
hg bookmark --delete master
cd ..
# eradicate the Bink files as well as the empty .hgignore
cat <<EOF > filemap2
exclude MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfSurface/plLayerBink.cpp
exclude MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfSurface/plLayerBink.h
exclude MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plPipeline/plBinkPlayer.cpp
exclude MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plPipeline/plBinkPlayer.h
exclude MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/MaxPlasmaMtls/plBinkBitmap.cpp
exclude MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/MaxPlasmaMtls/plBinkBitmap.h
EOF
cp filemap2 filemap1
echo "exclude .hgignore" >> filemap1
hg convert --filemap filemap1 uncorrupt-hg filtered-hg
# rewrite the list of already converted revisions, replacing ids from uncorrupt-hg by those from old-hg, so that we can continue converting from old-hg
sed -e s/050a1be2ccf20aafa2706cadc1c01a7a8115751a/f7cecd95cba5b02a57d48f8520256254c5d5b44e/ -e s/26bd467e4f79798f48160de2f5f34398571f5237/fe3d8bed6097cfb7a79c22d436168238ab79cfb3/ -e s/85629ffd6bd3ab30a2a67426b2056e88f1c22de3/2731d8112948c405da4ee5e3ecd8a3ae6c9e0ddb/ -e s/a1ef2ea16724cf5b3a11f7ca2b351b9f3e2986b7/7e48b9bca28a775701e6cff1d5f5bc8bd0d0f024/ -e s/7cf3077f939a00457aa4c7a5860b9e64ea42b246/63ca11404699ec52cfa47e34144b966ed978964a/ -e s/15741fa74e8ad85085ce6627e2ce33cd2610eeaa/e4a36a01fc74834a92cfaf2f35c8c96f0e2eaf07/ -e s/3d3545d1dd00dc9269e954a05e2e59a1b4592248/e106bb4cef2473b41b67f1f304b50f40579b1353/ filtered-hg/.hg/shamap > newshamap
mv newshamap filtered-hg/.hg/shamap
# add the rest of CWE-ou (now with its real .hgignore)
hg -R old-hg pull -r 2a23f5511857 "$1"
hg convert --filemap filemap2 old-hg filtered-hg
rm -rf filemap1 filemap2 uncorrupt-hg uncorrupt-git
fi
# check
if test "x`hg -R filtered-hg log --template="{node}\n" -d "Sat Oct 13 00:47:35 2012 +0200"`" != "xa21dd5620cf5fe8a40fdae825987129a4562cbee"; then
set +x
echo
echo "Something unexpected happened in the conversion. OU/Hg Revision \"Merged in"
echo "Skoader/cwe-ou/window-size (pull request #18)\" was expected to have id"
echo "a21dd5620cf5fe8a40fdae825987129a4562cbee, got"
hg -R filtered-hg log -d "Sat Oct 13 00:47:35 2012 +0200"
echo
echo "Please compare to the published solution to figure out why, or contact Christian Walther."
echo
set -x
fi
# done with the OU side!
# to check file trees:
# for ((i=0; i<129; i++)); do if test $i -ge 5; then j=`expr $i + 1`; else j=$i; fi; echo $i $j; hg up $j -R old-hg; hg up $i -R filtered-hg; diff -qaur -x .hg old-hg filtered-hg > actualdiff; if ! (cmp -s expecteddiff1 actualdiff || cmp -s expecteddiff2 actualdiff || cmp -s expecteddiff3 actualdiff); then diff -u expecteddiff2 actualdiff; break; fi; done
#### H-uru part
# get the new common leg, with correct committer names, from Mercurial
git init --bare filtered-git
hg -R filtered-hg bookmark -f -r 6 divergence
hg -R filtered-hg push -r divergence filtered-git
# get the old H-uru/Plasma commits
git --git-dir filtered-git fetch "$2" master
cd filtered-git
git branch master FETCH_HEAD
# set up grafts:
# - graft descendants of old OU leg onto new common leg
# - graft descendants of old H-uru leg onto new common leg
# - eliminate merging of OU leg (cut off its second parent, filter-branch will eliminate it because it's a no-op with respect to the first parent)
DIVERGENCE=`git log --pretty=format:%H divergence^! | cat`
cat <<EOF > info/grafts
29b76601ad294bca52b6be462daec2684cd6042b $DIVERGENCE
ececa5fa9937d27e4f8cbbfe441977cd44aeb439 $DIVERGENCE
71d81a580debf4499c7ce28418cbacc40495bfa8 0671b2825a3c22721c1d255ae5e950ae9dca523f
EOF
# filter:
# - remove Bink files
# - remove .hgignore if it is empty (on OU leg)
# - on commits that move files around, add move information for Mercurial (note that the code here wouldn't work correctly on commits that move files and already have --HG-- information, but there are none of these in H-uru/Plasma)
# - skip revisions up to 3bb1281 because some among them have author/committer name a'moaca', which filter-branch would mangle to a'moaca
git filter-branch --index-filter 'git rm --cached --ignore-unmatch */plLayerBink.cpp */plLayerBink.h */plBinkPlayer.cpp */plBinkPlayer.h */plBinkBitmap.cpp */plBinkBitmap.h; test `git show :.hgignore 2>/dev/null | wc -c` = 0 && git rm --cached --ignore-unmatch .hgignore' --msg-filter 'perl -p -e "s/\r?\n?$/\n/" && git diff --staged --name-status -M85 -l5000 $GIT_COMMIT^ | grep ^R | grep -Ev "pl(LayerBink|BinkPlayer|BinkBitmap)(\.h|\.cpp)" | sed "s/^R[0-9]* \([^ ]*\) \(.*\)$/rename : \1 => \2/" > ../renames && test `cat ../renames | wc -c` -ne 0 && echo && echo "--HG--" && cat ../renames; rm ../renames' --prune-empty --tag-name-filter cat -- --all --not $DIVERGENCE
rm info/grafts
rm -r refs/original
# check
if test "x`git log --pretty=format:%H master^! | cat`" != "xb3976524ee406256655183fd25a49d984138dfb0"; then
set +x
echo
echo "Something unexpected happened in the conversion. H-uru/Git revision master \"Merge"
echo "pull request #229 from Hoikas/locdata-strings\" was expected to have id"
echo "b3976524ee406256655183fd25a49d984138dfb0, got"
git log master^! | cat
echo "Please compare to the published solution to figure out why, or contact Christian Walther."
echo
set -x
fi
cd ..
## to check commit metadata:
# git clone --mirror "$2" old-git
# git --git-dir old-git log --notes --pretty=raw master ^cfee1e9 > oldlog
# git --git-dir filtered-git log --notes --pretty=raw master > newlog
# sed -E "s/^(commit|tree|parent) .{40}$/\1 --/" oldlog > oldlognosha
# sed -E "s/^(commit|tree|parent) .{40}$/\1 --/" newlog > newlognosha
# opendiff oldlognosha newlognosha
## to check file trees:
# cat oldlog | grep "^author " | sed "s/[^>]*> \([0-9]*\) [+-][0-9]*$/\1/" | sort > oldauthortimes
# cat newlog | grep "^author " | sed "s/[^>]*> \([0-9]*\) [+-][0-9]*$/\1/" | sort > newauthortimes
# test "`cat oldauthortimes | wc -l`" = "`sort -u oldauthortimes | wc -l`" && echo unique || echo ambiguous
# test "`cat newauthortimes | wc -l`" = "`sort -u newauthortimes | wc -l`" && echo unique || echo ambiguous
# comm -1 -2 oldauthortimes newauthortimes > commonauthortimes
# git --git-dir old-git log --pretty="tformat:%at %H" master ^cfee1e9 > oldhashes
# git --git-dir filtered-git log --pretty="tformat:%at %H" master > newhashes
# cat commonauthortimes | xargs -I % grep -h ^% oldhashes newhashes | paste -s -d '\t\n' - | cut -f 2,4 > commitmap
# cat commitmap | (while read OLD NEW; do git --git-dir old-git ls-tree -r $OLD > oldtree; git --git-dir filtered-git ls-tree -r $NEW > newtree; diff -U 0 oldtree newtree | grep "^[+-][^+-]" | grep -vi "^-.*bink" | grep -vi "^-100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..hgignore$" > actualdiff; if test -s actualdiff; then echo $OLD $NEW; cat actualdiff; break; fi; done)
#!/bin/bash
if test -z "$1"; then
echo "Usage:"
echo "$0 <original local H-uru/Plasma-based repo>"
echo " - converted repository is saved with \"-converted.git\" appended to the name"
echo "$0 https://github.com/<repository>"
echo " - repository is downloaded from GitHub, converted, and uploaded again"
echo " (replacing original)"
exit 1
fi
if test "`echo "$1" | head -c 4`" = "http"; then
cd /tmp
OUT=plasma-converted.git
USEGITHUB=yes
else
OUT="`basename "$1" .git`-converted.git"
USEGITHUB=no
fi
if test -e "$OUT"; then
echo "Output files/folders exist."
read -p "OK to delete? (y/n) " REPLY
if test "x$REPLY" != "xy"; then
exit 1
fi
set -x
rm -rf "$OUT"
fi
set -x
set -e
git clone --mirror "$1" "$OUT"
git --git-dir "$OUT" fetch https://github.com/cwalther/Plasma-nobink master
git --git-dir "$OUT" branch nobink-master FETCH_HEAD
# set up grafts:
# - graft descendants of old OU leg onto new common leg
# - graft descendants of old H-uru leg onto new common leg
# - eliminate merging of OU leg (cut off its second parent, filter-branch will eliminate it because it's a no-op with respect to the first parent)
cat <<EOF > "$OUT/info/grafts"
29b76601ad294bca52b6be462daec2684cd6042b a9a69421eb5bdddfd64958991b6d031596b9d07c
ececa5fa9937d27e4f8cbbfe441977cd44aeb439 a9a69421eb5bdddfd64958991b6d031596b9d07c
71d81a580debf4499c7ce28418cbacc40495bfa8 0671b2825a3c22721c1d255ae5e950ae9dca523f
EOF
# filter:
# - remove Bink files
# - remove .hgignore if it is empty (on OU leg)
# - on commits that move files around, add move information for Mercurial (note that the code here wouldn't work correctly on commits that move files and already have --HG-- information, but there are none of these in H-uru/Plasma)
# - skip revisions up to nobink-master because they are converted already, and some among them have author/committer name a'moaca', which filter-branch would mangle to a'moaca
git --git-dir "$OUT" filter-branch --index-filter 'git rm --cached --ignore-unmatch */plLayerBink.cpp */plLayerBink.h */plBinkPlayer.cpp */plBinkPlayer.h */plBinkBitmap.cpp */plBinkBitmap.h; test `git show :.hgignore 2>/dev/null | wc -c` = 0 && git rm --cached --ignore-unmatch .hgignore' --msg-filter 'perl -p -e "s/\r?\n?$/\n/" && git diff --staged --name-status -M85 -l5000 $GIT_COMMIT^ | grep ^R | grep -Ev "pl(LayerBink|BinkPlayer|BinkBitmap)(\.h|\.cpp)" | sed "s/^R[0-9]* \([^ ]*\) \(.*\)$/rename : \1 => \2/" > ../renames && test `cat ../renames | wc -c` -ne 0 && echo && echo "--HG--" && cat ../renames; rm ../renames' --prune-empty --tag-name-filter cat -- --all --not nobink-master
rm "$OUT/info/grafts"
rm -r "$OUT/refs/original"
# check for conversion mismatches
git --git-dir "$OUT" log --pretty="tformat:%at %P" --all | cut -f 1,2 -d " " | sort | uniq -d > duplicates
if test -s duplicates; then
set +x
echo
echo "Possible duplicates found:"
echo "---"
cat duplicates | (while read AUTHORTIME PARENT; do
# I can't find a way of searching by author time directly
git --git-dir "$OUT" log --pretty="tformat:%at %H" --all | grep "^$AUTHORTIME" | cut -f 2 -d " " | (while read ID; do
git --git-dir "$OUT" log $ID^! | cat
done)
echo "---"
done)
echo "This most probably means that something went wrong in the conversion."
echo "Please figure out what or contact Christian Walther."
echo
if test $USEGITHUB = yes; then
USEGITHUB=no
echo "Not pushing back to GitHub."
fi
set -x
else
git --git-dir "$OUT" branch -D nobink-master
fi
rm duplicates
if test $USEGITHUB = yes; then
git --git-dir "$OUT" push --mirror "$1" && rm -rf "$OUT"
fi
#!/bin/bash
if test -z "$1"; then
echo "Usage: $0 <original CWE-ou-based repo>"
exit 1
fi
OUT="`basename "$1"`-converted"
if ! hg --version -q | grep -q "2\.[3-9]"; then
echo "Mercurial >= 2.3 is required, you have"
hg --version -q
exit 1
fi
if test -e "$OUT" -o -e filemap; then
echo "Output files/folders exist."
read -p "OK to delete? (y/n) " REPLY
if test "x$REPLY" != "xy"; then
exit 1
fi
set -x
rm -rf "$OUT" filemap
fi
set -x
set -e
hg clone --noupdate https://bitbucket.org/cwalther/cwe-ou-nobink "$OUT"
# retain URL aliases and other settings
cp "$1/.hg/hgrc" "$OUT/.hg/hgrc" || true
# filtered-hg/.hg/shamap from the binkbegone.sh output
cat <<EOF > "$OUT/.hg/shamap"
5492b01e9d5bc0682adb54edfec7f343a7edea9e e7b892cb70abe321bca0537367f0d76930045f6e
cae5d759ec5e715b97f5369b2a752eef576a2694 b8f69fd063a361b968b4c34de527984965869595
1ba871698387961940edf4fa739f1d285157639e aedc27ade92c8b407cb5cecfe794586129610fca
c332730722ce28ffb7ebf04b9fdb2c02b54459f5 99dae48c6145ba4a30a1e43f568690c83e4c0c0b
5f7bb90945e0caa2b6c64ccebb7926d79e421b62 027529e02fd3e2ba3ced58567da04778d3052284
dcfd1e3999125621e92fcde9c8b48b9a9a23ea49 027529e02fd3e2ba3ced58567da04778d3052284
5416f15d37e4c1f8d07f605874c66053839c1686 ef365800375ce526a63c42eed386497072950230
e1a9b3a06ebfaf51837faf381394eb0ef8657b21 6a229fe3d41961d7f8da7e1172c26d7dbf011a7f
2e5a53a35b5f8a360e60a1c64923f9c7439bda09 e75c224b1be6acb0329c9782748b328b995f0459
325fe1070ced86511f4339d2221551505a7de9c0 7265ac1feea985620c307923f26c8028cb864ce4
a4a583e629c656109cc93122311b77d7d5d96007 4519295610f92981b7be486cb74bdad5bf6b3116
8246b13c8eab64b40bd5f0130cdcaff99163fb44 614e70aadc0c043367dc516982f2fbcb4ded27e8
f7cecd95cba5b02a57d48f8520256254c5d5b44e aa52057a55ed031fe37747c83b570b67a5a00461
fe3d8bed6097cfb7a79c22d436168238ab79cfb3 4c1d2c509f4968f6ba39641493f7e54c56e62c11
2731d8112948c405da4ee5e3ecd8a3ae6c9e0ddb 9769f6850c36b36f0c605cf7faf888cdae652820
7e48b9bca28a775701e6cff1d5f5bc8bd0d0f024 1df0ae42959b727e49b67ca9213cbda136cd4930
63ca11404699ec52cfa47e34144b966ed978964a 7159cad283c0d22e529c4a93cfd12c197552bed7
e4a36a01fc74834a92cfaf2f35c8c96f0e2eaf07 13c818afc20b6d37d2997ab64c709f8d2e90fb4c
e106bb4cef2473b41b67f1f304b50f40579b1353 408707c2228a98013be8fa99bca7c1241871ec53
4f77e7e01026ee8e41734fb5727a7480a02e88ce a39f8f521543185f6f1d43c168723150e9e5957d
1d351084b10a2228e5c5fdac6187e4f3f8149350 194ad82c81f67a2e0b1269f2bc0b8b2048dc0c56
e4757ead78b31e84c1dddff2bb273dee0c5d0e43 a790ab54791d685685907fe5e6b43923d636b36a
1fa2eebe37941496ff28c46c0fa5a5874097f5ad 5abe7b557374aa7b93e69471ebaccaf02b13f26e
14110b9f2340801bc18c3713109a9cde1f72afd5 8cfcf5e4dc200080f11684beb4ca25a9cad645be
0848a5709fcc1be87ef16bae59186e106539dc3b 36c691af5f6ee4525036175d7a0dc750956377db
625db5f9e86cefde1a4662ee6c10e8ff163b0def 4311ccbfba9c45aa3595eb6340a22b5a97965adc
8a4cfc6cf7bd1098950392d4b3aa68fb85da4eda bb63f8eda52d6f5cc5dd857aba891e3a2734cc9b
5d91195b6ebe05441c7c1e555dd9d1255ad17e00 0a67197a0c112fddc3547fc3a7f0e9d184d11d65
104cf80f1d5291194020e5e72c9a790b976d2439 76a1dc09e4e3e8de7f2a17ce913656dad28bf615
4b572c393112a3a56507a9f2ea518d831f0b622f 02b94bd1a3d12a6291b5137c191d9cd0c9dce2b8
29b02d2f75bf3f24e2b9e263d87bf4b05bbece38 bab92dd12709934f94da9138f2385223a4d454a5
c56ee55037f8414b2cd242a7a540d95119f97554 baece2bd0c37e3ed884b6a569c463dc412ffdf64
68f9ec09584139d5500d1e829a171fbd5b8ec1a8 50b9f795ba8da3d81517c6498872ef39d9d62729
4211c1107aafc50c7e36ece19a6a9d76f29f3300 df884259175feb2b16839436b54942468233e283
39130e2d14bcbd2dca2cee7ee90ddb29f5a924ef 859db47980cee2469aff043f0f0a7a0f9a1c2a8d
697feb0f381876fd99a325c03da39aa61160c3ba 1e62355648d0aaf439f874d047a3e25e100d0cdf
94d7c0b0e9588f19d69eb37a27b96772f7f953c7 ad487447f3b97848bbbc9e43f592aa724e2412e8
81f161b4002dbc244fa1ba15a32963d63c70be2f b90477332f994bded6247eef3828fa11157f4390
cb93b1fc9317725a50f4e7c30dc1b98b77fef18c 9562d2efee89fd89834f0f68b79478964141973e
abcbed18b4926931f90e7a12eb4620bd43a0c2aa 65b6e31873cc742b153420e9d5ed6f8378956302
685a5da1b12b317ad74e24ba1d43fd35cc54f644 a713105c3e580b3152ff6565eeeda5a290dfdfca
79110c6cb97a875dfa7873fb3ce918f5dcacda21 95090d35117d66fc67c23762ceba27984cac85c1
b2f2c81af4408d5f7d4a84da51bbf210ef0f64ba 8c768bfac51abe66b0bc8f6a7e9a5d2765ad3d15
b9a1077acf3a32aebb392d79328bb2955015e4a7 30c30b48536c7064c688c7d9fcbde3670cdf2ca6
48f9b9c7ba50aa9f08e93bb2885896547883c5ae 3e8ec61ad293f78d9f7be5f917916b38a2e876d2
7974e3f905fe11a0789b2d44349494ba432f1863 f3497c6d7f6d61ce43cbc4bdf570b56ddd879fa6
527311127b534b2725401ac0547f8d6085937c09 c3ee38e4d5d14c4baf322ac02f9547cc42ae51dc
abc5e5b6774e68a3ab577227dfdde05256382378 702115c42721640b640284fe037aaa2c72e23c36
7e4df9eba8fbd63ccfc61095b534e6283416c48d 09d108f45694359129eb9980eabcea1f0f39a8a5
64e761811d561ec985f36c8a966f550839fe7033 b550c20a3a162dd5d4383a526a7bfbc38161a9f0
eba7265e56cb7ded1dace9b2778fff4a669f906e 1c8e38faf841f1349be92f40b05de208d1dd42c4
75013162a0ac7c1bffc5f0fe37c730d32a5fcf6c c4f9b1471d303b2357977e9c81a34ebb7f45e01c
fc113fa00ce2ae57c4414bd7cbe360a9a5354d6c ac7157e1286e21809ffafe21d665ca6f7d180a93
34b783c7e0d6785a13d86a78cfa11531f88580a2 a757a1fda0a3d25e2dbd9950e941808f74088745
3196c7e52db97f92cb711a7da4a10460d0355ef8 2e428599e5a4287c14acf794f886928eb721461f
2ba7ea4d749c732c2c4f20b1c56f0ee63681d1f5 3c6515474b294adc3e5b08234fca0701c87f60d0
700d06429fc239fe66849d3e7d26b96e41512628 e58ccb0d4b5b79439043f44833ce67d8a5cd8f12
70d2775d5d5179436e9886ebd68d64e74b8f2aaa 13845c1843599e8f9654b24039cc19f3afc4be26
26c75bafbfa6063f9b3b7282c09f85da1393cdfb 4f69739baa8ba5a1dad04426132cebacb3a20e99
e158881def12040f3f7abf0b5e12d9f15ff7c1f2 da8e5eb3548bbc513fb85826c799d6bc5b4f4572
994ba337725efba69673292ae1486a1cce8562a3 de0f00cb97b7071688e2134be511845acf5ccd7f
f881f551a5603794758be59e3b75b4519ca6f642 94b2aecd5f55dd29c980be053482b645e219a862
456e56c62e94c65db5b6488f551944bda657069e 818747365416da24a3a14f6d50eb95cdec45c058
119f1fcea3bf65dd30d094a720c41069b8c22cfb 7710d7257f942370bd04f2a4eca92680523c0789
abca76e2ddd2731916729f5632c6448ebfe6f6f8 586fecb6159352cf34d9f8996ee9a5650feaa37e
07bbb96a39ed466cd6c359809f37e5c7f8eadd3b 6c953f23383c62fddac59254614970e01700a753
c4aff35cca88df3353ce3b7eafd6527b6d15aa3a 1e8791089424cd2be8abed593761604b338f4560
53f53a8d6d5a6cd8c5aafce1f026062f79298aef 9a549667a2b862a8e8565185a5bb38c6f8e8faa4
d242ccafc95ea158e9303528c0e00808984f6c88 09f4c8679916a2ef69e5eb03a600c65986def5cf
7b52ed6857c1e83ad75ee20c55dd499695085616 f46a6a152594b069c7cbb5b8a3795e33bddf03e2
c39cd21b886e9f02d1503eb42fcb8c1cd53f3424 93661332a8a3a60c0e9c07bf20c2a8abe6d9e432
5281cdf1e0b65540ac245245189582097233bbb6 306cf89336a4e2035e726a0d18aba2190c7b03c7
140e56cf20c97ff97202bb42cb813a6a7be568cf a18d9a488e91ee1e3f3485a8f6f23f2e938404e4
399d2b9117bf9e08ffd09320f3eec38d50b07cb5 d479be3d7edbae9937dee5b6b2287d073d37ee46
44263f676e77a2e78e8fa9180065a52070796bd7 acc0b4c449e2a06d478e20509ccfb553b6a982fe
7416148b9cfeeb7cd4cd1cd4f3699a3594856fae fd485bc96eaa8c004e671146da4ec0a762136bbd
69eaf9b183ae44fc9b1bd5c32e92ed120cd4666a a613ad7ef1bba5055d35489167ed0e1d92012ecd
fdeef08ce29d9e0c9d0852b2d193aba236426843 f5d1b24f2cb73d2bdfba4575035d55a36e521ff4
7e2481276a846b3337c653c5e37050731c5e62cd d583ce9216d93effd0b3c9b6377977c8005123e9
afa4349ace0cce82288ac2e0bc7f721f2c3ae3e9 32a1e0bbf140489c7414570cb9ad1311d30406fe
ee53da042361222925d25196e770177984a99f7c 18ed2dcdd4614e53f55874713f3d2b92cf6c6c4f
0bd676536bfa97aa2f75c650c2c212301e0495f8 ba11c38e3d4adb31e77a30dc234d2141052c3a08
45e32454ee7ecf20c5a4c610878225dc3350fe9d d4e5748513d8faedebbeca427e17e98ee05200ce
058b14114e14dc0df66a8bf322233b69540c1857 722b8ea1cbaad576561ce7c9a90c83c8e8ea505a
83e424773c4688f874a2d51971b385435ef5a70a b9919b7026a9fe96c7c9addacf095d6c737abb39
907122cbad33045732909932c650d2853eef58ae 2eb086eeb0cd6d5cc14e7915a48c9a92735d0bb6
fdade3bc4cc0220ec154f4dfab366bbfa2b7fbe2 aad1e6438f9f9da6d02cc8191bb60020550cd9a5
c2db5ba4efb6970bd9dd66da0a4c73ef7fce8dc0 2051efe1ad145ea1d583f9b76208cf06a00baa6f
5d8ffa7625a66bb864a013ad0d4d3aeb559c22e5 86df40dc370e063698375697f1996952bdd2fce3
9ab39e63d87443d25494bfa653d8403bcfe4efa6 45d168ab56a186b828baa357865a73867fea2fbf
a4b6fd3e804734d837d17492a3b53abf6a5107ff d048b3c1347b96bd62de40f9318fb14a7f22741e
6cee6aad58e9a7f12ecb40f0d2a8d2de0efc5db2 da70a30a75fe7973b20a93f22aeb4a2adb116d9d
d99c42b192f2511489e49fba47779682a4fa0452 e026ac55244e3777b3353e4707c2079c05ebca8d
cb597eeaac669f6506ce1cdd840982e6f240ade2 6ed4fd8607aeea7244c5042dc3b547c2377dc78f
1c5491c74deda6fc5f56cbbe00b6874145289cec 032a88a91d5471fdbca4653c2ddd15529c884afc
ee3c078e973e8d675c7a43a37ebaf2aa01443349 f2ac7843f31c83e53ae815912e7c787540042427
0d88ca28d0350c5d41699633bfe2731e715d891d 5b5d2e3b2188e2d73acf81cf47bd862e543caad8
54602b332ea9789d5464cf16095b732ba48d9235 4581f75eb0af357412f0e9788c9c52f47fcf3b8e
2db814b255794c4e044293c4b72b3619767650a2 bda71d4712fbc738143b6dfee71530b685a36573
8bdd2ea395a39b425519d7881e37b3d700bea7d6 07d4b2628592497ae6781186fc83fa82b9e80f2f
034ac86a888151598d98f7440c0c8855ccef4657 fef9345a262374b6adebbeda10576e4c627c422f
60137242f4ee553c9e49a534319c53f7895f6bd6 9de0c0a97053f9b224d6c2d30feab9ebf7a49389
7dcb9d86795e2cf5abb15a2271cde947f03ca31e 136a7d1f5b2bb51e7325c099e7e2aaa79f1ee6b2
16d560fa827a5162447d40bcf67353f1531aa2a2 95b024b474f33d57ba46bf719adb0c10ceb855ed
45cb4867c4fc4474fa59e7874a54841d6edcfca6 e7563017c4f35c9aaf6907f19226a28379d23b38
5fece32231742eee3df039658badda85971374b4 0b62c0c9d4200c49700d37df00efb2152a60a67a
fbdf0c0b74b5f7f0f42b326859cd42ffdcd53b46 e45829e95277a868457588d0984cb0d388d0ac5b
238b2a9ed67715411ab54312b1df7919ae4d5b20 a920467b8e2aa72ae3e7d4dc2f5a724f1d09d346
a2cc32b715f4d187c2877c0122710ef14f3a7701 02650ba8d40996bf5281b0bf208584640e2834d6
1d13eaf03b48f366af7798dba17a4fe614507043 afcf1f6ddfeda4fb6dc1356d00150d17ea73f245
c66264a0a5851392ebc8905ba40db3c6a3e02281 1569fa708ea0daeb632255be48f45f4396aef153
720cedd5f9d20aed48b39cd1409e0dc62b5f08a7 55b8caf86b28d0e9ce903a7e08fc28cade75ae17
a8b880dfd3fc7ee423b5847a6a2d522f342184bb 803b23c5c7a25b3a5daa59a7dde576b10e99ccf0
54aa180243ae5757e6045fc2649c54e054d7a78b 24141afbabf1a732c667f0e14d57d83c0a4148e1
61785573a0b688c2a0f490d77eea784f1f12b993 5041c95b2737884b2e0f777a3142ae5828653e66
e427d5317f128155a3c3e91974a100dd47e4079e 1b82771da8ce3e7839bd59d188cb4fd1bdbb8519
237eda5603e70678ef4be316efae40e4deba86da 7e7122346560f02957827ff4d51e6988d8f5f45c
064b6d52841cd9225df107040f51c42ffffda2cd 9db63d974ebfe4b28cf77d7443b38c68c8770ecd
9e0b893d56fe08d8fc7938aeeb46179fa1adb4d7 6f58eda6597e36b41759ecf64a9cf170ec01b863
2c7da7d0fb9cae8bf31a9dcc1e6d73478745562b 1524cc633ac2137b176eb544fdbd2bbe6b00d789
44ee834f98e94def35e5ebcdcd0ee6443410131e 42da9576c807cb203c2186872edc875d97175aab
71df14b1eeabe9d3e3948942714bb6b673b30f73 9afd1f1e8b8cd74bd4b33e91fcaf0cbf883a02d1
aed7e97d0df737dfd7bb6184011f00b91d92238b 97e5b9d2b4c31db87821811da9602bc6ffb70da3
ad0720ece7dd3c1008d968ba8168f9bbc6b78324 e81016867ab616e780cf73a4039f2f5fc1d66db3
814a5d6912a15e3f47fcfa33c6e8342ca9ea2822 d8b05ecc991d70d01ed91d744e6cfd40e4101965
040a6af31ce26b0b39ad64126c7de6f4aad599e1 f401469e6a7b8b087b986a6eac24588c9531ce85
24adfdce2bec5f3822a217ca11016f04c1d6e1d7 d2ceb05abd66e704e71ac80aea77f0038d61ab64
c0ccd8482b23eac052529b33b2dd0e0346f0cc7f 39de09bbc4886ea49d9a531dfde40d0591392cc6
4183ce3a79c2d1048f009f0689c78c62ab26ef4d 39b324cc9131878c525c9dfa8d6cd781c71ea351
2a23f5511857dfbf6cfba1b9371529330c58f574 a21dd5620cf5fe8a40fdae825987129a4562cbee
EOF
cat <<EOF > filemap
exclude MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfSurface/plLayerBink.cpp
exclude MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfSurface/plLayerBink.h
exclude MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plPipeline/plBinkPlayer.cpp
exclude MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plPipeline/plBinkPlayer.h
exclude MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/MaxPlasmaMtls/plBinkBitmap.cpp
exclude MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/MaxPlasmaMtls/plBinkBitmap.h
EOF
hg convert --filemap filemap "$1" "$OUT"
rm filemap
# check for conversion mismatches
hg -R "$OUT" log --template "{date|hgdate} {p1node}\n" | sort | uniq -d > duplicates
if test -s duplicates; then
set +x
echo
echo "Possible duplicates found:"
echo "---"
cat duplicates | (while read T TZ ID; do
hg -R "$OUT" log --date "$T $TZ"
echo "---"
done)
echo "This most probably means that something went wrong in the conversion."
echo "Please figure out what or contact Christian Walther."
echo
set -x
fi
rm duplicates
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment