exit 1
fi
}
- get_git_repo_type()
- {
- if [ -d "$1"/.git ] && [ -d "$1"/.git/refs/heads ] &&
- [ -d "$1"/.git/objects ] && [ -f "$1"/.git/config ];
- then
- echo non-bare
- elif [ -d "$1"/refs/heads ] && [ -d "$1"/refs/tags ] &&
- [ -d "$1"/objects ] && [ -f "$1"/config ]; then
- local bare
- bare="$(GIT_CONFIG="$1"/config git-config --get core.bare)"
- case "$bare" in
- true) echo bare;;
- false) echo fake-bare;;
- *) return 255;;
- esac
- else
- return 1
- fi
- }
- is_git_repo() {
- get_git_repo_type "$1" >/dev/null
- }
- get_repo_type() {
- if [ -d "$1"/.svn ]; then
- echo svn
- elif is_git_repo "$1"; then
- echo git
- elif [ -d "$1"/.bzr ]; then
- echo bzr
- elif [ -d "$1"/CVS ]; then
- echo CVS
- elif [ -d "$1"/.hg ]; then
- echo hg
- elif [ -d "$1"/_darcs ]; then
- echo darcs
- else
- echo unknown
- fi
- }
-
-update =
- case "$(get_repo_type "$MR_REPO")" in
- svn) svn update "$@";;
- git)
- # all this is because of a bug in git-fetch, which requires GIT_DIR set
- local git_dir_override; git_dir_override=.git
- case "$(get_git_repo_type "$MR_REPO")" in
- fake-bare) git_dir_override="$MR_REPO";;
- esac
- args="$@"
- [ -z "$args" ] && args="-t origin master"
- eval GIT_DIR="$git_dir_override" git pull "$args"
- ;;
- bzr) bzr merge "$@";;
- CVS) cvs update "$@";;
- hg) hg pull "$@" && hg update "$@";;
- darcs) darcs pull -a "$@";;
- *) error "unknown repo type";;
- esac
-
-status =
- case "$(get_repo_type "$MR_REPO")" in
- svn) svn status "$@";;
- git) git status "$@" || :;;
- bzr) bzr status "$@";;
- CVS) cvs status "$@";;
- hg) hg status "$@";;
- darcs) darcs whatsnew -ls "$@";;
- *) error "unknown repo type";;
- esac
-
-commit =
- case "$(get_repo_type "$MR_REPO")" in
- svn) svn commit "$@";;
- git)
- case "$(get_git_repo_type "$MR_REPO")" in
- bare) error "cannot commit to bare git repositories";;
- fake-bare) error "commit does not work for fake bare git repositories (yet).";;
- esac
- git commit -a "$@" && git push --all
- ;;
- bzr) bzr commit "$@" && bzr push;;
- CVS) cvs commit "$@";;
- hg) hg commit -m "$@" && hg push;;
- darcs) darcs commit -a -m "$@" && darcs push -a;;
- *) error "unknown repo type";;
- esac
-
-diff =
- case "$(get_repo_type "$MR_REPO")" in
- svn) svn diff "$@";;
- git)
- case "$(get_git_repo_type "$MR_REPO")" in
- bare) error "cannot diff in bare git repositories";;
- fake-bare) error "diff does not work for fake bare git repositories (yet).";;
- esac
- git diff "$@"
- ;;
- bzr) bzr diff "$@";;
- CVS) cvs diff "$@";;
- hg) hg diff "$@";;
- darcs) darcs diff "$@";;
- *) error "unknown repo type";;
- esac
-log =
- case "$(get_repo_type "$MR_REPO")" in
- svn) svn log"$@";;
- git) git log "$@";;
- bzr) bzr log "$@";;
- CVS) cvs log "$@";;
- hg) hg log "$@";;
- darcs) darcs changes "$@";;
- *) error "unknown repo type";;
+svn_test = test -d "$MR_REPO"/.svn
+git_test = test -d "$MR_REPO"/.git
+bzr_test = test -d "$MR_REPO"/.bzr
+cvs_test = test -d "$MR_REPO"/CVS
+hg_test = test -d "$MR_REPO"/.hg
+darcs_test = test -d "$MR_REPO"/_darcs
+git_bare_test =
+ test -d "$MR_REPO"/refs/heads && test -d "$MR_REPO"/refs/tags &&
+ test -d "$MR_REPO"/objects && test -f "$MR_REPO"/config &&
+ test "$(GIT_CONFIG="$MR_REPO"/config git-config --get core.bare)" = true
+git_fake_bare_test =
+ test -d "$MR_REPO"/refs/heads && test -d "$MR_REPO"/refs/tags &&
+ test -d "$MR_REPO"/objects && test -f "$MR_REPO"/config &&
+ test "$(GIT_CONFIG="$MR_REPO"/config git-config --get core.bare)" = false
+
+svn_update = svn update "$@"
+git_update = if [ "$@" ]; then git pull "$@"; else git pull -t origin master; fi
+bzr_update = bzr merge "$@"
+cvs_update = cvs update "$@"
+hg_update = hg pull "$@" && hg update "$@"
+darcs_update = darcs pull -a "$@"
+git_fake_bare_update =
+ # all this is because of a bug in git-fetch, which requires GIT_DIR set
+ local git_dir_override; git_dir_override=.git
+ case "$(get_git_repo_type "$MR_REPO")" in
+ fake-bare) git_dir_override="$MR_REPO";;
esac
-
-register =
- if [ -n "$1" ]; then
- cd "$1"
+ args="$@"
+ [ -z "$args" ] && args="-t origin master"
+ eval GIT_DIR="$git_dir_override" git pull "$args"
+
+svn_status = svn status "$@"
+git_status = git status "$@" || true
+bzr_status = bzr status "$@"
+cvs_status = cvs status "$@"
+hg_status = hg status "$@"
+darcs_status = darcs whatsnew -ls "$@"
+git_fake_bare_status = git status "$@" || true
+
+svn_commit = svn commit "$@"
+git_commit = git commit -a "$@" && git push --all
+bzr_commit = bzr commit "$@" && bzr push
+cvs_commit = cvs commit "$@"
+hg_commit = hg commit -m "$@" && hg push
+darcs_commit = darcs commit -a -m "$@" && darcs push -a
+git_fake_bare_commit = error "commit does not work for fake bare git repositories (yet)."
+
+svn_diff = svn diff "$@"
+git_diff = git diff "$@"
+bzr_diff = bzr diff "$@"
+cvs_diff = cvs diff "$@"
+hg_diff = hg diff "$@"
+darcs_diff = darcs diff "$@"
+git_fake_bare_diff = error "diff does not work for fake bare git repositories (yet)."
+
+svn_log = svn log "$@"
+git_log = git log "$@"
+bzr_log = bzr log "$@"
+cvs_log = cvs log "$@"
+hg_log = hg log "$@"
+darcs_log = darcs changes "$@"
+git_bare_log = git log "$@"
+git_fake_bare_log = git log "$@"
+
+svn_register =
+ url=$(LANG=C svn info . | grep -i ^URL: | cut -d ' ' -f 2)
+ if [ -z "$url" ]; then
+ error "cannot determine svn url"
fi
- basedir="${PWD##*/}"
- case "$(get_repo_type .)" in
- svn)
- url=$(LANG=C svn info . | grep -i ^URL: | cut -d ' ' -f 2)
- if [ -z "$url" ]; then
- error "cannot determine svn url"
- fi
- echo "Registering svn url: $url in $MR_CONFIG"
- mr -c "$MR_CONFIG" config "$PWD" checkout="svn co $url $basedir"
- ;;
- git)
- local repo_type; repo_type="$(get_git_repo_type .)"
- local config;
- case "$repo_type" in
- non-bare) config=.git/config;;
- bare|fake-bare) config=config;;
- esac
- url="$(LANG=C GIT_CONFIG="$config" git-config --get remote.origin.url)" || :
- if [ -z "$url" ]; then
- error "cannot determine git url"
- fi
- local clone_opts add_cmd work_tree suffix
- case "$repo_type" in
- fake-bare)
- # this seems like a fake bare repo and needs a worktree
- work_tree="$(git-config --get core.worktree)" || :
- work_tree="${work_tree%%/}/"
- if [ ! -d "$work_tree" ]; then
- error "git worktree '$work_tree' does not exist"
- fi
- clone_opts=" --no-checkout"
- add_cmd="$add_cmd && cd $basedir"
- add_cmd="$add_cmd && git read-tree HEAD"
- add_cmd="$add_cmd && git checkout-index -a --prefix='$work_tree' || :"
- add_cmd="$add_cmd; git config core.worktree '$work_tree'"
- add_cmd="$add_cmd && mv .git/* . && rmdir .git"
- suffix=" (with worktree $work_tree)"
- ;;
- bare)
- clone_opts=" --bare"
- suffix=" (bare repository)"
- ;;
- esac
- echo "Registering git url: $url in $MR_CONFIG${suffix:-}"
- mr -c "$MR_CONFIG" config "$PWD" checkout="git clone${clone_opts:-} $url $basedir${add_cmd:-}"
- ;;
- bzr)
- url=$(cat .bzr/branch/parent)
- if [ -z "$url" ]; then
- error "cannot determine bzr url"
- fi
- echo "Registering bzr url: $url in $MR_CONFIG"
- mr -c "$MR_CONFIG" config "$PWD" checkout="bzr clone $url $basedir"
- ;;
- CVS)
- repo=$(cat CVS/Repository)
- root=$(cat CVS/Root)
- if [ -z "$root" ]; then
- error "cannot determine cvs root"
+ echo "Registering svn url: $url in $MR_CONFIG"
+ mr -c "$MR_CONFIG" config "`pwd`" checkout="svn co $url $MR_REPO"
+git_register =
- url="$(LANG=C git-config --get remote.origin.url)"
++ url="$(LANG=C git-config --get remote.origin.url)" || true
+ if [ -z "$url" ]; then
+ error "cannot determine git url"
+ fi
+ echo "Registering git url: $url in $MR_CONFIG"
+ mr -c "$MR_CONFIG" config "`pwd`" checkout="git clone $url $MR_REPO"
+bzr_register =
+ url=$(cat .bzr/branch/parent)
+ if [ -z "$url" ]; then
+ error "cannot determine bzr url"
+ fi
+ echo "Registering bzr url: $url in $MR_CONFIG"
+ mr -c "$MR_CONFIG" config "`pwd`" checkout="bzr clone $url $MR_REPO"
+cvs_register =
+ repo=$(cat CVS/Repository)
+ root=$(cat CVS/Root)
+ if [ -z "$root" ]; then
+ error "cannot determine cvs root"
fi
- echo "Registering cvs repository $repo at root $root"
- mr -c "$MR_CONFIG" config "$PWD" \
- checkout="cvs -d '$root' co -d $basedir $repo"
- ;;
- hg)
- url=$(hg showconfig paths.default)
- echo "Registering mercurial repo url: $url in $MR_CONFIG"
- mr -c "$MR_CONFIG" config "$PWD" \
- checkout="hg clone $url $basedir"
- ;;
- darcs)
- url=$(cat _darcs/prefs/defaultrepo)
- echo "Registering darcs repository $url in $MR_CONFIG"
- mr -c "$MR_CONFIG" config "$PWD" \
- checkout="darcs get $url $basedir"
- ;;
- *) error "unable to register this repo type";;
- esac
+ echo "Registering cvs repository $repo at root $root"
+ mr -c "$MR_CONFIG" config "`pwd`" checkout="cvs -d '$root' co -d $MR_REPO $repo"
+hg_register =
+ url=$(hg showconfig paths.default)
+ echo "Registering mercurial repo url: $url in $MR_CONFIG"
+ mr -c "$MR_CONFIG" config "`pwd`" checkout="hg clone $url $MR_REPO"
+darcs_register =
+ url=$(cat _darcs/prefs/defaultrepo)
+ echo "Registering darcs repository $url in $MR_CONFIG"
+ mr -c "$MR_CONFIG" config "`pwd`" checkout="darcs get $url $MR_REPO"
+git_bare_register =
- url="$(LANG=C GIT_CONFIG=config git-config --get remote.origin.url)"
++ url="$(LANG=C GIT_CONFIG=config git-config --get remote.origin.url)" || true
+ if [ -z "$url" ]; then
+ error "cannot determine git url"
+ fi
+ mr -c "$MR_CONFIG" config "`pwd`" \
+ lib="GIT_WORK_TREE=$work_tree; export GIT_WORK_TREE"
+ echo "Registering git url: $url in $MR_CONFIG"
+ mr -c "$MR_CONFIG" config "`pwd`" checkout="git clone $url $MR_REPO"
+git_fake_bare_register =
- url="$(LANG=C GIT_CONFIG=config git-config --get remote.origin.url)"
++ url="$(LANG=C GIT_CONFIG=config git-config --get remote.origin.url)" || true
+ if [ -z "$url" ]; then
+ error "cannot determine git url"
+ fi
+ worktree="$(git-config --get core.worktree)" || true
+ if [ ! -d "$worktree" ]; then
+ error "git worktree $worktree does not exist"
+ fi
+ mr -c "$MR_CONFIG" config "`pwd`" \
+ lib="GIT_WORK_TREE=$work_tree; export GIT_WORK_TREE"
+ echo "Registering git url: $url in $MR_CONFIG (with worktree $worktree)"
+ mr -c "$MR_CONFIG" config "`pwd`" checkout="git clone $url $MR_REPO"
help =
if [ ! -e "$MR_PATH" ]; then