diff --git a/README.md b/README.md index ecd39e7..fa0d86e 100644 --- a/README.md +++ b/README.md @@ -5,5 +5,12 @@ Those require a rather old version of [reposurgeon](http://catb.org/~esr/reposur on some systems (such as [NetBSD](https://www.netbsd.org)). ## Scripts -* [Git to Subversion](git2svn) (in [Perl](https://www.perl.org)) -* [Subversion to Git](svn2git) + +### From `git` +* [git2fossil](git2fossil) +* [git2hg](git2hg) +* [git2svn](git2svn) + +### From `svn` +* [svn2fossil](svn2fossil) +* [svn2git](svn2git) diff --git a/git2fossil b/git2fossil new file mode 100644 index 0000000..71d9635 --- /dev/null +++ b/git2fossil @@ -0,0 +1,17 @@ +#!/bin/sh +# Convert a git repository to fossil + +for i in fossil git; do + if ! command -v $i >/dev/null; then + echo "$i: command not found" + exit 1 + fi +done + +if [ -z "$1" ]; then +printf "usage: %s repo-name\n" "$0" +printf "requires an already cloned repository\n" +exit 1 +fi + +(cd ${1}; git fast-export --all) | fossil import --git ${1}.fossil diff --git a/git2hg b/git2hg new file mode 100644 index 0000000..96b4ca4 --- /dev/null +++ b/git2hg @@ -0,0 +1,59 @@ +#!/bin/sh +# Convert git repositories to Mercurial +# Extensions required: hg-fastimport + +clean() { + rm -rf ${1}.fi ${1}.fo ${1}.lift ${1}.map ${1}.opts +} +git_export() { + (cd ${1}-mirror ; repotool export) >${2}.git +} + +git_mirror() { + repotool mirror ${1} ${2}-mirror +} + +prepare() { + touch ${1}.opts + touch ${1}.map + touch ${1}.lift +} + +hg_import() { + reposurgeon "script ${2}.opts" \ + "read <${2}.git" \ + "authors read <${2}.map" \ + "sourcetype git" \ + "prefer git" \ + "script ${2}.lift" \ + "legacy write >${2}.fo" \ + "write >${2}.fi" + + reposurgeon "read <${2}.fi" \ + "prefer hg" \ + "rebuild ${repo_name}-hg" + +} + +print_usage() { + printf "usage: %s [export dir file] [mirror url repo_name] [migrate repo_name]\n" "$0" + exit 1 +} + +case $1 in + export) + git_export $2 $3 + ;; + mirror) + git_mirror $2 $3 + ;; + migrate) + prepare $2 + hg_import $2 + clean $2 + ;; + *) + print_usage + ;; +esac + diff --git a/svn2fossil b/svn2fossil new file mode 100644 index 0000000..056d08b --- /dev/null +++ b/svn2fossil @@ -0,0 +1,13 @@ +#!/bin/sh +# svn2fossil +# Convert a svn repository to fossil +# Requires direct access to the host +for i in fossil svnadmin; do + if ! command -v $i >/dev/null; then + echo "$i: command not found" + exit 1 + fi +done + +svnadmin dump $1 | fossil import --svn $1.fossil +