reading settings from .movein
[gregoa/movein.git] / movein
1 #!/bin/sh
2 #
3 # Copyright © 2008 Mike O'Connor <stew@vireo.org>
4
5 set -e
6
7 usage() {
8     bn=$(basename $0)
9     cat <<EOF
10 $0: manage home directory using mr
11
12 NAME
13   $bn - a command to manage detached git repositories using mr
14
15 SYNOPSIS
16   $bn command [options]
17
18   $bn init
19   $bn add repository_name
20   $bn new repository_name file1 [file2 file3...]
21
22 COMMANDS
23   init 
24       create ~/.mrconfig
25
26   add repository_name
27       checkout the repository from the remote host and add it to
28       mr's configuration
29
30   new repository_name file1 [file2 file3...]  
31       create a new repository on the remote host, and checkin the
32       listed files to the new repository.   Add the new repository
33       to mr's configuration
34 EOF
35
36     exit 1
37 }
38
39
40 GIT_HOST=flounder.vireo.org
41 REMOTE_REPOS=~/git
42 LOCAL_REPOS=~/.fgits
43 MRCONFIG=~/.mrconfig
44 MOVEIN=~/.movein
45
46 source $MOVEIN
47
48 init() {
49
50     if [ $# -ne 0 ]; then 
51         usage
52     fi
53     
54     if [ -e $MRCONFIG ]; then
55         echo $MRCONFIG already exists
56         exit 1
57     fi
58     
59     if [ -e $MOVEIN ]; then
60         echo $MOVEIN already exists
61         exit 1
62     fi
63
64     echo -n "git server hostname? [git.vireo.org] " 
65     read GIT_HOST
66     if [ -z "$GIT_HOST" ]; then 
67         GIT_HOST=git.vireo.org
68     fi
69
70     echo -n "path to remote repositories? [~/git] " 
71     read REMOTE_REPOS
72     if [ -z "$REMOTE_REPOS" ]; then 
73         REMOTE_REPOS=~/git
74     fi
75
76     echo -n "Local repository directory? [~/.fgit] " 
77     read LOCAL_REPOS
78     if [ -z "$LOCAL_REPOS" ]; then 
79         LOCAL_REPOS=~/.fgits
80     fi
81
82     echo -n "Location of .mrconfig file? [~/.mrconfig] " 
83     read MRCONFIG
84     if [ -z "$MRCONFIG" ]; then 
85         MRCONFIG=~/.mrconfig
86     fi
87
88     cat <<EOF > .movein
89 GIT_HOST=$GIT_HOST
90 REMOTE_REPOS=$REMOTE_REPOS
91 LOCAL_REPOS=$LOCAL_REPOS
92 MRCONFIG=$MRCONFIG
93 EOF
94
95     mkdir $LOCAL_REPOS
96     cat <<END > $MRCONFIG
97 [DEFAULT]
98 include = cat /usr/share/mr/git-fake-bare
99 END
100
101     
102 }
103
104
105 add() {
106     if [ $# -ne 1 ]; then 
107         usage
108     fi
109     REPO_NAME=$1.git ; shift
110     LOCAL_REPO=$LOCAL_REPOS/$REPO_NAME
111     REPO_URL=ssh://$GIT_HOST/$REMOTE_REPOS/$REPO_NAME
112
113     if [ -e "$LOCAL_REPO" ]; then
114         echo $LOCAL_REPO already exists
115         exit 1
116     else
117         trap "rm -rf $LOCAL_REPO" 0
118         mkdir "$LOCAL_REPO"
119         export GIT_DIR="$LOCAL_REPO"
120         git init --bare
121         git remote add origin $REPO_URL
122         git config branch.master.remote origin
123         git config branch.master.merge refs/heads/master
124         git config core.worktree ../../
125         git config core.bare false
126         GIT_WORK_TREE="$PWD" git pull
127         trap - 0
128         cat <<END >> $MRCONFIG
129
130 [$LOCAL_REPO]
131 checkout = git_fake_bare_checkout '$REPO_URL' '$REPO_NAME' '../../'
132 END
133     fi
134
135 }
136
137 new() {
138     if [ $# -lt 2 ]; then 
139         usage
140     fi
141     REPO_NAME=$1.git ; shift
142     LOCAL_REPO="$LOCAL_REPOS/$REPO_NAME"
143     REPO_URL="ssh://$GIT_HOST/$REMOTE_REPOS/$REPO_NAME"
144
145     if [ ! -e "$1" ]; then
146         echo $1 not found
147         exit 1
148     fi
149
150     if [ -e "$LOCAL_REPO" ]; then
151         echo $LOCAL_REPO already exists
152         exit 1
153     else
154         trap "rm -rf $LOCAL_REPO" 0
155         mkdir -p "$LOCAL_REPO"
156
157         ssh $GIT_HOST "
158                GIT_DIR=$REMOTE_REPOS/$REPO_NAME git --bare init
159         " </dev/null
160
161         export GIT_DIR="$LOCAL_REPO"
162         git init --bare
163         git remote add origin $REPO_URL
164         git config branch.master.remote origin
165         git config branch.master.merge refs/heads/master
166         git config core.worktree ../../
167         git config core.bare false
168 #       for file in  ; do 
169         export GIT_WORK_TREE="$PWD"
170             git add "$@"
171 #       done
172         git commit -m "initial checkin"
173         git push --all
174         
175         trap - 0
176         cat <<END >> $MRCONFIG
177
178 [$LOCAL_REPO]
179 checkout = git_fake_bare_checkout '$REPO_URL' '$REPO_NAME' '../../'
180 END
181     fi
182
183 }
184
185 command=$1 ; shift
186 case "$command" in 
187     init)
188         init $@
189         ;;
190     add)
191         add $@
192         ;;
193     new)
194         new $@
195         ;;
196 esac