To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.
root / extra / soundsoftware / flatten.sh @ 1567:3ad53f43483d
History | View | Annotate | Download (1.9 KB)
| 1 |
#!/bin/bash |
|---|---|
| 2 |
# |
| 3 |
# Convert an Hg repo with subrepos into a new repo in which the |
| 4 |
# subrepo contents are included in the main repo. The history of the |
| 5 |
# original and its subrepos is retained. |
| 6 |
# |
| 7 |
# Note that this script invokes itself, in order to handle nested |
| 8 |
# subrepos. |
| 9 |
# |
| 10 |
# While this does work, I'm not convinced it's entirely a good |
| 11 |
# idea. The history ends up a bit of a mess, and if it's a preliminary |
| 12 |
# to converting to git (which is one obvious reason to do this), the |
| 13 |
# history ends up even messier after that conversion. |
| 14 |
|
| 15 |
set -ex |
| 16 |
|
| 17 |
repo="$1" |
| 18 |
target="$2" |
| 19 |
target_subdir="$3" |
| 20 |
revision="$4" |
| 21 |
|
| 22 |
if [ -z "$repo" ] || [ -z "$target" ]; then |
| 23 |
echo "usage: $0 <repo-url> <target-dir> [<target-subdir> <revision>]" |
| 24 |
exit 2 |
| 25 |
fi |
| 26 |
|
| 27 |
set -u |
| 28 |
|
| 29 |
myname="$0" |
| 30 |
mydir=$(dirname "$myname") |
| 31 |
|
| 32 |
reponame=$(basename "$repo") |
| 33 |
tmpdir="/tmp/flatten_$$" |
| 34 |
mkdir -p "$tmpdir" |
| 35 |
trap "rm -rf ${tmpdir}" 0
|
| 36 |
|
| 37 |
filemap="$tmpdir/filemap" |
| 38 |
tmprepo="$tmpdir/tmprepo" |
| 39 |
subtmp="$tmpdir/subtmp" |
| 40 |
|
| 41 |
if [ -n "$revision" ]; then |
| 42 |
hg clone -r "$revision" "$repo" "$tmprepo" |
| 43 |
else |
| 44 |
hg clone "$repo" "$tmprepo" |
| 45 |
fi |
| 46 |
|
| 47 |
read_sub() {
|
| 48 |
if [ -f "$tmprepo/.hgsub" ]; then |
| 49 |
cat "$tmprepo/.hgsub" | sed 's/ *= */,/' |
| 50 |
fi |
| 51 |
} |
| 52 |
|
| 53 |
( echo "exclude .hgsub" |
| 54 |
echo "exclude .hgsubstate" |
| 55 |
read_sub | while IFS=, read dir uri; do |
| 56 |
echo "exclude $dir" |
| 57 |
done |
| 58 |
if [ -n "$target_subdir" ]; then |
| 59 |
echo "rename . $target_subdir" |
| 60 |
fi |
| 61 |
) > "$filemap" |
| 62 |
|
| 63 |
hg convert --filemap "$filemap" "$tmprepo" "$target" |
| 64 |
( cd "$target" |
| 65 |
hg update |
| 66 |
) |
| 67 |
|
| 68 |
read_sub | while IFS=, read dir uri; do |
| 69 |
rm -rf "$subtmp" |
| 70 |
revision=$(grep ' '"$dir"'$' "$tmprepo/.hgsubstate" | awk '{ print $1; }')
|
| 71 |
if [ -n "$target_subdir" ]; then |
| 72 |
"$myname" "$tmprepo/$dir" "$subtmp" "$target_subdir/$dir" "$revision" |
| 73 |
else |
| 74 |
"$myname" "$tmprepo/$dir" "$subtmp" "$dir" "$revision" |
| 75 |
fi |
| 76 |
( cd "$target" |
| 77 |
hg pull -f "$subtmp" && |
| 78 |
hg merge --tool internal:local && |
| 79 |
hg commit -m "Merge former subrepo $dir" |
| 80 |
) |
| 81 |
done |
| 82 |
|