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
+ }
update =
if [ -d "$MR_REPO"/.svn ]; then
svn update "$@"
- elif [ -d "$MR_REPO"/.git ]; then
- if [ -z "$@" ]; then
- git pull -t origin master
- else
- git pull "$@"
- fi
+ elif is_git_repo "$MR_REPO"; then
+ # 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"
elif [ -d "$MR_REPO"/.bzr ]; then
bzr merge "$@"
elif [ -d "$MR_REPO"/CVS ]; then
status =
if [ -d "$MR_REPO"/.svn ]; then
svn status "$@"
- elif [ -d "$MR_REPO"/.git ]; then
+ elif is_git_repo "$MR_REPO"; then
git status "$@" || true
elif [ -d "$MR_REPO"/.bzr ]; then
bzr status "$@"
commit =
if [ -d "$MR_REPO"/.svn ]; then
svn commit "$@"
- elif [ -d "$MR_REPO"/.git ]; then
+ elif is_git_repo "$MR_REPO"; then
+ 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
elif [ -d "$MR_REPO"/.bzr ]; then
bzr commit "$@" && bzr push
diff =
if [ -d "$MR_REPO"/.svn ]; then
svn diff "$@"
- elif [ -d "$MR_REPO"/.git ]; then
+ elif is_git_repo "$MR_REPO"; then
+ 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 "$@"
elif [ -d "$MR_REPO"/.bzr ]; then
bzr diff "$@"
log =
if [ -d "$MR_REPO"/.svn ]; then
svn log"$@"
- elif [ -d "$MR_REPO"/.git ]; then
+ elif is_git_repo "$MR_REPO"; then
git log "$@"
elif [ -d "$MR_REPO"/.bzr ]; then
bzr log "$@"
fi
echo "Registering svn url: $url in $MR_CONFIG"
mr -c "$MR_CONFIG" config "$(pwd)" checkout="svn co $url $basedir"
- elif [ -d .git ]; then
- url=$(LANG=C git-config --get remote.origin.url)
+ elif is_git_repo .; then
+ 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;;
+ *) error "unknown git repository type: $repo_type"
+ esac
+ url="$(LANG=C GIT_CONFIG="$config" git-config --get remote.origin.url)"
if [ -z "$url" ]; then
error "cannot determine git url"
fi
- echo "Registering git url: $url in $MR_CONFIG"
+ case "$repo_type" in
+ bare|fake-bare)
+ # this seems like a bare repo as it has no
+ # worktree.
+ local work_tree
+ work_tree="$(git-config --get core.worktree)" || :
+ if [ ! -d "$work_tree" ]; then
+ error "git worktree $work_tree does not exist"
+ fi
+ suffix=" (with worktree $work_tree)"
+ mr -c "$MR_CONFIG" config "$(pwd)" \
+ lib="GIT_WORK_TREE=$work_tree; export GIT_WORK_TREE"
+ ;;
+ esac
+ echo "Registering git url: $url in $MR_CONFIG${suffix:-}"
mr -c "$MR_CONFIG" config "$(pwd)" checkout="git clone $url $basedir"
elif [ -d .bzr ]; then
url=$(cat .bzr/branch/parent)
T = echo "I pity the fool."
right = echo "Not found."
#}}}
+
+# vim:sw=8:sts=0:ts=8:noet