3a866b129d9aab89acd8229054b12d76bd4af123
[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
45
46 init() {
47
48     if [ $# -ne 0 ]; then 
49         usage
50     fi
51     
52     if [ -e $MRCONFIG ]; then
53         echo $MRCONFIG already exists
54         exit 1
55     fi
56
57     mkdir $LOCAL_REPOS
58     cat <<END > $MRCONFIG
59 [DEFAULT]
60 include = cat /usr/share/mr/git-fake-bare
61 END
62 }
63
64
65 add() {
66     if [ $# -ne 1 ]; then 
67         usage
68     fi
69     REPO_NAME=$1.git ; shift
70     LOCAL_REPO=$LOCAL_REPOS/$REPO_NAME
71     REPO_URL=ssh://$GIT_HOST/$REMOTE_REPOS/$REPO_NAME
72
73     if [ -e "$LOCAL_REPO" ]; then
74         echo $LOCAL_REPO already exists
75         exit 1
76     else
77         trap "rm -rf $LOCAL_REPO" 0
78         mkdir "$LOCAL_REPO"
79         export GIT_DIR="$LOCAL_REPO"
80         git init --bare
81         git remote add origin $REPO_URL
82         git config branch.master.remote origin
83         git config branch.master.merge refs/heads/master
84         git config core.worktree ../../
85         git config core.bare false
86         GIT_WORK_TREE="$PWD" git pull
87         trap - 0
88         cat <<END >> $MRCONFIG
89
90 [$LOCAL_REPO]
91 checkout = git_fake_bare_checkout '$REPO_URL' '$REPO_NAME' '../../'
92 END
93     fi
94
95 }
96
97 new() {
98     if [ $# -lt 2 ]; then 
99         usage
100     fi
101     REPO_NAME=$1.git ; shift
102     LOCAL_REPO="$LOCAL_REPOS/$REPO_NAME"
103     REPO_URL="ssh://$GIT_HOST/$REMOTE_REPOS/$REPO_NAME"
104
105     if [ ! -e "$1" ]; then
106         echo $1 not found
107         exit 1
108     fi
109
110     if [ -e "$LOCAL_REPO" ]; then
111         echo $LOCAL_REPO already exists
112         exit 1
113     else
114         trap "rm -rf $LOCAL_REPO" 0
115         mkdir -p "$LOCAL_REPO"
116
117         ssh $GIT_HOST "
118                GIT_DIR=$REMOTE_REPOS/$REPO_NAME git --bare init
119         " </dev/null
120
121         export GIT_DIR="$LOCAL_REPO"
122         git init --bare
123         git remote add origin $REPO_URL
124         git config branch.master.remote origin
125         git config branch.master.merge refs/heads/master
126         git config core.worktree ../../
127         git config core.bare false
128 #       for file in  ; do 
129         export GIT_WORK_TREE="$PWD"
130             git add "$@"
131 #       done
132         git commit -m "initial checkin"
133         git push --all
134         
135         trap - 0
136         cat <<END >> $MRCONFIG
137
138 [$LOCAL_REPO]
139 checkout = git_fake_bare_checkout '$REPO_URL' '$REPO_NAME' '../../'
140 END
141     fi
142
143 }
144
145 command=$1 ; shift
146 case "$command" in 
147     init)
148         init $@
149         ;;
150     add)
151         add $@
152         ;;
153     new)
154         new $@
155         ;;
156 esac