diff --git a/Makefile b/Makefile index 2aec754e6f8..d93b3195ec5 100644 --- a/Makefile +++ b/Makefile @@ -36,12 +36,6 @@ ifndef JDK_MAKE_SHARED_DIR JDK_MAKE_SHARED_DIR=$(JDK_TOPDIR)/make/common/shared endif -# For start and finish echo lines -TITLE_TEXT = Control $(PLATFORM) $(ARCH) $(RELEASE) -DATE_STAMP = `$(DATE) '+%y-%m-%d %H:%M'` -START_ECHO = echo "$(TITLE_TEXT) $@ build started: $(DATE_STAMP)" -FINISH_ECHO = echo "$(TITLE_TEXT) $@ build finished: $(DATE_STAMP)" - default: all include $(JDK_MAKE_SHARED_DIR)/Defs-control.gmk @@ -57,10 +51,6 @@ include ./make/install-rules.gmk include ./make/sponsors-rules.gmk include ./make/deploy-rules.gmk -# What "all" means -all:: - @$(START_ECHO) - all:: sanity ifeq ($(SKIP_FASTDEBUG_BUILD), false) @@ -73,40 +63,42 @@ endif all:: all_product_build -all:: - @$(FINISH_ECHO) - # Everything for a full product build -all_product_build:: - @$(START_ECHO) - ifeq ($(SKIP_PRODUCT_BUILD), false) - + all_product_build:: product_build ifeq ($(BUILD_INSTALL), true) all_product_build:: $(INSTALL) clobber:: install-clobber endif - + ifeq ($(BUILD_SPONSORS), true) all_product_build:: $(SPONSORS) clobber:: sponsors-clobber endif - + ifneq ($(SKIP_COMPARE_IMAGES), true) all_product_build:: compare-image endif endif -all_product_build:: - @$(FINISH_ECHO) +define StartTimer + $(MKDIR) -p $(BUILDTIMESDIR) + $(RM) $(BUILDTIMESDIR)/build_time_* + $(call RecordStartTime,TOTAL) +endef + +define StopTimer + $(if $(REPORT_BUILD_TIMES),$(call RecordEndTime,TOTAL) && $(call ReportBuildTimes,$1),) +endef # Generic build of basic repo series generic_build_repo_series:: $(MKDIR) -p $(OUTPUTDIR) $(MKDIR) -p $(OUTPUTDIR)/j2sdk-image + @$(call StartTimer) ifeq ($(BUILD_LANGTOOLS), true) generic_build_repo_series:: langtools @@ -143,6 +135,9 @@ ifeq ($(BUILD_DEPLOY), true) clobber:: deploy-clobber endif +generic_build_repo_series:: + @$(call StopTimer,$(if $(DEBUG_NAME),$(DEBUG_NAME)_build,all_product_build)) + # The debug build, fastdebug or debug. Needs special handling. # Note that debug builds do NOT do INSTALL steps, but must be done # after the product build and before the INSTALL step of the product build. @@ -167,28 +162,22 @@ FRESH_BOOTDIR=$(ABS_BOOTDIR_OUTPUTDIR)/j2sdk-image FRESH_DEBUG_BOOTDIR=$(ABS_BOOTDIR_OUTPUTDIR)/../$(PLATFORM)-$(ARCH)-$(DEBUG_NAME)/j2sdk-image create_fresh_product_bootdir: FRC - @$(START_ECHO) $(MAKE) ALT_OUTPUTDIR=$(ABS_BOOTDIR_OUTPUTDIR) \ GENERATE_DOCS=false \ BOOT_CYCLE_SETTINGS= \ build_product_image - @$(FINISH_ECHO) create_fresh_debug_bootdir: FRC - @$(START_ECHO) $(MAKE) ALT_OUTPUTDIR=$(ABS_BOOTDIR_OUTPUTDIR) \ GENERATE_DOCS=false \ BOOT_CYCLE_DEBUG_SETTINGS= \ build_debug_image - @$(FINISH_ECHO) create_fresh_fastdebug_bootdir: FRC - @$(START_ECHO) $(MAKE) ALT_OUTPUTDIR=$(ABS_BOOTDIR_OUTPUTDIR) \ GENERATE_DOCS=false \ BOOT_CYCLE_DEBUG_SETTINGS= \ build_fastdebug_image - @$(FINISH_ECHO) # Create boot image? ifeq ($(SKIP_BOOT_CYCLE),false) @@ -197,6 +186,8 @@ ifeq ($(SKIP_BOOT_CYCLE),false) endif endif + + ifeq ($(DO_BOOT_CYCLE),true) # Create the bootdir to use in the build @@ -221,27 +212,23 @@ else endif build_product_image: - @$(START_ECHO) $(MAKE) \ SKIP_FASTDEBUG_BUILD=true \ SKIP_DEBUG_BUILD=true \ $(BOOT_CYCLE_SETTINGS) \ generic_build_repo_series - @$(FINISH_ECHO) # NOTE: On windows, do not use $(ABS_OUTPUTDIR)-$(DEBUG_NAME). # Due to the use of short paths in $(ABS_OUTPUTDIR), this may # not be the same location. generic_debug_build: - @$(START_ECHO) $(MAKE) \ ALT_OUTPUTDIR=$(ABS_OUTPUTDIR)/../$(PLATFORM)-$(ARCH)-$(DEBUG_NAME) \ DEBUG_NAME=$(DEBUG_NAME) \ GENERATE_DOCS=false \ $(BOOT_CYCLE_DEBUG_SETTINGS) \ generic_build_repo_series - @$(FINISH_ECHO) build_debug_image: $(MAKE) DEBUG_NAME=debug generic_debug_build @@ -254,7 +241,8 @@ product_build:: build_product_image debug_build:: build_debug_image fastdebug_build:: build_fastdebug_image -clobber:: +clobber:: REPORT_BUILD_TIMES= +clobber:: $(RM) -r $(OUTPUTDIR)/* $(RM) -r $(OUTPUTDIR)/../$(PLATFORM)-$(ARCH)-debug/* $(RM) -r $(OUTPUTDIR)/../$(PLATFORM)-$(ARCH)-fastdebug/* diff --git a/make/Defs-internal.gmk b/make/Defs-internal.gmk index 8cb28b8191a..c55675f79e0 100644 --- a/make/Defs-internal.gmk +++ b/make/Defs-internal.gmk @@ -28,21 +28,63 @@ # not contain rules. # -# Indicate that we are visiting a separate repo or component +# The build times report is turned off by setting REPORT_BUILD_TIMES to nothing. +# This is necessary for the target clobber/clean which will erase the +# directories where the buildtimes are stored. +REPORT_BUILD_TIMES=1 +# Store the build times in this directory. +BUILDTIMESDIR=$(ABS_OUTPUTDIR)/tmp/buildtimes + +# Record starting time for build of a sub repository. +define RecordStartTime +$(MKDIR) -p $(BUILDTIMESDIR) +$(DATE) '+%Y %m %d %H %M %S' | $(NAWK) '{ print $$1,$$2,$$3,$$4,$$5,$$6,($$4*3600+$$5*60+$$6) }' > $(BUILDTIMESDIR)/build_time_start_$1 +$(DATE) '+%Y-%m-%d %H:%M:%S' > $(BUILDTIMESDIR)/build_time_start_$1_human_readable +endef + +# Indicate that we started to build a sub repository and record starting time. define MakeStart -$(PRINTF) "\n\n%s\n%s\n##### %-60.60s #####\n%s\n" \ +$(call RecordStartTime,$1) +$(PRINTF) "\n\n%s\n%s\n##### %-60.60s #####\n%s\n\n" \ "########################################################################" \ "########################################################################" \ -"Entering $1 for target $2" \ +"Entering $1 for target(s) $2" \ "########################################################################" endef -define MakeFinish -$(PRINTF) "%s\n##### %-60.60s #####\n%s\n%s\n\n" \ +# Record ending time and calculate the difference and store it in a +# easy to read format. Handles builds that cross midnight. Expects +# that a build will never take 24 hours or more. +define RecordEndTime +$(DATE) '+%Y %m %d %H %M %S' | $(NAWK) '{ print $$1,$$2,$$3,$$4,$$5,$$6,($$4*3600+$$5*60+$$6) }' > $(BUILDTIMESDIR)/build_time_end_$1 +$(DATE) '+%Y-%m-%d %H:%M:%S' > $(BUILDTIMESDIR)/build_time_end_$1_human_readable +$(ECHO) `$(CAT) $(BUILDTIMESDIR)/build_time_start_$1` `$(CAT) $(BUILDTIMESDIR)/build_time_end_$1` $1 | \ + $(NAWK) '{ F=$$7; T=$$14; if (F > T) { T+=3600*24 }; D=T-F; H=int(D/3600); \ + M=int((D-H*3600)/60); S=D-H*3600-M*60; printf("%02d:%02d:%02d %s\n",H,M,S,$$15); }' \ + > $(BUILDTIMESDIR)/build_time_diff_$1 +endef + +# Indicate that we are done. +# Record ending time and print out the total time it took to build. +define MakeFinish +$(if $(REPORT_BUILD_TIMES),$(call RecordEndTime,$1),) +$(PRINTF) "%s\n##### %-60.60s #####\n%s\n##### %-60.60s #####\n%s\n\n" \ "########################################################################" \ -"Leaving $1 for target $2" \ +"Leaving $1 for target(s) $2" \ "########################################################################" \ -"########################################################################" +$(if $(REPORT_BUILD_TIMES),"Build time `$(CAT) $(BUILDTIMESDIR)/build_time_diff_$1` for target(s) $2","") \ +"########################################################################" +endef + +# Find all build_time_* files and print their contents in a list sorted +# on the name of the sub repository. +define ReportBuildTimes +$(PRINTF) "-- Build times ----------\nTarget %s\nStart %s\nEnd %s\n%s\n%s\n-------------------------\n" \ +$1 \ +"`$(CAT) $(BUILDTIMESDIR)/build_time_start_TOTAL_human_readable`" \ +"`$(CAT) $(BUILDTIMESDIR)/build_time_end_TOTAL_human_readable`" \ +"`$(LS) $(BUILDTIMESDIR)/build_time_diff_* | $(GREP) -v _TOTAL | $(XARGS) $(CAT) | $(SORT) -k 2`" \ +"`$(CAT) $(BUILDTIMESDIR)/build_time_diff_TOTAL`" endef ifdef OPENJDK diff --git a/make/corba-rules.gmk b/make/corba-rules.gmk index 2cdeeb4eae1..13671ee6eca 100644 --- a/make/corba-rules.gmk +++ b/make/corba-rules.gmk @@ -40,17 +40,17 @@ endif corba: corba-build corba-build: $(MKDIR) -p $(CORBA_OUTPUTDIR) - @$(call MakeStart, corba, all) + @$(call MakeStart,corba,all) ($(CD) $(CORBA_TOPDIR)/make && \ $(MAKE) $(CORBA_BUILD_ARGUMENTS) all) - @$(call MakeFinish, corba, all) + @$(call MakeFinish,corba,all) corba-clobber:: $(MKDIR) -p $(CORBA_OUTPUTDIR) - @$(call MakeStart, corba, clobber) + @$(call MakeStart,corba,clobber) ($(CD) $(CORBA_TOPDIR)/make && \ $(MAKE) $(CORBA_BUILD_ARGUMENTS) clobber) - @$(call MakeFinish, corba, clobber) + @$(call MakeFinish,corba,clobber) .PHONY: corba corba-build corba-clobber diff --git a/make/deploy-rules.gmk b/make/deploy-rules.gmk index d05d4097e3c..003698cf56e 100644 --- a/make/deploy-rules.gmk +++ b/make/deploy-rules.gmk @@ -116,18 +116,18 @@ endif deploy-build: ifeq ($(BUILD_DEPLOY), true) - @$(call MakeStart, deploy, $(DEPLOY_BUILD_TARGETS)) + @$(call MakeStart,deploy,$(DEPLOY_BUILD_TARGETS)) ($(CD) $(DEPLOY_TOPDIR)/make && \ $(MAKE) $(DEPLOY_BUILD_TARGETS) $(DEPLOY_BUILD_ARGUMENTS)) - @$(call MakeFinish, deploy, $(DEPLOY_BUILD_TARGETS)) + @$(call MakeFinish,deploy,$(DEPLOY_BUILD_TARGETS)) endif deploy-clobber:: ifeq ($(BUILD_DEPLOY), true) - @$(call MakeStart, deploy, clobber) + @$(call MakeStart,deploy,clobber) ($(CD) $(DEPLOY_TOPDIR)/make && \ $(MAKE) clobber $(DEPLOY_BUILD_ARGUMENTS)) - @$(call MakeFinish, deploy, clobber) + @$(call MakeFinish,deploy,clobber) endif deploy-sanity:: diff --git a/make/hotspot-rules.gmk b/make/hotspot-rules.gmk index 674ce633da0..8bc6e75a666 100644 --- a/make/hotspot-rules.gmk +++ b/make/hotspot-rules.gmk @@ -96,10 +96,10 @@ endif hotspot-build:: $(MKDIR) -p $(HOTSPOT_OUTPUTDIR) $(MKDIR) -p $(HOTSPOT_EXPORT_PATH) - @$(call MakeStart, hotspot, $(HOTSPOT_TARGET)) + @$(call MakeStart,hotspot,$(HOTSPOT_TARGET)) $(CD) $(HOTSPOT_TOPDIR)/make && \ $(MAKE) $(HOTSPOT_BUILD_ARGUMENTS) $(HOTSPOT_TARGET) - @$(call MakeFinish, hotspot, $(HOTSPOT_TARGET)) + @$(call MakeFinish,hotspot,$(HOTSPOT_TARGET)) ##################### # .PHONY diff --git a/make/install-rules.gmk b/make/install-rules.gmk index 8e1f189d521..932985ed07d 100644 --- a/make/install-rules.gmk +++ b/make/install-rules.gmk @@ -57,39 +57,39 @@ install: install-build install-build: ifeq ($(BUILD_INSTALL), true) - @$(call MakeStart, install, $(INSTALL_BUILD_TARGETS)) + @$(call MakeStart,install,$(INSTALL_BUILD_TARGETS)) ($(CD) $(INSTALL_TOPDIR)/make && \ $(MAKE) $(INSTALL_BUILD_TARGETS) $(INSTALL_BUILD_ARGUMENTS)) - @$(call MakeFinish, install, $(INSTALL_BUILD_TARGETS)) + @$(call MakeFinish,install,$(INSTALL_BUILD_TARGETS)) endif update-patcher: ifeq ($(BUILD_INSTALL), true) if [ -r $(INSTALL_TOPDIR)/make/update/Makefile ]; then \ - $(call MakeStart, install update, all); \ + $(call MakeStart,install_update,all); \ ( $(CD) $(INSTALL_TOPDIR)/make/update && \ $(MAKE) all $(INSTALL_BUILD_ARGUMENTS) ); \ - $(call MakeFinish, install, all); \ + $(call MakeFinish,install_update,all); \ fi endif update-patchgen: ifeq ($(BUILD_INSTALL), true) if [ -r $(INSTALL_TOPDIR)/make/update/Makefile ]; then \ - $(call MakeStart, install update, patchgen); \ + $(call MakeStart,install_update,patchgen); \ ( $(CD) $(INSTALL_TOPDIR)/make/update && \ $(MAKE) patchgen $(INSTALL_BUILD_ARGUMENTS) ); \ - $(call MakeFinish, install, patchgen); \ + $(call MakeFinish,install_update,patchgen); \ fi endif installer: ifeq ($(BUILD_INSTALL), true) if [ -r $(INSTALL_TOPDIR)/make/installer/Makefile ]; then \ - $(call MakeStart, install installer, all); \ + $(call MakeStart,install_installer,all); \ ( $(CD) $(INSTALL_TOPDIR)/make/installer && \ $(MAKE) all $(INSTALL_BUILD_ARGUMENTS) ); \ - $(call MakeFinish, install, all); \ + $(call MakeFinish,install_installer,all); \ fi endif @@ -99,10 +99,10 @@ combo_build: install-clobber: ifeq ($(BUILD_INSTALL), true) - @$(call MakeStart, install, clobber) + @$(call MakeStart,install,clobber) ($(CD) $(INSTALL_TOPDIR)/make && \ $(MAKE) clobber $(INSTALL_BUILD_ARGUMENTS)) - @$(call MakeFinish, install, clobber) + @$(call MakeFinish,install,clobber) endif install-sanity:: diff --git a/make/jaxp-rules.gmk b/make/jaxp-rules.gmk index b37026b1dc5..625b2ec7bc8 100644 --- a/make/jaxp-rules.gmk +++ b/make/jaxp-rules.gmk @@ -40,17 +40,17 @@ endif jaxp: jaxp-build jaxp-build: $(MKDIR) -p $(JAXP_OUTPUTDIR) - @$(call MakeStart, jaxp, all) + @$(call MakeStart,jaxp,all) ($(CD) $(JAXP_TOPDIR)/make && \ $(MAKE) $(JAXP_BUILD_ARGUMENTS) all) - @$(call MakeFinish, jaxp, all) + @$(call MakeFinish,jaxp,all) jaxp-clobber:: $(MKDIR) -p $(JAXP_OUTPUTDIR) - @$(call MakeStart, jaxp, clobber) + @$(call MakeStart,jaxp,clobber) ($(CD) $(JAXP_TOPDIR)/make && \ $(MAKE) $(JAXP_BUILD_ARGUMENTS) clobber) - @$(call MakeFinish, jaxp, clobber) + @$(call MakeFinish,jaxp,clobber) .PHONY: jaxp jaxp-build jaxp-clobber diff --git a/make/jaxws-rules.gmk b/make/jaxws-rules.gmk index 981ddb06333..4956a983b91 100644 --- a/make/jaxws-rules.gmk +++ b/make/jaxws-rules.gmk @@ -40,17 +40,17 @@ endif jaxws: jaxws-build jaxws-build: $(MKDIR) -p $(JAXWS_OUTPUTDIR) - @$(call MakeStart, jaxws, all) + @$(call MakeStart,jaxws,all) ($(CD) $(JAXWS_TOPDIR)/make && \ $(MAKE) $(JAXWS_BUILD_ARGUMENTS) all) - @$(call MakeFinish, jaxws, all) + @$(call MakeFinish,jaxws,all) jaxws-clobber:: $(MKDIR) -p $(JAXWS_OUTPUTDIR) - @$(call MakeStart, jaxws, clobber) + @$(call MakeStart,jaxws,clobber) ($(CD) $(JAXWS_TOPDIR)/make && \ $(MAKE) $(JAXWS_BUILD_ARGUMENTS) clobber) - @$(call MakeFinish, jaxws, clobber) + @$(call MakeFinish,jaxws,clobber) .PHONY: jaxws jaxws-build jaxws-clobber diff --git a/make/jdk-rules.gmk b/make/jdk-rules.gmk index e814918a027..cfc56ed127e 100644 --- a/make/jdk-rules.gmk +++ b/make/jdk-rules.gmk @@ -75,16 +75,16 @@ $(JDK_JAVA_EXE):: jdk-build jdk: jdk-build jdk-build: - @$(call MakeStart, jdk, $(JDK_BUILD_TARGETS)) + @$(call MakeStart,jdk,$(JDK_BUILD_TARGETS)) ( $(CD) $(JDK_TOPDIR)/make && \ $(MAKE) $(JDK_BUILD_TARGETS) $(JDK_BUILD_ARGUMENTS) ; ) - @$(call MakeFinish, jdk, $(JDK_BUILD_TARGETS)) + @$(call MakeFinish,jdk,$(JDK_BUILD_TARGETS)) jdk-clobber:: - @$(call MakeStart, jdk, $(JDK_CLOBBER_TARGETS)) + @$(call MakeStart,jdk,$(JDK_CLOBBER_TARGETS)) ( $(CD) $(JDK_TOPDIR)/make && \ $(MAKE) $(JDK_CLOBBER_TARGETS) $(JDK_BUILD_ARGUMENTS) ; ) - @$(call MakeFinish, jdk, $(JDK_CLOBBER_TARGETS)) + @$(call MakeFinish,jdk,$(JDK_CLOBBER_TARGETS)) jdk-sanity:: ( $(CD) $(JDK_TOPDIR)/make && \ @@ -92,17 +92,17 @@ jdk-sanity:: compare-images: compare-image compare-image: - @$(call MakeStart, jdk, compare-image) + @$(call MakeStart,jdk,compare-image) ( $(CD) $(JDK_TOPDIR)/make && \ $(MAKE) ALT_OUTPUTDIR=$(ABS_OUTPUTDIR) compare-image ) - @$(call MakeFinish, jdk, compare-image) + @$(call MakeFinish,jdk,compare-image) compare-images-clobber: compare-image-clobber compare-image-clobber: - @$(call MakeStart, jdk, compare-image-clobber) + @$(call MakeStart,jdk,compare-image-clobber) ( $(CD) $(JDK_TOPDIR)/make && \ $(MAKE) ALT_OUTPUTDIR=$(ABS_OUTPUTDIR) compare-image-clobber ) - @$(call MakeFinish, jdk, compare-image-clobber) + @$(call MakeFinish,jdk,compare-image-clobber) .PHONY: jdk jdk-build jdk-clobber jdk-sanity diff --git a/make/langtools-rules.gmk b/make/langtools-rules.gmk index 99ce0c1ce94..a0b2649ec47 100644 --- a/make/langtools-rules.gmk +++ b/make/langtools-rules.gmk @@ -35,17 +35,17 @@ LANGTOOLS_BUILD_ARGUMENTS = \ langtools: langtools-build langtools-build: $(MKDIR) -p $(LANGTOOLS_OUTPUTDIR) - @$(call MakeStart, langtools, all) + @$(call MakeStart,langtools,all) ($(CD) $(LANGTOOLS_TOPDIR)/make && \ $(MAKE) $(LANGTOOLS_BUILD_ARGUMENTS) all) - @$(call MakeFinish, langtools, all) + @$(call MakeFinish,langtools,all) langtools-clobber:: $(MKDIR) -p $(LANGTOOLS_OUTPUTDIR) - @$(call MakeStart, langtools, clobber) + @$(call MakeStart,langtools,clobber) ($(CD) $(LANGTOOLS_TOPDIR)/make && \ $(MAKE) $(LANGTOOLS_BUILD_ARGUMENTS) clobber) - @$(call MakeFinish, langtools, clobber) + @$(call MakeFinish,langtools,clobber) .PHONY: langtools langtools-build langtools-clobber diff --git a/make/scripts/webrev.ksh b/make/scripts/webrev.ksh new file mode 100644 index 00000000000..b4ba97bf6a2 --- /dev/null +++ b/make/scripts/webrev.ksh @@ -0,0 +1,3182 @@ +#!/bin/ksh -p +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. +# Use is subject to license terms. +# +# This script takes a file list and a workspace and builds a set of html files +# suitable for doing a code review of source changes via a web page. +# Documentation is available via 'webrev -h'. +# + +WEBREV_UPDATED=23.18-hg + +HTML=' + +\n' + +FRAMEHTML=' + +\n' + +STDHEAD=' + + + + + + +' + +# +# UDiffs need a slightly different CSS rule for 'new' items (we don't +# want them to be bolded as we do in cdiffs or sdiffs). +# +UDIFFCSS=' + +' + +# +# input_cmd | html_quote | output_cmd +# or +# html_quote filename | output_cmd +# +# Make a piece of source code safe for display in an HTML
block.
+#
+html_quote()
+{
+ sed -e "s/&/\&/g" -e "s/\</g" -e "s/>/\>/g" "$@" | expand
+}
+
+#
+# input_cmd | bug2url | output_cmd
+#
+# Scan for bugids and insert links to the relevent bug database.
+#
+bug2url()
+{
+ sed -e 's|[0-9]\{5,\}|&|g'
+}
+
+#
+# input_cmd | sac2url | output_cmd
+#
+# Scan for ARC cases and insert links to the relevent SAC database.
+# This is slightly complicated because inside the SWAN, SAC cases are
+# grouped by ARC: PSARC/2006/123. But on OpenSolaris.org, they are
+# referenced as 2006/123 (without labelling the ARC).
+#
+sac2url()
+{
+ if [[ -z $Oflag ]]; then
+ sed -e 's|\([A-Z]\{1,2\}ARC\)[ /]\([0-9]\{4\}\)/\([0-9]\{3\}\)|\1 \2/\3|g'
+ else
+ sed -e 's|\([A-Z]\{1,2\}ARC\)[ /]\([0-9]\{4\}\)/\([0-9]\{3\}\)|\1 \2/\3|g'
+ fi
+}
+
+#
+# strip_unchanged | output_cmd
+#
+# Removes chunks of sdiff documents that have not changed. This makes it
+# easier for a code reviewer to find the bits that have changed.
+#
+# Deleted lines of text are replaced by a horizontal rule. Some
+# identical lines are retained before and after the changed lines to
+# provide some context. The number of these lines is controlled by the
+# variable C in the $AWK script below.
+#
+# The script detects changed lines as any line that has a "\\n\", NR, $0}\n"
+ printf "function changed() "
+ printf "{printf \"%%4d %%s\\n\", NR, $0}\n"
+ printf "function bl() {printf \"%%4d %%s\\n\", NR, $0}\n"
+}
+ /^ {next}
+ /^>/ {next}
+ /^---/ {next}
+
+ {
+ split($1, a, /[cad]/) ;
+ if (index($1, "a")) {
+ if (a[1] == 0) {
+ n = split(a[2], r, /,/);
+ if (n == 1)
+ printf "BEGIN\t\t{sp(1)}\n"
+ else
+ printf "BEGIN\t\t{sp(%d)}\n",\
+ (r[2] - r[1]) + 1
+ next
+ }
+
+ printf "NR==%s\t\t{", a[1]
+ n = split(a[2], r, /,/);
+ s = r[1];
+ if (n == 1)
+ printf "bl();printf \"\\n\"; next}\n"
+ else {
+ n = r[2] - r[1]
+ printf "bl();sp(%d);next}\n",\
+ (r[2] - r[1]) + 1
+ }
+ next
+ }
+ if (index($1, "d")) {
+ n = split(a[1], r, /,/);
+ n1 = r[1]
+ n2 = r[2]
+ if (n == 1)
+ printf "NR==%s\t\t{removed(); next}\n" , n1
+ else
+ printf "NR==%s,NR==%s\t{removed(); next}\n" , n1, n2
+ next
+ }
+ if (index($1, "c")) {
+ n = split(a[1], r, /,/);
+ n1 = r[1]
+ n2 = r[2]
+ final = n2
+ d1 = 0
+ if (n == 1)
+ printf "NR==%s\t\t{changed();" , n1
+ else {
+ d1 = n2 - n1
+ printf "NR==%s,NR==%s\t{changed();" , n1, n2
+ }
+ m = split(a[2], r, /,/);
+ n1 = r[1]
+ n2 = r[2]
+ if (m > 1) {
+ d2 = n2 - n1
+ if (d2 > d1) {
+ if (n > 1) printf "if (NR==%d)", final
+ printf "sp(%d);", d2 - d1
+ }
+ }
+ printf "next}\n" ;
+
+ next
+ }
+ }
+
+ END { printf "{printf \"%%4d %%s\\n\", NR, $0 }\n" }
+ ' /tmp/$$.diffs > /tmp/$$.file1
+
+ #
+ # Now generate the HTML for the new file
+ #
+ $AWK '
+ BEGIN {
+ printf "function sp(n) {for (i=0;i%%4d %%s\\n\", NR, $0}\n"
+ printf "function changed() "
+ printf "{printf \"%%4d %%s\\n\", NR, $0}\n"
+ printf "function bl() {printf \"%%4d %%s\\n\", NR, $0}\n"
+ }
+
+ /^ {next}
+ /^>/ {next}
+ /^---/ {next}
+
+ {
+ split($1, a, /[cad]/) ;
+ if (index($1, "d")) {
+ if (a[2] == 0) {
+ n = split(a[1], r, /,/);
+ if (n == 1)
+ printf "BEGIN\t\t{sp(1)}\n"
+ else
+ printf "BEGIN\t\t{sp(%d)}\n",\
+ (r[2] - r[1]) + 1
+ next
+ }
+
+ printf "NR==%s\t\t{", a[2]
+ n = split(a[1], r, /,/);
+ s = r[1];
+ if (n == 1)
+ printf "bl();printf \"\\n\"; next}\n"
+ else {
+ n = r[2] - r[1]
+ printf "bl();sp(%d);next}\n",\
+ (r[2] - r[1]) + 1
+ }
+ next
+ }
+ if (index($1, "a")) {
+ n = split(a[2], r, /,/);
+ n1 = r[1]
+ n2 = r[2]
+ if (n == 1)
+ printf "NR==%s\t\t{new() ; next}\n" , n1
+ else
+ printf "NR==%s,NR==%s\t{new() ; next}\n" , n1, n2
+ next
+ }
+ if (index($1, "c")) {
+ n = split(a[2], r, /,/);
+ n1 = r[1]
+ n2 = r[2]
+ final = n2
+ d2 = 0;
+ if (n == 1) {
+ final = n1
+ printf "NR==%s\t\t{changed();" , n1
+ } else {
+ d2 = n2 - n1
+ printf "NR==%s,NR==%s\t{changed();" , n1, n2
+ }
+ m = split(a[1], r, /,/);
+ n1 = r[1]
+ n2 = r[2]
+ if (m > 1) {
+ d1 = n2 - n1
+ if (d1 > d2) {
+ if (n > 1) printf "if (NR==%d)", final
+ printf "sp(%d);", d1 - d2
+ }
+ }
+ printf "next}\n" ;
+ next
+ }
+ }
+ END { printf "{printf \"%%4d %%s\\n\", NR, $0 }\n" }
+ ' /tmp/$$.diffs > /tmp/$$.file2
+
+ #
+ # Post-process the HTML files by running them back through $AWK
+ #
+ html_quote < $1 | $AWK -f /tmp/$$.file1 > /tmp/$$.file1.html
+
+ html_quote < $2 | $AWK -f /tmp/$$.file2 > /tmp/$$.file2.html
+
+ #
+ # Now combine into a valid HTML file and side-by-side into a table
+ #
+ print "$HTML$STDHEAD"
+ print "$WNAME Sdiff $TPATH "
+ print ""
+ print "$TPATH/$TNAME
"
+ print "Print this page"
+ print "$COMMENT
\n"
+ print ""
+ print ""
+
+ strip_unchanged /tmp/$$.file1.html
+
+ print "
"
+
+ strip_unchanged /tmp/$$.file2.html
+
+ print "
"
+ print "
"
+ print ""
+
+ framed_sdiff $TNAME $TPATH /tmp/$$.file1.html /tmp/$$.file2.html \
+ "$COMMENT"
+}
+
+
+#
+# framed_sdiff
+#
+# Expects lefthand and righthand side html files created by sdiff_to_html.
+# We use insert_anchors() to augment those with HTML navigation anchors,
+# and then emit the main frame. Content is placed into:
+#
+# $WDIR/DIR/$TNAME.lhs.html
+# $WDIR/DIR/$TNAME.rhs.html
+# $WDIR/DIR/$TNAME.frames.html
+#
+# NOTE: We rely on standard usage of $WDIR and $DIR.
+#
+function framed_sdiff
+{
+ typeset TNAME=$1
+ typeset TPATH=$2
+ typeset lhsfile=$3
+ typeset rhsfile=$4
+ typeset comments=$5
+ typeset RTOP
+
+ # Enable html files to access WDIR via a relative path.
+ RTOP=$(relative_dir $TPATH $WDIR)
+
+ # Make the rhs/lhs files and output the frameset file.
+ print "$HTML$STDHEAD" > $WDIR/$DIR/$TNAME.lhs.html
+
+ cat >> $WDIR/$DIR/$TNAME.lhs.html <<-EOF
+
+
+
+
+ $comments
+ EOF
+
+ cp $WDIR/$DIR/$TNAME.lhs.html $WDIR/$DIR/$TNAME.rhs.html
+
+ insert_anchors $lhsfile >> $WDIR/$DIR/$TNAME.lhs.html
+ insert_anchors $rhsfile >> $WDIR/$DIR/$TNAME.rhs.html
+
+ close=''
+
+ print $close >> $WDIR/$DIR/$TNAME.lhs.html
+ print $close >> $WDIR/$DIR/$TNAME.rhs.html
+
+ print "$FRAMEHTML$STDHEAD" > $WDIR/$DIR/$TNAME.frames.html
+ print "$WNAME Framed-Sdiff " \
+ "$TPATH/$TNAME " >> $WDIR/$DIR/$TNAME.frames.html
+ cat >> $WDIR/$DIR/$TNAME.frames.html <<-EOF
+
+