rev |
line source |
pankso@1
|
1 #!/bin/sh
|
pankso@70
|
2 #
|
al@274
|
3 # Tazdev - SliTaz developers and build host tool. System-wide config file
|
al@274
|
4 # is located at /etc/slitaz/tazdev.conf. Please, keep the code clear and
|
al@274
|
5 # well commented. Also keep in mind: configuration variables are $UPPERCASE
|
al@274
|
6 # and variables initialized by tazdev itself are $lowercase.
|
pankso@1
|
7 #
|
al@274
|
8 # (c) 2014-2017 SliTaz GNU/Linux - GNU GPL v3
|
pankso@1
|
9 #
|
pankso@70
|
10 # AUTHORS
|
pankso@70
|
11 # Christophe Lincoln <pankso@slitaz.org>
|
pankso@70
|
12 # Pascal Bellard <bellard@slitaz.org>
|
pankso@208
|
13 # Eric Joseph-Alexandre <erjo@slitaz.org>
|
pankso@1
|
14 #
|
erjo@190
|
15
|
pankso@273
|
16 VERSION=2.1
|
erjo@190
|
17
|
pankso@174
|
18 . /lib/libtaz.sh
|
pankso@1
|
19
|
pankso@77
|
20 [ -f /etc/slitaz/tazdev.conf ] && . /etc/slitaz/tazdev.conf
|
pankso@273
|
21 [ -f ~/.config/slitaz/tazdev.conf ] && . ~/.config/slitaz/tazdev.conf
|
pankso@81
|
22 [ -f tazdev.conf ] && . ./tazdev.conf
|
pankso@77
|
23
|
al@274
|
24 [ -n "$SLITAZ_HOME" ] || die "No config file found"
|
al@274
|
25
|
al@274
|
26
|
al@274
|
27 # Remove all --parameters from cmdline
|
al@274
|
28 IFS=$'\n'
|
al@274
|
29 set -- $(echo "$*" | sed '/^--/d')
|
al@274
|
30 unset IFS
|
al@274
|
31
|
pankso@1
|
32
|
pankso@180
|
33 usage() {
|
al@274
|
34 cat <<EOT
|
pankso@183
|
35
|
al@274
|
36 $(boldify "Usage:") $(basename $0) <command> [<options>] [--options]
|
pankso@183
|
37
|
erjo@190
|
38 SliTaz developers and build host tool v$VERSION
|
pankso@183
|
39
|
pankso@174
|
40 $(boldify "Commands:")
|
al@274
|
41 usage Print this short usage and command list
|
al@274
|
42 help <tool> Give help on a SliTaz tool or library
|
al@274
|
43 -s stats Display statistics for your projects
|
al@274
|
44 -c chroot [<ver>|<rootfs>] Mount virtual FS and chroot into the build env
|
al@274
|
45 -gc gen-chroot [<ver>] Generate a chroot using packages from config
|
al@274
|
46 file
|
al@274
|
47 -uc umchroot [<rootfs>] Unmount chroot specified on cmdline
|
al@274
|
48 -cc clean-chroot [<ver>] Clean a chroot environment (skip root/ and
|
al@274
|
49 home/)
|
al@274
|
50 -p push [<user> [<ver>]] Upload new packages to the main mirror
|
al@274
|
51 -dp dry-push [<user> [<ver>]] Show what will be uploaded to the mirror
|
al@274
|
52 pull [<user> [<ver>]] Download new packages from the main mirror
|
al@274
|
53 dry-pull [<user> [<ver>]] Show what will be downloaded from the mirror
|
al@274
|
54 -ur up-repos Update all your SliTaz projects repos in one
|
al@274
|
55 command
|
al@274
|
56 -rp relpkg <pkg> [<version>] Archive and upload new package/project version
|
al@274
|
57 -sc setup-cgi Setup your CGI environment
|
pankso@183
|
58
|
pankso@183
|
59 $(boldify "Options:")
|
al@274
|
60 --rootfs= Path to the chroot to generate or clean
|
al@274
|
61 --arch= Specify the architecture type for cross-chroot, push/pull
|
paul@275
|
62 --clean or --forced Clean chroot before generating a new one
|
pankso@183
|
63
|
al@274
|
64 $(boldify "Examples:")
|
pankso@183
|
65 $(basename $0) gen-chroot undigest --clean
|
pankso@183
|
66 $(basename $0) -c --arch=arm
|
pankso@183
|
67
|
pankso@183
|
68 EOT
|
pankso@1
|
69 }
|
pankso@1
|
70
|
pankso@180
|
71 get_version() {
|
pankso@180
|
72 # Stable, undigest or custom.
|
al@274
|
73 version=${2:-cooking}
|
al@274
|
74 slitaz="$SLITAZ_HOME/$version"
|
al@274
|
75 if [ -n "$arch" ]; then
|
al@274
|
76 rootfs="$slitaz/$arch/chroot"
|
pankso@1
|
77 else
|
al@274
|
78 rootfs="$slitaz/chroot"
|
pankso@180
|
79 fi
|
pankso@1
|
80 }
|
pankso@1
|
81
|
pankso@180
|
82 check_mirror() {
|
al@274
|
83 [ -n "$2" ] && user="$2"
|
al@274
|
84 local repo="$3"
|
al@274
|
85 case $repo in
|
al@274
|
86 stable|backports|undigest)
|
al@274
|
87 remote="$MIRROR_PKGS/$repo/"
|
al@274
|
88 local="$SLITAZ_HOME/$repo/packages/"
|
al@274
|
89 ;;
|
al@274
|
90 rpi)
|
al@274
|
91 remote="$MIRROR_PKGS/cross/rpi/"
|
al@274
|
92 local="$SLITAZ_HOME/cooking/arm/packages/"
|
al@274
|
93 ;;
|
al@274
|
94 *)
|
al@274
|
95 remote="$MIRROR_PKGS/cooking/"
|
al@274
|
96 local="$SLITAZ_HOME/cooking/packages/"
|
al@274
|
97 ;;
|
al@274
|
98 esac
|
al@274
|
99
|
al@274
|
100 if [ -n "$arch" ]; then
|
al@274
|
101 remote="$remote$arch/"
|
al@274
|
102 local="$local$arch/"
|
pankso@189
|
103 fi
|
pankso@1
|
104 }
|
pankso@1
|
105
|
pascal@142
|
106 # Bind a directory into the chroot
|
pascal@142
|
107 bind_chroot_dir()
|
pascal@142
|
108 {
|
pascal@142
|
109 mkdir -p $1 $2
|
pascal@142
|
110 mount -o bind $1 $2
|
pascal@142
|
111 }
|
pascal@142
|
112
|
al@274
|
113 # Mount virtual Kernel file systems and chroot, but check that nobody
|
pankso@1
|
114 # else has done mounts
|
pankso@1
|
115 mount_chroot()
|
pankso@1
|
116 {
|
al@274
|
117 if [ ! -d "$rootfs/proc/1" ]; then
|
al@274
|
118 newline
|
al@274
|
119 action 'Mounting virtual filesystems...'
|
al@274
|
120 mount -t proc proc $rootfs/proc
|
al@274
|
121 mount -t sysfs sysfs $rootfs/sys
|
pankso@81
|
122 mount -t devpts devpts $rootfs/dev/pts
|
al@274
|
123 mount -t tmpfs shm $rootfs/dev/shm
|
pankso@1
|
124 status
|
pankso@1
|
125 fi
|
al@274
|
126 # Mount source, so they can be shared between cooking/stable/undigest.
|
al@274
|
127 # But do it only if it's a SliTaz development chroot.
|
al@274
|
128 fs="$rootfs/home/slitaz"
|
pankso@81
|
129 if [ -d "$slitaz" ]; then
|
pankso@174
|
130 bind_chroot_dir $SLITAZ_HOME/src $fs/src
|
al@274
|
131 # Now mount package dir, so they are in /home/slitaz/$version
|
al@274
|
132 # We may not mount cache wok or others: it has no point and if
|
paul@275
|
133 # one wants to use a shared wok, one can bind it manually.
|
al@274
|
134 [ -n "$arch" ] && slitaz="$slitaz/$arch"
|
al@274
|
135 mkdir -p "$fs/packages" "$slitaz/packages"
|
al@274
|
136 bind_chroot_dir "$slitaz/packages" "$fs/packages"
|
pankso@80
|
137 fi
|
pankso@1
|
138 }
|
pankso@1
|
139
|
pankso@180
|
140 # Unmount virtual Kernel file systems.
|
pankso@180
|
141 umount_chroot() {
|
al@274
|
142 [ -n "$1" ] && rootfs="$1"
|
al@274
|
143 fs="$rootfs/home/slitaz"
|
al@274
|
144 newline
|
al@274
|
145 action 'Unmounting virtual filesystems...'
|
pankso@81
|
146 umount $rootfs/dev/shm
|
pankso@81
|
147 umount $rootfs/dev/pts
|
pankso@81
|
148 umount $rootfs/sys
|
pankso@81
|
149 umount $rootfs/proc
|
pankso@180
|
150 if mount | fgrep -q $fs/src; then
|
pankso@180
|
151 umount $fs/src
|
pankso@180
|
152 umount $fs/packages
|
pankso@180
|
153 fi
|
al@274
|
154 status
|
al@274
|
155 newline
|
pankso@1
|
156 }
|
pankso@1
|
157
|
pankso@1
|
158 # Get the last cooking base rootfs, extract and configure.
|
pankso@180
|
159 gen_chroot() {
|
al@274
|
160 title "Generating new chroot in $rootfs"
|
al@274
|
161
|
slaxemulator@85
|
162 mkdir -p $rootfs
|
al@274
|
163 # We may gen cooking chroot from a stable version or vice versa
|
pankso@183
|
164 case "$version" in
|
al@274
|
165 stable*|4.0*|backports)
|
al@274
|
166 url="http://$MIRROR/packages/stable/" ;;
|
al@274
|
167 *)
|
al@274
|
168 url="http://$MIRROR/packages/cooking/" ;;
|
pankso@183
|
169 esac
|
al@274
|
170
|
pankso@183
|
171 # --mirror=
|
al@274
|
172 [ -n "$mirror" ] && url="$mirror"
|
al@274
|
173 mpath="/var/lib/tazpkg/mirror"
|
pascal@205
|
174 mkdir -p $(dirname $rootfs$mpath)
|
pascal@205
|
175 echo "$url" > $rootfs$mpath
|
al@274
|
176
|
al@274
|
177 action "Mirror URL: ${url#http://}"
|
al@274
|
178 tazpkg recharge --root="$rootfs" --quiet >/dev/null
|
pankso@183
|
179 status
|
al@274
|
180
|
al@274
|
181 for pkg in $CHROOT_PKGS; do
|
al@274
|
182 action "Installing: $pkg $vers"
|
al@274
|
183 tazpkg -gi $pkg --root="$rootfs" --quiet
|
pankso@183
|
184 status
|
pankso@180
|
185 done
|
al@274
|
186
|
al@274
|
187 action "Creating resolv.conf..."
|
pankso@81
|
188 cat /etc/resolv.conf > $rootfs/etc/resolv.conf
|
pankso@1
|
189 status
|
al@274
|
190
|
al@274
|
191 action "Creating TZ..."
|
pascal@198
|
192 cat /etc/TZ > $rootfs/etc/TZ
|
pascal@198
|
193 status
|
al@274
|
194
|
pankso@183
|
195 case "$version" in
|
pankso@183
|
196 cooking) version="" ;;
|
pankso@183
|
197 esac
|
pankso@183
|
198 [ "$arch" ] && version="$version --arch=$arch"
|
al@274
|
199 footer "Ready to chroot with: $(colorize 34 "tazdev -c $version")"
|
pankso@1
|
200 }
|
pankso@1
|
201
|
pankso@208
|
202 #
|
pankso@208
|
203 # Commands
|
pankso@208
|
204 #
|
pankso@1
|
205
|
pankso@1
|
206 case "$1" in
|
pankso@183
|
207 stats|-s)
|
al@274
|
208 title "Statistics for $PROJECTS"
|
al@274
|
209 printf "%-23s %-13s %-15s %s\n" 'Project' 'Revision' 'Version' 'Files'
|
al@274
|
210 separator '-'
|
al@274
|
211 cd $PROJECTS
|
al@274
|
212 for proj in *; do
|
pankso@1
|
213 rev=""
|
al@274
|
214 if [ -d "$PROJECTS/$proj/.hg" ]; then
|
al@274
|
215 cd $PROJECTS/$proj
|
al@274
|
216 rev=$(hg head --template '{rev};' | sed 's|;$||') # we have multiple heads in some projects
|
al@274
|
217 vers=$(hg tags | grep -v tip | head -n1 | cut -d" " -f1) # some projects don't have any version tags
|
pankso@273
|
218 files=$(find . -type f | wc -l)
|
al@274
|
219 printf "%-23s %-13s %-15s %s\n" "$proj" "$rev" "${vers:--}" "$files"
|
pankso@1
|
220 fi
|
pankso@1
|
221 done
|
al@274
|
222 footer
|
al@274
|
223 ;;
|
al@274
|
224
|
pankso@180
|
225 chroot|-c)
|
pankso@82
|
226 # Chroot into a build env. Default to cooking configured in tazdev.conf
|
al@274
|
227 check_root $1
|
pankso@1
|
228 get_version $@
|
al@274
|
229 [ -d "$2" ] && rootfs="$2"
|
pankso@1
|
230 mount_chroot
|
pankso@82
|
231 echo -e "Chrooting to: $rootfs\n"
|
pankso@81
|
232 chroot $rootfs /bin/sh --login
|
al@274
|
233 umount_chroot
|
al@274
|
234 ;;
|
al@274
|
235
|
pankso@273
|
236 umchroot|-uc)
|
al@274
|
237 check_root $1
|
pankso@80
|
238 get_version $@
|
al@274
|
239 [ -d "$2" ] && rootfs="$2"
|
al@274
|
240 umount_chroot $rootfs
|
al@274
|
241 ;;
|
al@274
|
242
|
pankso@77
|
243 gen-chroot|-gc)
|
al@274
|
244 check_root $1
|
pankso@180
|
245 # We can use: --rootfs=/path/to/chroot
|
al@274
|
246 [ -n "$rootfs" ] || get_version $@
|
al@274
|
247
|
al@274
|
248 # If --clean or --forced option given
|
al@274
|
249 [ -n "$clean$forced" ] && $0 -cc --rootfs=$rootfs
|
al@274
|
250
|
al@274
|
251 # Don't break another env.
|
al@274
|
252 [ -d "$rootfs/bin" ] &&
|
al@274
|
253 die "A chroot environment already exists in $rootfs.\nUse --clean or --forced to clean this chroot."
|
al@274
|
254
|
al@274
|
255 gen_chroot
|
al@274
|
256 ;;
|
al@274
|
257
|
pankso@183
|
258 clean-chroot|-cc)
|
al@274
|
259 check_root $1
|
pankso@183
|
260 # We can use: --rootfs=/path/to/chroot
|
al@274
|
261 [ -n "$rootfs" ] || get_version $@
|
al@274
|
262
|
al@274
|
263 [ ! -d "$rootfs" ] && die "Chroot '$rootfs' doesn't exist"
|
al@274
|
264
|
al@274
|
265 [ -d "$rootfs/proc/1" ] && die "WARNING: $rootfs/proc mounted!"
|
al@274
|
266
|
pankso@81
|
267 cd $rootfs || exit 1
|
al@274
|
268
|
al@274
|
269 title "Cleaning chroot $rootfs"
|
pankso@183
|
270 # Keep root/ and /home they may have a build wok, custom scripts, etc.
|
al@274
|
271 for i in boot bin dev etc lib media mnt proc sbin sys tmp usr var run; do
|
pankso@181
|
272 if [ -d "$i" ]; then
|
al@274
|
273 action "Removing: $i ($(du -sh $i | awk '{ print $1 }'))..."
|
al@274
|
274 rm -rf $i
|
al@274
|
275 status
|
pankso@181
|
276 fi
|
pankso@1
|
277 done
|
pankso@181
|
278 rm -f init
|
al@274
|
279 footer
|
al@274
|
280 ;;
|
al@274
|
281
|
pankso@70
|
282 push|-p)
|
pankso@1
|
283 check_mirror $@
|
pankso@113
|
284 rsync -r -t -O -l -v -z --delete \
|
al@274
|
285 $local -e ssh $user@$MIRROR:$remote
|
al@274
|
286 ;;
|
al@274
|
287
|
pankso@70
|
288 dry-push|-dp)
|
pankso@1
|
289 check_mirror $@
|
pankso@113
|
290 rsync -r -t -O -l -v -z --delete --dry-run \
|
al@274
|
291 $local -e ssh $user@$MIRROR:$remote
|
al@274
|
292 ;;
|
al@274
|
293
|
pankso@1
|
294 pull)
|
pankso@1
|
295 check_mirror $@
|
pankso@1
|
296 rsync -r -t -l -v -z --delete \
|
al@274
|
297 -e ssh $user@$MIRROR:$remote $local
|
al@274
|
298 ;;
|
al@274
|
299
|
pankso@1
|
300 dry-pull)
|
pankso@1
|
301 check_mirror $@
|
pankso@1
|
302 rsync -r -t -l -v -z --delete --dry-run \
|
al@274
|
303 -e ssh $user@$MIRROR:$remote $local
|
al@274
|
304 ;;
|
al@274
|
305
|
pankso@273
|
306 up-repos|-ur)
|
pankso@210
|
307 # Update all at once.
|
al@274
|
308 title "Update all SliTaz Hg repos"
|
al@274
|
309 for p in $(ls $PROJECTS); do
|
al@274
|
310 title "Project $p"
|
al@274
|
311 cd $PROJECTS/$p
|
pankso@210
|
312 hg pull -u
|
pankso@210
|
313 done
|
al@274
|
314 footer
|
al@274
|
315 ;;
|
al@274
|
316
|
pankso@70
|
317 relpkg|-rp)
|
pankso@82
|
318 # Release a slitaz sub-project and upload tarball to mirror
|
pankso@1
|
319 [ -z "$MIRROR_SOURCES" ] && MIRROR_SOURCES="/var/www/slitaz/mirror/sources"
|
al@274
|
320 [ -z "$2" ] && die "Usage: $0 relpkg package [version]"
|
al@274
|
321
|
pankso@81
|
322 pkg=$2
|
al@274
|
323 version="$3"
|
al@274
|
324
|
erjo@191
|
325 # We can get the last found version in .hgtags
|
al@274
|
326 [ -n "$version" ] ||
|
al@274
|
327 version=$(awk 'END{print $2}' $PROJECTS/$pkg/.hgtags)
|
erjo@191
|
328
|
al@274
|
329 newline
|
al@274
|
330 cd $PROJECTS/$pkg
|
pankso@177
|
331
|
pankso@1
|
332 # Sanity check
|
al@274
|
333 grep -q $version$ .hgtags ||
|
al@274
|
334 die "Missing Hg tag for version $version\nYou may want to: hg tag $version; hg push\n"
|
pankso@177
|
335
|
pankso@1
|
336 # Archive
|
al@274
|
337 action "Creating tarball and md5sum for $pkg-$version..."
|
erjo@191
|
338 hg archive -t tgz $SOURCE/$pkg-$version.tar.gz
|
erjo@191
|
339 ( cd $SOURCE; md5sum $pkg-$version.tar.gz > $pkg-$version.md5 )
|
al@274
|
340 status
|
pankso@177
|
341
|
pankso@1
|
342 # Upload
|
al@274
|
343 confirm 'Do you wish to upload tarball to the mirror?' 'n' &&
|
al@274
|
344 {
|
al@274
|
345 cd $SOURCE
|
al@274
|
346 echo "Uploading to $MIRROR/sources/${pkg#slitaz-}"
|
al@274
|
347 scp "$pkg-$version.tar.gz" "$pkg-$version.md5" \
|
erjo@191
|
348 $MIRROR:$MIRROR_SOURCES/${pkg#slitaz-}
|
al@274
|
349 }
|
pankso@177
|
350
|
pankso@147
|
351 # Update pkg in wok
|
al@274
|
352 confirm "Do you wish to update $pkg in wok?" 'n' &&
|
al@274
|
353 {
|
al@274
|
354 action "Updating $pkg: $version"
|
pankso@147
|
355 cd $PROJECTS/wok
|
pankso@147
|
356 sed -i s"/VERSION=.*/VERSION=\"$version\"/" $pkg*/receipt
|
pankso@174
|
357 status
|
al@274
|
358 }
|
al@274
|
359 ;;
|
al@274
|
360
|
pankso@273
|
361 setup-cgi|-sc)
|
pankso@273
|
362 . /etc/slitaz/slitaz.conf
|
al@274
|
363 echo "$(boldify 'Public:') $PUBLIC"
|
al@274
|
364 mkdir -p $PUBLIC/cgi-bin
|
al@274
|
365 cd $PUBLIC/cgi-bin
|
pankso@273
|
366 for proj in tazbug tinycm mediabox; do
|
al@274
|
367 [ -d "$proj" ] || hg clone http://hg.slitaz.org/$proj
|
pankso@273
|
368 done
|
al@274
|
369 [ -d "$INSTALLED/lighttpd" ] || sudo tazpkg -gi lighttpd
|
al@274
|
370
|
pankso@273
|
371 echo
|
paul@275
|
372 echo "TODO: setup SCN (tinycm install + plugins from slitaz-forge)"
|
pankso@273
|
373 echo
|
al@274
|
374 echo "$(boldify 'URL :') http://localhost/~$USER/cgi-bin/"
|
al@274
|
375 ;;
|
al@274
|
376
|
pankso@174
|
377 help)
|
al@274
|
378 doc='/usr/share/doc/slitaz/'
|
al@274
|
379 topics="Available help topics: $(cd $doc; ls *.txt | sed 's|.txt$||' | tr '\n' ' ')"
|
al@274
|
380 [ -n "$2" ] ||
|
al@274
|
381 die "Missing tool/library name\nExample: tazdev help httphelper\n\n$topics"
|
al@274
|
382
|
al@274
|
383 if [ -f "$doc$2.txt" ]; then
|
al@274
|
384 {
|
al@274
|
385 output='raw' title "Help for $2"
|
al@274
|
386 cat $doc$2.txt
|
al@274
|
387 footer
|
al@274
|
388 } | less -M
|
al@274
|
389 else
|
al@274
|
390 echo "No help found for '$2'"
|
al@274
|
391 longline "$topics"
|
pankso@273
|
392 fi
|
al@274
|
393 ;;
|
al@274
|
394
|
al@274
|
395 usage|*)
|
al@274
|
396 usage
|
al@274
|
397 ;;
|
al@274
|
398
|
pankso@1
|
399 esac
|
pankso@1
|
400
|
pankso@1
|
401 exit 0
|