hg2git: initial commit
This commit is contained in:
commit
120f9950e6
91
hg2git
Executable file
91
hg2git
Executable file
@ -0,0 +1,91 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
fatal() {
|
||||
echo "$@" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
main() {
|
||||
|
||||
local target="$1"
|
||||
|
||||
# Validate target hg repo
|
||||
if [[ ! -d $target/.hg ]] ; then
|
||||
fatal "${1} not a hg repo"
|
||||
fi
|
||||
|
||||
# Convert to absolute path
|
||||
{
|
||||
cd "$target"
|
||||
target=$(pwd)
|
||||
}
|
||||
|
||||
(
|
||||
cd "$target"
|
||||
if [[ $(hg status | wc -l) -ne 0 ]] ; then
|
||||
fatal "${1}: uncommited files, abandoning"
|
||||
fi
|
||||
|
||||
if hg id | fgrep -q '+' ; then
|
||||
fatal "${1}: uncommitted changes, abandoning"
|
||||
fi
|
||||
|
||||
# Create 'master' hg bookmark, if there isn't one already
|
||||
if ! hg bookmark | fgrep master ; then
|
||||
hg bookmark master
|
||||
fi
|
||||
)
|
||||
|
||||
# Use mercurial-git plugin to convert to bare repo in /tmp/
|
||||
local gitdir=$(mktemp -d /tmp/hg2git.XXXXXXXX)
|
||||
|
||||
(
|
||||
cd "$gitdir"
|
||||
git init --bare
|
||||
)
|
||||
|
||||
(
|
||||
cd "$target"
|
||||
hg push "$gitdir"
|
||||
)
|
||||
|
||||
# Move into place
|
||||
local backupdir="$target.hg-converted-$(date -Iseconds)"
|
||||
mv "$target" "$backupdir"
|
||||
|
||||
mkdir -p "${target}"
|
||||
|
||||
mv "$gitdir/" "$target/.git"
|
||||
|
||||
# Reconstruct working directory
|
||||
(
|
||||
cd "$target"
|
||||
git config --local --bool core.bare false
|
||||
git checkout master
|
||||
)
|
||||
|
||||
# Copy over excluded files from the working directory
|
||||
# (add trailing slash to source path)
|
||||
rsync -avr "${backupdir}/" "$target" --exclude=.git --exclude=.hg
|
||||
|
||||
(
|
||||
cd "$target"
|
||||
|
||||
# Remove hgtags file
|
||||
if [[ -f ./.hgtags ]] ; then
|
||||
git rm ./.hgtags
|
||||
git commit -m "hg-git: remove old .hgtags file"
|
||||
fi
|
||||
|
||||
# Convert hgignore->gitignore (partial)
|
||||
if [[ -f ./.hgignore ]] ; then
|
||||
git mv .hgignore .gitignore
|
||||
sed -i '/^mode:/d' .gitignore
|
||||
# leave in uncommitted state for further fixups
|
||||
fi
|
||||
)
|
||||
}
|
||||
|
||||
main "$@"
|
Loading…
Reference in New Issue
Block a user