SOLR-2747: Added 'ant changes-to-html' to Solr.

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1378452 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Steven Rowe 2012-08-29 06:26:02 +00:00
parent 223b127eae
commit c8aa9c1f42
7 changed files with 382 additions and 211 deletions

View File

@ -7553,7 +7553,7 @@ Infrastructure
11. Fixed bugs in GermanAnalyzer (gschwarz)
1.2 RC2:
1.2 RC2
- added sources to distribution
- removed broken build scripts and libraries from distribution
- SegmentsReader: fixed potential race condition
@ -7568,7 +7568,8 @@ Infrastructure
- JDK 1.1 compatibility fix: disabled lock files for JDK 1.1,
since they rely on a feature added in JDK 1.2.
1.2 RC1 (first Apache release):
1.2 RC1
- first Apache release
- packages renamed from com.lucene to org.apache.lucene
- license switched from LGPL to Apache
- ant-only build -- no more makefiles
@ -7579,7 +7580,8 @@ Infrastructure
- Analyzers can choose tokenizer based on field name
- misc bug fixes.
1.01b (last Sourceforge release)
1.01b
. last Sourceforge release
. a few bug fixes
. new Query Parser
. new prefix query (search for "foo*" matches "food")

View File

@ -470,24 +470,6 @@
<modules-crawl target="test" failonerror="true"/>
</target>
<!--
compile changes.txt into an html file
-->
<macrodef name="build-changes">
<attribute name="changes.src.dir" default="${changes.src.dir}"/>
<attribute name="changes.target.dir" default="${changes.target.dir}"/>
<sequential>
<mkdir dir="@{changes.target.dir}"/>
<exec executable="perl" input="CHANGES.txt" output="@{changes.target.dir}/Changes.html"
failonerror="true" logError="true">
<arg value="@{changes.src.dir}/changes2html.pl"/>
</exec>
<copy todir="@{changes.target.dir}">
<fileset dir="@{changes.src.dir}" includes="*.css"/>
</copy>
</sequential>
</macrodef>
<target name="changes-to-html">
<build-changes changes.src.dir="${changes.src.dir}" changes.target.dir="${changes.target.dir}" />
</target>

View File

@ -1681,4 +1681,22 @@ ${tests-output}/junit4-*.suites - per-JVM executed suites
</sequential>
</macrodef>
<!--
compile changes.txt into an html file
-->
<macrodef name="build-changes">
<attribute name="changes.src.dir" default="${changes.src.dir}"/>
<attribute name="changes.target.dir" default="${changes.target.dir}"/>
<sequential>
<mkdir dir="@{changes.target.dir}"/>
<exec executable="perl" input="CHANGES.txt" output="@{changes.target.dir}/Changes.html"
failonerror="true" logError="true">
<arg value="@{changes.src.dir}/changes2html.pl"/>
</exec>
<copy todir="@{changes.target.dir}">
<fileset dir="@{changes.src.dir}" includes="*.css"/>
</copy>
</sequential>
</macrodef>
</project>

View File

@ -25,13 +25,12 @@ use strict;
use warnings;
# JIRA REST API documentation: <http://docs.atlassian.com/jira/REST/latest/>
my $project_info_url = 'https://issues.apache.org/jira/rest/api/2/project/LUCENE';
my $project_info_url = 'https://issues.apache.org/jira/rest/api/2/project';
my $jira_url_prefix = 'http://issues.apache.org/jira/browse/';
my $bugzilla_url_prefix = 'http://issues.apache.org/bugzilla/show_bug.cgi?id=';
my %release_dates = &setup_release_dates;
my $month_regex = &setup_month_regex;
my %month_nums = &setup_month_nums;
my %bugzilla_jira_map = &setup_bugzilla_jira_map;
my %lucene_bugzilla_jira_map = &setup_lucene_bugzilla_jira_map;
my $title = undef;
my $release = undef;
my $reldate = undef;
@ -44,20 +43,35 @@ my @releases = ();
my @lines = <>; # Get all input at once
my $product = '';
for my $line (@lines) {
($product) = $line =~ /(Solr|Lucene)/i;
if ($product) {
$product = uc($product);
last;
}
}
my %release_dates = &setup_release_dates;
my $in_major_component_versions_section = 0;
#
# Parse input and build hierarchical release structure in @releases
#
for (my $line_num = 0 ; $line_num <= $#lines ; ++$line_num) {
$_ = $lines[$line_num];
next unless (/\S/); # Skip blank lines
unless (/\S/) { # Skip blank lines
$in_major_component_versions_section = 0;
next;
}
next if (/^\s*\$Id(?::.*)?\$/); # Skip $Id$ lines
next if (/^\s{0,4}-{5,}\s*$/); # Skip Solr's section underlines
unless ($title) {
if (/\S/) {
s/^\s+//; # Trim leading whitespace
s/^[^\p{N}\p{L}]*//; # Trim leading non-alphanum chars, including BOM chars, if any
s/\s+$//; # Trim trailing whitespace
}
s/^[^Ll]*//; # Trim leading BOM characters if exists
$title = $_;
next;
}
@ -71,8 +85,11 @@ for (my $line_num = 0 ; $line_num <= $#lines ; ++$line_num) {
($reldate, $relinfo) = get_release_date($release, $relinfo);
$sections = [];
push @releases, [ $release, $reldate, $relinfo, $sections ];
($first_relid = lc($release)) =~ s/\s+/_/g if ($#releases == 0);
($second_relid = lc($release)) =~ s/\s+/_/g if ($#releases == 1);
($first_relid = lc($release)) =~ s/\s+/_/g
if ($#releases == 0 or ($#releases == 1 and not ($releases[0][0])));
($second_relid = lc($release)) =~ s/\s+/_/g
if ( ($#releases == 1 and $releases[0][0])
or ($#releases == 2 and not $releases[0][0]));
$items = undef;
next;
}
@ -90,18 +107,43 @@ for (my $line_num = 0 ; $line_num <= $#lines ; ++$line_num) {
next;
}
if (m!^20\d\d[-/]\d{1,2}[-/]\d{1,2}!) { # Collect dated postscripts
my $item = $_;
my $line = '';
while ($line_num < $#lines and ($line = $lines[++$line_num]) =~ /\S/) {
$line =~ s/^\s+//; # Trim leading whitespace
$line =~ s/\s+$//; # Trim trailing whitespace
$item .= "$line\n";
}
push @releases, [ $item, '', '', [] ];
next;
}
# Section heading: no leading whitespace, initial word capitalized,
# five words or less, and no trailing punctuation
if (/^([A-Z]\S*(?:\s+\S+){0,4})(?<![-.:;!()])\s*$/) {
if ( /^([A-Z]\S*(?:\s+\S+){0,4})(?<![-.:;!()])\s*$/
and not $in_major_component_versions_section) {
my $heading = $1;
$items = [];
unless (@releases) {
$sections = [];
# Make a fake release to hold pre-release sections
push @releases, [ undef, undef, undef, $sections ];
}
push @$sections, [ $heading, $items ];
$in_major_component_versions_section
= ($heading =~ /Versions of Major Components/i);
next;
}
# Handle earlier releases without sections - create a headless section
unless ($items) {
$items = [];
unless (@releases) {
$sections = [];
# Make a fake release to hold pre-release sections and items
push @releases, [ undef, undef, undef, $sections ];
}
push @$sections, [ undef, $items ];
}
@ -130,7 +172,7 @@ for (my $line_num = 0 ; $line_num <= $#lines ; ++$line_num) {
}
$item =~ s/\n+\Z/\n/; # Trim trailing blank lines
push @$items, $item;
--$line_num unless ($line_num == $#lines);
--$line_num unless ($line_num == $#lines && $lines[$line_num] !~ /^20/);
} elsif ($type eq 'paragraph') { # List item boundary is a blank line
my $line;
my $item = $_;
@ -139,13 +181,17 @@ for (my $line_num = 0 ; $line_num <= $#lines ; ++$line_num) {
$item =~ s/\s+$//; # Trim trailing whitespace
$item .= "\n";
unless ($in_major_component_versions_section) {
while ($line_num < $#lines and ($line = $lines[++$line_num]) =~ /\S/) {
$line =~ s/^\s{$leading_ws_width}//; # Trim leading whitespace
$line =~ s/\s+$//; # Trim trailing whitespace
$item .= "$line\n";
}
} else {
++$line_num;
}
push @$items, $item;
--$line_num unless ($line_num == $#lines);
--$line_num unless ($line_num == $#lines && $lines[$line_num] !~ /^20/);
} else { # $type is one of the bulleted types
# List item boundary is another bullet or a blank line
my $line;
@ -162,7 +208,7 @@ for (my $line_num = 0 ; $line_num <= $#lines ; ++$line_num) {
$item .= "$line\n";
}
push @$items, $item;
--$line_num unless ($line_num == $#lines);
--$line_num unless ($line_num == $#lines && $lines[$line_num] !~ /^20/);
}
}
@ -357,9 +403,12 @@ __HTML_HEADER__
my $heading;
my $relcnt = 0;
my $header = 'h2';
my $subheader = 'h3';
for my $rel (@releases) {
if (++$relcnt == 3) {
if ($relcnt == 2) {
$header = 'h3';
$subheader = 'h4';
print "<h2><a id=\"older\" href=\"javascript:toggleList('older')\">";
print "Older Releases";
print "</a></h2>\n";
@ -371,37 +420,54 @@ for my $rel (@releases) {
# The first section heading is undefined for the older sectionless releases
my $has_release_sections = has_release_sections($sections);
(my $relid = lc($release)) =~ s/\s+/_/g;
print "<$header><a id=\"$relid\" href=\"javascript:toggleList('$relid')\">";
print "Release " unless ($release =~ /^trunk$/i);
my $relid = '';
if ($release) { # Pre-release sections have no release ID
++$relcnt;
($relid = lc($release)) =~ s/\s+/_/g;
print "<$header>";
print "<a id=\"$relid\" href=\"javascript:toggleList('$relid')\">"
unless ($release =~ /^20\d\d/);
print "Release " unless ($release =~ /^trunk$|^20\d\d/i);
print "$release $relinfo";
print " [$reldate]" unless ($reldate eq 'unknown');
print "</a></$header>\n";
print " [$reldate]" unless ($reldate eq 'unknown' or not $reldate);
print "</a>" unless ($release =~ /^20\d\d/);
print "</$header>\n";
print "<ul id=\"$relid.list\">\n"
if ($has_release_sections);
}
for my $section (@$sections) {
($heading, $items) = @$section;
(my $sectid = lc($heading)) =~ s/\s+/_/g;
my $numItemsStr = $#{$items} > 0 ? "($#{$items})" : "(none)";
my $list_item = "li";
if ($release) {
if ($heading and $heading eq 'Detailed Change List') {
print " <$subheader>$heading</$subheader>\n";
next;
} elsif ($has_release_sections and $heading) {
print " <li><a id=\"$relid.$sectid\"",
" href=\"javascript:toggleList('$relid.$sectid')\">",
($heading || ''), "</a>&nbsp;&nbsp;&nbsp;$numItemsStr\n"
if ($has_release_sections and $heading);
}
} else {
print "<h2>$heading</h2>\n" if ($heading);
$list_item = "p";
}
my $list_type = $items->[0] || '';
my $list = ($has_release_sections || $list_type eq 'numbered' ? 'ol' : 'ul');
my $listid = $sectid ? "$relid.$sectid" : $relid;
print " <$list id=\"$listid.list\">\n"
unless ($has_release_sections and not $heading);
unless (not $release or ($has_release_sections and not $heading));
for my $itemnum (1..$#{$items}) {
my $item = $items->[$itemnum];
$item =~ s:&:&amp;:g; # Escape HTML metachars, but leave
$item =~ s:<(?!/?code>):&lt;:gi; # <code> tags intact and add <pre>
$item =~ s:(?<!code)>:&gt;:gi; # wrappers for non-inline sections
$item =~ s{((?:^|.*\n)\s*)<code>(?!</code>.+)(.+)</code>(?![ \t]*\S)}
$item =~ s:&:&amp;:g; # Escape HTML metachars, but leave <code> tags
$item =~ s~<(?!/?code>(?:[^,]|$))~&lt;~gi; # intact - unless followed by a comma - and
$item =~ s:(?<!code)>:&gt;:gi; # add <pre> wrappers for non-inline sections
$item =~ s{((?:^|.*\n)\s*)<code>(?!,)(?!</code>.+)(.+)</code>(?![ \t]*\S)}
{
my $prefix = $1;
my $code = $2;
@ -409,62 +475,67 @@ for my $rel (@releases) {
"$prefix<code><pre>$code</pre></code>"
}gise;
# Put attributions on their own lines.
# Check for trailing parenthesized attribution with no following period.
# Exclude things like "(see #3 above)" and "(use the bug number instead of xxxx)"
unless ($item =~ s:\s*(\((?!see #|use the bug number)[^()"]+?\))\s*$:\n<br /><span class="attrib">$1</span>:) {
# If attribution is not found, then look for attribution with a
# trailing period, but try not to include trailing parenthesized things
# that are not attributions.
#
# Rule of thumb: if a trailing parenthesized expression with a following
# period does not contain "LUCENE-XXX", and it either has three or
# fewer words or it includes the word "via" or the phrase "updates from",
# then it is considered to be an attribution.
$item =~ s{(\s*(\((?!see \#|use the bug number)[^()"]+?\)))
((?:\.|(?i:\.?\s*Issue\s+\d{3,}|LUCENE-\d+)\.?)\s*)$}
{
my $subst = $1; # default: no change
my $parenthetical = $2;
my $trailing_period_and_or_issue = $3;
if ($parenthetical !~ /LUCENE-\d+/) {
my ($no_parens) = $parenthetical =~ /^\((.*)\)$/s;
my @words = grep {/\S/} split /\s+/, $no_parens;
if ($no_parens =~ /\b(?:via|updates\s+from)\b/i || scalar(@words) <= 3) {
$subst = "\n<br /><span class=\"attrib\">$parenthetical</span>";
}
}
$subst . $trailing_period_and_or_issue;
}ex;
}
$item = markup_trailing_attribution($item) unless ($item =~ /\n[ ]*-/);
$item =~ s{(.*?)(<code><pre>.*?</pre></code>)|(.*)}
{
my $uncode = undef;
if (defined($2)) {
$uncode = $1 || '';
my ($one,$two,$three) = ($1,$2,$3);
if (defined($two)) {
$uncode = $one || '';
$uncode =~ s{^(.*?)(?=\n[ ]*-)}
{
my $prefix = $1;
my ($primary,$additional_work) = $prefix =~ /^(.*?)((?:\s*Additional\s+Work:\s*)?)$/si;
my $result = markup_trailing_attribution($primary);
$result .= "<br />\n$additional_work<br />" if ($additional_work);
$result;
}se;
$uncode =~ s{((?<=\n)[ ]*-.*\n(?:.*\n)*)}
{
my $bulleted_list = $1;
$bulleted_list
=~ s{(?:(?<=\n)|\A)[ ]*-[ ]*(.*(?:\n|\z)(?:[ ]+[^ -].*(?:\n|\z))*)}
{<li class="bulleted-list">\n$1</li>\n}g;
{
qq!<li class="bulleted-list">\n!
. markup_trailing_attribution($1)
. "</li>\n"
}ge;
$bulleted_list
=~ s!(<li.*</li>\n)!<ul class="bulleted-list">\n$1</ul>\n!s;
=~ s{(<li.*</li>\n)(.*)}
{
qq!<ul class="bulleted-list">\n$1</ul>\n!
. markup_trailing_attribution($2 || '')
}se;
$bulleted_list;
}ge;
"$uncode$2";
"$uncode$two";
} else {
$uncode = $3 || '';
$uncode = $three || '';
$uncode =~ s{^(.*?)(?=\n[ ]*-)}
{
my $prefix = $1;
my ($primary,$additional_work) = $prefix =~ /^(.*?)((?:\s*Additional\s+Work:\s*)?)$/si;
my $result = markup_trailing_attribution($primary);
$result .= "<br />\n$additional_work<br />" if ($additional_work);
$result;
}se;
$uncode =~ s{((?<=\n)[ ]*-.*\n(?:.*\n)*)}
{
my $bulleted_list = $1;
$bulleted_list
=~ s{(?:(?<=\n)|\A)[ ]*-[ ]*(.*(?:\n|\z)(?:[ ]+[^ -].*(?:\n|\z))*)}
{<li class="bulleted-list">\n$1</li>\n}g;
{
qq!<li class="bulleted-list">\n!
. markup_trailing_attribution($1)
. "</li>\n"
}ge;
$bulleted_list
=~ s!(<li.*</li>\n)!<ul class="bulleted-list">\n$1</ul>\n!s;
=~ s{(<li.*</li>\n)(.*)}
{
qq!<ul class="bulleted-list">\n$1</ul>\n!
. markup_trailing_attribution($2 || '')
}se;
$bulleted_list;
}ge;
$uncode;
@ -480,10 +551,11 @@ for my $rel (@releases) {
# Link Lucene XXX, SOLR XXX and INFRA XXX to JIRA
$item =~ s{((LUCENE|SOLR|INFRA)\s+(\d{3,}))}
{<a href="${jira_url_prefix}\U$2\E-$3">$1</a>}gi;
if ($product eq 'LUCENE') {
# Find single Bugzilla issues
$item =~ s~((?i:bug|patch|issue)\s*\#?\s*(\d+))
~ my $issue = $1;
my $jira_issue_num = $bugzilla_jira_map{$2}; # Link to JIRA copies
my $jira_issue_num = $lucene_bugzilla_jira_map{$2}; # Link to JIRA copies
$issue = qq!<a href="${jira_url_prefix}LUCENE-$jira_issue_num">!
. qq!$issue&nbsp;[LUCENE-$jira_issue_num]</a>!
if (defined($jira_issue_num));
@ -496,33 +568,102 @@ for my $rel (@releases) {
my $interlude = $3;
my $issue_num_2 = $4;
# Link to JIRA copies
my $jira_issue_1 = $bugzilla_jira_map{$issue_num_1};
my $jira_issue_1 = $lucene_bugzilla_jira_map{$issue_num_1};
my $issue1
= qq!<a href="${jira_url_prefix}LUCENE-$jira_issue_1">!
. qq!$issue_num_1&nbsp;[LUCENE-$jira_issue_1]</a>!
if (defined($jira_issue_1));
my $jira_issue_2 = $bugzilla_jira_map{$issue_num_2};
my $jira_issue_2 = $lucene_bugzilla_jira_map{$issue_num_2};
my $issue2
= qq!<a href="${jira_url_prefix}LUCENE-$jira_issue_2">!
. qq!$issue_num_2&nbsp;[LUCENE-$jira_issue_2]</a>!
if (defined($jira_issue_2));
$leading_whitespace . $issue1 . $interlude . $issue2;
~gex;
}
# Linkify URLs, except Bugzilla links, which don't work anymore
$item =~ s~(?<![">])(https?://(?!(?:nagoya|issues)\.apache\.org/bugzilla)\S+)~<a href="$1">$1</a>~g;
$item =~ s~(?<![">])(https?://(?!(?:nagoya|issues)\.apache\.org/bugzilla)[^\s\)]+)~<a href="$1">$1</a>~g;
print " <li>$item</li>\n";
$item =~ s~</ul>\s+<p/>\s+<br\s*/>~</ul>~;
print " <$list_item>$item</$list_item>\n";
}
print " </$list>\n" unless ($has_release_sections and not $heading);
print " </li>\n" if ($has_release_sections);
print " </$list>\n" unless (not $release or ($has_release_sections and not $heading));
print " </li>\n" if ($release and $has_release_sections);
}
print "</ul>\n" if ($has_release_sections);
print "</ul>\n" if ($release and $has_release_sections);
}
print "</ul>\n" if ($relcnt > 3);
print "</body>\n</html>\n";
# Subroutine: markup_trailing_attribution
#
# Takes one parameter:
#
# - text possibly containing a trailing parenthesized attribution
#
# Returns one scalar:
#
# - text with the the trailing attribution, if any, marked up with the color green
#
sub markup_trailing_attribution {
my $item = shift;
# Put attributions on their own lines.
# Check for trailing parenthesized attribution with no following period.
# Exclude things like "(see #3 above)" and "(use the bug number instead of xxxx)"
unless ($item =~ s{\s*(\((?![Ss]ee )
(?!spans\b)
(?!mainly\ )
(?!LUCENE-\d+\))
(?!and\ )
(?!backported\ )
(?!in\ )
(?!inverse\ )
(?![Tt]he\ )
(?!use\ the\ bug\ number)
[^()"]+?\))\s*$}
{\n<br /><span class="attrib">$1</span>}x) {
# If attribution is not found, then look for attribution with a
# trailing period, but try not to include trailing parenthesized things
# that are not attributions.
#
# Rule of thumb: if a trailing parenthesized expression with a following
# period does not contain "LUCENE-XXX", and it either has three or
# fewer words or it includes the word "via" or the phrase "updates from",
# then it is considered to be an attribution.
$item =~ s{(\s*(\((?![Ss]ee\ )
(?!spans\b)
(?!mainly\ )
(?!LUCENE-\d+\))
(?!and\ )
(?!backported\ )
(?!in\ )
(?!inverse\ )
(?![Tt]he\ )
(?!use\ the\ bug\ number)
[^()"]+?\)))
((?:\.|(?i:\.?\s*Issue\s+\d{3,}|LUCENE-\d+)\.?)\s*)$}
{
my $subst = $1; # default: no change
my $parenthetical = $2;
my $trailing_period_and_or_issue = $3;
if ($parenthetical !~ /LUCENE-\d+/) {
my ($no_parens) = $parenthetical =~ /^\((.*)\)$/s;
my @words = grep {/\S/} split /\s+/, $no_parens;
if ($no_parens =~ /\b(?:via|updates\s+from)\b/i || scalar(@words) <= 4) {
$subst = "\n<br /><span class=\"attrib\">$parenthetical</span>";
}
}
$subst . $trailing_period_and_or_issue;
}ex;
}
return $item;
}
#
# Subroutine: has_release_sections
#
@ -636,6 +777,8 @@ sub get_release_date {
# Handle '1.2 RC6', which should be '1.2 final'
$release = '1.2 final' if ($release eq '1.2 RC6');
$release =~ s/\.0\.0/\.0/;
$reldate = ( exists($release_dates{$release})
? $release_dates{$release}
: 'unknown');
@ -658,7 +801,9 @@ sub get_release_date {
# as well as those named "final" are included below.
#
sub setup_release_dates {
my %release_dates
my %release_dates;
if (uc($product) eq 'LUCENE') {
%release_dates
= ( '0.01' => '2000-03-30', '0.04' => '2000-04-19',
'1.0' => '2000-10-04', '1.01b' => '2001-06-02',
'1.2 RC1' => '2001-10-02', '1.2 RC2' => '2001-10-19',
@ -677,8 +822,10 @@ sub setup_release_dates {
'2.4.0' => '2008-10-06', '2.4.1' => '2009-03-09',
'2.9.0' => '2009-09-23', '2.9.1' => '2009-11-06',
'3.0.0' => '2009-11-25');
}
my $project_info_json = get_url_contents($project_info_url);
print STDERR "Retrieving $project_info_url/$product ...\n";
my $project_info_json = get_url_contents("$project_info_url/$product");
my $project_info = json2perl($project_info_json);
for my $version (@{$project_info->{versions}}) {
@ -750,12 +897,12 @@ sub setup_month_nums {
#
# setup_bugzilla_jira_map
# setup_lucene_bugzilla_jira_map
#
# Returns a list of alternating Bugzilla bug IDs and LUCENE-* JIRA issue
# numbers, for use in populating the %bugzilla_jira_map hash
# numbers, for use in populating the %lucene_bugzilla_jira_map hash
#
sub setup_bugzilla_jira_map {
sub setup_lucene_bugzilla_jira_map {
return ( 4049 => 1, 4102 => 2, 4105 => 3, 4254 => 4,
4555 => 5, 4568 => 6, 4754 => 7, 5313 => 8,
5456 => 9, 6078 => 10, 6091 => 11, 6140 => 12,
@ -879,7 +1026,14 @@ sub json2perl {
my $json_string = shift;
$json_string =~ s/(:\s*)(true|false)/$1"$2"/g;
$json_string =~ s/":/",/g;
return eval $json_string;
$json_string =~ s/\'/\\'/g;
$json_string =~ s/\"/\'/g;
my $project_info = eval $json_string;
die "ERROR eval'ing munged JSON string ||$json_string||: $@\n"
if ($@);
die "ERROR empty value after eval'ing JSON string ||$json_string||\n"
unless $project_info;
return $project_info;
}
1;

View File

@ -103,6 +103,10 @@ Other Changes
* SOLR-3707: Upgrade Solr to Tika 1.2 (janhoy)
* SOLR-2747: Updated changes2html.pl to handle Solr's CHANGES.txt; added
target 'changes-to-html' to solr/build.xml.
(Steve Rowe, Robert Muir)
================== 4.0.0-BETA ===================
@ -311,6 +315,7 @@ Other Changes
Also, the configuration itself can be passed using the "dataConfig" parameter rather than
using a file (this previously worked in debug mode only). When configuration errors are
encountered, the error message is returned in XML format. (James Dyer)
* SOLR-3439: Make SolrCell easier to use out of the box. Also improves "/browse" to display
rich-text documents correctly, along with facets for author and content_type.
With the new "content" field, highlighting of body is supported. See also SOLR-3672 for
@ -424,25 +429,25 @@ New Features
built-in load balancing, and distributed indexing.
(Jamie Johnson, Sami Siren, Ted Dunning, yonik, Mark Miller)
Additional Work:
SOLR-2324: SolrCloud solr.xml parameters are not persisted by CoreContainer.
- SOLR-2324: SolrCloud solr.xml parameters are not persisted by CoreContainer.
(Massimo Schiavon, Mark Miller)
SOLR-2287: Allow users to query by multiple, compatible collections with SolrCloud.
- SOLR-2287: Allow users to query by multiple, compatible collections with SolrCloud.
(Soheb Mahmood, Alex Cowell, Mark Miller)
SOLR-2622: ShowFileRequestHandler does not work in SolrCloud mode.
- SOLR-2622: ShowFileRequestHandler does not work in SolrCloud mode.
(Stefan Matheis, Mark Miller)
SOLR-3108: Error in SolrCloud's replica lookup code when replica's are hosted in same Solr instance.
- SOLR-3108: Error in SolrCloud's replica lookup code when replica's are hosted in same Solr instance.
(Bruno Dumon, Sami Siren, Mark Miller)
SOLR-3080: Remove shard info from zookeeper when SolrCore is explicitly unloaded.
- SOLR-3080: Remove shard info from zookeeper when SolrCore is explicitly unloaded.
(yonik, Mark Miller, siren)
SOLR-3437: Recovery issues a spurious commit to the cluster. (Trym R. Møller via Mark Miller)
SOLR-2822: Skip update processors already run on other nodes (hossman)
- SOLR-3437: Recovery issues a spurious commit to the cluster. (Trym R. Møller via Mark Miller)
- SOLR-2822: Skip update processors already run on other nodes (hossman)
* SOLR-1566: Transforming documents in the ResponseWriters. This will allow
for more complex results in responses and open the door for function queries
as results.
(ryan with patches from grant, noble, cmale, yonik, Jan Høydahl,
Arul Kalaipandian, Luca Cavanna, hossman)
SOLR-2037: Thanks to SOLR-1566, documents boosted by the QueryElevationComponent
- SOLR-2037: Thanks to SOLR-1566, documents boosted by the QueryElevationComponent
can be marked as boosted. (gsingers, ryan, yonik)
* SOLR-2396: Add CollationField, which is much more efficient than
@ -459,9 +464,9 @@ New Features
(Jan Høydahl via yonik)
* SOLR-2272: Pseudo-join queries / filters. Examples:
To restrict to the set of parents with at least one blue-eyed child:
- To restrict to the set of parents with at least one blue-eyed child:
fq={!join from=parent to=name}eyes:blue
To restrict to the set of children with at least one blue-eyed parent:
- To restrict to the set of children with at least one blue-eyed parent:
fq={!join from=name to=parent}eyes:blue
(yonik)
@ -509,11 +514,11 @@ New Features
* SOLR-2703: Added support for Lucene's "surround" query parser. (Simon Rosenthal, ehatcher)
* SOLR-2754: Added factories for several ranking algorithms:
BM25SimilarityFactory: Okapi BM25
DFRSimilarityFactory: Divergence from Randomness models
IBSimilarityFactory: Information-based models
LMDirichletSimilarity: LM with Dirichlet smoothing
LMJelinekMercerSimilarity: LM with Jelinek-Mercer smoothing
- BM25SimilarityFactory: Okapi BM25
- DFRSimilarityFactory: Divergence from Randomness models
- IBSimilarityFactory: Information-based models
- LMDirichletSimilarity: LM with Dirichlet smoothing
- LMJelinekMercerSimilarity: LM with Jelinek-Mercer smoothing
(David Mark Nemeskey, Robert Muir)
* SOLR-2134 Trie* fields should support sortMissingLast=true, and deprecate Sortable* Field Types
@ -537,18 +542,18 @@ New Features
* SOLR-2802: New FieldMutatingUpdateProcessor and Factory to simplify the
development of UpdateProcessors that modify field values of documents as
they are indexed. Also includes several useful new implementations:
RemoveBlankFieldUpdateProcessorFactory
TrimFieldUpdateProcessorFactory
HTMLStripFieldUpdateProcessorFactory
RegexReplaceProcessorFactory
FieldLengthUpdateProcessorFactory
ConcatFieldUpdateProcessorFactory
FirstFieldValueUpdateProcessorFactory
LastFieldValueUpdateProcessorFactory
MinFieldValueUpdateProcessorFactory
MaxFieldValueUpdateProcessorFactory
TruncateFieldUpdateProcessorFactory
IgnoreFieldUpdateProcessorFactory
- RemoveBlankFieldUpdateProcessorFactory
- TrimFieldUpdateProcessorFactory
- HTMLStripFieldUpdateProcessorFactory
- RegexReplaceProcessorFactory
- FieldLengthUpdateProcessorFactory
- ConcatFieldUpdateProcessorFactory
- FirstFieldValueUpdateProcessorFactory
- LastFieldValueUpdateProcessorFactory
- MinFieldValueUpdateProcessorFactory
- MaxFieldValueUpdateProcessorFactory
- TruncateFieldUpdateProcessorFactory
- IgnoreFieldUpdateProcessorFactory
(hossman, janhoy)
* SOLR-3120: Optional post filtering for spatial queries bbox and geofilt
@ -562,7 +567,7 @@ New Features
* SOLR-2898: Support grouped faceting. (Martijn van Groningen)
Additional Work:
SOLR-3406: Extended grouped faceting support to facet.query and facet.range parameters.
- SOLR-3406: Extended grouped faceting support to facet.query and facet.range parameters.
(David Boychuck, Martijn van Groningen)
* SOLR-2949: QueryElevationComponent is now supported with distributed search.
@ -646,9 +651,9 @@ New Features
* SOLR-3508: Simplify JSON update format for deletes as well as allow
version specification for optimistic locking. Examples:
{"delete":"myid"}
{"delete":["id1","id2","id3"]}
{"delete":{"id":"myid", "_version_":123456789}}
- {"delete":"myid"}
- {"delete":["id1","id2","id3"]}
- {"delete":{"id":"myid", "_version_":123456789}}
(yonik)
* SOLR-3211: Allow parameter overrides in conjunction with "spellcheck.maxCollationTries".
@ -692,7 +697,7 @@ Optimizations
works with SolrCore to provide faster 'soft' commits, and has an improved API
that requires less instanceof special casing. (Mark Miller, Robert Muir)
Additional Work:
SOLR-2697: commit and autocommit operations don't reset
- SOLR-2697: commit and autocommit operations don't reset
DirectUpdateHandler2.numDocsPending stats attribute.
(Alexey Serba, Mark Miller)
@ -739,7 +744,7 @@ Bug Fixes
* SOLR-2193, SOLR-2565, SOLR-2651: SolrCores now properly share IndexWriters across SolrCore reloads.
(Mark Miller, Robert Muir)
Additional Work:
SOLR-2705: On reload, IndexWriterProvider holds onto the initial SolrCore it was created with.
- SOLR-2705: On reload, IndexWriterProvider holds onto the initial SolrCore it was created with.
(Yury Kats, Mark Miller)
* SOLR-2682: Remove addException() in SimpleFacet. FacetComponent no longer catches and embeds
@ -919,7 +924,7 @@ Other Changes
* SOLR-2607: Removed deprecated client/ruby directory, which included solr-ruby and flare.
(ehatcher)
* Solr-3032: logOnce from SolrException logOnce and all the supporting
* SOLR-3032: logOnce from SolrException logOnce and all the supporting
structure is gone. abortOnConfugrationError is also gone as it is no longer referenced.
Errors should be caught and logged at the top-most level or logged and NOT propagated up the
chain. (Erick Erickson)
@ -999,7 +1004,7 @@ More information about this release, including any errata related to the
release notes, upgrade instructions, or other changes may be found online at:
https://wiki.apache.org/solr/Solr3.6.1
Bug Fixes:
Bug Fixes
* LUCENE-3969: Throw IAE on bad arguments that could cause confusing errors in
PatternTokenizer. CommonGrams populates PositionLengthAttribute correctly.
@ -1174,7 +1179,7 @@ New Features
* SOLR-2001: The query component will substitute an empty query that matches
no documents if the query parser returns null. This also prevents an
exception from being thrown by the default parser if "q" is missing. (yonik)
SOLR-435: if q is "" then it's also acceptable. (dsmiley, hoss)
- SOLR-435: if q is "" then it's also acceptable. (dsmiley, hoss)
* SOLR-2919: Added parametric tailoring options to ICUCollationKeyFilterFactory.
These can be used to customize range query/sort behavior, for example to
@ -2913,10 +2918,10 @@ Use of the "charset" option when configuring the following Analysis
Factories has been deprecated and will cause a warning to be logged.
In future versions of Solr attempting to use this option will cause an
error. See SOLR-1410 for more information.
* GreekLowerCaseFilterFactory
* RussianStemFilterFactory
* RussianLowerCaseFilterFactory
* RussianLetterTokenizerFactory
- GreekLowerCaseFilterFactory
- RussianStemFilterFactory
- RussianLowerCaseFilterFactory
- RussianLetterTokenizerFactory
DIH: Evaluator API has been changed in a non back-compatible way. Users who
have developed custom Evaluators will need to change their code according to
@ -2993,7 +2998,7 @@ New Features
7. SOLR-680: Add StatsComponent. This gets simple statistics on matched numeric fields,
including: min, max, mean, median, stddev. (koji, ryan)
7.1 SOLR-1380: Added support for multi-valued fields (Harish Agarwal via gsingers)
- SOLR-1380: Added support for multi-valued fields (Harish Agarwal via gsingers)
8. SOLR-561: Added Replication implemented in Java as a request handler. Supports index replication
as well as configuration replication and exposes detailed statistics and progress information
@ -3514,11 +3519,12 @@ Bug Fixes
28. SOLR-1008: Fix stats.jsp XML encoding for <stat> item entries with ampersands in their names. (ehatcher)
29. SOLR-976: deleteByQuery is ignored when deleteById is placed prior to deleteByQuery in a <delete>.
Now both delete by id and delete by query can be specified at the same time as follows. (koji)
Now both delete by id and delete by query can be specified at the same time as follows.
<delete>
<id>05991</id><id>06000</id>
<query>office:Bridgewater</query><query>office:Osaka</query>
</delete>
(koji)
30. SOLR-1016: HTTP 503 error changes 500 in SolrCore (koji)
@ -3777,7 +3783,7 @@ Other Changes
8. SOLR-875: Upgraded to Lucene 2.9-dev (r723985) and consolidated the BitSet implementations (Michael Busch, gsingers)
9. SOLR-819: Upgraded to Lucene 2.9-dev (r724059) to get access to Arabic public constructors (gsingers)
and
10. SOLR-900: Moved solrj into /src/solrj. The contents of solr-common.jar is now included
in the solr-solrj.jar. (ryan)
@ -3861,10 +3867,10 @@ Other Changes
(hossman)
42. Upgraded to Lucene 2.9-dev r794238. Other changes include:
LUCENE-1614 - Use Lucene's DocIdSetIterator.NO_MORE_DOCS as the sentinel value.
LUCENE-1630 - Add acceptsDocsOutOfOrder method to Collector implementations.
LUCENE-1673, LUCENE-1701 - Trie has moved to Lucene core and renamed to NumericRangeQuery.
LUCENE-1662, LUCENE-1687 - Replace usage of ExtendedFieldCache by FieldCache.
- LUCENE-1614 - Use Lucene's DocIdSetIterator.NO_MORE_DOCS as the sentinel value.
- LUCENE-1630 - Add acceptsDocsOutOfOrder method to Collector implementations.
- LUCENE-1673, LUCENE-1701 - Trie has moved to Lucene core and renamed to NumericRangeQuery.
- LUCENE-1662, LUCENE-1687 - Replace usage of ExtendedFieldCache by FieldCache.
(shalin)
42. SOLR-1241: Solr's CharFilter has been moved to Lucene. Remove CharFilter and related classes
@ -3874,7 +3880,7 @@ Other Changes
44. Upgraded to Lucene 2.9-dev r801856 (Mark Miller)
45. SOLR1276: Added StatsComponentTest (Rafa<EFBFBD>ł Ku<EFBFBD>ć, gsingers)
45. SOLR-1276: Added StatsComponentTest (Rafał Kuć, gsingers)
46. SOLR-1377: The TokenizerFactory API has changed to explicitly return a Tokenizer
rather then a TokenStream (that may be or may not be a Tokenizer). This change
@ -3971,7 +3977,7 @@ Build
Documentation
----------------------
1. SOLR-789: The javadoc of RandomSortField is not readable (Nicolas Lalev<EFBFBD>Á<EFBFBD>e via koji)
1. SOLR-789: The javadoc of RandomSortField is not readable (Nicolas Lalevée via koji)
2. SOLR-962: Note about null handling in ModifiableSolrParams.add javadoc
(Kay Kay via hossman)
@ -4016,8 +4022,8 @@ example solrconfig.xml) for more details...
In Solr 1.2, DateField did not enforce the canonical representation of
the ISO 8601 format when parsing incoming data, and did not generation
the canonical format when generating dates from "Date Math" strings
(particularly as it pertains to milliseconds ending in trailing zeros)
-- As a result equivalent dates could not always be compared properly.
(particularly as it pertains to milliseconds ending in trailing zeros).
As a result equivalent dates could not always be compared properly.
This problem is corrected in Solr 1.3, but DateField users that might
have been affected by indexing inconsistent formats of equivilent
dates (ie: 1995-12-31T23:59:59Z vs 1995-12-31T23:59:59.000Z) may want
@ -4419,7 +4425,7 @@ Bug Fixes
9. SOLR-294: Logging of elapsed time broken on Solaris because the date command
there does not support the %s output format. (bill)
10. SOLR-136: Snappuller - "date -d" and locales don't mix. (J<EFBFBD>Á<EFBFBD>rgen Hermann via bill)
10. SOLR-136: Snappuller - "date -d" and locales don't mix. (Jürgen Hermann via bill)
11. SOLR-333: Changed distributiondump.jsp to use Solr HOME instead of CWD to set path.
@ -4470,7 +4476,7 @@ Bug Fixes
messages to be output by the SolrCore via a NamedList toLog member variable.
(Will Johnson, yseeley, gsingers)
SOLR-267: Removed adding values to the HTTP headers in SolrDispatchFilter (gsingers)
- SOLR-267: Removed adding values to the HTTP headers in SolrDispatchFilter (gsingers)
28. SOLR-509: Moved firstSearcher event notification to the end of the SolrCore constructor
(Koji Sekiguchi via gsingers)

View File

@ -320,6 +320,9 @@
<!-- Exclude clover license files incompatible with the ASL -->
<delete dir="${svn.export.dir}/lucene/tools/clover"/>
<build-changes changes.src.dir="${svn.export.dir}/site/changes"
changes.target.dir="${svn.export.dir}/docs/changes"/>
<tar destfile="${source.package.file}" compression="gzip" longfile="gnu">
<tarfileset dir="${svn.export.dir}"
prefix="${fullnamever}"
@ -368,7 +371,7 @@
<target name="create-package"
description="Packages the Solr Binary Distribution"
depends="init-dist, dist, example, javadocs">
depends="init-dist, dist, example, javadocs, changes-to-html">
<mkdir dir="${dest}/${fullnamever}"/>
<delete includeemptydirs="true">
<fileset dir="${example}/solr-webapp" includes="**/*"/>
@ -445,6 +448,10 @@
<make-checksums file="${package.dir}/${fullnamever}.zip"/>
</target>
<target name="changes-to-html">
<build-changes changes.src.dir="${changes.src.dir}" changes.target.dir="${changes.target.dir}" />
</target>
<target name="sign-artifacts">
<sign-artifacts-macro artifacts.dir="${package.dir}"/>
</target>

View File

@ -49,6 +49,8 @@
<property name="tests.loggingfile" value="${common-solr.dir}/testlogging.properties"/>
<property name="tests.cleanthreads.sysprop" value="perClass"/>
<property name="changes.target.dir" value="${dest}/docs/changes"/>
<import file="${common-solr.dir}/../lucene/module-build.xml"/>
<path id="additional.dependencies">