From 119b6c0aa818ae924682b7437e1150d68bb01d62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <[email protected]> Date: Wed, 17 Jun 2015 03:45:29 +0200 Subject: Update to 4.2.11.
- Rebase patches. - Install devel/docs. diff --git a/.gitignore b/.gitignore index c04fef0..978a07f 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -/rt-4.2.10.tar.gz +/rt-4.2.11.tar.gz diff --git a/0001-Remove-configure-time-generated-files.patch b/0001-Remove-configure-time-generated-files.patch index f99d38d..3ff7e7a 100644 --- a/0001-Remove-configure-time-generated-files.patch +++ b/0001-Remove-configure-time-generated-files.patch @@ -1,45 +1,49 @@ -From 70ba2dc6ef4e1eb97d77972872128160ae8b1039 Mon Sep 17 00:00:00 2001 +From 3606668019fe072aef0cc98b0f01bedc7b1ab9de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <[email protected]> Date: Tue, 18 Mar 2014 07:23:24 +0100 -Subject: [PATCH 1/8] Remove configure time generated files. +Subject: [PATCH 1/7] Remove configure time generated files. --- Makefile | 583 ----- - bin/rt | 2682 --------------------- - bin/rt-crontool | 456 ---- + bin/rt | 2680 --------------------- + bin/rt-crontool | 453 ---- bin/rt-mailgate | 512 ---- - etc/RT_Config.pm | 3037 ------------------------ + etc/RT_Config.pm | 3045 ------------------------ etc/upgrade/3.8-ical-extension | 96 - etc/upgrade/4.0-customfield-checkbox-extension | 87 - - etc/upgrade/generate-rtaddressregexp | 108 - - etc/upgrade/split-out-cf-categories | 170 -- - etc/upgrade/switch-templates-to | 147 -- - etc/upgrade/upgrade-articles | 264 -- + etc/upgrade/generate-rtaddressregexp | 106 - + etc/upgrade/sanity-check-stylesheets | 88 - + etc/upgrade/shrink-cgm-table | 124 - + etc/upgrade/shrink-transactions-table | 126 - + etc/upgrade/split-out-cf-categories | 168 -- + etc/upgrade/switch-templates-to | 145 -- + etc/upgrade/time-worked-history | 111 - + etc/upgrade/upgrade-articles | 261 -- etc/upgrade/vulnerable-passwords | 141 -- - lib/RT/Generated.pm | 84 - - sbin/rt-attributes-viewer | 115 - + lib/RT/Generated.pm | 85 - + sbin/rt-attributes-viewer | 105 - sbin/rt-clean-sessions | 183 -- - sbin/rt-dump-metadata | 336 --- - sbin/rt-email-dashboards | 165 -- - sbin/rt-email-digest | 374 --- - sbin/rt-email-group-admin | 520 ---- - sbin/rt-fulltext-indexer | 416 ---- + sbin/rt-dump-metadata | 326 --- + sbin/rt-email-dashboards | 162 -- + sbin/rt-email-digest | 373 --- + sbin/rt-email-group-admin | 521 ---- + sbin/rt-fulltext-indexer | 372 --- sbin/rt-importer | 283 --- - sbin/rt-preferences-viewer | 144 -- + sbin/rt-preferences-viewer | 132 - sbin/rt-serializer | 399 ---- sbin/rt-server | 181 -- sbin/rt-server.fcgi | 181 -- - sbin/rt-session-viewer | 114 - - sbin/rt-setup-database | 795 ------- - sbin/rt-setup-fulltext-index | 763 ------ - sbin/rt-shredder | 317 --- - sbin/rt-test-dependencies | 652 ----- + sbin/rt-session-viewer | 104 - + sbin/rt-setup-database | 800 ------- + sbin/rt-setup-fulltext-index | 787 ------ + sbin/rt-shredder | 318 --- + sbin/rt-test-dependencies | 680 ------ sbin/rt-validate-aliases | 373 --- - sbin/rt-validator | 1465 ------------ + sbin/rt-validator | 1462 ------------ sbin/standalone_httpd | 181 -- t/data/configs/apache2.2+fastcgi.conf | 49 - t/data/configs/apache2.2+mod_perl.conf | 67 - - 35 files changed, 16440 deletions(-) + 39 files changed, 16850 deletions(-) delete mode 100644 Makefile delete mode 100755 bin/rt delete mode 100755 bin/rt-crontool @@ -48,8 +52,12 @@ Subject: [PATCH 1/8] Remove configure time generated files. delete mode 100755 etc/upgrade/3.8-ical-extension delete mode 100755 etc/upgrade/4.0-customfield-checkbox-extension delete mode 100755 etc/upgrade/generate-rtaddressregexp + delete mode 100755 etc/upgrade/sanity-check-stylesheets + delete mode 100755 etc/upgrade/shrink-cgm-table + delete mode 100755 etc/upgrade/shrink-transactions-table delete mode 100755 etc/upgrade/split-out-cf-categories delete mode 100755 etc/upgrade/switch-templates-to + delete mode 100755 etc/upgrade/time-worked-history delete mode 100755 etc/upgrade/upgrade-articles delete mode 100755 etc/upgrade/vulnerable-passwords delete mode 100644 lib/RT/Generated.pm @@ -78,7 +86,7 @@ Subject: [PATCH 1/8] Remove configure time generated files. diff --git a/Makefile b/Makefile deleted file mode 100644 -index c16f4dd..0000000 +index 90c2c1d..0000000 --- a/Makefile +++ /dev/null @@ -1,583 +0,0 @@ @@ -148,14 +156,14 @@ index c16f4dd..0000000 - -RT_VERSION_MAJOR = 4 -RT_VERSION_MINOR = 2 --RT_VERSION_PATCH = 10 +-RT_VERSION_PATCH = 11 - -RT_VERSION = $(RT_VERSION_MAJOR).$(RT_VERSION_MINOR).$(RT_VERSION_PATCH) -TAG = rt-$(RT_VERSION_MAJOR)-$(RT_VERSION_MINOR)-$(RT_VERSION_PATCH) - - -# This is the group that all of the installed files will be chgrp'ed to. --RTGROUP = www-data +-RTGROUP = www - - -# User which should own rt binaries. @@ -167,8 +175,8 @@ index c16f4dd..0000000 -# Group that should own all of RT's libraries, generally root. -LIBS_GROUP = bin - --WEB_USER = www-data --WEB_GROUP = www-data +-WEB_USER = www +-WEB_GROUP = www - -# DESTDIR allows you to specify that RT be installed somewhere other than -# where it will eventually reside. DESTDIR _must_ have a trailing slash @@ -667,10 +675,10 @@ index c16f4dd..0000000 - $(INSTALL) -o $(BIN_OWNER) -g $(RTGROUP) -m 0755 "jsmin" "$(DESTDIR)$(RT_BIN_PATH)/" diff --git a/bin/rt b/bin/rt deleted file mode 100755 -index 8df2d8a..0000000 +index 36460e0..0000000 --- a/bin/rt +++ /dev/null -@@ -1,2682 +0,0 @@ +@@ -1,2680 +0,0 @@ -#!/usr/bin/perl -w -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -743,16 +751,6 @@ index 8df2d8a..0000000 -use Time::Local; # used in prettyshow -use File::Temp; - --# strong (GSSAPI based) authentication is supported if the server does provide --# it and the perl modules GSSAPI and LWP::Authen::Negotiate are installed --# it can be suppressed by setting externalauth=0 (default is undef) --eval { require GSSAPI }; --my $no_strong_auth = 'missing perl module GSSAPI'; --if ( ! $@ ) { -- eval {require LWP::Authen::Negotiate}; -- $no_strong_auth = $@ ? 'missing perl module LWP::Authen::Negotiate' : 0; --} -- -# We derive configuration information from hardwired defaults, dotfiles, -# and the RT* environment variables (in increasing order of precedence). -# Session information is stored in ~/.rt_sessions. @@ -772,18 +770,16 @@ index 8df2d8a..0000000 - queue => undef, -# to protect against unlimited searches a better choice would be -# queue => 'Unknown_Queue', --# setting externalauth => undef will try GSSAPI auth if the corresponding perl --# modules are installed, externalauth => 0 is the backward compatible choice -- externalauth => 0, +- auth => "rt", - ), - config_from_file($ENV{RTCONFIG} || ".rtrc"), - config_from_env() -); +- +-$config{auth} = "basic" if delete $config{externalauth}; +- -my $session = Session->new("$HOME/.rt_sessions"); -my $REST = "$config{server}/REST/1.0"; --$no_strong_auth = 'switched off by externalauth=0' -- if defined $config{externalauth}; -- - -my $prompt = 'rt> '; - @@ -1737,20 +1733,23 @@ index 8df2d8a..0000000 - # Should we send authentication information to start a new session? - my $how = $config{server} =~ /^https/ ? 'over SSL' : 'unencrypted'; - my($server) = $config{server} =~ m{^.*//([^/]+)}; -- if ($config{externalauth}) { +- +- if ($config{auth} eq "gssapi") { +- die "GSSAPI support not available; failed to load perl module GSSAPI:\n$@\n" +- unless eval { require GSSAPI; 1 }; +- die "GSSAPI support not available; failed to load perl module LWP::Authen::Negotiate:\n$@\n" +- unless eval { require LWP::Authen::Negotiate; 1 }; +- } elsif ($config{auth} eq "basic") { +- print " Password will be sent to $server $how\n", +- " Press CTRL-C now if you do not want to continue\n" +- if ! $config{passwd}; - $h->authorization_basic($config{user}, $config{passwd} || read_passwd() ); +- } elsif ( !defined $session->cookie ) { - print " Password will be sent to $server $how\n", - " Press CTRL-C now if you do not want to continue\n" - if ! $config{passwd}; -- } elsif ( $no_strong_auth ) { -- if (!defined $session->cookie) { -- print " Strong encryption not available, $no_strong_auth\n", -- " Password will be sent to $server $how\n", -- " Press CTRL-C now if you do not want to continue\n" -- if ! $config{passwd}; -- push @$data, ( user => $config{user} ); -- push @$data, ( pass => $config{passwd} || read_passwd() ); -- } +- push @$data, ( user => $config{user} ); +- push @$data, ( pass => $config{passwd} || read_passwd() ); - } - - # Now, we construct the request. @@ -1761,9 +1760,7 @@ index 8df2d8a..0000000 - $req = GET($uri); - } - $session->add_cookie_header($req); -- if ($config{externalauth}) { -- $req->header(%$h); -- } +- $req->header(%$h) if %$h; - - # Then we send the request and parse the response. - DEBUG(3, $req->as_string); @@ -2101,7 +2098,7 @@ index 8df2d8a..0000000 -sub config_from_env { - my %env; - -- foreach my $k (qw(EXTERNALAUTH DEBUG USER PASSWD SERVER QUERY ORDERBY)) { +- foreach my $k (qw(EXTERNALAUTH AUTH DEBUG USER PASSWD SERVER QUERY ORDERBY)) { - - if (exists $ENV{"RT$k"}) { - $env{lc $k} = $ENV{"RT$k"}; @@ -2155,7 +2152,7 @@ index 8df2d8a..0000000 - chomp; - next if (/^#/ || /^\s*$/); - -- if (/^(externalauth|user|passwd|server|query|orderby|queue)\s+(.*)\s?$/) { +- if (/^(externalauth|auth|user|passwd|server|query|orderby|queue)\s+(.*)\s?$/) { - $cfg{$1} = $2; - } - else { @@ -2264,49 +2261,56 @@ index 8df2d8a..0000000 - } -} - +-# WARNING: this code is duplicated in lib/RT/Interface/REST.pm +-# If you change one, change both functions at once -# "Normalise" a hash key that's known to be multi-valued. -sub vsplit { -- my ($val) = @_; -- my ($word, @words); -- my @values = ref $val eq 'ARRAY' ? @$val : $val; -- -- foreach my $line (map {split /\n/} @values) { -- # XXX: This should become a real parser, à la Text::ParseWords. -- $line =~ s/^\s+//; -- $line =~ s/\s+$//; -- my ( $a, $b ) = split /\s*,\s*/, $line, 2; -- -- while ($a) { -- no warnings 'uninitialized'; -- if ( $a =~ /^'/ ) { -- my $s = $a; -- while ( $a !~ /'$/ || ( $a !~ /(\\\\)+'$/ -- && $a =~ /(\\)+'$/ )) { -- ( $a, $b ) = split /\s*,\s*/, $b, 2; -- $s .= ',' . $a; -- } -- push @words, $s; +- my ($val, $strip) = @_; +- my @words; +- my @values = map {split /\n/} (ref $val eq 'ARRAY' ? @$val : $val); +- +- foreach my $line (@values) { +- while ($line =~ /\S/) { +- $line =~ s/^ +- \s* # Trim leading whitespace +- (?: +- (") # Quoted string +- ((?>[^\\"]*(?:\\.[^\\"]*)*))" +- | +- (') # Single-quoted string +- ((?>[^\\']*(?:\\.[^\\']*)*))' +- | +- q\{(.*?)\} # A perl-ish q{} string; this does +- # no paren balancing, however, and +- # only exists for back-compat +- | +- (.*?) # Anything else, until the next comma +- ) +- \s* # Trim trailing whitespace +- (?: +- \Z # Finish at end-of-line +- | +- , # Or a comma +- ) +- //xs or last; # There should be no way this match +- # fails, but add a failsafe to +- # prevent infinite-looping if it +- # somehow does. +- my ($quote, $quoted) = ($1 ? ($1, $2) : $3 ? ($3, $4) : ('', $5 || $6)); +- # Only unquote the quote character, or the backslash -- and +- # only if we were originally quoted.. +- if ($5) { +- $quoted =~ s/([\\'])/\\$1/g; +- $quote = "'"; - } -- elsif ( $a =~ /^q\{/ ) { -- my $s = $a; -- while ( $a !~ /\}$/ ) { -- ( $a, $b ) = -- split /\s*,\s*/, $b, 2; -- $s .= ',' . $a; -- } -- $s =~ s/^q\{/'/; -- $s =~ s/\}/'/; -- push @words, $s; -- } -- else { -- push @words, $a; +- if ($strip) { +- $quoted =~ s/\\([\\$quote])/$1/g if $quote; +- push @words, $quoted; +- } else { +- push @words, "$quote$quoted$quote"; - } -- ( $a, $b ) = split /\s*,\s*/, $b, 2; - } -- -- - } -- - return \@words; -} - @@ -2593,15 +2597,17 @@ index 8df2d8a..0000000 - - The following directives may occur, one per line: - -- - server <URL> URL to RT server. -- - user <username> RT username. -- - passwd <passwd> RT user's password. -- - query <RT Query> Default RT Query for list action -- - orderby <order> Default RT order for list action -- - queue <queuename> Default RT Queue for list action -- - externalauth <0|1> Use HTTP Basic authentication -- explicitely setting externalauth to 0 inhibits also GSSAPI based -- authentication, if LWP::Authen::Negotiate (and GSSAPI) is installed +- - server <URL> URL to RT server. +- - user <username> RT username. +- - passwd <passwd> RT user's password. +- - query <RT Query> Default RT Query for list action +- - orderby <order> Default RT order for list action +- - queue <queuename> Default RT Queue for list action +- - auth <rt|basic|gssapi> Method to authenticate via; "basic" +- means HTTP Basic authentication, "gssapi" means +- Kerberos credentials, if your RT is configured +- with $WebRemoteUserAuth. For backwards +- compatibility, "externalauth 1" means "auth basic" - - Blank and #-commented lines are ignored. - @@ -2620,7 +2626,7 @@ index 8df2d8a..0000000 - - - RTUSER - - RTPASSWD -- - RTEXTERNALAUTH +- - RTAUTH - - RTSERVER - - RTDEBUG Numeric debug level. (Set to 3 for full logs.) - - RTCONFIG Specifies a name other than ".rtrc" for the @@ -3355,10 +3361,10 @@ index 8df2d8a..0000000 - diff --git a/bin/rt-crontool b/bin/rt-crontool deleted file mode 100755 -index 7575bf0..0000000 +index f793250..0000000 --- a/bin/rt-crontool +++ /dev/null -@@ -1,456 +0,0 @@ +@@ -1,453 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -3432,7 +3438,7 @@ index 7575bf0..0000000 - -use Getopt::Long; - --use RT::Interface::CLI qw(CleanEnv GetCurrentUser GetMessageContent loc); +-use RT::Interface::CLI qw(GetCurrentUser loc); - -my ( $search, $condition, $action, $search_arg, $condition_arg, $action_arg, - $template, $template_id, $transaction, $transaction_type, $help, $log, $verbose ); @@ -3461,9 +3467,6 @@ index 7575bf0..0000000 -#Connect to the database and get RT::SystemUser and RT::Nobody loaded -RT::Init(); - --# Clean out all the nasties from the environment --CleanEnv(); -- -require RT::Tickets; -require RT::Template; - @@ -3817,7 +3820,7 @@ index 7575bf0..0000000 - diff --git a/bin/rt-mailgate b/bin/rt-mailgate deleted file mode 100755 -index 701ee8f..0000000 +index 365f4da..0000000 --- a/bin/rt-mailgate +++ /dev/null @@ -1,512 +0,0 @@ @@ -3974,7 +3977,7 @@ index 701ee8f..0000000 - my $self = shift; - my $opts = shift; - my $ua = LWP::UserAgent->new(); -- $ua->agent("rt-mailgate/4.2.10 "); +- $ua->agent("rt-mailgate/4.2.11 "); - $ua->cookie_jar( { file => $opts->{'jar'} } ) if $opts->{'jar'}; - - $ua->ssl_opts( verify_hostname => $opts->{'verify-ssl'} ); @@ -4335,10 +4338,10 @@ index 701ee8f..0000000 - diff --git a/etc/RT_Config.pm b/etc/RT_Config.pm deleted file mode 100644 -index 013352c..0000000 +index 5bc762f..0000000 --- a/etc/RT_Config.pm +++ /dev/null -@@ -1,3037 +0,0 @@ +@@ -1,3045 +0,0 @@ -# -# RT was configured with: -# @@ -4462,6 +4465,9 @@ index 013352c..0000000 - Plugin( "RT::Extension::SLA" ); - Plugin( "RT::Authen::ExternalAuth" ); - +-RT will also accept the distribution name (i.e. C<RT-Extension-SLA>) +-instead of the package name (C<RT::Extension::SLA>). +- -=cut - -Set(@Plugins, ()); @@ -4552,15 +4558,30 @@ index 013352c..0000000 - -Set($DatabaseName, q{rt4}); - --=item C<$DatabaseRequireSSL> +-=item C<%DatabaseExtraDSN> +- +-Allows additional properties to be passed to the database connection +-step. Possible properties are specific to the database-type; see +-https://metacpan.org/pod/DBI#connect +- +-For PostgreSQL, for instance, the following enables SSL (but does no +-certificate checking, providing data hiding but no MITM protection): +- +- # See https://metacpan.org/pod/DBD::Pg#connect +- # and http://www.postgresql.org/docs/8.4/static/libpq-ssl.html +- Set( %DatabaseExtraDSN, sslmode => 'require' ); - --If you're using PostgreSQL and have compiled in SSL support, set --C<$DatabaseRequireSSL> to 1 to turn on SSL communication with the --database. +-For MySQL, the following acts similarly if the server has enabled SSL. +-Otherwise, it provides no protection; MySQL provides no way to I<force> +-SSL connections: +- +- # See https://metacpan.org/pod/DBD::mysql#connect +- # and http://dev.mysql.com/doc/refman/5.1/en/ssl-options.html +- Set( %DatabaseExtraDSN, mysql_ssl => 1 ); - -=cut - --Set($DatabaseRequireSSL, undef); +-Set(%DatabaseExtraDSN, ()); - -=item C<$DatabaseAdmin> - @@ -4852,18 +4873,11 @@ index 013352c..0000000 -value. - -For testing purposes, or to simply disable sending mail out into the --world, you can set C<$MailCommand> to 'testfile' which writes all mail --to a temporary file. RT will log the location of the temporary file --so you can extract mail from it afterward. -- --On shutdown, RT will clean up the temporary file created when using --the 'testfile' option. If testing while the RT server is still running, --you can find the files in the location noted in the log file. If you run --a tool like C<rt-crontool> however, or if you look after stopping the server, --the files will have been deleted when the process completed. If you need to --keep the files for development or debugging, you can manually set --C<< UNLINK => 0 >> where the testfile config is processed in --F<lib/RT/Interface/Email.pm>. +-world, you can set C<$MailCommand> to 'mbox' which logs all mail, in +-mbox format, to files in F</opt/rt4/var/> based in the process start +-time. The 'testfile' option is similar, but the files that it creates +-(under /tmp) are temporary, and removed upon process completion; the +-format is also not mbox-compatable. - -=cut - @@ -5503,10 +5517,10 @@ index 013352c..0000000 - -Set( - %ChartFont, -- 'zh-cn' => "$RT::BasePath/share/fonts/DroidSansFallback.ttf", -- 'zh-tw' => "$RT::BasePath/share/fonts/DroidSansFallback.ttf", -- 'ja' => "$RT::BasePath/share/fonts/DroidSansFallback.ttf", -- 'others' => "$RT::BasePath/share/fonts/DroidSans.ttf", +- 'zh-cn' => "$RT::FontPath/DroidSansFallback.ttf", +- 'zh-tw' => "$RT::FontPath/DroidSansFallback.ttf", +- 'ja' => "$RT::FontPath/DroidSansFallback.ttf", +- 'others' => "$RT::FontPath/DroidSans.ttf", -); - -=item C<$ChartsTimezonesInDB> @@ -6836,9 +6850,6 @@ index 013352c..0000000 -# URL of a keyserver -# keyserver => 'hkp://subkeys.pgp.net', - --# enables the automatic retrieving of keys when encrypting --# 'auto-key-locate' => 'keyserver', -- -# enables the automatic retrieving of keys when verifying signatures -# 'keyserver-options' => 'auto-key-retrieve', -); @@ -7573,10 +7584,10 @@ index 6a39e55..0000000 -exit 0; diff --git a/etc/upgrade/generate-rtaddressregexp b/etc/upgrade/generate-rtaddressregexp deleted file mode 100755 -index a516b7c..0000000 +index 0c64549..0000000 --- a/etc/upgrade/generate-rtaddressregexp +++ /dev/null -@@ -1,108 +0,0 @@ +@@ -1,106 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -7632,10 +7643,8 @@ index a516b7c..0000000 -use lib "local/lib"; -use lib "lib"; - --use RT -init; --RT->Config->Set('LogToSTDERR' => 'debug'); -- --$| = 1; +-use RT::Interface::CLI qw(Init); +-Init(); - -if (my $re = RT->Config->Get('RTAddressRegexp')) { - print "No need to use this script, you already have RTAddressRegexp set to $re\n"; @@ -7685,12 +7694,368 @@ index a516b7c..0000000 - $merged->{lc $3}{$1}{$2||''}++; - } -} +diff --git a/etc/upgrade/sanity-check-stylesheets b/etc/upgrade/sanity-check-stylesheets +deleted file mode 100755 +index 45e0ab5..0000000 +--- a/etc/upgrade/sanity-check-stylesheets ++++ /dev/null +@@ -1,88 +0,0 @@ +-#!/usr/bin/perl +-# BEGIN BPS TAGGED BLOCK {{{ +-# +-# COPYRIGHT: +-# +-# This software is Copyright (c) 1996-2015 Best Practical Solutions, LLC +-# <[email protected]> +-# +-# (Except where explicitly superseded by other copyright notices) +-# +-# +-# LICENSE: +-# +-# This work is made available to you under the terms of Version 2 of +-# the GNU General Public License. A copy of that license should have +-# been provided with this software, but in any event can be snarfed +-# from www.gnu.org. +-# +-# This work is distributed in the hope that it will be useful, but +-# WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# General Public License for more details. +-# +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +-# 02110-1301 or visit their web page on the internet at +-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +-# +-# +-# CONTRIBUTION SUBMISSION POLICY: +-# +-# (The following paragraph is not intended to limit the rights granted +-# to you to modify and distribute this software under the terms of +-# the GNU General Public License and is only of importance to you if +-# you choose to contribute your changes and enhancements to the +-# community by submitting them to Best Practical Solutions, LLC.) +-# +-# By intentionally submitting any modifications, corrections or +-# derivatives to this work, or any other work intended for use with +-# Request Tracker, to Best Practical Solutions, LLC, you confirm that +-# you are the copyright holder for those contributions and you grant +-# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +-# royalty-free, perpetual, license to use, copy, create derivative +-# works based on those contributions, and sublicense and distribute +-# those contributions and any derivatives thereof. +-# +-# END BPS TAGGED BLOCK }}} +-use 5.10.1; +-use strict; +-use warnings; +- +-use lib "local/lib"; +-use lib "lib"; +- +-use RT::Interface::CLI qw(Init); +-Init(); +- +-use RT::Users; +-my $users = RT::Users->new( $RT::SystemUser ); +-$users->UnLimit(); +- +-my @static_roots = RT::Interface::Web->StaticRoots; +-my %static_root_check_cache; +-sub stylesheet_exists { +- my $stylesheet = shift; +- +- return $static_root_check_cache{$stylesheet} +- if exists $static_root_check_cache{$stylesheet}; +- +- for my $static_root (@static_roots) { +- return ++$static_root_check_cache{$stylesheet} +- if -d "$static_root/css/$stylesheet"; +- } +- +- return $static_root_check_cache{$stylesheet} = 0; +-} +- +-my $system_stylesheet = RT->Config->Get('WebDefaultStylesheet'); +- +-while (my $u = $users->Next) { +- my $stylesheet = RT->Config->Get('WebDefaultStylesheet', $u); +- unless (stylesheet_exists $stylesheet) { +- my $prefs = $u->Preferences($RT::System); +- $prefs->{WebDefaultStylesheet} = $system_stylesheet; +- $u->SetPreferences($RT::System, $prefs); +- } +-} +diff --git a/etc/upgrade/shrink-cgm-table b/etc/upgrade/shrink-cgm-table +deleted file mode 100755 +index 94a0a92..0000000 +--- a/etc/upgrade/shrink-cgm-table ++++ /dev/null +@@ -1,124 +0,0 @@ +-#!/usr/bin/perl +-# BEGIN BPS TAGGED BLOCK {{{ +-# +-# COPYRIGHT: +-# +-# This software is Copyright (c) 1996-2015 Best Practical Solutions, LLC +-# <[email protected]> +-# +-# (Except where explicitly superseded by other copyright notices) +-# +-# +-# LICENSE: +-# +-# This work is made available to you under the terms of Version 2 of +-# the GNU General Public License. A copy of that license should have +-# been provided with this software, but in any event can be snarfed +-# from www.gnu.org. +-# +-# This work is distributed in the hope that it will be useful, but +-# WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# General Public License for more details. +-# +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +-# 02110-1301 or visit their web page on the internet at +-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +-# +-# +-# CONTRIBUTION SUBMISSION POLICY: +-# +-# (The following paragraph is not intended to limit the rights granted +-# to you to modify and distribute this software under the terms of +-# the GNU General Public License and is only of importance to you if +-# you choose to contribute your changes and enhancements to the +-# community by submitting them to Best Practical Solutions, LLC.) +-# +-# By intentionally submitting any modifications, corrections or +-# derivatives to this work, or any other work intended for use with +-# Request Tracker, to Best Practical Solutions, LLC, you confirm that +-# you are the copyright holder for those contributions and you grant +-# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +-# royalty-free, perpetual, license to use, copy, create derivative +-# works based on those contributions, and sublicense and distribute +-# those contributions and any derivatives thereof. +-# +-# END BPS TAGGED BLOCK }}} +-use 5.10.1; +-use strict; +-use warnings; +- +-use lib "local/lib"; +-use lib "lib"; +- +-use RT::Interface::CLI qw(Init); +-Init(); +- +-use RT::CachedGroupMembers; +-my $cgms = RT::CachedGroupMembers->new( RT->SystemUser ); +-$cgms->Limit( +- FIELD => 'id', +- OPERATOR => '!=', +- VALUE => 'main.Via', +- QUOTEVALUE => 0, +- ENTRYAGGREGATOR => 'AND', +-); +-$cgms->FindAllRows; +- +-my $alias = $cgms->Join( +- TYPE => 'LEFT', +- FIELD1 => 'Via', +- TABLE2 => 'CachedGroupMembers', +- FIELD2 => 'id', +-); +-$cgms->Limit( +- ALIAS => $alias, +- FIELD => 'MemberId', +- OPERATOR => '=', +- VALUE => $alias .'.GroupId', +- QUOTEVALUE => 0, +- ENTRYAGGREGATOR => 'AND', +-); +-$cgms->Limit( +- ALIAS => $alias, +- FIELD => 'id', +- OPERATOR => '=', +- VALUE => $alias .'.Via', +- QUOTEVALUE => 0, +- ENTRYAGGREGATOR => 'AND', +-); +- +-my $total = $cgms->Count; +-my $i = 0; +- +-FetchNext( $cgms, 'init' ); +-while ( my $rec = FetchNext( $cgms ) ) { +- $i++; +- printf("\r%0.2f %%", 100 * $i / $total); +- $RT::Handle->BeginTransaction; +- my ($status) = $rec->Delete; +- unless ($status) { +- $RT::Logger->error( "Couldn't delete CGM #". $rec->id ); +- exit 1; +- } +- $RT::Handle->Commit; +-} +- +-use constant PAGE_SIZE => 10000; +-sub FetchNext { +- my ($objs, $init) = @_; +- if ( $init ) { +- $objs->RowsPerPage( PAGE_SIZE ); +- $objs->FirstPage; +- return; +- } +- +- my $obj = $objs->Next; +- return $obj if $obj; +- $objs->RedoSearch; +- $objs->FirstPage; +- return $objs->Next; +-} +- +diff --git a/etc/upgrade/shrink-transactions-table b/etc/upgrade/shrink-transactions-table +deleted file mode 100755 +index c26614f..0000000 +--- a/etc/upgrade/shrink-transactions-table ++++ /dev/null +@@ -1,126 +0,0 @@ +-#!/usr/bin/perl +-# BEGIN BPS TAGGED BLOCK {{{ +-# +-# COPYRIGHT: +-# +-# This software is Copyright (c) 1996-2015 Best Practical Solutions, LLC +-# <[email protected]> +-# +-# (Except where explicitly superseded by other copyright notices) +-# +-# +-# LICENSE: +-# +-# This work is made available to you under the terms of Version 2 of +-# the GNU General Public License. A copy of that license should have +-# been provided with this software, but in any event can be snarfed +-# from www.gnu.org. +-# +-# This work is distributed in the hope that it will be useful, but +-# WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# General Public License for more details. +-# +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +-# 02110-1301 or visit their web page on the internet at +-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +-# +-# +-# CONTRIBUTION SUBMISSION POLICY: +-# +-# (The following paragraph is not intended to limit the rights granted +-# to you to modify and distribute this software under the terms of +-# the GNU General Public License and is only of importance to you if +-# you choose to contribute your changes and enhancements to the +-# community by submitting them to Best Practical Solutions, LLC.) +-# +-# By intentionally submitting any modifications, corrections or +-# derivatives to this work, or any other work intended for use with +-# Request Tracker, to Best Practical Solutions, LLC, you confirm that +-# you are the copyright holder for those contributions and you grant +-# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +-# royalty-free, perpetual, license to use, copy, create derivative +-# works based on those contributions, and sublicense and distribute +-# those contributions and any derivatives thereof. +-# +-# END BPS TAGGED BLOCK }}} +-use 5.10.1; +-use strict; +-use warnings; +- +-use lib "local/lib"; +-use lib "lib"; +- +-use RT::Interface::CLI qw(Init); +-Init(); +- +-use RT::Transactions; +-my $txns = RT::Transactions->new( RT->SystemUser ); +-$txns->Limit( +- FIELD => 'ObjectType', +- OPERATOR => '=', +- VALUE => 'RT::Group', +- QUOTEVALUE => 1, +- ENTRYAGGREGATOR => 'AND', +-); +- +-my $alias = $txns->Join( +- TYPE => 'LEFT', +- FIELD1 => 'ObjectId', +- TABLE2 => 'Groups', +- FIELD2 => 'Id', +-); +-$txns->Limit( +- ALIAS => $alias, +- FIELD => 'Domain', +- OPERATOR => '=', +- VALUE => 'ACLEquivalence', +- CASESENSITIVE => 0, +- QUOTEVALUE => 1, +- ENTRYAGGREGATOR => 'AND', +-); +- +-$txns->Limit( +- ALIAS => $alias, +- FIELD => 'Name', +- OPERATOR => '=', +- VALUE => 'UserEquiv', +- QUOTEVALUE => 1, +- CASESENSITIVE => 0, +- ENTRYAGGREGATOR => 'AND', +-); +- +-my $total = $txns->Count; +-my $i = 0; +- +-FetchNext( $txns, 'init' ); +-while ( my $rec = FetchNext( $txns ) ) { +- $i++; +- printf("\r%0.2f %%", 100 * $i / $total); +- $RT::Handle->BeginTransaction; +- my ($status) = $rec->Delete; +- unless ($status) { +- $RT::Logger->error( "Couldn't delete TXN #". $rec->id ); +- exit 1; +- } +- $RT::Handle->Commit; +-} +- +-use constant PAGE_SIZE => 10000; +-sub FetchNext { +- my ($objs, $init) = @_; +- if ( $init ) { +- $objs->RowsPerPage( PAGE_SIZE ); +- $objs->FirstPage; +- return; +- } +- +- my $obj = $objs->Next; +- return $obj if $obj; +- $objs->RedoSearch; +- $objs->FirstPage; +- return $objs->Next; +-} +- diff --git a/etc/upgrade/split-out-cf-categories b/etc/upgrade/split-out-cf-categories deleted file mode 100755 -index 63f310d..0000000 +index 9e36c12..0000000 --- a/etc/upgrade/split-out-cf-categories +++ /dev/null -@@ -1,170 +0,0 @@ +@@ -1,168 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -7746,10 +8111,8 @@ index 63f310d..0000000 -use lib "local/lib"; -use lib "lib"; - --use RT -init; --RT->Config->Set('LogToSTDERR' => 'debug'); -- --$| = 1; +-use RT::Interface::CLI qw(Init); +-Init(); - -$RT::Handle->BeginTransaction(); - @@ -7863,10 +8226,10 @@ index 63f310d..0000000 -print "No custom fields with categories found\n" unless $seen; diff --git a/etc/upgrade/switch-templates-to b/etc/upgrade/switch-templates-to deleted file mode 100755 -index c1b1633..0000000 +index 1045a92..0000000 --- a/etc/upgrade/switch-templates-to +++ /dev/null -@@ -1,147 +0,0 @@ +@@ -1,145 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -7922,10 +8285,8 @@ index c1b1633..0000000 -use lib "local/lib"; -use lib "lib"; - --use RT -init; --RT->Config->Set('LogToSTDERR' => 'info'); -- --$| = 1; +-use RT::Interface::CLI qw(Init); +-Init(); - -my $to = shift || ''; -my $from; @@ -7961,65 +8322,182 @@ index c1b1633..0000000 -my $scrips = RT::Scrips->new( RT->SystemUser ); -$scrips->UnLimit; - --for (@templates) { -- $scrips->Limit( -- FIELD => 'Template', -- VALUE => ($to eq 'html' ? $_ : "$_ in HTML"), -- ENTRYAGGREGATOR => 'OR' -- ); +-for (@templates) { +- $scrips->Limit( +- FIELD => 'Template', +- VALUE => ($to eq 'html' ? $_ : "$_ in HTML"), +- ENTRYAGGREGATOR => 'OR' +- ); +-} +- +-my $switched = 0; +-while ( my $s = $scrips->Next ) { +- my $new = $s->TemplateObj->Name; +- +- if ($to eq 'html') { +- $new .= ' in HTML'; +- } else { +- $new =~ s/ in HTML$//; +- } +- +- print $s->id, ": ", $s->Description, "\n"; +- print " ", $s->TemplateObj->Name, " -> $new\n\n"; +- +- my ($ok, $msg) = $s->SetTemplate($new); +- +- if ($ok) { +- $switched++; +- } else { +- warn " Couldn't switch templates: $msg\n"; +- } +-} +- +-$RT::Handle->Commit; +- +-if ($switched) { +- print <<" EOT"; +-Switched $switched scrips to $to templates. You should now manually port any +-customizations from the old templates to the new templates. +- EOT +- exit 1 if $switched != $scrips->Count; +-} +-elsif ($scrips->Count) { +- print <<" EOT"; +-@{[$scrips->Count]} scrips using $from templates were found, but none were +-successfully switched to $to. See the errors above. +- EOT +- exit 1; +-} +-else { +- print <<" EOT"; +-No scrips were found using the $from templates, so none were switched to +-$to templates. +- EOT +-} +- +diff --git a/etc/upgrade/time-worked-history b/etc/upgrade/time-worked-history +deleted file mode 100755 +index 9e08369..0000000 +--- a/etc/upgrade/time-worked-history ++++ /dev/null +@@ -1,111 +0,0 @@ +-#!/usr/bin/perl +-# BEGIN BPS TAGGED BLOCK {{{ +-# +-# COPYRIGHT: +-# +-# This software is Copyright (c) 1996-2015 Best Practical Solutions, LLC +-# <[email protected]> +-# +-# (Except where explicitly superseded by other copyright notices) +-# +-# +-# LICENSE: +-# +-# This work is made available to you under the terms of Version 2 of +-# the GNU General Public License. A copy of that license should have +-# been provided with this software, but in any event can be snarfed +-# from www.gnu.org. +-# +-# This work is distributed in the hope that it will be useful, but +-# WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-# General Public License for more details. +-# +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +-# 02110-1301 or visit their web page on the internet at +-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +-# +-# +-# CONTRIBUTION SUBMISSION POLICY: +-# +-# (The following paragraph is not intended to limit the rights granted +-# to you to modify and distribute this software under the terms of +-# the GNU General Public License and is only of importance to you if +-# you choose to contribute your changes and enhancements to the +-# community by submitting them to Best Practical Solutions, LLC.) +-# +-# By intentionally submitting any modifications, corrections or +-# derivatives to this work, or any other work intended for use with +-# Request Tracker, to Best Practical Solutions, LLC, you confirm that +-# you are the copyright holder for those contributions and you grant +-# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +-# royalty-free, perpetual, license to use, copy, create derivative +-# works based on those contributions, and sublicense and distribute +-# those contributions and any derivatives thereof. +-# +-# END BPS TAGGED BLOCK }}} +-use 5.10.1; +-use strict; +-use warnings; +- +-use lib "local/lib"; +-use lib "lib"; +- +-use RT::Interface::CLI qw(Init); +-Init(); +- +-my $dbh = RT->DatabaseHandle->dbh; +-my $ids = $dbh->selectcol_arrayref( +- "SELECT t1.id FROM Tickets t1, Tickets t2 WHERE t1.id = t2.EffectiveId" +- ." AND t2.id != t2.EffectiveId AND t2.EffectiveId = t1.id" +-); +-foreach my $id ( @$ids ) { +- my $t = RT::Ticket->new( RT->SystemUser ); +- $t->Load( $id ); +- unless ( $t->id ) { +- $RT::Logger->error("Couldn't load ticket #$id"); +- next; +- } +- +- fix_time_worked_history($t); -} - --my $switched = 0; --while ( my $s = $scrips->Next ) { -- my $new = $s->TemplateObj->Name; +-sub fix_time_worked_history { +- my ($t) = (@_); - -- if ($to eq 'html') { -- $new .= ' in HTML'; -- } else { -- $new =~ s/ in HTML$//; -- } +- my $history = 0; +- my $candidate = undef; +- my @delete = (); +- my $delete_time = 0; - -- print $s->id, ": ", $s->Description, "\n"; -- print " ", $s->TemplateObj->Name, " -> $new\n\n"; +- my $txns = $t->Transactions; +- while ( my $txn = $txns->Next ) { +- if ( $txn->Type =~ /^(Create|Correspond|Comment)$/ ) { +- $history += $txn->TimeTaken || 0; +- } elsif ( $txn->Type eq 'Set' && $txn->Field eq 'TimeWorked' ) { +- $history += $txn->NewValue - $txn->OldValue; +- $candidate = $txn; +- } elsif ( $candidate && ($txn->Field||'') eq 'MergedInto' ) { +- if ($candidate->Creator eq $txn->Creator ) { +- push @delete, $candidate; +- $delete_time += $candidate->NewValue - $candidate->OldValue; +- } - -- my ($ok, $msg) = $s->SetTemplate($new); +- $candidate = undef; +- } +- } - -- if ($ok) { -- $switched++; +- if ( $history == $t->TimeWorked ) { +- $RT::Logger->info("Ticket #". $t->id . " has TimeWorked matching history. Skipping"); +- } elsif ( $history - $delete_time == $t->TimeWorked ) { +- $RT::Logger->warn( "Ticket #". $t->id ." has TimeWorked mismatch. Deleting transactions" ); +- foreach my $dtxn ( @delete ) { +- my ($status, $msg) = $dtxn->Delete; +- $RT::Logger->error("Couldn't delete transaction: $msg") unless $status; +- } - } else { -- warn " Couldn't switch templates: $msg\n"; +- $RT::Logger->error( "Ticket #". $t->id ." has TimeWorked mismatch, but we couldn't find correct transactions to delete. Skipping" ); - } -} -- --$RT::Handle->Commit; -- --if ($switched) { -- print <<" EOT"; --Switched $switched scrips to $to templates. You should now manually port any --customizations from the old templates to the new templates. -- EOT -- exit 1 if $switched != $scrips->Count; --} --elsif ($scrips->Count) { -- print <<" EOT"; --@{[$scrips->Count]} scrips using $from templates were found, but none were --successfully switched to $to. See the errors above. -- EOT -- exit 1; --} --else { -- print <<" EOT"; --No scrips were found using the $from templates, so none were switched to --$to templates. -- EOT --} -- diff --git a/etc/upgrade/upgrade-articles b/etc/upgrade/upgrade-articles deleted file mode 100755 -index 482d7b3..0000000 +index 395e2e3..0000000 --- a/etc/upgrade/upgrade-articles +++ /dev/null -@@ -1,264 +0,0 @@ +@@ -1,261 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -8075,11 +8553,8 @@ index 482d7b3..0000000 -use lib "local/lib"; -use lib "lib"; - --use RT -init; -- --RT->Config->Set('LogToSTDERR' => 'debug'); -- --$| = 1; +-use RT::Interface::CLI qw(Init); +-Init(); - -my $db_name = RT->Config->Get('DatabaseName'); -my $db_type = RT->Config->Get('DatabaseType'); @@ -8433,10 +8908,10 @@ index c7616e9..0000000 -} diff --git a/lib/RT/Generated.pm b/lib/RT/Generated.pm deleted file mode 100644 -index eceef66..0000000 +index 122a465..0000000 --- a/lib/RT/Generated.pm +++ /dev/null -@@ -1,84 +0,0 @@ +@@ -1,85 +0,0 @@ -# BEGIN BPS TAGGED BLOCK {{{ -# -# COPYRIGHT: @@ -8489,7 +8964,7 @@ index eceef66..0000000 -use warnings; -use strict; - --our $VERSION = '4.2.10'; +-our $VERSION = '4.2.11'; -our ($MAJOR_VERSION, $MINOR_VERSION, $REVISION) = $VERSION =~ /^(\d)\.(\d)\.(\d+)/; - - @@ -8499,6 +8974,7 @@ index eceef66..0000000 -$BinPath = 'bin'; -$SbinPath = 'sbin'; -$VarPath = 'var'; +-$FontPath = 'share/fonts'; -$LexiconPath = 'share/po'; -$StaticPath = 'share/static'; -$PluginPath = 'plugins'; @@ -8523,10 +8999,10 @@ index eceef66..0000000 -1; diff --git a/sbin/rt-attributes-viewer b/sbin/rt-attributes-viewer deleted file mode 100755 -index e8c0cdc..0000000 +index 2e86d44..0000000 --- a/sbin/rt-attributes-viewer +++ /dev/null -@@ -1,115 +0,0 @@ +@@ -1,105 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -8595,21 +9071,11 @@ index e8c0cdc..0000000 - -} - --use Getopt::Long; --my %opt; --GetOptions( \%opt, 'help|h', ); +-use RT::Interface::CLI qw(Init); +-Init(); - -my $id = shift; -- --if ( $opt{help} || !$id ) { -- require Pod::Usage; -- Pod::Usage::pod2usage({ verbose => 2 }); -- exit; --} -- --require RT; --RT::LoadConfig(); --RT::Init(); +-Pod::Usage::pod2usage({ verbose => 2 }) unless $id; - -require RT::Attribute; -my $attr = RT::Attribute->new( RT->SystemUser ); @@ -8833,10 +9299,10 @@ index 7a7b613..0000000 -=cut diff --git a/sbin/rt-dump-metadata b/sbin/rt-dump-metadata deleted file mode 100755 -index 46c240f..0000000 +index 714bb59..0000000 --- a/sbin/rt-dump-metadata +++ /dev/null -@@ -1,336 +0,0 @@ +@@ -1,326 +0,0 @@ -#!/usr/bin/perl -w -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -8909,26 +9375,16 @@ index 46c240f..0000000 - -} - --use Getopt::Long; +-use RT::Interface::CLI qw(Init); -my %opt; --GetOptions( \%opt, "help|h", +-Init( \%opt, - "limit-to-privileged|l", - "skip-disabled|s", - "all|a", -); - --if ( $opt{help} ) { -- require Pod::Usage; -- Pod::Usage::pod2usage( { verbose => 2 } ); -- exit; --} -- --require RT; -require XML::Simple; - --RT::LoadConfig(); --RT::Init(); -- -my %RV; -my %Ignore = ( - All => [ @@ -8944,7 +9400,6 @@ index 46c240f..0000000 - Templates Scrips ACL CustomFields - ); -foreach my $class (@classes) { -- require "RT/$class.pm"; - my $objects = "RT::$class"->new( RT->SystemUser ); - $objects->{find_disabled_rows} = 1 unless $opt{'skip-disabled'}; - $objects->UnLimit; @@ -9010,6 +9465,7 @@ index 46c240f..0000000 - foreach my $key ( map "$record$_", ( '', 'Id' ) ) { - next unless exists $rv->{$key}; - my $id = $rv->{$key} or next; +- next unless $id =~ /^\d+$/; - my $obj = "RT::$record"->new( RT->SystemUser ); - $obj->LoadByCols( Id => $id ) or next; - $rv->{$key} = $obj->__Value('Name') || 0; @@ -9072,7 +9528,7 @@ index 46c240f..0000000 - # An internal user group - if ( /^SystemInternal$/ ) { - $rv->{GroupDomain} = $group->Domain; -- $rv->{GroupType} = $group->Type; +- $rv->{GroupType} = $group->Name; - } - # An individual user - elsif ( /^ACLEquivalence$/ ) { @@ -9175,10 +9631,10 @@ index 46c240f..0000000 - diff --git a/sbin/rt-email-dashboards b/sbin/rt-email-dashboards deleted file mode 100755 -index cf27f82..0000000 +index 6637255..0000000 --- a/sbin/rt-email-dashboards +++ /dev/null -@@ -1,165 +0,0 @@ +@@ -1,162 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -9262,7 +9718,7 @@ index cf27f82..0000000 - -require RT; -require RT::Interface::CLI; --RT::Interface::CLI->import(qw{ CleanEnv loc }); +-RT::Interface::CLI->import(qw{ loc }); - -# Load the config file -RT::LoadConfig(); @@ -9270,9 +9726,6 @@ index cf27f82..0000000 -# Connect to the database and get RT::SystemUser and RT::Nobody loaded -RT::Init(); - --# Clean out all the nasties from the environment --CleanEnv(); -- -require RT::Dashboard::Mailer; -RT::Dashboard::Mailer->MailDashboards( - All => $opts{all}, @@ -9346,10 +9799,10 @@ index cf27f82..0000000 - diff --git a/sbin/rt-email-digest b/sbin/rt-email-digest deleted file mode 100755 -index dfc9b2c..0000000 +index 303ce8b..0000000 --- a/sbin/rt-email-digest +++ /dev/null -@@ -1,374 +0,0 @@ +@@ -1,373 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -9420,12 +9873,11 @@ index dfc9b2c..0000000 -use Date::Format qw( strftime ); -use Getopt::Long; -use RT; --use RT::Interface::CLI qw( CleanEnv loc ); +-use RT::Interface::CLI qw( loc ); -use RT::Interface::Email; - -RT::LoadConfig(); -RT::Init(); --CleanEnv(); - -sub usage { - my ($error) = @_; @@ -9726,10 +10178,10 @@ index dfc9b2c..0000000 -=back diff --git a/sbin/rt-email-group-admin b/sbin/rt-email-group-admin deleted file mode 100755 -index a526a96..0000000 +index cc30ac4..0000000 --- a/sbin/rt-email-group-admin +++ /dev/null -@@ -1,520 +0,0 @@ +@@ -1,521 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -9778,6 +10230,7 @@ index a526a96..0000000 -# those contributions and any derivatives thereof. -# -# END BPS TAGGED BLOCK }}} +- -=head1 NAME - -rt-email-group-admin - Command line tool for administrating NotifyGroup actions @@ -9805,7 +10258,7 @@ index a526a96..0000000 - rt-email-group-admin --create 'Notify developers' --group 'Development Team' - -Then you can add the followoing scrip to your Bugs queue: -- +- - Condition: On Create - Action: Notify developers - Template: Transaction @@ -10252,10 +10705,10 @@ index a526a96..0000000 -=cut diff --git a/sbin/rt-fulltext-indexer b/sbin/rt-fulltext-indexer deleted file mode 100755 -index c7a99c0..0000000 +index 00893c8..0000000 --- a/sbin/rt-fulltext-indexer +++ /dev/null -@@ -1,416 +0,0 @@ +@@ -1,372 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -10306,7 +10759,7 @@ index c7a99c0..0000000 -# END BPS TAGGED BLOCK }}} -use strict; -use warnings; --no warnings 'once'; +-use 5.010; - -# fix lib paths, some may be relative -BEGIN { # BEGIN RT CMD BOILERPLATE @@ -10325,53 +10778,25 @@ index c7a99c0..0000000 - -} - --BEGIN { -- use RT; -- RT::LoadConfig(); -- RT::Init(); --}; +-use RT -init; -use RT::Interface::CLI (); +-use HTML::Entities; - --my %OPT = ( -- help => 0, -- debug => 0, -- quiet => 0, --); --my @OPT_LIST = qw(help|h! debug! quiet); +-use Getopt::Long qw(GetOptions); +-my %OPT = ( memory => '2M', limit => 0 ); +-GetOptions( \%OPT, +- "help|h!", +- "debug!", +- "quiet!", - --my $db_type = RT->Config->Get('DatabaseType'); --if ( $db_type eq 'Pg' ) { -- %OPT = ( -- %OPT, -- limit => 0, -- all => 0, -- ); -- push @OPT_LIST, 'limit=i', 'all!'; --} --elsif ( $db_type eq 'mysql' ) { -- %OPT = ( -- %OPT, -- limit => 0, -- all => 0, -- ); -- push @OPT_LIST, 'limit=i', 'all!'; --} --elsif ( $db_type eq 'Oracle' ) { -- %OPT = ( -- %OPT, -- memory => '2M', -- ); -- push @OPT_LIST, qw(memory=s); --} +- "all!", +- "limit=i", - --use Getopt::Long qw(GetOptions); --GetOptions( \%OPT, @OPT_LIST ); +- "memory=s", +-); +-$OPT{limit} ||= 200; - --if ( $OPT{'help'} ) { -- RT::Interface::CLI->ShowHelp( -- Sections => 'NAME|DESCRIPTION|'. uc($db_type), -- ); --} +-RT::Interface::CLI->ShowHelp if $OPT{help}; - -use Fcntl ':flock'; -if ( !flock main::DATA, LOCK_EX | LOCK_NB ) { @@ -10385,7 +10810,9 @@ index c7a99c0..0000000 - } -} - --my $fts_config = RT->Config->Get('FullTextSearch') || {}; +-my $db_type = RT->Config->Get('DatabaseType'); +-my $fts_config = $ENV{RT_FTS_CONFIG} ? JSON::from_json($ENV{RT_FTS_CONFIG}) +- : RT->Config->Get('FullTextSearch') || {}; -unless ( $fts_config->{'Enable'} ) { - print STDERR <<EOT; - @@ -10425,227 +10852,214 @@ index c7a99c0..0000000 - exit 1; -} - --my @types = qw(text html); --foreach my $type ( @types ) { -- REDO: -- my $attachments = attachments($type); -- $attachments->Limit( -- FIELD => 'id', -- OPERATOR => '>', -- VALUE => last_indexed($type) -- ); -- $attachments->OrderBy( FIELD => 'id', ORDER => 'asc' ); -- $attachments->RowsPerPage( $OPT{'limit'} || 100 ); -- -- my $found = 0; -- while ( my $a = $attachments->Next ) { -- next if filter( $type, $a ); -- debug("Found attachment #". $a->id ); -- my $txt = extract($type, $a) or next; -- $found++; -- process( $type, $a, $txt ); -- debug("Processed attachment #". $a->id ); -- } -- goto REDO if $OPT{'all'} and $attachments->Count == ($OPT{'limit'} || 100) --} -- --sub attachments { -- my $type = shift; -- my $res = RT::Attachments->new( RT->SystemUser ); -- my $txn_alias = $res->Join( -- ALIAS1 => 'main', -- FIELD1 => 'TransactionId', -- TABLE2 => 'Transactions', -- FIELD2 => 'id', -- ); -- $res->Limit( -- ALIAS => $txn_alias, -- FIELD => 'ObjectType', -- VALUE => 'RT::Ticket', -- ); -- my $ticket_alias = $res->Join( -- ALIAS1 => $txn_alias, -- FIELD1 => 'ObjectId', -- TABLE2 => 'Tickets', -- FIELD2 => 'id', -- ); -- $res->Limit( -- ALIAS => $ticket_alias, -- FIELD => 'Status', -- OPERATOR => '!=', -- VALUE => 'deleted' -- ); -- -- return goto_specific( -- suffix => $type, -- error => "Don't know how to find $type attachments", -- arguments => [$res], -- ); +-# Skip ACL checks. This saves a large number of unnecessary queries +-# (for tickets, ACLs, and users) which are unnecessary, as we are +-# running as the system user. +-{ +- no warnings 'redefine'; +- no warnings 'once'; +- *RT::Attachment::_Value = \&DBIx::SearchBuilder::Record::_Value; +- *RT::Attachments::Next = \&DBIx::SearchBuilder::Next; -} - --sub last_indexed { -- my ($type) = (@_); -- return goto_specific( -- suffix => $db_type, -- error => "Don't know how to find last indexed $type attachment for $db_type DB", -- arguments => \@_, -- ); +-my $LAST; +-if ($db_type eq 'mysql') { +- process_mysql(); +-} elsif ($db_type eq 'Pg') { +- process_pg(); -} - --sub filter { -- my $type = shift; -- return goto_specific( -- suffix => $type, -- arguments => \@_, -- ); --} +-sub attachment_loop { +- my $subref = shift; +- my $table = $fts_config->{'Table'}; +- $LAST //= 0; - --sub extract { -- my $type = shift; -- return goto_specific( -- suffix => $type, -- error => "No way to convert $type attachment into text", -- arguments => \@_, -- ); +- # Fetch in batches of size --limit +- { +- # Indexes all text/plain and text/html attachments +- my $attachments = RT::Attachments->new( RT->SystemUser ); +- $attachments->Limit( +- FIELD => 'ContentType', +- OPERATOR => 'IN', +- VALUE => ['text/plain', 'text/html'], +- ); +- $attachments->Limit( FIELD => 'id', OPERATOR => '>', VALUE => $LAST ); +- $attachments->OrderBy( FIELD => 'id', ORDER => 'asc' ); +- $attachments->RowsPerPage( $OPT{'limit'} ); +- +- # Call back to the DB-specific part +- $subref->($attachments); +- +- $LAST = $attachments->Last->id if $attachments->Count; +- +- redo if $OPT{'all'} and $attachments->Count == $OPT{'limit'}; +- } -} - --sub process { -- return goto_specific( -- suffix => $db_type, -- error => "No processer for $db_type DB", -- arguments => \@_, -- ); +-sub process_bulk_insert { +- my $dbh = $RT::Handle->dbh; +- my ($statement, $error) = @_; +- +- # Doing large inserts is faster than individual statements, but +- # comes at a parsing cost; cache the statement handles (99% of which +- # will be the same size) for a notable (2x) speed gain. +- my %sthandles; +- +- $sthandles{1} = +- $dbh->prepare($statement->(1)); +- +- attachment_loop( sub { +- my ($attachments) = @_; +- my @insert; +- my $found = 0; +- while ( my $a = $attachments->Next ) { +- debug("Found attachment #". $a->id ); +- my $text = $a->Content // ""; +- HTML::Entities::decode_entities($text) if $a->ContentType eq "text/html"; +- push @insert, $text, $a->id; +- $found++; +- } +- return unless $found; +- +- # $found should be the limit size on all but the last go-around. +- $sthandles{$found} ||= $dbh->prepare($statement->($found)); +- +- return if eval { $sthandles{$found}->execute(@insert); }; +- +- # We can catch and recover from some errors; re-do row-by-row to +- # know which row had which errors +- while (@insert) { +- my ($content, $id) = splice(@insert,0,2); +- next if eval { $sthandles{1}->execute($content, $id); }; +- $error->($id, $content); +- +- # If this was a semi-expected error, insert an empty +- # tsvector, so we count this row as "indexed" for +- # purposes of knowing where to pick up +- eval { $sthandles{1}->execute( "", $id ) } +- or die "Failed to insert empty row for attachment $id: " . $dbh->errstr; +- } +- }); -} - --sub last_indexed_mysql { last_indexed_pg(@_); } -sub process_mysql { -- my ($type, $attachment, $text) = (@_); -- - my $dbh = $RT::Handle->dbh; - my $table = $fts_config->{'Table'}; - -- my $query; -- if ( my ($id) = $dbh->selectrow_array("SELECT id FROM $table WHERE id = ?", undef, $attachment->id) ) { -- $query = "UPDATE $table SET Content = ? WHERE id = ?"; -- } else { -- $query = "INSERT INTO $table(Content, id) VALUES(?, ?)"; -- } +- ($LAST) = $dbh->selectrow_array("SELECT MAX(id) FROM $table"); - -- $dbh->do( $query, undef, $$text, $attachment->id ); --} +- my $insert = $fts_config->{Engine} eq "MyISAM" ? "INSERT DELAYED" : "INSERT"; - --sub last_indexed_pg { -- my $type = shift; -- my $attachments = attachments( $type ); -- my $alias = 'main'; -- if ( $fts_config->{'Table'} && $fts_config->{'Table'} ne 'Attachments' ) { -- $alias = $attachments->Join( -- TYPE => 'left', -- FIELD1 => 'id', -- TABLE2 => $fts_config->{'Table'}, -- FIELD2 => 'id', -- ); -- } -- $attachments->Limit( -- ALIAS => $alias, -- FIELD => $fts_config->{'Column'}, -- OPERATOR => 'IS NOT', -- VALUE => 'NULL', +- process_bulk_insert( +- sub { +- my ($n) = @_; +- return "$insert INTO $table(Content, id) VALUES " +- . join(", ", ("(?,?)") x $n); +- }, +- sub { +- my ($id) = @_; +- if ($dbh->err == 1366 and $dbh->state eq "HY000") { +- warn "Attachment $id cannot be indexed. Most probably it contains invalid UTF8 bytes. ". +- "Error: ". $dbh->errstr; +- } else { +- die "Attachment $id cannot be indexed: " . $dbh->errstr; +- } +- } - ); -- $attachments->OrderBy( FIELD => 'id', ORDER => 'desc' ); -- $attachments->RowsPerPage( 1 ); -- my $res = $attachments->First; -- return 0 unless $res; -- return $res->id; -} - +- -sub process_pg { -- my ($type, $attachment, $text) = (@_); +- if ( $fts_config->{'Table'} ne 'Attachments' ) { +- process_pg_insert(); +- } else { +- process_pg_update(); +- } +-} - +-sub process_pg_insert { - my $dbh = $RT::Handle->dbh; - my $table = $fts_config->{'Table'}; - my $column = $fts_config->{'Column'}; +- ($LAST) = $dbh->selectrow_array("SELECT MAX(id) FROM $table"); - -- my $query; -- if ( $table ) { -- if ( my ($id) = $dbh->selectrow_array("SELECT id FROM $table WHERE id = ?", undef, $attachment->id) ) { -- $query = "UPDATE $table SET $column = to_tsvector(?) WHERE id = ?"; -- } else { -- $query = "INSERT INTO $table($column, id) VALUES(to_tsvector(?), ?)"; -- } -- } else { -- $query = "UPDATE Attachments SET $column = to_tsvector(?) WHERE id = ?"; -- } -- -- my $status = eval { $dbh->do( $query, undef, $$text, $attachment->id ) }; -- unless ( $status ) { -- if ( $dbh->err == 7 && $dbh->state eq '54000' ) { -- warn "Attachment @{[$attachment->id]} cannot be indexed. Most probably it contains too many unique words. Error: ". $dbh->errstr; -- } elsif ( $dbh->err == 7 && $dbh->state eq '22021' ) { -- warn "Attachment @{[$attachment->id]} cannot be indexed. Most probably it contains invalid UTF8 bytes. Error: ". $dbh->errstr; -- } else { -- die "error: ". $dbh->errstr; +- process_bulk_insert( +- sub { +- my ($n) = @_; +- return "INSERT INTO $table($column, id) VALUES " +- . join(", ", ("(TO_TSVECTOR(?),?)") x $n); +- }, +- sub { +- my ($id) = @_; +- if ( $dbh->err == 7 && $dbh->state eq '54000' ) { +- warn "Attachment $id cannot be indexed. Most probably it contains too many unique words. ". +- "Error: ". $dbh->errstr; +- } elsif ( $dbh->err == 7 && $dbh->state eq '22021' ) { +- warn "Attachment $id cannot be indexed. Most probably it contains invalid UTF8 bytes. ". +- "Error: ". $dbh->errstr; +- } else { +- die "Attachment $id cannot be indexed: " . $dbh->errstr; +- } - } -- -- # Insert an empty tsvector, so we count this row as "indexed" -- # for purposes of knowing where to pick up -- eval { $dbh->do( $query, undef, "", $attachment->id ) } -- or die "Failed to insert empty tsvector: " . $dbh->errstr; -- } +- ); -} - --sub attachments_text { -- my $res = shift; -- $res->Limit( FIELD => 'ContentType', VALUE => 'text/plain' ); -- return $res; --} +-sub process_pg_update { +- my $dbh = $RT::Handle->dbh; +- my $column = $fts_config->{'Column'}; - --sub extract_text { -- my $attachment = shift; -- my $text = $attachment->Content; -- return undef unless defined $text && length($text); -- return \$text; --} +- ($LAST) = $dbh->selectrow_array("SELECT MAX(id) FROM Attachments WHERE $column IS NOT NULL"); - --sub attachments_html { -- my $res = shift; -- $res->Limit( FIELD => 'ContentType', VALUE => 'text/html' ); -- return $res; --} +- my $sth = $dbh->prepare("UPDATE Attachments SET $column = TO_TSVECTOR(?) WHERE id = ?"); - --sub filter_html { -- my $attachment = shift; -- if ( my $parent = $attachment->ParentObj ) { --# skip html parts that are alternatives -- return 1 if $parent->id -- && $parent->ContentType eq 'mulitpart/alternative'; -- } -- return 0; --} +- attachment_loop( sub { +- my ($attachments) = @_; +- my @insert; +- while ( my $a = $attachments->Next ) { +- debug("Found attachment #". $a->id ); - --sub extract_html { -- my $attachment = shift; -- my $text = $attachment->Content; -- return undef unless defined $text && length($text); --# the rich text editor generates html entities for characters --# but Pg doesn't index them, so decode to something it can index. -- require HTML::Entities; -- HTML::Entities::decode_entities($text); -- return \$text; --} +- my $text = $a->Content // ""; +- HTML::Entities::decode_entities($text) if $a->ContentType eq "text/html"; - --sub goto_specific { -- my %args = (@_); +- push @insert, [$text, $a->id]; +- } - -- my $func = (caller(1))[3]; -- $func =~ s/.*:://; -- my $call = $func ."_". lc $args{'suffix'}; -- unless ( defined &$call ) { -- return undef unless $args{'error'}; -- require Carp; Carp::croak( $args{'error'} ); -- } -- @_ = @{ $args{'arguments'} }; -- goto &$call; +- # Try in one database transaction; if it fails, we roll it back +- # and try one statement at a time. +- $dbh->begin_work; +- my $ok = 1; +- for (@insert) { +- $ok = eval { $sth->execute( $_->[0], $_->[1] ) }; +- last unless $ok; +- } +- if ($ok) { +- $dbh->commit; +- return; +- } +- $dbh->rollback; +- +- # Things didn't go well. Retry the UPDATE statements one row at +- # a time, outside of the transaction. +- for (@insert) { +- my ($content, $id) = ($_->[0], $_->[1]); +- next if eval { $sth->execute( $content, $id ) }; +- if ( $dbh->err == 7 && $dbh->state eq '54000' ) { +- warn "Attachment $id cannot be indexed. Most probably it contains too many unique words. ". +- "Error: ". $dbh->errstr; +- } elsif ( $dbh->err == 7 && $dbh->state eq '22021' ) { +- warn "Attachment $id cannot be indexed. Most probably it contains invalid UTF8 bytes. ". +- "Error: ". $dbh->errstr; +- } else { +- die "Attachment $id cannot be indexed: " . $dbh->errstr; +- } +- +- # If this was a semi-expected error, insert an empty +- # tsvector, so we count this row as "indexed" for +- # purposes of knowing where to pick up +- eval { $sth->execute( "", $id ) } +- or die "Failed to insert empty row for attachment $id: " . $dbh->errstr; +- } +- }); -} - - @@ -10664,11 +11078,6 @@ index c7a99c0..0000000 -Read F<docs/full_text_indexing.pod> for complete details on how and when -to run it. - --=head1 AUTHOR -- --Ruslan Zakirov E<lt>[email protected]<gt>, --Alex Vandiver E<lt>[email protected]<gt> -- -=cut - -__DATA__ @@ -10963,10 +11372,10 @@ index 785fcc2..0000000 -=cut diff --git a/sbin/rt-preferences-viewer b/sbin/rt-preferences-viewer deleted file mode 100755 -index 7bb6e70..0000000 +index 205ebf3..0000000 --- a/sbin/rt-preferences-viewer +++ /dev/null -@@ -1,144 +0,0 @@ +@@ -1,132 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -11035,21 +11444,9 @@ index 7bb6e70..0000000 - -} - --BEGIN { -- use RT; -- RT::LoadConfig(); -- RT::Init(); --}; -- --use Getopt::Long; +-use RT::Interface::CLI qw(Init); -my %opt; --GetOptions( \%opt, 'help|h', 'user|u=s', 'option|o=s' ); -- --if ( $opt{help} ) { -- require Pod::Usage; -- Pod::Usage::pod2usage({ verbose => 2 }); -- exit; --} +-Init( \%opt, 'user|u=s', 'option|o=s' ); - -require RT::Attributes; -my $attrs = RT::Attributes->new( RT->SystemUser ); @@ -11518,7 +11915,7 @@ index b90a709..0000000 - diff --git a/sbin/rt-server b/sbin/rt-server deleted file mode 100755 -index d3711f1..0000000 +index 51d14ac..0000000 --- a/sbin/rt-server +++ /dev/null @@ -1,181 +0,0 @@ @@ -11679,7 +12076,7 @@ index d3711f1..0000000 -# Try to clean up wrong-permissions var/ -$SIG{INT} = sub { - local $@; -- system("chown", "-R", "www-data:www-data", "/opt/rt4/var"); +- system("chown", "-R", "www:www", "/opt/rt4/var"); - exit 0; -} if $> == 0; - @@ -11705,7 +12102,7 @@ index d3711f1..0000000 - rt-server --server Starman --port 8080 diff --git a/sbin/rt-server.fcgi b/sbin/rt-server.fcgi deleted file mode 100755 -index d3711f1..0000000 +index 51d14ac..0000000 --- a/sbin/rt-server.fcgi +++ /dev/null @@ -1,181 +0,0 @@ @@ -11866,7 +12263,7 @@ index d3711f1..0000000 -# Try to clean up wrong-permissions var/ -$SIG{INT} = sub { - local $@; -- system("chown", "-R", "www-data:www-data", "/opt/rt4/var"); +- system("chown", "-R", "www:www", "/opt/rt4/var"); - exit 0; -} if $> == 0; - @@ -11892,10 +12289,10 @@ index d3711f1..0000000 - rt-server --server Starman --port 8080 diff --git a/sbin/rt-session-viewer b/sbin/rt-session-viewer deleted file mode 100755 -index 3b9e98d..0000000 +index 35131bd..0000000 --- a/sbin/rt-session-viewer +++ /dev/null -@@ -1,114 +0,0 @@ +@@ -1,104 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -11964,21 +12361,11 @@ index 3b9e98d..0000000 - -} - --use Getopt::Long; --my %opt; --GetOptions( \%opt, 'help|h', ); +-use RT::Interface::CLI qw(Init); +-Init(); - -my $session_id = shift; -- --if ( $opt{help} || !$session_id ) { -- require Pod::Usage; -- Pod::Usage::pod2usage({ verbose => 2 }); -- exit; --} -- --require RT; --RT::LoadConfig(); --RT::Init(); +-Pod::Usage::pod2usage({ verbose => 2 }) unless $session_id; - -require RT::Interface::Web::Session; -my %session; @@ -12012,10 +12399,10 @@ index 3b9e98d..0000000 -=cut diff --git a/sbin/rt-setup-database b/sbin/rt-setup-database deleted file mode 100755 -index c694e3d..0000000 +index ecea319..0000000 --- a/sbin/rt-setup-database +++ /dev/null -@@ -1,795 +0,0 @@ +@@ -1,800 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -12066,6 +12453,7 @@ index c694e3d..0000000 -# END BPS TAGGED BLOCK }}} -use strict; -use warnings; +-use 5.010; - -use vars qw($Nobody $SystemUser $item); - @@ -12366,9 +12754,13 @@ index c694e3d..0000000 -} - -sub action_insert { +- state $RAN_INIT; - my %args = @_; -- $RT::Handle = RT::Handle->new; -- RT::Init(); +- unless ($RAN_INIT) { +- $RT::Handle = RT::Handle->new; +- RT::Init(); +- $RAN_INIT++; +- } - $log_actions = 1; - - my ($status, $msg) = RT::Handle->CheckCompatibility( $RT::Handle->dbh, 'insert' ); @@ -12813,10 +13205,10 @@ index c694e3d..0000000 -=cut diff --git a/sbin/rt-setup-fulltext-index b/sbin/rt-setup-fulltext-index deleted file mode 100755 -index 1a8d312..0000000 +index b25b46f..0000000 --- a/sbin/rt-setup-fulltext-index +++ /dev/null -@@ -1,763 +0,0 @@ +@@ -1,787 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -12910,7 +13302,7 @@ index 1a8d312..0000000 -my %DEFAULT; -if ( $DB{'type'} eq 'Pg' ) { - %DEFAULT = ( -- table => 'Attachments', +- table => 'AttachmentsIndex', - column => 'ContentIndex', - ); -} @@ -12940,6 +13332,7 @@ index 1a8d312..0000000 - - 'dba=s' => \$DB{'admin'}, - 'dba-password=s' => \$DB{'admin_password'}, +- 'limit=i' => \$DB{'batch-size'}, -) or show_help(); - -if ( $OPT{'help'} || (!$DB{'admin'} && $DB{'type'} eq 'Oracle' ) ) { @@ -12994,9 +13387,13 @@ index 1a8d312..0000000 - my $engine = $RT::Handle->dbh->{mysql_serverversion} < 50600 ? "MyISAM" : "InnoDB"; - my $schema = "CREATE TABLE $table ( " - ."id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY," -- ."Content LONGTEXT, FULLTEXT(Content) ) ENGINE=$engine CHARACTER SET utf8"; +- ."Content LONGTEXT ) ENGINE=$engine CHARACTER SET utf8"; - insert_schema( $schema ); - +- insert_data( Table => $table, Engine => $engine ); +- +- insert_schema( "CREATE FULLTEXT INDEX $table ON $table(Content)" ); +- - print_rt_config( Table => $table ); -} elsif ($DB{'type'} eq 'sphinx') { - check_sphinx(); @@ -13106,6 +13503,8 @@ index 1a8d312..0000000 - seamless_rotate = 1 - preopen_indexes = 0 - unlink_old = 1 +- # For sphinx >= 1.10: +- binlog_path = $var_path/sphinx/ -} - -END @@ -13116,7 +13515,7 @@ index 1a8d312..0000000 - my $table = $OPT{'table'} || prompt( - message => "Enter the name of a DB table that will be used to store the Pg tsvector.\n" - . "You may either use the existing Attachments table, or create a new\n" -- . "table.", +- . "table. Creating a new table makes initial indexing faster.", - default => $DEFAULT{'table'}, - silent => !$OPT{'ask'}, - ); @@ -13126,32 +13525,39 @@ index 1a8d312..0000000 - silent => !$OPT{'ask'}, - ); - -- my $schema; +- my @schema; - my $drop; - if ( lc($table) eq 'attachments' ) { - $drop = "ALTER TABLE $table DROP COLUMN $column"; -- $schema = "ALTER TABLE $table ADD COLUMN $column tsvector"; +- push @schema, "ALTER TABLE $table ADD COLUMN $column tsvector"; - } else { - $drop = "DROP TABLE $table"; -- $schema = "CREATE TABLE $table ( " -- ."id INTEGER NOT NULL," -- ."$column tsvector )"; +- push @schema, split /;\n+/, <<SCHEMA; +-CREATE TABLE $table ( +- id SERIAL, +- $column tsvector +-); +-GRANT SELECT, INSERT, UPDATE, DELETE ON $table TO "$DB{user}" +-SCHEMA - } - - my $index_type = lc($OPT{'index-type'} || ''); - while ( $index_type ne 'gist' and $index_type ne 'gin' ) { - $index_type = lc prompt( -- message => "You may choose between GiST or GIN indexes; the former is several times\n" -- . "slower to search, but takes less space on disk and is faster to update.", -- default => 'GiST', +- message => "You may choose between GiST or GIN indexes; the GiST takes less space on\n" +- . "disk and is faster to update, but is an order of magnitude slower to query.", +- default => 'GIN', - silent => !$OPT{'ask'}, - ); - } - - do_error_is_ok( dba_handle() => $drop ) - unless $OPT{'dryrun'}; -- insert_schema( $schema ); -- insert_schema("CREATE INDEX ${column}_idx ON $table USING $index_type($column)"); +- insert_schema( $_ ) for @schema; +- +- insert_data( Table => $table, Column => $column ); +- +- insert_schema( "CREATE INDEX ${column}_idx ON $table USING $index_type($column)" ); - - print_rt_config( Table => $table, Column => $column ); -} @@ -13544,6 +13950,16 @@ index 1a8d312..0000000 - } -} - +-sub insert_data { +- return if $OPT{dryrun}; +- +- print "Indexing existing data...\n"; +- +- $ENV{RT_FTS_CONFIG} = JSON::to_json( {Enable => 1, Indexed => 1, @_}); +- system( "$RT::SbinPath/rt-fulltext-indexer", "--all", +- ($DB{'batch-size'} ? ("--limit", $DB{'batch-size'}) : ())); +-} +- -=head1 NAME - -rt-setup-fulltext-index - Create indexes for full text search @@ -13582,10 +13998,10 @@ index 1a8d312..0000000 - diff --git a/sbin/rt-shredder b/sbin/rt-shredder deleted file mode 100755 -index 208df2f..0000000 +index 721efea..0000000 --- a/sbin/rt-shredder +++ /dev/null -@@ -1,317 +0,0 @@ +@@ -1,318 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -13634,6 +14050,7 @@ index 208df2f..0000000 -# those contributions and any derivatives thereof. -# -# END BPS TAGGED BLOCK }}} +- -=head1 NAME - -rt-shredder - Script which wipe out tickets from RT DB @@ -13772,7 +14189,7 @@ index 208df2f..0000000 - } - my $list = "Next ". scalar( @$objs ) ." objects would be deleted:\n"; - foreach my $o( @$objs ) { -- $list .= "\t". $o->_AsString ." object\n"; +- $list .= "\t". $o->UID ." object\n"; - } - print $list; - exit(0) unless prompt_yN( "Do you want to proceed?" ); @@ -13905,10 +14322,10 @@ index 208df2f..0000000 -exit(0); diff --git a/sbin/rt-test-dependencies b/sbin/rt-test-dependencies deleted file mode 100755 -index 62f0f9c..0000000 +index 9b7c895..0000000 --- a/sbin/rt-test-dependencies +++ /dev/null -@@ -1,652 +0,0 @@ +@@ -1,680 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -13990,6 +14407,7 @@ index 62f0f9c..0000000 - 'with-HTML-DOC', - - 'list-deps', +- 'siteinstall!', - 'help|h', -); - @@ -14100,7 +14518,7 @@ index 62f0f9c..0000000 -CGI::Cookie 1.20 -CGI::Emulate::PSGI -CGI::PSGI 0.12 --Class::Accessor 0.34 +-Class::Accessor::Fast -Crypt::Eksblowfish -CSS::Squish 0.06 -Data::GUID @@ -14400,6 +14818,27 @@ index 62f0f9c..0000000 - my $module = shift; - my $version = shift; - +- unless (defined $args{siteinstall}) { +- require Config; +- my %uniq; +- my @order = grep {($_ eq $Config::Config{sitelibexp} +- or $_ eq $Config::Config{privlibexp}) +- and not $uniq{$_}++} @INC; +- if ($] < 5.011 and @order == 2 +- and $order[0] eq $Config::Config{sitelibexp} +- and $order[1] eq $Config::Config{privlibexp}) { +- +- print "\n"; +- print "Patched perl, with site_perl before core in \@INC, detected.\n"; +- print "Installing dual-life modules into site_perl so they are not\n"; +- print "later overridden by the distribution's package.\n"; +- +- $args{siteinstall} = 1; +- } else { +- $args{siteinstall} = 0; +- } +- } +- - print "\nInstall module $module\n"; - - my $ext = $ENV{'RT_FIX_DEPS_CMD'} || $ENV{'PERL_PREFER_CPAN_CLIENT'}; @@ -14419,6 +14858,12 @@ index 62f0f9c..0000000 -END - exit(1); - } +- +- my $installdirs = $CPAN::Config->{makepl_arg} ||= ""; +- $installdirs =~ s/(\bINSTALLDIRS=\S+|$)/ INSTALLDIRS=site/ +- if $args{siteinstall}; +- local $CPAN::Config->{makepl_arg} = $installdirs; +- - my $rv = eval { require CPAN; CPAN::Shell->install($module) }; - return $rv unless $@; - @@ -14475,12 +14920,12 @@ index 62f0f9c..0000000 - -sub check_users { - section("users"); -- print_found("rt group (www-data)", defined getgrnam("www-data")); +- print_found("rt group (www)", defined getgrnam("www")); - print_found("bin owner (root)", defined getpwnam("root")); - print_found("libs owner (root)", defined getpwnam("root")); - print_found("libs group (bin)", defined getgrnam("bin")); -- print_found("web owner (www-data)", defined getpwnam("www-data")); -- print_found("web group (www-data)", defined getgrnam("www-data")); +- print_found("web owner (www)", defined getpwnam("www")); +- print_found("web group (www)", defined getgrnam("www")); -} - -1; @@ -14942,10 +15387,10 @@ index 25d4cc3..0000000 -=back diff --git a/sbin/rt-validator b/sbin/rt-validator deleted file mode 100755 -index 6ebfc0d..0000000 +index 7786313..0000000 --- a/sbin/rt-validator +++ /dev/null -@@ -1,1465 +0,0 @@ +@@ -1,1462 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# @@ -15014,23 +15459,18 @@ index 6ebfc0d..0000000 - -} - --use Getopt::Long; +-use RT::Interface::CLI qw(Init); -my %opt = (); --GetOptions( +-Init( - \%opt, - 'check|c', - 'resolve', - 'force', - 'verbose|v', -- 'help|h', - 'links-only', -); - --if ( $opt{help} || !$opt{check} ) { -- require Pod::Usage; -- print Pod::Usage::pod2usage( { verbose => 2 } ); -- exit 2; --} +-Pod::Usage::pod2usage( { verbose => 2 } ) unless $opt{check}; - -usage_warning() if $opt{'resolve'} && !$opt{'force'}; - @@ -15048,10 +15488,6 @@ index 6ebfc0d..0000000 - <STDIN>; -} - --use RT; --RT::LoadConfig(); --RT::Init(); -- -my $dbh = $RT::Handle->dbh; -my $db_type = RT->Config->Get('DatabaseType'); - @@ -15906,7 +16342,7 @@ index 6ebfc0d..0000000 - - my $query = "SELECT id, $column FROM $table WHERE" - . " $column LIKE ? AND $column NOT LIKE ?"; -- my @binds = ($scheme ."://%", $prefix ."%"); +- my @binds = (sql_escape_like($scheme) ."://%", sql_escape_like($prefix) ."%"); - - while ( my ($k, $v) = each %{ $use->{'Additional'} || {} } ) { - $query .= " AND $k = ?"; @@ -15931,7 +16367,7 @@ index 6ebfc0d..0000000 - my $wrong_prefix = $scheme . '://'. $wrong_org; - my $query = "UPDATE $table SET $column = ". sql_concat('?', "SUBSTR($column, ?)") - ." WHERE $column LIKE ?"; -- execute_query( $query, $prefix, length($wrong_prefix)+1, $wrong_prefix .'/%' ); +- execute_query( $query, $prefix, length($wrong_prefix)+1, sql_escape_like($wrong_prefix) .'/%' ); - - $redo_check{'Links: wrong organization'} = 1; - $redo_check{'Links: LocalX for non-ticket'} = 1; @@ -15953,7 +16389,7 @@ index 6ebfc0d..0000000 - # we look only at links with correct organization, previouse check deals - # with incorrect orgs - my $where = "Local$dir > 0 AND $dir LIKE ? AND $dir NOT LIKE ?"; -- my @binds = ($prefix ."/%", $prefix ."/ticket/%"); +- my @binds = (sql_escape_like($prefix) ."/%", sql_escape_like($prefix) ."/ticket/%"); - - my $sth = execute_query( "SELECT id FROM $table WHERE $where", @binds ); - while ( my ($id, $value) = $sth->fetchrow_array ) { @@ -15989,7 +16425,7 @@ index 6ebfc0d..0000000 - # XXX: we have issue with MergedInto links - "LocalX !~ X" - my $where = "Local$dir > 0 AND $dir LIKE ? AND $dir != ". sql_concat('?', "Local$dir") - ." AND Type != ?"; -- my @binds = ($prefix ."%", $prefix, 'MergedInto'); +- my @binds = (sql_escape_like($prefix) ."%", $prefix, 'MergedInto'); - - my $sth = execute_query( "SELECT id FROM $table WHERE $where", @binds ); - while ( my ($id, $value) = $sth->fetchrow_array ) { @@ -16044,7 +16480,7 @@ index 6ebfc0d..0000000 - my $query = "SELECT s.id FROM $stable s LEFT JOIN $ttable t " - ." ON t.id = ". sql_str2int("SUBSTR(s.$scolumn, ?)") - ." WHERE s.$scolumn LIKE ? AND t.id IS NULL"; -- my @binds = (length($tprefix) + 1, $tprefix.'%'); +- my @binds = (length($tprefix) + 1, sql_escape_like($tprefix).'%'); - - while ( my ($k, $v) = each %{ $use->{'Additional'} || {} } ) { - $query .= " AND s.$k = ?"; @@ -16292,6 +16728,12 @@ index 6ebfc0d..0000000 - return $_[0]; -} - +-sub sql_escape_like { +- my ($string) = @_; +- $string =~ s/([%_\\])/\\$1/g; +- return $string; +-} +- -{ my %cached_answer; -sub prompt { - my $action = shift; @@ -16413,7 +16855,7 @@ index 6ebfc0d..0000000 - diff --git a/sbin/standalone_httpd b/sbin/standalone_httpd deleted file mode 100755 -index d3711f1..0000000 +index 51d14ac..0000000 --- a/sbin/standalone_httpd +++ /dev/null @@ -1,181 +0,0 @@ @@ -16574,7 +17016,7 @@ index d3711f1..0000000 -# Try to clean up wrong-permissions var/ -$SIG{INT} = sub { - local $@; -- system("chown", "-R", "www-data:www-data", "/opt/rt4/var"); +- system("chown", "-R", "www:www", "/opt/rt4/var"); - exit 0; -} if $> == 0; - @@ -16600,7 +17042,7 @@ index d3711f1..0000000 - rt-server --server Starman --port 8080 diff --git a/t/data/configs/apache2.2+fastcgi.conf b/t/data/configs/apache2.2+fastcgi.conf deleted file mode 100644 -index bc6056f..0000000 +index bc07e43..0000000 --- a/t/data/configs/apache2.2+fastcgi.conf +++ /dev/null @@ -1,49 +0,0 @@ @@ -16613,8 +17055,8 @@ index bc6056f..0000000 - -<IfModule !mpm_netware_module> -<IfModule !mpm_winnt_module> --User www-data --Group www-data +-User www +-Group www -</IfModule> -</IfModule> - @@ -16655,7 +17097,7 @@ index bc6056f..0000000 - diff --git a/t/data/configs/apache2.2+mod_perl.conf b/t/data/configs/apache2.2+mod_perl.conf deleted file mode 100644 -index e0ce14c..0000000 +index a17d68d..0000000 --- a/t/data/configs/apache2.2+mod_perl.conf +++ /dev/null @@ -1,67 +0,0 @@ @@ -16686,8 +17128,8 @@ index e0ce14c..0000000 - -<IfModule !mpm_netware_module> -<IfModule !mpm_winnt_module> --User www-data --Group www-data +-User www +-Group www -</IfModule> -</IfModule> - diff --git a/0002-Add-Fedora-configuration.patch b/0002-Add-Fedora-configuration.patch index 97c7e41..632cab1 100644 --- a/0002-Add-Fedora-configuration.patch +++ b/0002-Add-Fedora-configuration.patch @@ -1,14 +1,14 @@ -From 2eb20220b6acc85e52ff94a2293fa8ea91c6d302 Mon Sep 17 00:00:00 2001 +From b76b490969f7e26e390c5e113ed80502595f6d96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <[email protected]> Date: Tue, 18 Mar 2014 14:44:14 +0100 -Subject: [PATCH 2/8] Add Fedora configuration. +Subject: [PATCH 2/7] Add Fedora configuration. --- etc/RT_SiteConfig.pm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/etc/RT_SiteConfig.pm b/etc/RT_SiteConfig.pm -index 390a351..02495f6 100755 +index 390a351..02495f6 100644 --- a/etc/RT_SiteConfig.pm +++ b/etc/RT_SiteConfig.pm @@ -12,11 +12,12 @@ diff --git a/0003-Broken-test-dependencies.patch b/0003-Broken-test-dependencies.patch index a30e5ad..60ec107 100644 --- a/0003-Broken-test-dependencies.patch +++ b/0003-Broken-test-dependencies.patch @@ -1,21 +1,21 @@ -From e65fe99b030e8955f522be7202a2e76f39cc9645 Mon Sep 17 00:00:00 2001 +From 37816b62e899abe827b185341c7d9bb466e3c312 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <[email protected]> Date: Tue, 18 Mar 2014 14:47:19 +0100 -Subject: [PATCH 3/8] Broken test-dependencies. +Subject: [PATCH 3/7] Broken test-dependencies. --- sbin/rt-test-dependencies.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sbin/rt-test-dependencies.in b/sbin/rt-test-dependencies.in -index f8b80b7..b7d19d8 100644 +index 363177b..0e6139f 100644 --- a/sbin/rt-test-dependencies.in +++ b/sbin/rt-test-dependencies.in -@@ -189,7 +189,7 @@ CGI 3.38 +@@ -190,7 +190,7 @@ CGI 3.38 CGI::Cookie 1.20 CGI::Emulate::PSGI CGI::PSGI 0.12 --Class::Accessor 0.34 +-Class::Accessor::Fast +Class::Accessor::Fast 0.34 Crypt::Eksblowfish CSS::Squish 0.06 diff --git a/0004-Use-usr-bin-perl-instead-of-usr-bin-env-perl.patch b/0004-Use-usr-bin-perl-instead-of-usr-bin-env-perl.patch index e5eb235..7ef8b76 100644 --- a/0004-Use-usr-bin-perl-instead-of-usr-bin-env-perl.patch +++ b/0004-Use-usr-bin-perl-instead-of-usr-bin-env-perl.patch @@ -1,7 +1,7 @@ -From b39008e2f83274e4298da24b1ee4d00bea30c47b Mon Sep 17 00:00:00 2001 +From 73f6a43066dd3347c17e1c4cde8e5505e52a4e4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <[email protected]> Date: Tue, 18 Mar 2014 14:55:18 +0100 -Subject: [PATCH 4/8] Use /usr/bin/perl instead of /usr/bin/env perl. +Subject: [PATCH 4/7] Use /usr/bin/perl instead of /usr/bin/env perl. --- devel/tools/change-loc-msgstr | 2 +- @@ -59,7 +59,7 @@ index b9d7192..4a4f20c 100755 # BEGIN BPS TAGGED BLOCK {{{ diff --git a/devel/tools/rt-apache b/devel/tools/rt-apache -index dfbd477..942946c 100755 +index 40aec13..f274385 100755 --- a/devel/tools/rt-apache +++ b/devel/tools/rt-apache @@ -1,4 +1,4 @@ @@ -69,7 +69,7 @@ index dfbd477..942946c 100755 # BEGIN BPS TAGGED BLOCK {{{ # diff --git a/devel/tools/rt-attributes-editor b/devel/tools/rt-attributes-editor -index 15436ac..6890e8b 100755 +index cc69a02..72b90ed 100755 --- a/devel/tools/rt-attributes-editor +++ b/devel/tools/rt-attributes-editor @@ -1,4 +1,4 @@ diff --git a/0005-Remove-fixperms-font-install.patch b/0005-Remove-fixperms-font-install.patch index 0201b52..f27d235 100644 --- a/0005-Remove-fixperms-font-install.patch +++ b/0005-Remove-fixperms-font-install.patch @@ -1,14 +1,14 @@ -From ecea9d34aaec6fd23343c785a9f74593cd66baaa Mon Sep 17 00:00:00 2001 +From 4c5a226e724ea8f72a88b631438e87d198aaa497 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <[email protected]> Date: Tue, 18 Mar 2014 14:59:31 +0100 -Subject: [PATCH 5/8] Remove fixperms, font-install. +Subject: [PATCH 5/7] Remove fixperms, font-install. --- Makefile.in | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile.in b/Makefile.in -index f9b6402..5a23c85 100755 +index b5ebfb9..a75c700 100644 --- a/Makefile.in +++ b/Makefile.in @@ -260,7 +260,7 @@ upgrade-instruct: diff --git a/0006-Fix-permissions.patch b/0006-Fix-permissions.patch index f0280b9..97b5ea6 100644 --- a/0006-Fix-permissions.patch +++ b/0006-Fix-permissions.patch @@ -1,7 +1,7 @@ -From 85c2c1c33757a68a248437272b082e0106098b70 Mon Sep 17 00:00:00 2001 +From e1fb4bfaf42ab591296e45aea111fabf50d91b0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <[email protected]> Date: Tue, 18 Mar 2014 10:00:00 +0100 -Subject: [PATCH 6/8] Fix permissions. +Subject: [PATCH 6/7] Fix permissions. --- configure.ac | 0 diff --git a/0007-Fix-translation.patch b/0007-Fix-translation.patch deleted file mode 100644 index d2a7c16..0000000 --- a/0007-Fix-translation.patch +++ /dev/null @@ -1,25 +0,0 @@ -From d0d5d1b779a1c503bd9739c5b2245f6f842cd85d Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <[email protected]> -Date: Fri, 23 Jan 2015 04:36:45 +0100 -Subject: [PATCH 7/8] Fix translation. - ---- - share/po/de.po | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/share/po/de.po b/share/po/de.po -index 45c1977..ff47768 100644 ---- a/share/po/de.po -+++ b/share/po/de.po -@@ -1006,7 +1006,7 @@ msgstr "Alle Tickets" - - #: share/html/User/Prefs.html:173 - msgid "All iCal feeds embed a secret token which authorizes you. If the URL for one of your iCal feeds was exposed to the outside world, you can get a new secret, <b>breaking all existing iCal feeds</b>, below." --msgstr "Alle iCal-Feeds beinhalten einen geheimen Token durch welchen die Authorisierung erfolgt. Falls die URL für einen dieser iCal-Feeds irrtümlich nach Extern weitergegeben wurde, können Sie unterhalb einen neuen Token erstellen, welcher <b>alle exestierenden iCal-Feeds</b> ungültig werden lässt." -+msgstr "Alle iCal-Feeds beinhalten einen geheimen Token durch welchen die Authorisierung erfolgt. Falls die URL für einen dieser iCal-Feeds irrtümlich nach Extern weitergegeben wurde, können Sie unterhalb einen neuen Token erstellen, welcher <b>alle existierenden iCal-Feeds</b> ungültig werden lässt." - - #: share/html/Admin/Queues/index.html:99 - msgid "All queues matching search criteria" --- -2.1.0 - diff --git a/0007-Work-around-testsuite-failure.patch b/0007-Work-around-testsuite-failure.patch new file mode 100644 index 0000000..726baa6 --- /dev/null +++ b/0007-Work-around-testsuite-failure.patch @@ -0,0 +1,51 @@ +From 4ad3086f1fb8c908435a912d8655871645215082 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <[email protected]> +Date: Tue, 24 Mar 2015 08:39:06 +0100 +Subject: [PATCH 7/7] Work-around testsuite failure. cf. + https://bugzilla.redhat.com/show_bug.cgi?id=1121601#c36. + +--- + t/mail/html-outgoing.t | 27 --------------------------- + 1 file changed, 27 deletions(-) + +diff --git a/t/mail/html-outgoing.t b/t/mail/html-outgoing.t +index a37f52c..f6b3fac 100644 +--- a/t/mail/html-outgoing.t ++++ b/t/mail/html-outgoing.t +@@ -81,33 +81,6 @@ mail_ok { + 'Content-Type' => qr{multipart}, + }; + +-SKIP: { +- skip "Only fails on core HTMLFormatter", 9 +- unless RT->Config->Get("HTMLFormatter") eq "core"; +- diag "Failing HTML -> Text conversion"; +- warnings_like { +- my $body = '<table><tr><td><table><tr><td>Foo</td></tr></table></td></tr></table>'; +- mail_ok { +- ($ok, $tmsg) = $t->Correspond( +- MIMEObj => HTML::Mason::Commands::MakeMIMEEntity( +- Body => $body, +- Type => 'text/html', +- ), +- ); +- } { from => qr/RT System/, +- bcc => 'root@localhost', +- subject => qr/\Q[example.com #1] The internet is broken\E/, +- body => qr{Ticket URL: <a href="(http://localhost:\d+/Ticket/Display\.html\?id=1)">\1</a>.+?$body}s, +- 'Content-Type' => qr{text/html}, # TODO +- },{ from => qr/RT System/, +- to => '[email protected]', +- subject => qr/\Q[example.com #1] The internet is broken\E/, +- body => qr{$body}, +- 'Content-Type' => qr{text/html}, # TODO +- }; +- } [(qr/uninitialized value/, qr/Failed to downgrade HTML/)x3]; +-} +- + + diag "Admin Comment in HTML"; + mail_ok { +-- +2.1.0 + diff --git a/0008-Work-around-testsuite-failure.patch b/0008-Work-around-testsuite-failure.patch deleted file mode 100644 index 25973b0..0000000 --- a/0008-Work-around-testsuite-failure.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 8c6ede102c5a1ce1f7214abf7ac90ca72f2f2538 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <[email protected]> -Date: Tue, 24 Mar 2015 08:39:06 +0100 -Subject: [PATCH 8/8] Work-around testsuite failure. cf. - https://bugzilla.redhat.com/show_bug.cgi?id=1121601#c36. - ---- - t/mail/html-outgoing.t | 27 --------------------------- - 1 file changed, 27 deletions(-) - -diff --git a/t/mail/html-outgoing.t b/t/mail/html-outgoing.t -index a37f52c..f6b3fac 100644 ---- a/t/mail/html-outgoing.t -+++ b/t/mail/html-outgoing.t -@@ -81,33 +81,6 @@ mail_ok { - 'Content-Type' => qr{multipart}, - }; - --SKIP: { -- skip "Only fails on core HTMLFormatter", 9 -- unless RT->Config->Get("HTMLFormatter") eq "core"; -- diag "Failing HTML -> Text conversion"; -- warnings_like { -- my $body = '<table><tr><td><table><tr><td>Foo</td></tr></table></td></tr></table>'; -- mail_ok { -- ($ok, $tmsg) = $t->Correspond( -- MIMEObj => HTML::Mason::Commands::MakeMIMEEntity( -- Body => $body, -- Type => 'text/html', -- ), -- ); -- } { from => qr/RT System/, -- bcc => 'root@localhost', -- subject => qr/\Q[example.com #1] The internet is broken\E/, -- body => qr{Ticket URL: <a href="(http://localhost:\d+/Ticket/Display\.html\?id=1)">\1</a>.+?$body}s, -- 'Content-Type' => qr{text/html}, # TODO -- },{ from => qr/RT System/, -- to => '[email protected]', -- subject => qr/\Q[example.com #1] The internet is broken\E/, -- body => qr{$body}, -- 'Content-Type' => qr{text/html}, # TODO -- }; -- } [(qr/uninitialized value/, qr/Failed to downgrade HTML/)x3]; --} -- - - diag "Admin Comment in HTML"; - mail_ok { --- -2.1.0 - diff --git a/rt.spec b/rt.spec index d83d32b..4c95f6d 100644 --- a/rt.spec +++ b/rt.spec @@ -38,8 +38,8 @@ %global RT_STATICDIR %{_datadir}/%{name}/static Name: rt -Version: 4.2.10 -Release: 3%{?dist} +Version: 4.2.11 +Release: 1%{?dist} Summary: Request tracker Group: Applications/Internet @@ -61,8 +61,7 @@ Patch3: 0003-Broken-test-dependencies.patch Patch4: 0004-Use-usr-bin-perl-instead-of-usr-bin-env-perl.patch Patch5: 0005-Remove-fixperms-font-install.patch Patch6: 0006-Fix-permissions.patch -Patch7: 0007-Fix-translation.patch -Patch8: 0008-Work-around-testsuite-failure.patch +Patch7: 0007-Work-around-testsuite-failure.patch BuildArch: noarch @@ -359,7 +358,6 @@ sed -e 's,@RT_LOGDIR@,%{RT_LOGDIR},' %{SOURCE4} \ %patch5 -p1 %patch6 -p1 %patch7 -p1 -%patch8 -p1 # Propagate rpm's directories to config.layout cat << \EOF >> config.layout @@ -476,9 +474,11 @@ ln -s /usr/share/fonts/google-droid/DroidSansFallback.ttf ${RPM_BUILD_ROOT}%{RT_ install -d -m755 ${RPM_BUILD_ROOT}%{perl_testdir}/%{name} cp -R t ${RPM_BUILD_ROOT}%{perl_testdir}/%{name} -# Some parts of the testsuite want relative paths +# Uninstalled stuff the testsuite accesses install -d -m755 ${RPM_BUILD_ROOT}%{perl_testdir}/%{name}/devel cp -R devel/tools ${RPM_BUILD_ROOT}%{perl_testdir}/%{name}/devel +cp -R devel/docs ${RPM_BUILD_ROOT}%{perl_testdir}/%{name}/devel +# Some parts of the testsuite want relative paths cp %{SOURCE1} ${RPM_BUILD_ROOT}%{perl_testdir}/%{name} install -d -m755 ${RPM_BUILD_ROOT}%{perl_testdir}/%{name}/share ln -s %{RT_WWWDIR} ${RPM_BUILD_ROOT}%{perl_testdir}/%{name}/share/html @@ -591,6 +591,11 @@ fi %endif %changelog +* Wed Jun 17 2015 Ralf Corsépius <[email protected]> - 4.2.11-1 +- Update to 4.2.11. +- Rebase patches. +- Install devel/docs. + * Tue Jun 09 2015 Jitka Plesnikova <[email protected]> - 4.2.10-3 - Perl 5.22 rebuild diff --git a/sources b/sources index fee6b22..051e2dd 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -077f3ed99d36eb744fe25c2bfd70e996 rt-4.2.10.tar.gz +f0b02b2f97ff346ca2d57a17b136b9d0 rt-4.2.11.tar.gz -- cgit v0.10.2 http://pkgs.fedoraproject.org/cgit/rt.git/commit/?h=master&id=119b6c0aa818ae924682b7437e1150d68bb01d62 -- Fedora Extras Perl SIG http://www.fedoraproject.org/wiki/Extras/SIGs/Perl perl-devel mailing list [email protected] https://admin.fedoraproject.org/mailman/listinfo/perl-devel
