9f9230833b50b8271840dc2c12bd1e94d9df7d12Alexander Pyhalov#!@PYTHON@
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# CDDL HEADER START
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# The contents of this file are subject to the terms of the
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Common Development and Distribution License (the "License").
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# You may not use this file except in compliance with the License.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# or http://www.opensolaris.org/os/licensing.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# See the License for the specific language governing permissions
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# and limitations under the License.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# When distributing Covered Code, include this CDDL HEADER in each
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# If applicable, add the following below this CDDL HEADER, with the
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# fields enclosed by brackets "[]" replaced with your own identifying
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# information: Portions Copyright [yyyy] [name of copyright owner]
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# CDDL HEADER END
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# wsdiff(1) is a tool that can be used to determine which compiled objects
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# have changed as a result of a given source change. Developers backporting
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# new features, RFEs and bug fixes need to be able to identify the set of
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# patch deliverables necessary for feature/fix realization on a patched system.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# The tool works by comparing objects in two trees/proto areas (one build with,
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# and without the source changes.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Using wsdiff(1) is fairly simple:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# - Bringover to a fresh workspace
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# - Perform a full non-debug build (clobber if workspace isn't fresh)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# - Move the proto area aside, call it proto.old, or something.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# - Integrate your changes to the workspace
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# - Perform another full non-debug clobber build.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# - Use wsdiff(1) to see what changed:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# $ wsdiff proto.old proto
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# By default, wsdiff will print the list of changed objects / deliverables to
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# stdout. If a results file is specified via -r, the list of differing objects,
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# and details about why wsdiff(1) thinks they are different will be logged to
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# the results file.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# By invoking nightly(1) with the -w option to NIGHTLY_FLAGS, nightly(1) will use
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# wsdiff(1) to report on what objects changed since the last build.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# For patch deliverable purposes, it's advised to have nightly do a clobber,
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# non-debug build.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Think about the results. Was something flagged that you don't expect? Go look
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# at the results file to see details about the differences.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Use the -i option in conjunction with -v and -V to dive deeper and have wsdiff(1)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# report with more verbosity.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Usage: wsdiff [-vVt] [-r results ] [-i filelist ] old new
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Where "old" is the path to the proto area build without the changes, and
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# "new" is the path to the proto area built with the changes. The following
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# options are supported:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# -v Do not truncate observed diffs in results
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# -V Log *all* ELF sect diffs vs. logging the first diff found
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# -t Use onbld tools in $SRC/tools
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# -r Log results and observed differences
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# -i Tell wsdiff which objects to compare via an input file list
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotalimport datetime, fnmatch, getopt, os, profile, commands
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotalimport re, resource, select, shutil, signal, string, struct, sys, tempfile
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotalimport time, threading
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxefrom stat import *
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Human readable diffs truncated by default if longer than this
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Specifying -v on the command line will override
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxediffs_sz_thresh = 4096
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal# Lock name Provides exclusive access to
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal# --------------+------------------------------------------------
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal# output_lock standard output or temporary file (difference())
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal# log_lock the results file (log_difference())
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal# wset_lock changedFiles list (workerThread())
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotaloutput_lock = threading.Lock()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotallog_lock = threading.Lock()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotalwset_lock = threading.Lock()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal# Variable for thread control
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotalkeep_processing = True
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Default search path for wsdiff
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxewsdiff_path = [ "/usr/bin",
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe "/usr/ccs/bin",
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe "/lib/svc/bin",
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe "/opt/onbld/bin" ]
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# These are objects that wsdiff will notice look different, but will not report.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Existence of an exceptions list, and adding things here is *dangerous*,
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# and therefore the *only* reasons why anything would be listed here is because
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# the objects do not build deterministically, yet we *cannot* fix this.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# These perl libraries use __DATE__ and therefore always look different.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Ideally, we would purge use the use of __DATE__ from the source, but because
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# this is source we wish to distribute with Solaris "unchanged", we cannot modify.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxewsdiff_exceptions = [ "usr/perl5/5.8.4/lib/sun4-solaris-64int/CORE/libperl.so.1",
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe "usr/perl5/5.6.1/lib/sun4-solaris-64int/CORE/libperl.so.1",
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe "usr/perl5/5.8.4/lib/i86pc-solaris-64int/CORE/libperl.so.1",
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe "usr/perl5/5.6.1/lib/i86pc-solaris-64int/CORE/libperl.so.1"
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ]
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#####
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Logging routines
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal# Debug message to be printed to the screen, and the log file
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotaldef debug(msg) :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # Add prefix to highlight debugging message
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal msg = "## " + msg
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal if debugon :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal output_lock.acquire()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal print >> sys.stdout, msg
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal sys.stdout.flush()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal output_lock.release()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal if logging :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal log_lock.acquire()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal print >> log, msg
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal log.flush()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal log_lock.release()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Informational message to be printed to the screen, and the log file
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef info(msg) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal output_lock.acquire()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe print >> sys.stdout, msg
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal sys.stdout.flush()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal output_lock.release()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if logging :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal log_lock.acquire()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe print >> log, msg
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal log.flush()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal log_lock.release()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Error message to be printed to the screen, and the log file
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef error(msg) :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal output_lock.acquire()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe print >> sys.stderr, "ERROR:", msg
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe sys.stderr.flush()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal output_lock.release()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if logging :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal log_lock.acquire()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe print >> log, "ERROR:", msg
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe log.flush()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal log_lock.release()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Informational message to be printed only to the log, if there is one.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef v_info(msg) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if logging :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal log_lock.acquire()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe print >> log, msg
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe log.flush()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal log_lock.release()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Flag a detected file difference
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Display the fileName to stdout, and log the difference
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef difference(f, dtype, diffs) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if f in wsdiff_exceptions :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal output_lock.acquire()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal if sorted :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal differentFiles.append(f)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal else:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal print >> sys.stdout, f
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal sys.stdout.flush()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal output_lock.release()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe log_difference(f, dtype, diffs)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Do the actual logging of the difference to the results file
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef log_difference(f, dtype, diffs) :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if logging :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal log_lock.acquire()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe print >> log, f
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe print >> log, "NOTE:", dtype, "difference detected."
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe difflen = len(diffs)
e7aca7349385967a98ed221ad54db99998d477e8Richard Lowe if difflen > 0 :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe print >> log
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if not vdiffs and difflen > diffs_sz_thresh :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe print >> log, diffs[:diffs_sz_thresh]
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe print >> log, \
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe "... truncated due to length: " \
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe "use -v to override ..."
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe else :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe print >> log, diffs
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe print >> log, "\n"
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe log.flush()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal log_lock.release()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#####
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# diff generating routines
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Return human readable diffs from two temporary files
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef diffFileData(tmpf1, tmpf2) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal binaries = False
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Filter the data through od(1) if the data is detected
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # as being binary
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if isBinary(tmpf1) or isBinary(tmpf2) :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal binaries = True
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe tmp_od1 = tmpf1 + ".od"
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe tmp_od2 = tmpf2 + ".od"
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cmd = od_cmd + " -c -t x4" + " " + tmpf1 + " > " + tmp_od1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe os.system(cmd)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cmd = od_cmd + " -c -t x4" + " " + tmpf2 + " > " + tmp_od2
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe os.system(cmd)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe tmpf1 = tmp_od1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe tmpf2 = tmp_od2
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal try:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal data = commands.getoutput(diff_cmd + " " + tmpf1 + " " + tmpf2)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # Remove the temp files as we no longer need them.
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal if binaries :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal try:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal os.unlink(tmp_od1)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal except OSError, e:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal error("diffFileData: unlink failed %s" % e)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal try:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal os.unlink(tmp_od2)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal except OSError, e:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal error("diffFileData: unlink failed %s" % e)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal except:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal error("failed to get output of command: " + diff_cmd + " " \
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal + tmpf1 + " " + tmpf2)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # Send exception for the failed command up
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal raise
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal return
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return data
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Return human readable diffs betweeen two datasets
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotaldef diffData(base, ptch, d1, d2) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal t = threading.currentThread()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal tmpFile1 = tmpDir1 + os.path.basename(base) + t.getName()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal tmpFile2 = tmpDir2 + os.path.basename(ptch) + t.getName()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe try:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fd1 = open(tmpFile1, "w")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe except:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe error("failed to open: " + tmpFile1)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cleanup(1)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe try:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fd2 = open(tmpFile2, "w")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe except:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe error("failed to open: " + tmpFile2)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cleanup(1)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fd1.write(d1)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fd2.write(d2)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fd1.close()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fd2.close()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return diffFileData(tmpFile1, tmpFile2)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#####
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Misc utility functions
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Prune off the leading prefix from string s
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef str_prefix_trunc(s, prefix) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe snipLen = len(prefix)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return s[snipLen:]
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Prune off leading proto path goo (if there is one) to yield
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# the deliverable's eventual path relative to root
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# e.g. proto.base/root_sparc/usr/src/cmd/prstat => usr/src/cmd/prstat
e7aca7349385967a98ed221ad54db99998d477e8Richard Lowe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef fnFormat(fn) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe root_arch_str = "root_" + arch
e7aca7349385967a98ed221ad54db99998d477e8Richard Lowe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe pos = fn.find(root_arch_str)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if pos == -1 :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return fn
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe pos = fn.find("/", pos)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if pos == -1 :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return fn
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return fn[pos + 1:]
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#####
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Usage / argument processing
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Display usage message
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef usage() :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe sys.stdout.flush()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal print >> sys.stderr, """Usage: wsdiff [-dvVst] [-r results ] [-i filelist ] old new
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal -d Print debug messages about the progress
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe -v Do not truncate observed diffs in results
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe -V Log *all* ELF sect diffs vs. logging the first diff found
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe -t Use onbld tools in $SRC/tools
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe -r Log results and observed differences
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal -s Produce sorted list of differences
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe -i Tell wsdiff which objects to compare via an input file list"""
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe sys.exit(1)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Process command line options
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef args() :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal global debugon
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe global logging
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe global vdiffs
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe global reportAllSects
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal global sorted
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal validOpts = 'di:r:vVst?'
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe baseRoot = ""
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ptchRoot = ""
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fileNamesFile = ""
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe results = ""
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe localTools = False
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # getopt.getopt() returns:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # an option/value tuple
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # a list of remaining non-option arguments
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe #
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # A correct wsdiff invocation will have exactly two non option
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # arguments, the paths to the base (old), ptch (new) proto areas
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe try:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe optlist, args = getopt.getopt(sys.argv[1:], validOpts)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe except getopt.error, val:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe usage()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if len(args) != 2 :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe usage();
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe for opt,val in optlist :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal if opt == '-d' :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal debugon = True
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal elif opt == '-i' :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fileNamesFile = val
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe elif opt == '-r' :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe results = val
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe logging = True
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal elif opt == '-s' :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal sorted = True
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe elif opt == '-v' :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe vdiffs = True
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe elif opt == '-V' :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe reportAllSects = True
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe elif opt == '-t':
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe localTools = True
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe else:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe usage()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe baseRoot = args[0]
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ptchRoot = args[1]
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if len(baseRoot) == 0 or len(ptchRoot) == 0 :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe usage()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if logging and len(results) == 0 :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe usage()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if vdiffs and not logging :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe error("The -v option requires a results file (-r)")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe sys.exit(1)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if reportAllSects and not logging :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe error("The -V option requires a results file (-r)")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe sys.exit(1)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # alphabetical order
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return baseRoot, fileNamesFile, localTools, ptchRoot, results
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#####
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# File identification
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Identify the file type.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# If it's not ELF, use the file extension to identify
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# certain file types that require special handling to
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# compare. Otherwise just return a basic "ASCII" type.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef getTheFileType(f) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe extensions = { 'a' : 'ELF Object Archive',
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe 'jar' : 'Java Archive',
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe 'html' : 'HTML',
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe 'ln' : 'Lint Library',
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe 'db' : 'Sqlite Database' }
e7aca7349385967a98ed221ad54db99998d477e8Richard Lowe
619b4598e0f434792bdadf91cc947739dc734758rotondo try:
619b4598e0f434792bdadf91cc947739dc734758rotondo if os.stat(f)[ST_SIZE] == 0 :
619b4598e0f434792bdadf91cc947739dc734758rotondo return 'ASCII'
619b4598e0f434792bdadf91cc947739dc734758rotondo except:
619b4598e0f434792bdadf91cc947739dc734758rotondo error("failed to stat " + f)
619b4598e0f434792bdadf91cc947739dc734758rotondo return 'Error'
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if isELF(f) == 1 :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 'ELF'
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fnamelist = f.split('.')
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if len(fnamelist) > 1 : # Test the file extension
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe extension = fnamelist[-1]
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if extension in extensions.keys():
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return extensions[extension]
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 'ASCII'
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Return non-zero if "f" is an ELF file
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxeelfmagic = '\177ELF'
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef isELF(f) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe try:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fd = open(f)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe except:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe error("failed to open: " + f)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 0
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe magic = fd.read(len(elfmagic))
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fd.close()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if magic == elfmagic :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 0
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Return non-zero is "f" is binary.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Consider the file to be binary if it contains any null characters
e7aca7349385967a98ed221ad54db99998d477e8Richard Lowe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef isBinary(f) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe try:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fd = open(f)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe except:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe error("failed to open: " + f)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 0
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe s = fd.read()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fd.close()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if s.find('\0') == -1 :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 0
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe else :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#####
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Directory traversal and file finding
e7aca7349385967a98ed221ad54db99998d477e8Richard Lowe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Return a sorted list of files found under the specified directory
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef findFiles(d) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe for path, subdirs, files in os.walk(d) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe files.sort()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe for name in files :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe yield os.path.join(path, name)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Examine all files in base, ptch
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Return a list of files appearing in both proto areas,
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# a list of new files (files found only in ptch) and
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# a list of deleted files (files found only in base)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef protoCatalog(base, ptch) :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe compFiles = [] # List of files in both proto areas
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ptchList = [] # List of file in patch proto area
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe newFiles = [] # New files detected
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe deletedFiles = [] # Deleted files
e7aca7349385967a98ed221ad54db99998d477e8Richard Lowe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal debug("Getting the list of files in the base area");
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe baseFilesList = list(findFiles(base))
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe baseStringLength = len(base)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal debug("Found " + str(len(baseFilesList)) + " files")
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal debug("Getting the list of files in the patch area");
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ptchFilesList = list(findFiles(ptch))
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ptchStringLength = len(ptch)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal debug("Found " + str(len(ptchFilesList)) + " files")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Inventory files in the base proto area
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal debug("Determining the list of regular files in the base area");
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe for fn in baseFilesList :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if os.path.islink(fn) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe continue
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fileName = fn[baseStringLength:]
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe compFiles.append(fileName)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal debug("Found " + str(len(compFiles)) + " files")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Inventory files in the patch proto area
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal debug("Determining the list of regular files in the patch area");
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe for fn in ptchFilesList :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if os.path.islink(fn) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe continue
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fileName = fn[ptchStringLength:]
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ptchList.append(fileName)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal debug("Found " + str(len(ptchList)) + " files")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Deleted files appear in the base area, but not the patch area
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal debug("Searching for deleted files by comparing the lists")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe for fileName in compFiles :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if not fileName in ptchList :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe deletedFiles.append(fileName)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal debug("Found " + str(len(deletedFiles)) + " deleted files")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Eliminate "deleted" files from the list of objects appearing
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # in both the base and patch proto areas
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal debug("Eliminating deleted files from the list of objects")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe for fileName in deletedFiles :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe try:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe compFiles.remove(fileName)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe except:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe error("filelist.remove() failed")
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal debug("List for comparison reduced to " + str(len(compFiles)) \
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal + " files")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # New files appear in the patch area, but not the base
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal debug("Getting the list of newly added files")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe for fileName in ptchList :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if not fileName in compFiles :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe newFiles.append(fileName)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal debug("Found " + str(len(newFiles)) + " new files")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return compFiles, newFiles, deletedFiles
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Examine the files listed in the input file list
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Return a list of files appearing in both proto areas,
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# a list of new files (files found only in ptch) and
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# a list of deleted files (files found only in base)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef flistCatalog(base, ptch, flist) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe compFiles = [] # List of files in both proto areas
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe newFiles = [] # New files detected
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe deletedFiles = [] # Deleted files
e7aca7349385967a98ed221ad54db99998d477e8Richard Lowe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe try:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fd = open(flist, "r")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe except:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe error("could not open: " + flist)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cleanup(1)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe files = []
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe files = fd.readlines()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal fd.close()
e7aca7349385967a98ed221ad54db99998d477e8Richard Lowe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe for f in files :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ptch_present = True
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe base_present = True
e7aca7349385967a98ed221ad54db99998d477e8Richard Lowe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if f == '\n' :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe continue
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # the fileNames have a trailing '\n'
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe f = f.rstrip()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # The objects in the file list have paths relative
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # to $ROOT or to the base/ptch directory specified on
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # the command line.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # If it's relative to $ROOT, we'll need to add back the
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # root_`uname -p` goo we stripped off in fnFormat()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if os.path.exists(base + f) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fn = f;
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe elif os.path.exists(base + "root_" + arch + "/" + f) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fn = "root_" + arch + "/" + f
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe else :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe base_present = False
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if base_present :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if not os.path.exists(ptch + fn) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ptch_present = False
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe else :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if os.path.exists(ptch + f) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fn = f
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe elif os.path.exists(ptch + "root_" + arch + "/" + f) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fn = "root_" + arch + "/" + f
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe else :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ptch_present = False
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if os.path.islink(base + fn) : # ignore links
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe base_present = False
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if os.path.islink(ptch + fn) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ptch_present = False
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if base_present and ptch_present :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe compFiles.append(fn)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe elif base_present :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe deletedFiles.append(fn)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe elif ptch_present :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe newFiles.append(fn)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe else :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal if os.path.islink(base + fn) and \
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal os.path.islink(ptch + fn) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe continue
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal error(f + " in file list, but not in either tree. " + \
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal "Skipping...")
e7aca7349385967a98ed221ad54db99998d477e8Richard Lowe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return compFiles, newFiles, deletedFiles
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Build a fully qualified path to an external tool/utility.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Consider the default system locations. For onbld tools, if
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# the -t option was specified, we'll try to use built tools in $SRC tools,
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# and otherwise, we'll fall back on /opt/onbld/
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef find_tool(tool) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # First, check what was passed
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if os.path.exists(tool) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return tool
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Next try in wsdiff path
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe for pdir in wsdiff_path :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe location = pdir + "/" + tool
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if os.path.exists(location) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return location + " "
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe location = pdir + "/" + arch + "/" + tool
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if os.path.exists(location) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return location + " "
e7aca7349385967a98ed221ad54db99998d477e8Richard Lowe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe error("Could not find path to: " + tool);
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe sys.exit(1);
e7aca7349385967a98ed221ad54db99998d477e8Richard Lowe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#####
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# ELF file comparison helper routines
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Return a dictionary of ELF section types keyed by section name
e7aca7349385967a98ed221ad54db99998d477e8Richard Lowe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef get_elfheader(f) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe header = {}
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe hstring = commands.getoutput(elfdump_cmd + " -c " + f)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if len(hstring) == 0 :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe error("Failed to dump ELF header for " + f)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal raise
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # elfdump(1) dumps the section headers with the section name
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # following "sh_name:", and the section type following "sh_type:"
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe sections = hstring.split("Section Header")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe for sect in sections :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe datap = sect.find("sh_name:");
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if datap == -1 :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe continue
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe section = sect[datap:].split()[1]
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe datap = sect.find("sh_type:");
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if datap == -1 :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe error("Could not get type for sect: " + section + \
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe " in " + f)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe sh_type = sect[datap:].split()[2]
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe header[section] = sh_type
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return header
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Extract data in the specified ELF section from the given file
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef extract_elf_section(f, section) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe data = commands.getoutput(dump_cmd + " -sn " + section + " " + f)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if len(data) == 0 :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal error(dump_cmd + "yielded no data on section " + section + \
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal " of " + f)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal raise
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # dump(1) displays the file name to start...
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # get past it to the data itself
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe dbegin = data.find(":") + 1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe data = data[dbegin:];
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return (data)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Return a (hopefully meaningful) human readable set of diffs
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# for the specified ELF section between f1 and f2
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Depending on the section, various means for dumping and diffing
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# the data may be employed.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxetext_sections = [ '.text', '.init', '.fini' ]
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef diff_elf_section(f1, f2, section, sh_type) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal t = threading.currentThread()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal tmpFile1 = tmpDir1 + os.path.basename(f1) + t.getName()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal tmpFile2 = tmpDir2 + os.path.basename(f2) + t.getName()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if (sh_type == "SHT_RELA") : # sh_type == SHT_RELA
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cmd1 = elfdump_cmd + " -r " + f1 + " > " + tmpFile1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cmd2 = elfdump_cmd + " -r " + f2 + " > " + tmpFile2
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe elif (section == ".group") :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cmd1 = elfdump_cmd + " -g " + f1 + " > " + tmpFile1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cmd2 = elfdump_cmd + " -g " + f2 + " > " + tmpFile2
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe elif (section == ".hash") :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cmd1 = elfdump_cmd + " -h " + f1 + " > " + tmpFile1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cmd2 = elfdump_cmd + " -h " + f2 + " > " + tmpFile2
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe elif (section == ".dynamic") :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cmd1 = elfdump_cmd + " -d " + f1 + " > " + tmpFile1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cmd2 = elfdump_cmd + " -d " + f2 + " > " + tmpFile2
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe elif (section == ".got") :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cmd1 = elfdump_cmd + " -G " + f1 + " > " + tmpFile1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cmd2 = elfdump_cmd + " -G " + f2 + " > " + tmpFile2
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe elif (section == ".SUNW_cap") :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cmd1 = elfdump_cmd + " -H " + f1 + " > " + tmpFile1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cmd2 = elfdump_cmd + " -H " + f2 + " > " + tmpFile2
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe elif (section == ".interp") :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cmd1 = elfdump_cmd + " -i " + f1 + " > " + tmpFile1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cmd2 = elfdump_cmd + " -i " + f2 + " > " + tmpFile2
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe elif (section == ".symtab" or section == ".dynsym") :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal cmd1 = elfdump_cmd + " -s -N " + section + " " + f1 + \
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal " > " + tmpFile1
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal cmd2 = elfdump_cmd + " -s -N " + section + " " + f2 + \
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal " > " + tmpFile2
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe elif (section in text_sections) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # dis sometimes complains when it hits something it doesn't
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # know how to disassemble. Just ignore it, as the output
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # being generated here is human readable, and we've already
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # correctly flagged the difference.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cmd1 = dis_cmd + " -t " + section + " " + f1 + \
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe " 2>/dev/null | grep -v disassembly > " + tmpFile1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cmd2 = dis_cmd + " -t " + section + " " + f2 + \
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe " 2>/dev/null | grep -v disassembly > " + tmpFile2
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe else :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cmd1 = elfdump_cmd + " -w " + tmpFile1 + " -N " + \
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe section + " " + f1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cmd2 = elfdump_cmd + " -w " + tmpFile2 + " -N " + \
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe section + " " + f2
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe os.system(cmd1)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe os.system(cmd2)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe data = diffFileData(tmpFile1, tmpFile2)
e7aca7349385967a98ed221ad54db99998d477e8Richard Lowe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # remove temp files as we no longer need them
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal try:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal os.unlink(tmpFile1)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal except OSError, e:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal error("diff_elf_section: unlink failed %s" % e)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal try:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal os.unlink(tmpFile2)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal except OSError, e:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal error("diff_elf_section: unlink failed %s" % e)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return (data)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# compare the relevant sections of two ELF binaries
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# and report any differences
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Returns: 1 if any differenes found
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# 0 if no differences found
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# -1 on error
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Sections deliberately not considered when comparing two ELF
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# binaries. Differences observed in these sections are not considered
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# significant where patch deliverable identification is concerned.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxesections_to_skip = [ ".SUNW_signature",
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ".comment",
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ".SUNW_ctf",
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ".debug",
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ".plt",
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ".rela.bss",
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ".rela.plt",
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ".line",
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ".note",
f6a1d7963180c91d5a022b2e7df19e2772fee46aesaxe ".compcom",
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ]
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxesections_preferred = [ ".rodata.str1.8",
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ".rodata.str1.1",
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ".rodata",
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ".data1",
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ".data",
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ".text",
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ]
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef compareElfs(base, ptch, quiet) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe global logging
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal try:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal base_header = get_elfheader(base)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal except:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal return
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe sections = base_header.keys()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal try:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal ptch_header = get_elfheader(ptch)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal except:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal return
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe e2_only_sections = ptch_header.keys()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe e1_only_sections = []
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fileName = fnFormat(base)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Derive the list of ELF sections found only in
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # either e1 or e2.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe for sect in sections :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if not sect in e2_only_sections :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe e1_only_sections.append(sect)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe else :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe e2_only_sections.remove(sect)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if len(e1_only_sections) > 0 :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if quiet :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal data = ""
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal if logging :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal slist = ""
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal for sect in e1_only_sections :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal slist = slist + sect + "\t"
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal data = "ELF sections found in " + \
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal base + " but not in " + ptch + \
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal "\n\n" + slist
e7aca7349385967a98ed221ad54db99998d477e8Richard Lowe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal difference(fileName, "ELF", data)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal return 1
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if len(e2_only_sections) > 0 :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if quiet :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 1
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal data = ""
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal if logging :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal slist = ""
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal for sect in e2_only_sections :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal slist = slist + sect + "\t"
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal data = "ELF sections found in " + \
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal ptch + " but not in " + base + \
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal "\n\n" + slist
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal difference(fileName, "ELF", data)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Look for preferred sections, and put those at the
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # top of the list of sections to compare
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe for psect in sections_preferred :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if psect in sections :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe sections.remove(psect)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe sections.insert(0, psect)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Compare ELF sections
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe first_section = True
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe for sect in sections :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if sect in sections_to_skip :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe continue
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal try:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal s1 = extract_elf_section(base, sect);
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal except:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal return
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal try:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal s2 = extract_elf_section(ptch, sect);
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal except:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal return
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if len(s1) != len (s2) or s1 != s2:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if not quiet:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe sh_type = base_header[sect]
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal data = diff_elf_section(base, ptch, \
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal sect, sh_type)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # If all ELF sections are being reported, then
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # invoke difference() to flag the file name to
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # stdout only once. Any other section differences
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # should be logged to the results file directly
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if not first_section :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal log_difference(fileName, \
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal "ELF " + sect, data)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe else :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal difference(fileName, "ELF " + sect, \
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal data)
e7aca7349385967a98ed221ad54db99998d477e8Richard Lowe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if not reportAllSects :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe first_section = False
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 0
e7aca7349385967a98ed221ad54db99998d477e8Richard Lowe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal#####
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal# recursively remove 2 directories
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal#
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal# Used for removal of temporary directory strucures (ignores any errors).
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal#
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotaldef clearTmpDirs(dir1, dir2) :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal if os.path.isdir(dir1) > 0 :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal shutil.rmtree(dir1, True)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal if os.path.isdir(dir2) > 0 :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal shutil.rmtree(dir2, True)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#####
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Archive object comparison
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Returns 1 if difference detected
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# 0 if no difference detected
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# -1 on error
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef compareArchives(base, ptch, fileType) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fileName = fnFormat(base)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal t = threading.currentThread()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal ArchTmpDir1 = tmpDir1 + os.path.basename(base) + t.getName()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal ArchTmpDir2 = tmpDir2 + os.path.basename(base) + t.getName()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe #
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Be optimistic and first try a straight file compare
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # as it will allow us to finish up quickly.
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal #
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if compareBasic(base, ptch, True, fileType) == 0 :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 0
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal try:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal os.makedirs(ArchTmpDir1)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal except OSError, e:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal error("compareArchives: makedir failed %s" % e)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal return -1
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal try:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal os.makedirs(ArchTmpDir2)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal except OSError, e:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal error("compareArchives: makedir failed %s" % e)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal return -1
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # copy over the objects to the temp areas, and
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # unpack them
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal baseCmd = "cp -fp " + base + " " + ArchTmpDir1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe status, output = commands.getstatusoutput(baseCmd)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if status != 0 :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe error(baseCmd + " failed: " + output)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal clearTmpDirs(ArchTmpDir1, ArchTmpDir2)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return -1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal ptchCmd = "cp -fp " + ptch + " " + ArchTmpDir2
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe status, output = commands.getstatusoutput(ptchCmd)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if status != 0 :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe error(ptchCmd + " failed: " + output)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal clearTmpDirs(ArchTmpDir1, ArchTmpDir2)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return -1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe bname = string.split(fileName, '/')[-1]
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if fileType == "Java Archive" :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal baseCmd = "cd " + ArchTmpDir1 + "; " + "jar xf " + bname + \
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe "; rm -f " + bname + " META-INF/MANIFEST.MF"
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal ptchCmd = "cd " + ArchTmpDir2 + "; " + "jar xf " + bname + \
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe "; rm -f " + bname + " META-INF/MANIFEST.MF"
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe elif fileType == "ELF Object Archive" :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal baseCmd = "cd " + ArchTmpDir1 + "; " + "/usr/ccs/bin/ar x " + \
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe bname + "; rm -f " + bname
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal ptchCmd = "cd " + ArchTmpDir2 + "; " + "/usr/ccs/bin/ar x " + \
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe bname + "; rm -f " + bname
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe else :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe error("unexpected file type: " + fileType)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal clearTmpDirs(ArchTmpDir1, ArchTmpDir2)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return -1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe os.system(baseCmd)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe os.system(ptchCmd)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal baseFlist = list(findFiles(ArchTmpDir1))
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal ptchFlist = list(findFiles(ArchTmpDir2))
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Trim leading path off base/ptch file lists
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe flist = []
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe for fn in baseFlist :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal flist.append(str_prefix_trunc(fn, ArchTmpDir1))
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe baseFlist = flist
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe flist = []
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe for fn in ptchFlist :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal flist.append(str_prefix_trunc(fn, ArchTmpDir2))
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ptchFlist = flist
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe for fn in ptchFlist :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if not fn in baseFlist :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe difference(fileName, fileType, \
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fn + " added to " + fileName)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal clearTmpDirs(ArchTmpDir1, ArchTmpDir2)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe for fn in baseFlist :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if not fn in ptchFlist :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe difference(fileName, fileType, \
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fn + " removed from " + fileName)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal clearTmpDirs(ArchTmpDir1, ArchTmpDir2)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal differs = compareOneFile((ArchTmpDir1 + fn), \
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal (ArchTmpDir2 + fn), True)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if differs :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe difference(fileName, fileType, \
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fn + " in " + fileName + " differs")
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal clearTmpDirs(ArchTmpDir1, ArchTmpDir2)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 1
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal clearTmpDirs(ArchTmpDir1, ArchTmpDir2)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 0
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#####
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# (Basic) file comparison
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# There's some special case code here for Javadoc HTML files
e7aca7349385967a98ed221ad54db99998d477e8Richard Lowe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Returns 1 if difference detected
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# 0 if no difference detected
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# -1 on error
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef compareBasic(base, ptch, quiet, fileType) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fileName = fnFormat(base);
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if quiet and os.stat(base)[ST_SIZE] != os.stat(ptch)[ST_SIZE] :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe try:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe baseFile = open(base)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe except:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe error("could not open " + base)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return -1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe try:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ptchFile = open(ptch)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe except:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe error("could not open " + ptch)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return -1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe baseData = baseFile.read()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ptchData = ptchFile.read()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe baseFile.close()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ptchFile.close()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe needToSnip = False
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if fileType == "HTML" :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe needToSnip = True
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe toSnipBeginStr = "<!-- Generated by javadoc"
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe toSnipEndStr = "-->\n"
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if needToSnip :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe toSnipBegin = string.find(baseData, toSnipBeginStr)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if toSnipBegin != -1 :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe toSnipEnd = string.find(baseData[toSnipBegin:], \
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe toSnipEndStr) + \
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe len(toSnipEndStr)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe baseData = baseData[:toSnipBegin] + \
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe baseData[toSnipBegin + toSnipEnd:]
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ptchData = ptchData[:toSnipBegin] + \
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ptchData[toSnipBegin + toSnipEnd:]
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if quiet :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if baseData != ptchData :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe else :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if len(baseData) != len(ptchData) or baseData != ptchData :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal diffs = diffData(base, ptch, baseData, ptchData)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe difference(fileName, fileType, diffs)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 0
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#####
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Compare two objects by producing a data dump from
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# each object, and then comparing the dump data
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Returns: 1 if a difference is detected
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# 0 if no difference detected
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# -1 upon error
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef compareByDumping(base, ptch, quiet, fileType) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fileName = fnFormat(base);
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal t = threading.currentThread()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal tmpFile1 = tmpDir1 + os.path.basename(base) + t.getName()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal tmpFile2 = tmpDir2 + os.path.basename(ptch) + t.getName()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if fileType == "Lint Library" :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe baseCmd = lintdump_cmd + " -ir " + base + \
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal " | egrep -v '(LINTOBJ|LINTMOD):'" + \
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal " | grep -v PASS[1-3]:" + \
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal " > " + tmpFile1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ptchCmd = lintdump_cmd + " -ir " + ptch + \
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal " | egrep -v '(LINTOBJ|LINTMOD):'" + \
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal " | grep -v PASS[1-3]:" + \
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal " > " + tmpFile2
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe elif fileType == "Sqlite Database" :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe baseCmd = "echo .dump | " + sqlite_cmd + base + " > " + \
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe tmpFile1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ptchCmd = "echo .dump | " + sqlite_cmd + ptch + " > " + \
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe tmpFile2
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe os.system(baseCmd)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe os.system(ptchCmd)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe try:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe baseFile = open(tmpFile1)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe except:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe error("could not open: " + tmpFile1)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal return
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe try:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ptchFile = open(tmpFile2)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe except:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe error("could not open: " + tmpFile2)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal return
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe baseData = baseFile.read()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ptchData = ptchFile.read()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe baseFile.close()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ptchFile.close()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if len(baseData) != len(ptchData) or baseData != ptchData :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if not quiet :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe data = diffFileData(tmpFile1, tmpFile2);
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal try:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal os.unlink(tmpFile1)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal except OSError, e:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal error("compareByDumping: unlink failed %s" % e)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal try:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal os.unlink(tmpFile2)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal except OSError, e:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal error("compareByDumping: unlink failed %s" % e)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe difference(fileName, fileType, data)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 1
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # Remove the temporary files now.
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal try:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal os.unlink(tmpFile1)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal except OSError, e:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal error("compareByDumping: unlink failed %s" % e)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal try:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal os.unlink(tmpFile2)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal except OSError, e:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal error("compareByDumping: unlink failed %s" % e)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 0
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
619b4598e0f434792bdadf91cc947739dc734758rotondo#####
619b4598e0f434792bdadf91cc947739dc734758rotondo#
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal# SIGINT signal handler. Changes thread control variable to tell the threads
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal# to finish their current job and exit.
619b4598e0f434792bdadf91cc947739dc734758rotondo#
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotaldef discontinue_processing(signl, frme):
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal global keep_processing
619b4598e0f434792bdadf91cc947739dc734758rotondo
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal print >> sys.stderr, "Caught Ctrl-C, stopping the threads"
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal keep_processing = False
619b4598e0f434792bdadf91cc947739dc734758rotondo
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal return 0
619b4598e0f434792bdadf91cc947739dc734758rotondo
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal#####
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal#
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal# worker thread for changedFiles processing
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal#
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotalclass workerThread(threading.Thread) :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal def run(self):
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal global wset_lock
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal global changedFiles
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal global baseRoot
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal global ptchRoot
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal global keep_processing
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal while (keep_processing) :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # grab the lock to changedFiles and remove one member
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # and process it
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal wset_lock.acquire()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal try :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal fn = changedFiles.pop()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal except IndexError :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # there is nothing more to do
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal wset_lock.release()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal return
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal wset_lock.release()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal base = baseRoot + fn
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal ptch = ptchRoot + fn
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal compareOneFile(base, ptch, False)
619b4598e0f434792bdadf91cc947739dc734758rotondo
619b4598e0f434792bdadf91cc947739dc734758rotondo
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe#####
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Compare two objects. Detect type changes.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Vector off to the appropriate type specific
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# compare routine based on the type.
e7aca7349385967a98ed221ad54db99998d477e8Richard Lowe#
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef compareOneFile(base, ptch, quiet) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Verify the file types.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # If they are different, indicate this and move on
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe btype = getTheFileType(base)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ptype = getTheFileType(ptch)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
619b4598e0f434792bdadf91cc947739dc734758rotondo if btype == 'Error' or ptype == 'Error' :
619b4598e0f434792bdadf91cc947739dc734758rotondo return -1
619b4598e0f434792bdadf91cc947739dc734758rotondo
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fileName = fnFormat(base)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if (btype != ptype) :
619b4598e0f434792bdadf91cc947739dc734758rotondo if not quiet :
619b4598e0f434792bdadf91cc947739dc734758rotondo difference(fileName, "file type", btype + " to " + ptype)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return 1
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe else :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe fileType = btype
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if (fileType == 'ELF') :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return compareElfs(base, ptch, quiet)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe elif (fileType == 'Java Archive' or fileType == 'ELF Object Archive') :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return compareArchives(base, ptch, fileType)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe elif (fileType == 'HTML') :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return compareBasic(base, ptch, quiet, fileType)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe elif ( fileType == 'Lint Library' ) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return compareByDumping(base, ptch, quiet, fileType)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe elif ( fileType == 'Sqlite Database' ) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return compareByDumping(base, ptch, quiet, fileType)
619b4598e0f434792bdadf91cc947739dc734758rotondo
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe else :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # it has to be some variety of text file
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe return compareBasic(base, ptch, quiet, fileType)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe# Cleanup and self-terminate
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef cleanup(ret) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal debug("Performing cleanup (" + str(ret) + ")")
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal if os.path.isdir(tmpDir1) > 0 :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal shutil.rmtree(tmpDir1)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal if os.path.isdir(tmpDir2) > 0 :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal shutil.rmtree(tmpDir2)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if logging :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe log.close()
e7aca7349385967a98ed221ad54db99998d477e8Richard Lowe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe sys.exit(ret)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxedef main() :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Log file handle
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe global log
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Globals relating to command line options
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe global logging, vdiffs, reportAllSects
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Named temporary files / directories
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal global tmpDir1, tmpDir2
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Command paths
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe global lintdump_cmd, elfdump_cmd, dump_cmd, dis_cmd, od_cmd, diff_cmd, sqlite_cmd
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Default search path
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe global wsdiff_path
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Essentially "uname -p"
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe global arch
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # changed files for worker thread processing
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal global changedFiles
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal global baseRoot
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal global ptchRoot
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # Sort the list of files from a temporary file
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal global sorted
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal global differentFiles
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # Debugging indicator
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal global debugon
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Some globals need to be initialized
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal debugon = logging = vdiffs = reportAllSects = sorted = False
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Process command line arguments
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Return values are returned from args() in alpha order
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # (Yes, python functions can return multiple values (ewww))
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Note that args() also set the globals:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # logging to True if verbose logging (to a file) was enabled
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # vdiffs to True if logged differences aren't to be truncated
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # reportAllSects to True if all ELF section differences are to be reported
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe #
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe baseRoot, fileNamesFile, localTools, ptchRoot, results = args()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe #
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Set up the results/log file
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe #
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if logging :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe try:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe log = open(results, "w")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe except:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe logging = False
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe error("failed to open log file: " + log)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe sys.exit(1)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
ccac5ae384bd76b9eb3473b622170555228b5c5dJosef 'Jeff' Sipek dateTimeStr= "# %04d-%02d-%02d at %02d:%02d:%02d" % time.localtime()[:6]
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe v_info("# This file was produced by wsdiff")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe v_info(dateTimeStr)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # Changed files (used only for the sorted case)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal if sorted :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal differentFiles = []
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal #
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Build paths to the tools required tools
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe #
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Try to look for tools in $SRC/tools if the "-t" option
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # was specified
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe #
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe arch = commands.getoutput("uname -p")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if localTools :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe try:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe src = os.environ['SRC']
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe except:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe error("-t specified, but $SRC not set. Cannot find $SRC/tools")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe src = ""
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if len(src) > 0 :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe wsdiff_path.insert(0, src + "/tools/proto/opt/onbld/bin")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe lintdump_cmd = find_tool("lintdump")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe elfdump_cmd = find_tool("elfdump")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe dump_cmd = find_tool("dump")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe od_cmd = find_tool("od")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe dis_cmd = find_tool("dis")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe diff_cmd = find_tool("diff")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe sqlite_cmd = find_tool("sqlite")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal #
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # Set resource limit for number of open files as high as possible.
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # This might get handy with big number of threads.
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal #
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal (nofile_soft, nofile_hard) = resource.getrlimit(resource.RLIMIT_NOFILE)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal try:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal resource.setrlimit(resource.RLIMIT_NOFILE,
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal (nofile_hard, nofile_hard))
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal except:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal error("cannot set resource limits for number of open files")
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal sys.exit(1)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe #
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # validate the base and patch paths
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe #
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if baseRoot[-1] != '/' :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe baseRoot += '/'
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if ptchRoot[-1] != '/' :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe ptchRoot += '/'
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if not os.path.exists(baseRoot) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe error("old proto area: " + baseRoot + " does not exist")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe sys.exit(1)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if not os.path.exists(ptchRoot) :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe error("new proto area: " + ptchRoot + \
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe " does not exist")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe sys.exit(1)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe #
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # log some information identifying the run
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe #
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe v_info("Old proto area: " + baseRoot)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe v_info("New proto area: " + ptchRoot)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe v_info("Results file: " + results + "\n")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
e7aca7349385967a98ed221ad54db99998d477e8Richard Lowe #
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Set up the temporary directories / files
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Could use python's tmpdir routines, but these should
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # be easier to identify / keep around for debugging
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe pid = os.getpid()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe tmpDir1 = "/tmp/wsdiff_tmp1_" + str(pid) + "/"
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe tmpDir2 = "/tmp/wsdiff_tmp2_" + str(pid) + "/"
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal try:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe os.makedirs(tmpDir1)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal except OSError, e:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal error("main: makedir failed %s" % e)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal try:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe os.makedirs(tmpDir2)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal except OSError, e:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal error("main: makedir failed %s" % e)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Derive a catalog of new, deleted, and to-be-compared objects
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # either from the specified base and patch proto areas, or from
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # from an input file list
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe newOrDeleted = False
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if fileNamesFile != "" :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe changedFiles, newFiles, deletedFiles = \
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe flistCatalog(baseRoot, ptchRoot, fileNamesFile)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe else :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal changedFiles, newFiles, deletedFiles = \
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal protoCatalog(baseRoot, ptchRoot)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if len(newFiles) > 0 :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe newOrDeleted = True
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe info("\nNew objects found: ")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal if sorted :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal newFiles.sort()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe for fn in newFiles :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe info(fnFormat(fn))
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if len(deletedFiles) > 0 :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe newOrDeleted = True
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe info("\nObjects removed: ")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal if sorted :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal deletedFiles.sort()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe for fn in deletedFiles :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe info(fnFormat(fn))
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe if newOrDeleted :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal info("\nChanged objects: ")
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal if sorted :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal debug("The list will appear after the processing is done")
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Here's where all the heavy lifting happens
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # Perform a comparison on each object appearing in
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # both proto areas. compareOneFile will examine the
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # file types of each object, and will vector off to
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # the appropriate comparison routine, where the compare
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # will happen, and any differences will be reported / logged
e7aca7349385967a98ed221ad54db99998d477e8Richard Lowe
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # determine maximum number of worker threads by using
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # DMAKE_MAX_JOBS environment variable set by nightly(1)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # or get number of CPUs in the system
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal try:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal max_threads = int(os.environ['DMAKE_MAX_JOBS'])
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal except:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal max_threads = os.sysconf("SC_NPROCESSORS_ONLN")
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # If we cannot get number of online CPUs in the system
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # run unparallelized otherwise bump the number up 20%
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # to achieve best results.
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal if max_threads == -1 :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal max_threads = 1
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal else :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal max_threads += max_threads/5
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # Set signal handler to attempt graceful exit
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal debug("Setting signal handler")
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal signal.signal( signal.SIGINT, discontinue_processing )
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # Create and unleash the threads
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # Only at most max_threads must be running at any moment
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal mythreads = []
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal debug("Spawning " + str(max_threads) + " threads");
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal for i in range(max_threads) :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal thread = workerThread()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal mythreads.append(thread)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal mythreads[i].start()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # Wait for the threads to finish and do cleanup if interrupted
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal debug("Waiting for the threads to finish")
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal while True:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal if not True in [thread.isAlive() for thread in mythreads]:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal break
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal else:
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # Some threads are still going
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal time.sleep(1)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # Interrupted by SIGINT
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal if keep_processing == False :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal cleanup(1)
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal # If the list of differences was sorted it is stored in an array
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal if sorted :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal differentFiles.sort()
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal for f in differentFiles :
598cc7dfe526c1fa47f03934c5c6fa6508961296Vladimir Kotal info(fnFormat(f))
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe # We're done, cleanup.
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cleanup(0)
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxeif __name__ == '__main__' :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe try:
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe main()
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe except KeyboardInterrupt :
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe cleanup(1);
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe
96ccc8cb05e8790fcc24931dcb155b76e810295cesaxe