diff options
-rw-r--r-- | Makefile | 3 | ||||
-rwxr-xr-x | git-ls-remote-script | 104 |
2 files changed, 106 insertions, 1 deletions
@@ -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 |