dist.sh #1

  • //
  • guest/
  • perforce_software/
  • sdp/
  • tools/
  • dist.sh
  • View
  • Commits
  • Open Download .zip Download (8 KB)
#!/bin/bash
#------------------------------------------------------------------------------
# Copyright (c) Perforce Software, Inc., 2007-2014. All rights reserved
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1  Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
# 2.  Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "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 PERFORCE
# SOFTWARE, INC. 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.
#------------------------------------------------------------------------------

#==============================================================================
# Declarations and Environment

# Allow override of P4U_HOME, which is set only when testing P4U scripts.
export P4U_HOME=${P4U_HOME:-/p4/common/bin}
export P4U_LIB=${P4U_LIB:-/p4/common/lib}
export P4U_ENV=$P4U_LIB/p4u_env.sh
export P4U_LOG="/tmp/dist.$(date +'%Y%m%d-%H%M%S').log"

# Environment isolation.  For stability and security reasons, prepend
# PATH to include dirs where known-good scripts exist.
# known/tested PATH and, by implication, executables on the PATH.
export PATH=$P4U_HOME:$PATH:~/bin:.
export P4CONFIG=${P4CONFIG:-.p4config}

[[ -r "$P4U_ENV" ]] || {
   echo -e "\nError: Cannot load environment from: $P4U_ENV\n\n"
   exit 1
}

source $P4U_ENV
source $P4U_LIB/libcore.sh
source $P4U_LIB/libp4u.sh
export VERBOSITY=3

declare Version=1.0.1
declare -i SilentMode=0
declare AppHome=${PWD%/*}
declare ExcludesCfg=$AppHome/tools/excludes.dist.cfg

#==============================================================================
# Local Functions

#------------------------------------------------------------------------------
# Function: terminate
function terminate
{
   # Disable signal trapping.
   trap - EXIT SIGINT SIGTERM

   # Don't litter.
   cleanTrash

   vvmsg "$THISSCRIPT: EXITCODE: $OverallReturnStatus"

   # Stop logging.
   [[ "${P4U_LOG}" == off ]] || stoplog

   # With the trap removed, exit.
   exit $OverallReturnStatus
}

#------------------------------------------------------------------------------
# Function: usage (required function)
#
# Input:
# $1 - style, either -h (for short form) or -man (for man-page like format).
#------------------------------------------------------------------------------
function usage
{
   declare style=${1:--h}

   echo "USAGE for $THISSCRIPT v$Version:

$THISSCRIPT [-f] [-s] [-L <log>] [-si] [-v<n>] [-n] [-D]

or

$THISSCRIPT [-h|-man]
"
   if [[ $style == -man ]]; then
      echo -e "
DESCRIPTION:
	Create an SDP distribution tar file from the latest
	files in the main branch.

	File names defined in '$ExcludesCfg'
	are excluded from the tar file.

OPTIONS:
 -f	Force creation of target tar file, replacing an existing
	one if necessary.  The default behavior is to abort if
	the target tar file already exists.

 -s	Show tar file contents using 'tar -tzf'.

 -v<n>	Set verbosity 1-5 (-v1 = quiet, -v5 = highest).

 -L <log>
	Specify the path to a log file, or the special value 'off' to disable
	logging.  By default, all output (stdout and stderr) goes to:
	$(dirname ${P4U_LOG}).

	NOTE: This script is self-logging.  That is, output displayed on the screen
	is simultaneously captured in the log file.  Do not run this script with
	redirection operators like '> log' or '2>&1', and do not use 'tee.'

-si	Operate silently.  All output (stdout and stderr) is redirected to the log
	only; no output appears on the terminal.  This cannot be used with
	'-L off'.
      
 -n	No-Op.  Prints commands instead of running them.

 -D     Set extreme debugging verbosity.

HELP OPTIONS:
 -h	Display short help message
 -man	Display man-style help message

FILES:

EXAMPLES:

SEE ALSO:
"
   fi

   exit 1
}

#==============================================================================
# Command Line Processing

declare -i shiftArgs=0
declare SDPVersion=
declare -i ForceTarCreation=0
declare -i ShowTarContents=0
declare TarFile=

set +u
while [[ $# -gt 0 ]]; do
   case $1 in
      (-f) ForceTarCreation=1;;
      (-s) ShowTarContents=1;;
      (-h) usage -h;;
      (-man) usage -man;;
      (-v1) export VERBOSITY=1;;
      (-v2) export VERBOSITY=2;;
      (-v3) export VERBOSITY=3;;
      (-v4) export VERBOSITY=4;;
      (-v5) export VERBOSITY=5;;
      (-L) export P4U_LOG=$2; shiftArgs=1;;
      (-si) SilentMode=1;;
      (-n) export NO_OP=1;;
      (-D) set -x;; # Debug; use 'set -x' mode.
      (*) usageError "Unknown arg ($1).";;
   esac

   # Shift (modify $#) the appropriate number of times.
   shift; while [[ $shiftArgs -gt 0 ]]; do
      [[ $# -eq 0 ]] && usageError "Bad usage."
      shiftArgs=$shiftArgs-1
      shift
   done
done
set -u

#==============================================================================
# Command Line Verification

[[ $SilentMode -eq 1 && $P4U_LOG == off ]] && \
   usageError "Cannot use '-si' with '-L off'."

#==============================================================================
# Main Program

trap terminate EXIT SIGINT SIGTERM

declare -i OverallReturnStatus=0

if [[ "${P4U_LOG}" != off ]]; then
   touch ${P4U_LOG} || bail "Couldn't touch log file [${P4U_LOG}]."

   # Redirect stdout and stderr to a log file.
   if [[ $SilentMode -eq 0 ]]; then
      exec > >(tee ${P4U_LOG})
      exec 2>&1
   else
      exec >${P4U_LOG}
      exec 2>&1
   fi

   initlog
fi

SDPVersion=sdp.Unix.$(cat ../main/Version|cut -d '/' -f 3).$(cat ../main/Version|cut -d '/' -f 4|cut -d ' ' -f 1)
SDPVersion=$(echo $SDPVersion)
TarFile=$AppHome/dist/$SDPVersion.tgz
WorkingDir=/tmp/$SDPVersion

msg "AH=[$AppHome] TF=[$TarFile] WD=[$WorkingDir]."

if [[ -r $TarFile ]]; then
   if [[ $ForceTarCreation -eq 1 ]]; then
      runCmd "/bin/rm -f $TarFile" \
         "Removing existing tar file [$TarFile] due to '-f'." ||\
            bail "Failed to remove existing tar file [$TarFile].  Aborting."
   else
      bail "Tar file already exists: [$TarFile].  Use '-f' to forcibly replace.  Aborting."
   fi
fi

if [[ -d "$WorkingDir" ]]; then
   runCmd "echo /bin/rm -rf $WorkingDir"
fi

runCmd "/bin/mkdir -p $WorkingDir" "Initializing working dir." 0 ||\
   bail "Failed to create working dir [$WorkingDir]. Aborting."

runCmd "/usr/bin/rsync -a --delete ${AppHome}/main/. $WorkingDir/sdp" ||\
   bail "The rsync to the working dir failed.  Aborting."

cd $WorkingDir || bail "Failed to cd to Working Dir [$WorkingDir]."

if [[ -r "$ExcludesCfg" ]]; then
   while read excludeFile; do
   msg "/usr/bin/find . -type f -name \"$excludeFile\" -exec /bin/rm -f {} \\;"
   /usr/bin/find . -type f -name "$excludeFile" -exec /bin/rm -f {} \;
   done < $ExcludesCfg
fi

runCmd "/usr/bin/tar -czf $TarFile sdp" ||\
   bail "Failed to create tar file [$TarFile]. Aborting."

if [[ $ShowTarContents -eq 1 ]]; then
   runCmd "/usr/bin/tar -tzf $TarFile" \
      "Tar file [$TarFile] contains these elements:"
fi

if [[ $OverallReturnStatus -eq 0 ]]; then
   msg "${H}\nAll processing completed successfully.\n"
else
   msg "${H}\nProcessing completed, but with errors.  Scan above output carefully.\n" 
fi

# Illustrate using $SECONDS to display runtime of a script.
msg "That took about $(($SECONDS/3600)) hours $(($SECONDS%3600/60)) minutes $(($SECONDS%60)) seconds.\n"

# See the terminate() function, which is really where this script exits.
exit $OverallReturnStatus
# Change User Description Committed
#10 16339 C. Thomas Tyler Adjusted to use 'downloads' rather than 'dist'.

Enhanced docs.

Fixed bug where script failed if 'downloads' directory
didn't already exist.

Removed '-s' (show tarfile contents) flag, and made
showing contents the default behavior (thus making it
behavve the same for UNIX/Linux and Windows, which
always shows *.zip file contents.).
#9 12391 C. Thomas Tyler Fixed cosmetic typos in comments and output.
Fixed bug that preventd proper operation of '-n' no-op mode.
Added missing reference to '-o' in usage.
#8 11526 Russell C. Jackson (Rusty) Removed p4verify.pl from common files
 Updated dist.sh to work with relative paths and removed hard coding on tar path
 Created new distribution files.
#7 11525 Russell C. Jackson (Rusty) Updated Version and Release notes.
#6 10959 C. Thomas Tyler Added check for unsync'd files.
#5 10872 C. Thomas Tyler Added Windows SDP into The Workshop:
* Combined (back) into Unix SDP structure.
* Avoided adding duplicate files p4verify.pl, p4review.(py,cfg).
* Upgraded 'dist.sh' utility to produce both Unix and Windows
packages (*.tgz and *.zip), adjusting line endings on text
files to be appropriate for Windows prior to packaging.

To Do:
* Resolve duplication of [template_]configure_new_server.bat.
* Merge test suites for Windows and Unix into a cohesive set.
#4 10753 C. Thomas Tyler Exlcuding cruft files.
#3 10751 C. Thomas Tyler More cleanup.
#2 10748 C. Thomas Tyler Added safety check for checked out files.
 Updated exlcudes.
#1 10737 C. Thomas Tyler Added helper script to create SDP distro tar file.