summaryrefslogtreecommitdiff
path: root/academic/octave-forge/generate-installscript.sh
diff options
context:
space:
mode:
Diffstat (limited to 'academic/octave-forge/generate-installscript.sh')
-rw-r--r--academic/octave-forge/generate-installscript.sh155
1 files changed, 155 insertions, 0 deletions
diff --git a/academic/octave-forge/generate-installscript.sh b/academic/octave-forge/generate-installscript.sh
new file mode 100644
index 0000000000..c5aa1c138e
--- /dev/null
+++ b/academic/octave-forge/generate-installscript.sh
@@ -0,0 +1,155 @@
+#!/bin/sh
+
+# Generate Octave script to install Octave-Forge packages respecting
+# dependency constraints.
+# The generated script must be run after setting:
+# - main,extra,language,nonfree flags of enabled repositories to 1
+# - pkg_prefix=$PKG
+
+# Copyright 2008 Mauro Giachero
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+PRGNAM=octave-forge
+VERSION=bundle-20080507
+TMP=${TMP:-/tmp/SBo}
+CWD=$(pwd)
+INSTALLSCRIPT=${INSTALLSCRIPT:-installscript.m}
+
+set -e
+
+mkdir -p $TMP
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xf $CWD/$PRGNAM-$VERSION.tar.gz
+cd $PRGNAM-$VERSION
+
+EXIT_STATUS=0
+REPOS=$(ls --indicator-style=none)
+
+# Build packages list
+pkgs_path=$(find . -name \*.gz)
+pkgs_count=$(echo $pkgs_path |tr " " "\n" |wc -l)
+pkgs_sort_path=
+pkgs_sort_count=0
+
+# Extract dependency information from packages
+for pkg_path in $pkgs_path; do
+ pkg_name=$(basename $pkg_path |cut -d "-" -f 1)
+ tar xfO $pkg_path --wildcards \*/DESCRIPTION |grep "Depends:" |tr "," "\n" |grep -v "Depends:" |cut -d " " -f 2 >DEPS-$pkg_name
+done
+
+# Generate Octave installation script
+# Heading
+for repo in $REPOS; do
+ # For each repository set the default value for the selection flag
+ echo "try $repo; catch $repo=0; end" >>$INSTALLSCRIPT
+done
+for pkg_path in $pkgs_path; do
+ # For each package, define an homonym flag to keep track of the
+ # successfully installed (built) packages.
+ echo $(basename $pkg_path |cut -d "-" -f 1)=0";" >>$INSTALLSCRIPT
+done
+# Create 3 files with the build results for the packages:
+# - installed.tmp tracks successfully built packages;
+# - broken.tmp tracks packages with build errors;
+# - skipped.tmp tracks packages skipped due to missing prerequisites.
+cat <<EOF >>$INSTALLSCRIPT
+installed=fopen('installed.tmp','w');
+skipped=fopen('skipped.tmp','w');
+broken=fopen('broken.tmp','w');
+EOF
+# Set the packages files/folders properly.
+cat <<EOF >>$INSTALLSCRIPT
+oldcwd=pwd;
+cd(pkg_prefix);
+pkg prefix ./usr/share/octave/packages ./usr/libexec/octave/packages ;
+pkg local_list ./ll
+pkg global_list ./gl
+cd(oldcwd);
+EOF
+# Resolve dependencies.
+BROKEN=0 # Detect broken dependency tree
+while [ $pkgs_sort_count -ne $pkgs_count ] ; do # Some packages still to sort
+ BROKEN=1
+ for pkg_path in $pkgs_path; do
+ if echo $pkgs_sort_path | grep -qvw $pkg_path; then # Not already in the sorted list
+ RESOLVED=1
+ pkg_name=$(basename $pkg_path |cut -d "-" -f 1)
+ # "ifclause" is the install condition, to avoid trying to
+ # install packages when their prerequisites fail.
+ ifclause=
+ for dep in $(cat DEPS-$pkg_name); do
+ ifclause="$dep==1 && $ifclause"
+ if echo $pkgs_sort_path | grep -qvw $dep; then
+ # Still missing some dependency
+ RESOLVED=0
+ fi
+ done
+
+ if [ $RESOLVED -eq 1 ]; then
+ pkg_repository=$(echo $pkg_path |cut -d "/" -f 2)
+ ifclause="$ifclause $pkg_repository==1"
+ pkgs_sort_path="$pkgs_sort_path $pkg_path"
+ pkgs_sort_count=$(($pkgs_sort_count+1))
+ #Output install command
+cat <<EOF >>$INSTALLSCRIPT
+if $ifclause
+ fprintf('%s','Building $pkg_name ($pkg_repository) [$pkgs_sort_count/$pkgs_count]... ')
+ try
+ pkg install $pkg_path
+ $pkg_name=1;
+ fid=installed;
+ fprintf('done.\n')
+ catch
+ fprintf('\n%s\n','Build of $pkg_name aborted due to errors.')
+ fid=broken;
+ end
+else
+ disp('Skipping $pkg_name ($pkg_repository) [$pkgs_sort_count/$pkgs_count].')
+ fid=skipped;
+end
+fprintf(fid,'%s\n','$pkg_name');
+EOF
+ # New dependency resolved, so the repository (still) looks ok
+ BROKEN=0
+ fi
+ fi
+ done
+
+ if [ $BROKEN -eq 1 ]; then
+ #A whole loop completed without resolving any dependency
+ echo "Error: broken dependency tree (some dependencies could not be resolved)" >&2
+ EXIT_STATUS=1
+ break
+ fi
+done
+
+# Script tail
+cat <<EOF >>$INSTALLSCRIPT
+fclose(installed);
+fclose(skipped);
+fclose(broken);
+EOF
+mv $INSTALLSCRIPT $CWD
+
+# Remove temporary files
+rm -f DEPS-*
+
+exit $EXIT_STATUS