retrieve the whole modules in one shot and cherry pick later on
[sface.git] / macos / build-dmg.sh
index 836e062..4991570 100755 (executable)
@@ -1,10 +1,8 @@
 #!/bin/sh
 
 # PURPOSE
-# package a combination of sfa+sface into a snow leopard dmg install disk
-# 
-# NOTES
-# we leverage the first similar packaging initially made by Baris Metin
+# package a combination of sfa+sface into a dmg install disk
+# supports leopard and snow leopard
 # 
 # REQUIREMENTS
 # sface-skel-snow-leopard<arch>.dmg is the skeleton that has Qt and all the other third-party software
 # the script expects the taglevels for both sfa and sface, 
 #   in order to retrieve the corresponding code and to label the resulting package properly
 #   alternatively, a build-dir and tags file can be used instead
+# Should have the folowing tools installed
+#   git: to retrieve code
+#   rpm: to retrieve the version numbers in specfiles
+
+# NOTES
+# we initially leveraged the first similar packaging initially made by Baris Metin
+# as of sface-0.1-9 we have bootstrapped our own skeleton images, 
+#   i.e. you can use vn as a skeleton for vn+1
+# about that, the way the background image gets (or not) found 
+#   on the final system is as follows 
+#   before compressing the image, you should open the image through the finder
+#   and tweak it, as described in http://el-tramo.be/guides/fancy-dmg
+#   that's the raison d'ĂȘtre for the -i option
+# basically: open two finder windows, one on the .backgrounf dir (use cmd-shift G)
+#   and one on the image itself; then using Finder->view->show view options
+#   drag the background image as appropriate
+# the important point being that the filename for the background must 
+#   exist - and so be the same - on the target system.
+# that's why the image 'volname' is constant across versions
 
 # the place to search for the  skeleton
 SKEL_REPO=http://mirror.onelab.eu/third-party
@@ -32,35 +49,18 @@ COMMAND=$(basename $0)
 function git_url () { echo $1 | cut -d @ -f 1 ; }
 function git_tag () { echo $1 | cut -d @ -f 2 ; }
 
-# go in $dest and retrieve $path part of codebase based on gitpath, e.g.
-# git_retrieve \
-#     git://git.onelab.eu/sface.git@sface-0.1-5 
-#     sface 
-#     /Volumes/sface-skel-sn/sface.app/Contents/Resources/
-# or, with the -f (-file) option:
-# git_retrieve -f \
-#     git://git.onelab.eu/sface.git@sface-0.1-5 
-#     macos/appIcon.icns 
-#     /Volumes/sface-skel-sn/sface.app/appIcon.icns 
+# go in $dest and retrieve module into provided path
+# git_retrieve git://git.onelab.eu/sface.git@sface-0.1-5 /tmp/sfa-module
 function git_retrieve () {
-    filemode=""
-    case "$1" in -f|--file) filemode=true; shift;; esac
-    gitpath=$1; shift
-    path=$1; shift
-    dest=$1; shift
+    gitpath="$1"; shift
+    dest="$1"; shift
 
     giturl=$(git_url $gitpath)
     gittag=$(git_tag $gitpath)
-    if [ -z "$filemode" ] ; then
-       [ -d "$dest" ] || mkdir -p "$dest"
-       pushd "$dest" >& /dev/null
-       git archive --remote=${giturl} ${gittag} | tar -xf - ${path}
-       popd >& /dev/null
-    else
-       destdir=$(dirname "$dest")
-       [ -d "$destdir" ] || mkdir -p "$destdir"
-       git archive --remote=${giturl} ${gittag} | tar -xOf - ${path} > "${dest}"
-    fi
+    [ -d "$dest" ] || mkdir -p "$dest"
+    pushd "$dest" >& /dev/null
+    git archive --remote=${giturl} ${gittag} | tar -xf - 
+    popd >& /dev/null
 }
 
 function die () {
@@ -89,8 +89,16 @@ function package () {
     img_mnt="/Volumes/${img_mnt_name}"
 
     # check we're clear
-    [ -f $img_dmg ] && die "output dmg $img_dmg already exists"
-    [ -f $img_raw_dmg ] && die "please clean up tmp file $img_raw_dmg"
+    if [ -f $img_dmg ] ; then
+       [ -z "$FORCE_REWRITE" ] && die "output dmg $img_dmg already exists"
+       echo "Trashing (force_rewrite) former output $img_dmg"
+       rm -f $img_dmg
+    fi
+    if [ -f $img_raw_dmg ] ; then
+       [ -z "$FORCE_REWRITE" ] && die "please clean up tmp file $img_raw_dmg"
+       echo "Cleaning (force_rewrite) former tmp file $img_raw_dmg"
+       rm -f $img_raw_dmg
+    fi
 
     if [ -n "$FORCE_DOWNLOAD" ] ; then
        [ -d "$skel_mnt" ] && hdiutil unmount "$skel_mnt"
@@ -133,28 +141,45 @@ Also make sure to trash the current one before retrying"
     if [ "$skelapp" != "$app" ] ; then
        mv "$img_mnt/$skelapp" "$img_mnt/$app"
     fi
+    # unmount the skeleton
+    hdiutil unmount "$skel_mnt"
+
     # 
     resource_path=$app/Contents/Resources
     bin_path=$app/Contents/MacOS
 
-    # retrieve sfa/sfa and sface/sface in the image
+    # retrieve sfa and sface full repos in a temp dir
+    temp=$(mktemp -d -t sface-dmg)
+
+    git_retrieve $sfa_GITPATH $temp/sfa
+    git_retrieve $sface_GITPATH $temp/sface
+
+    # retrieve version number, and run make version
+    sfa_spec=$temp/sfa/sfa.spec
+    sfa_tag=$(rpm -q --specfile $sfa_spec --qf '%{version}-%{taglevel}')
+    make -C $temp/sfa VERSIONTAG="${sfa_tag}" SCMURL="${sfa_GITPATH}" version
+    sface_spec=$temp/sface/sface.spec
+    sface_tag=$(rpm -q --specfile $sface_spec --qf '%{version}-%{taglevel}')
+    make -C $temp/sface VERSIONTAG="${sface_tag}" SCMURL="${sface_GITPATH}" version
+
+    # copy sfa/ and sface/ subdirs in image
     rm -rf "$img_mnt"/$resource_path/{sfa,sface}
-    git_retrieve $sfa_GITPATH sfa "$img_mnt"/$resource_path/
-    git_retrieve $sface_GITPATH sface "$img_mnt"/$resource_path/
+    tar -C $temp/sfa -cf - sfa | tar -C "$img_mnt"/$resource_path/ -xf -
+    tar -C $temp/sface -cf - sface | tar -C "$img_mnt"/$resource_path/ -xf -
+
     # copy binaries from sface to the bin dir
     for bin in sface.bin sface-run; do 
-       # don't use the --file mode as this loses the executable bit
-       git_retrieve $sface_GITPATH $bin "$img_mnt"/$bin_path
+       cp $temp/sface/$bin "$img_mnt"/$bin_path
     done
 
     ### install background and app icons
     # clean up any 'background' dir if exists
     rm -rf "$img_mnt"/{,.}background 
-    git_retrieve --file $sface_GITPATH macos/graphic-install-background.png "$img_mnt"/.background/background.png
-    git_retrieve --file $sface_GITPATH macos/graphic-sfa.icns "$img_mnt"/$resource_path/appIcon.icns
+    cp $temp/sface/macos/graphic-install-background.png "$img_mnt"/.background/background.png
+    cp $temp/sface/macos/graphic-sfa.icns "$img_mnt"/$resource_path/appIcon.icns
     # the volume icons won't work - who cares
-#    git_retrieve --file $sface_GITPATH macos/graphic-vol-sface.icns "$img_mnt"/.background/volumeIcon.icns
-#    git_retrieve --file $sface_GITPATH macos/graphic-vol-sface.png "$img_mnt"/.background/volumeIcon.png
+#    cp $temp/sface/macos/graphic-vol-sface.icns "$img_mnt"/.background/volumeIcon.icns
+#    cp $temp/sface/macos/graphic-vol-sface.png "$img_mnt"/.background/volumeIcon.png
 
     # instantiate version
     sed -e "s,@VERSIONTAG@,$sfa_release,g" -e "s,@SCMURL@,${sfa_GITPATH},g" \
@@ -169,8 +194,7 @@ Also make sure to trash the current one before retrying"
        read _
     fi
 
-    # this apparently requires xcode
-#    /Developer/Tools/SetFile -a V "$img_mnt"/$background_path
+    rm -rf $temp 
 
     hdiutil detach "$img_mnt"
     rm -f $img_dmg
@@ -178,8 +202,6 @@ Also make sure to trash the current one before retrying"
     hdiutil convert -quiet -format UDZO -imagekey zlib-level=9 -o $img_dmg $img_raw_dmg 
     # clean up the raw image
     rm -f $img_raw_dmg
-    # unmount the skeleton
-    hdiutil unmount "$skel_mnt"
 
     echo "=================================================="
     echo "Install image ready in $img_dmg"
@@ -200,6 +222,7 @@ function usage () {
     echo "Common options"
     echo " -i : interactive : let you align icons properly in the image before it gets wrapped"
     echo " -f : force download of the skeleton package"
+    echo " -F : force overwrite if output already exists"
     echo " -a leopard|snow-leopard"
     echo " -A : run on all known archs"
     echo " -n : dry-run"
@@ -211,7 +234,7 @@ DEFAULT_BUILD_DIR=$HOME/git/build
 DEFAULT_TAGS_FILE=onelab-k32-tags.mk
 
 function main () {
-    while getopts "b:t:c:s:ifa:Anvh" opt ; do
+    while getopts "b:t:c:s:ifFa:Anvh" opt ; do
        case $opt in 
            b) BUILD_DIR=$OPTARG;;
            t) TAGS_FILE=$OPTARG;;
@@ -219,6 +242,7 @@ function main () {
            s) sfa_GITPATH=$OPTARG;;
            i) INTERACTIVE=true;;
            f) FORCE_DOWNLOAD=true;;
+           F) FORCE_REWRITE=true ;;
            a) ARCHS="$ARCHS $OPTARG";;
            A) ARCHS="leopard snow-leopard";;
            n) dry_run=true;;