--- a/make/common/NativeCompilation.gmk Mon Jan 27 21:00:29 2014 -0800
+++ b/make/common/NativeCompilation.gmk Wed Jul 05 19:27:16 2017 +0200
@@ -186,7 +186,7 @@
$1_BASENAME:=$(LIBRARY_PREFIX)$$($1_LIBRARY)$(SHARED_LIBRARY_SUFFIX)
$1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME)
-
+ $1_NOSUFFIX:=$(LIBRARY_PREFIX)$$($1_LIBRARY)
endif
ifneq (,$$($1_STATIC_LIBRARY))
@@ -208,6 +208,7 @@
$1_BASENAME:=$(LIBRARY_PREFIX)$$($1_STATIC_LIBRARY)$(STATIC_LIBRARY_SUFFIX)
$1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME)
+ $1_NOSUFFIX:=$(LIBRARY_PREFIX)$$($1_STATIC_LIBRARY)
endif
ifneq (,$$($1_PROGRAM))
@@ -225,7 +226,7 @@
$1_BASENAME:=$$($1_PROGRAM)$(EXE_SUFFIX)
$1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME)
-
+ $1_NOSUFFIX:=$$($1_PROGRAM)
endif
ifeq (,$$($1_TARGET))
@@ -413,7 +414,78 @@
$1_EXTRA_LDFLAGS += $(call SET_SHARED_LIBRARY_MAPFILE,$$($1_REAL_MAPFILE))
endif
+ # Need to make sure TARGET is first on list
$1 := $$($1_TARGET)
+ ifeq ($$($1_STATIC_LIBRARY),)
+ ifneq ($$($1_DEBUG_SYMBOLS),)
+ ifeq ($(ENABLE_DEBUG_SYMBOLS), true)
+ ifneq ($(OPENJDK_TARGET_OS), macosx) # no MacOS X support yet
+ ifneq ($$($1_OUTPUT_DIR),$$($1_OBJECT_DIR))
+ # The dependency on TARGET is needed on windows for debuginfo files
+ # to be rebuilt properly.
+ $$($1_OUTPUT_DIR)/% : $$($1_OBJECT_DIR)/% $$($1_TARGET)
+ $(CP) $$< $$@
+ endif
+
+ # Generate debuginfo files.
+ ifeq ($(OPENJDK_TARGET_OS), windows)
+ $1_EXTRA_LDFLAGS += "-pdb:$$($1_OBJECT_DIR)/$$($1_NOSUFFIX).pdb" \
+ "-map:$$($1_OBJECT_DIR)/$$($1_NOSUFFIX).map"
+ $1_DEBUGINFO_FILES := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).pdb \
+ $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).map
+
+ # This dependency dance ensures that windows debug info files get rebuilt
+ # properly if deleted.
+ $$($1_TARGET): $$($1_DEBUGINFO_FILES)
+ $$($1_DEBUGINFO_FILES): $$($1_EXPECTED_OBJS)
+
+ else ifeq ($(OPENJDK_TARGET_OS), solaris)
+ $1_DEBUGINFO_FILES := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).debuginfo
+ # gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set.
+ # Use $(FIX_EMPTY_SEC_HDR_FLAGS) to clear the SHF_ALLOC flag (if set) from
+ # empty section headers until a fixed $(OBJCOPY) is available.
+ # An empty section header has sh_addr == 0 and sh_size == 0.
+ # This problem has only been seen on Solaris X64, but we call this tool
+ # on all Solaris builds just in case.
+ #
+ # $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections.
+ # Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available.
+ $$($1_DEBUGINFO_FILES): $$($1_TARGET) \
+ $(FIX_EMPTY_SEC_HDR_FLAGS) $(ADD_GNU_DEBUGLINK)
+ $(RM) $$@
+ $(FIX_EMPTY_SEC_HDR_FLAGS) $(LOG_INFO) $$<
+ $(OBJCOPY) --only-keep-debug $$< $$@
+ $(CD) $$(@D) && $(ADD_GNU_DEBUGLINK) $(LOG_INFO) $$(@F) $$<
+ $(TOUCH) $$@
+
+ else ifeq ($(OPENJDK_TARGET_OS), linux)
+ $1_DEBUGINFO_FILES := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).debuginfo
+ $$($1_DEBUGINFO_FILES): $$($1_TARGET)
+ $(RM) $$@
+ $(OBJCOPY) --only-keep-debug $$< $$@
+ $(CD) $$(@D) && $(OBJCOPY) --add-gnu-debuglink=$$(@F) $$<
+ $(TOUCH) $$@
+
+ endif # No MacOS X support
+
+ ifeq ($(ZIP_DEBUGINFO_FILES), true)
+ $1_DEBUGINFO_ZIP := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).diz
+ $1 += $$(subst $$($1_OBJECT_DIR),$$($1_OUTPUT_DIR),$$($1_DEBUGINFO_ZIP))
+
+ # The dependency on TARGET is needed on windows for debuginfo files
+ # to be rebuilt properly.
+ $$($1_DEBUGINFO_ZIP): $$($1_DEBUGINFO_FILES) $$($1_TARGET)
+ $(CD) $$($1_OBJECT_DIR) \
+ && $(ZIP) -q $$@ $$($1_DEBUGINFO_FILES)
+
+ else
+ $1 += $$(subst $$($1_OBJECT_DIR),$$($1_OUTPUT_DIR),$$($1_DEBUGINFO_FILES))
+ endif
+ endif
+ endif # !MacOS X
+ endif # $1_DEBUG_SYMBOLS
+ endif # !STATIC_LIBRARY
+
ifneq (,$$($1_LIBRARY))
# Generating a dynamic library.
$1_EXTRA_LDFLAGS+=$$(call SET_SHARED_LIBRARY_NAME,$$($1_BASENAME))
@@ -423,77 +495,16 @@
$1_EXTRA_LDFLAGS_SUFFIX += $(GLOBAL_LDFLAGS_SUFFIX)
- ifneq (,$$($1_DEBUG_SYMBOLS))
- ifeq ($(ENABLE_DEBUG_SYMBOLS), true)
- ifeq ($(OPENJDK_TARGET_OS), windows)
- $1_EXTRA_LDFLAGS+="-pdb:$$($1_OBJECT_DIR)/$$($1_LIBRARY).pdb" \
- "-map:$$($1_OBJECT_DIR)/$$($1_LIBRARY).map"
- endif
-
- ifneq ($$($1_OUTPUT_DIR),$$($1_OBJECT_DIR))
- $$($1_OUTPUT_DIR)/% : $$($1_OBJECT_DIR)/%
- $(CP) $$< $$@
- endif
-
- ifneq ($(OPENJDK_TARGET_OS), macosx) # OBJCOPY is not used on MacOS X
- ifneq ($(OPENJDK_TARGET_OS), windows) # nor on Windows
- ifeq ($(OPENJDK_TARGET_OS), solaris)
- # gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set.
- # Use $(FIX_EMPTY_SEC_HDR_FLAGS) to clear the SHF_ALLOC flag (if set) from
- # empty section headers until a fixed $(OBJCOPY) is available.
- # An empty section header has sh_addr == 0 and sh_size == 0.
- # This problem has only been seen on Solaris X64, but we call this tool
- # on all Solaris builds just in case.
- #
- # $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections.
- # Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available.
- $$($1_OBJECT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).debuginfo : $$($1_TARGET) \
- $(FIX_EMPTY_SEC_HDR_FLAGS) $(ADD_GNU_DEBUGLINK)
- $(RM) $$@
- $(FIX_EMPTY_SEC_HDR_FLAGS) $(LOG_INFO) $$<
- $(OBJCOPY) --only-keep-debug $$< $$@
- $(CD) $$(@D) && $(ADD_GNU_DEBUGLINK) $(LOG_INFO) $$(@F) $$<
- else # not solaris
- $$($1_OBJECT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).debuginfo : $$($1_TARGET)
- $(RM) $$@
- $(OBJCOPY) --only-keep-debug $$< $$@
- $(CD) $$(@D) && $(OBJCOPY) --add-gnu-debuglink=$$(@F) $$<
- endif # Touch to not retrigger rule on rebuild
- $(TOUCH) $$@
- endif # !windows
- endif # !macosx
-
- ifeq ($(ZIP_DEBUGINFO_FILES), true)
-ifneq ($(OPENJDK_TARGET_OS), macosx) # no MacOS X support yet
- $1 += $$($1_OUTPUT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).diz
-
- ifeq ($(OPENJDK_TARGET_OS), windows)
- $$($1_OBJECT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).diz : $$($1_TARGET)
- $(CD) $$($1_OBJECT_DIR) \
- && $(ZIP) -q $$@ $$($1_LIBRARY).map $$($1_LIBRARY).pdb
- else
- $$($1_OBJECT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).diz : $$($1_TARGET) \
- $$($1_OBJECT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).debuginfo
- $(CD) $$($1_OBJECT_DIR) \
- && $(ZIP) -q $$@ $$(LIBRARY_PREFIX)$$($1_LIBRARY).debuginfo
- endif
-endif # no MacOS X support yet
- else
- ifeq ($(OPENJDK_TARGET_OS), windows)
- $1 += $$($1_OUTPUT_DIR)/$$($1_LIBRARY).map \
- $$($1_OUTPUT_DIR)/$$($1_LIBRARY).pdb
- else ifneq ($(OPENJDK_TARGET_OS), macosx) # MacOS X does not use .debuginfo files
- $1 += $$($1_OUTPUT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).debuginfo
- endif
- endif
- endif
- endif
-
$$($1_TARGET) : $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_REAL_MAPFILE)
$$(call LINKING_MSG,$$($1_BASENAME))
$$($1_LD) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $(LD_OUT_OPTION)$$@ \
$$($1_EXPECTED_OBJS) $$($1_RES) $$($1_LDFLAGS_SUFFIX) \
$$($1_EXTRA_LDFLAGS_SUFFIX)
+ # Touch target to make sure it has a later time stamp than the debug
+ # symbol files to avoid unnecessary relinking on rebuild.
+ ifeq ($(OPENJDK_TARGET_OS), windows)
+ $(TOUCH) $$@
+ endif
endif
@@ -507,72 +518,6 @@
ifneq (,$$($1_PROGRAM))
# A executable binary has been specified, setup the target for it.
- ifneq (,$$($1_DEBUG_SYMBOLS))
- ifeq ($(ENABLE_DEBUG_SYMBOLS), true)
- ifeq ($(OPENJDK_TARGET_OS), windows)
- $1_EXTRA_LDFLAGS+="-pdb:$$($1_OBJECT_DIR)/$$($1_PROGRAM).pdb" \
- "-map:$$($1_OBJECT_DIR)/$$($1_PROGRAM).map"
- endif
-
- ifneq ($$($1_OUTPUT_DIR),$$($1_OBJECT_DIR))
- $$($1_OUTPUT_DIR)/% : $$($1_OBJECT_DIR)/%
- $(CP) $$< $$@
- endif
-
- ifneq ($(OPENJDK_TARGET_OS), macosx) # OBJCOPY is not used on MacOS X
- ifneq ($(OPENJDK_TARGET_OS), windows) # nor on Windows
- ifeq ($(OPENJDK_TARGET_OS), solaris)
- # gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set.
- # Use $(FIX_EMPTY_SEC_HDR_FLAGS) to clear the SHF_ALLOC flag (if set) from
- # empty section headers until a fixed $(OBJCOPY) is available.
- # An empty section header has sh_addr == 0 and sh_size == 0.
- # This problem has only been seen on Solaris X64, but we call this tool
- # on all Solaris builds just in case.
- #
- # $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections.
- # Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available.
- $$($1_OBJECT_DIR)/$$($1_PROGRAM).debuginfo : $$($1_TARGET) \
- $(FIX_EMPTY_SEC_HDR_FLAGS) $(ADD_GNU_DEBUGLINK)
- $(RM) $$@
- $(FIX_EMPTY_SEC_HDR_FLAGS) $(LOG_INFO) $$<
- $(OBJCOPY) --only-keep-debug $$< $$@
- $(CD) $$(@D) && $(ADD_GNU_DEBUGLINK) $(LOG_INFO) $$(@F) $$<
- else # not solaris
- $$($1_OBJECT_DIR)/$$($1_PROGRAM).debuginfo : $$($1_TARGET)
- $(RM) $$@
- $(OBJCOPY) --only-keep-debug $$< $$@
- $(CD) $$(@D) && $(OBJCOPY) --add-gnu-debuglink=$$(@F) $$<
- endif
- $(TOUCH) $$@
- endif # !windows
- endif # !macosx
-
- ifeq ($(ZIP_DEBUGINFO_FILES), true)
-ifneq ($(OPENJDK_TARGET_OS), macosx) # no MacOS X support yet
- $1 += $$($1_OUTPUT_DIR)/$$($1_PROGRAM).diz
-
- ifeq ($(OPENJDK_TARGET_OS), windows)
- $$($1_OBJECT_DIR)/$$($1_PROGRAM).diz : $$($1_TARGET)
- $(CD) $$($1_OBJECT_DIR) \
- && $(ZIP) -q $$@ $$($1_PROGRAM).map $$($1_PROGRAM).pdb
- else
- $$($1_OBJECT_DIR)/$$(PROGRAM_PREFIX)$$($1_PROGRAM).diz : $$($1_TARGET) \
- $$($1_OBJECT_DIR)/$$($1_PROGRAM).debuginfo
- $(CD) $$($1_OBJECT_DIR) \
- && $(ZIP) -q $$@ $$($1_PROGRAM).debuginfo
- endif
-endif # no MacOS X support yet
- else
- ifeq ($(OPENJDK_TARGET_OS), windows)
- $1 += $$($1_OUTPUT_DIR)/$$($1_PROGRAM).map \
- $$($1_OUTPUT_DIR)/$$($1_PROGRAM).pdb
- else ifneq ($(OPENJDK_TARGET_OS), macosx) # MacOS X does not use .debuginfo files
- $1 += $$($1_OUTPUT_DIR)/$$($1_PROGRAM).debuginfo
- endif
- endif
- endif
- endif
-
$1_EXTRA_LDFLAGS_SUFFIX += $(GLOBAL_LDFLAGS_SUFFIX)
$$($1_TARGET) : $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_GEN_MANIFEST)
@@ -590,5 +535,11 @@
$(CODESIGN) -s openjdk_codesign $$@
endif
endif
+ # Touch target to make sure it has a later time stamp than the debug
+ # symbol files to avoid unnecessary relinking on rebuild.
+ ifeq ($(OPENJDK_TARGET_OS), windows)
+ $(TOUCH) $$@
+ endif
+
endif
endef
--- a/make/scripts/webrev.ksh Mon Jan 27 21:00:29 2014 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2783 +0,0 @@
-#!/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, 2013, 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=25.1-hg+openjdk.java.net
-
-HTML='<?xml version="1.0"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n'
-
-FRAMEHTML='<?xml version="1.0"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n'
-
-STDHEAD='<meta charset="utf-8">
-<meta http-equiv="cache-control" content="no-cache" />
-<meta http-equiv="Pragma" content="no-cache" />
-<meta http-equiv="Expires" content="-1" />
-<!--
- Note to customizers: the body of the webrev is IDed as SUNWwebrev
- to allow easy overriding by users of webrev via the userContent.css
- mechanism available in some browsers.
-
- For example, to have all "removed" information be red instead of
- brown, set a rule in your userContent.css file like:
-
- body#SUNWwebrev span.removed { color: red ! important; }
--->
-<style type="text/css" media="screen">
-body {
- background-color: #eeeeee;
-}
-hr {
- border: none 0;
- border-top: 1px solid #aaa;
- height: 1px;
-}
-div.summary {
- font-size: .8em;
- border-bottom: 1px solid #aaa;
- padding-left: 1em;
- padding-right: 1em;
-}
-div.summary h2 {
- margin-bottom: 0.3em;
-}
-div.summary table th {
- text-align: right;
- vertical-align: top;
- white-space: nowrap;
-}
-span.lineschanged {
- font-size: 0.7em;
-}
-span.oldmarker {
- color: red;
- font-size: large;
- font-weight: bold;
-}
-span.newmarker {
- color: green;
- font-size: large;
- font-weight: bold;
-}
-span.removed {
- color: brown;
-}
-span.changed {
- color: blue;
-}
-span.new {
- color: blue;
- font-weight: bold;
-}
-a.print { font-size: x-small; }
-
-</style>
-
-<style type="text/css" media="print">
-pre { font-size: 0.8em; font-family: courier, monospace; }
-span.removed { color: #444; font-style: italic }
-span.changed { font-weight: bold; }
-span.new { font-weight: bold; }
-span.newmarker { font-size: 1.2em; font-weight: bold; }
-span.oldmarker { font-size: 1.2em; font-weight: bold; }
-a.print {display: none}
-hr { border: none 0; border-top: 1px solid #aaa; height: 1px; }
-</style>
-'
-
-#
-# 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='
-<style type="text/css" media="screen">
-span.new {
- color: blue;
- font-weight: normal;
-}
-</style>
-'
-
-#
-# input_cmd | html_quote | output_cmd
-# or
-# html_quote filename | output_cmd
-#
-# Make a piece of source code safe for display in an HTML <pre> block.
-#
-html_quote()
-{
- sed -e "s/&/\&/g" -e "s/&#\([x]*[0-9A-Fa-f]\{2,5\}\);/\&#\1;/g" -e "s/</\</g" -e "s/>/\>/g" "$@" | expand
-}
-
-#
-# input_cmd | html_quote | output_cmd
-# or
-# html_dequote filename | output_cmd
-#
-# Replace HTML entities with literals
-#
-html_dequote()
-{
- sed -e "s/"/\"/g" -e "s/'/\'/g" -e "s/&/\&/g" -e "s/</<'/g" -e "s/>/>/g" "$@" | expand
-}
-
-#
-# input_cmd | bug2url | output_cmd
-#
-# Scan for bugids and insert <a> links to the relevent bug database.
-#
-bug2url()
-{
- sed -e 's|[0-9]\{5,\}|<a href=\"'$BUGURL$IDPREFIX'&\">&</a>|g'
-}
-
-#
-# strip_unchanged <infile> | 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 "<span class="
-# string embedded (unchanged lines have no particular class and are not
-# part of a <span>). Blank lines (without a sequence number) are also
-# detected since they flag lines that have been inserted or deleted.
-#
-strip_unchanged()
-{
- $AWK '
- BEGIN { C = c = 20 }
- NF == 0 || /span class=/ {
- if (c > C) {
- c -= C
- inx = 0
- if (c > C) {
- print "\n</pre><hr></hr><pre>"
- inx = c % C
- c = C
- }
-
- for (i = 0; i < c; i++)
- print ln[(inx + i) % C]
- }
- c = 0;
- print
- next
- }
- { if (c >= C) {
- ln[c % C] = $0
- c++;
- next;
- }
- c++;
- print
- }
- END { if (c > (C * 2)) print "\n</pre><hr></hr>" }
-
- ' $1
-}
-
-#
-# sdiff_to_html
-#
-# This function takes two files as arguments, obtains their diff, and
-# processes the diff output to present the files as an HTML document with
-# the files displayed side-by-side, differences shown in color. It also
-# takes a delta comment, rendered as an HTML snippet, as the third
-# argument. The function takes two files as arguments, then the name of
-# file, the path, and the comment. The HTML will be delivered on stdout,
-# e.g.
-#
-# $ sdiff_to_html old/usr/src/tools/scripts/webrev.sh \
-# new/usr/src/tools/scripts/webrev.sh \
-# webrev.sh usr/src/tools/scripts \
-# '<a href="https://bugs.openjdk.java.net/browse/JDK-1234567">
-# JDK-1234567</a> my bugid' > <file>.html
-#
-# framed_sdiff() is then called which creates $2.frames.html
-# in the webrev tree.
-#
-# FYI: This function is rather unusual in its use of awk. The initial
-# diff run produces conventional diff output showing changed lines mixed
-# with editing codes. The changed lines are ignored - we're interested in
-# the editing codes, e.g.
-#
-# 8c8
-# 57a61
-# 63c66,76
-# 68,93d80
-# 106d90
-# 108,110d91
-#
-# These editing codes are parsed by the awk script and used to generate
-# another awk script that generates HTML, e.g the above lines would turn
-# into something like this:
-#
-# BEGIN { printf "<pre>\n" }
-# function sp(n) {for (i=0;i<n;i++)printf "\n"}
-# function wl(n) {printf "<font color=%s>%4d %s </font>\n", n, NR, $0}
-# NR==8 {wl("#7A7ADD");next}
-# NR==54 {wl("#7A7ADD");sp(3);next}
-# NR==56 {wl("#7A7ADD");next}
-# NR==57 {wl("black");printf "\n"; next}
-# : :
-#
-# This script is then run on the original source file to generate the
-# HTML that corresponds to the source file.
-#
-# The two HTML files are then combined into a single piece of HTML that
-# uses an HTML table construct to present the files side by side. You'll
-# notice that the changes are color-coded:
-#
-# black - unchanged lines
-# blue - changed lines
-# bold blue - new lines
-# brown - deleted lines
-#
-# Blank lines are inserted in each file to keep unchanged lines in sync
-# (side-by-side). This format is familiar to users of sdiff(1) or
-# Teamware's filemerge tool.
-#
-sdiff_to_html()
-{
- diff -b $1 $2 > /tmp/$$.diffs
-
- TNAME=$3
- TPATH=$4
- COMMENT=$5
-
- #
- # Now we have the diffs, generate the HTML for the old file.
- #
- $AWK '
- BEGIN {
- printf "function sp(n) {for (i=0;i<n;i++)printf \"\\n\"}\n"
- printf "function removed() "
- printf "{printf \"<span class=\\\"removed\\\">%%4d %%s</span>\\n\", NR, $0}\n"
- printf "function changed() "
- printf "{printf \"<span class=\\\"changed\\\">%%4d %%s</span>\\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<n;i++)printf \"\\n\"}\n"
- printf "function new() "
- printf "{printf \"<span class=\\\"new\\\">%%4d %%s</span>\\n\", NR, $0}\n"
- printf "function changed() "
- printf "{printf \"<span class=\\\"changed\\\">%%4d %%s</span>\\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<head>$STDHEAD"
- print "<title>$WNAME Sdiff $TPATH </title>"
- print "</head><body id=\"SUNWwebrev\">"
- print "<h2>$TPATH/$TNAME</h2>"
- print "<a class=\"print\" href=\"javascript:print()\">Print this page</a>"
- print "<pre>$COMMENT</pre>\n"
- print "<table><tr valign=\"top\">"
- print "<td><pre>"
-
- strip_unchanged /tmp/$$.file1.html
-
- print "</pre></td><td><pre>"
-
- strip_unchanged /tmp/$$.file2.html
-
- print "</pre></td>"
- print "</tr></table>"
- print "</body></html>"
-
- framed_sdiff $TNAME $TPATH /tmp/$$.file1.html /tmp/$$.file2.html \
- "$COMMENT"
-}
-
-
-#
-# framed_sdiff <filename> <filepath> <lhsfile> <rhsfile> <comment>
-#
-# 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<head>$STDHEAD" > $WDIR/$DIR/$TNAME.lhs.html
-
- cat >> $WDIR/$DIR/$TNAME.lhs.html <<-EOF
- <script type="text/javascript" src="$RTOP/ancnav.js"></script>
- </head>
- <body id="SUNWwebrev" onkeypress="keypress(event);">
- <a name="0"></a>
- <pre>$comments</pre><hr></hr>
- 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='</body></html>'
-
- print $close >> $WDIR/$DIR/$TNAME.lhs.html
- print $close >> $WDIR/$DIR/$TNAME.rhs.html
-
- print "$FRAMEHTML<head>$STDHEAD" > $WDIR/$DIR/$TNAME.frames.html
- print "<title>$WNAME Framed-Sdiff " \
- "$TPATH/$TNAME</title> </head>" >> $WDIR/$DIR/$TNAME.frames.html
- cat >> $WDIR/$DIR/$TNAME.frames.html <<-EOF
- <frameset rows="*,60">
- <frameset cols="50%,50%">
- <frame src="$TNAME.lhs.html" scrolling="auto" name="lhs" />
- <frame src="$TNAME.rhs.html" scrolling="auto" name="rhs" />
- </frameset>
- <frame src="$RTOP/ancnav.html" scrolling="no" marginwidth="0"
- marginheight="0" name="nav" />
- <noframes>
- <body id="SUNWwebrev">
- Alas 'frames' webrev requires that your browser supports frames
- and has the feature enabled.
- </body>
- </noframes>
- </frameset>
- </html>
- EOF
-}
-
-
-#
-# fix_postscript
-#
-# Merge codereview output files to a single conforming postscript file, by:
-# - removing all extraneous headers/trailers
-# - making the page numbers right
-# - removing pages devoid of contents which confuse some
-# postscript readers.
-#
-# From Casper.
-#
-function fix_postscript
-{
- infile=$1
-
- cat > /tmp/$$.crmerge.pl << \EOF
-
- print scalar(<>); # %!PS-Adobe---
- print "%%Orientation: Landscape\n";
-
- $pno = 0;
- $doprint = 1;
-
- $page = "";
-
- while (<>) {
- next if (/^%%Pages:\s*\d+/);
-
- if (/^%%Page:/) {
- if ($pno == 0 || $page =~ /\)S/) {
- # Header or single page containing text
- print "%%Page: ? $pno\n" if ($pno > 0);
- print $page;
- $pno++;
- } else {
- # Empty page, skip it.
- }
- $page = "";
- $doprint = 1;
- next;
- }
-
- # Skip from %%Trailer of one document to Endprolog
- # %%Page of the next
- $doprint = 0 if (/^%%Trailer/);
- $page .= $_ if ($doprint);
- }
-
- if ($page =~ /\)S/) {
- print "%%Page: ? $pno\n";
- print $page;
- } else {
- $pno--;
- }
- print "%%Trailer\n%%Pages: $pno\n";
-EOF
-
- $PERL /tmp/$$.crmerge.pl < $infile
-}
-
-
-#
-# input_cmd | insert_anchors | output_cmd
-#
-# Flag blocks of difference with sequentially numbered invisible
-# anchors. These are used to drive the frames version of the
-# sdiffs output.
-#
-# NOTE: Anchor zero flags the top of the file irrespective of changes,
-# an additional anchor is also appended to flag the bottom.
-#
-# The script detects changed lines as any line that has a "<span
-# class=" string embedded (unchanged lines have no class set and are
-# not part of a <span>. Blank lines (without a sequence number)
-# are also detected since they flag lines that have been inserted or
-# deleted.
-#
-function insert_anchors
-{
- $AWK '
- function ia() {
- # This should be able to be a singleton <a /> but that
- # seems to trigger a bug in firefox a:hover rule processing
- printf "<a name=\"%d\" id=\"anc%d\"></a>", anc, anc++;
- }
-
- BEGIN {
- anc=1;
- inblock=1;
- printf "<pre>\n";
- }
- NF == 0 || /^<span class=/ {
- if (inblock == 0) {
- ia();
- inblock=1;
- }
- print;
- next;
- }
- {
- inblock=0;
- print;
- }
- END {
- ia();
-
- printf "<b style=\"font-size: large; color: red\">";
- printf "--- EOF ---</b>"
- for(i=0;i<8;i++) printf "\n\n\n\n\n\n\n\n\n\n";
- printf "</pre>"
- printf "<form name=\"eof\">";
- printf "<input name=\"value\" value=\"%d\" type=\"hidden\" />",
- anc - 1;
- printf "</form>";
- }
- ' $1
-}
-
-
-#
-# relative_dir
-#
-# Print a relative return path from $1 to $2. For example if
-# $1=/tmp/myreview/raw_files/usr/src/tools/scripts and $2=/tmp/myreview,
-# this function would print "../../../../".
-#
-# In the event that $1 is not in $2 a warning is printed to stderr,
-# and $2 is returned-- the result of this is that the resulting webrev
-# is not relocatable.
-#
-function relative_dir
-{
- d1=$1
- d2=$2
- if [[ "$d1" == "." ]]; then
- print "."
- else
- typeset cur="${d1##$d2?(/)}"
- typeset ret=""
- if [[ $d2 == $cur ]]; then # Should never happen.
- # Should never happen.
- print -u2 "\nWARNING: relative_dir: \"$1\" not relative "
- print -u2 "to \"$2\". Check input paths. Framed webrev "
- print -u2 "will not be relocatable!"
- print $2
- return
- fi
-
- while [[ -n ${cur} ]];
- do
- cur=${cur%%*(/)*([!/])}
- if [[ -z $ret ]]; then
- ret=".."
- else
- ret="../$ret"
- fi
- done
- print $ret
- fi
-}
-
-
-#
-# frame_nav_js
-#
-# Emit javascript for frame navigation
-#
-function frame_nav_js
-{
-cat << \EOF
-var myInt;
-var scrolling=0;
-var sfactor = 3;
-var scount=10;
-
-function scrollByPix() {
- if (scount<=0) {
- sfactor*=1.2;
- scount=10;
- }
- parent.lhs.scrollBy(0,sfactor);
- parent.rhs.scrollBy(0,sfactor);
- scount--;
-}
-
-function scrollToAnc(num) {
-
- // Update the value of the anchor in the form which we use as
- // storage for this value. setAncValue() will take care of
- // correcting for overflow and underflow of the value and return
- // us the new value.
- num = setAncValue(num);
-
- // Set location and scroll back a little to expose previous
- // lines.
- //
- // Note that this could be improved: it is possible although
- // complex to compute the x and y position of an anchor, and to
- // scroll to that location directly.
- //
- parent.lhs.location.replace(parent.lhs.location.pathname + "#" + num);
- parent.rhs.location.replace(parent.rhs.location.pathname + "#" + num);
-
- parent.lhs.scrollBy(0,-30);
- parent.rhs.scrollBy(0,-30);
-}
-
-function getAncValue()
-{
- return (parseInt(parent.nav.document.diff.real.value));
-}
-
-function setAncValue(val)
-{
- if (val <= 0) {
- val = 0;
- parent.nav.document.diff.real.value = val;
- parent.nav.document.diff.display.value = "BOF";
- return (val);
- }
-
- //
- // The way we compute the max anchor value is to stash it
- // inline in the left and right hand side pages-- it's the same
- // on each side, so we pluck from the left.
- //
- maxval = parent.lhs.document.eof.value.value;
- if (val < maxval) {
- parent.nav.document.diff.real.value = val;
- parent.nav.document.diff.display.value = val.toString();
- return (val);
- }
-
- // this must be: val >= maxval
- val = maxval;
- parent.nav.document.diff.real.value = val;
- parent.nav.document.diff.display.value = "EOF";
- return (val);
-}
-
-function stopScroll() {
- if (scrolling==1) {
- clearInterval(myInt);
- scrolling=0;
- }
-}
-
-function startScroll() {
- stopScroll();
- scrolling=1;
- myInt=setInterval("scrollByPix()",10);
-}
-
-function handlePress(b) {
-
- switch (b) {
- case 1 :
- scrollToAnc(-1);
- break;
- case 2 :
- scrollToAnc(getAncValue() - 1);
- break;
- case 3 :
- sfactor=-3;
- startScroll();
- break;
- case 4 :
- sfactor=3;
- startScroll();
- break;
- case 5 :
- scrollToAnc(getAncValue() + 1);
- break;
- case 6 :
- scrollToAnc(999999);
- break;
- }
-}
-
-function handleRelease(b) {
- stopScroll();
-}
-
-function keypress(ev) {
- var keynum;
- var keychar;
-
- if (window.event) { // IE
- keynum = ev.keyCode;
- } else if (ev.which) { // non-IE
- keynum = ev.which;
- }
-
- keychar = String.fromCharCode(keynum);
-
- if (keychar == "k") {
- handlePress(2);
- return (0);
- } else if (keychar == "j" || keychar == " ") {
- handlePress(5);
- return (0);
- }
- return (1);
-}
-
-function ValidateDiffNum(){
- val = parent.nav.document.diff.display.value;
- if (val == "EOF") {
- scrollToAnc(999999);
- return;
- }
-
- if (val == "BOF") {
- scrollToAnc(0);
- return;
- }
-
- i=parseInt(val);
- if (isNaN(i)) {
- parent.nav.document.diff.display.value = getAncValue();
- } else {
- scrollToAnc(i);
- }
- return false;
-}
-
-EOF
-}
-
-#
-# frame_navigation
-#
-# Output anchor navigation file for framed sdiffs.
-#
-function frame_navigation
-{
- print "$HTML<head>$STDHEAD"
-
- cat << \EOF
-<title>Anchor Navigation</title>
-<meta http-equiv="Content-Script-Type" content="text/javascript" />
-<meta http-equiv="Content-Type" content="text/html" />
-
-<style type="text/css">
- div.button td { padding-left: 5px; padding-right: 5px;
- background-color: #eee; text-align: center;
- border: 1px #444 outset; cursor: pointer; }
- div.button a { font-weight: bold; color: black }
- div.button td:hover { background: #ffcc99; }
-</style>
-EOF
-
- print "<script type=\"text/javascript\" src=\"ancnav.js\"></script>"
-
- cat << \EOF
-</head>
-<body id="SUNWwebrev" bgcolor="#eeeeee" onload="document.diff.real.focus();"
- onkeypress="keypress(event);">
- <noscript lang="javascript">
- <center>
- <p><big>Framed Navigation controls require Javascript</big><br />
- Either this browser is incompatable or javascript is not enabled</p>
- </center>
- </noscript>
- <table width="100%" border="0" align="center">
- <tr>
- <td valign="middle" width="25%">Diff navigation:
- Use 'j' and 'k' for next and previous diffs; or use buttons
- at right</td>
- <td align="center" valign="top" width="50%">
- <div class="button">
- <table border="0" align="center">
- <tr>
- <td>
- <a onMouseDown="handlePress(1);return true;"
- onMouseUp="handleRelease(1);return true;"
- onMouseOut="handleRelease(1);return true;"
- onClick="return false;"
- title="Go to Beginning Of file">BOF</a></td>
- <td>
- <a onMouseDown="handlePress(3);return true;"
- onMouseUp="handleRelease(3);return true;"
- onMouseOut="handleRelease(3);return true;"
- title="Scroll Up: Press and Hold to accelerate"
- onClick="return false;">Scroll Up</a></td>
- <td>
- <a onMouseDown="handlePress(2);return true;"
- onMouseUp="handleRelease(2);return true;"
- onMouseOut="handleRelease(2);return true;"
- title="Go to previous Diff"
- onClick="return false;">Prev Diff</a>
- </td></tr>
-
- <tr>
- <td>
- <a onMouseDown="handlePress(6);return true;"
- onMouseUp="handleRelease(6);return true;"
- onMouseOut="handleRelease(6);return true;"
- onClick="return false;"
- title="Go to End Of File">EOF</a></td>
- <td>
- <a onMouseDown="handlePress(4);return true;"
- onMouseUp="handleRelease(4);return true;"
- onMouseOut="handleRelease(4);return true;"
- title="Scroll Down: Press and Hold to accelerate"
- onClick="return false;">Scroll Down</a></td>
- <td>
- <a onMouseDown="handlePress(5);return true;"
- onMouseUp="handleRelease(5);return true;"
- onMouseOut="handleRelease(5);return true;"
- title="Go to next Diff"
- onClick="return false;">Next Diff</a></td>
- </tr>
- </table>
- </div>
- </td>
- <th valign="middle" width="25%">
- <form action="" name="diff" onsubmit="return ValidateDiffNum();">
- <input name="display" value="BOF" size="8" type="text" />
- <input name="real" value="0" size="8" type="hidden" />
- </form>
- </th>
- </tr>
- </table>
- </body>
-</html>
-EOF
-}
-
-
-
-#
-# diff_to_html <filename> <filepath> { U | C } <comment>
-#
-# Processes the output of diff to produce an HTML file representing either
-# context or unified diffs.
-#
-diff_to_html()
-{
- TNAME=$1
- TPATH=$2
- DIFFTYPE=$3
- COMMENT=$4
-
- print "$HTML<head>$STDHEAD"
- print "<title>$WNAME ${DIFFTYPE}diff $TPATH</title>"
-
- if [[ $DIFFTYPE == "U" ]]; then
- print "$UDIFFCSS"
- fi
-
- cat <<-EOF
- </head>
- <body id="SUNWwebrev">
- <h2>$TPATH</h2>
- <a class="print" href="javascript:print()">Print this page</a>
- <pre>$COMMENT</pre>
- <pre>
-EOF
-
- html_quote | $AWK '
- /^--- new/ { next }
- /^\+\+\+ new/ { next }
- /^--- old/ { next }
- /^\*\*\* old/ { next }
- /^\*\*\*\*/ { next }
- /^-------/ { printf "<center><h1>%s</h1></center>\n", $0; next }
- /^\@\@.*\@\@$/ { printf "</pre><hr /><pre>\n";
- printf "<span class=\"newmarker\">%s</span>\n", $0;
- next}
-
- /^\*\*\*/ { printf "<hr /><span class=\"oldmarker\">%s</span>\n", $0;
- next}
- /^---/ { printf "<span class=\"newmarker\">%s</span>\n", $0;
- next}
- /^\+/ {printf "<span class=\"new\">%s</span>\n", $0; next}
- /^!/ {printf "<span class=\"changed\">%s</span>\n", $0; next}
- /^-/ {printf "<span class=\"removed\">%s</span>\n", $0; next}
- {printf "%s\n", $0; next}
- '
-
- print "</pre></body></html>\n"
-}
-
-
-#
-# source_to_html { new | old } <filename>
-#
-# Process a plain vanilla source file to transform it into an HTML file.
-#
-source_to_html()
-{
- WHICH=$1
- TNAME=$2
-
- print "$HTML<head>$STDHEAD"
- print "<title>$WHICH $TNAME</title>"
- print "<body id=\"SUNWwebrev\">"
- print "<pre>"
- html_quote | $AWK '{line += 1 ; printf "%4d %s\n", line, $0 }'
- print "</pre></body></html>"
-}
-
-comments_from_mercurial()
-{
- fmt=$1
- pfile=$PWS/$2
- cfile=$CWS/$3
-
- logdir=`dirname $cfile`
- logf=`basename $cfile`
- if [ -d $logdir ]; then
- ( cd $logdir;
- active=`hg status $logf 2>/dev/null`
- # If the output from 'hg status' is not empty, it means the file
- # hasn't been committed, so don't fetch comments.
- if [[ -z $active ]] ; then
- if [[ -n $ALL_CREV ]]; then
- rev_opt=
- for rev in $ALL_CREV; do
- rev_opt="$rev_opt --rev $rev"
- done
- comm=`hg log $rev_opt --follow --template 'rev {rev} : {desc}\n' $logf`
- elif [[ -n $FIRST_CREV ]]; then
- comm=`hg log --rev $FIRST_CREV:tip --follow --template 'rev {rev} : {desc}\n' $logf`
- else
- comm=`hg log -l1 --follow --template 'rev {rev} : {desc}\n' $logf`
- fi
- else
- comm=""
- fi
- if [[ $fmt == "text" ]]; then
- print "$comm"
- return
- fi
-
- print "$comm" | html_quote | bug2url
- )
- fi
-}
-
-
-#
-# getcomments {text|html} filepath parentpath
-#
-# Fetch the comments depending on what SCM mode we're in.
-#
-getcomments()
-{
- typeset fmt=$1
- typeset p=$2
- typeset pp=$3
-
- comments_from_mercurial $fmt $pp $p
-}
-
-#
-# printCI <total-changed> <inserted> <deleted> <modified> <unchanged>
-#
-# Print out Code Inspection figures similar to sccs-prt(1) format.
-#
-function printCI
-{
- integer tot=$1 ins=$2 del=$3 mod=$4 unc=$5
- typeset str
- if (( tot == 1 )); then
- str="line"
- else
- str="lines"
- fi
- printf '%d %s changed: %d ins; %d del; %d mod; %d unchg' \
- $tot $str $ins $del $mod $unc
-}
-
-
-#
-# difflines <oldfile> <newfile>
-#
-# Calculate and emit number of added, removed, modified and unchanged lines,
-# and total lines changed, the sum of added + removed + modified.
-#
-function difflines
-{
- integer tot mod del ins unc err
- typeset filename
-
- eval $( diff -e $1 $2 | $AWK '
- # Change range of lines: N,Nc
- /^[0-9]*,[0-9]*c$/ {
- n=split(substr($1,1,length($1)-1), counts, ",");
- if (n != 2) {
- error=2
- exit;
- }
- #
- # 3,5c means lines 3 , 4 and 5 are changed, a total of 3 lines.
- # following would be 5 - 3 = 2! Hence +1 for correction.
- #
- r=(counts[2]-counts[1])+1;
-
- #
- # Now count replacement lines: each represents a change instead
- # of a delete, so increment c and decrement r.
- #
- while (getline != /^\.$/) {
- c++;
- r--;
- }
- #
- # If there were more replacement lines than original lines,
- # then r will be negative; in this case there are no deletions,
- # but there are r changes that should be counted as adds, and
- # since r is negative, subtract it from a and add it to c.
- #
- if (r < 0) {
- a-=r;
- c+=r;
- }
-
- #
- # If there were more original lines than replacement lines, then
- # r will be positive; in this case, increment d by that much.
- #
- if (r > 0) {
- d+=r;
- }
- next;
- }
-
- # Change lines: Nc
- /^[0-9].*c$/ {
- # The first line is a replacement; any more are additions.
- if (getline != /^\.$/) {
- c++;
- while (getline != /^\.$/) a++;
- }
- next;
- }
-
- # Add lines: both Na and N,Na
- /^[0-9].*a$/ {
- while (getline != /^\.$/) a++;
- next;
- }
-
- # Delete range of lines: N,Nd
- /^[0-9]*,[0-9]*d$/ {
- n=split(substr($1,1,length($1)-1), counts, ",");
- if (n != 2) {
- error=2
- exit;
- }
- #
- # 3,5d means lines 3 , 4 and 5 are deleted, a total of 3 lines.
- # following would be 5 - 3 = 2! Hence +1 for correction.
- #
- r=(counts[2]-counts[1])+1;
- d+=r;
- next;
- }
-
- # Delete line: Nd. For example 10d says line 10 is deleted.
- /^[0-9]*d$/ {d++; next}
-
- # Should not get here!
- {
- error=1;
- exit;
- }
-
- # Finish off - print results
- END {
- printf("tot=%d;mod=%d;del=%d;ins=%d;err=%d\n",
- (c+d+a), c, d, a, error);
- }' )
-
- # End of $AWK, Check to see if any trouble occurred.
- if (( $? > 0 || err > 0 )); then
- print "Unexpected Error occurred reading" \
- "\`diff -e $1 $2\`: \$?=$?, err=" $err
- return
- fi
-
- # Accumulate totals
- (( TOTL += tot ))
- (( TMOD += mod ))
- (( TDEL += del ))
- (( TINS += ins ))
- # Calculate unchanged lines
- unc=`wc -l < $1`
- if (( unc > 0 )); then
- (( unc -= del + mod ))
- (( TUNC += unc ))
- fi
- # print summary
- print "<span class=\"lineschanged\">\c"
- printCI $tot $ins $del $mod $unc
- print "</span>"
-}
-
-function outgoing_from_mercurial_forest
-{
- hg foutgoing --template 'rev: {rev}\n' $OUTPWS | $FILTER | $AWK '
- BEGIN {ntree=0}
- /^comparing/ {next}
- /^no changes/ {next}
- /^searching/ {next}
- /^\[.*\]$/ {tree=substr($1,2,length($1)-2);
- trees[ntree++] = tree;
- revs[tree]=-1;
- next}
- /^rev:/ {rev=$2+0;
- if (revs[tree] == -1 || rev < revs[tree])
- { revs[tree] = rev; };
- next;}
- END {for (tree in trees)
- { rev=revs[trees[tree]];
- if (rev > 0)
- {printf("%s %d\n",trees[tree],rev-1)}
- }}' | while read LINE
- do
- set - $LINE
- TREE=$1
- REV=$2
- A=`hg -R $CWS/$TREE log --rev $REV --template '{node}'`
- FSTAT_OPT="--rev $A"
- print "Revision: $A $REV" >> $FLIST
- treestatus $TREE
- done
-}
-
-function flist_from_mercurial_forest
-{
- rm -f $FLIST
- if [ -z "$Nflag" ]; then
- print " File list from hg foutgoing $PWS ..."
- outgoing_from_mercurial_forest
- HG_LIST_FROM_COMMIT=1
- fi
- if [ ! -f $FLIST ]; then
- # hg commit hasn't been run see what is lying around
- print "\n No outgoing, perhaps you haven't commited."
- print " File list from hg fstatus -mard ...\c"
- FSTAT_OPT=
- fstatus
- HG_LIST_FROM_COMMIT=
- fi
- print " Done."
-}
-
-#
-# Used when dealing with the result of 'hg foutgoing'
-# When now go down the tree and generate the change list
-#
-function treestatus
-{
- TREE=$1
- HGCMD="hg -R $CWS/$TREE status $FSTAT_OPT"
-
- $HGCMD -mdn 2>/dev/null | $FILTER | while read F
- do
- echo $TREE/$F
- done >> $FLIST
-
- # Then all the added files
- # But some of these could have been "moved" or renamed ones or copied ones
- # so let's make sure we get the proper info
- # hg status -aC will produce something like:
- # A subdir/File3
- # A subdir/File4
- # File4
- # A subdir/File5
- # The first and last are simple addition while the middle one
- # is a move/rename or a copy. We can't distinguish from a rename vs a copy
- # without also getting the status of removed files. The middle case above
- # is a rename if File4 is also shown a being removed. If File4 is not a
- # removed file, then the middle case is a copy from File4 to subdir/File4
- # FIXME - we're not distinguishing copy from rename
- $HGCMD -aC | $FILTER | while read LINE; do
- ldone=""
- while [ -z "$ldone" ]; do
- ldone="1"
- set - $LINE
- if [ $# -eq 2 -a "$1" == "A" ]; then
- AFILE=$2
- if read LINE2; then
- set - $LINE2
- if [ $# -eq 1 ]; then
- echo $TREE/$AFILE $TREE/$1 >>$FLIST
- elif [ $# -eq 2 ]; then
- echo $TREE/$AFILE >>$FLIST
- LINE=$LINE2
- ldone=""
- fi
- else
- echo $TREE/$AFILE >>$FLIST
- fi
- fi
- done
- done
- $HGCMD -rn | $FILTER | while read RFILE; do
- grep "$TREE/$RFILE" $FLIST >/dev/null
- if [ $? -eq 1 ]; then
- echo $TREE/$RFILE >>$FLIST
- fi
- done
-}
-
-function fstatus
-{
- #
- # forest extension is still being changed. For instance the output
- # of fstatus used to no prepend the tree path to filenames, but
- # this has changed recently. AWK code below does try to handle both
- # cases
- #
- hg fstatus -mdn $FSTAT_OPT 2>/dev/null | $FILTER | $AWK '
- /^\[.*\]$/ {tree=substr($1,2,length($1)-2); next}
- $1 != "" {n=index($1,tree);
- if (n == 0)
- { printf("%s/%s\n",tree,$1)}
- else
- { printf("%s\n",$1)}}' >> $FLIST
-
- #
- # There is a bug in the output of fstatus -aC on recent versions: it
- # inserts a space between the name of the tree and the filename of the
- # old file. e.g.:
- #
- # $ hg fstatus -aC
- # [.]
- #
- # [MyWS]
- # A MyWS/subdir/File2
- # MyWS/ File2
- #
- # [MyWS2]
- #
-
- hg fstatus -aC $FSTAT_OPT 2>/dev/null | $FILTER | $AWK '
- /^\[.*\]$/ {tree=substr($1,2,length($1)-2); next}
- /^A .*/ {n=index($2,tree);
- if (n == 0)
- { printf("A %s/%s\n",tree,$2)}
- else
- { printf("A %s\n",$2)};
- next}
- /^ / {n=index($1,tree);
- if (n == 0)
- { printf("%s/%s\n",tree,$1)}
- else
- { if (NF == 2)
- printf("%s/%s\n",tree,$2)
- else
- printf("%s\n",$1)
- };
- next}
- ' | while read LINE; do
- ldone=""
- while [ -z "$ldone" ]; do
- ldone="1"
- set - $LINE
- if [ $# -eq 2 -a "$1" == "A" ]; then
- AFILE=$2
- if read LINE2; then
- set - $LINE2
- if [ $# -eq 1 ]; then
- echo $AFILE $1 >>$FLIST
- elif [ $# -eq 2 ]; then
- echo $AFILE >>$FLIST
- LINE=$LINE2
- ldone=""
- fi
- else
- echo $AFILE >>$FLIST
- fi
- fi
- done
- done
- hg fstatus -rn $FSTAT_OPT 2>/dev/null | $FILTER | $AWK '
- /^\[.*\]$/ {tree=substr($1,2,length($1)-2); next}
- $1 != "" {n=index($1,tree);
- if (n == 0)
- { printf("%s/%s\n",tree,$1)}
- else
- { printf("%s\n",$1)}}' | while read RFILE; do
- grep "$RFILE" $FLIST >/dev/null
- if [ $? -eq 1 ]; then
- echo $RFILE >>$FLIST
- fi
- done
-}
-
-#
-# flist_from_mercurial $PWS
-#
-# Only local file based repositories are supported at present
-# since even though we can determine the list from the parent finding
-# the changes is harder.
-#
-# We first look for any outgoing files, this is for when the user has
-# run hg commit. If we don't find any then we look with hg status.
-#
-# We need at least one of default-push or default paths set in .hg/hgrc
-# If neither are set we don't know who to compare with.
-
-function flist_from_mercurial
-{
-# if [ "${PWS##ssh://}" != "$PWS" -o \
-# "${PWS##http://}" != "$PWS" -o \
-# "${PWS##https://}" != "$PWS" ]; then
-# print "Remote Mercurial repositories not currently supported."
-# print "Set default and/or default-push to a local repository"
-# exit
-# fi
- if [[ -n $forestflag ]]; then
- HG_LIST_FROM_COMMIT=
- flist_from_mercurial_forest
- else
- STATUS_REV=
- if [[ -n $rflag ]]; then
- STATUS_REV="--rev $PARENT_REV"
- elif [[ -n $OUTREV ]]; then
- STATUS_REV="--rev $OUTREV"
- else
- # hg commit hasn't been run see what is lying around
- print "\n No outgoing, perhaps you haven't commited."
- fi
- # First let's list all the modified or deleted files
-
- hg status $STATUS_REV -mdn | $FILTER > $FLIST
-
- # Then all the added files
- # But some of these could have been "moved" or renamed ones
- # so let's make sure we get the proper info
- # hg status -aC will produce something like:
- # A subdir/File3
- # A subdir/File4
- # File4
- # A subdir/File5
- # The first and last are simple addition while the middle one
- # is a move/rename or a copy. We can't distinguish from a rename vs a copy
- # without also getting the status of removed files. The middle case above
- # is a rename if File4 is also shown a being removed. If File4 is not a
- # removed file, then the middle case is a copy from File4 to subdir/File4
- # FIXME - we're not distinguishing copy from rename
-
- hg status $STATUS_REV -aC | $FILTER >$FLIST.temp
- while read LINE; do
- ldone=""
- while [ -z "$ldone" ]; do
- ldone="1"
- set - $LINE
- if [ $# -eq 2 -a "$1" == "A" ]; then
- AFILE=$2
- if read LINE2; then
- set - $LINE2
- if [ $# -eq 1 ]; then
- echo $AFILE $1 >>$FLIST
- elif [ $# -eq 2 ]; then
- echo $AFILE >>$FLIST
- LINE=$LINE2
- ldone=""
- fi
- else
- echo $AFILE >>$FLIST
- fi
- fi
- done
- done < $FLIST.temp
- hg status $STATUS_REV -rn | $FILTER > $FLIST.temp
- while read RFILE; do
- grep "$RFILE" $FLIST >/dev/null
- if [ $? -eq 1 ]; then
- echo $RFILE >>$FLIST
- fi
- done < $FLIST.temp
- rm -f $FLIST.temp
- fi
-}
-
-function env_from_flist
-{
- [[ -r $FLIST ]] || return
-
- #
- # Use "eval" to set env variables that are listed in the file
- # list. Then copy those into our local versions of those
- # variables if they have not been set already.
- #
- eval `sed -e "s/#.*$//" $FLIST | grep = `
-
- [[ -z $codemgr_ws && -n $CODEMGR_WS ]] && codemgr_ws=$CODEMGR_WS
-
- #
- # Check to see if CODEMGR_PARENT is set in the flist file.
- #
- [[ -z $codemgr_parent && -n $CODEMGR_PARENT ]] && \
- codemgr_parent=$CODEMGR_PARENT
-}
-
-#
-# detect_scm
-#
-# We dynamically test the SCM type; this allows future extensions to
-# new SCM types
-#
-function detect_scm
-{
- if hg root >/dev/null ; then
- print "mercurial"
- else
- print "unknown"
- fi
-}
-
-function look_for_prog
-{
- typeset path
- typeset ppath
- typeset progname=$1
-
- DEVTOOLS=
- OS=`uname`
- if [[ "$OS" == "SunOS" ]]; then
- DEVTOOLS="/java/devtools/`uname -p`/bin"
- elif [[ "$OS" == "Linux" ]]; then
- DEVTOOLS="/java/devtools/linux/bin"
- fi
-
- ppath=$PATH
- ppath=$ppath:/usr/sfw/bin:/usr/bin:/usr/sbin
- ppath=$ppath:/opt/teamware/bin:/opt/onbld/bin
- ppath=$ppath:/opt/onbld/bin/`uname -p`
- ppath=$ppath:/java/devtools/share/bin:$DEVTOOLS
-
- PATH=$ppath prog=`whence $progname`
- if [[ -n $prog ]]; then
- print $prog
- fi
-}
-
-#
-# Find the parent for $1
-#
-function find_outrev
-{
- crev=$1
- prev=`hg log -r $crev --template '{parents}\n'`
- if [[ -z "$prev" ]]
- then
- # No specific parent means previous changeset is parent
- prev=`expr $crev - 1`
- else
- # Format is either of the following two:
- # 546:7df6fcf1183b
- # 548:16f1915bb5cd 547:ffaa4e775815
- prev=`echo $prev | sed -e 's/\([0-9]*\):.*/\1/'`
- fi
- print $prev
-}
-
-function extract_ssh_infos
-{
- CMD=$1
- if expr "$CMD" : 'ssh://[^/]*@' >/dev/null; then
- ssh_user=`echo $CMD | sed -e 's/ssh:\/\/\(.*\)@.*/\1/'`
- ssh_host=`echo $CMD | sed -e 's/ssh:\/\/.*@\([^/]*\)\/.*/\1/'`
- ssh_dir=`echo $CMD | sed -e 's/ssh:\/\/.*@[^/]*\/\(.*\)/\1/'`
- else
- ssh_user=
- ssh_host=`echo $CMD | sed -e 's/ssh:\/\/\([^/]*\)\/.*/\1/'`
- ssh_dir=`echo $CMD | sed -e 's/ssh:\/\/[^/]*\/\(.*\)/\1/'`
- fi
-
-}
-
-function build_old_new_mercurial
-{
- olddir=$1
- newdir=$2
- DIR=$3
- F=$4
- #
- # new version of the file.
- #
- rm -rf $newdir/$DIR/$F
- if [ -f $F ]; then
- cp $F $newdir/$DIR/$F
- fi
-
- #
- # Old version of the file.
- #
- rm -rf $olddir/$DIR/$F
-
- if [ -n "$PWS" ]; then
- if expr "$PWS" : 'ssh://' >/dev/null
- then
- extract_ssh_infos $PWS
- if [ -n "$ssh_user" ]; then
- parent="ssh -l $ssh_user $ssh_host hg -R $ssh_dir --cwd $ssh_dir"
- else
- parent="ssh $ssh_host hg -R $ssh_dir --cwd $ssh_dir"
- fi
- else
- parent="hg -R $PWS --cwd $PWS"
- fi
- else
- parent=""
- fi
-
- if [ -z "$rename" ]; then
- if [ -n "$rflag" ]; then
- parentrev=$PARENT_REV
- elif [ "$HG_LIST_FROM_COMMIT" -eq 1 ]; then
- parentrev=$OUTREV
- else
- if [[ -n $HG_BRANCH ]]; then
- parentrev=$HG_BRANCH
- else
- parentrev="tip"
- fi
- fi
-
- if [ -n "$parentrev" ]; then
- if [ -z "$parent" ]; then
- hg cat --rev $parentrev --output $olddir/$DIR/$F $F 2>/dev/null
- else
- # when specifying a workspace we have to provide
- # the full path
- $parent cat --rev $parentrev --output $olddir/$DIR/$F $DIR/$F 2>/dev/null
- fi
- fi
- else
- # It's a rename (or a move), or a copy, so let's make sure we move
- # to the right directory first, then restore it once done
- current_dir=`pwd`
- hg_root=`hg root`
- cd $CWS
- if [ -n "$rflag" ]; then
- parentrev=$PARENT_REV
- elif [ "$HG_LIST_FROM_COMMIT" -eq 1 ]; then
- parentrev=$OUTREV
- fi
- if [ -z "$parentrev" ]; then
- parentrev=`hg log -l1 $PDIR/$PF | $AWK -F: '/changeset/ {print $2}'`
- fi
- if [ -n "$parentrev" ]; then
- mkdir -p $olddir/$PDIR
- if [ -z "$parent" ]; then
- hg cat -R $hg_root --rev $parentrev --output $olddir/$PDIR/$PF $PDIR/$PF 2>/dev/null
- else
- $parent cat --rev $parentrev --output $olddir/$PDIR/$PF $PDIR/$PF 2>/dev/null
- fi
- fi
- cd $current_dir
- fi
-}
-
-function build_old_new
-{
- if [[ $SCM_MODE == "mercurial" ]]; then
- build_old_new_mercurial $@
- fi
-}
-
-
-#
-# Usage message.
-#
-function usage
-{
- print "Usage:\twebrev [options]
- webrev [options] ( <file> | - )
-
-Options:
- -v: Print the version of this tool.
- -b: Do not ignore changes in the amount of white space.
- -c <CR#>: Include link to CR (aka bugid) in the main page.
- -i <filename>: Include <filename> in the index.html file.
- -o <outdir>: Output webrev to specified directory.
- -p <compare-against>: Use specified parent wkspc or basis for comparison
- -u <username>: Use that username instead of 'guessing' one.
- -m: Forces the use of Mercurial
-
-Mercurial only options:
- -r rev: Compare against a specified revision
- -N: Skip 'hg outgoing', use only 'hg status'
- -f: Use the forest extension
-
-Arguments:
- <file>: Optional file containing list of files to include in webrev
- -: read list of files to include in webrev from standard input
-
-Environment:
- WDIR: Control the output directory.
- WEBREV_BUGURL: Control the URL prefix for bugids.
-
-"
-
- exit 2
-}
-
-#
-#
-# Main program starts here
-#
-#
-LANG="C"
-LC_ALL="C"
-export LANG LC_ALL
-trap "rm -f /tmp/$$.* ; exit" 0 1 2 3 15
-
-set +o noclobber
-
-[[ -z $WDIFF ]] && WDIFF=`look_for_prog wdiff`
-[[ -z $CODEREVIEW ]] && CODEREVIEW=`look_for_prog codereview`
-[[ -z $PS2PDF ]] && PS2PDF=`look_for_prog ps2pdf`
-[[ -z $PERL ]] && PERL=`look_for_prog perl`
-[[ -z $SCCS ]] && SCCS=`look_for_prog sccs`
-[[ -z $AWK ]] && AWK=`look_for_prog nawk`
-[[ -z $AWK ]] && AWK=`look_for_prog gawk`
-[[ -z $AWK ]] && AWK=`look_for_prog awk`
-[[ -z $JAR ]] && JAR=`look_for_prog jar`
-[[ -z $ZIP ]] && ZIP=`look_for_prog zip`
-[[ -z $GETENT ]] && GETENT=`look_for_prog getent`
-[[ -z $WGET ]] && WGET=`look_for_prog wget`
-
-if uname | grep CYGWIN >/dev/null
-then
- ISWIN=1
- # Under windows mercurial outputs '\' instead of '/'
- FILTER="tr '\\\\' '/'"
-else
- FILTER="cat"
-fi
-
-if [[ ! -x $PERL ]]; then
- print -u2 "Error: No perl interpreter found. Exiting."
- exit 1
-fi
-
-#
-# These aren't fatal, but we want to note them to the user.
-#
-# [[ ! -x $CODEREVIEW ]] && print -u2 "WARNING: codereview(1) not found."
-# [[ ! -x $PS2PDF ]] && print -u2 "WARNING: ps2pdf(1) not found."
-# [[ ! -x $WDIFF ]] && print -u2 "WARNING: wdiff not found."
-
-# Declare global total counters.
-integer TOTL TINS TDEL TMOD TUNC
-
-flist_mode=
-flist_file=
-bflag=
-iflag=
-oflag=
-pflag=
-uflag=
-Oflag=
-rflag=
-Nflag=
-forestflag=
-while getopts "c:i:o:p:r:u:mONvfb" opt
-do
- case $opt in
- b) bflag=1;;
-
- i) iflag=1
- INCLUDE_FILE=$OPTARG;;
-
- o) oflag=1
- WDIR=$OPTARG;;
-
- p) pflag=1
- codemgr_parent=$OPTARG;;
-
- u) uflag=1
- username=$OPTARG;;
-
- c) if [[ -z $CRID ]]; then
- CRID=$OPTARG
- else
- CRID="$CRID $OPTARG"
- fi;;
-
- m) SCM_MODE="mercurial";;
-
- O) Oflag=1;; # ignored (bugs are now all visible at bugs.openjdk.java.net)
-
- N) Nflag=1;;
-
- f) forestflag=1;;
-
- r) rflag=1
- PARENT_REV=$OPTARG;;
-
- v) print "$0 version: $WEBREV_UPDATED";;
-
-
- ?) usage;;
- esac
-done
-
-FLIST=/tmp/$$.flist
-HG_LIST_FROM_COMMIT=
-
-if [[ -n $forestflag && -n $rflag ]]; then
- print "The -r <rev> flag is incompatible with the use of forests"
- exit 2
-fi
-
-#
-# If this manually set as the parent, and it appears to be an earlier webrev,
-# then note that fact and set the parent to the raw_files/new subdirectory.
-#
-if [[ -n $pflag && -d $codemgr_parent/raw_files/new ]]; then
- parent_webrev="$codemgr_parent"
- codemgr_parent="$codemgr_parent/raw_files/new"
-fi
-
-shift $(($OPTIND - 1))
-
-if [[ $1 == "-" ]]; then
- cat > $FLIST
- flist_mode="stdin"
- flist_done=1
- shift
-elif [[ -n $1 ]]; then
- if [[ ! -r $1 ]]; then
- print -u2 "$1: no such file or not readable"
- usage
- fi
- cat $1 > $FLIST
- flist_mode="file"
- flist_file=$1
- flist_done=1
- shift
-else
- flist_mode="auto"
-fi
-
-#
-# Before we go on to further consider -l and -w, work out which SCM we think
-# is in use.
-#
-if [[ -z $SCM_MODE ]]; then
- SCM_MODE=`detect_scm $FLIST`
-fi
-if [[ $SCM_MODE == "unknown" ]]; then
- print -u2 "Unable to determine SCM type currently in use."
- print -u2 "For mercurial: webrev runs 'hg root'."
- exit 1
-fi
-
-print -u2 " SCM detected: $SCM_MODE"
-
-
-if [[ $SCM_MODE == "mercurial" ]]; then
- #
- # determine Workspace and parent workspace paths
- #
- CWS=`hg root | $FILTER`
- if [[ -n $pflag && -z "$PWS" ]]; then
- OUTPWS=$codemgr_parent
- # Let's try to expand it if it's an alias defined in [paths]
- tmp=`hg path $OUTPWS 2>/dev/null | $FILTER`
- if [[ -n $tmp ]]; then
- OUTPWS="$tmp"
- fi
- if [[ -n $rflag ]]; then
- if expr "$codemgr_parent" : 'ssh://.*' >/dev/null; then
- PWS=$codemgr_parent
- else
- PWS=`hg -R "$codemgr_parent" root 2>/dev/null | $FILTER`
- fi
- fi
- fi
- #
- # OUTPWS is the parent repository to use when using 'hg outgoing'
- #
- if [[ -z $Nflag ]]; then
- if [[ -n $forestflag ]]; then
- #
- # for forest we have to rely on properly set default and
- # default-push because they can be different from the top one.
- # unless of course it was explicitly specified with -p
- if [[ -z $pflag ]]; then
- OUTPWS=
- fi
- else
- #
- # Unfortunately mercurial is bugged and doesn't handle
- # aliases correctly in 'hg path default'
- # So let's do it ourselves. Sigh...
- if [[ -z "$OUTPWS" ]]; then
- OUTPWS=`grep default-push $CWS/.hg/hgrc | $AWK '{print $3}' | $FILTER`
- fi
- # Still empty, means no default-push
- if [[ -z "$OUTPWS" ]]; then
- OUTPWS=`grep 'default =' $CWS/.hg/hgrc | $AWK '{print $3}' | $FILTER`
- fi
- # Let's try to expand it if it's an alias defined in [paths]
- tmp=`hg path $OUTPWS 2>/dev/null | $FILTER`
- if [[ -n $tmp ]]; then
- OUTPWS="$tmp"
- fi
- fi
- fi
- #
- # OUTPWS may contain username:password, let's make sure we remove the
- # sensitive information before we print out anything in the HTML
- #
- OUTPWS2=$OUTPWS
- if [[ -n $OUTPWS ]]; then
- if [[ `expr "$OUTPWS" : '.*://[^/]*@.*'` -gt 0 ]]; then
- # Remove everything between '://' and '@'
- OUTPWS2=`echo $OUTPWS | sed -e 's/\(.*:\/\/\).*@\(.*\)/\1\2/'`
- fi
- fi
-
- if [[ -z $HG_BRANCH ]]; then
- HG_BRANCH=`hg branch`
- if [ "$HG_BRANCH" == "default" ]; then
- #
- # 'default' means no particular branch, so let's cancel that
- #
- HG_BRANCH=
- fi
- fi
-
- if [[ -z $forestflag ]]; then
- if [[ -z $Nflag ]]; then
- #
- # If no "-N", always do "hg outgoing" against parent
- # repository to determine list of outgoing revisions.
- #
- ALL_CREV=`hg outgoing -q --template '{rev}\n' $OUTPWS | sort -n`
- if [[ -n $ALL_CREV ]]; then
- FIRST_CREV=`echo "$ALL_CREV" | head -1`
- #
- # If no "-r", choose revision to compare against by
- # finding the latest revision not in the outgoing list.
- #
- if [[ -z $rflag ]]; then
- OUTREV=`find_outrev "$FIRST_CREV"`
- if [[ -n $OUTREV ]]; then
- HG_LIST_FROM_COMMIT=1
- fi
- fi
- fi
- elif [[ -n $rflag ]]; then
- #
- # If skipping "hg outgoing" but still comparing against a
- # specific revision (not the tip), set revision for comment
- # accumulation.
- #
- FIRST_CREV=`hg log --rev $PARENT_REV --template '{rev}'`
- FIRST_CREV=`expr $FIRST_CREV + 1`
- fi
- fi
- #Let's check if a merge is needed, if so, issue a warning
- PREV=`hg parent | grep '^tag:.*tip$'`
- if [[ -z $PREV ]]; then
- print "WARNING: parent rev is not tip. Maybe an update or merge is needed"
- fi
-fi
-
-if [[ $flist_mode == "stdin" ]]; then
- print -u2 " File list from: standard input"
-elif [[ $flist_mode == "file" ]]; then
- print -u2 " File list from: $flist_file"
-fi
-
-if [[ $# -gt 0 ]]; then
- print -u2 "WARNING: unused arguments: $*"
-fi
-
-if [[ $SCM_MODE == "mercurial" ]]; then
- if [[ -z $flist_done ]]; then
- flist_from_mercurial $PWS
- fi
-fi
-
-#
-# If the user didn't specify a -i option, check to see if there is a
-# webrev-info file in the workspace directory.
-#
-if [[ -z $iflag && -r "$CWS/webrev-info" ]]; then
- iflag=1
- INCLUDE_FILE="$CWS/webrev-info"
-fi
-
-if [[ -n $iflag ]]; then
- if [[ ! -r $INCLUDE_FILE ]]; then
- print -u2 "include file '$INCLUDE_FILE' does not exist or is" \
- "not readable."
- exit 1
- else
- #
- # $INCLUDE_FILE may be a relative path, and the script alters
- # PWD, so we just stash a copy in /tmp.
- #
- cp $INCLUDE_FILE /tmp/$$.include
- fi
-fi
-
-#
-# Output directory.
-#
-if [[ -z $WDIR ]]; then
- WDIR=$CWS/webrev
-else
- # If the output directory doesn't end with '/webrev' or '/webrev/'
- # then add '/webrev'. This is for backward compatibility
- if ! expr $WDIR : '.*/webrev/\?$' >/dev/null
- then
- WDIR=$WDIR/webrev
- fi
-fi
-# WDIR=${WDIR:-$CWS/webrev}
-
-#
-# Name of the webrev, derived from the workspace name; in the
-# future this could potentially be an option.
-#
-# Let's keep what's after the last '/'
-WNAME=${CWS##*/}
-
-#
-# If WDIR doesn't start with '/' or 'x:' prepend the current dir
-#
-if [ ${WDIR%%/*} ]; then
- if [[ -n $ISWIN ]]; then
- if [ ${WDIR%%[A-Za-z]:*} ]; then
- WDIR=$PWD/$WDIR
- fi
- else
- WDIR=$PWD/$WDIR
- fi
-fi
-
-if [[ ! -d $WDIR ]]; then
- mkdir -p $WDIR
- [[ $? != 0 ]] && exit 1
-fi
-
-#
-# Summarize what we're going to do.
-#
-print " Workspace: $CWS"
-if [[ -n $parent_webrev ]]; then
- print "Compare against: webrev at $parent_webrev"
-elif [[ -n $OUTPWS2 ]]; then
- print "Compare against: $OUTPWS2"
-fi
-if [[ -n $HG_BRANCH ]]; then
- print " Branch: $HG_BRANCH"
-fi
-if [[ -n $rflag ]]; then
- print "Compare against version: $PARENT_REV"
-fi
-[[ -n $INCLUDE_FILE ]] && print " Including: $INCLUDE_FILE"
-print " Output to: $WDIR"
-
-#
-# Save the file list in the webrev dir
-#
-[[ ! $FLIST -ef $WDIR/file.list ]] && cp $FLIST $WDIR/file.list
-
-#
-# Bug IDs will be replaced by a URL. Order of precedence
-# is: default location, $WEBREV_BUGURL
-#
-BUGURL='https://bugs.openjdk.java.net/browse/'
-[[ -n $WEBREV_BUGURL ]] && BUGURL="$WEBREV_BUGURL"
-IDPREFIX='JDK-'
-
-
-rm -f $WDIR/$WNAME.patch
-rm -f $WDIR/$WNAME.changeset
-rm -f $WDIR/$WNAME.ps
-rm -f $WDIR/$WNAME.pdf
-
-touch $WDIR/$WNAME.patch
-
-print " Output Files:"
-
-#
-# Clean up the file list: Remove comments, blank lines and env variables.
-#
-sed -e "s/#.*$//" -e "/=/d" -e "/^[ ]*$/d" $FLIST > /tmp/$$.flist.clean
-FLIST=/tmp/$$.flist.clean
-
-#
-# Clean up residual raw files
-#
-if [ -d $WDIR/raw_files ]; then
- rm -rf $WDIR/raw_files 2>/dev/null
-fi
-
-#
-# Should we ignore changes in white spaces when generating diffs?
-#
-if [[ -n $bflag ]]; then
- DIFFOPTS="-t"
-else
- DIFFOPTS="-bt"
-fi
-#
-# First pass through the files: generate the per-file webrev HTML-files.
-#
-while read LINE
-do
- set - $LINE
- P=$1
-
- if [[ $1 == "Revision:" ]]; then
- OUTREV=$2
- continue
- fi
- #
- # Normally, each line in the file list is just a pathname of a
- # file that has been modified or created in the child. A file
- # that is renamed in the child workspace has two names on the
- # line: new name followed by the old name.
- #
- oldname=""
- oldpath=""
- rename=
- if [[ $# -eq 2 ]]; then
- PP=$2 # old filename
- oldname=" (was $PP)"
- oldpath="$PP"
- rename=1
- PDIR=${PP%/*}
- if [[ $PDIR == $PP ]]; then
- PDIR="." # File at root of workspace
- fi
-
- PF=${PP##*/}
-
- DIR=${P%/*}
- if [[ $DIR == $P ]]; then
- DIR="." # File at root of workspace
- fi
-
- F=${P##*/}
- else
- DIR=${P%/*}
- if [[ "$DIR" == "$P" ]]; then
- DIR="." # File at root of workspace
- fi
-
- F=${P##*/}
-
- PP=$P
- PDIR=$DIR
- PF=$F
- fi
-
- # Make the webrev directory if necessary as it may have been
- # removed because it was empty
- if [ ! -d $CWS/$DIR ]; then
- mkdir -p $CWS/$DIR
- fi
-
- COMM=`getcomments html $P $PP`
-
- print "\t$P$oldname\n\t\t\c"
-
- # Make the webrev mirror directory if necessary
- mkdir -p $WDIR/$DIR
-
- # cd to the directory so the names are short
- cd $CWS/$DIR
-
- #
- # We stash old and new files into parallel directories in /tmp
- # and do our diffs there. This makes it possible to generate
- # clean looking diffs which don't have absolute paths present.
- #
- olddir=$WDIR/raw_files/old
- newdir=$WDIR/raw_files/new
- mkdir -p $olddir
- mkdir -p $newdir
- mkdir -p $olddir/$PDIR
- mkdir -p $newdir/$DIR
-
- build_old_new $olddir $newdir $DIR $F
-
- if [[ ! -f $F && ! -f $olddir/$DIR/$F ]]; then
- print "*** Error: file not in parent or child"
- continue
- fi
-
- cd $WDIR/raw_files
- ofile=old/$PDIR/$PF
- nfile=new/$DIR/$F
-
- mv_but_nodiff=
- cmp $ofile $nfile > /dev/null 2>&1
- if [[ $? == 0 && $rename == 1 ]]; then
- mv_but_nodiff=1
- fi
-
- #
- # Cleaning up
- #
- rm -f $WDIR/$DIR/$F.cdiff.html
- rm -f $WDIR/$DIR/$F.udiff.html
- rm -f $WDIR/$DIR/$F.wdiff.html
- rm -f $WDIR/$DIR/$F.sdiff.html
- rm -f $WDIR/$DIR/$F-.html
- rm -f $WDIR/$DIR/$F.html
-
- its_a_jar=
- if expr $F : '.*\.jar' \| $F : '.*\.zip' >/dev/null; then
- its_a_jar=1
- # It's a JAR or ZIP file, let's do it differently
- if [[ -z $JAR ]]; then
- print "No access to jar, so can't produce diffs for jar or zip files"
- else
- if [ -f $ofile ]; then
- $JAR -tvf $ofile >"$ofile".lst
- fi
- if [ -f $nfile ]; then
- $JAR -tvf $nfile >"$nfile".lst
- fi
-
- if [[ -f $ofile && -f $nfile && -z $mv_but_nodiff ]]; then
-
- ${CDIFFCMD:-diff -bt -C 5} $ofile.lst $nfile.lst > $WDIR/$DIR/$F.cdiff
- diff_to_html $F $DIR/$F "C" "$COMM" < $WDIR/$DIR/$F.cdiff \
- > $WDIR/$DIR/$F.cdiff.html
- print " cdiffs\c"
-
- ${UDIFFCMD:-diff -bt -U 5} $ofile.lst $nfile.lst > $WDIR/$DIR/$F.udiff
- diff_to_html $F $DIR/$F "U" "$COMM" < $WDIR/$DIR/$F.udiff \
- > $WDIR/$DIR/$F.udiff.html
-
- print " udiffs\c"
-
- if [[ -x $WDIFF ]]; then
- $WDIFF -c "$COMM" \
- -t "$WNAME Wdiff $DIR/$F" $ofile.lst $nfile.lst > \
- $WDIR/$DIR/$F.wdiff.html 2>/dev/null
- if [[ $? -eq 0 ]]; then
- print " wdiffs\c"
- else
- print " wdiffs[fail]\c"
- fi
- fi
-
- sdiff_to_html $ofile $nfile $F $DIR "$COMM" \
- > $WDIR/$DIR/$F.sdiff.html
- print " sdiffs\c"
-
- print " frames\c"
-
- rm -f $WDIR/$DIR/$F.cdiff $WDIR/$DIR/$F.udiff
-
- difflines $ofile.lst $nfile.lst > $WDIR/$DIR/$F.count
-
- elif [[ -f $ofile && -f $nfile && -n $mv_but_nodiff ]]; then
- # renamed file: may also have differences
- difflines $ofile.lst $nfile.lst > $WDIR/$DIR/$F.count
- elif [[ -f $nfile ]]; then
- # new file: count added lines
- difflines /dev/null $nfile.lst > $WDIR/$DIR/$F.count
- elif [[ -f $ofile ]]; then
- # old file: count deleted lines
- difflines $ofile.lst /dev/null > $WDIR/$DIR/$F.count
- fi
- fi
- else
-
- #
- # If we have old and new versions of the file then run the
- # appropriate diffs. This is complicated by a couple of factors:
- #
- # - renames must be handled specially: we emit a 'remove'
- # diff and an 'add' diff
- # - new files and deleted files must be handled specially
- # - Solaris patch(1m) can't cope with file creation
- # (and hence renames) as of this writing.
- # - To make matters worse, gnu patch doesn't interpret the
- # output of Solaris diff properly when it comes to
- # adds and deletes. We need to do some "cleansing"
- # transformations:
- # [to add a file] @@ -1,0 +X,Y @@ --> @@ -0,0 +X,Y @@
- # [to del a file] @@ -X,Y +1,0 @@ --> @@ -X,Y +0,0 @@
- #
- cleanse_rmfile="sed 's/^\(@@ [0-9+,-]*\) [0-9+,-]* @@$/\1 +0,0 @@/'"
- cleanse_newfile="sed 's/^@@ [0-9+,-]* \([0-9+,-]* @@\)$/@@ -0,0 \1/'"
-
- if [[ ! "$HG_LIST_FROM_COMMIT" -eq 1 || ! $flist_mode == "auto" ]];
- then
- # Only need to generate a patch file here if there are no commits in outgoing
- # or if we've specified a file list
- rm -f $WDIR/$DIR/$F.patch
- if [[ -z $rename ]]; then
- if [ ! -f $ofile ]; then
- diff -u /dev/null $nfile | sh -c "$cleanse_newfile" \
- > $WDIR/$DIR/$F.patch
- elif [ ! -f $nfile ]; then
- diff -u $ofile /dev/null | sh -c "$cleanse_rmfile" \
- > $WDIR/$DIR/$F.patch
- else
- diff -u $ofile $nfile > $WDIR/$DIR/$F.patch
- fi
- else
- diff -u $ofile /dev/null | sh -c "$cleanse_rmfile" \
- > $WDIR/$DIR/$F.patch
-
- diff -u /dev/null $nfile | sh -c "$cleanse_newfile" \
- >> $WDIR/$DIR/$F.patch
-
- fi
-
-
- #
- # Tack the patch we just made onto the accumulated patch for the
- # whole wad.
- #
- cat $WDIR/$DIR/$F.patch >> $WDIR/$WNAME.patch
- fi
-
- print " patch\c"
-
- if [[ -f $ofile && -f $nfile && -z $mv_but_nodiff ]]; then
-
- ${CDIFFCMD:-diff -bt -C 5} $ofile $nfile > $WDIR/$DIR/$F.cdiff
- diff_to_html $F $DIR/$F "C" "$COMM" < $WDIR/$DIR/$F.cdiff \
- > $WDIR/$DIR/$F.cdiff.html
- print " cdiffs\c"
-
- ${UDIFFCMD:-diff -bt -U 5} $ofile $nfile > $WDIR/$DIR/$F.udiff
- diff_to_html $F $DIR/$F "U" "$COMM" < $WDIR/$DIR/$F.udiff \
- > $WDIR/$DIR/$F.udiff.html
-
- print " udiffs\c"
-
- if [[ -x $WDIFF ]]; then
- $WDIFF -c "$COMM" \
- -t "$WNAME Wdiff $DIR/$F" $ofile $nfile > \
- $WDIR/$DIR/$F.wdiff.html 2>/dev/null
- if [[ $? -eq 0 ]]; then
- print " wdiffs\c"
- else
- print " wdiffs[fail]\c"
- fi
- fi
-
- sdiff_to_html $ofile $nfile $F $DIR "$COMM" \
- > $WDIR/$DIR/$F.sdiff.html
- print " sdiffs\c"
-
- print " frames\c"
-
- rm -f $WDIR/$DIR/$F.cdiff $WDIR/$DIR/$F.udiff
-
- difflines $ofile $nfile > $WDIR/$DIR/$F.count
-
- elif [[ -f $ofile && -f $nfile && -n $mv_but_nodiff ]]; then
- # renamed file: may also have differences
- difflines $ofile $nfile > $WDIR/$DIR/$F.count
- elif [[ -f $nfile ]]; then
- # new file: count added lines
- difflines /dev/null $nfile > $WDIR/$DIR/$F.count
- elif [[ -f $ofile ]]; then
- # old file: count deleted lines
- difflines $ofile /dev/null > $WDIR/$DIR/$F.count
- fi
- fi
- #
- # Now we generate the postscript for this file. We generate diffs
- # only in the event that there is delta, or the file is new (it seems
- # tree-killing to print out the contents of deleted files).
- #
- if [[ -f $nfile ]]; then
- ocr=$ofile
- [[ ! -f $ofile ]] && ocr=/dev/null
-
- if [[ -z $mv_but_nodiff ]]; then
- textcomm=`getcomments text $P $PP`
- if [[ -x $CODEREVIEW ]]; then
- $CODEREVIEW -y "$textcomm" \
- -e $ocr $nfile \
- > /tmp/$$.psfile 2>/dev/null &&
- cat /tmp/$$.psfile >> $WDIR/$WNAME.ps
- if [[ $? -eq 0 ]]; then
- print " ps\c"
- else
- print " ps[fail]\c"
- fi
- fi
- fi
- fi
-
- if [[ -f $ofile && -z $mv_but_nodiff ]]; then
- if [[ -n $its_a_jar ]]; then
- source_to_html Old $P < $ofile.lst > $WDIR/$DIR/$F-.html
- else
- source_to_html Old $P < $ofile > $WDIR/$DIR/$F-.html
- fi
- print " old\c"
- fi
-
- if [[ -f $nfile ]]; then
- if [[ -n $its_a_jar ]]; then
- source_to_html New $P < $nfile.lst > $WDIR/$DIR/$F.html
- else
- source_to_html New $P < $nfile > $WDIR/$DIR/$F.html
- fi
- print " new\c"
- fi
-
- print
-done < $FLIST
-
-# Create the new style mercurial patch here using hg export -r [all-revs] -g -o $CHANGESETPATH
-if [[ $SCM_MODE == "mercurial" ]]; then
- if [[ "$HG_LIST_FROM_COMMIT" -eq 1 && $flist_mode == "auto" ]]; then
- EXPORTCHANGESET="$WNAME.changeset"
- CHANGESETPATH=${WDIR}/${EXPORTCHANGESET}
- rm -f $CHANGESETPATH
- touch $CHANGESETPATH
- if [[ -n $ALL_CREV ]]; then
- rev_opt=
- for rev in $ALL_CREV; do
- rev_opt="$rev_opt --rev $rev"
- done
- elif [[ -n $FIRST_CREV ]]; then
- rev_opt="--rev $FIRST_CREV"
- fi
-
- if [[ -n $rev_opt ]]; then
- (cd $CWS;hg export -g $rev_opt -o $CHANGESETPATH)
- echo "Created changeset: $CHANGESETPATH" 1>&2
- # Use it in place of the jdk.patch created above
- rm -f $WDIR/$WNAME.patch
- fi
- set +x
- fi
-fi
-
-frame_nav_js > $WDIR/ancnav.js
-frame_navigation > $WDIR/ancnav.html
-
-if [[ -f $WDIR/$WNAME.ps && -x $CODEREVIEW && -x $PS2PDF ]]; then
- print " Generating PDF: \c"
- fix_postscript $WDIR/$WNAME.ps | $PS2PDF - > $WDIR/$WNAME.pdf
- print "Done."
-fi
-
-# Now build the index.html file that contains
-# links to the source files and their diffs.
-
-cd $CWS
-
-# Save total changed lines for Code Inspection.
-print "$TOTL" > $WDIR/TotalChangedLines
-
-print " index.html: \c"
-INDEXFILE=$WDIR/index.html
-exec 3<&1 # duplicate stdout to FD3.
-exec 1<&- # Close stdout.
-exec > $INDEXFILE # Open stdout to index file.
-
-print "$HTML<head>"
-print "<meta name=\"scm\" content=\"$SCM_MODE\" />"
-print "$STDHEAD"
-print "<title>$WNAME</title>"
-print "</head>"
-print "<body id=\"SUNWwebrev\">"
-print "<div class=\"summary\">"
-print "<h2>Code Review for $WNAME</h2>"
-
-print "<table>"
-
-if [[ -z $uflag ]]; then
- if [[ $SCM_MODE == "mercurial" ]]; then
- #
- # Let's try to extract the user name from the .hgrc file
- #
- username=`grep '^username' $HOME/.hgrc | sed 's/^username[ ]*=[ ]*\(.*\)/\1/'`
- fi
-
- if [[ -z $username ]]; then
- #
- # Figure out the username and gcos name. To maintain compatibility
- # with passwd(4), we must support '&' substitutions.
- #
- username=`id | cut -d '(' -f 2 | cut -d ')' -f 1`
- if [[ -x $GETENT ]]; then
- realname=`$GETENT passwd $username | cut -d':' -f 5 | cut -d ',' -f 1`
- fi
- userupper=`print "$username" | sed 's/\<./\u&/g'`
- realname=`print $realname | sed s/\&/$userupper/`
- fi
-fi
-
-date="on `date`"
-
-if [[ -n "$username" && -n "$realname" ]]; then
- print "<tr><th>Prepared by:</th>"
- print "<td>$realname ($username) $date</td></tr>"
-elif [[ -n "$username" ]]; then
- print "<tr><th>Prepared by:</th><td>$username $date</td></tr>"
-fi
-
-print "<tr><th>Workspace:</th><td>$CWS</td></tr>"
-if [[ -n $parent_webrev ]]; then
- print "<tr><th>Compare against:</th><td>"
- print "webrev at $parent_webrev"
-else
- if [[ -n $OUTPWS2 ]]; then
- print "<tr><th>Compare against:</th><td>"
- print "$OUTPWS2"
- fi
-fi
-print "</td></tr>"
-if [[ -n $rflag ]]; then
- print "<tr><th>Compare against version:</th><td>$PARENT_REV</td></tr>"
-elif [[ -n $OUTREV ]]; then
- if [[ -z $forestflag ]]; then
- print "<tr><th>Compare against version:</th><td>$OUTREV</td></tr>"
- fi
-fi
-if [[ -n $HG_BRANCH ]]; then
- print "<tr><th>Branch:</th><td>$HG_BRANCH</td></tr>"
-fi
-
-print "<tr><th>Summary of changes:</th><td>"
-printCI $TOTL $TINS $TDEL $TMOD $TUNC
-print "</td></tr>"
-
-if [[ -f $WDIR/$WNAME.patch ]]; then
- print "<tr><th>Patch of changes:</th><td>"
- print "<a href=\"$WNAME.patch\">$WNAME.patch</a></td></tr>"
-elif [[ -f $CHANGESETPATH ]]; then
- print "<tr><th>Changeset:</th><td>"
- print "<a href=\"$EXPORTCHANGESET\">$EXPORTCHANGESET</a></td></tr>"
-fi
-
-if [[ -f $WDIR/$WNAME.pdf ]]; then
- print "<tr><th>Printable review:</th><td>"
- print "<a href=\"$WNAME.pdf\">$WNAME.pdf</a></td></tr>"
-fi
-
-if [[ -n "$iflag" ]]; then
- print "<tr><th>Author comments:</th><td><div>"
- cat /tmp/$$.include
- print "</div></td></tr>"
-fi
-# Add links to referenced CRs, if any
-# URL has a <title> like:
-# <title>[#JDK-8024688] b106-lambda: j.u.Map.merge doesn't work as specified if contains key:null pair - Java Bug System</title>
-# we format this to:
-# JDK-8024688: b106-lambda: j.u.Map.merge doesn't work as specified if contains key:null pair
-if [[ -n $CRID ]]; then
- for id in $CRID
- do
- #add "JDK-" to raw bug id for openjdk.java.net links.
- id=`echo ${id} | sed 's/^\([0-9]\{5,\}\)$/JDK-\1/'`
-
- print "<tr><th>Bug id:</th><td>"
- url="${BUGURL}${id}"
-
- if [[ -n $WGET ]]; then
- msg=`$WGET --timeout=10 --tries=1 -q $url -O - | grep '<title>' | sed 's/<title>\[#\(.*\)\] \(.*\) - Java Bug System<\/title>/\1 : \2/' | html_dequote | html_quote`
- fi
- if [[ -z $msg ]]; then
- msg="${id}"
- fi
-
- print "<a href=\"$url\">$msg</a>"
-
- print "</td></tr>"
- done
-fi
-print "<tr><th>Legend:</th><td>"
-print "<b>Modified file</b><br><font color=red><b>Deleted file</b></font><br><font color=green><b>New file</b></font></td></tr>"
-print "</table>"
-print "</div>"
-
-#
-# Second pass through the files: generate the rest of the index file
-#
-while read LINE
-do
- set - $LINE
- if [[ $1 == "Revision:" ]]; then
- FIRST_CREV=`expr $3 + 1`
- continue
- fi
- P=$1
-
- if [[ $# == 2 ]]; then
- PP=$2
- oldname=" <i>(was $PP)</i>"
-
- else
- PP=$P
- oldname=""
- fi
-
- DIR=${P%/*}
- if [[ $DIR == $P ]]; then
- DIR="." # File at root of workspace
- fi
-
- # Avoid processing the same file twice.
- # It's possible for renamed files to
- # appear twice in the file list
-
- F=$WDIR/$P
-
- print "<p><code>"
-
- # If there's a diffs file, make diffs links
-
- NODIFFS=
- if [[ -f $F.cdiff.html ]]; then
- print "<a href=\"$P.cdiff.html\">Cdiffs</a>"
- print "<a href=\"$P.udiff.html\">Udiffs</a>"
-
- if [[ -f $F.wdiff.html && -x $WDIFF ]]; then
- print "<a href=\"$P.wdiff.html\">Wdiffs</a>"
- fi
-
- print "<a href=\"$P.sdiff.html\">Sdiffs</a>"
-
- print "<a href=\"$P.frames.html\">Frames</a>"
- else
- NODIFFS=1
- print " ------ ------ ------"
-
- if [[ -x $WDIFF ]]; then
- print " ------"
- fi
-
- print " ------"
- fi
-
- # If there's an old file, make the link
-
- NOOLD=
- if [[ -f $F-.html ]]; then
- print "<a href=\"$P-.html\">Old</a>"
- else
- NOOLD=1
- print " ---"
- fi
-
- # If there's an new file, make the link
-
- NONEW=
- if [[ -f $F.html ]]; then
- print "<a href=\"$P.html\">New</a>"
- else
- NONEW=1
- print " ---"
- fi
-
- if [[ -f $F.patch ]]; then
- print "<a href=\"$P.patch\">Patch</a>"
- else
- print " -----"
- fi
-
- if [[ -f $WDIR/raw_files/new/$P ]]; then
- print "<a href=\"raw_files/new/$P\">Raw</a>"
- else
- print " ---"
- fi
- print "</code>"
- if [[ -n $NODIFFS && -z $oldname ]]; then
- if [[ -n $NOOLD ]]; then
- print "<font color=green><b>$P</b></font>"
- elif [[ -n $NONEW ]]; then
- print "<font color=red><b>$P</b></font>"
- fi
- else
- print "<b>$P</b> $oldname"
- fi
-
- print "</p><blockquote>\c"
- # Insert delta comments if any
- comments=`getcomments html $P $PP`
- if [ -n "$comments" ]; then
- print "<pre>$comments</pre>"
- fi
-
- # Add additional comments comment
-
- print "<!-- Add comments to explain changes in $P here -->"
-
- # Add count of changes.
-
- if [[ -f $F.count ]]; then
- cat $F.count
- rm $F.count
- fi
- print "</blockquote>"
-done < $FLIST
-
-print
-print
-print "<hr />"
-print "<p style=\"font-size: small\">"
-print "This code review page was prepared using <b>$0</b>"
-print "(vers $WEBREV_UPDATED)."
-print "</body>"
-print "</html>"
-
-if [[ -n $ZIP ]]; then
- # Let's generate a zip file for convenience
- cd $WDIR/..
- if [ -f webrev.zip ]; then
- rm webrev.zip
- fi
- $ZIP -r webrev webrev >/dev/null 2>&1
-fi
-
-exec 1<&- # Close FD 1.
-exec 1<&3 # dup FD 3 to restore stdout.
-exec 3<&- # close FD 3.
-
-print "Done."
-print "Output to: $WDIR"