diff options
| author | makefu <github@syntax-fehler.de> | 2014-03-14 08:38:07 +0100 | 
|---|---|---|
| committer | makefu <github@syntax-fehler.de> | 2014-03-14 08:38:07 +0100 | 
| commit | b4f99fda9e930e101bb09674cf1b6d69393f2b1e (patch) | |
| tree | 896439c283e1c324ee0858f41a30b49406df6c9b /.graveyard/git/git-clone-into | |
| parent | 26357c5cb98fe59b0ced568097c17e81d74db4ea (diff) | |
| parent | f92547a54d899216a4cd849ee515726824467765 (diff) | |
Merge branch 'master' of ssh://github.com/krebscode/painload
Diffstat (limited to '.graveyard/git/git-clone-into')
| -rwxr-xr-x | .graveyard/git/git-clone-into | 48 | 
1 files changed, 48 insertions, 0 deletions
| diff --git a/.graveyard/git/git-clone-into b/.graveyard/git/git-clone-into new file mode 100755 index 00000000..67e820e6 --- /dev/null +++ b/.graveyard/git/git-clone-into @@ -0,0 +1,48 @@ +#! /bin/sh +# +# usage: git-clone-into repository directory +# +set -euf + +tempdir() { +  set -- `tempnam $1` +  mkdir $1 +  echo $1 +} + +## [prefix] -> tempnam +tempnam() { +  until set -- $1 ${1-}`candnam` && ! test -e $2; do :; done +  echo $2 +} + +candnam() { +  uuidgen 2>/dev/null || date +%s%N +} + + + +  tmp_remote=`candnam` +  tmp_branch=`candnam` + +  subdir=$2 +  if test -e $subdir; then +    echo 'You are made of stupid!' >&2 +    exit 23 +  fi +  tmpdir=`tempdir /tmp/tempdir-` +  #trap "test -d $tmpdir && rm -vfR $tmpdir" EXIT +  trap "test -d $tmpdir && rm -fR $tmpdir" EXIT +  repository="${1-$repository}" +  git clone "$repository" $tmpdir +  (cd $tmpdir +  subdir="$subdir" git filter-branch --tree-filter ' +    if ! test -d $subdir; then +      mkdir -p $subdir +      git ls-tree -z --name-only $GIT_COMMIT | xargs -I. --null mv . $subdir +    fi +  ' +  git checkout -b $tmp_branch) +  git remote add $tmp_remote $tmpdir +  git fetch $tmp_remote +  git merge $tmp_remote/$tmp_branch # TODO configurable branch | 
