dist.sh #3

  • //
  • guest/
  • perforce_software/
  • sdp/
  • tools/
  • dist.sh
  • View
  • Commits
  • Open Download .zip Download (9 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.5
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.

	An exclusion config file defines files and directories
	to be excluded from packaging.  This exclusion config
	file has file name per line, which may include the
	'*' wild car.

	The exclusion config file can also specify
	directories to be excluded, which start with a 'D:'
	prefix.

	The exclusion config file is:
	$ExcludesCfg

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

runCmd "p4 -F %depotFile% -ztag opened ../main/..." \
   "Checking for opened files in main."

if [[ -n "$CMDOUTPUT" ]]; then
   if [[ $CMDOUTPUT == *"//"* ]]; then
      bail "These files are checked out in main:\n$CMDOUTPUT\n\nAborting."
   else
      bail "Could not determine if files are checked out in main. Output was:\n$CMDOUTPUT\n\nAborting."
   fi
else
   msg "Verified: No files checked out in SDP main."
fi

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 "/bin/rm -rf $WorkingDir" \
      "Removing old working dir [$WorkingDir]." ||\
      bail "Failed to remove old working dir [$WorkingDir]. Aborting."
fi

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

runCmd "/bin/cp -pr ${AppHome}/main $WorkingDir/sdp" \
   "Copying SDP to package working dir." 0 ||\
   bail "The copy to the working dir failed.  Aborting."

cd "$WorkingDir/sdp" || bail "Failed to cd to sdp folder in Working Dir [$WorkingDir/sdp]."

if [[ -r "$ExcludesCfg" ]]; then
   while read excludeFile; do
      if [[ "$excludeFile" == "D:"* ]]; then
         excludeDir=${excludeFile#D:}
         msg "/usr/bin/find . -type d -name \"$excludeDir\" -print -exec /bin/rm -r -f {} \\;"
         /usr/bin/find . -type d -name "$excludeDir" -print -exec /bin/rm -r -f {} \;
      else
         msg "/usr/bin/find . -type f -name \"$excludeFile\" -print -exec /bin/rm -f {} \\;"
         /usr/bin/find . -type f -name "$excludeFile" -print -exec /bin/rm -f {} \;
      fi
   done < $ExcludesCfg
fi

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

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.