Set GIT_WORK_TREE relative to repository.
[gregoa/movein.git] / movein
1 #!/bin/sh
2 #
3 # Copyright © 2008 Mike O'Connor <stew@vireo.org>
4 #
5 # This program is free software; you can redistribute it and/or modify it
6 # under the terms of the GNU General Public License as published by the
7 # Free Software Foundation; either version 2, or (at your option) any
8 # later version.
9
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
18 # USA.  
19
20
21 set -e
22
23 usage() {
24     bn=$(basename $0)
25     cat <<EOF
26 $0: manage home directory using mr
27
28 NAME
29   $bn - a command to manage detached git repositories using mr
30
31 SYNOPSIS
32   $bn command [options]
33
34   $bn init
35   $bn ls
36   $bn list
37   $bn add repository_name
38   $bn new repository_name file1 [file2 file3...]
39   $bn login repository_name
40
41 COMMANDS
42   init 
43       create ~/.moveinrc, create/update  ~/.mrconfig
44
45   ls
46   list
47       show a list of repositories
48
49   add repository_name
50       checkout the repository from the remote host and add it to
51       mr's configuration
52
53   new repository_name file1 [file2 file3...]  
54       create a new repository on the remote host, and checkin the
55       listed files to the new repository.   Add the new repository
56       to mr's configuration
57
58   login repository_name
59       start a subshell in repository_name
60
61 EOF
62
63     exit 1
64 }
65
66
67 GIT_HOST=git.vireo.org
68 REMOTE_REPOS=~/git
69 LOCAL_REPOS=~/.movein
70 MRCONFIG=~/.mrconfig
71 MOVEINRC=~/.moveinrc
72
73 [ -e "$MOVEINRC" ] && . "$MOVEINRC"
74
75 init() {
76
77     if [ $# -ne 0 ]; then 
78         usage
79     fi
80     
81     if [ -e $MOVEINRC ]; then
82         echo $MOVEINRC already exists
83         exit 1
84     fi
85
86     echo -n "git server hostname? [git.vireo.org] " 
87     read GIT_HOST
88     if [ -z "$GIT_HOST" ]; then 
89         GIT_HOST=git.vireo.org
90     fi
91
92     echo -n "path to remote repositories? [~/git] " 
93     read REMOTE_REPOS
94     if [ -z "$REMOTE_REPOS" ]; then 
95         REMOTE_REPOS=~/git
96     fi
97
98     echo -n "Local repository directory? [~/.movein] " 
99     read LOCAL_REPOS
100     if [ -z "$LOCAL_REPOS" ]; then 
101         LOCAL_REPOS=~/.movein
102     fi
103
104     echo -n "Location of .mrconfig file? [~/.mrconfig] " 
105     read MRCONFIG
106     if [ -z "$MRCONFIG" ]; then 
107         MRCONFIG=~/.mrconfig
108     fi
109
110     cat <<EOF > $MOVEINRC
111 GIT_HOST=$GIT_HOST
112 REMOTE_REPOS=$REMOTE_REPOS
113 LOCAL_REPOS=$LOCAL_REPOS
114 MRCONFIG=$MRCONFIG
115 EOF
116
117     if [ ! -d "$LOCAL_REPOS" ]; then 
118         mkdir -p "$LOCAL_REPOS"
119     fi
120
121     mr -c "$MRCONFIG" config DEFAULT include="cat /usr/share/mr/git-fake-bare"
122     
123 }
124
125 login() {
126     if [ $# -ne 1 ]; then 
127         usage
128     fi
129
130     export GIT_DIR="$LOCAL_REPOS/${1}.git"
131     export GIT_WORK_TREE="$GIT_DIR/$(git config --get core.worktree)"
132
133     $SHELL -i || :
134 }
135
136 add() {
137     if [ $# -ne 1 ]; then 
138         usage
139     fi
140     REPO_NAME=$1.git ; shift
141     LOCAL_REPO=$LOCAL_REPOS/$REPO_NAME
142     REPO_URL=ssh://$GIT_HOST/$REMOTE_REPOS/$REPO_NAME
143
144     if [ -e "$LOCAL_REPO" ]; then
145         echo $LOCAL_REPO already exists
146         exit 1
147     else
148         trap "rm -rf $LOCAL_REPO" 0
149         mkdir "$LOCAL_REPO"
150         export GIT_DIR="$LOCAL_REPO"
151         git init --bare
152         git remote add origin $REPO_URL
153         git config branch.master.remote origin
154         git config branch.master.merge refs/heads/master
155         git config core.bare false
156         git config core.worktree ../../
157         git config status.showUntrackedFiles no
158         GIT_WORK_TREE="$LOCAL_REPO/../../" git pull
159         trap - 0
160
161         mr -c "$MRCONFIG" config "$LOCAL_REPO" checkout="git_fake_bare_checkout '$REPO_URL' 'REPO_NAME' '../../'"
162     fi
163 }
164
165 list() {
166     find "${LOCAL_REPOS}" -mindepth 1 -maxdepth 1 -type d | sed 's,^.*/\([^/]*\).git$,\1,'
167 }
168
169 new() {
170     if [ $# -lt 2 ]; then 
171         usage
172     fi
173     REPO_NAME=$1.git ; shift
174     LOCAL_REPO="$LOCAL_REPOS/$REPO_NAME"
175     REPO_URL="ssh://$GIT_HOST/$REMOTE_REPOS/$REPO_NAME"
176
177     if [ ! -e "$1" ]; then
178         echo $1 not found
179         exit 1
180     fi
181
182     if [ -e "$LOCAL_REPO" ]; then
183         echo $LOCAL_REPO already exists
184         exit 1
185     else
186         trap "rm -rf $LOCAL_REPO" 0
187         mkdir -p "$LOCAL_REPO"
188
189         ssh $GIT_HOST "
190                GIT_DIR=$REMOTE_REPOS/$REPO_NAME git --bare init
191         " </dev/null
192
193         export GIT_DIR="$LOCAL_REPO"
194         git init --bare
195         git remote add origin $REPO_URL
196         git config branch.master.remote origin
197         git config branch.master.merge refs/heads/master
198         git config core.bare false
199         git config core.worktree ../../
200         git config status.showUntrackedFiles no
201         export GIT_WORK_TREE="$LOCAL_REPO/../../"
202         git add "$@"
203         git commit -m "initial checkin"
204         git push --all
205         
206         trap - 0
207
208         mr -c "$MRCONFIG" config "$LOCAL_REPO" checkout="git_fake_bare_checkout '$REPO_URL' 'REPO_NAME' '../../'"
209     fi
210
211 }
212
213
214 command=$1 ; shift
215 case "$command" in 
216     init)
217         init $@
218         ;;
219     add)
220         add $@
221         ;;
222     new)
223         new $@
224         ;;
225     login)
226         login $@
227         ;;
228     ls)
229         list
230         ;;
231     list)
232         list
233         ;;
234
235     *)
236         usage
237         exit 1
238         ;;
239 esac