summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Junio C Hamano <junkio@cox.net>2005-07-23 17:54:26 -0700
committerLibravatar Linus Torvalds <torvalds@g5.osdl.org>2005-07-23 18:28:19 -0700
commit0fec0822721cc18d6a62ab78da1ebf87914d4921 (patch)
tree83e374084086a47cf01c8d3c64ffcd2fc5de3e4f
parent[PATCH] Documentation: git-peek-remote. (diff)
downloadtgif-0fec0822721cc18d6a62ab78da1ebf87914d4921.tar.xz
[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>
-rw-r--r--Makefile3
-rwxr-xr-xgit-ls-remote-script104
2 files changed, 106 insertions, 1 deletions
diff --git a/Makefile b/Makefile
index e4df945fbc..9d30000103 100644
--- a/Makefile
+++ b/Makefile
@@ -36,7 +36,8 @@ SCRIPTS=git git-apply-patch-script git-merge-one-file-script git-prune-script \
git-reset-script git-add-script git-checkout-script git-clone-script \
gitk git-cherry git-rebase-script git-relink-script git-repack-script \
git-format-patch-script git-sh-setup-script git-push-script \
- git-branch-script git-parse-remote git-verify-tag-script
+ git-branch-script git-parse-remote git-verify-tag-script \
+ git-ls-remote-script
PROG= git-update-cache git-diff-files git-init-db git-write-tree \
git-read-tree git-commit-tree git-cat-file git-fsck-cache \
diff --git a/git-ls-remote-script b/git-ls-remote-script
new file mode 100755
index 0000000000..921d3f8462
--- /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