Removed a debugging feature.
[dcp.git] / dcp-init
1 #!/bin/bash
2
3 set -e
4
5 usage() {
6     echo "usage: dcp-init [-C key=val] [-d REPODIR] PACKAGE [PATCH...]"
7     echo "       PATCH ::= [-p LEVEL] [-bB BRANCH] FILE"
8     echo "       -b creates a new branch at the current patch"
9     echo "       -B creates a new branch at the upstream sources"
10 }
11
12 rungit() {
13     (
14         cd "$td"
15         git "$@"
16     ) || false
17 }
18
19 getaptsrc() {
20     mkdir "$td/apt-tmp"
21     (cd "$td/apt-tmp"; apt-get source "$1") || false
22     
23     sdir=
24     for f in "$td/apt-tmp"/*; do
25         if [ -d "$f" ]; then
26             if [ -z "$sdir" ]; then
27                 sdir="$f"
28             else
29                 echo "dcp-init: got more than one directory from apt-get; cannot continue" >&2
30                 exit 1
31             fi
32         fi
33     done
34     if [ -z "$sdir" ]; then
35         echo "dcp-init: could not find any source directory" >&2
36         exit 1
37     fi
38     mv "$sdir" "$td/src"
39     rm -rf "$td/apt-tmp"
40
41     rungit add src
42 }
43
44 initrepo() {
45     rungit init -q
46     mkdir "$td/control"
47     touch "$td/control/conf"
48     rungit add control
49     rungit commit -q -m "Initial repo"
50     rungit tag empty
51 }
52
53 initbase() {
54     mkdir "$td/control/build.d"
55     mkdir "$td/control/update.d"
56     cat >"$td/control/functions" <<EOF
57 readconf() {
58     while read key val; do
59         export "CONF_\$key"="\$val"
60     done <control/conf
61 }
62
63 rungit() {
64     (cd repo; git "\$@") || false
65 }
66 EOF
67     cat >"$td/control/build" <<EOF
68 #!/bin/sh
69
70 set -e
71
72 . control/functions
73 readconf
74
75 for file in control/build.d/*; do
76     if [ -x "\$file" ]; then "\$file"; fi
77 done
78 EOF
79     chmod 755 "$td/control/build"
80     cat >"$td/control/update" <<EOF
81 #!/bin/sh
82
83 set -e
84
85 . control/functions
86 readconf
87
88 for branch in repo/.git/refs/heads/*; do
89     branch="\${branch##*/}"
90     if [ -x "control/update.d/\$branch" ]; then
91         rungit checkout "\$branch"
92         lastrev="\$(rungit rev-parse HEAD)"
93         "control/update.d/\$branch"
94         newrev="\$(rungit rev-parse HEAD)"
95         rungit checkout master
96         if [ "\$newrev" != "\$lastrev" ]; then
97             rungit merge -n "\$branch"
98         fi
99     fi
100 done
101 EOF
102     chmod 755 "$td/control/update"
103     rungit add control
104 }
105
106 initapt() {
107     cat >"$td/control/build.d/99dpkg" <<EOF
108 #!/bin/bash
109
110 set -e
111
112 cmd=(dpkg-buildpackage -b)
113 if [ -n "\$CONF_MAINTAINER" ]; then
114     cmd=("\${cmd[@]}" "-m\$CONF_MAINTAINER")
115 fi
116 if [ -n "\$CONF_GPGKEY" ]; then
117     cmd=("\${cmd[@]}" "-k\$CONF_GPGKEY")
118 fi
119 (cd repo/src; "\${cmd[@]}") || false
120 mv repo/*.deb output/
121 EOF
122     chmod 755 "$td/control/build.d/99dpkg"
123     rungit add control/build.d/99dpkg
124     cat >"$td/control/update.d/upstream" <<EOF
125 #!/bin/sh
126
127 set -e
128
129 cd repo
130 dcp-update-apt "\$CONF_APTPKG"
131
132 EOF
133     chmod 755 "$td/control/update.d/upstream"
134     rungit add control/update.d/upstream
135     echo "APTPKG $pkg" >>"$td/control/conf"
136     rungit add control/conf
137 }
138
139 defdir=/srv/dcp
140 repodir=
141 confopts=()
142
143 while [ "${1:0:1}" = - ]; do
144     opt="${1:1}"
145     shift
146     if [ "$opt" = d ]; then
147         repodir="$1"
148         shift
149     elif [ "$opt" = h ]; then
150         usage
151         exit 0
152     elif [ "$opt" = C ]; then
153         confopts=("${confopts[@]}" "$1")
154         shift
155     else
156         echo "dcp-init: unknown option '$opt'" >&2
157         exit 1
158     fi
159 done
160
161 if [ $# -lt 1 ]; then
162     usage >&2
163     exit 1
164 fi
165 pkg="$1"
166 shift
167 if [ -z "$repodir" ]; then repodir="$pkg"; fi
168 if [[ "$repodir" != */* ]]; then
169     repodir="$defdir/${repodir}.git"
170 fi
171
172 td="$(mktemp -d "/tmp/dcp-XXXXXX")"
173 initrepo
174
175 initbase
176 rungit commit -q -m "Base control files"
177
178 if [ "${#confopts[@]}" -gt 0 ]; then
179     for opt in "${confopts[@]}"; do
180         key="${opt%%=*}"
181         val="${opt#*=}"
182         echo "$key $val" >>"$td/control/conf"
183     done
184     rungit add control/conf
185     rungit commit -q -m "Custom configuration file"
186 fi
187
188 rungit checkout -q -b upstream empty
189 getaptsrc "$pkg"
190 rungit commit -q -m "Initial upstream import"
191 rungit checkout master
192 rungit merge -n upstream
193
194 initapt
195 rungit commit -q -m "APT control files"
196
197 initvals() {
198     level=0
199 }
200 initvals
201 while [ $# -gt 0 ]; do
202     arg="$1"
203     shift
204     if [ "${arg:0:1}" = - ]; then
205         if [ "$arg" = -p ]; then
206             level="$1"
207             shift
208         elif [ "$arg" = -b ]; then
209             rungit checkout -q -b "$1"
210             shift
211         elif [ "$arg" = -B ]; then
212             rungit checkout -q -b "$1" upstream
213         else
214             echo "dcp-init: unknown patch option '$arg'" >&2
215             exit 1
216         fi
217     else
218         (
219             if [[ "$arg" == *.gz ]]; then
220                 zcat "$arg"
221             else
222                 cat "$arg"
223             fi
224         ) | patch -d "$td/src" -p"$level"
225         rungit add src
226         rungit commit -q -m "Applied $(basename "$arg")"
227         initvals
228     fi
229 done
230
231 git clone -q --bare "$td" "$repodir"
232
233 rm -rf "$td"