| #!/usr/bin/env bash |
| |
| # Utility bash script to "strip" buildIds and version numbers out of directories and |
| # bundles names, in order to make it more meaningful to compare two "installs", |
| # or repositories. |
| # It also "unzips" any bundled jars, so subsequent "diff" commands will be |
| # comparing files to files. |
| |
| # It allows "directory" to be passed in on command line, which should the the directory |
| # that contains both "plugins" and "features" directories. Contents of those |
| # two directories will be "stripped". |
| # It leaves given input unchanged, but puts results in subdirectories of features and |
| # plugins, named "stripped". |
| |
| OUTPUT_DIR_SEGMENT="stripped" |
| DEBUG_PARSE="true" |
| DEBUG_VERBOSE_FILE_OPS="false" |
| # DEBUG function is used in abbreviated form. |
| # return 0 to have debug statements printed. |
| # non-zero (1) to not print debug statements |
| function DEBUG |
| { |
| return 1; |
| } |
| function VERBOSE |
| { |
| return 1; |
| } |
| |
| DIRNAME=$1 |
| |
| if [[ -z "${DIRNAME}" ]] |
| then |
| DIRNAME="${PWD}" |
| echo -e "\n\tDirectory not specified on command line, assuming current directory of" |
| echo -e "\t${DIRNAME}\n" |
| else |
| echo -e "\n\tDirectory specified on command line:" |
| echo -e "\t${DIRNAME}\n" |
| fi |
| |
| if [[ ! "${DIRNAME:0:1}" = "/" ]] |
| then |
| printf "\n\t%s %s\n\t%s\n\t%s\n" "DIRNAME argument, " "${DIRNAME}, " "was not absolute, so assuming it is a child of current working directory, " "${PWD}." |
| DIRNAME="${PWD}/${DIRNAME}" |
| fi |
| PLUGINS_DIR="${DIRNAME}/plugins" |
| FEATURES_DIR="${DIRNAME}/features" |
| |
| if [[ ! -e "${PLUGINS_DIR}" || ! -e "${FEATURES_DIR}" ]] |
| then |
| echo -e "\n\tERROR: 'plugins' or 'features' directory (or both) did not exist under DIRNAME." |
| echo -e "\n\t\tPlease check DIRNAME and re-enter." |
| echo -e "\n\t\tDIRNAME: \t${DIRNAME}" |
| exit 1 |
| fi |
| |
| function cleanStripped () |
| { |
| printf "\n\t%s\n" "Removing any existing directories named '${OUTPUT_DIR_SEGMENT}'; assuming left over from previous runs." |
| find $WORK_DIR -name ${OUTPUT_DIR_SEGMENT} -type d -exec rm -fr '{}' \; |
| } |
| |
| function processDirectory () |
| { |
| |
| WORK_DIR=$1 |
| if [[ ! -e "${WORK_DIR}" ]] |
| then |
| echo -e "\n\tPROGRAM ERROR: WORK_DIR did not exist, even after earlier checking?\n" |
| exit 1 |
| fi |
| |
| OUTPUTDIR="${WORK_DIR}/${OUTPUT_DIR_SEGMENT}" |
| mkdir -p "${OUTPUTDIR}" |
| DEBUG && echo "DEBUG: OUTPUTDIR: ${OUTPUTDIR}" |
| VERSION_PATTERN="(([[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+)(\.{1}([0-9A-Za-z_\-]+){1})?)" |
| NAME_PATTERN="^.*/(.*)_${VERSION_PATTERN}(\.jar)?$" |
| |
| for filename in ${WORK_DIR}/* |
| do |
| # no sense checking the literal WORK_DIR itself, |
| # just to avoid noise in log. |
| if [[ "${filename}" == "${OUTPUTDIR}" ]] |
| then |
| continue |
| fi |
| OLDFILENAME="$filename" |
| DEBUG && echo -e "DEBUG: Starting loop with ${OLDFILENAME}" |
| if [[ "${OLDFILENAME}" =~ $NAME_PATTERN ]] |
| then |
| if [[ "${DEBUG_PARSE}" == "true" ]] |
| then |
| printf "\n%s\n" "MATCH" |
| printf "\t%s\n" "${OLDFILENAME}" |
| #printf "\t%s\n\n" "${BASH_REMATCH[@]}" |
| for ((i=1; i < ${#BASH_REMATCH[*]}; i++)) |
| do |
| printf "%u \t%s\n" ${i} "${BASH_REMATCH[${i}]}" |
| done |
| fi |
| NEWFILENAME="${BASH_REMATCH[1]}${BASH_REMATCH[7]}" |
| NEWFILEBASENAME=$NEWFILENAME |
| if [[ "${NEWFILEBASENAME}" =~ ^(.*)\.jar ]] |
| then |
| NEWFILEBASENAME="${BASH_REMATCH[1]}" |
| fi |
| NEWSTRIPPEDDIR="${OUTPUTDIR}/${NEWFILEBASENAME}" |
| DEBUG && echo -e "DEBUG: will copy or unzip \n\t${OLDFILENAME} to \n\t${NEWSTRIPPEDDIR}" |
| if [[ -d ${OLDFILENAME} && ! -L "${OLDFILENAME}" ]] |
| then |
| DEBUG && echo "DEBUG: OLDFILENAME is a directory: ${OLDFILENAME}" |
| mkdir -p "${NEWSTRIPPEDDIR}" |
| DEBUG && echo "DEBUG: Made dir ${NEWSTRIPPEDDIR}" |
| R_VERBOSE= |
| if [[ "${DEBUG_VERBOSE_FILE_OPS}" == "true" ]] |
| then |
| R_VERBOSE="-v" |
| fi |
| VERBOSE && printf "\n\t%s\n\t%s\n\t%s\n\t%s\n" "copying" "${OLDFILENAME}" "to" "${NEWSTRIPPEDDIR}" |
| #remember, no quotes around options! |
| rsync -r --safe-links ${R_VERBOSE} "${OLDFILENAME}/" "${NEWSTRIPPEDDIR}/" |
| RC=$? |
| if [[ ! $RC == 0 ]] |
| then |
| echo -e "[ERROR] Return from rsync was non-zero.RC: $RC" |
| fi |
| elif [[ -f "${OLDFILENAME}" ]] |
| then |
| DEBUG && echo "DEBUG: OLDFILENAME is a file: ${OLDFILENAME}" |
| # TODO: To handle "multiples", such as org.eclipse.jdt.annotations, |
| # and remember, in some repos, may be multiples that differ only in |
| # suffix, we will add arbitrary "__1", "__2", etc., based on the order |
| # encountered on file system. (We limit it to "10" duplicates, since |
| # more than 3 or 5 is highly unlikely, and a sign of an error if there |
| # are more than that. |
| MULTIPLES_SUFFIX=1 |
| if [[ -e "${NEWSTRIPPEDDIR}" ]] |
| then |
| MULTIPLES_SUFFIX=1 |
| NEWSTRIPPEDDIR_SUFFIXED=${NEWSTRIPPEDDIR}__${MULTIPLES_SUFFIX} |
| while [[ -e "${NEWSTRIPPEDDIR_SUFFIXED}" && ${MULTIPLES_SUFFIX} -lt 10 ]] |
| do |
| ((MULTIPLES_SUFFIX++)) |
| DEBUG && echo "DEBUG: MULTIPLLES_SUFFIX INCREMENTED: ${MULTIPLES_SUFFIX}" |
| NEWSTRIPPEDDIR_SUFFIXED=${NEWSTRIPPEDDIR}__${MULTIPLES_SUFFIX} |
| done |
| NEWSTRIPPEDDIR=$NEWSTRIPPEDDIR_SUFFIXED |
| fi |
| Z_VERBOSE= |
| if [[ ! "${DEBUG_VERBOSE_FILE_OPS}" == "true" ]] |
| then |
| Z_VERBOSE="-q" |
| fi |
| VERBOSE && printf "\n\t%s\n\t%s\n\t%s\n\t%s\n" "unzipping" "${OLDFILENAME}" "to" "${NEWSTRIPPEDDIR}" |
| unzip ${Z_VERBOSE} -n "${OLDFILENAME}" -d "${NEWSTRIPPEDDIR}" |
| else |
| echo -e "A matching pattern was neither a file, nor a directory?!\n" |
| fi |
| else |
| if [[ "${DEBUG_PARSE}" == "true" ]] |
| then |
| echo -e "\nNO MATCH\n" |
| echo -e "${OLDFILENAME}\n did not match pattern of \n${NAME_PATTERN}\n" |
| fi |
| fi |
| done |
| } |
| |
| |
| # remove earlier versions of "stripped" directories |
| cleanStripped |
| |
| processDirectory "${PLUGINS_DIR}" |
| processDirectory "${FEATURES_DIR}" |