]> arthur.barton.de Git - Autobuilder.git/blob - bin/autobuilder
6efee13c9d40d79475e5e0ff4bb668517813ec7f
[Autobuilder.git] / bin / autobuilder
1 #!/bin/sh
2 #
3 # 2012-01-22, alex@barton.de
4 #
5
6 MYNAME="`basename "$0"`"
7
8 # options
9 FORCE=""
10 QUIETCMD=">/dev/null"
11
12 export LC_ALL=C
13
14 while [ $# -gt 0 ]; do
15         case "$1" in
16           "-f"|"--force")
17                 FORCE=1
18                 ;;
19           "-v"|"--verbose")
20                 QUIETCMD=
21                 ;;
22           *)
23                 echo "Usage: $MYNAME [--force|-f]" >&2
24                 exit 1
25         esac
26         shift
27 done
28
29 # defaults
30 AUTOBUILDER_D_DIR="/usr/local/etc/autobuilder/autobuild.d"
31 CACHE_DIR="/usr/local/var/cache/autobuilder"
32 MSG_PREFIX=" * "
33 ERR_PREFIX=" ! "
34
35 msg() {
36         echo "$MSG_PREFIX[`date +%H:%M:%S`] $MYNAME: $*"
37 }
38
39 err() {
40         echo "$ERR_PREFIX[`date +%H:%M:%S`] $MYNAME: $*" >&2
41 }
42
43 prepare_git() {
44         cd "$BASE_DIR"
45         if [ ! -d ".git" ]; then
46                 git clone "$REPOSITORY" .
47         else
48                 git pull --ff-only | grep "Already up-to-date." >/dev/null
49                 [ $? -eq 0 ] && return 9
50                 echo
51                 git shortlog ORIG_HEAD..
52         fi
53 }
54
55 build() {
56         msg "Building \"$NAME\" ..."
57         cd "$BASE_DIR"
58         date >"$BASE_DIR/.$MYNAME.dirty" || return 1
59
60         if [ -x "./autogen.sh" ]; then
61                 eval make $MAKE_ARGS_MAINTAINERCLEAN $QUIETCMD 2>&1
62                 eval ./autogen.sh $QUIETCMD
63         fi
64         if [ -x "./configure" ]; then
65                 eval ./configure $QUIETCMD
66         fi
67         eval make $MAKE_ARGS_BUILD $QUIETCMD
68         return $?
69 }
70
71 check() {
72         msg "Checking \"$NAME\" ..."
73         cd "$BASE_DIR"
74
75         eval make $MAKE_ARGS_CHECK $QUIETCMD
76 }
77
78 archive() {
79         msg "Archiving \"$NAME\" ..."
80         cd "$BASE_DIR"
81
82         eval make $MAKE_ARGS_DIST $QUIETCMD
83 }
84
85 publish() {
86         msg "Publishing \"$NAME\" ..."
87         cd "$BASE_DIR"
88
89         archive=`ls -1rt *.tar.gz | tail -n 1`
90         if [ -z "$archive" ]; then
91                 err "No distribution archive found!?"
92                 return 1
93         fi
94
95         mv "$archive" "$DEST_DIR"/ || return 1
96         chmod a+rX "$DEST_DIR/`basename "$archive"`"
97         rm -f "$archive" "$BASE_DIR/.$MYNAME.dirty"
98
99         msg "New \"$NAME\" archive: \"`basename "$archive"`\""
100
101 }
102
103 # read in configuration
104 [ -r /etc/autobuilder/autobuilder.conf ] \
105         && . /etc/autobuilder/autobuilder.conf
106 [ -r /usr/local/etc/autobuilder/autobuilder.conf ] \
107         && . /usr/local/etc/autobuilder/autobuilder.conf
108
109 # read in and process projects in autobuild.d directory
110 for file in "$AUTOBUILDER_D_DIR"/*; do
111         file_name="`basename "$file"`"
112
113         # defaults
114         NAME=""
115         REPOSITORY=""
116         DEST_DIR=""
117         MAKE_ARGS_MAINTAINERCLEAN="maintainer-clean"
118         MAKE_ARGS_BUILD=""
119         MAKE_ARGS_CHECK="check"
120         MAKE_ARGS_DIST="dist"
121
122         if [ ! -r "$file" ]; then
123                 err "Can't read \"$file\"! Skipping."
124                 continue
125         fi
126
127         . "$file"
128
129         if [ -z "$NAME" ]; then
130                 err "$file_name: NAME no set! Skipping."
131                 continue
132         fi
133
134         if [ -z "$DEST_DIR" ]; then
135                 err "$file_name: DEST_DIR no set! Skipping."
136                 continue
137         fi
138
139         case "$TYPE" in
140           "git")
141                 ;;
142           *)
143                 err "$file_name: TYPE not set or unknown: \"$TYPE\"! Skipping."
144                 continue
145         esac
146
147         BASE_DIR="${CACHE_DIR}/${file_name}"
148         if [ ! -d "$BASE_DIR" ]; then
149                 msg "Creating base directory \"$BASE_DIR\" ..."
150                 mkdir -p "$BASE_DIR"
151                 if [ $? -ne 0 ]; then
152                         err "Failed to create directory \"$BASE_DIR\!"
153                         continue
154                 fi
155         fi
156
157         case "$TYPE" in
158           "git")
159                 prepare_git
160                 [ $? -eq 9 \
161                   -a -z "$FORCE" \
162                   -a ! -e "$BASE_DIR/.$MYNAME.dirty" ] \
163                         && continue
164                 ;;
165         esac
166
167         build
168         if [ $? -ne 0 ]; then
169                 err "Building of \"$NAME\" FAILED!"
170                 continue
171         fi
172
173         if [ -n "$MAKE_ARGS_CHECK" ]; then
174                 check
175                 if [ $? -ne 0 ]; then
176                         err "Checking of \"$NAME\" FAILED!"
177                         continue
178                 fi
179         fi
180
181         archive
182         if [ $? -ne 0 ]; then
183                 err "Archiving of \"$NAME\" FAILED!"
184                 continue
185         fi
186
187         publish
188         if [ $? -ne 0 ]; then
189                 err "Can't publish \"$NAME\"!"
190                 continue
191         fi
192
193 done
194
195 # -eof-