git-clone-scripton commit [PATCH] Make sq_expand() available as sq_quote(). (6fb737b)
   1#!/bin/sh
   2#
   3# Copyright (c) 2005, Linus Torvalds
   4# Copyright (c) 2005, Junio C Hamano
   5# 
   6# Clone a repository into a different directory that does not yet exist.
   7
   8usage() {
   9        echo >&2 "* git clone [-l] <repo> <dir>"
  10        exit 1
  11}
  12
  13use_local=no
  14while
  15        case "$#,$1" in
  16        0,*) break ;;
  17        *,-l|*,--l|*,--lo|*,--loc|*,--loca|*,--local) use_local=yes ;;
  18        *,-*) usage ;;
  19        *) break ;;
  20        esac
  21do
  22        shift
  23done
  24
  25repo="$1"
  26dir="$2"
  27mkdir "$dir" &&
  28D=$(
  29        (cd "$dir" && git-init-db && pwd)
  30) &&
  31test -d "$D" || usage
  32
  33# We do local magic only when the user tells us to.
  34case "$use_local" in
  35yes)
  36        ( cd "$repo/objects" ) || {
  37                repo="$repo/.git"
  38                ( cd "$repo/objects" ) || {
  39                    echo >&2 "-l flag seen but $repo is not local."
  40                    exit 1
  41                }
  42        }
  43
  44        # See if we can hardlink and drop "l" if not.
  45        sample_file=$(cd "$repo" && \
  46                      find objects -type f -print | sed -e 1q)
  47
  48        # objects directory should not be empty since we are cloning!
  49        test -f "$repo/$sample_file" || exit
  50
  51        l=
  52        if ln "$repo/$sample_file" "$D/.git/objects/sample" 2>/dev/null
  53        then
  54                l=l
  55        fi &&
  56        rm -f "$D/.git/objects/sample" &&
  57        cp -r$l "$repo/objects" "$D/.git/" || exit 1
  58
  59        # Make a duplicate of refs and HEAD pointer
  60        HEAD=
  61        if test -f "$repo/HEAD"
  62        then
  63                HEAD=HEAD
  64        fi
  65        tar Ccf "$repo" - refs $HEAD | tar Cxf "$D/.git" - || exit 1
  66        exit 0
  67        ;;
  68esac
  69
  70cd "$D" && git clone-pack "$repo"