Manage $MRCONFIG with `mr config'.
[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.worktree ../../
156         git config core.bare false
157         GIT_WORK_TREE="$PWD" git pull
158         trap - 0
159
160         mr -c "$MRCONFIG" config "$LOCAL_REPO" checkout="git_fake_bare_checkout '$REPO_URL' 'REPO_NAME' '../../'"
161     fi
162 }
163
164 list() {
165     find "${LOCAL_REPOS}" -mindepth 1 -maxdepth 1 -type d | sed 's,^.*/\([^/]*\).git$,\1,'
166 }
167
168 new() {
169     if [ $# -lt 2 ]; then 
170         usage
171     fi
172     REPO_NAME=$1.git ; shift
173     LOCAL_REPO="$LOCAL_REPOS/$REPO_NAME"
174     REPO_URL="ssh://$GIT_HOST/$REMOTE_REPOS/$REPO_NAME"
175
176     if [ ! -e "$1" ]; then
177         echo $1 not found
178         exit 1
179     fi
180
181     if [ -e "$LOCAL_REPO" ]; then
182         echo $LOCAL_REPO already exists
183         exit 1
184     else
185         trap "rm -rf $LOCAL_REPO" 0
186         mkdir -p "$LOCAL_REPO"
187
188         ssh $GIT_HOST "
189                GIT_DIR=$REMOTE_REPOS/$REPO_NAME git --bare init
190         " </dev/null
191
192         export GIT_DIR="$LOCAL_REPO"
193         git init --bare
194         git remote add origin $REPO_URL
195         git config branch.master.remote origin
196         git config branch.master.merge refs/heads/master
197         git config core.worktree ../../
198         git config core.bare false
199         export GIT_WORK_TREE="$PWD"
200         git add "$@"
201         git commit -m "initial checkin"
202         git push --all
203         
204         trap - 0
205
206         mr -c "$MRCONFIG" config "$LOCAL_REPO" checkout="git_fake_bare_checkout '$REPO_URL' 'REPO_NAME' '../../'"
207     fi
208
209 }
210
211
212 command=$1 ; shift
213 case "$command" in 
214     init)
215         init $@
216         ;;
217     add)
218         add $@
219         ;;
220     new)
221         new $@
222         ;;
223     login)
224         login $@
225         ;;
226     ls)
227         list
228         ;;
229     list)
230         list
231         ;;
232
233     *)
234         usage
235         exit 1
236         ;;
237 esac