aboutsummaryrefslogtreecommitdiffstats
path: root/git-parse-remote
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2005-07-16 00:16:24 -0700
committerLinus Torvalds <torvalds@g5.osdl.org>2005-07-16 09:23:06 -0700
commitf170e4b39d87365cda17b80436ba6db4a2044e88 (patch)
treedb95f53ae73c341922700257c15443080e176054 /git-parse-remote
parent02d57da4a5c238eff7ea115c69d2e5c977bf1adb (diff)
downloadgit-f170e4b39d87365cda17b80436ba6db4a2044e88.tar.gz
[PATCH] fetch/pull: short-hand notation for remote repositories.
Since pull and fetch are done often against the same remote repository repeatedly, keeping the URL to pull from along with the name of the head to use in $GIT_DIR/branches/$name makes a lot of sense. Adopt that convention from Cogito, and try to be compatible when possible; storing a partial URL and completing it with a trailing path may not be understood by Cogito. While we are at it, fix pulling a tag. Earlier, we updated only refs/tags/$tag without updating FETCH_HEAD, and called resolve-script using a stale (or absent) FETCH_HEAD. Signed-off-by: Junio C Hamano <junkio@cox.net> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'git-parse-remote')
-rwxr-xr-xgit-parse-remote79
1 files changed, 79 insertions, 0 deletions
diff --git a/git-parse-remote b/git-parse-remote
new file mode 100755
index 0000000000..bfe7a906d9
--- /dev/null
+++ b/git-parse-remote
@@ -0,0 +1,79 @@
+: To be included in git-pull and git-fetch scripts.
+
+# A remote repository can be specified on the command line
+# in one of the following formats:
+#
+# <repo>
+# <repo> <head>
+# <repo> tag <tag>
+#
+# where <repo> could be one of:
+#
+# a URL (including absolute or local pathname)
+# a short-hand
+# a short-hand followed by a trailing path
+#
+# A short-hand <name> has a corresponding file $GIT_DIR/branches/<name>,
+# whose contents is a URL, possibly followed by a URL fragment #<head>
+# to name the default branch on the remote side to fetch from.
+
+_remote_repo= _remote_store= _remote_head= _remote_name=
+
+case "$1" in
+*:* | /* | ../* | ./* )
+ _remote_repo="$1"
+ ;;
+* )
+ # otherwise, it is a short hand.
+ case "$1" in
+ */*)
+ # a short-hand followed by a trailing path
+ _token=$(expr "$1" : '\([^/]*\)/')
+ _rest=$(expr "$1" : '[^/]*\(/.*\)$')
+ ;;
+ *)
+ _token="$1"
+ _rest=
+ _remote_store="refs/heads/$_token"
+ ;;
+ esac
+ test -f "$GIT_DIR/branches/$_token" ||
+ die "No such remote branch: $_token"
+
+ _remote_repo=$(cat "$GIT_DIR/branches/$_token")"$_rest"
+ ;;
+esac
+
+case "$_remote_repo" in
+*"#"*)
+ _remote_head=`expr "$_remote_repo" : '.*#\(.*\)$'`
+ _remote_repo=`expr "$_remote_repo" : '\(.*\)#'`
+ ;;
+esac
+
+_remote_name=$(echo "$_remote_repo" | sed 's|\.git/*$||')
+
+case "$2" in
+tag)
+ _remote_name="tag '$3' of $_remote_name"
+ _remote_head="refs/tags/$3"
+ _remote_store="$_remote_head"
+ ;;
+?*)
+ # command line specified a head explicitly; do not
+ # store the fetched head as a branch head.
+ _remote_name="head '$2' of $_remote_name"
+ _remote_head="refs/heads/$2"
+ _remote_store=''
+ ;;
+'')
+ case "$_remote_head" in
+ '')
+ _remote_head=HEAD ;;
+ *)
+ _remote_head="refs/heads/$_remote_head"
+ _remote_name="head '$_remote_head' of $_remote_name"
+ ;;
+ esac
+ ;;
+esac