| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977 | #!/bin/bash# $Id: install.sh 7942 2008-03-26 06:08:08Z xmldoc $# $Source$ ## install.sh - Set up user environment for a XML/XSLT distribution# This is as an interactive installer for updating your# environment to use an XML/XSLT distribution such as the DocBook# XSL Stylesheets. Its main purpose is to configure your# environment with XML catalog data and schema "locating rules"# data provided in the XML/XSLT distribution.## Although this installer was created for the DocBook project, it# is a general-purpose tool that can be used with any XML/XSLT# distribution that provides XML/SGML catalogs and locating rules.## This script is mainly intended to make things easier for you if# you want to install a particular XML/XSLT distribution that has# not (yet) been packaged for your OS distro (Debian, Fedora,# whatever), or to use "snapshot" or development releases ## It works by updating your shell startup file (e.g., .bashrc and# .cshrc) and .emacs file and by finding or creating a writable# CatalogManager.properties file to update.## It makes backup copies of any files it touches, and also# generates a uninstall.sh script for reverting its changes.## In the same directory where it is located, it expects to find# the following four files:#   - locatingrules.xml#   - catalog.xml#   - catalog#   - .urilist# And if it's unable to locate a CatalogManager.properties file in# your environment, it expects to find an "example" one in the# same directory as itself, which it copies over to your# ~/.resolver directory.## If the distribution contains any executables, change the value# of the thisBinDir to a colon-separated list of the pathnames of# the directories that contain those executables.# mydir is the "canonical" absolute pathname for install.shmydir=$(cd -P $(dirname $0) && pwd -P) || exit 1thisLocatingRules=$mydir/locatingrules.xmlthisXmlCatalog=$mydir/catalog.xmlthisSgmlCatalog=$mydir/catalog# .urilist file contains a list of pairs of local pathnames and# URIs to test for catalog resolutionthisUriList=$mydir/.urilistexampleCatalogManager=$mydir/.CatalogManager.properties.examplethisCatalogManager=$HOME/.resolver/CatalogManager.properties# thisBinDir directory is a colon-separated list of the pathnames# to all directories that contain executables provided with the# distribution (for example, the DocBook XSL Stylesheets# distribution contains a "docbook-xsl-update" convenience script# for rsync'ing up to the latest docbook-xsl snapshot). The# install.sh script adds the value of thisBinDir to your PATH# environment variablethisBinDir=$mydir/tools/binemit_message() {  echo "$1" 1>&2}if [ ! "${*#--batch}" = "$*" ]; then  batchmode="Yes";else  batchmode="No";  emit_message  if [ ! "$1" = "--test" ]; then     emit_message "NOTE: For non-interactive installs/uninstalls, use --batch"    if [ ! "$1" = "--uninstall" ]; then      emit_message    fi  fifiosName="Unidentified"if uname -s | grep -qi "cygwin"; then  osName="Cygwin"ficlassPathSeparator=":"if [ "$osName" = "Cygwin" ]; then  thisJavaXmlCatalog=$(cygpath -m $thisXmlCatalog)  classPathSeparator=";"else  thisJavaXmlCatalog=$thisXmlCatalogfimain() {  removeOldFiles  checkRoot  updateCatalogManager  checkForResolver  writeDotFiles  updateUserStartupFiles  updateUserDotEmacs  writeUninstallFile  writeTestFile  printExitMessage}removeOldFiles() {  rm -f $mydir/.profile.incl  rm -f $mydir/.cshrc.incl  rm -f $mydir/.emacs.el}checkRoot() {  if [ $(id -u)  == "0" ]; then    cat 1>&2 <<EOFWARNING: This install script is meant to be run as a non-root         user, but you are running it as root.EOF    read -s -n1 -p "Are you sure you want to continue? [No] "    emit_message "$REPLY"    case $REPLY in      [yY])      emit_message      ;;      *) emit_message "OK, exiting without making changes."      exit      ;;    esac  fi  return 0}updateCatalogManager() {  #  - finds or creates a writable CatalogManager.properties file  #  #  - adds the catalog.xml file for this distribution to the  #    CatalogManager.properties file found  if [ -z "$CLASSPATH" ]; then    cat 1>&2 <<EOFNOTE: There is no CLASSPATH variable set in your environment.      No attempt was made to find a CatalogManager.properties      file.  Using $thisCatalogManager insteadEOF  else    # split CLASSPATH in a list of pathnames by replacing all separator    # characters with spaces    if [ "$osName" = "Cygwin" ]; then      pathnames=$(echo $CLASSPATH | tr ";" " ")    else      pathnames=$(echo $CLASSPATH | tr ":" " ")    fi    for path in $pathnames; do    if [ "$osName" = "Cygwin" ]; then      path=$(cygpath -u $path)    fi      # strip out trailing slash from pathname      path=$(echo $path | sed 's/\/$//')      # find CatalogManager.properties file      if [ -f $path/CatalogManager.properties ];      then        existingCatalogManager=$path/CatalogManager.properties        break      fi    done  fi  # end of CLASSPATH check  if [ -w "$existingCatalogManager" ]; then    # existing CatalogManager.properties was found and it is    # writable, so use it    myCatalogManager=$existingCatalogManager  else    if [ -f "$existingCatalogManager" ]; then      # a non-writable CatalogManager.properties exists, so emit a      # note saying that it won't be used      cat 1>&2 <<EOFNOTE: $existingCatalogManager file found,      but you don't have permission to write to it.      Will instead use:      $thisCatalogManagerEOF    else      # CLASSPATH is set, but no CatalogManager.properties found      if [ -n "$CLASSPATH" ]; then        cat 1>&2 <<EOFNOTE: No CatalogManager.properties found from CLASSPATH.      Will instead use:      $thisCatalogManagerEOF      fi    fi    if [ "$batchmode" = "Yes" ]; then      emit_message    fi    # end of check for existing writable CatalogManager.properties    if [ -f $thisCatalogManager ]; then      myCatalogManager=$thisCatalogManager    else      REPLY=""      if [ ! "$batchmode" = "Yes" ]; then        emit_message        read -s -n1 -p "Create $thisCatalogManager file? [Yes] "        emit_message "$REPLY"        emit_message      fi      case $REPLY in        [nNqQ])        emitNoChangeMsg        ;;        *)        if [ ! -d "${thisCatalogManager%/*}" ]; then          mkdir -p ${thisCatalogManager%/*}        fi        cp $mydir/.CatalogManager.properties.example $thisCatalogManager || exit 1        emit_message "NOTE: Created the following file:"        emit_message "      $thisCatalogManager"        myCatalogManager=$thisCatalogManager        ;;      esac      # end of creating "private" CatalogManager.properties    fi    # end of check for "private" CatalogManager.properties  fi  # end of check finding/creating writable CatalogManager.properties  if [ -n "$myCatalogManager" ]; then    etcXmlCatalog=    catalogsLine=$(grep "^catalogs=" $myCatalogManager)    if [ -f /etc/xml/catalog ] && [ "$osName" != "Cygwin" ] \      && [ "${catalogsLine#*/etc/xml/catalog*}" = "$catalogsLine" ]; then      cat 1>&2 <<EOFWARNING: /etc/xml/catalog exists but was not found in:         $myCatalogManager         If /etc/xml/catalog file has content, you probably         should reference it in:         $myCatalogManager         This installer can automatically add it for you,         but BE WARNED that once it has been added, the         uninstaller for this distribution CANNOT REMOVE IT         automatically during uninstall. If you no longer want         it included, you will need to remove it manually.EOF      REPLY=""      if [ ! "$batchmode" = "Yes" ]; then        read -s -n1 -p "Add /etc/xml/catalog to $myCatalogManager? [Yes] "        emit_message "$REPLY"      fi      case $REPLY in        [nNqQ])        emit_message        ;;        *)        etcXmlCatalog=/etc/xml/catalog        ;;      esac    fi    catalogBackup="$myCatalogManager.$$.bak"    if [ ! -w "${myCatalogManager%/*}" ]; then      emit_message      emit_message "WARNING: ${myCatalogManager%/*} directory is not writable."      emit_message      emitNoChangeMsg    else      REPLY=""      if [ ! "$batchmode" = "Yes" ]; then        emit_message        emit_message "Add $thisJavaXmlCatalog"        read -s -n1 -p "to $myCatalogManager file? [Yes] "        emit_message "$REPLY"        emit_message      fi      case $REPLY in        [nNqQ])        emitNoChangeMsg        ;;        *)        if [ "$catalogsLine" ] ; then          if [ "${catalogsLine#*$thisJavaXmlCatalog*}" != "$catalogsLine" ]; then            emit_message "NOTE: $thisJavaXmlCatalog"            emit_message "      already in:"            emit_message "      $myCatalogManager"          else            mv $myCatalogManager $catalogBackup || exit 1            sed "s#^catalogs=\(.*\)\$#catalogs=$thisJavaXmlCatalog;\1;$etcXmlCatalog#" $catalogBackup \            | sed 's/;\+/;/' | sed 's/;$//' > $myCatalogManager || exit 1            emit_message "NOTE: Successfully updated the following file:"            emit_message "      $myCatalogManager"            emit_message "      Backup written to:"            emit_message "      $catalogBackup"          fi        else          mv $myCatalogManager $catalogBackup || exit 1          cp $catalogBackup $myCatalogManager          echo "catalogs=$thisJavaXmlCatalog;$etcXmlCatalog" \          | sed 's/;\+/;/' | sed 's/;$//' >> $myCatalogManager || exit 1          emit_message "NOTE: \"catalogs=\" line added to $myCatalogManager."          emit_message "      Backup written to $catalogBackup"        fi        ;;      esac      # end of backing up and updating CatalogManager.properties    fi  fi  # end of CatalogManager.properties updates  if [ "$osName" = "Cygwin" ]; then    myCatalogManager=$(cygpath -m $myCatalogManager)  fi  return 0}writeDotFiles() {  while read; do    echo "$REPLY" >> $mydir/.profile.incl  done <<EOF# $thisBinDir is not in PATH, so add itif [ "\${PATH#*$thisBinDir*}" = "\$PATH" ]; then  PATH="$thisBinDir:\$PATH"  export PATHfiif [ -z "\$XML_CATALOG_FILES" ]; then  XML_CATALOG_FILES="$thisXmlCatalog"else  # $thisXmlCatalog is not in XML_CATALOG_FILES, so add it  if [ "\${XML_CATALOG_FILES#*$thisXmlCatalog*}" = "\$XML_CATALOG_FILES" ]; then    XML_CATALOG_FILES="$thisXmlCatalog \$XML_CATALOG_FILES"  fifi# /etc/xml/catalog exists but is not in XML_CATALOG_FILES, so add itif [ -f /etc/xml/catalog ] && \  [ "\${XML_CATALOG_FILES#*/etc/xml/catalog*}" = "\$XML_CATALOG_FILES" ]; then  XML_CATALOG_FILES="\$XML_CATALOG_FILES /etc/xml/catalog"fiexport XML_CATALOG_FILESif [ -z "\$SGML_CATALOG_FILES" ]; then  SGML_CATALOG_FILES="$thisSgmlCatalog"else  # $thisSgmlCatalog is not in SGML_CATALOG_FILES, so add it  if [ "\${SGML_CATALOG_FILES#*$thisSgmlCatalog}" = "\$SGML_CATALOG_FILES" ]; then    SGML_CATALOG_FILES="$thisSgmlCatalog:\$SGML_CATALOG_FILES"  fifi# /etc/sgml/catalog exists but is not in SGML_CATALOG_FILES, so add itif [ -f /etc/sgml/catalog ] && \  [ "\${SGML_CATALOG_FILES#*/etc/sgml/catalog*}" = "\$SGML_CATALOG_FILES" ]; then  SGML_CATALOG_FILES="\$SGML_CATALOG_FILES:/etc/sgml/catalog"fiexport SGML_CATALOG_FILESEOFwhile read; do  echo "$REPLY" >> $mydir/.cshrc.incldone <<EOF# $thisBinDir is not in PATH, so add itif ( "\\\`echo \$PATH | grep -v $thisBinDir\\\`" != "" ) then  setenv PATH "$thisBinDir:\$PATH"endifif ( ! $\?XML_CATALOG_FILES ) then  setenv XML_CATALOG_FILES "$thisXmlCatalog"# $thisXmlCatalog is not in XML_CATALOG_FILES, so add itelse if ( "\\\`echo \$XML_CATALOG_FILES | grep -v $thisXmlCatalog\\\`" != "" ) then  setenv XML_CATALOG_FILES "$thisXmlCatalog \$XML_CATALOG_FILES"endifendif# /etc/xml/catalog exists but is not in XML_CATALOG_FILES, so add itif ( -f /etc/xml/catalog && "\\\`echo \$XML_CATALOG_FILES | grep -v /etc/xml/catalog\\\`" != "" ) then  setenv XML_CATALOG_FILES "\$XML_CATALOG_FILES /etc/xml/catalog"endifendifif ( ! $\?SGML_CATALOG_FILES ) then  setenv SGML_CATALOG_FILES "$thisSgmlCatalog"else if ( "\\\`echo \$SGML_CATALOG_FILES | grep -v $thisSgmlCatalog\\\`" != "" ) then  setenv SGML_CATALOG_FILES "$thisSgmlCatalog:\$SGML_CATALOG_FILES"endifendif# /etc/SGML/catalog exists but is not in SGML_CATALOG_FILES, so add itif ( -f /etc/sgml/catalog && "\\\`echo \$SGML_CATALOG_FILES | grep -v /etc/sgml/catalog\\\`" != "" ) then  setenv SGML_CATALOG_FILES {\$SGML_CATALOG_FILES}:/etc/sgml/catalogendifEOFif [ -n "$myCatalogManager" ]; then  myCatalogManagerDir=${myCatalogManager%/*}  while read; do    echo "$REPLY" >> $mydir/.profile.incl  done <<EOFif [ -z "\$CLASSPATH" ]; then  CLASSPATH="$myCatalogManagerDir"else  # $myCatalogManagerDir is not in CLASSPATH, so add it  if [ "\${CLASSPATH#*$myCatalogManagerDir*}" = "\$CLASSPATH" ]; then    CLASSPATH="$myCatalogManagerDir$classPathSeparator\$CLASSPATH"  fifiexport CLASSPATHEOF  while read; do    echo "$REPLY" >> $mydir/.cshrc.incl  done <<EOFif ( ! $\?CLASSPATH ) then  setenv CLASSPATH "$myCatalogManagerDir"# $myCatalogManagerDir is not in CLASSPATH, so add itelse if ( "\\\`echo \$CLASSPATH | grep -v $myCatalogManagerDir\\\`" != "" ) then  setenv CLASSPATH "$myCatalogManagerDir$classPathSeparator\$CLASSPATH"endifendifEOFfiwhile read; do  echo "$REPLY" >> $mydir/.emacs.eldone <<EOF(add-hook  'nxml-mode-hook  (lambda ()    (setq rng-schema-locating-files-default          (append '("$thisLocatingRules")                  rng-schema-locating-files-default ))))EOFreturn 0}updateUserStartupFiles() {  if [ ! "$batchmode" = "Yes" ]; then  cat 1>&2 <<EOFNOTE: To source your environment correctly for using the catalog      files in this distribution, you need to update one or more      of your shell startup files. This installer can      automatically make the necessary changes. Or, if you prefer,      you can make the changes manually.EOF  else    emit_message  fi  # if running csh or tcsh, target .cshrc and .tcshrc files for  # update; otherwise, target .bash_* and .profiles  parent=$(ps -p $PPID | grep "/")  if [ "${parent#*csh}" != "$parent" ] || [ "${parent#*tcsh}" != "$parent" ]; then    myStartupFiles=".cshrc .tcshrc"    appendLine="source $mydir/.cshrc.incl"  else    myStartupFiles=".bash_profile .bash_login .profile .bashrc"    appendLine=". $mydir/.profile.incl"  fi  for file in $myStartupFiles; do    if [ -f "$HOME/$file" ]; then      dotFileBackup=$HOME/$file.$$.bak      REPLY=""      if [ ! "$batchmode" = "Yes" ]; then        read -s -n1 -p "Update $HOME/$file? [Yes] "        emit_message "$REPLY"      fi      case $REPLY in        [nNqQ])        cat 1>&2 <<EOFNOTE: No change made to $HOME/$file. You either need      to add the following line to it, or manually source      the shell environment for this distribution each      time you want use it.$appendLineEOF        ;;        *)        lineExists="$(grep "$appendLine" $HOME/$file )"        if [ ! "$lineExists" ]; then          mv $HOME/$file $dotFileBackup     || exit 1          cp $dotFileBackup $HOME/$file     || exit 1          echo "$appendLine" >> $HOME/$file || exit 1          cat 1>&2 <<EOFNOTE: Successfully updated the following file:      $HOME/$file       Backup written to:      $dotFileBackupEOF        else          cat 1>&2 <<EOFNOTE: The following file already contains information for this      distribution, so I did not update it.      $HOME/$fileEOF        fi        ;;      esac    fi  done  if [ -z "$dotFileBackup" ]; then    if [ ! "$batchmode" = "Yes" ]; then      emit_message    fi    cat 1>&2 <<EOFNOTE: No shell startup files updated. You can source the      environment for this distribution manually, each time you      want to use it, by typing the following.$appendLineEOF  fi}updateUserDotEmacs() {  if [ -f $thisLocatingRules ]; then  cat 1>&2 <<EOFNOTE: This distribution includes a "schema locating rules" file      for Emacs/nXML.  To use it, you should update either your      .emacs or .emacs.el file.  This installer can automatically      make the necessary changes. Or, if you prefer, you can make      the changes manually.EOF  emacsAppendLine="(load-file \"$mydir/.emacs.el\")"  myEmacsFile=  for file in .emacs .emacs.el; do    if [ -f "$HOME/$file" ]; then      myEmacsFile=$HOME/$file      break    fi  done  if [ ! -f "$myEmacsFile" ]; then    REPLY=""    if [ ! "$batchmode" = "Yes" ]; then      read -s -n1 -p "No .emacs or .emacs.el file. Create one? [No] "      emit_message "$REPLY"      emit_message    fi    case $REPLY in      [yY])      myEmacsFile=$HOME/.emacs      touch $myEmacsFile      ;;      *)      cat 1>&2 <<EOFNOTE: No Emacs changes made. To use this distribution with,      Emacs/nXML, you can create a .emacs file and manually add      the following line to it, or you can run it as a command      within Emacs.$emacsAppendLineEOF      ;;    esac  fi  if [ -n "$myEmacsFile" ]; then    REPLY=""    if [ ! "$batchmode" = "Yes" ]; then      read -s -n1 -p  "Update $myEmacsFile? [Yes] "      emit_message "$REPLY"      emit_message    fi    case $REPLY in      [nNqQ])      cat 1>&2 <<EOFNOTE: No change made to $myEmacsFile. To use this distribution      with Emacs/nXML, you can manually add the following line      to your $myEmacsFile, or you can run it as a command      within Emacs.$emacsAppendLineEOF      ;;      *)      lineExists="$(grep "$emacsAppendLine" $myEmacsFile)"      if [ ! "$lineExists" ]; then        dotEmacsBackup=$myEmacsFile.$$.bak        mv $myEmacsFile $dotEmacsBackup    || exit 1        cp $dotEmacsBackup $myEmacsFile    || exit 1        echo "$emacsAppendLine" >> $myEmacsFile || exit 1        cat 1>&2 <<EOFNOTE: Successfully updated the following file:      $myEmacsFile      Backup written to:      $dotEmacsBackupEOF      else        cat 1>&2 <<EOFNOTE: The following file already contains information for this      distribution, so I did not update it.      $myEmacsFileEOF      fi      ;;    esac  fifi}uninstall() {  if [ ! "$batchmode" = "Yes" ]; then  cat 1>&2 <<EOFNOTE: To "uninstall" this distribution, the changes made to your      CatalogManagers.properties, startup files, and/or .emacs      file need to be reverted. This uninstaller can automatically      revert them.  Or, if you prefer, you can revert them manually.EOF  fi  if [ "$osName" = "Cygwin" ]; then    thisXmlCatalog=$thisJavaXmlCatalog  fi  # make "escaped" version of PWD to use with sed and grep  escapedPwd=$(echo $mydir | sed "s#/#\\\\\/#g")  # check to see if a non-empty value for catalogManager was fed  # to uninstaller.  if [ -n ${1#--catalogManager=} ]; then    myCatalogManager=${1#--catalogManager=}    catalogBackup="$myCatalogManager.$$.bak"    catalogsLine=$(grep "^catalogs=" $myCatalogManager)    if [ "$catalogsLine" ] ; then      if [ "${catalogsLine#*$thisXmlCatalog*}" != "$catalogsLine" ]; then        REPLY=""        if [ ! "$batchmode" = "Yes" ]; then          read -s -n1 -p "Revert $myCatalogManager? [Yes] "          emit_message "$REPLY"        fi        case $REPLY in          [nNqQ]*)          cat 1>&2 <<EOFNOTE: No change made to $myCatalogManager. You need to manually      remove the following path from the "catalog=" line.          $thisXmlCatalogEOF          ;;          *)          mv $myCatalogManager $catalogBackup || exit 1          sed "s#^catalogs=\(.*\)$thisXmlCatalog\(.*\)\$#catalogs=\1\2#" $catalogBackup \          | sed 's/;\+/;/' | sed 's/;$//' | sed 's/=;/=/' > $myCatalogManager || exit 1          cat 1>&2 <<EOFNOTE: Successfully updated the following file:      $myCatalogManager      Backup written to:      $catalogBackupEOF          ;;        esac      else        emit_message "NOTE: No data for this distribution found in:"        emit_message "       $myCatalogManager"        emit_message      fi    else      cat 1>&2 <<EOFNOTE: No data for this distribution was found in the following      file, so I did not revert it.      $myCatalogManagerEOF    fi  fi  if [ -n "$myEmacsFile" ]; then     # check to see if a non-empty value for --dotEmacs file was fed    # to uninstaller.    if [ -n ${2#--dotEmacs=} ]; then      myEmacsFile=${2#--dotEmacs=}      revertLine="(load-file \"$escapedPwd\/\.emacs\.el\")"      loadLine="$(grep "$revertLine" "$myEmacsFile")"      if [ -n "$loadLine" ]; then        emit_message        REPLY=""        if [ ! "$batchmode" = "Yes" ]; then          read -s -n1 -p "Revert $myEmacsFile? [Yes] "          emit_message "$REPLY"        fi        case $REPLY in          [nNqQ]*)          cat 1>&2 <<EOFNOTE: No change made to $myEmacsFile. You need to manuallyremove the following line.(load-file \"$mydir/.emacs.el\")EOF          ;;          *)          dotEmacsBackup=$myEmacsFile.$$.bak          sed -e "/$revertLine/d" -i".$$.bak" $myEmacsFile  || exit 1          cat 1>&2 <<EOFNOTE: successfully reverted the following file:      $myEmacsFile      Backup written to:      $dotEmacsBackupEOF          ;;        esac      else        emit_message "NOTE: No data for this distribution found in:"        emit_message "      $myEmacsFile"      fi    fi  fi  # check all startup files  myStartupFiles=".bash_profile .bash_login .profile .bashrc .cshrc .tcshrc"  for file in $myStartupFiles; do    if [ -e "$HOME/$file" ]; then      case $file in        .tcshrc|.cshrc)        revertLine="source $mydir/.cshrc.incl"        revertLineEsc="source $escapedPwd\/\.cshrc\.incl"        ;;        *)        revertLine=". $mydir/.profile.incl"        revertLineEsc="\. $escapedPwd\/\.profile\.incl"        ;;      esac      lineExists="$(grep "$revertLineEsc" $HOME/$file )"      if [ "$lineExists" ]; then        REPLY=""        if [ ! "$batchmode" = "Yes" ]; then          read -s -n1 -p "Update $HOME/$file? [Yes] "          emit_message "$REPLY"        fi        case $REPLY in          [nNqQ]*)          cat 1>&2 <<EOFNOTE: No change made to $HOME/$file. You need to manually remove      the following line from it. $revertLineEOF          ;;          *)          dotFileBackup=$HOME/$file.$$.bak          sed -e "/$revertLineEsc/d" -i".$$.bak" $HOME/$file  || exit 1          cat 1>&2 <<EOFNOTE: Successfully updated the following file:      $HOME/$file      Backup written to:      $dotFileBackupEOF          ;;        esac      else        emit_message "NOTE: No data for this distribution found in:"        emit_message "      $HOME/$file"        emit_message      fi    fi  done  removeOldFiles  emit_message "Done. Deleted uninstall.sh file."  rm -f $mydir/test.sh      || exit 1  rm -f $mydir/uninstall.sh || exit 1}writeUninstallFile() {  uninstallFile=$mydir/uninstall.sh  echo '#!/bin/bash'                               > $uninstallFile || exit 1  echo 'mydir=$(cd -P $(dirname $0) && pwd -P)'   >> $uninstallFile || exit 1  echo "\$mydir/install.sh \\"                    >> $uninstallFile || exit 1  echo "  --uninstall \\"                         >> $uninstallFile || exit 1  echo "  --catalogManager=$myCatalogManager \\"  >> $uninstallFile || exit 1  echo "  --dotEmacs='$myEmacsFile' \\"           >> $uninstallFile || exit 1  echo '  $@'                                     >> $uninstallFile || exit 1  chmod 755 $uninstallFile || exit 1}writeTestFile() {  testFile=$mydir/test.sh  echo "#!/bin/bash"                                > $testFile || exit 1  echo 'mydir=$(cd -P $(dirname $0) && pwd -P)'    >> $testFile || exit 1  echo '$mydir/install.sh --test'                  >> $testFile || exit 1  chmod 755 $testFile || exit 1}printExitMessage() {  cat 1>&2 <<EOFTo source your shell environment for this distribution, type thefollowing:$appendLineEOF}checkForResolver() {  resolverResponse="$(java org.apache.xml.resolver.apps.resolver uri -u foo 2>/dev/null)"  if [ -z "$resolverResponse" ]; then    cat 1>&2 <<EOFNOTE: Your environment does not seem to contain the Apache XML      Commons Resolver; without that, you can't use XML catalogs      with Java applications. For more information, see the "How      to use a catalog file" section in Bob Stayton's "DocBook      XSL: The Complete Guide"      http://sagehill.net/docbookxsl/UseCatalog.htmlEOF  fi}emitNoChangeMsg() {  cat 1>&2 <<EOFNOTE: No changes were made to CatalogManagers.properties. To      provide your Java tools with XML catalog information for      this distribution, you will need to make the appropriate      changes manually.EOF}testCatalogs() {  if [ ! -f "$thisXmlCatalog" ]; then    cat 1>&2 <<EOFFATAL: $thisXmlCatalog file needed but not found. Stopping.EOF  exit  fi  if [ -z "$XML_CATALOG_FILES" ]; then    emit_message    emit_message "WARNING: XML_CATALOG_FILES not set. Not testing with xmlcatalog."  else    xmlCatalogResponse="$(xmlcatalog 2>/dev/null)"    if [ -z "$xmlCatalogResponse" ]; then    cat 1>&2 <<EOFWARNING: Cannot locate the "xmlcatalog" command. Make sure that         you have libxml2 and its associated utilities installed.         http://xmlsoft.org/EOF    else      emit_message "Testing with xmlcatalog..."      # read in pathname-uri pairs from .urilist file      while read pair; do        if [ ! "${pair%* *}" = "." ]; then          path=$mydir/${pair%* *}        else          path=$mydir/        fi        uri=${pair#* *}        emit_message        emit_message "  Tested: $uri"        for catalog in $XML_CATALOG_FILES; do          response="$(xmlcatalog $catalog $uri| grep -v "No entry")"          if [ -n "$response" ]; then            if [ "$response" = "$path" ]; then              emit_message "  Result: $path"              break            else              emit_message "  Result: FAILED"            fi          fi        done      done < $mydir/.urilist    fi  fi  if [ -z "$CLASSPATH" ]; then    emit_message    emit_message "NOTE: CLASSPATH not set. Not testing with Apache XML Commons Resolver."  else    if [ "$(checkForResolver)" ]; then      checkForResolver    else      emit_message      emit_message "Testing with Apache XML Commons Resolver..."      # read in pathname-uri pairs from .urilist file      while read pair; do        if [ ! "${pair%* *}" = "." ]; then          path=$mydir/${pair%* *}        else          path=$mydir/        fi        uri=${pair#* *}        emit_message        emit_message "  Tested: $uri"        if [ ${uri%.dtd} != $uri ]; then          response="$(java org.apache.xml.resolver.apps.resolver system -s $uri | grep "Result")"        else          response="$(java org.apache.xml.resolver.apps.resolver uri -u $uri | grep "Result")"        fi        if [ "$response" ]; then          if [ "${response#*$path}" != "$response" ]; then            emit_message "  Result: $path"          else            emit_message "  Result: FAILED"          fi          echo        fi      done < $mydir/.urilist    fi  fi}# get opts and execute appropriate functioncase $1 in  *-uninstall)  uninstall $2 $3 $4  ;;  *-test)  testCatalogs  ;;  *)  main  ;;esac# Copyright# ---------# Copyright 2005-2007 Michael(tm) Smith <smith@sideshowbarker.net># # Permission is hereby granted, free of charge, to any person# obtaining a copy of this software and associated documentation# files (the "Software"), to deal in the Software without# restriction, including without limitation the rights to use, copy,# modify, merge, publish, distribute, sublicense, and/or sell copies# of the Software, and to permit persons to whom the Software is# furnished to do so, subject to the following conditions:# # The above copyright notice and this permission notice shall be# included in all copies or substantial portions of the Software.# # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER# DEALINGS IN THE SOFTWARE.# vim: number
 |