1#!/bin/sh
2
3# Copyright (C) 2007 International Business Machines and
4# Copyright (c) 2009 Lehigh University
5# All Rights Reserved.
6# This file is distributed under the Eclipse Public License.
7# It is part of the BuildTools project in COIN-OR (www.coin-or.org)
8#
9# $Id$
10#
11
12# Adapted from prepare_new_release by Ted Ralphs, Lehigh Univ., 2009-07-07
13# Modified:     Lou Hafer    SFU    2010-06-02
14
15#set -x -v
16set -e
17
18# Know thy self. If there are no '/' chars in the command name, we're running
19# in the currrent directory. Otherwise, strip the command name, leaving the
20# prefix.  Coin-functions is expected to live in the same directory.
21
22if expr "$0" : '.*/.*' >/dev/null 2>&1 ; then
23  cmdDir=`echo $0 | sed -e 's,\(.*\)/[^/]*,\1,'`
24else
25  cmdDir='.'
26fi
27if test -r $cmdDir/coin-functions ; then
28  . $cmdDir/coin-functions
29else
30  echo "Cannot find utility functions file coin-functions; exiting."
31fi
32
33
34printHelp=0
35exitValue=0
36depFile=
37
38# stableExternals specifies externals which we do not want to convert to
39# releases, for whatever reason.
40
41stableExternals=
42
43if test "$#" -eq 0; then
44  printHelp=1
45else
46
47# Process the parameters. A parameter without an opening `-' is assumed to be
48# the dependency file.
49
50  while test $# -gt 0 && test $exitValue = 0 && test $printHelp = 0 ; do
51    case "$1" in
52      -h* | --h*) printHelp=1 ;;
53      -s* | --s*)
54	   if expr "$1" : '.*-s.*=.*' 2>&1 >/dev/null ; then
55	     stableExternals=`echo $1 | sed -n -e 's/[^=]*=\(.*\)/\1/p'`
56	   else
57	     shift
58	     stableExternals=$1
59	   fi
60	   ;;
61       -*) echo "$0: unrecognised command line switch '"$1"'."
62	   printHelp=1
63	   exitValue=1
64	   ;;
65	*) depFile=$1
66	   ;;
67    esac
68    shift
69  done
70fi
71
72# Find the most recent release for each stable external. Allow for the
73# possibility that a stable branch has no associated release, or that the
74# user has asked to keep the stable external.
75
76if test $printHelp = 0 && test $exitValue = 0; then
77  if test -r $depFile; then
78
79    rm -f Externals.releases
80
81    echo ''
82    echo '===> Converting stable externals to releases ...'
83    echo ''
84
85    ext_name=
86    ext_url=
87    for i in `cat $depFile`; do
88      if test "$ext_name" = ""; then
89        ext_name="$i"
90      else
91        ext_url=$i
92        if expr "$ext_name" : '#.*' >/dev/null 2>&1 ; then
93          echo "Skipping $ext_name."
94          ext_name=
95          continue
96        fi
97	if expr "$stableExternals" : '.*'"$ext_name"'.*' 2>&1 >/dev/null ; then
98	  echo "    $ext_name $ext_url unchanged"
99	else
100	  extType=`extractTypeFromURL $ext_url`
101	  if test "$extType" = invalid ; then
102	    echo ''
103	    echo "The external URL $ext_url appears to be invalid. Exiting."
104	    echo ''
105	    exit 3
106	  fi
107
108	  if test "$extType" = stable ; then
109	    ext_majVer=`extractMajorFromURL $ext_url`
110	    ext_minVer=`extractMinorFromURL $ext_url`
111	    ext_rel_url=`bestRelease $ext_url $ext_majVer $ext_minVer`
112	    if test -z "$ext_rel_url" ; then
113	      echo "There is no release for $ext_url"
114	      echo "Keeping $ext_url"
115	    else
116	      # Normal (not BuildTools/ThirdParty/Data) need a directory name,
117	      # and it may differ from the project name. Carefully preserve it.
118	      # ThirdParty URLs include BuildTools ; both named for emphasis
119	      case $ext_rel_url in
120		*/BuildTools/* | */ThirdParty/* | */Data/* ) ;;
121		*) ext_tail=`extractTailFromExt $ext_url`
122		   ext_rel_url=${ext_rel_url}${ext_tail}
123		   ;;
124	      esac
125	      echo "Replacing $ext_url with $ext_rel_url"
126	      ext_url=$ext_rel_url
127	    fi
128	  else
129	    echo "Keeping $ext_url"
130	  fi
131	fi
132
133        echo "$ext_name  $ext_url" >>Externals.releases
134        ext_name=
135      fi
136    done
137
138    echo ''
139    echo '===> Updating svn:externals property...'
140    echo ''
141
142    svn propset svn:externals -F Externals.releases .
143    svn propget svn:externals .
144
145    rm Externals.releases
146
147  else # if test -r depFile
148    echo ""
149    echo "Dependency file does not exist or is unspecified..."
150    echo ""
151    printHelp=1
152    exitvalue=2
153  fi
154fi
155
156if test $printHelp = 1 ; then
157  cat <<EOF
158Usage: set_externals <Dependency File> 
159
160Options:
161  -s <projectlist>      Suppress conversion from stable to release for the
162			listed externals (comma-separated list of project
163			names, e.g., -s Osi,Cbc).
164
165This script takes as input a dependency file containing a list of stable
166versions of COIN projects on separate lines in the form
167
168 <name> <URL of stable version>
169
170Recommended practice is to keep the set of stable externals in a file
171called "Dependencies" in the project's root directory. A temporary file
172called "Externals.releases" in the same form, but with the URL of each
173stable version replaced by the URL of the latest associated release is
174produced. From this file, the script will set the svn:externals variable. It
175does not do an update or commit the change. After the script runs, do an
176update and test build, then commit the change if you are happy.
177
178EOF
179else
180cat <<EOF 
181Externals set successfully. Please verify that the change is OK and then 
182commit to make the change permanent.
183EOF
184
185fi
186
187exit $exitValue
188