8583032169bf58c59c5912415c45ecb59eb1fa52
[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 ~/.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 $MRCONFIG ]; then
82         echo $MRCONFIG already exists
83         exit 1
84     fi
85     
86     if [ -e $MOVEINRC ]; then
87         echo $MOVEINRC already exists
88         exit 1
89     fi
90
91     echo -n "git server hostname? [git.vireo.org] " 
92     read GIT_HOST
93     if [ -z "$GIT_HOST" ]; then 
94         GIT_HOST=git.vireo.org
95     fi
96
97     echo -n "path to remote repositories? [~/git] " 
98     read REMOTE_REPOS
99     if [ -z "$REMOTE_REPOS" ]; then 
100         REMOTE_REPOS=~/git
101     fi
102
103     echo -n "Local repository directory? [~/.movein] " 
104     read LOCAL_REPOS
105     if [ -z "$LOCAL_REPOS" ]; then 
106         LOCAL_REPOS=~/.movein
107     fi
108
109     echo -n "Location of .mrconfig file? [~/.mrconfig] " 
110     read MRCONFIG
111     if [ -z "$MRCONFIG" ]; then 
112         MRCONFIG=~/.mrconfig
113     fi
114
115     cat <<EOF > $MOVEINRC
116 GIT_HOST=$GIT_HOST
117 REMOTE_REPOS=$REMOTE_REPOS
118 LOCAL_REPOS=$LOCAL_REPOS
119 MRCONFIG=$MRCONFIG
120 EOF
121
122     if [ ! -d "$LOCAL_REPOS" ]; then 
123         mkdir -p "$LOCAL_REPOS"
124     fi
125
126     cat <<END > $MRCONFIG
127 [DEFAULT]
128 include = cat /usr/share/mr/git-fake-bare
129 END
130
131     
132 }
133
134 login() {
135     if [ $# -ne 1 ]; then 
136         usage
137     fi
138
139     export GIT_DIR="$LOCAL_REPOS/${1}.git"
140     export GIT_WORK_TREE="$GIT_DIR/$(git config --get core.worktree)"
141
142     $SHELL -i || :
143 }
144
145 add() {
146     if [ $# -ne 1 ]; then 
147         usage
148     fi
149     REPO_NAME=$1.git ; shift
150     LOCAL_REPO=$LOCAL_REPOS/$REPO_NAME
151     REPO_URL=ssh://$GIT_HOST/$REMOTE_REPOS/$REPO_NAME
152
153     if [ -e "$LOCAL_REPO" ]; then
154         echo $LOCAL_REPO already exists
155         exit 1
156     else
157         trap "rm -rf $LOCAL_REPO" 0
158         mkdir "$LOCAL_REPO"
159         export GIT_DIR="$LOCAL_REPO"
160         git init --bare
161         git remote add origin $REPO_URL
162         git config branch.master.remote origin
163         git config branch.master.merge refs/heads/master
164         git config core.worktree ../../
165         git config core.bare false
166         GIT_WORK_TREE="$PWD" git pull
167         trap - 0
168         cat <<END >> $MRCONFIG
169
170 [$LOCAL_REPO]
171 checkout = git_fake_bare_checkout '$REPO_URL' '$REPO_NAME' '../../'
172 END
173     fi
174
175 }
176
177 list() {
178     find "${LOCAL_REPOS}" -mindepth 1 -maxdepth 1 -type d | sed 's,^.*/\([^/]*\).git$,\1,'
179 }
180
181 new() {
182     if [ $# -lt 2 ]; then 
183         usage
184     fi
185     REPO_NAME=$1.git ; shift
186     LOCAL_REPO="$LOCAL_REPOS/$REPO_NAME"
187     REPO_URL="ssh://$GIT_HOST/$REMOTE_REPOS/$REPO_NAME"
188
189     if [ ! -e "$1" ]; then
190         echo $1 not found
191         exit 1
192     fi
193
194     if [ -e "$LOCAL_REPO" ]; then
195         echo $LOCAL_REPO already exists
196         exit 1
197     else
198         trap "rm -rf $LOCAL_REPO" 0
199         mkdir -p "$LOCAL_REPO"
200
201         ssh $GIT_HOST "
202                GIT_DIR=$REMOTE_REPOS/$REPO_NAME git --bare init
203         " </dev/null
204
205         export GIT_DIR="$LOCAL_REPO"
206         git init --bare
207         git remote add origin $REPO_URL
208         git config branch.master.remote origin
209         git config branch.master.merge refs/heads/master
210         git config core.worktree ../../
211         git config core.bare false
212 #       for file in  ; do 
213         export GIT_WORK_TREE="$PWD"
214             git add "$@"
215 #       done
216         git commit -m "initial checkin"
217         git push --all
218         
219         trap - 0
220         cat <<END >> $MRCONFIG
221
222 [$LOCAL_REPO]
223 checkout = git_fake_bare_checkout '$REPO_URL' '$REPO_NAME' '../../'
224 END
225     fi
226
227 }
228
229
230 command=$1 ; shift
231 case "$command" in 
232     init)
233         init $@
234         ;;
235     add)
236         add $@
237         ;;
238     new)
239         new $@
240         ;;
241     login)
242         login $@
243         ;;
244     ls)
245         list
246         ;;
247     list)
248         list
249         ;;
250
251     *)
252         usage
253         exit 1
254         ;;
255 esac