aboutsummaryrefslogtreecommitdiff
path: root/academic/octave-forge/generate-installscript.sh
blob: c5aa1c138e988597b76d250fcd9673187cb6b413 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
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