X-Git-Url: https://git.toastfreeware.priv.at/gregoa/movein.git/blobdiff_plain/8a309911899e8019738ca002b55c9d86cf444e33..HEAD:/movein diff --git a/movein b/movein index 80aa3fa..10658ba 100755 --- a/movein +++ b/movein @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # # Copyright © 2008 Mike O'Connor # @@ -6,19 +6,19 @@ # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any # later version. -# +# # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -# +# # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, -# USA. - +# USA. set -e +set -u usage() { bn=$(basename $0) @@ -39,9 +39,10 @@ SYNOPSIS $bn add repository_name $bn new repository_name file1 [file2 file3...] $bn login repository_name + $bn exec repository_name command [arg1 arg2...] COMMANDS - init + init create ~/.moveinrc, create/update ~/.mrconfig ls @@ -52,11 +53,14 @@ COMMANDS 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...] + new repository_name file1 [file2 file3...] create a new repository on the remote host, and checkin the listed files to the new repository. Add the new repository to mr's configuration @@ -64,6 +68,11 @@ 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 @@ -71,47 +80,67 @@ EOF [ $# -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 + if [ $# -ne 0 ]; then + 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 + if [ -z "$GIT_HOST" ]; then + GIT_HOST=git.$(hostname -d) fi - echo -n "path to remote repositories? [~/git] " + echo -n "path to remote repositories? [~/git] " read REMOTE_REPOS - if [ -z "$REMOTE_REPOS" ]; then - REMOTE_REPOS=~/git + if [ -z "$REMOTE_REPOS" ]; then + REMOTE_REPOS=~/git fi - echo -n "Local repository directory? [~/.movein] " + 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 + if [ -z "$LOCAL_REPOS" ]; then + LOCAL_REPOS=~/.movein fi - echo -n "Location of .mrconfig file? [~/.mrconfig] " + echo -n "Location of .mrconfig file? [~/.mrconfig] " read MRCONFIG - if [ -z "$MRCONFIG" ]; then - MRCONFIG=~/.mrconfig + if [ -z "$MRCONFIG" ]; then + MRCONFIG=~/.mrconfig fi cat < $MOVEINRC @@ -119,140 +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" + if [ ! -d "$LOCAL_REPOS" ]; then + mkdir -p "$LOCAL_REPOS" fi 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 + if [ $# -ne 1 ]; then + usage fi export GIT_DIR="$LOCAL_REPOS/${1}.git" - export GIT_WORK_TREE="$GIT_DIR/$(git config --get core.worktree)" 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.bare false - git config core.worktree ../../ - git config status.showUntrackedFiles no - GIT_WORK_TREE="$LOCAL_REPO/../../" git pull - trap - 0 - - mr -c "$MRCONFIG" config "$LOCAL_REPO" checkout="git_fake_bare_checkout '$REPO_URL' 'REPO_NAME' '../../'" + 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,' | sort + find "${LOCAL_REPOS}" -mindepth 1 -type d -name '*.git' | sed "s,${LOCAL_REPOS}/,," } listremote() { ssh $GIT_HOST " - find '${REMOTE_REPOS}' -mindepth 1 -maxdepth 1 -type d | sed 's,^.*/\([^/]*\).git$,\1,' | sort + find '${REMOTE_REPOS}' -mindepth 1 -type d -name '*.git' | sed 's,${REMOTE_REPOS}/,,' "