X-Git-Url: https://git.toastfreeware.priv.at/gregoa/movein.git/blobdiff_plain/0991f2835418eff45b8655a5dd3191d8412025a8..HEAD:/movein diff --git a/movein b/movein index bf75c6f..10658ba 100755 --- a/movein +++ b/movein @@ -17,8 +17,8 @@ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, # USA. - set -e +set -u usage() { bn=$(basename $0) @@ -34,20 +34,30 @@ SYNOPSIS $bn init $bn ls $bn list + $bn ls-r + $bn list-remote $bn add repository_name $bn new repository_name file1 [file2 file3...] $bn login repository_name + $bn exec repository_name command [arg1 arg2...] COMMANDS init - create ~/.mrconfig + create ~/.moveinrc, create/update ~/.mrconfig ls list - show a list of repositories + show a list of local repositories + + ls-r + list-remote + show a list of remote repositories + + locate pattern + locate which repositories contain files matching pattern add repository_name - checkout the repository from the remote host and add it to + checkout one or more repositories from the remote host and add it to mr's configuration new repository_name file1 [file2 file3...] @@ -58,58 +68,79 @@ COMMANDS login repository_name start a subshell in repository_name + exec repository_name command [arg1 arg2...] + execute a command in the context of repository_name, for example: + $bn exec myrepo git status + $bn exec myrepo git ls-files + EOF exit 1 } +[ $# -ge 1 ] || usage -GIT_HOST=git.vireo.org +GIT_HOST=git.$(hostname -d || echo "example.com") REMOTE_REPOS=~/git LOCAL_REPOS=~/.movein MRCONFIG=~/.mrconfig MOVEINRC=~/.moveinrc +CREATE_REMOTE=1 [ -e "$MOVEINRC" ] && . "$MOVEINRC" init() { if [ $# -ne 0 ]; then - usage - fi - - if [ -e $MRCONFIG ]; then - echo $MRCONFIG already exists - exit 1 + usage fi if [ -e $MOVEINRC ]; then - echo $MOVEINRC already exists - exit 1 + echo $MOVEINRC already exists + exit 1 fi - echo -n "git server hostname? [git.vireo.org] " + echo -n "git server hostname? [${GIT_HOST}] " read GIT_HOST if [ -z "$GIT_HOST" ]; then - GIT_HOST=git.vireo.org + GIT_HOST=git.$(hostname -d) fi echo -n "path to remote repositories? [~/git] " read REMOTE_REPOS if [ -z "$REMOTE_REPOS" ]; then - REMOTE_REPOS=~/git + REMOTE_REPOS=~/git fi + case $GIT_HOST in + *github*) + DEFAULT_CREATE_REMOTE=0 + CREATE_REMOTE_OPTIONS="[yN]" + ;; + *) + DEFAULT_CREATE_REMOTE=1 + CREATE_REMOTE_OPTIONS="[Yn]" + ;; + esac + + echo -n "should \"movein new\" run \"git init\" on the remote host? (github users should say \"no\") $CREATE_REMOTE_OPTIONS" + read CREATE_REMOTE_SELECTION + case "$CREATE_REMOTE_SELECTION" in + [yY]) CREATE_REMOTE=1 ;; + [nN]) CREATE_REMOTE=0 ;; + *) CREATE_REMOTE=$DEFAULT_CREATE_REMOTE + esac + echo -n "Local repository directory? [~/.movein] " read LOCAL_REPOS if [ -z "$LOCAL_REPOS" ]; then - LOCAL_REPOS=~/.movein + LOCAL_REPOS=~/.movein fi echo -n "Location of .mrconfig file? [~/.mrconfig] " read MRCONFIG if [ -z "$MRCONFIG" ]; then - MRCONFIG=~/.mrconfig + MRCONFIG=~/.mrconfig fi cat < $MOVEINRC @@ -117,139 +148,211 @@ GIT_HOST=$GIT_HOST REMOTE_REPOS=$REMOTE_REPOS LOCAL_REPOS=$LOCAL_REPOS MRCONFIG=$MRCONFIG +CREATE_REMOTE=$CREATE_REMOTE EOF if [ ! -d "$LOCAL_REPOS" ]; then - mkdir -p "$LOCAL_REPOS" + mkdir -p "$LOCAL_REPOS" fi - cat < $MRCONFIG -[DEFAULT] -include = cat /usr/share/mr/git-fake-bare -END + mr -c "$MRCONFIG" config DEFAULT include="cat /usr/share/mr/git-fake-bare" +} +git_work_tree() { + local TEMP_REPO + TEMP_REPO=$1 + GIT_WORK_TREE=../../ + + while [ "${TEMP_REPO#*/}" != "$TEMP_REPO" ]; do + TEMP_REPO="${TEMP_REPO#*/}" + GIT_WORK_TREE="../$GIT_WORK_TREE" + done } login() { if [ $# -ne 1 ]; then - usage + usage fi export GIT_DIR="$LOCAL_REPOS/${1}.git" - export GIT_WORK_TREE="$GIT_DIR/$(git config --get core.worktree)" - $SHELL -i || : + GIT_PS1_SHOWUNTRACKEDFILES= PSMOVEIN="movein:${1}" $SHELL -i || : } -add() { - if [ $# -ne 1 ]; then - usage +execin() { + local REPO + if [ $# -lt 2 ]; then + usage fi - REPO_NAME=$1.git ; shift - LOCAL_REPO=$LOCAL_REPOS/$REPO_NAME - REPO_URL=ssh://$GIT_HOST/$REMOTE_REPOS/$REPO_NAME - if [ -e "$LOCAL_REPO" ]; then - echo $LOCAL_REPO already exists - exit 1 - else - trap "rm -rf $LOCAL_REPO" 0 - mkdir "$LOCAL_REPO" - export GIT_DIR="$LOCAL_REPO" - git init --bare - git remote add origin $REPO_URL - git config branch.master.remote origin - git config branch.master.merge refs/heads/master - git config core.worktree ../../ - git config core.bare false - GIT_WORK_TREE="$PWD" git pull - trap - 0 - cat <> $MRCONFIG - -[$LOCAL_REPO] -checkout = git_fake_bare_checkout '$REPO_URL' '$REPO_NAME' '../../' -END + REPO=$1;shift + + export GIT_DIR="$LOCAL_REPOS/${REPO}.git" + + "$@" +} + +add() { + if [ $# -lt 1 ]; then + usage fi + for REPO in "$@"; do + REPO_NAME=$REPO.git + LOCAL_REPO=$LOCAL_REPOS/$REPO_NAME + REPO_URL=ssh://$GIT_HOST/$REMOTE_REPOS/$REPO_NAME + + if [ -e "$LOCAL_REPO" ]; then + echo $LOCAL_REPO already exists + exit 1 + else + trap "unset GIT_DIR; unset GIT_WORK_TREE; rm -rf $LOCAL_REPO" 0 + mkdir -p "$LOCAL_REPO" + export GIT_DIR="$LOCAL_REPO" + git_work_tree "$REPO_NAME" + git init --bare + git remote add origin $REPO_URL + git config branch.master.remote origin + git config branch.master.merge refs/heads/master + git config core.bare false + git config core.worktree "$GIT_WORK_TREE" + git config status.showUntrackedFiles no + git pull + trap - 0 + + mr -c "$MRCONFIG" config "$LOCAL_REPO" checkout="git_fake_bare_checkout '$REPO_URL' '$REPO_NAME' '$GIT_WORK_TREE'" + fi + done } list() { - find "${LOCAL_REPOS}" -mindepth 1 -maxdepth 1 -type d | sed 's,^.*/\([^/]*\).git$,\1,' + find "${LOCAL_REPOS}" -mindepth 1 -type d -name '*.git' | sed "s,${LOCAL_REPOS}/,," +} + +listremote() { + ssh $GIT_HOST " + find '${REMOTE_REPOS}' -mindepth 1 -type d -name '*.git' | sed 's,${REMOTE_REPOS}/,,' + " > $MRCONFIG - -[$LOCAL_REPO] -checkout = git_fake_bare_checkout '$REPO_URL' '$REPO_NAME' '../../' -END + trap "unset GIT_DIR; unset GIT_WORK_TREE; rm -rf $LOCAL_REPO" 0 + mkdir -p "$LOCAL_REPO" + + if [ $CREATE_REMOTE -ne 0 ]; then + ssh $GIT_HOST " + GIT_DIR=$REMOTE_REPOS/$REPO_NAME git --bare init + "