diff options
Diffstat (limited to 'git-ls-remote-script')
-rwxr-xr-x | git-ls-remote-script | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/git-ls-remote-script b/git-ls-remote-script new file mode 100755 index 000000000..921d3f846 --- /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 |