added login/ls/list
[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 set -e
21
22 usage() {
23     bn=$(basename $0)
24     cat <<EOF
25 $0: manage home directory using mr
26
27 NAME
28   $bn - a command to manage detached git repositories using mr
29
30 SYNOPSIS
31   $bn command [options]
32
33   $bn init
34   $bn ls
35   $bn list
36   $bn add repository_name
37   $bn new repository_name file1 [file2 file3...]
38   $bn login repository_name
39
40 COMMANDS
41   init 
42       create ~/.mrconfig
43
44   ls
45   list
46       show a list of repositories
47
48   add repository_name
49       checkout the repository from the remote host and add it to
50       mr's configuration
51
52   new repository_name file1 [file2 file3...]  
53       create a new repository on the remote host, and checkin the
54       listed files to the new repository.   Add the new repository
55       to mr's configuration
56
57   login repository_name
58       start a subshell in repository_name
59
60 EOF
61
62     exit 1
63 }
64
65
66 GIT_HOST=git.vireo.org
67 REMOTE_REPOS=~/git
68 LOCAL_REPOS=~/.movein
69 MRCONFIG=~/.mrconfig
70 MOVEINRC=~/.moveinrc
71
72 [ -e "$MOVEINRC" ] && . "$MOVEINRC"
73
74 init() {
75
76     if [ $# -ne 0 ]; then 
77         usage
78     fi
79     
80     if [ -e $MRCONFIG ]; then
81         echo $MRCONFIG already exists
82         exit 1
83     fi
84     
85     if [ -e $MOVEINRC ]; then
86         echo $MOVEINRC already exists
87         exit 1
88     fi
89
90     echo -n "git server hostname? [git.vireo.org] " 
91     read GIT_HOST
92     if [ -z "$GIT_HOST" ]; then 
93         GIT_HOST=git.vireo.org
94     fi
95
96     echo -n "path to remote repositories? [~/git] " 
97     read REMOTE_REPOS
98     if [ -z "$REMOTE_REPOS" ]; then 
99         REMOTE_REPOS=~/git
100     fi
101
102     echo -n "Local repository directory? [~/.movein] " 
103     read LOCAL_REPOS
104     if [ -z "$LOCAL_REPOS" ]; then 
105         LOCAL_REPOS=~/.movein
106     fi
107
108     echo -n "Location of .mrconfig file? [~/.mrconfig] " 
109     read MRCONFIG
110     if [ -z "$MRCONFIG" ]; then 
111         MRCONFIG=~/.mrconfig
112     fi
113
114     cat <<EOF > $MOVEINRC
115 GIT_HOST=$GIT_HOST
116 REMOTE_REPOS=$REMOTE_REPOS
117 LOCAL_REPOS=$LOCAL_REPOS
118 MRCONFIG=$MRCONFIG
119 EOF
120
121     if [ ! -d "$LOCAL_REPOS" ]; then 
122         mkdir -p "$LOCAL_REPOS"
123     fi
124
125     cat <<END > $MRCONFIG
126 [DEFAULT]
127 include = cat /usr/share/mr/git-fake-bare
128 END
129
130     
131 }
132
133 login() {
134     if [ $# -ne 1 ]; then 
135         usage
136     fi
137
138     export GIT_DIR="$LOCAL_REPOS/${1}.git"
139     export GIT_WORK_TREE="$GIT_DIR/$(git config --get core.worktree)"
140
141     $SHELL -i || :
142 }
143
144 add() {
145     if [ $# -ne 1 ]; then 
146         usage
147     fi
148     REPO_NAME=$1.git ; shift
149     LOCAL_REPO=$LOCAL_REPOS/$REPO_NAME
150     REPO_URL=ssh://$GIT_HOST/$REMOTE_REPOS/$REPO_NAME
151
152     if [ -e "$LOCAL_REPO" ]; then
153         echo $LOCAL_REPO already exists
154         exit 1
155     else
156         trap "rm -rf $LOCAL_REPO" 0
157         mkdir "$LOCAL_REPO"
158         export GIT_DIR="$LOCAL_REPO"
159         git init --bare
160         git remote add origin $REPO_URL
161         git config branch.master.remote origin
162         git config branch.master.merge refs/heads/master
163         git config core.worktree ../../
164         git config core.bare false
165         GIT_WORK_TREE="$PWD" git pull
166         trap - 0
167         cat <<END >> $MRCONFIG
168
169 [$LOCAL_REPO]
170 checkout = git_fake_bare_checkout '$REPO_URL' '$REPO_NAME' '../../'
171 END
172     fi
173
174 }
175
176 list() {
177     find "${LOCAL_REPOS}" -mindepth 1 -maxdepth 1 -type d | sed 's,^.*/\([^/]*\).git$,\1,'
178 }
179
180 new() {
181     if [ $# -lt 2 ]; then 
182         usage
183     fi
184     REPO_NAME=$1.git ; shift
185     LOCAL_REPO="$LOCAL_REPOS/$REPO_NAME"
186     REPO_URL="ssh://$GIT_HOST/$REMOTE_REPOS/$REPO_NAME"
187
188     if [ ! -e "$1" ]; then
189         echo $1 not found
190         exit 1
191     fi
192
193     if [ -e "$LOCAL_REPO" ]; then
194         echo $LOCAL_REPO already exists
195         exit 1
196     else
197         trap "rm -rf $LOCAL_REPO" 0
198         mkdir -p "$LOCAL_REPO"
199
200         ssh $GIT_HOST "
201                GIT_DIR=$REMOTE_REPOS/$REPO_NAME git --bare init
202         " </dev/null
203
204         export GIT_DIR="$LOCAL_REPO"
205         git init --bare
206         git remote add origin $REPO_URL
207         git config branch.master.remote origin
208         git config branch.master.merge refs/heads/master
209         git config core.worktree ../../
210         git config core.bare false
211 #       for file in  ; do 
212         export GIT_WORK_TREE="$PWD"
213             git add "$@"
214 #       done
215         git commit -m "initial checkin"
216         git push --all
217         
218         trap - 0
219         cat <<END >> $MRCONFIG
220
221 [$LOCAL_REPO]
222 checkout = git_fake_bare_checkout '$REPO_URL' '$REPO_NAME' '../../'
223 END
224     fi
225
226 }
227
228
229 command=$1 ; shift
230 case "$command" in 
231     init)
232         init $@
233         ;;
234     add)
235         add $@
236         ;;
237     new)
238         new $@
239         ;;
240     login)
241         login $@
242         ;;
243     ls)
244         list
245         ;;
246     list)
247         list
248         ;;
249
250     *)
251         usage
252         exit 1
253         ;;
254 esac