[dev] update_horde.sh

Marcus I. Ryan marcus@riboflavin.net
Fri, 26 Apr 2002 15:33:54 -0500


This message is in MIME format.

---------------------- multipart/mixed attachment
Sorry...old habit.  cd === chdir, at least in /bin/sh on FreeBSD.  My
guess is if you are getting a protocol error, there is a problem with
your CVS file somehow.  I believe the script assumes you have already
done the CVS login.

Not sure what to tell you other than that, except I am not, in general,
a shell programmer, and it has only been tested, as far as I'm aware, on
my machine, and yours, so if you have problems, you're pretty much on
your own :} *shrug*

Quoting Akira Kurogane <akira@kurogane.net>:

> 引用中 "Marcus I. Ryan" <marcus@riboflavin.net>:
> 
> Hello Marcus,
>    I've been eager to use this script, but in my linux distribution
> "chdir" is
> not a command line prompt (well, not from either bash or ksh), so I'm
> hitting
> errors. I tried changing it to "cd" but another error popped up
> ("Protocol
> error: data uncounted for" or something very close to that) so I
> dropped that.
> Could you possibly tell me if cd is a perfectly good substitute for
> chdir or
> where I should get chdir from?
> 
> I do appreciate the time you've taken to help out the horde
> developers, by the way.
> 
> Yours faithfully,
> 
> Akira
> 
> > #!/bin/sh
> > 
> > # This is the script I use for updating HORDE.  It does a diff
> between
> > # the active config files and the .dist files, updates horde, then
> 
> > # recopies the .dist files to make them active and tries to repatch
> them.  
> > # If the patch fails on any given file it should open your $EDITOR
> with 
> > # the .rej file and the active config file.
> > #
> > # It does all of this is a temporary directory, and keeps backup
> copies
> > # of the existing horde distribution before overwriting.  Check all
> the 
> > # settings at the top of the script for examples of defining a
> release 
> > # set to fetch, where to store files, how many backups to keep,
> etc.  
> > # NOTE: NUM_SLASHES is used to applying the patches. It should
> match the 
> > # number of directories in WEBDIR + 1 (so /usr/local/www => 
> > # NUM_SLASHES=4)
> > 
> > trim () {
> >   echo $@
> > }
> > 
> > ### MISC. OPTIONS ###
> > NUM_SLASHES=4
> > NUM_BACKUPS=5
> > 
> > ### DIRECTORIES ###
> > WEBDIR=/usr/local/www
> > BACKUPDIR=/usr/local/src
> > TMPDIR=/usr/local/src
> > 
> > ### RELEASES ###
> > RELEASES="release head"
> > 
> > # For each release, we need _dir and _ver settings
> > 
> > #This is the "array" of applications and versions to get
> > release_dir=horde
> > release_ver="
> >         horde-RELENG_2
> >         imp-RELENG_3
> >         turba-RELENG_1
> >         gollem-HEAD
> >         kronolith-RELENG_1
> >         jonah-HEAD
> >         troll-HEAD
> >         nag-RELENG_1
> >         nic-HEAD
> > "
> > release_ver=`trim ${release_ver}`
> > 
> > head_dir=horde.head
> > head_ver="
> >         horde-head
> >         imp-HEAD
> >         turba-HEAD
> >         gollem-HEAD
> >         kronolith-HEAD
> >         jonah-HEAD
> >         troll-HEAD
> >         nag-HEAD
> >         nic-HEAD
> > "
> > head_ver=`trim ${head_ver}`
> > 
> > APPVER=$head_ver
> > HORDEDIR=$head_dir
> > 
> > # check to see if any command line args are specified
> > for arg in $*
> > do
> >   name=${arg%%=*}
> >   name=${name##--}
> >   value=${arg##*=}
> >   if [ "$name" = "release" ]; then
> >     APPVER=`eval echo '$'$value'_ver'`
> >     HORDEDIR=`eval echo '$'$value'_dir'`
> >     if [ "$APPVER" = "" -o "$HORDEDIR" = "" ]; then
> >       echo "ERROR: No settings for release $value"
> >     fi
> >     continue
> >   fi
> >   echo "Unknown option $arg ('$name' = '$value')"
> >   exit 1
> > done
> > 
> > echo "Verifying distribution list"
> > if [ ! "${APPVER%%[- ]*}" = "horde" ]; then
> >   echo "  horde MUST be the first item in the APPVER list!"
> >   exit 1
> > fi
> > 
> > echo "Determining temporary directory..."
> > EXISTS=`ls -d ${TMPDIR}/${HORDEDIR}.TMP.[0-9]* | head -1`
> > TMPDIR="${TMPDIR}/${HORDEDIR}.TMP.$$"
> > 
> > if [ ! -z ${EXISTS} ]; then
> >   echo "  Found an existing (aborted?) update of horde
> (${EXISTS})."
> >   read -p "  Should I use it? [Yes]" USE_EXISTING
> >   case ${USE_EXISTING} in
> >   [Nn]|[Nn][Oo])
> >     read -p "  Should I delete ${EXISTS}? [Yes]" DELETE_EXISTING
> >     case ${DELETE_EXISTING} in
> >     [Nn]|[Nn][Oo])
> >       echo "    Not deleting ${EXISTS}"
> >       ;;
> >     *)
> >       echo "    Deleting ${EXISTS}"
> >       rm -rf ${EXISTS}
> >       ;;
> >     esac
> >     ;;
> >   *)
> >     TMPDIR=${EXISTS}
> >     ;;
> >   esac
> >   unset USE_EXISTING
> > fi
> > if [ -e ${TMPDIR} ]; then
> >   echo "  Using ${TMPDIR}"
> > else
> >   echo "  Creating new directory ${TMPDIR}"
> >   mkdir ${TMPDIR}
> >   if [ ! -e ${TMPDIR} ]; then
> >     echo "ERROR: Couldn't create ${TMPDIR}"
> >     exit 1
> >   fi
> > fi
> > 
> > echo "Creating config patch file from existing horde"
> > if [ -e ${TMPDIR}/update.patch ]; then
> >   read -p "  This directory includes a patch. Use it? [Yes]"
> USE_EXISTING
> >   case ${USE_EXISTING} in
> >   [Nn]|[Nn][Oo])
> >     echo "  Clearing existing update.patch"
> >     rm -f ${TMPDIR}/update.patch || exit 1
> >     ;;
> >   esac
> >   unset USE_EXISTING
> > fi
> > if [ ! -e ${TMPDIR}/update.patch ]; then
> >   if [ ! -e ${WEBDIR}/${HORDEDIR} ]; then
> >     echo "  No existing horde distribution found.  Can't create
> patch."
> >   else
> >     read -p "  Do you want to create a patch from the existing
> install?
> > [Yes]" MAKE_PATCH
> >     case ${MAKE_PATCH} in
> >     [Nn]|[Nn][Oo])
> >       echo "  Not creating a patch"
> >       ;;
> >     *)
> >       echo "  Creating patch...this could take a bit..."
> >       find ${WEBDIR}/${HORDEDIR} -type f -name \*.dist -print \
> >        | perl -ne 's/\.dist[\r\n]*//; print "$_.dist\n$_\n";' \
> >        | xargs -n 2 diff -u > ${TMPDIR}/update.patch
> >       ;;
> >     esac
> >     unset MAKE_PATCH
> >   fi
> 
> > fi
> > 
> > if [ -e "${WEBDIR}/${HORDEDIR}" ]; then
> >   read -p "Do you want to fetch new (N) or update (U)? [U] "
> FETCH_NEW
> > else
> >   FETCH_NEW=new
> > fi
> > 
> > case ${FETCH_NEW} in
> >   [Nn]|[Nn][Ee][Ww])
> >     for APP in ${APPVER}
> >     {
> >       app=${APP%%-*}
> >       rel=${APP##*-}
> >       if [ ${app} = ${APP} ]; then
> >         echo "  No release specified...assuming HEAD"
> >         rel=HEAD
> >       fi
> > 
> >       case ${app} in
> >         horde)
> >           APPDIR=${TMPDIR}
> >           ;;
> >         *)
> >           APPDIR=${TMPDIR}/${HORDEDIR}
> >           ;;
> >       esac
> > 
> >       if [ -e ${APPDIR}/${app} ]; then
> >         case ${REGET} in
> >         [Aa]|[Aa][Ll][Ll])
> >           echo "  Removing existing ${APPDIR}/${app}...";
> >           rm -rf ${APPDIR}/${app}
> >           echo "  Retrieving ${app} $rel..."
> >           chdir ${APPDIR}
> >           cvs -Q -z3 -d
> :pserver:cvsread@anoncvs.horde.org:/repository co \
> >            -r $rel ${app}
> >           ;;
> >         [Nn][Oo][Nn][Ee])
> >           REGET="NONE"
> >           echo "  Using existing ${APPDIR}/${app}"
> >           ;;
> >         *)
> >           echo "  ${app} exists. Should I get ${app} anyway?"
> >           if [ "${app}" = "horde" ]; then
> >             echo "  NOTE: regetting horde does not clear out any
> > existing files"
> >           fi
> >           read -p "   [Y]es/[N]o/[A]ll/None (default None): "
> REGET
> >           case ${REGET} in
> >           [Yy]|[Yy][Ee][Ss]|[Aa]|[Aa][Ll][Ll])
> >             echo "  Removing existing ${APPDIR}/${app}...";
> >             rm -rf ${APPDIR}/${app}
> >             echo "  Retrieving ${app} $rel..."
> >             chdir ${APPDIR}
> >             cvs -Q -z3 -d
> :pserver:cvsread@anoncvs.horde.org:/repository
> > co \
> >              -r $rel ${app}
> >             ;;
> >           [Nn]|[Nn][Oo])
> >             echo "  Using existing ${APPDIR}/${app}"
> >             ;;
> >           *)
> >             echo "  Using existing ${APPDIR}/${app}"
> >             REGET=NONE
> >             ;;
> >           esac
> >           ;;
> >         esac
> >       else
> >         echo "  Retrieving ${app} $rel..."
> >         chdir ${APPDIR}
> >         cvs -Q -z3 -d
> :pserver:cvsread@anoncvs.horde.org:/repository co \
> >          -r $rel ${app}
> >       fi
> >       if [ "$app" = "horde" ]; then
> >         mv ${TMPDIR}/horde ${TMPDIR}/${HORDEDIR}
> >       fi
> >     }
> >     ;;
> >   *)
> >     mkdir ${TMPDIR}/${HORDEDIR}
> >     cp -Rpf ${WEBDIR}/${HORDEDIR}/* ${TMPDIR}/${HORDEDIR}
> >     cd ${TMPDIR}/${HORDEDIR}
> >     cvs update -PdC
> >     ;;
> > esac
> > 
> > echo "Putting default config files in place..."
> > if [ -e ${TMPDIR}/${HORDEDIR}/config/horde.php ]; then
> >   echo "  I have found some configuration files already in
> place."
> >   echo "  NOTE: If some have been copied and others not, horde will
> be
> > broken."
> >   read -p "   Should I copy .dist files anyway? [No] "
> USE_EXISTING
> >   #The phrasing of the question means USE_EXISTING from the read
> is
> > backwards
> >   # but it seems better to confuse the programmer than the
> user...
> >   case ${USE_EXISTING} in
> >   [Yy]|[Yy][Ee][Ss])
> >     USE_EXISTING=NO
> >     ;;
> >   *)
> >     USE_EXISTING=YES
> >     ;;
> >   esac
> > fi
> > if [ "${USE_EXISTING:=NO}" = "NO" ]; then
> >   echo "  Copying *.dist files..."
> >   find ${TMPDIR}/${HORDEDIR} -type f -name \*.dist -print \
> >    | perl -ne 'print "$_"; s/\.dist//; print "$_"' \
> >    | xargs -n 2 cp
> > fi
> > 
> > echo "Applying patch..."
> > echo "  Clearing out any old reject files..."
> > find ${TMPDIR} -name \*.rej -type f -exec rm {} \; -print
> > 
> > if [ ! -e ${TMPDIR}/update.patch ]; then
> >   echo "  I can't seem to find the patch file
> ${TMPDIR}/update.patch!"
> >   read -p "  Do you want me to load all config files in $EDITOR?
> [No]" EDIT
> >   case ${EDIT} in
> >   [Yy]|[Yy][Ee][Ss])
> >     find ${TMPDIR}/${HORDEDIR} -type f -name \*.dist \
> >      | perl -ne 's/\.dist[\r\n]*//; print "$_\n";' \
> >      | xargs -n 2 echo $EDITOR > ${TMPDIR}/edit.sh
> >     sh ${TMPDIR}/edit.sh
> >     rm ${TMPDIR}/edit.sh
> >     ;;
> >   *)
> >     echo "  WARNING: You need to change the config files later!"
> >     ;;
> >   esac
> > else
> >   if [ "${USE_EXISTING}" = "YES" ]; then
> >     echo "  We kept the modified configuration files."
> >     read -p "  Should we still apply the patch? [No] " PATCH
> >     case ${PATCH} in
> >     [Yy]|[Yy][Ee][Ss])
> >       PATCH=YES
> >       ;;
> >     *)
> >       PATCH=NO
> >       ;;
> >     esac
> >   fi
> > 
> >   if [ "${PATCH:=YES}" = "YES" ]; then
> >     echo "  running patch"
> >     chdir ${TMPDIR}
> >     if [ `patch -f -p${NUM_SLASHES} -s < ${TMPDIR}/update.patch` ];
> then
> >       echo "  Patch applied successfully"
> >     else
> >       find ${TMPDIR}/${HORDEDIR} -type f -name \*.rej \
> >        | perl -ne 's/\.rej[\r\n]*//; print "$_.rej\n$_\n"; ' \
> >        | xargs -n 2 echo $EDITOR > ${TMPDIR}/edit.sh
> >       sh ${TMPDIR}/edit.sh
> >       rm ${TMPDIR}/edit.sh
> >     fi
> >   fi
> > fi
> > 
> > read -p "Are you ready to put the new CVS into production? [Yes]"
> PROD
> > case ${PROD} in
> > [Nn]|[Nn][Oo])
> >   echo "${TMPDIR} has not been put in production."
> >   ;;
> > *)
> >   if [ -e ${WEBDIR}/${HORDEDIR} ]; then
> >     i=1
> >     while [ ${i} != ${NUM_BACKUPS} ]
> >     do
> >       if [ ! -e ${BACKUPDIR}/${HORDEDIR}.${i} ]; then
> >         break;
> >       fi
> >       i=$((${i}+1))
> >     done
> > 
> >     if [ ${i} = ${NUM_BACKUPS} ] && [ -e
> ${BACKUPDIR}/${HORDEDIR}.${i}
> > ]; then
> >       echo "  Removing oldest backup directory
> > (${BACKUPDIR}/${HORDEDIR}.${i})"
> >       rm -rf ${BACKUPDIR}/${HORDEDIR}.${i} || exit 1
> >     fi
> > 
> >     while [ ${i} != 1 ]
> >     do
> >       echo "  Moving ${BACKUPDIR}/${HORDEDIR}.$((${i}-1)) to
> > ${BACKUPDIR}/${HORDEDIR}.${i}"
> >       mv ${BACKUPDIR}/${HORDEDIR}.$((${i}-1))
> > ${BACKUPDIR}/${HORDEDIR}.${i} || exit 1
> >       i=$((${i}-1))
> >     done
> > 
> >     echo "  Moving ${WEBDIR}/${HORDEDIR} to
> ${BACKUPDIR}/${HORDEDIR}.1"
> >     mv ${WEBDIR}/${HORDEDIR} ${BACKUPDIR}/${HORDEDIR}.1 || exit 1
> > 
> >     echo "  Moving ${TMPDIR}/${HORDEDIR} ${WEBDIR}/${HORDEDIR}"
> >     mv ${TMPDIR}/${HORDEDIR} ${WEBDIR}/${HORDEDIR} || exit 1
> > 
> >     echo "  Removing ${TMPDIR}"
> >     rm -rf ${TMPDIR}
> > 
> >     echo "New CVS horde is now in production!"
> >   else
> >     echo "${WEBDIR}/${HORDEDIR} does not exist.  Copying
> > ${TMPDIR}/${HORDEDIR} to ${WEBDIR}/${HORDEDIR}"
> >     cp ${TMPDIR}/${HORDEDIR} ${WEBDIR}/${HORDEDIR}
> >   fi
> >   ;;
> > esac
> > 
> > 
> > -- 
> > Marcus I. Ryan, marcus@riboflavin.net
> >
> -----------------------------------------------------------------------
> >  "Love is a snowmobile racing across the tundra and then suddenly
> it
> >  flips over, pinning you underneath.  At night, the ice weasels
> come."
> >                  -- Matt Groening
> >
> -----------------------------------------------------------------------
> > 
> > -- 
> > Horde Developers mailing list: http://horde.org/
> > Frequently Asked Questions: http://horde.org/faq/
> > To unsubscribe, mail: dev-unsubscribe@lists.horde.org
> > 
> 
> 
> 
> 
> -------------------------------------------------
> >From Kurogane.net
> 
> -- 
> Horde developers mailing list
> Frequently Asked Questions: http://horde.org/faq/
> To unsubscribe, mail: dev-unsubscribe@lists.horde.org
> 


-- 
Marcus I. Ryan, marcus@riboflavin.net
-----------------------------------------------------------------------
 "Love is a snowmobile racing across the tundra and then suddenly it
 flips over, pinning you underneath.  At night, the ice weasels come."
                 -- Matt Groening
-----------------------------------------------------------------------

---------------------- multipart/mixed attachment
A non-text attachment was scrubbed...
Name: PGP Public Key
Type: application/pgp-keys
Size: 995 bytes
Desc: not available
Url : http://lists.horde.org/archives/dev/attachments/eef21c9d/PGPPublicKey.bin

---------------------- multipart/mixed attachment--