summaryrefslogtreecommitdiff
path: root/git-ls-remote-script
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2005-07-24 00:54:26 (GMT)
committerLinus Torvalds <torvalds@g5.osdl.org>2005-07-24 01:28:19 (GMT)
commit0fec0822721cc18d6a62ab78da1ebf87914d4921 (patch)
tree83e374084086a47cf01c8d3c64ffcd2fc5de3e4f /git-ls-remote-script
parent508e67ab6ea338c6c54c97690501423b39992732 (diff)
downloadgit-0fec0822721cc18d6a62ab78da1ebf87914d4921.zip
git-0fec0822721cc18d6a62ab78da1ebf87914d4921.tar.gz
git-0fec0822721cc18d6a62ab78da1ebf87914d4921.tar.bz2
[PATCH] git-ls-remote: show and optionally store remote refs.
Retrieve and list the remote refs from git, http, and rsync repositories, and optionally stores the retrieved refs in the local repository under the same name. To access a git URL, git-peek-remote command is used. An http URL needs to have an up-to-date info/refs file for discovery, which will be introduced by a later update-server-info patch. Signed-off-by: Junio C Hamano <junkio@cox.net> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'git-ls-remote-script')
-rwxr-xr-xgit-ls-remote-script104
1 files changed, 104 insertions, 0 deletions
diff --git a/git-ls-remote-script b/git-ls-remote-script
new file mode 100755
index 0000000..921d3f8
--- /dev/null
+++ b/git-ls-remote-script
@@ -0,0 +1,104 @@
+#!/bin/sh
+#
+. git-sh-setup-script || die "Not a git archive"
+
+usage () {
+ echo >&2 "usage: $0 [--heads] [--tags] [--overwrite | --store] repo"
+ exit 1;
+}
+
+while case "$#" in 0) break;; esac
+do
+ case "$1" in
+ -h|--h|--he|--hea|--head|--heads)
+ heads=heads; shift ;;
+ -o|--o|--ov|--ove|--over|--overw|--overwr|--overwri|--overwrit|--overwrite)
+ overwrite=overwrite; shift ;;
+ -s|--s|--st|--sto|--stor|--store)
+ store=store; shift ;;
+ -t|--t|--ta|--tag|--tags)
+ tags=tags; shift ;;
+ --)
+ shift; break ;;
+ -*)
+ usage ;;
+ *)
+ break ;;
+ esac
+done
+
+case "$#" in 1) ;; *) usage ;; esac
+case ",$store,$overwrite," in *,,*) ;; *) usage ;; esac
+
+case ",$heads,$tags," in
+,,,) heads=heads tags=tags other=other ;;
+esac
+
+. git-parse-remote "$@"
+peek_repo="$_remote_repo"
+
+tmp=.ls-remote-$$
+trap "rm -fr $tmp-*" 0 1 2 3 15
+tmpdir=$tmp-d
+
+case "$peek_repo" in
+http://* | https://* )
+ if [ -n "$GIT_SSL_NO_VERIFY" ]; then
+ curl_extra_args="-k"
+ fi
+ curl -ns $curl_extra_args "$peek_repo/info/refs" || exit 1
+ ;;
+
+rsync://* )
+ mkdir $tmpdir
+ rsync -rq "$peek_repo/refs" $tmpdir || exit 1
+ (cd $tmpdir && find refs -type f) |
+ while read path
+ do
+ cat "$tmpdir/$path" | tr -d '\012'
+ echo " $path"
+ done &&
+ rm -fr $tmpdir
+ ;;
+
+* )
+ git-peek-remote "$peek_repo"
+ ;;
+esac |
+
+while read sha1 path
+do
+ case "$path" in
+ refs/heads/*)
+ group=heads ;;
+ refs/tags/*)
+ group=tags ;;
+ *)
+ group=other ;;
+ esac
+ case ",$heads,$tags,$other," in
+ *,$group,*)
+ ;;
+ *)
+ continue;;
+ esac
+
+ echo "$sha1 $path"
+
+ case "$path,$store,$overwrite," in
+ *,,, | HEAD,*) continue ;;
+ esac
+
+ if test -f "$GIT_DIR/$path" && test "$overwrite" == ""
+ then
+ continue
+ fi
+
+ # Be careful. We may not have that object yet!
+ if git-cat-file -t "$sha1" >/dev/null 2>&1
+ then
+ echo "$sha1" >"$GIT_DIR/$path"
+ else
+ echo >&2 "* You have not fetched updated $path ($sha1)."
+ fi
+done