[PATCH] git-ls-remote: show and optionally store remote refs.
authorJunio C Hamano <junkio@cox.net>
Sun, 24 Jul 2005 00:54:26 +0000 (17:54 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Sun, 24 Jul 2005 01:28:19 +0000 (18:28 -0700)
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>
Makefile
git-ls-remote-script [new file with mode: 0755]

index e4df945..9d30000 100644 (file)
--- 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 (executable)
index 0000000..921d3f8
--- /dev/null
@@ -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