slitaz-dev-tools annotate tazdev/tazdev @ rev 275

Tiny edits
author Paul Issott <paul@slitaz.org>
date Tue Feb 28 22:36:16 2017 +0000 (2017-02-28)
parents 66c023d0f82f
children 1705daa4b44a
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