#!/bin/sh
-. git-sh-setup || die "Not a git archive"
+
+USAGE='[--all] [--tags] [--force] <repository> [<refspec>...]'
+. git-sh-setup
# Parse out parameters and then stop at remote, so that we can
# translate it using .git/branches information
has_force=
has_exec=
remote=
+do_tags=
while case "$#" in 0) break ;; esac
do
case "$1" in
--all)
has_all=--all ;;
+ --tags)
+ do_tags=yes ;;
--force)
has_force=--force ;;
--exec=*)
has_exec="$1" ;;
-*)
- die "Unknown parameter $1" ;;
+ usage ;;
*)
set x "$@"
shift
done
case "$#" in
0)
- die "Where would you want to push today?" ;;
+ echo "Where would you want to push today?"
+ usage ;;
esac
. git-parse-remote
remote=$(get_remote_url "$@")
+
case "$has_all" in
---all) set x ;;
-'') set x $(get_remote_refs_for_push "$@") ;;
+--all)
+ set x ;;
+'')
+ case "$do_tags,$#" in
+ yes,1)
+ set x $(cd "$GIT_DIR/refs" && find tags -type f -print) ;;
+ yes,*)
+ set x $(cd "$GIT_DIR/refs" && find tags -type f -print) \
+ $(get_remote_refs_for_push "$@") ;;
+ ,*)
+ set x $(get_remote_refs_for_push "$@") ;;
+ esac
+esac
+
+shift ;# away the initial 'x'
+
+# Now we have explicit refs from the command line or from remotes/
+# shorthand, or --tags. Falling back on the current branch if we still
+# do not have any may be an alternative, but prevent mistakes for now.
+
+case "$#,$has_all" in
+0,)
+ die "No refs given to be pushed." ;;
esac
-shift
case "$remote" in
-http://* | https://* | git://* | rsync://* )
- die "Cannot push to $remote" ;;
+git://*)
+ die "Cannot use READ-ONLY transport to push to $remote" ;;
+rsync://*)
+ die "Pushing with rsync transport is deprecated" ;;
esac
set x "$remote" "$@"; shift
test "$has_force" && set x "$has_force" "$@" && shift
test "$has_exec" && set x "$has_exec" "$@" && shift
-exec git-send-pack "$@"
+case "$remote" in
+http://* | https://*)
+ exec git-http-push "$@";;
+*)
+ exec git-send-pack "$@";;
+esac