[rt] Update to rt-4.2.9.
corsepiu
corsepiu at fedoraproject.org
Mon Jan 26 07:08:28 UTC 2015
commit 02cdaaeb4d3e84f483c96e52ad97f4d5fa9ef47d
Author: Ralf Corsépius <corsepiu at fedoraproject.org>
Date: Mon Jan 26 08:05:56 2015 +0100
Update to rt-4.2.9.
...001-Remove-configure-time-generated-files.patch | 4217 +++++++++++++-------
...on.patch => 0002-Add-Fedora-configuration.patch | 23 +-
0002-Broken-test-dependencies.patch | 33 -
0003-Broken-test-dependencies.patch | 25 +
...-usr-bin-perl-instead-of-usr-bin-env-perl.patch | 75 +-
...atch => 0005-Remove-fixperms-font-install.patch | 20 +-
...permissions.patch => 0006-Fix-permissions.patch | 13 +-
0007-Fix-translation.patch | 25 +
...h => 0008-Adjust-path-to-html-autohandler.patch | 4 +-
0009-Work-around-testsuite-failure.patch | 47 +
README.fedora.in | 19 +-
rt.spec | 122 +-
12 files changed, 2925 insertions(+), 1698 deletions(-)
---
diff --git a/0006-Remove-configure-time-generated-files.patch b/0001-Remove-configure-time-generated-files.patch
similarity index 82%
rename from 0006-Remove-configure-time-generated-files.patch
rename to 0001-Remove-configure-time-generated-files.patch
index 8968578..8bd2020 100644
--- a/0006-Remove-configure-time-generated-files.patch
+++ b/0001-Remove-configure-time-generated-files.patch
@@ -1,42 +1,45 @@
-From c4a3d1f76d592c7b4c52b198feff6a3b99f58197 Mon Sep 17 00:00:00 2001
+From a5e8be9563b56168b93721ba3286d24d4960d1cb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <corsepiu at fedoraproject.org>
-Date: Fri, 16 May 2014 11:21:51 +0200
-Subject: [PATCH 6/6] Remove configure time generated files.
+Date: Tue, 18 Mar 2014 07:23:24 +0100
+Subject: [PATCH 1/8] Remove configure time generated files.
---
- Makefile | 569 -----
- bin/rt | 2648 ----------------------
- bin/rt-crontool | 468 ----
- bin/rt-mailgate | 526 -----
- etc/RT_Config.pm | 2772 ------------------------
+ Makefile | 583 -----
+ bin/rt | 2682 ---------------------
+ bin/rt-crontool | 456 ----
+ bin/rt-mailgate | 512 ----
+ etc/RT_Config.pm | 3024 ------------------------
etc/upgrade/3.8-ical-extension | 96 -
etc/upgrade/4.0-customfield-checkbox-extension | 86 -
etc/upgrade/generate-rtaddressregexp | 109 -
etc/upgrade/split-out-cf-categories | 171 --
+ etc/upgrade/switch-templates-to | 148 --
etc/upgrade/upgrade-articles | 264 ---
etc/upgrade/vulnerable-passwords | 142 --
- lib/RT/Generated.pm | 81 -
- sbin/rt-attributes-viewer | 122 --
- sbin/rt-clean-sessions | 190 --
- sbin/rt-dump-metadata | 357 ---
- sbin/rt-email-dashboards | 173 --
- sbin/rt-email-digest | 380 ----
- sbin/rt-email-group-admin | 527 -----
- sbin/rt-fulltext-indexer | 479 ----
- sbin/rt-preferences-viewer | 149 --
- sbin/rt-server | 285 ---
- sbin/rt-server.fcgi | 285 ---
- sbin/rt-session-viewer | 121 --
- sbin/rt-setup-database | 607 ------
- sbin/rt-setup-fulltext-index | 720 ------
- sbin/rt-shredder | 325 ---
- sbin/rt-test-dependencies | 694 ------
- sbin/rt-validate-aliases | 343 ---
- sbin/rt-validator | 1182 ----------
- sbin/standalone_httpd | 285 ---
- t/data/configs/apache2.2+fastcgi.conf | 50 -
+ lib/RT/Generated.pm | 84 -
+ sbin/rt-attributes-viewer | 115 -
+ 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 | 467 ----
+ sbin/rt-importer | 282 ---
+ sbin/rt-preferences-viewer | 144 --
+ sbin/rt-serializer | 398 ----
+ sbin/rt-server | 181 --
+ sbin/rt-server.fcgi | 181 --
+ sbin/rt-session-viewer | 114 -
+ sbin/rt-setup-database | 795 -------
+ sbin/rt-setup-fulltext-index | 713 ------
+ sbin/rt-shredder | 317 ---
+ sbin/rt-test-dependencies | 652 -----
+ sbin/rt-validate-aliases | 373 ---
+ sbin/rt-validator | 1464 ------------
+ sbin/standalone_httpd | 181 --
+ t/data/configs/apache2.2+fastcgi.conf | 49 -
t/data/configs/apache2.2+mod_perl.conf | 67 -
- 32 files changed, 15273 deletions(-)
+ 35 files changed, 16428 deletions(-)
delete mode 100644 Makefile
delete mode 100755 bin/rt
delete mode 100755 bin/rt-crontool
@@ -46,6 +49,7 @@ Subject: [PATCH 6/6] Remove configure time generated files.
delete mode 100755 etc/upgrade/4.0-customfield-checkbox-extension
delete mode 100755 etc/upgrade/generate-rtaddressregexp
delete mode 100755 etc/upgrade/split-out-cf-categories
+ delete mode 100755 etc/upgrade/switch-templates-to
delete mode 100755 etc/upgrade/upgrade-articles
delete mode 100755 etc/upgrade/vulnerable-passwords
delete mode 100644 lib/RT/Generated.pm
@@ -56,7 +60,9 @@ Subject: [PATCH 6/6] Remove configure time generated files.
delete mode 100755 sbin/rt-email-digest
delete mode 100755 sbin/rt-email-group-admin
delete mode 100755 sbin/rt-fulltext-indexer
+ delete mode 100755 sbin/rt-importer
delete mode 100755 sbin/rt-preferences-viewer
+ delete mode 100755 sbin/rt-serializer
delete mode 100755 sbin/rt-server
delete mode 100755 sbin/rt-server.fcgi
delete mode 100755 sbin/rt-session-viewer
@@ -72,10 +78,10 @@ Subject: [PATCH 6/6] Remove configure time generated files.
diff --git a/Makefile b/Makefile
deleted file mode 100644
-index dd3209c..0000000
+index 3037009..0000000
--- a/Makefile
+++ /dev/null
-@@ -1,569 +0,0 @@
+@@ -1,583 +0,0 @@
-# BEGIN BPS TAGGED BLOCK {{{
-#
-# COPYRIGHT:
@@ -141,15 +147,15 @@ index dd3209c..0000000
-
-
-RT_VERSION_MAJOR = 4
--RT_VERSION_MINOR = 0
--RT_VERSION_PATCH = 22
+-RT_VERSION_MINOR = 2
+-RT_VERSION_PATCH = 9
-
-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.
@@ -161,12 +167,8 @@ index dd3209c..0000000
-# Group that should own all of RT's libraries, generally root.
-LIBS_GROUP = bin
-
--WEB_USER = www-data
--WEB_GROUP = www-data
--
--
--APACHECTL = /usr/sbin/apachectl
--
+-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
@@ -186,11 +188,13 @@ index dd3209c..0000000
-RT_DOC_PATH = /opt/rt4/docs
-RT_FONT_PATH = /opt/rt4/share/fonts
-RT_LEXICON_PATH = /opt/rt4/share/po
+-RT_STATIC_PATH = /opt/rt4/share/static
-RT_LOCAL_PATH = /opt/rt4/local
-LOCAL_PLUGIN_PATH = /opt/rt4/local/plugins
-LOCAL_ETC_PATH = /opt/rt4/local/etc
-LOCAL_LIB_PATH = /opt/rt4/local/lib
-LOCAL_LEXICON_PATH = /opt/rt4/local/po
+-LOCAL_STATIC_PATH = /opt/rt4/local/static
-MASON_HTML_PATH = /opt/rt4/share/html
-MASON_LOCAL_HTML_PATH = /opt/rt4/local/html
-MASON_DATA_PATH = /opt/rt4/var/mason_data
@@ -225,7 +229,9 @@ index dd3209c..0000000
- rt-email-digest \
- rt-email-group-admin \
- rt-fulltext-indexer \
+- rt-importer \
- rt-preferences-viewer \
+- rt-serializer \
- rt-server \
- rt-server.fcgi \
- rt-session-viewer \
@@ -300,7 +306,7 @@ index dd3209c..0000000
-
-
-
--TEST_FILES = t/*.t t/*/*.t
+-TEST_FILES = t/*.t t/*/*.t t/*/*/*.t
-TEST_VERBOSE = 0
-
-RT_TEST_PARALLEL_NUM ?= 5
@@ -390,15 +396,21 @@ index dd3209c..0000000
- chmod -R u+rwX,go-w,go+rX $(DESTDIR)$(MASON_HTML_PATH) \
- $(DESTDIR)$(MASON_LOCAL_HTML_PATH) \
- $(DESTDIR)$(RT_LEXICON_PATH) \
-- $(DESTDIR)$(LOCAL_LEXICON_PATH)
+- $(DESTDIR)$(LOCAL_LEXICON_PATH) \
+- $(DESTDIR)$(RT_STATIC_PATH) \
+- $(DESTDIR)$(LOCAL_STATIC_PATH)
- chown -R $(LIBS_OWNER) $(DESTDIR)$(MASON_HTML_PATH) \
- $(DESTDIR)$(MASON_LOCAL_HTML_PATH) \
- $(DESTDIR)$(RT_LEXICON_PATH) \
-- $(DESTDIR)$(LOCAL_LEXICON_PATH)
+- $(DESTDIR)$(LOCAL_LEXICON_PATH) \
+- $(DESTDIR)$(RT_STATIC_PATH) \
+- $(DESTDIR)$(LOCAL_STATIC_PATH)
- chgrp -R $(LIBS_GROUP) $(DESTDIR)$(MASON_HTML_PATH) \
- $(DESTDIR)$(MASON_LOCAL_HTML_PATH) \
- $(DESTDIR)$(RT_LEXICON_PATH) \
-- $(DESTDIR)$(LOCAL_LEXICON_PATH)
+- $(DESTDIR)$(LOCAL_LEXICON_PATH) \
+- $(DESTDIR)$(RT_STATIC_PATH) \
+- $(DESTDIR)$(LOCAL_STATIC_PATH)
-
- # Make the web ui's data dir writable
- chmod 0770 $(DESTDIR)$(MASON_DATA_PATH) \
@@ -412,6 +424,7 @@ index dd3209c..0000000
- $(INSTALL) -m 0755 -d $(DESTDIR)$(RT_LOG_PATH)
- $(INSTALL) -m 0755 -d $(DESTDIR)$(RT_FONT_PATH)
- $(INSTALL) -m 0755 -d $(DESTDIR)$(RT_LEXICON_PATH)
+- $(INSTALL) -m 0755 -d $(DESTDIR)$(RT_STATIC_PATH)
- $(INSTALL) -m 0770 -d $(DESTDIR)$(MASON_DATA_PATH)
- $(INSTALL) -m 0770 -d $(DESTDIR)$(MASON_DATA_PATH)/cache
- $(INSTALL) -m 0770 -d $(DESTDIR)$(MASON_DATA_PATH)/etc
@@ -423,10 +436,16 @@ index dd3209c..0000000
- $(INSTALL) -m 0755 -d $(DESTDIR)$(LOCAL_LIB_PATH)
- $(INSTALL) -m 0755 -d $(DESTDIR)$(LOCAL_PLUGIN_PATH)
- $(INSTALL) -m 0755 -d $(DESTDIR)$(LOCAL_LEXICON_PATH)
+- $(INSTALL) -m 0755 -d $(DESTDIR)$(LOCAL_STATIC_PATH)
+-
+-clean-mason-cache:
+- rm -rf $(DESTDIR)$(MASON_DATA_PATH)/cache/*
+- rm -rf $(DESTDIR)$(MASON_DATA_PATH)/etc/*
+- rm -rf $(DESTDIR)$(MASON_DATA_PATH)/obj/*
-
-install: testdeps config-install dirs files-install fixperms instruct
-
--files-install: libs-install etc-install config-install bin-install sbin-install html-install doc-install font-install po-install
+-files-install: libs-install etc-install config-install bin-install sbin-install html-install doc-install font-install po-install static-install
-
-config-install:
- $(INSTALL) -m 0755 -o $(BIN_OWNER) -g $(RTGROUP) -d $(DESTDIR)$(CONFIG_FILE_PATH)
@@ -479,6 +498,7 @@ index dd3209c..0000000
- -( cd share/html && find . -type f -print ) | while read file ; do \
- $(INSTALL) -m 0644 "share/html/$$file" "$(DESTDIR)$(MASON_HTML_PATH)/$$file" ; \
- done
+- $(MAKE) clean-mason-cache
-
-font-install:
- [ -d $(DESTDIR)$(RT_FONT_PATH) ] || $(INSTALL) -m 0755 -d $(DESTDIR)$(RT_FONT_PATH)
@@ -493,6 +513,14 @@ index dd3209c..0000000
- $(INSTALL) -m 0644 "share/po/$$file" "$(DESTDIR)$(RT_LEXICON_PATH)/$$file" ; \
- done
-
+-static-install:
+- [ -d $(DESTDIR)$(RT_STATIC_PATH) ] || $(INSTALL) -m 0755 -d $(DESTDIR)$(RT_STATIC_PATH)
+- -( cd share/static && find . -type d -print ) | while read dir ; do \
+- $(INSTALL) -m 0755 -d "$(DESTDIR)$(RT_STATIC_PATH)/$$dir" ; \
+- done
+- -( cd share/static && find . -type f -print ) | while read file ; do \
+- $(INSTALL) -m 0644 "share/static/$$file" "$(DESTDIR)$(RT_STATIC_PATH)/$$file" ; \
+- done
-
-
-doc-install:
@@ -544,20 +572,12 @@ index dd3209c..0000000
-license-tag:
- $(PERL) devel/tools/license_tag
-
--factory: initialize-database
-- cd lib; $(PERL) ../devel/tools/factory $(DB_DATABASE) RT
--
-start-httpd:
- $(PERL) sbin/standalone_httpd &
-
-start-server:
- $(PERL) sbin/rt-server &
-
--apachectl:
-- $(APACHECTL) stop
-- sleep 10
-- $(APACHECTL) start
-- sleep 5
-
-SNAPSHOT=$(shell git describe --tags)
-THIRD_PARTY=devel/third-party/
@@ -579,7 +599,7 @@ index dd3209c..0000000
- rm -fr "$(SNAPSHOT)/"
-
-clearsign-snapshot:
-- gpg --no-armor --detach-sign "$(SNAPSHOT).tar.gz"
+- gpg --armor --detach-sign "$(SNAPSHOT).tar.gz"
-
-build-third-party:
- git archive --prefix "$(SNAPSHOT)/$(THIRD_PARTY)" HEAD:$(THIRD_PARTY) \
@@ -587,7 +607,7 @@ index dd3209c..0000000
- rm -rf "$(SNAPSHOT)/$(THIRD_PARTY)"
-
-clearsign-third-party:
-- gpg --no-armor --detach-sign "$(SNAPSHOT)-third-party-source.tar.gz"
+- gpg --armor --detach-sign "$(SNAPSHOT)-third-party-source.tar.gz"
-
-snapshot-shasums:
- sha1sum $(SNAPSHOT)*.tar.gz*
@@ -605,8 +625,8 @@ index dd3209c..0000000
- --skip cpan-capitalization,cpan-mod_perl,cpan-Encode,cpan-PPI,cpan-Test-Exception-LessClever,cpan-Test-Manifest,cpan-Test-Object,cpan-Test-Pod,cpan-Test-Requires,cpan-Test-SubCalls,cpan-Test-cpan-Tester,cpan-Test-Warn --skip-all-recommends
- mv $(VESSEL)/scripts/RT/build $(VESSEL)/scripts/RT/build.pl
-
--JSMIN_URL = http://download.bestpractical.com/mirror/jsmin-2011-01-22.c
--JSMIN_SHA = 8a6b3b980a52c028eb73aee4a82ebe060c1ee854
+-JSMIN_URL = http://download.bestpractical.com/mirror/jsmin-2013-03-29.c
+-JSMIN_SHA = 67dc8d73a8878f88cdaeb1a86775872eae5c3077
-
-jsmin: jsmin-checkcc jsmin-fetch jsmin-verify jsmin-confirm jsmin-build jsmin-install
- @echo ""
@@ -647,10 +667,10 @@ index dd3209c..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 dffd19f..0000000
+index a73bb42..0000000
--- a/bin/rt
+++ /dev/null
-@@ -1,2648 +0,0 @@
+@@ -1,2682 +0,0 @@
-#!/usr/bin/perl -w
-# BEGIN BPS TAGGED BLOCK {{{
-#
@@ -983,32 +1003,53 @@ index dffd19f..0000000
- $data{orderby} =~ s/^\+?(.*)/-$1/;
- }
-
-- if (!defined $q) {
-- $q = $config{query};
+- $type ||= "ticket";
+-
+- if (!defined $q ) {
+- if ( $type eq 'ticket' ) {
+- $q = $config{query};
+- }
+- else {
+- $q = '';
+- }
- }
--
-- $q =~ s/^#//; # get rid of leading hash
-- if ($q =~ /^\d+$/) {
-- # only digits, must be an id, formulate a correct query
-- $q = "id=$q" if $q =~ /^\d+$/;
-- } else {
-- # a string only, take it as an owner or requestor (quoting done later)
-- $q = "(Owner=$q or Requestor like $q) and $config{query}"
-- if $q =~ /^[\w\-]+$/;
-- # always add a query for a specific queue or (comma separated) queues
-- $queue =~ s/,/ or Queue=/g if $queue;
-- $q .= " and (Queue=$queue)" if $queue and $q and $q !~ /Queue\s*=/i
-- and $q !~ /id\s*=/i;
+-
+- if ( $type ne 'ticket' ) {
+- $rawprint = 1;
- }
-- # correctly quote strings in a query
-- $q =~ s/(=|like\s)\s*([^'\d\s]\S*)\b/$1\'$2\'/g;
-
-- $type ||= "ticket";
-- unless ($type && defined $q) {
+- unless (defined $q) {
- my $item = $type ? "query string" : "object type";
- whine "No $item specified.";
- $bad = 1;
- }
+-
+- $q =~ s/^#//; # get rid of leading hash
+- if ( $type eq 'ticket' ) {
+- if ( $q =~ /^\d+$/ ) {
+-
+- # only digits, must be an id, formulate a correct query
+- $q = "id=$q" if $q =~ /^\d+$/;
+- }
+- else {
+-
+- # a string only, take it as an owner or requestor (quoting done later)
+- $q = "(Owner=$q or Requestor like $q) and $config{query}"
+- if $q =~ /^[\w\-]+$/;
+-
+- # always add a query for a specific queue or (comma separated) queues
+- $queue =~ s/,/ or Queue=/g if $queue;
+- $q .= " and (Queue=$queue)"
+- if $queue
+- and $q
+- and $q !~ /Queue\s*=/i
+- and $q !~ /id\s*=/i;
+- }
+-
+- # correctly quote strings in a query
+- $q =~ s/(=|like\s)\s*([^'\d\s]\S*)\b/$1\'$2\'/g;
+- }
+-
- #return help("list", $type) if $bad;
- return suggest_help("list", $type, $bad) if $bad;
-
@@ -1425,6 +1466,7 @@ index dffd19f..0000000
- my ($action) = @_;
- my (%data, $id, @files, @bcc, @cc, $msg, $content_type, $wtime, $edit);
- my $bad = 0;
+- my $status = '';
-
- while (@ARGV) {
- $_ = shift @ARGV;
@@ -1432,7 +1474,7 @@ index dffd19f..0000000
- if (/^-e$/) {
- $edit = 1;
- }
-- elsif (/^-(?:[abcmw]|ct)$/) {
+- elsif (/^-(?:[abcmws]|ct)$/) {
- unless (@ARGV) {
- whine "No argument specified with $_.";
- $bad = 1; last;
@@ -1448,6 +1490,9 @@ index dffd19f..0000000
- elsif (/-ct/) {
- $content_type = shift @ARGV;
- }
+- elsif (/-s/) {
+- $status = shift @ARGV;
+- }
- elsif (/-([bc])/) {
- my $a = $_ eq "-b" ? \@bcc : \@cc;
- @$a = split /\s*,\s*/, shift @ARGV;
@@ -1490,9 +1535,12 @@ index dffd19f..0000000
- TimeWorked => $wtime || '',
- 'Content-Type' => $content_type || 'text/plain',
- Text => $msg || '',
-- Status => ''
+- Status => $status
- }
- ];
+- if ($status ne '') {
+- push(@{$form->[1]}, "Status");
+- }
-
- my $text = Form::compose([ $form ]);
-
@@ -2852,13 +2900,14 @@ index dffd19f..0000000
- Displays a list of objects matching the specified conditions.
- ("ls", "list", and "search" are synonyms.)
-
-- Conditions are expressed in the SQL-like syntax used internally by
-- RT. (For more information, see "rt help query".) The query string
-- must be supplied as one argument.
+- The query string must be supplied as one argument.
-
-- (Right now, the server doesn't support listing anything but tickets.
-- Other types will be supported in future; this client will be able to
-- take advantage of that support without any changes.)
+- if on tickets, query is in the SQL-like syntax used internally by
+- RT. (For more information, see "rt help query".), otherwise, query
+- is plain string with format "FIELD OP VALUE", e.g. "Name = General".
+-
+- if query string is absent, we limit to privileged ones on users and
+- user defined ones on groups automatically.
-
- Options:
-
@@ -2889,6 +2938,9 @@ index dffd19f..0000000
- rt ls -t ticket "Subject like '[PATCH]%'"
- rt ls -q systems
- rt ls -f owner,subject
+- rt ls -t queue 'Name = General'
+- rt ls -t user 'EmailAddress like foo at bar.com'
+- rt ls -t group 'Name like foo'
-
---
-
@@ -3031,6 +3083,8 @@ index dffd19f..0000000
- than once to attach multiple files.)
- -c <addrs> A comma-separated list of Cc addresses.
- -b <addrs> A comma-separated list of Bcc addresses.
+- -s <status> Set a new status for the ticket (default will
+- leave the status unchanged)
- -w <time> Specify the time spent working on this ticket.
- -e Starts an editor before the submission, even if
- arguments from the command line were sufficient.
@@ -3301,10 +3355,10 @@ index dffd19f..0000000
-
diff --git a/bin/rt-crontool b/bin/rt-crontool
deleted file mode 100755
-index ca9a6d6..0000000
+index 95469f7..0000000
--- a/bin/rt-crontool
+++ /dev/null
-@@ -1,468 +0,0 @@
+@@ -1,456 +0,0 @@
-#!/usr/bin/perl
-# BEGIN BPS TAGGED BLOCK {{{
-#
@@ -3358,23 +3412,15 @@ index ca9a6d6..0000000
-use Carp;
-
-# fix lib paths, some may be relative
--BEGIN {
+-BEGIN { # BEGIN RT CMD BOILERPLATE
- require File::Spec;
+- require Cwd;
- my @libs = ("lib", "local/lib");
- my $bin_path;
-
- for my $lib (@libs) {
- unless ( File::Spec->file_name_is_absolute($lib) ) {
-- unless ($bin_path) {
-- if ( File::Spec->file_name_is_absolute(__FILE__) ) {
-- $bin_path = ( File::Spec->splitpath(__FILE__) )[1];
-- }
-- else {
-- require FindBin;
-- no warnings "once";
-- $bin_path = $FindBin::Bin;
-- }
-- }
+- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1];
- $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib );
- }
- unshift @INC, $lib;
@@ -3388,9 +3434,6 @@ index ca9a6d6..0000000
-
-use RT::Interface::CLI qw(CleanEnv GetCurrentUser GetMessageContent loc);
-
--#Clean out all the nasties from the environment
--CleanEnv();
--
-my ( $search, $condition, $action, $search_arg, $condition_arg, $action_arg,
- $template, $template_id, $transaction, $transaction_type, $help, $log, $verbose );
-GetOptions(
@@ -3413,11 +3456,14 @@ index ca9a6d6..0000000
-RT::LoadConfig();
-
-# adjust logging to the screen according to options
--RT->Config->Set( LogToScreen => $log ) if $log;
+-RT->Config->Set( LogToSTDERR => $log ) if $log;
-
-#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;
-
@@ -3428,7 +3474,7 @@ index ca9a6d6..0000000
-help() if $help;
-
-unless ( $CurrentUser->Id ) {
-- print loc("No RT user found. Please consult your RT administrator.");
+- print loc("No RT user found. Please consult your RT administrator.") . "\n";
- exit(1);
-}
-
@@ -3568,24 +3614,20 @@ index ca9a6d6..0000000
-#
-# =cut
-
--{ my $cache = undef;
-sub get_template {
- my $ticket = shift;
- return undef unless $template;
-
- unless ( $template =~ /\D/ ) {
- # by id
-- return $cache if $cache;
--
-- my $cache = RT::Template->new( RT->SystemUser );
-- $cache->Load( $template );
+- my $template_obj = RT::Template->new( RT->SystemUser );
+- $template_obj->Load( $template );
- die "Failed to load template '$template'"
-- unless $cache->id;
-- return $cache;
+- unless $template_obj->id;
+- return $template_obj;
- }
-
- my $queue = $ticket->Queue;
-- return $cache->{ $queue } if $cache->{ $queue };
-
- my $res = RT::Template->new( RT->SystemUser );
- $res->LoadQueueTemplate( Queue => $queue, Name => $template );
@@ -3594,8 +3636,8 @@ index ca9a6d6..0000000
- die "Failed to load template '$template', either for queue #$queue or global"
- unless $res->id;
- }
-- return $cache->{ $queue } = $res;
--} }
+- return $res;
+-}
-
-
-# =head2 load_module
@@ -3606,9 +3648,9 @@ index ca9a6d6..0000000
-
-sub load_module {
- my $modname = shift;
-- eval "require $modname";
-- if ($@) {
-- die loc( "Failed to load module [_1]. ([_2])", $modname, $@ );
+- unless ($modname->require) {
+- my $error = $@;
+- die loc( "Failed to load module [_1]. ([_2])", $modname, $error );
- }
-
-}
@@ -3620,37 +3662,37 @@ index ca9a6d6..0000000
- . "\n";
- print loc("It takes several arguments:") . "\n\n";
-
-- print " "
+- print " "
- . loc( "[_1] - Specify the search module you want to use", "--search" )
- . "\n";
-- print " "
+- print " "
- . loc( "[_1] - An argument to pass to [_2]", "--search-arg", "--search" )
- . "\n";
-
-- print " "
+- print " "
- . loc( "[_1] - Specify the condition module you want to use", "--condition" )
- . "\n";
-- print " "
+- print " "
- . loc( "[_1] - An argument to pass to [_2]", "--condition-arg", "--condition" )
- . "\n";
-- print " "
+- print " "
- . loc( "[_1] - Specify the action module you want to use", "--action" )
- . "\n";
-- print " "
+- print " "
- . loc( "[_1] - An argument to pass to [_2]", "--action-arg", "--action" )
- . "\n";
-- print " "
+- print " "
- . loc( "[_1] - Specify name or id of template(s) you want to use", "--template" )
- . "\n";
-- print " "
+- print " "
- . loc( "[_1] - Specify if you want to use either 'first', 'last' or 'all' transactions", "--transaction" )
- . "\n";
-- print " "
+- print " "
- . loc( "[_1] - Specify the comma separated list of transactions' types you want to use", "--transaction-type" )
- . "\n";
-- print " "
-- . loc( "[_1] - Adjust LogToScreen config option", "--log" ) . "\n";
-- print " "
+- print " "
+- . loc( "[_1] - Adjust LogToSTDERR config option", "--log" ) . "\n";
+- print " "
- . loc( "[_1] - Output status updates to STDOUT", "--verbose" ) . "\n";
- print "\n";
- print "\n";
@@ -3765,7 +3807,7 @@ index ca9a6d6..0000000
-
-=item log
-
--Adjust LogToScreen config option
+-Adjust LogToSTDERR config option
-
-=item verbose
-
@@ -3775,10 +3817,10 @@ index ca9a6d6..0000000
-
diff --git a/bin/rt-mailgate b/bin/rt-mailgate
deleted file mode 100755
-index 2e1c76f..0000000
+index 213d064..0000000
--- a/bin/rt-mailgate
+++ /dev/null
-@@ -1,526 +0,0 @@
+@@ -1,512 +0,0 @@
-#!/usr/bin/perl -w
-# BEGIN BPS TAGGED BLOCK {{{
-#
@@ -3925,12 +3967,6 @@ index 2e1c76f..0000000
- return $self->permfail();
- }
-
-- if (($opts->{'ca-file'} or $opts->{"verify-ssl"})
-- and not LWP::UserAgent->can("ssl_opts")) {
-- print STDERR "Verifying SSL certificates requires LWP::UserAgent 6.0 or higher.\n";
-- return $self->tempfail();
-- }
--
- $opts->{"verify-ssl"} = 1 unless defined $opts->{"verify-ssl"};
-}
-
@@ -3938,13 +3974,12 @@ index 2e1c76f..0000000
- my $self = shift;
- my $opts = shift;
- my $ua = LWP::UserAgent->new();
+- $ua->agent("rt-mailgate/4.2.9 ");
- $ua->cookie_jar( { file => $opts->{'jar'} } ) if $opts->{'jar'};
-
-- if ( $ua->can("ssl_opts") ) {
-- $ua->ssl_opts( verify_hostname => $opts->{'verify-ssl'} );
-- $ua->ssl_opts( SSL_ca_file => $opts->{'ca-file'} )
-- if $opts->{'ca-file'};
-- }
+- $ua->ssl_opts( verify_hostname => $opts->{'verify-ssl'} );
+- $ua->ssl_opts( SSL_ca_file => $opts->{'ca-file'} )
+- if $opts->{'ca-file'};
-
- return $ua;
-}
@@ -4007,6 +4042,14 @@ index 2e1c76f..0000000
-
- $ua->timeout( exists( $opts->{'timeout'} ) ? $opts->{'timeout'} : 180 );
- my $r = $ua->post( $full_url, $post_params, Content_Type => 'form-data' );
+-
+- # Follow 3 redirects
+- my $n = 0;
+- while ($n++ < 3 and $r->is_redirect) {
+- $full_url = $r->header( "Location" );
+- $r = $ua->post( $full_url, $post_params, Content_Type => 'form-data' );
+- }
+-
- $self->check_failure($r);
-
- my $content = $r->content;
@@ -4033,13 +4076,8 @@ index 2e1c76f..0000000
- my $r = shift;
- return if $r->is_success;
-
-- # XXX TODO 4.2: Remove the multi-line error strings in favor of something more concise
-- print STDERR <<" ERROR";
--An Error Occurred
--=================
--
--@{[ $r->status_line ]}
-- ERROR
+- print STDERR "HTTP request failed: @{[ $r->status_line ]}. "
+- ."Your webserver logs may have more information or there may be a network problem.\n";
- print STDERR "\n$0: undefined server error\n" if $opts->{'debug'};
- return $self->tempfail();
-}
@@ -4139,10 +4177,6 @@ index 2e1c76f..0000000
-This flag tells the mail gateway where it can find your RT server. You should
-probably use the same URL that users use to log into RT.
-
--If your RT server uses SSL, you will need to install additional Perl
--libraries. RT will detect and install these dependencies if you pass the
--C<--enable-ssl-mailgate> flag to configure as documented in RT's README.
--
-If you have a self-signed SSL certificate, you may also need to pass
-C<--ca-file> or C<--no-verify-ssl>, below.
-
@@ -4163,9 +4197,6 @@ index 2e1c76f..0000000
-other certificate which is not traceable back to an certificate your
-system ultimitely trusts.
-
--Verifying SSL certificates requires L<LWP::UserAgent> version 6.0 or
--higher; explicitly passing C<--verify-ssl> on prior versions will error.
--
-=item C<--extension> OPTIONAL
-
-Some MTAs will route mail sent to user-foo at host or user+foo at host to user at host
@@ -4201,12 +4232,9 @@ index 2e1c76f..0000000
-=head1 SETUP
-
-Much of the set up of the mail gateway depends on your MTA and mail
--routing configuration. However, you will need first of all to create an
--RT user for the mail gateway and assign it a password; this helps to
--ensure that mail coming into the web server did originate from the
--gateway.
+-routing configuration.
-
--Next, you need to route mail to C<rt-mailgate> for the queues you're
+-You need to route mail to C<rt-mailgate> for the queues you're
-monitoring. For instance, if you're using F</etc/aliases> and you have a
-"bugs" queue, you will want something like this:
-
@@ -4307,10 +4335,10 @@ index 2e1c76f..0000000
-
diff --git a/etc/RT_Config.pm b/etc/RT_Config.pm
deleted file mode 100644
-index 59eca8d..0000000
+index 54f4579..0000000
--- a/etc/RT_Config.pm
+++ /dev/null
-@@ -1,2772 +0,0 @@
+@@ -1,3024 +0,0 @@
-#
-# RT was configured with:
-#
@@ -4428,17 +4456,35 @@ index 59eca8d..0000000
-
-=item C<@Plugins>
-
--Set C<@Plugins> to a list of external RT plugins that should be
--enabled (those plugins have to be previously downloaded and
--installed).
+-Once a plugin has been downloaded and installed, use C<Plugin()> to add
+-to the enabled C<@Plugins> list:
+-
+- Plugin( "RT::Extension::SLA" );
+- Plugin( "RT::Authen::ExternalAuth" );
+-
+-=cut
+-
+-Set(@Plugins, ());
+-
+-=item C<@StaticRoots>
+-
+-Set C<@StaticRoots> to serve extra paths with a static handler. The
+-contents of each hashref should be the the same arguments as
+-L<Plack::Middleware::Static> takes. These paths will be checked before
+-any plugin or core static paths.
-
-Example:
-
--C<Set(@Plugins, (qw(RT::Extension::SLA RT::Authen::ExternalAuth)));>
+- Set( @StaticRoots,
+- {
+- path => qr{^/static/},
+- root => '/local/path/to/static/parent',
+- },
+- );
-
-=cut
-
--Set(@Plugins, ());
+-Set( @StaticRoots, () );
-
-=back
-
@@ -4452,7 +4498,7 @@ index 59eca8d..0000000
-=item C<$DatabaseType>
-
-Database driver being used; case matters. Valid types are "mysql",
--"Oracle" and "Pg".
+-"Oracle", and "Pg". "SQLite" is also available for non-production use.
-
-=cut
-
@@ -4516,6 +4562,15 @@ index 59eca8d..0000000
-
-Set($DatabaseRequireSSL, undef);
-
+-=item C<$DatabaseAdmin>
+-
+-The name of the database administrator to connect to the database as
+-during upgrades.
+-
+-=cut
+-
+-Set($DatabaseAdmin, "root");
+-
-=back
-
-
@@ -4534,7 +4589,7 @@ index 59eca8d..0000000
-
-=over 4
-
--=item C<$LogToSyslog>, C<$LogToScreen>
+-=item C<$LogToSyslog>, C<$LogToSTDERR>
-
-The minimum level error that will be logged to the specific device.
-From lowest to highest priority, the levels are:
@@ -4552,7 +4607,7 @@ index 59eca8d..0000000
-=cut
-
-Set($LogToSyslog, "info");
--Set($LogToScreen, "info");
+-Set($LogToSTDERR, "info");
-
-=item C<$LogToFile>, C<$LogDir>, C<$LogToFileNamed>
-
@@ -4587,11 +4642,9 @@ index 59eca8d..0000000
-
-=item C<@LogToSyslogConf>
-
--On Solaris or UnixWare, set to ( socket => 'inet' ). Options here
--override any other options RT passes to L<Log::Dispatch::Syslog>.
--Other interesting flags include facility and logopt. (See the
--L<Log::Dispatch::Syslog> documentation for more information.) (Maybe
--ident too, if you have multiple RT installations.)
+-Additional options to pass to L<Log::Dispatch::Syslog>; the most
+-interesting flags include C<facility>, C<logopt>, and possibly C<ident>.
+-See the L<Log::Dispatch::Syslog> documentation for more information.
-
-=cut
-
@@ -4613,14 +4666,7 @@ index 59eca8d..0000000
-configuration.
-
-Be B<very careful> with it. Note that it overrides C<$rtname> for
--subject token matching and that you should use only "non-capturing"
--parenthesis grouping. For example:
--
--C<Set($EmailSubjectTagRegex, qr/(?:example.com|example.org)/i );>
--
--and NOT
--
--C<Set($EmailSubjectTagRegex, qr/(example.com|example.org)/i );>
+-subject token matching.
-
-The setting below would make RT behave exactly as it does without the
-setting enabled.
@@ -4632,8 +4678,10 @@ index 59eca8d..0000000
-=item C<$OwnerEmail>
-
-C<$OwnerEmail> is the address of a human who manages RT. RT will send
--errors generated by the mail gateway to this address. This address
--should I<not> be an address that's managed by your RT instance.
+-errors generated by the mail gateway to this address; it will also be
+-displayed as the contact person on the RT's login page. Because RT
+-sends errors to this address, it should I<not> be an address that's
+-managed by your RT instance, to avoid mail loops.
-
-=cut
-
@@ -4662,11 +4710,14 @@ index 59eca8d..0000000
-
-C<$MaxAttachmentSize> sets the maximum size (in bytes) of attachments
-stored in the database. This setting is irrelevant unless one of
--$TruncateLongAttachments or $DropLongAttachments (below) are set.
+-$TruncateLongAttachments or $DropLongAttachments (below) are set, B<OR>
+-the database is stored in Oracle. On Oracle, attachments larger than
+-this can be fully stored, but will be truncated to this length when
+-read.
-
-=cut
-
--Set($MaxAttachmentSize, 10_000_000);
+-Set($MaxAttachmentSize, 10_000_000); # 10M
-
-=item C<$TruncateLongAttachments>
-
@@ -4713,13 +4764,13 @@ index 59eca8d..0000000
-=item C<$CanonicalizeEmailAddressMatch>, C<$CanonicalizeEmailAddressReplace>
-
-RT provides functionality which allows the system to rewrite incoming
--email addresses. In its simplest form, you can substitute the value
--in C<CanonicalizeEmailAddressReplace> for the value in
--C<CanonicalizeEmailAddressMatch> (These values are passed to the
--C<CanonicalizeEmailAddress> subroutine in F<RT/User.pm>)
--
--By default, that routine performs a C<s/$Match/$Replace/gi> on any
--address passed to it.
+-email addresses, using L<RT::User/CanonicalizeEmailAddress>. The
+-default implementation replaces all occurrences of the regular
+-expression in C<CanonicalizeEmailAddressMatch> with
+-C<CanonicalizeEmailAddressReplace>, via C<s/$Match/$Replace/gi>. The
+-most common use of this is to replace C<@something.example.com> with
+-C<@example.com>. If more complex noramlization is required,
+-L<RT::User/CanonicalizeEmailAddress> can be overridden to provide it.
-
-=cut
-
@@ -4738,13 +4789,16 @@ index 59eca8d..0000000
-
-=item C<$ValidateUserEmailAddresses>
-
--If C<$ValidateUserEmailAddresses> is 1, RT will refuse to create
+-By default C<$ValidateUserEmailAddresses> is 1, and RT will refuse to create
-users with an invalid email address (as specified in RFC 2822) or with
-an email address made of multiple email addresses.
-
+-Set this to 0 to skip any email address validation. Doing so may open up
+-vulnerabilities.
+-
-=cut
-
--Set($ValidateUserEmailAddresses, undef);
+-Set($ValidateUserEmailAddresses, 1);
-
-=item C<@MailPlugins>
-
@@ -4804,11 +4858,8 @@ index 59eca8d..0000000
-
-C<$MailCommand> defines which method RT will use to try to send mail.
-We know that 'sendmailpipe' works fairly well. If 'sendmailpipe'
--doesn't work well for you, try 'sendmail'. Other options are 'smtp'
--or 'qmail'.
--
--Note that you should remove the '-t' from C<$SendmailArguments> if you
--use 'sendmail' rather than 'sendmailpipe'
+-doesn't work well for you, try 'sendmail'. 'qmail' is also a supported
+-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
@@ -4855,7 +4906,7 @@ index 59eca8d..0000000
-the From_ header away from www-data or other email addresses that show
-up in the "Sent by" line in Outlook.
-
--The option is a hash reference of queue name to email address. If
+-The option is a hash reference of queue id/name to email address. If
-there is no ticket involved, then the value of the C<Default> key will
-be used.
-
@@ -5050,16 +5101,14 @@ index 59eca8d..0000000
-=item C<$SendmailArguments>
-
-C<$SendmailArguments> defines what flags to pass to C<$SendmailPath>
--If you picked 'sendmailpipe', you MUST add a -t flag to
--C<$SendmailArguments> These options are good for most sendmail
--wrappers and work-a-likes.
+-These options are good for most sendmail wrappers and work-a-likes.
-
-These arguments are good for sendmail brand sendmail 8 and newer:
--C<Set($SendmailArguments,"-oi -t -ODeliveryMode=b -OErrorMode=m");>
+-C<Set($SendmailArguments,"-oi -ODeliveryMode=b -OErrorMode=m");>
-
-=cut
-
--Set($SendmailArguments, "-oi -t");
+-Set($SendmailArguments, "-oi");
-
-
-=item C<$SendmailBounceArguments>
@@ -5083,39 +5132,6 @@ index 59eca8d..0000000
-
-=back
-
--=head2 SMTP configuration
--
--These options only take effect if C<$MailCommand> is 'smtp'
--
--=over 4
--
--=item C<$SMTPServer>
--
--C<$SMTPServer> should be set to the hostname of the SMTP server to use
--
--=cut
--
--Set($SMTPServer, undef);
--
--=item C<$SMTPFrom>
--
--C<$SMTPFrom> should be set to the 'From' address to use, if not the
--email's 'From'
--
--=cut
--
--Set($SMTPFrom, undef);
--
--=item C<$SMTPDebug>
--
--C<$SMTPDebug> should be set to 1 to debug SMTP mail sending
--
--=cut
--
--Set($SMTPDebug, 0);
--
--=back
--
-=head2 Other mailers
-
-=over 4
@@ -5123,7 +5139,7 @@ index 59eca8d..0000000
-=item C<@MailParams>
-
-C<@MailParams> defines a list of options passed to $MailCommand if it
--is not 'sendmailpipe', 'sendmail', or 'smtp'
+-is not 'sendmailpipe' or 'sendmail';
-
-=cut
-
@@ -5141,11 +5157,12 @@ index 59eca8d..0000000
-This determines the default stylesheet the RT web interface will use.
-RT ships with several themes by default:
-
-- web2 The default layout for RT 3.8
+- rudder The default theme for RT 4.2
- aileron The default layout for RT 4.0
+- web2 The default layout for RT 3.8
- ballard Theme which doesn't rely on JavaScript for menuing
-
--This value actually specifies a directory in F<share/html/NoAuth/css/>
+-This value actually specifies a directory in F<share/static/css/>
-from which RT will try to load the file main.css (which should @import
-any other files the stylesheet needs). This allows you to easily and
-cleanly create your own stylesheets to apply to RT. This option can
@@ -5153,7 +5170,7 @@ index 59eca8d..0000000
-
-=cut
-
--Set($WebDefaultStylesheet, "aileron");
+-Set($WebDefaultStylesheet, "rudder");
-
-=item C<$DefaultQueue>
-
@@ -5192,6 +5209,48 @@ index 59eca8d..0000000
-
-Set(@CustomFieldValuesSources, ());
-
+-=item C<%CustomFieldGroupings>
+-
+-This option affects the display of ticket and user custom fields in the
+-web interface. It does not address the sorting of custom fields within
+-the groupings; which is controlled by the Ticket Custom Fields tab in
+-Queue Configuration in the Admin UI.
+-
+-A nested datastructure defines how to group together custom fields
+-under a mix of built-in and arbitrary headings ("groupings").
+-
+-Set C<%CustomFieldGroupings> to a nested structure similar to the following:
+-
+- Set(%CustomFieldGroupings,
+- 'RT::Ticket' => [
+- 'Grouping Name' => ['CF Name', 'Another CF'],
+- 'Another Grouping' => ['Some CF'],
+- 'Dates' => ['Shipped date'],
+- ],
+- 'RT::User' => [
+- 'Phones' => ['Fax number'],
+- ],
+- );
+-
+-The first level keys are record types for which CFs may be used, and the
+-values are either hashrefs or arrayrefs -- if arrayrefs, then the
+-ordering is preserved during display, otherwise groupings are displayed
+-alphabetically. The second level keys are the grouping names and the
+-values are array refs containing a list of CF names.
+-
+-There are several special built-in groupings which RT displays in
+-specific places (usually the collapsible box of the same title). The
+-ordering of these standard groupings cannot be modified. You may also
+-only append Custom Fields to the list in these boxes, not reorder or
+-remove core fields.
+-
+-For C<RT::Ticket>, these groupings are: C<Basics>, C<Dates>, C<Links>, C<People>
+-
+-For C<RT::User>: C<Identity>, C<Access control>, C<Location>, C<Phones>
+-
+-Extensions may also add their own built-in groupings, refer to the individual
+-extension documentation for those.
+-
-=item C<$CanonicalizeRedirectURLs>
-
-Set C<$CanonicalizeRedirectURLs> to 1 to use C<$WebURL> when
@@ -5208,32 +5267,25 @@ index 59eca8d..0000000
-
-Set($CanonicalizeRedirectURLs, 0);
-
--=item C<@JSFiles>
+-=item C<$CanonicalizeURLsInFeeds>
+-
+-Set C<$CanonicalizeURLsInFeeds> to 1 to use C<$WebURL> in feeds
+-rather than the one we get from request.
+-
+-If you use RT behind a reverse proxy, you almost certainly want to
+-enable this option.
+-
+-=cut
+-
+-Set($CanonicalizeURLsInFeeds, 0);
-
--A list of JavaScript files to be included in head. Removing any of
--the default entries is not suggested.
+-=item C<@JSFiles>
-
--If you're a plugin author, refer to RT->AddJavaScript.
+-A list of additional JavaScript files to be included in head.
-
-=cut
-
--Set(@JSFiles, qw/
-- jquery-1.4.2.min.js
-- jquery_noconflict.js
-- jquery-ui-1.8.4.custom.min.js
-- jquery-ui-timepicker-addon.js
-- jquery-ui-patch-datepicker.js
-- jquery.cookie.js
-- titlebox-state.js
-- util.js
-- userautocomplete.js
-- jquery.event.hover-1.0.js
-- superfish.js
-- supersubs.js
-- jquery.supposition.js
-- history-folding.js
-- late.js
--/);
+-Set(@JSFiles, qw//);
-
-=item C<$JSMinPath>
-
@@ -5260,14 +5312,75 @@ index 59eca8d..0000000
-
-=item C<$UsernameFormat>
-
--This determines how user info is displayed. 'concise' will show one of
--either NickName, RealName, Name or EmailAddress, depending on what
--exists and whether the user is privileged or not. 'verbose' will show
--RealName and EmailAddress.
+-This determines how user info is displayed. 'concise' will show the
+-first of RealName, Name or EmailAddress that has a value. 'verbose' will
+-show EmailAddress, and the first of RealName or Name which is defined.
+-The default, 'role', uses 'verbose' for unprivileged users, and the Name
+-followed by the RealName for privileged users.
+-
+-=cut
+-
+-Set($UsernameFormat, "role");
+-
+-=item C<$UserSearchResultFormat>
+-
+-This controls the display of lists of users returned from the User
+-Summary Search. The display of users in the Admin interface is
+-controlled by C<%AdminSearchResultFormat>.
+-
+-=cut
+-
+-Set($UserSearchResultFormat,
+- q{ '<a href="__WebPath__/User/Summary.html?id=__id__">__id__</a>/TITLE:#'}
+- .q{,'<a href="__WebPath__/User/Summary.html?id=__id__">__Name__</a>/TITLE:Name'}
+- .q{,__RealName__, __EmailAddress__}
+-);
+-
+-=item C<@UserSummaryPortlets>
+-
+-A list of portlets to be displayed on the User Summary page.
+-By default, we show all of the available portlets.
+-Extensions may provide their own portlets for this page.
+-
+-=cut
+-
+-Set(@UserSummaryPortlets, (qw/ExtraInfo CreateTicket ActiveTickets InactiveTickets/));
+-
+-=item C<$UserSummaryExtraInfo>
+-
+-This controls what information is displayed on the User Summary
+-portal. By default the user's Real Name, Email Address and Username
+-are displayed. You can remove these or add more as needed. This
+-expects a Format string of user attributes. Please note that not all
+-the attributes are supported in this display because we're not
+-building a table.
+-
+-=cut
+-
+-Set($UserSummaryExtraInfo, "RealName, EmailAddress, Name");
+-
+-=item C<$UserSummaryTicketListFormat>
+-
+-Control the appearance of the Active and Inactive ticket lists in the
+-User Summary.
-
-=cut
-
--Set($UsernameFormat, "concise");
+-Set($UserSummaryTicketListFormat, q{
+- '<B><A HREF="__WebPath__/Ticket/Display.html?id=__id__">__id__</a></B>/TITLE:#',
+- '<B><A HREF="__WebPath__/Ticket/Display.html?id=__id__">__Subject__</a></B>/TITLE:Subject',
+- Status,
+- QueueName,
+- Owner,
+- Priority,
+- '__NEWLINE__',
+- '',
+- '<small>__Requestors__</small>',
+- '<small>__CreatedRelative__</small>',
+- '<small>__ToldRelative__</small>',
+- '<small>__LastUpdatedRelative__</small>',
+- '<small>__TimeLeft__</small>'
+-});
-
-=item C<$WebBaseURL>, C<$WebURL>
-
@@ -5301,7 +5414,7 @@ index 59eca8d..0000000
-
-=cut
-
--Set($WebImagesURL, RT->Config->Get('WebPath') . "/NoAuth/images/");
+-Set($WebImagesURL, RT->Config->Get('WebPath') . "/static/images/");
-
-=item C<$LogoURL>
-
@@ -5329,24 +5442,6 @@ index 59eca8d..0000000
-
-Set($LogoAltText, "Best Practical Solutions, LLC corporate logo");
-
--=item C<$LogoImageHeight>
--
--C<$LogoImageHeight> is the value of the C<height> attribute of the logo
--C<img> tag.
--
--=cut
--
--Set($LogoImageHeight, 38);
--
--=item C<$LogoImageWidth>
--
--C<$LogoImageWidth> is the value of the C<width> attribute of the logo
--C<img> tag.
--
--=cut
--
--Set($LogoImageWidth, 181);
--
-=item C<$WebNoAuthRegex>
-
-What portion of RT's URL space should not require authentication. The
@@ -5415,6 +5510,19 @@ index 59eca8d..0000000
-
-Set($ChartsTimezonesInDB, 0);
-
+-=item C<@ChartColors>
+-
+-An array of 6-digit hexadecimal RGB color values used for chart series. By
+-default there are 12 distinct colors.
+-
+-=cut
+-
+-Set(@ChartColors, qw(
+- 66cc66 ff6666 ffcc66 663399
+- 3333cc 339933 993333 996633
+- 33cc33 cc3333 cc9933 6633cc
+-));
+-
-=back
-
-
@@ -5451,7 +5559,7 @@ index 59eca8d..0000000
-Set(
- $HomepageComponents,
- [
-- qw(QuickCreate Quicksearch MyAdminQueues MySupportQueues MyReminders RefreshHomepage Dashboards SavedSearches) # loc_qw
+- qw(QuickCreate Quicksearch MyAdminQueues MySupportQueues MyReminders RefreshHomepage Dashboards SavedSearches FindUser) # loc_qw
- ]
-);
-
@@ -5467,16 +5575,13 @@ index 59eca8d..0000000
-=item C<$UseSQLForACLChecks>
-
-Historically, ACLs were checked on display, which could lead to empty
--search pages and wrong ticket counts. Set C<$UseSQLForACLChecks> to 1
--to limit search results in SQL instead, which eliminates these
--problems.
--
--This option is still relatively new; it may result in performance
--problems in some cases, or significant speedups in others.
+-search pages and wrong ticket counts. Set C<$UseSQLForACLChecks> to 0
+-to go back to this method; this will reduce the complexity of the
+-generated SQL statements, at the cost of the aforementioned bugs.
-
-=cut
-
--Set($UseSQLForACLChecks, undef);
+-Set($UseSQLForACLChecks, 1);
-
-=item C<$TicketsItemMapSize>
-
@@ -5516,7 +5621,7 @@ index 59eca8d..0000000
- '<B><A HREF="__WebPath__/Ticket/Display.html?id=__id__">__Subject__</a></B>/TITLE:Subject',
- Status,
- QueueName,
-- OwnerName,
+- Owner,
- Priority,
- '__NEWLINE__',
- '__NBSP__',
@@ -5526,6 +5631,23 @@ index 59eca8d..0000000
- '<small>__LastUpdatedRelative__</small>',
- '<small>__TimeLeft__</small>'});
-
+-=item C<$DefaultSearchResultOrderBy>
+-
+-What Tickets column should we order by for RT Ticket search results.
+-
+-=cut
+-
+-Set($DefaultSearchResultOrderBy, 'id');
+-
+-=item C<$DefaultSearchResultOrder>
+-
+-When ordering RT Ticket search results by C<$DefaultSearchResultOrderBy>,
+-should the sort be ascending (ASC) or descending (DESC).
+-
+-=cut
+-
+-Set($DefaultSearchResultOrder, 'ASC');
+-
-=item C<$DefaultSelfServiceSearchResultFormat>
-
-C<$DefaultSelfServiceSearchResultFormat> is the default format of
@@ -5538,7 +5660,7 @@ index 59eca8d..0000000
- '<B><A HREF="__WebPath__/SelfService/Display.html?id=__id__">__Subject__</a></B>/TITLE:Subject',
- Status,
- Requestors,
-- OwnerName});
+- Owner});
-
-=item C<%FullTextSearch>
-
@@ -5618,6 +5740,20 @@ index 59eca8d..0000000
-
-Set($MoreAboutRequestorTicketList, "Active");
-
+-=item C<$MoreAboutRequestorTicketListFormat>
+-
+-Control the appearance of the ticket lists in the 'More About Requestors' box.
+-
+-=cut
+-
+-Set($MoreAboutRequestorTicketListFormat, q{
+- '<a href="__WebPath__/Ticket/Display.html?id=__id__">__id__</a>',
+- '__Owner__',
+- '<a href="__WebPath__/Ticket/Display.html?id=__id__">__Subject__</a>',
+- '__Status__',
+-});
+-
+-
-=item C<$MoreAboutRequestorExtraInfo>
-
-By default, the 'More about requestor' box on Ticket/Display.html
@@ -5679,6 +5815,12 @@ index 59eca8d..0000000
-alleviate the sometimes huge owner list for installations where many
-users have the OwnTicket right.
-
+-Autocompleter is automatically turned on if list contains more than
+-50 users, but penalty of executing potentially slow query is still paid.
+-
+-Drop down doesn't show unprivileged users. If your setup allows unprivileged
+-to own ticket then you have to enable autocompleting.
+-
-=cut
-
-Set($AutocompleteOwners, 0);
@@ -5693,15 +5835,19 @@ index 59eca8d..0000000
-
-Set($AutocompleteOwnersForSearch, 0);
-
--=item C<$UserAutocompleteFields>
+-=item C<$UserSearchFields>
+-
+-Used by the User Autocompleter as well as the User Search.
-
--Specifies which fields of L<RT::User> to match against and how to
--match each field when autocompleting users. Valid match methods are
--LIKE, STARTSWITH, ENDSWITH, =, and !=.
+-Specifies which fields of L<RT::User> to match against and how to match
+-each field when autocompleting users. Valid match methods are LIKE,
+-STARTSWITH, ENDSWITH, =, and !=. Valid search fields are the core User
+-fields, as well as custom fields, which are specified as "CF.1234" or
+-"CF.Name"
-
-=cut
-
--Set($UserAutocompleteFields, {
+-Set($UserSearchFields, {
- EmailAddress => 'STARTSWITH',
- Name => 'STARTSWITH',
- RealName => 'LIKE',
@@ -5709,14 +5855,31 @@ index 59eca8d..0000000
-
-=item C<$AllowUserAutocompleteForUnprivileged>
-
--Should unprivileged users be allowed to autocomplete users. Setting
--this option to 1 means unprivileged users will be able to search all
--your users.
+-Should unprivileged users (users of SelfService) be allowed to
+-autocomplete users. Setting this option to 1 means unprivileged users
+-will be able to search all your users.
-
-=cut
-
-Set($AllowUserAutocompleteForUnprivileged, 0);
-
+-=item C<$TicketAutocompleteFields>
+-
+-Specifies which fields of L<RT::Ticket> to match against and how to match each
+-field when autocompleting users. Valid match methods are LIKE, STARTSWITH,
+-ENDSWITH, C<=>, and C<!=>.
+-
+-Not all Ticket fields are publically accessible and hence won't work for
+-autocomplete unless you override their accessibility using a local overlay or a
+-plugin. Out of the box the following fields are public: id, Subject.
+-
+-=cut
+-
+-Set( $TicketAutocompleteFields, {
+- id => 'STARTSWITH',
+- Subject => 'LIKE',
+-});
+-
-=item C<$DisplayTicketAfterQuickCreate>
-
-Enable this to redirect to the created ticket display page
@@ -5823,15 +5986,6 @@ index 59eca8d..0000000
-Set($MessageBoxWidth, undef);
-Set($MessageBoxHeight, 15);
-
--=item C<$MessageBoxWrap>
--
--Wrapping is disabled when using MessageBoxRichText because of a bad
--interaction between IE and wrapping with the Rich Text Editor.
--
--=cut
--
--Set($MessageBoxWrap, "SOFT");
--
-=item C<$MessageBoxRichText>
-
-Should "rich text" editing be enabled? This option lets your users
@@ -5861,7 +6015,7 @@ index 59eca8d..0000000
-=item C<$MessageBoxIncludeSignatureOnComment>
-
-Should your users' signatures (from their Preferences page) be
--included in Comments. Setting this to false overrides
+-included in Comments. Setting this to 0 overrides
-C<$MessageBoxIncludeSignature>.
-
-=cut
@@ -5885,15 +6039,39 @@ index 59eca8d..0000000
-
-Set($OldestTransactionsFirst, 1);
-
--=item C<$DeferTransactionLoading>
+-=item C<$ShowHistory>
+-
+-This option controls how history is shown on the ticket display page. It
+-accepts one of three possible modes and is overrideable on a per-user
+-preference level. If you regularly deal with long tickets and don't care much
+-about the history, you may wish to change this option to C<click>.
+-
+-=over
+-
+-=item C<delay> (the default)
+-
+-When set to C<delay>, history is loaded via javascript after the rest of the
+-page has been loaded. This speeds up apparent page load times and generally
+-provides a smoother experience. You may notice slight delays before the ticket
+-history appears on very long tickets.
+-
+-=item C<click>
-
--When set, defers loading ticket history until the user clicks a link.
--This should end up serving pages to users quicker, since generating
--all the HTML for transaction history can be slow for long tickets.
+-When set to C<click>, history is loaded on demand when a placeholder link is
+-clicked. This speeds up ticket display page loads and history is never loaded
+-if not requested.
+-
+-=item C<always>
+-
+-When set to C<always>, history is loaded before showing the page. This ensures
+-history is always available immediately, but at the expense of longer page load
+-times. This behaviour was the default in RT 4.0.
+-
+-=back
-
-=cut
-
--# Set($DeferTransactionLoading, 1);
+-Set($ShowHistory, 'delay');
-
-=item C<$ShowBccHeader>
-
@@ -5923,28 +6101,24 @@ index 59eca8d..0000000
-
-Set($AlwaysDownloadAttachments, undef);
-
--=item C<$AttachmentUnits>
--
--Controls the units (kilobytes or bytes) that attachment sizes use for
--display. The default is to display kilobytes if the attachment is
--larger than 1024 bytes, bytes otherwise. If you set
--C<$AttachmentUnits> to C<'k'> then attachment sizes will always be
--displayed in kilobytes. If set to C<'b'>, then sizes will be bytes.
--
--=cut
+-=item C<$PreferRichText>
-
--Set($AttachmentUnits, undef);
+-By default, RT shows rich text (HTML) messages if possible. If
+-C<$PreferRichText> is set to 0, RT will show plain text messages in
+-preference to any rich text alternatives.
-
--=item C<$PreferRichText>
+-As a security precaution, RT limits the HTML that is displayed to a
+-known-good subset -- as allowing arbitrary HTML to be displayed exposes
+-multiple vectors for XSS and phishing attacks. If
+-L</$TrustHTMLAttachments> is enabled, the original HTML is available for
+-viewing via the "Download" link.
-
--If C<$PreferRichText> is set to 1, RT will show HTML/Rich text messages
--in preference to their plain-text alternatives. RT "scrubs" the HTML to
--show only a minimal subset of HTML to avoid possible contamination by
--cross-site-scripting attacks.
+-If the optional L<HTML::Gumbo> dependency is installed, RT will leverage
+-this to allow a broader set of HTML through, including tables.
-
-=cut
-
--Set($PreferRichText, undef);
+-Set($PreferRichText, 1);
-
-=item C<$MaxInlineBody>
-
@@ -5967,23 +6141,25 @@ index 59eca8d..0000000
-
-Set($ShowTransactionImages, 1);
-
--=item C<$PlainTextPre>
+-=item C<$ShowRemoteImages>
-
--Normally plaintext attachments are displayed as HTML with line breaks
--preserved. This causes space- and tab-based formatting not to be
--displayed correctly. By setting $PlainTextPre messages will be
--displayed using <pre>.
+-By default, RT doesn't show remote images attached to incoming (and outgoing)
+-ticket updates inline. Set this variable to 1 if you'd like to enable remote
+-image display. Showing remote images may allow spammers and other senders to
+-track when messages are viewed and see referer information.
-
--=cut
+-Note that this setting is independent of L</$ShowTransactionImages> above.
-
--Set($PlainTextPre, 0);
+-=cut
-
+-Set($ShowRemoteImages, 0);
-
-=item C<$PlainTextMono>
-
--Set C<$PlainTextMono> to 1 to use monospaced font and preserve
--formatting; unlike C<$PlainTextPre>, the text will wrap to fit width
--of the browser window; this option overrides C<$PlainTextPre>.
+-Normally plaintext attachments are displayed as HTML with line breaks
+-preserved. This causes space- and tab-based formatting not to be
+-displayed correctly. Set C<$PlainTextMono> to 1 to use a monospaced
+-font and preserve formatting.
-
-=cut
-
@@ -6010,17 +6186,35 @@ index 59eca8d..0000000
- link after the URL.
-
-* 'httpurl_overwrite': also detects URLs as 'httpurl' format, but
-- replaces the URL with a link.
+- replaces the URL with a link. Enabled by default.
-
-See F<share/html/Elements/MakeClicky> for documentation on how to add
-your own styles of link detection.
-
-=cut
-
--Set(@Active_MakeClicky, qw());
+-Set(@Active_MakeClicky, qw(httpurl_overwrite));
-
--=back
+-=item C<$QuoteFolding>
-
+-Quote folding is the hiding of old replies in transaction history.
+-It defaults to on. Set this to 0 to disable it.
+-
+-=cut
+-
+-Set($QuoteFolding, 1);
+-
+-=item C<$AllowLoginPasswordAutoComplete>
+-
+-Allow browsers to remember the user's password on login (in case the
+-browser can do so, and has the appropriate setting enabled). Default
+-is 0.
+-
+-=cut
+-
+-Set($AllowLoginPasswordAutoComplete, 0);
+-
+-=back
-
-
-=head1 Application logic
@@ -6086,8 +6280,9 @@ index 59eca8d..0000000
-=item C<$ForceApprovalsView>
-
-Should approval tickets only be viewed and modified through the standard
--approval interface? Changing this setting to 1 will redirect any attempt to
--use the normal ticket display and modify page for approval tickets.
+-approval interface? With this setting enabled (by default), any attempt to use
+-the normal ticket display and modify page for approval tickets will be
+-redirected.
-
-For example, with this option set to 1 and an approval ticket #123:
-
@@ -6097,11 +6292,13 @@ index 59eca8d..0000000
-
- /Approval/Display.html?id=123
-
+-With this option set to 0, the redirect won't happen.
+-
-=back
-
-=cut
-
--Set($ForceApprovalsView, 0);
+-Set($ForceApprovalsView, 1);
-
-=head1 Extra security
-
@@ -6113,7 +6310,7 @@ index 59eca8d..0000000
-
-=item C<$DisallowExecuteCode>
-
--If set to a true value, the C<ExecuteCode> right will be removed from
+-If set to 1, the C<ExecuteCode> right will be removed from
-all users, B<including> the superuser. This is intended for when RT is
-installed into a shared environment where even the superuser should not
-be allowed to run arbitrary Perl code on the server via scrips.
@@ -6124,7 +6321,7 @@ index 59eca8d..0000000
-
-=item C<$Framebusting>
-
--If set to a false value, framekiller javascript will be disabled and the
+-If set to 0, framekiller javascript will be disabled and the
-X-Frame-Options: DENY header will be suppressed from all responses.
-This disables RT's clickjacking protection.
-
@@ -6134,7 +6331,7 @@ index 59eca8d..0000000
-
-=item C<$RestrictReferrer>
-
--If set to a false value, the HTTP C<Referer> (sic) header will not be
+-If set to 0, the HTTP C<Referer> (sic) header will not be
-checked to ensure that requests come from RT's own domain. As RT allows
-for GET requests to alter state, disabling this opens RT up to
-cross-site request forgery (CSRF) attacks.
@@ -6145,9 +6342,9 @@ index 59eca8d..0000000
-
-=item C<$RestrictLoginReferrer>
-
--If set to a false value, RT will allow the user to log in from any link
+-If set to 0, RT will allow the user to log in from any link
-or request, merely by passing in C<user> and C<pass> parameters; setting
--it to a true value forces all logins to come from the login box, so the
+-it to 1 forces all logins to come from the login box, so the
-user is aware that they are being logged in. The default is off, for
-backwards compatability.
-
@@ -6182,6 +6379,17 @@ index 59eca8d..0000000
-
-Set(@ReferrerWhitelist, qw());
-
+-
+-=item C<$BcryptCost>
+-
+-This sets the default cost parameter used for the C<bcrypt> key
+-derivation function. Valid values range from 4 to 31, inclusive, with
+-higher numbers denoting greater effort.
+-
+-=cut
+-
+-Set($BcryptCost, 10);
+-
-=back
-
-
@@ -6190,74 +6398,89 @@ index 59eca8d..0000000
-
-=over 4
-
--=item C<$WebExternalAuth>
+-=item C<$WebRemoteUserAuth>
-
--If C<$WebExternalAuth> is defined, RT will defer to the environment's
--REMOTE_USER variable.
+-If C<$WebRemoteUserAuth> is defined, RT will defer to the environment's
+-REMOTE_USER variable, which should be set by the webserver's
+-authentication layer.
-
-=cut
-
--Set($WebExternalAuth, undef);
+-Set($WebRemoteUserAuth, undef);
-
--=item C<$WebExternalAuthContinuous>
+-=item C<$WebRemoteUserContinuous>
-
--If C<$WebExternalAuthContinuous> is defined, RT will check for the
+-If C<$WebRemoteUserContinuous> is defined, RT will check for the
-REMOTE_USER on each access. If you would prefer this to only happen
--once (at initial login) set this to a false value. The default
--setting will help ensure that if your external authentication system
+-once (at initial login) set this to 0. The default
+-setting will help ensure that if your webserver's authentication layer
-deauthenticates a user, RT notices as soon as possible.
-
-=cut
-
--Set($WebExternalAuthContinuous, 1);
+-Set($WebRemoteUserContinuous, 1);
-
--=item C<$WebFallbackToInternalAuth>
+-=item C<$WebFallbackToRTLogin>
-
--If C<$WebFallbackToInternalAuth> is defined, the user is allowed a
+-If C<$WebFallbackToRTLogin> is defined, the user is allowed a
-chance of fallback to the login screen, even if REMOTE_USER failed.
-
-=cut
-
--Set($WebFallbackToInternalAuth, undef);
+-Set($WebFallbackToRTLogin, undef);
-
--=item C<$WebExternalGecos>
+-=item C<$WebRemoteUserGecos>
-
--C<$WebExternalGecos> means to match 'gecos' field as the user
--identity); useful with mod_auth_pwcheck and IIS Integrated Windows
--logon.
+-C<$WebRemoteUserGecos> means to match 'gecos' field as the user
+-identity; useful with C<mod_auth_external>.
-
-=cut
-
--Set($WebExternalGecos, undef);
+-Set($WebRemoteUserGecos, undef);
-
--=item C<$WebExternalAuto>
+-=item C<$WebRemoteUserAutocreate>
-
--C<$WebExternalAuto> will create users under the same name as
--REMOTE_USER upon login, if it's missing in the Users table.
+-C<$WebRemoteUserAutocreate> will create users under the same name as
+-REMOTE_USER upon login, if they are missing from the Users table.
-
-=cut
-
--Set($WebExternalAuto, undef);
+-Set($WebRemoteUserAutocreate, undef);
-
--=item C<$AutoCreate>
+-=item C<$UserAutocreateDefaultsOnLogin>
-
--If C<$WebExternalAuto> is set to 1, C<$AutoCreate> will be passed to
--User's Create method. Use it to set defaults, such as creating
--Unprivileged users with C<{ Privileged => 0 }> This must be a hashref.
+-If C<$WebRemoteUserAutocreate> is set to 1, C<$UserAutocreateDefaultsOnLogin>
+-will be passed to L<RT::User/Create>. Use it to set defaults, such as
+-creating unprivileged users with C<<{ Privileged => 0 }>>. This must be
+-a hashref.
-
-=cut
-
--Set($AutoCreate, undef);
+-Set($UserAutocreateDefaultsOnLogin, undef);
-
-=item C<$WebSessionClass>
-
--C<$WebSessionClass> is the class you wish to use for managing sessions.
--It defaults to use your SQL database, except on Oracle, where it
--defaults to files on disk.
+-C<$WebSessionClass> is the class you wish to use for storing sessions. On
+-MySQL, Pg, and Oracle it defaults to using your database, in other cases
+-sessions are stored in files using L<Apache::Session::File>. Other installed
+-Apache::Session::* modules can be used to store sessions.
+-
+- Set($WebSessionClass, "Apache::Session::File");
+-
+-=cut
+-
+-Set($WebSessionClass, undef);
+-
+-=item C<%WebSessionProperties>
+-
+-C<%WebSessionProperties> is the hash to configure class L</$WebSessionClass>
+-in case custom class is used. By default it's empty and values are picked
+-depending on the class. Make sure that it's empty if you're using DB as session
+-backend.
-
-=cut
-
--# Set($WebSessionClass, "Apache::Session::File");
+-Set( %WebSessionProperties );
-
-=item C<$AutoLogoff>
-
@@ -6420,42 +6643,167 @@ index 59eca8d..0000000
-
-Set($DefaultTimeUnitsToHours, 0);
-
--=back
+-=item C<$TimeInICal>
-
+-By default, events in the iCal feed on the ticket search page
+-contain only dates, making them all day calendar events. Set
+-C<$TimeInICal> if you have start or due dates on tickets that
+-have significant time values and you want those times to be
+-included in the events in the iCal feed.
-
+-This option can also be set as an individual user preference.
-
+-=cut
-
--=head1 GnuPG integration
+-Set($TimeInICal, 0);
-
--A full description of the (somewhat extensive) GnuPG integration can
--be found by running the command `perldoc L<RT::Crypt::GnuPG>` (or
--`perldoc lib/RT/Crypt/GnuPG.pm` from your RT install directory).
+-=back
-
--=over 4
-
--=item C<%GnuPG>
-
--Set C<OutgoingMessagesFormat> to 'inline' to use inline encryption and
--signatures instead of 'RFC' (GPG/MIME: RFC3156 and RFC1847) format.
+-=head1 Cryptography
+-
+-A complete description of RT's cryptography capabilities can be found in
+-L<RT::Crypt>. At this moment, GnuPG (PGP) and SMIME security protocols are
+-supported.
+-
+-=over 4
+-
+-=item C<%Crypt>
+-
+-The following options apply to all cryptography protocols.
+-
+-By default, all enabled security protocols will analyze each incoming
+-email. You may set C<Incoming> to a subset of this list, if some enabled
+-protocols do not apply to incoming mail; however, this is usually
+-unnecessary. Note that for any verification or decryption to occur for
+-incoming mail, the C<Auth::Crypt> mail plugin must be added to
+-L</@MailPlugins> as specified in L<RT::Crypt/Handling incoming messages>.
+-
+-For outgoing emails, the first security protocol from the above list is
+-used. Use the C<Outgoing> option to set a security protocol that should
+-be used in outgoing emails. At this moment, only one protocol can be
+-used to protect outgoing emails.
+-
+-Set C<RejectOnUnencrypted> to 1 if all incoming email must be
+-properly encrypted. All unencrypted emails will be rejected by RT.
+-
+-Set C<RejectOnMissingPrivateKey> to 0 if you don't want to reject
+-emails encrypted for key RT doesn't have and can not decrypt.
+-
+-Set C<RejectOnBadData> to 0 if you don't want to reject letters
+-with incorrect data.
-
-If you want to allow people to encrypt attachments inside the DB then
-set C<AllowEncryptDataInDB> to 1.
-
--Set C<RejectOnMissingPrivateKey> to false if you don't want to reject
--emails encrypted for key RT doesn't have and can not decrypt.
+-Set C<Dashboards> to a hash with Encrypt and Sign keys to control
+-whether dashboards should be encrypted and/or signed correspondingly.
+-By default they are not encrypted or signed.
-
--Set C<RejectOnBadData> to false if you don't want to reject letters
--with incorrect GnuPG data.
+-=back
-
-=cut
-
--Set(%GnuPG,
-- Enable => 1,
-- OutgoingMessagesFormat => "RFC", # Inline
-- AllowEncryptDataInDB => 0,
+-Set( %Crypt,
+- Incoming => undef, # ['GnuPG', 'SMIME']
+- Outgoing => undef, # 'SMIME'
-
+- RejectOnUnencrypted => 0,
- RejectOnMissingPrivateKey => 1,
- RejectOnBadData => 1,
+-
+- AllowEncryptDataInDB => 0,
+-
+- Dashboards => {
+- Encrypt => 0,
+- Sign => 0,
+- },
+-);
+-
+-=head2 SMIME configuration
+-
+-A full description of the SMIME integration can be found in
+-L<RT::Crypt::SMIME>.
+-
+-=over 4
+-
+-=item C<%SMIME>
+-
+-Set C<Enable> to 0 or 1 to disable or enable SMIME for
+-encrypting and signing messages.
+-
+-Set C<OpenSSL> to path to F<openssl> executable.
+-
+-Set C<Keyring> to directory with key files. Key and certificates should
+-be stored in a PEM file in this directory named named, e.g.,
+-F<email.address at example.com.pem>.
+-
+-Set C<CAPath> to either a PEM-formatted certificate of a single signing
+-certificate authority, or a directory of such (including hash symlinks
+-as created by the openssl tool C<c_rehash>). Only SMIME certificates
+-signed by these certificate authorities will be treated as valid
+-signatures. If left unset (and C<AcceptUntrustedCAs> is unset, as it is
+-by default), no signatures will be marked as valid!
+-
+-Set C<AcceptUntrustedCAs> to allow arbitrary SMIME certificates, no
+-matter their signing entities. Such mails will be marked as untrusted,
+-but signed; C<CAPath> will be used to mark which mails are signed by
+-trusted certificate authorities. This configuration is generally
+-insecure, as it allows the possibility of accepting forged mail signed
+-by an untrusted certificate authority.
+-
+-Setting C<AcceptUntrustedCAs> also allows encryption to users with
+-certificates created by untrusted CAs.
+-
+-Set C<Passphrase> to a scalar (to use for all keys), an anonymous
+-function, or a hash (to look up by address). If the hash is used, the
+-'' key is used as a default.
+-
+-See L<RT::Crypt::SMIME> for details.
+-
+-=back
+-
+-=cut
+-
+-Set( %SMIME,
+- Enable => 0,
+- OpenSSL => 'openssl',
+- Keyring => q{var/data/smime},
+- CAPath => undef,
+- AcceptUntrustedCAs => undef,
+- Passphrase => undef,
+-);
+-
+-=head2 GnuPG configuration
+-
+-A full description of the (somewhat extensive) GnuPG integration can
+-be found by running the command `perldoc L<RT::Crypt::GnuPG>` (or
+-`perldoc lib/RT/Crypt/GnuPG.pm` from your RT install directory).
+-
+-=over 4
+-
+-=item C<%GnuPG>
+-
+-Set C<Enable> to 0 or 1 to disable or enable GnuPG interfaces
+-for encrypting and signing outgoing messages.
+-
+-Set C<GnuPG> to the name or path of the gpg binary to use.
+-
+-Set C<Passphrase> to a scalar (to use for all keys), an anonymous
+-function, or a hash (to look up by address). If the hash is used, the
+-'' key is used as a default.
+-
+-Set C<OutgoingMessagesFormat> to 'inline' to use inline encryption and
+-signatures instead of 'RFC' (GPG/MIME: RFC3156 and RFC1847) format.
+-
+-=cut
+-
+-Set(%GnuPG,
+- Enable => 0,
+- GnuPG => 'gpg',
+- Passphrase => undef,
+- OutgoingMessagesFormat => "RFC", # Inline
-);
-
-=item C<%GnuPGOptions>
@@ -6619,6 +6967,14 @@ index 59eca8d..0000000
- ...
- },
-
+-The order of items in the listing for each transition line affects
+-the order they appear in the drop-down. If you change the config
+-for 'open' state listing to:
+-
+- open => [qw(stalled rejected deleted resolved)],
+-
+-then the 'resolved' status will appear as the last item in the drop-down.
+-
-=head3 Statuses available during ticket creation
-
-By default users can create tickets with a status of new,
@@ -6721,8 +7077,8 @@ index 59eca8d..0000000
-
-Unless there is an explicit mapping between statuses in two different
-lifecycles, you can not move tickets between queues with these
--lifecycles. This is true even if the different lifecycles use the exact
--same set of statuses. Such a mapping is defined as follows:
+-lifecycles -- even if both use the exact same set of statuses.
+-Such a mapping is defined as follows:
-
- __maps__ => {
- 'from lifecycle -> to lifecycle' => {
@@ -6750,64 +7106,32 @@ index 59eca8d..0000000
- },
-
- transitions => {
-- '' => [qw(new open resolved)],
+- "" => [qw(new open resolved)],
-
- # from => [ to list ],
-- new => [qw(open stalled resolved rejected deleted)],
-- open => [qw(new stalled resolved rejected deleted)],
-- stalled => [qw(new open rejected resolved deleted)],
-- resolved => [qw(new open stalled rejected deleted)],
-- rejected => [qw(new open stalled resolved deleted)],
-- deleted => [qw(new open stalled rejected resolved)],
+- new => [qw( open stalled resolved rejected deleted)],
+- open => [qw(new stalled resolved rejected deleted)],
+- stalled => [qw(new open rejected resolved deleted)],
+- resolved => [qw(new open stalled rejected deleted)],
+- rejected => [qw(new open stalled resolved deleted)],
+- deleted => [qw(new open stalled rejected resolved )],
- },
- rights => {
- '* -> deleted' => 'DeleteTicket',
- '* -> *' => 'ModifyTicket',
- },
- actions => [
-- 'new -> open' => {
-- label => 'Open It', # loc
-- update => 'Respond',
-- },
-- 'new -> resolved' => {
-- label => 'Resolve', # loc
-- update => 'Comment',
-- },
-- 'new -> rejected' => {
-- label => 'Reject', # loc
-- update => 'Respond',
-- },
-- 'new -> deleted' => {
-- label => 'Delete', # loc
-- },
--
-- 'open -> stalled' => {
-- label => 'Stall', # loc
-- update => 'Comment',
-- },
-- 'open -> resolved' => {
-- label => 'Resolve', # loc
-- update => 'Comment',
-- },
-- 'open -> rejected' => {
-- label => 'Reject', # loc
-- update => 'Respond',
-- },
--
-- 'stalled -> open' => {
-- label => 'Open It', # loc
-- },
-- 'resolved -> open' => {
-- label => 'Re-open', # loc
-- update => 'Comment',
-- },
-- 'rejected -> open' => {
-- label => 'Re-open', # loc
-- update => 'Comment',
-- },
-- 'deleted -> open' => {
-- label => 'Undelete', # loc
-- },
+- 'new -> open' => { label => 'Open It', update => 'Respond' }, # loc{label}
+- 'new -> resolved' => { label => 'Resolve', update => 'Comment' }, # loc{label}
+- 'new -> rejected' => { label => 'Reject', update => 'Respond' }, # loc{label}
+- 'new -> deleted' => { label => 'Delete', }, # loc{label}
+- 'open -> stalled' => { label => 'Stall', update => 'Comment' }, # loc{label}
+- 'open -> resolved' => { label => 'Resolve', update => 'Comment' }, # loc{label}
+- 'open -> rejected' => { label => 'Reject', update => 'Respond' }, # loc{label}
+- 'stalled -> open' => { label => 'Open It', }, # loc{label}
+- 'resolved -> open' => { label => 'Re-open', update => 'Comment' }, # loc{label}
+- 'rejected -> open' => { label => 'Re-open', update => 'Comment' }, # loc{label}
+- 'deleted -> open' => { label => 'Undelete', }, # loc{label}
- ],
- },
-# don't change lifecyle of the approvals, they are not capable to deal with
@@ -6841,49 +7165,17 @@ index 59eca8d..0000000
- '* -> *' => 'ModifyTicket',
- },
- actions => [
-- 'new -> open' => {
-- label => 'Open It', # loc
-- update => 'Respond',
-- },
-- 'new -> resolved' => {
-- label => 'Resolve', # loc
-- update => 'Comment',
-- },
-- 'new -> rejected' => {
-- label => 'Reject', # loc
-- update => 'Respond',
-- },
-- 'new -> deleted' => {
-- label => 'Delete', # loc
-- },
--
-- 'open -> stalled' => {
-- label => 'Stall', # loc
-- update => 'Comment',
-- },
-- 'open -> resolved' => {
-- label => 'Resolve', # loc
-- update => 'Comment',
-- },
-- 'open -> rejected' => {
-- label => 'Reject', # loc
-- update => 'Respond',
-- },
--
-- 'stalled -> open' => {
-- label => 'Open It', # loc
-- },
-- 'resolved -> open' => {
-- label => 'Re-open', # loc
-- update => 'Comment',
-- },
-- 'rejected -> open' => {
-- label => 'Re-open', # loc
-- update => 'Comment',
-- },
-- 'deleted -> open' => {
-- label => 'Undelete', # loc
-- },
+- 'new -> open' => { label => 'Open It', update => 'Respond' }, # loc{label}
+- 'new -> resolved' => { label => 'Resolve', update => 'Comment' }, # loc{label}
+- 'new -> rejected' => { label => 'Reject', update => 'Respond' }, # loc{label}
+- 'new -> deleted' => { label => 'Delete', }, # loc{label}
+- 'open -> stalled' => { label => 'Stall', update => 'Comment' }, # loc{label}
+- 'open -> resolved' => { label => 'Resolve', update => 'Comment' }, # loc{label}
+- 'open -> rejected' => { label => 'Reject', update => 'Respond' }, # loc{label}
+- 'stalled -> open' => { label => 'Open It', }, # loc{label}
+- 'resolved -> open' => { label => 'Re-open', update => 'Comment' }, # loc{label}
+- 'rejected -> open' => { label => 'Re-open', update => 'Comment' }, # loc{label}
+- 'deleted -> open' => { label => 'Undelete', }, # loc{label}
- ],
- },
-);
@@ -6900,7 +7192,7 @@ index 59eca8d..0000000
-
-RT can show administrators a feed of recent RT releases and other
-related announcements and information from Best Practical on the top
--level Configuration page. This feature helps you stay up to date on
+-level Admin page. This feature helps you stay up to date on
-RT security announcements and version updates.
-
-RT provides this feature using an "iframe" on C</Admin/index.html>
@@ -6908,7 +7200,7 @@ index 59eca8d..0000000
-Best Practical's website.
-
-If you'd rather not make this feature available to your
--administrators, set C<$ShowRTPortal> to a false value.
+-administrators, set C<$ShowRTPortal> to 0.
-
-=cut
-
@@ -6926,41 +7218,53 @@ index 59eca8d..0000000
- Queues =>
- q{'<a href="__WebPath__/Admin/Queues/Modify.html?id=__id__">__id__</a>/TITLE:#'}
- .q{,'<a href="__WebPath__/Admin/Queues/Modify.html?id=__id__">__Name__</a>/TITLE:Name'}
-- .q{,__Description__,__Address__,__Priority__,__DefaultDueIn__,__Disabled__,__Lifecycle__},
+- .q{,__Description__,__Address__,__Priority__,__DefaultDueIn__,__Lifecycle__,__SubjectTag__,__Disabled__},
-
- Groups =>
- q{'<a href="__WebPath__/Admin/Groups/Modify.html?id=__id__">__id__</a>/TITLE:#'}
- .q{,'<a href="__WebPath__/Admin/Groups/Modify.html?id=__id__">__Name__</a>/TITLE:Name'}
-- .q{,'__Description__'},
+- .q{,'__Description__',__Disabled__},
-
- Users =>
- q{'<a href="__WebPath__/Admin/Users/Modify.html?id=__id__">__id__</a>/TITLE:#'}
- .q{,'<a href="__WebPath__/Admin/Users/Modify.html?id=__id__">__Name__</a>/TITLE:Name'}
-- .q{,__RealName__, __EmailAddress__},
+- .q{,__RealName__, __EmailAddress__,__Disabled__},
-
- CustomFields =>
- q{'<a href="__WebPath__/Admin/CustomFields/Modify.html?id=__id__">__id__</a>/TITLE:#'}
- .q{,'<a href="__WebPath__/Admin/CustomFields/Modify.html?id=__id__">__Name__</a>/TITLE:Name'}
-- .q{,__AppliedTo__, __FriendlyType__, __FriendlyPattern__},
+- .q{,__AddedTo__, __FriendlyType__, __FriendlyPattern__,__Disabled__},
-
- Scrips =>
-- q{'<a href="__WebPath__/Admin/Queues/Scrip.html?id=__id__&Queue=__QueueId__">__id__</a>/TITLE:#'}
-- .q{,'<a href="__WebPath__/Admin/Queues/Scrip.html?id=__id__&Queue=__QueueId__">__Description__</a>/TITLE:Description'}
-- .q{,__Stage__, __Condition__, __Action__, __Template__},
--
-- GlobalScrips =>
-- q{'<a href="__WebPath__/Admin/Global/Scrip.html?id=__id__">__id__</a>/TITLE:#'}
-- .q{,'<a href="__WebPath__/Admin/Global/Scrip.html?id=__id__">__Description__</a>/TITLE:Description'}
-- .q{,__Stage__, __Condition__, __Action__, __Template__},
+- q{'<a href="__WebPath__/Admin/Scrips/Modify.html?id=__id____From__">__id__</a>/TITLE:#'}
+- .q{,'<a href="__WebPath__/Admin/Scrips/Modify.html?id=__id____From__">__Description__</a>/TITLE:Description'}
+- .q{,__Condition__, __Action__, __Template__, __Disabled__},
-
- Templates =>
- q{'<a href="__WebPath__/__WebRequestPathDir__/Template.html?Queue=__QueueId__&Template=__id__">__id__</a>/TITLE:#'}
- .q{,'<a href="__WebPath__/__WebRequestPathDir__/Template.html?Queue=__QueueId__&Template=__id__">__Name__</a>/TITLE:Name'}
-- .q{,'__Description__'},
+- .q{,'__Description__','__UsedBy__','__IsEmpty__'},
- Classes =>
- q{ '<a href="__WebPath__/Admin/Articles/Classes/Modify.html?id=__id__">__id__</a>/TITLE:#'}
- .q{,'<a href="__WebPath__/Admin/Articles/Classes/Modify.html?id=__id__">__Name__</a>/TITLE:Name'}
-- .q{,__Description__},
+- .q{,__Description__,__Disabled__},
+-);
+-
+-=item C<%AdminSearchResultRows>
+-
+-Use C<%AdminSearchResultRows> to define the search result rows in the admin
+-interface on a per-RT-class basis.
+-
+-=cut
+-
+-Set(%AdminSearchResultRows,
+- Queues => 50,
+- Groups => 50,
+- Users => 50,
+- CustomFields => 50,
+- Scrips => 50,
+- Templates => 50,
+- Classes => 50,
-);
-
-=back
@@ -7012,7 +7316,7 @@ index 59eca8d..0000000
-
-=cut
-
--Set($DevelMode, "0");
+-Set($DevelMode, 0);
-
-
-=item C<$RecordBaseClass>
@@ -7048,7 +7352,7 @@ index 59eca8d..0000000
-logged at.
-
-Enabling this option will also expose the SQL Queries page in the
--Configuration -> Tools menu for SuperUsers.
+-Admin -> Tools menu for SuperUsers.
-
-=cut
-
@@ -7056,30 +7360,6 @@ index 59eca8d..0000000
-
-=back
-
--
--
--
--=head1 Deprecated options
--
--=over 4
--
--=item C<$LinkTransactionsRun1Scrip>
--
--RT-3.4 backward compatibility setting. Add/Delete Link used to record
--one transaction and run one scrip. Set this value to 1 if you want
--only one of the link transactions to have scrips run.
--
--=cut
--
--Set($LinkTransactionsRun1Scrip, 0);
--
--=item C<$ResolveDefaultUpdateType>
--
--This option has been deprecated. You can configure this site-wide
--with L</Lifecycles> (see L</Labeling and defining actions>).
--
--=back
--
-=cut
-
-1;
@@ -7279,7 +7559,7 @@ index a9f5dc5..0000000
-exit 0;
diff --git a/etc/upgrade/generate-rtaddressregexp b/etc/upgrade/generate-rtaddressregexp
deleted file mode 100755
-index c36805c..0000000
+index 44451d2..0000000
--- a/etc/upgrade/generate-rtaddressregexp
+++ /dev/null
@@ -1,109 +0,0 @@
@@ -7339,7 +7619,7 @@ index c36805c..0000000
-
-use RT;
-RT::LoadConfig();
--RT->Config->Set('LogToScreen' => 'debug');
+-RT->Config->Set('LogToSTDERR' => 'debug');
-RT::Init();
-
-$| = 1;
@@ -7394,7 +7674,7 @@ index c36805c..0000000
-}
diff --git a/etc/upgrade/split-out-cf-categories b/etc/upgrade/split-out-cf-categories
deleted file mode 100755
-index 7aa8dd9..0000000
+index 7dbee50..0000000
--- a/etc/upgrade/split-out-cf-categories
+++ /dev/null
@@ -1,171 +0,0 @@
@@ -7454,7 +7734,7 @@ index 7aa8dd9..0000000
-
-use RT;
-RT::LoadConfig();
--RT->Config->Set('LogToScreen' => 'debug');
+-RT->Config->Set('LogToSTDERR' => 'debug');
-RT::Init();
-
-$| = 1;
@@ -7569,9 +7849,163 @@ index 7aa8dd9..0000000
-
-$RT::Handle->Commit;
-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 138138d..0000000
+--- a/etc/upgrade/switch-templates-to
++++ /dev/null
+@@ -1,148 +0,0 @@
+-#!/usr/bin/perl
+-# BEGIN BPS TAGGED BLOCK {{{
+-#
+-# COPYRIGHT:
+-#
+-# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
+-# <sales at bestpractical.com>
+-#
+-# (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 strict;
+-use warnings;
+-
+-use lib "local/lib";
+-use lib "lib";
+-
+-use RT;
+-
+-my $to = shift || '';
+-my $from;
+-
+-if ($to =~ /html|text/i) {
+- $to = $to =~ /html/i ? 'html' : 'text';
+- $from = $to eq 'html' ? 'text' : 'html';
+-} else {
+- print "Usage: $0 [html|text]\n";
+- warn "Please specify if you'd like to switch to HTML or text templates.\n";
+- exit 1;
+-}
+-
+-RT::LoadConfig();
+-RT->Config->Set('LogToSTDERR' => 'info');
+-RT::Init();
+-
+-$| = 1;
+-
+-my @templates = (
+- "Autoreply",
+- "Transaction",
+- "Admin Correspondence",
+- "Correspondence",
+- "Admin Comment",
+- "Status Change",
+- "Resolved",
+- "New Pending Approval",
+- "Approval Passed",
+- "All Approvals Passed",
+- "Approval Rejected",
+- "Approval Ready for Owner",
+-);
+-
+-$RT::Handle->BeginTransaction();
+-
+-use RT::Scrips;
+-my $scrips = RT::Scrips->new( RT->SystemUser );
+-$scrips->UnLimit;
+-
+-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/upgrade-articles b/etc/upgrade/upgrade-articles
deleted file mode 100755
-index fc480a6..0000000
+index f9938bb..0000000
--- a/etc/upgrade/upgrade-articles
+++ /dev/null
@@ -1,264 +0,0 @@
@@ -7631,7 +8065,7 @@ index fc480a6..0000000
-
-use RT;
-RT::LoadConfig();
--RT->Config->Set('LogToScreen' => 'debug');
+-RT->Config->Set('LogToSTDERR' => 'debug');
-RT::Init();
-
-$| = 1;
@@ -7989,10 +8423,10 @@ index 1785fa9..0000000
-}
diff --git a/lib/RT/Generated.pm b/lib/RT/Generated.pm
deleted file mode 100644
-index 9240880..0000000
+index 7bf374c..0000000
--- a/lib/RT/Generated.pm
+++ /dev/null
-@@ -1,81 +0,0 @@
+@@ -1,84 +0,0 @@
-# BEGIN BPS TAGGED BLOCK {{{
-#
-# COPYRIGHT:
@@ -8045,7 +8479,8 @@ index 9240880..0000000
-use warnings;
-use strict;
-
--our $VERSION = '4.0.22';
+-our $VERSION = '4.2.9';
+-our ($MAJOR_VERSION, $MINOR_VERSION, $REVISION) = $VERSION =~ /^(\d)\.(\d)\.(\d+)/;
-
-
-
@@ -8055,11 +8490,13 @@ index 9240880..0000000
-$SbinPath = 'sbin';
-$VarPath = 'var';
-$LexiconPath = 'share/po';
+-$StaticPath = 'share/static';
-$PluginPath = 'plugins';
-$LocalPath = 'local';
-$LocalEtcPath = 'local/etc';
-$LocalLibPath = 'local/lib';
-$LocalLexiconPath = 'local/po';
+-$LocalStaticPath = 'local/static';
-$LocalPluginPath = 'local/plugins';
-# $MasonComponentRoot is where your rt instance keeps its mason html files
-$MasonComponentRoot = 'share/html';
@@ -8076,10 +8513,10 @@ index 9240880..0000000
-1;
diff --git a/sbin/rt-attributes-viewer b/sbin/rt-attributes-viewer
deleted file mode 100755
-index 0b24928..0000000
+index 7e45615..0000000
--- a/sbin/rt-attributes-viewer
+++ /dev/null
-@@ -1,122 +0,0 @@
+@@ -1,115 +0,0 @@
-#!/usr/bin/perl
-# BEGIN BPS TAGGED BLOCK {{{
-#
@@ -8132,27 +8569,20 @@ index 0b24928..0000000
-use warnings;
-
-# fix lib paths, some may be relative
--BEGIN {
+-BEGIN { # BEGIN RT CMD BOILERPLATE
- require File::Spec;
+- require Cwd;
- my @libs = ("lib", "local/lib");
- my $bin_path;
-
- for my $lib (@libs) {
- unless ( File::Spec->file_name_is_absolute($lib) ) {
-- unless ($bin_path) {
-- if ( File::Spec->file_name_is_absolute(__FILE__) ) {
-- $bin_path = ( File::Spec->splitpath(__FILE__) )[1];
-- }
-- else {
-- require FindBin;
-- no warnings "once";
-- $bin_path = $FindBin::Bin;
-- }
-- }
+- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1];
- $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib );
- }
- unshift @INC, $lib;
- }
+-
-}
-
-use Getopt::Long;
@@ -8204,10 +8634,10 @@ index 0b24928..0000000
-
diff --git a/sbin/rt-clean-sessions b/sbin/rt-clean-sessions
deleted file mode 100755
-index 7b18b58..0000000
+index c9f2d3b..0000000
--- a/sbin/rt-clean-sessions
+++ /dev/null
-@@ -1,190 +0,0 @@
+@@ -1,183 +0,0 @@
-#!/usr/bin/perl
-# BEGIN BPS TAGGED BLOCK {{{
-#
@@ -8260,27 +8690,20 @@ index 7b18b58..0000000
-use warnings;
-
-# fix lib paths, some may be relative
--BEGIN {
+-BEGIN { # BEGIN RT CMD BOILERPLATE
- require File::Spec;
+- require Cwd;
- my @libs = ("lib", "local/lib");
- my $bin_path;
-
- for my $lib (@libs) {
- unless ( File::Spec->file_name_is_absolute($lib) ) {
-- unless ($bin_path) {
-- if ( File::Spec->file_name_is_absolute(__FILE__) ) {
-- $bin_path = ( File::Spec->splitpath(__FILE__) )[1];
-- }
-- else {
-- require FindBin;
-- no warnings "once";
-- $bin_path = $FindBin::Bin;
-- }
-- }
+- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1];
- $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib );
- }
- unshift @INC, $lib;
- }
+-
-}
-
-use Getopt::Long;
@@ -8312,9 +8735,9 @@ index 7b18b58..0000000
-RT::LoadConfig();
-
-if( $opt{'debug'} ) {
-- RT->Config->Set( LogToScreen => 'debug' );
+- RT->Config->Set( LogToSTDERR => 'debug' );
-} else {
-- RT->Config->Set( LogToScreen => undef );
+- RT->Config->Set( LogToSTDERR => undef );
-}
-
-RT::ConnectToDatabase();
@@ -8400,10 +8823,10 @@ index 7b18b58..0000000
-=cut
diff --git a/sbin/rt-dump-metadata b/sbin/rt-dump-metadata
deleted file mode 100755
-index 84f5531..0000000
+index 77e655b..0000000
--- a/sbin/rt-dump-metadata
+++ /dev/null
-@@ -1,357 +0,0 @@
+@@ -1,336 +0,0 @@
-#!/usr/bin/perl -w
-# BEGIN BPS TAGGED BLOCK {{{
-#
@@ -8460,22 +8883,15 @@ index 84f5531..0000000
-binmode( STDOUT, ":utf8" );
-
-# fix lib paths, some may be relative
--BEGIN {
+-BEGIN { # BEGIN RT CMD BOILERPLATE
- require File::Spec;
-- my @libs = ( "lib", "local/lib" );
+- require Cwd;
+- my @libs = ("lib", "local/lib");
- my $bin_path;
-
- for my $lib (@libs) {
- unless ( File::Spec->file_name_is_absolute($lib) ) {
-- unless ($bin_path) {
-- if ( File::Spec->file_name_is_absolute(__FILE__) ) {
-- $bin_path = ( File::Spec->splitpath(__FILE__) )[1];
-- } else {
-- require FindBin;
-- no warnings "once";
-- $bin_path = $FindBin::Bin;
-- }
-- }
+- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1];
- $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib );
- }
- unshift @INC, $lib;
@@ -8510,11 +8926,6 @@ index 84f5531..0000000
- id Created Creator LastUpdated LastUpdatedBy
- )
- ],
-- Templates => [
-- qw(
-- TranslationOf
-- )
-- ],
-);
-
-my $SystemUserId = RT->SystemUser->Id;
@@ -8532,7 +8943,8 @@ index 84f5531..0000000
- $objects->Limit(
- FIELD => 'Domain',
- OPERATOR => '=',
-- VALUE => 'UserDefined'
+- VALUE => 'UserDefined',
+- CASESENSITIVE => 0,
- ) if $class eq 'Groups';
-
- if ( $class eq 'CustomFields' ) {
@@ -8675,19 +9087,9 @@ index 84f5531..0000000
- $rv->{GroupDomain} = 'RT::Queue-Role';
- }
- }
-- if ( $obj->LookupType eq 'RT::Queue-RT::Ticket' ) {
-- # XXX-TODO: unused CF's turn into global CF when importing
-- # as the sub InsertData in RT::Handle creates a global CF
-- # when no queue is specified.
-- $rv->{Queue} = [];
-- my $applies = $obj->AppliedTo;
-- while ( my $queue = $applies->Next ) {
-- push @{ $rv->{Queue} }, $queue->Name;
-- }
-- }
- }
-
-- if ( eval { require RT::Attributes; 1 } ) {
+- if ( RT::Attributes->require ) {
- my $attributes = $obj->Attributes;
- while ( my $attribute = $attributes->Next ) {
- my $content = $attribute->Content;
@@ -8763,10 +9165,10 @@ index 84f5531..0000000
-
diff --git a/sbin/rt-email-dashboards b/sbin/rt-email-dashboards
deleted file mode 100755
-index b923e2d..0000000
+index ad34389..0000000
--- a/sbin/rt-email-dashboards
+++ /dev/null
-@@ -1,173 +0,0 @@
+@@ -1,165 +0,0 @@
-#!/usr/bin/perl
-# BEGIN BPS TAGGED BLOCK {{{
-#
@@ -8819,23 +9221,15 @@ index b923e2d..0000000
-use warnings;
-
-# fix lib paths, some may be relative
--BEGIN {
+-BEGIN { # BEGIN RT CMD BOILERPLATE
- require File::Spec;
+- require Cwd;
- my @libs = ("lib", "local/lib");
- my $bin_path;
-
- for my $lib (@libs) {
- unless ( File::Spec->file_name_is_absolute($lib) ) {
-- unless ($bin_path) {
-- if ( File::Spec->file_name_is_absolute(__FILE__) ) {
-- $bin_path = ( File::Spec->splitpath(__FILE__) )[1];
-- }
-- else {
-- require FindBin;
-- no warnings "once";
-- $bin_path = $FindBin::Bin;
-- }
-- }
+- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1];
- $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib );
- }
- unshift @INC, $lib;
@@ -8860,15 +9254,15 @@ index b923e2d..0000000
-require RT::Interface::CLI;
-RT::Interface::CLI->import(qw{ CleanEnv loc });
-
--# Clean out all the nasties from the environment
--CleanEnv();
--
-# Load the config file
-RT::LoadConfig();
-
-# 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},
@@ -8942,10 +9336,10 @@ index b923e2d..0000000
-
diff --git a/sbin/rt-email-digest b/sbin/rt-email-digest
deleted file mode 100755
-index cb4d031..0000000
+index 1b405d0..0000000
--- a/sbin/rt-email-digest
+++ /dev/null
-@@ -1,380 +0,0 @@
+@@ -1,374 +0,0 @@
-#!/usr/bin/perl
-# BEGIN BPS TAGGED BLOCK {{{
-#
@@ -8997,23 +9391,15 @@ index cb4d031..0000000
-use warnings;
-use strict;
-
--BEGIN {
+-BEGIN { # BEGIN RT CMD BOILERPLATE
- require File::Spec;
+- require Cwd;
- my @libs = ("lib", "local/lib");
- my $bin_path;
-
- for my $lib (@libs) {
- unless ( File::Spec->file_name_is_absolute($lib) ) {
-- unless ($bin_path) {
-- if ( File::Spec->file_name_is_absolute(__FILE__) ) {
-- $bin_path = ( File::Spec->splitpath(__FILE__) )[1];
-- }
-- else {
-- require FindBin;
-- no warnings "once";
-- $bin_path = $FindBin::Bin;
-- }
-- }
+- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1];
- $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib );
- }
- unshift @INC, $lib;
@@ -9027,9 +9413,9 @@ index cb4d031..0000000
-use RT::Interface::CLI qw( CleanEnv loc );
-use RT::Interface::Email;
-
--CleanEnv();
-RT::LoadConfig();
-RT::Init();
+-CleanEnv();
-
-sub usage {
- my ($error) = @_;
@@ -9216,7 +9602,7 @@ index cb4d031..0000000
- my $queue = $txn->TicketObj->QueueObj->Name;
- # Xxx todo - may clobber if two queues have the same name
- foreach my $user ( $txn->DeferredRecipients($frequency) ) {
-- $all_digest->{$user}->{$queue}->{$ticket}->{ $txn->id } = $txn->ContentObj;
+- $all_digest->{$user}->{$queue}->{$ticket}->{ $txn->id } = $txn;
- $sent_transactions->{$user}->{ $txn->id } = $txn;
- }
- }
@@ -9260,12 +9646,14 @@ index cb4d031..0000000
- # Spit out the messages for the transactions on this ticket.
- $contents_body .= "\n== $ticket_title\n";
- foreach my $txn ( sort keys %$tkt_txns ) {
-- my $msg = $tkt_txns->{$txn};
--
-- # $msg contains an RT::Attachment with our outgoing
-- # message. Print a few headers for clarity's sake.
-- $contents_body .= "From: " . $msg->GetHeader('From') . "\n";
-- my $date = $msg->GetHeader('Date ');
+- my $top = $tkt_txns->{$txn}->Attachments->First;
+-
+- # $top contains the top-most RT::Attachment with our
+- # outgoing message. It may not be the MIME part with
+- # the content. Print a few headers from it for
+- # clarity's sake.
+- $contents_body .= "From: " . $top->GetHeader('From') . "\n";
+- my $date = $top->GetHeader('Date ');
- unless ($date) {
- my $txn_obj = RT::Transaction->new( RT->SystemUser );
- $txn_obj->Load($txn);
@@ -9278,7 +9666,7 @@ index cb4d031..0000000
- @{ [ localtime( $date_obj->Unix ) ] } );
- }
- $contents_body .= "Date: $date\n\n";
-- $contents_body .= $msg->Content . "\n";
+- $contents_body .= $tkt_txns->{$txn}->ContentObj->Content . "\n";
- $contents_body .= "-------\n";
- } # foreach transaction
- } # foreach ticket
@@ -9328,10 +9716,10 @@ index cb4d031..0000000
-=back
diff --git a/sbin/rt-email-group-admin b/sbin/rt-email-group-admin
deleted file mode 100755
-index 176b0b6..0000000
+index 2fa245c..0000000
--- a/sbin/rt-email-group-admin
+++ /dev/null
-@@ -1,527 +0,0 @@
+@@ -1,520 +0,0 @@
-#!/usr/bin/perl
-# BEGIN BPS TAGGED BLOCK {{{
-#
@@ -9421,23 +9809,15 @@ index 176b0b6..0000000
-use strict;
-
-# fix lib paths, some may be relative
--BEGIN {
+-BEGIN { # BEGIN RT CMD BOILERPLATE
- require File::Spec;
+- require Cwd;
- my @libs = ("lib", "local/lib");
- my $bin_path;
-
- for my $lib (@libs) {
- unless ( File::Spec->file_name_is_absolute($lib) ) {
-- unless ($bin_path) {
-- if ( File::Spec->file_name_is_absolute(__FILE__) ) {
-- $bin_path = ( File::Spec->splitpath(__FILE__) )[1];
-- }
-- else {
-- require FindBin;
-- no warnings "once";
-- $bin_path = $FindBin::Bin;
-- }
-- }
+- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1];
- $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib );
- }
- unshift @INC, $lib;
@@ -9733,6 +10113,7 @@ index 176b0b6..0000000
- require RT::Scrips;
- my $scrips = RT::Scrips->new( RT->SystemUser );
- $scrips->Limit( FIELD => 'ScripAction', VALUE => $action->id );
+- $scrips->FindAllRows;
- if ( $scrips->Count ) {
- my @sid;
- while( my $s = $scrips->Next ) {
@@ -9861,10 +10242,10 @@ index 176b0b6..0000000
-=cut
diff --git a/sbin/rt-fulltext-indexer b/sbin/rt-fulltext-indexer
deleted file mode 100755
-index f5b5dcf..0000000
+index 23f7660..0000000
--- a/sbin/rt-fulltext-indexer
+++ /dev/null
-@@ -1,479 +0,0 @@
+@@ -1,467 +0,0 @@
-#!/usr/bin/perl
-# BEGIN BPS TAGGED BLOCK {{{
-#
@@ -9918,27 +10299,20 @@ index f5b5dcf..0000000
-no warnings 'once';
-
-# fix lib paths, some may be relative
--BEGIN {
+-BEGIN { # BEGIN RT CMD BOILERPLATE
- require File::Spec;
+- require Cwd;
- my @libs = ("lib", "local/lib");
- my $bin_path;
-
- for my $lib (@libs) {
- unless ( File::Spec->file_name_is_absolute($lib) ) {
-- unless ($bin_path) {
-- if ( File::Spec->file_name_is_absolute(__FILE__) ) {
-- $bin_path = ( File::Spec->splitpath(__FILE__) )[1];
-- }
-- else {
-- require FindBin;
-- no warnings "once";
-- $bin_path = $FindBin::Bin;
-- }
-- }
+- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1];
- $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib );
- }
- unshift @INC, $lib;
- }
+-
-}
-
-BEGIN {
@@ -10097,11 +10471,6 @@ index f5b5dcf..0000000
- VALUE => 'deleted'
- );
-
-- # On newer DBIx::SearchBuilder's, indicate that making the query DISTINCT
-- # is unnecessary because the joins won't produce duplicates. This
-- # drastically improves performance when fetching attachments.
-- $res->{joins_are_distinct} = 1;
--
- return goto_specific(
- suffix => $type,
- error => "Don't know how to find $type attachments",
@@ -10344,12 +10713,12 @@ index f5b5dcf..0000000
-=cut
-
-__DATA__
-diff --git a/sbin/rt-preferences-viewer b/sbin/rt-preferences-viewer
+diff --git a/sbin/rt-importer b/sbin/rt-importer
deleted file mode 100755
-index 601e638..0000000
---- a/sbin/rt-preferences-viewer
+index d2480c8..0000000
+--- a/sbin/rt-importer
+++ /dev/null
-@@ -1,149 +0,0 @@
+@@ -1,282 +0,0 @@
-#!/usr/bin/perl
-# BEGIN BPS TAGGED BLOCK {{{
-#
@@ -10423,8 +10792,295 @@ index 601e638..0000000
- }
- unshift @INC, $lib;
- }
+-
+-}
+-
+-use RT;
+-RT::LoadConfig();
+-RT->Config->Set(RecordBaseClass => "DBIx::SearchBuilder::Record");
+-RT::Init();
+-
+-use RT::Migrate;
+-use RT::Migrate::Importer::File;
+-use Getopt::Long;
+-use Pod::Usage qw//;
+-use Time::HiRes qw//;
+-
+-my %OPT = (resume => 1);
+-GetOptions(
+- \%OPT,
+- "help|?",
+- "quiet|q!",
+- "list|l!",
+-
+- "resume!",
+- "originalid|i=s",
+-
+- "ask",
+- "ignore-errors",
+-
+- "dump=s@",
+-) or Pod::Usage::pod2usage();
+-
+-Pod::Usage::pod2usage(-verbose => 1) if $OPT{help};
+-
+-Pod::Usage::pod2usage() unless @ARGV == 1;
+-my ($dir) = @ARGV;
+-$dir =~ s|/$||;
+-die "No such directory $dir\n" unless -d $dir;
+-die "$dir doesn't appear to contain serialized data\n"
+- unless -f "$dir/001.dat";
+-
+-if ($OPT{dump}) {
+- die "Dumping objects only works in conjunction with --list\n"
+- unless $OPT{list};
+-
+- $OPT{dump} = [ split /,/, join(',', @{$OPT{dump}}) ];
+-}
+-
+-my $error_handler;
+-if ($OPT{ask}) {
+- die "Interactive mode (--ask) doesn't work when STDERR and STDIN aren't terminals.\n"
+- unless -t STDERR and -t STDIN;
+-
+- $error_handler = sub {
+- my $importer = shift;
+- local $| = 1;
+- print STDERR "\n", @_, "\n";
+- print STDERR "Hit any key to abort import, or type 'ignore' to continue anyway.\n";
+- print STDERR "Continuing may leave you with a corrupt database. > ";
+- chomp( my $resp = <STDIN> );
+- return lc($resp) eq 'ignore';
+- };
+-}
+-elsif ($OPT{'ignore-errors'}) {
+- $error_handler = sub {
+- my $importer = shift;
+- warn "Ignoring error: ", @_;
+- return 1;
+- };
+-}
+-
+-my $import = RT::Migrate::Importer::File->new(
+- Directory => $dir,
+- OriginalId => $OPT{originalid},
+- DumpObjects => $OPT{dump},
+- Resume => $OPT{resume},
+- HandleError => $error_handler,
+-);
+-
+-if ($import->Metadata and -t STDOUT and not $OPT{quiet}) {
+- $import->Progress(
+- RT::Migrate::progress(
+- counts => sub { $import->ObjectCount },
+- max => $import->Metadata->{ObjectCount},
+- )
+- );
+-}
+-
+-my $log = RT::Migrate::setup_logging( $dir => 'importer.log' );
+-print "Logging warnings and errors to $log\n" if $log;
+-
+-my %counts;
+-if ($OPT{list}) {
+- %counts = $import->List;
+-
+- my $org = $import->Organization;
+- print "=========== Dump of $org ===========\n\n";
+-} else {
+- %counts = $import->Import;
+-
+- my $org = $import->Organization;
+- print "========== Import of $org ==========\n\n";
+-}
+-
+-print "Total object counts:\n";
+-for (sort {$counts{$b} <=> $counts{$a}} keys %counts) {
+- printf "%8d %s\n", $counts{$_}, $_;
+-}
+-
+-my @missing = $import->Missing;
+-if (@missing) {
+- warn "The following UIDs were expected but never observed:\n";
+- warn " $_\n" for @missing;
+-}
+-
+-my @invalid = $import->Invalid;
+-if (@invalid) {
+- warn "The following UIDs (serialized => imported) referred to objects missing from the original database:\n";
+- for my $info (@invalid) {
+- my $uid = delete $info->{uid};
+- my $obj = $import->LookupObj($uid);
+- warn sprintf " %s => %s (%s)\n",
+- $uid,
+- ($obj && $obj->Id ? $obj->UID : '(not imported)'),
+- join(", ", map { "$_ => $info->{$_}" }
+- grep { defined $info->{$_} }
+- sort keys %$info);
+- }
+-}
+-
+-if ($log and -s $log) {
+- print STDERR "\n! Some warnings or errors occurred during import."
+- ."\n! Please see $log for details.\n\n";
+-}
+-
+-exit @missing;
+-
+-=head1 NAME
+-
+-rt-importer - Import a serialized RT database on top of the current one
+-
+-=head1 SYNOPSIS
+-
+- rt-importer path/to/export/directory
+-
+-This script is used to import the contents of a dump created by
+-C<rt-serializer>. It will create all of the objects in the dump in the
+-current database; this may include users, queues, and tickets.
+-
+-It is possible to stop the import process with ^C; it can be later
+-resumed by re-running the importer.
+-
+-=head2 OPTIONS
+-
+-=over
+-
+-=item B<--list>
+-
+-Print a summary of the data contained in the dump.
+-
+-=item B<--originalid> I<cfname>
+-
+-Places the original ticket organization and ID into a global custom
+-field with the given name. If no global ticket custom field with that
+-name is found in the current database, it will create one.
+-
+-=item B<--ask>
+-
+-Prompt for action when an error occurs inserting a record into the
+-database. This can often happen when importing data from very old RTs
+-where some attachments (usually spam) contain invalid UTF-8.
+-
+-The importer will pause and ask if you want to ignore the error and
+-continue on or abort (potentially to restart later). Ignoring errors
+-will result in missing records in the database, which may cause database
+-integrity problems later. If you ignored any errors, you should run
+-C<rt-validator> after import.
+-
+-=item B<--ignore-errors>
+-
+-Ignore all record creation errors and continue on when importing. This
+-is equivalent to running with C<--ask> and manually typing "ignore" at
+-every prompt. You should always run C<rt-validator> after importing
+-with errors ignored.
+-
+-B<This option can be dangerous and leave you with a broken RT!>
+-
+-=item B<--dump> I<class>[,I<class>]
+-
+-Prints L<Data::Dumper> representations of the objects of type I<class> in the
+-serialized data. This is mostly useful for debugging.
+-
+-Works only in conjunction with C<--list>.
+-
+-=back
+-
+-
+-=head1 CLONED DATA
+-
+-Some dumps may have been taken as complete clones of the RT system,
+-which are only suitable for inserting into a schema with no data in it.
+-You can setup the required database state for the receiving RT instance
+-by running:
+-
+- sbin/rt-setup-database --action create,schema,acl --prompt-for-dba-password
+-
+-The normal C<make initdb> step will B<not> work because it also inserts
+-core system data.
+-
+-
+-=cut
+diff --git a/sbin/rt-preferences-viewer b/sbin/rt-preferences-viewer
+deleted file mode 100755
+index 819a938..0000000
+--- a/sbin/rt-preferences-viewer
++++ /dev/null
+@@ -1,144 +0,0 @@
+-#!/usr/bin/perl
+-# BEGIN BPS TAGGED BLOCK {{{
+-#
+-# COPYRIGHT:
+-#
+-# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
+-# <sales at bestpractical.com>
+-#
+-# (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 strict;
+-use warnings;
+-
+-# fix lib paths, some may be relative
+-BEGIN { # BEGIN RT CMD BOILERPLATE
+- require File::Spec;
+- require Cwd;
+- my @libs = ("lib", "local/lib");
+- my $bin_path;
+-
+- for my $lib (@libs) {
+- unless ( File::Spec->file_name_is_absolute($lib) ) {
+- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1];
+- $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib );
+- }
+- unshift @INC, $lib;
+- }
+-
-}
-
+-BEGIN {
+- use RT;
+- RT::LoadConfig();
+- RT::Init();
+-};
+-
-use Getopt::Long;
-my %opt;
-GetOptions( \%opt, 'help|h', 'user|u=s', 'option|o=s' );
@@ -10435,10 +11091,6 @@ index 601e638..0000000
- exit;
-}
-
--require RT;
--RT::LoadConfig();
--RT::Init();
--
-require RT::Attributes;
-my $attrs = RT::Attributes->new( RT->SystemUser );
-$attrs->Limit( FIELD => 'Name', VALUE => 'Pref-RT::System-1' );
@@ -10499,13 +11151,13 @@ index 601e638..0000000
-This script shows user settings of preferences. If a user is using the system
-default, it will not be listed. You can limit to a user name or id or to users
-with a particular option set.
-diff --git a/sbin/rt-server b/sbin/rt-server
+diff --git a/sbin/rt-serializer b/sbin/rt-serializer
deleted file mode 100755
-index add9d01..0000000
---- a/sbin/rt-server
+index cd89309..0000000
+--- a/sbin/rt-serializer
+++ /dev/null
-@@ -1,285 +0,0 @@
--#!/usr/bin/perl -w
+@@ -1,398 +0,0 @@
+-#!/usr/bin/perl
-# BEGIN BPS TAGGED BLOCK {{{
-#
-# COPYRIGHT:
@@ -10553,17 +11205,11 @@ index add9d01..0000000
-# those contributions and any derivatives thereof.
-#
-# END BPS TAGGED BLOCK }}}
--use warnings;
-use strict;
+-use warnings;
-
-# fix lib paths, some may be relative
-BEGIN {
-- die <<EOT if ${^TAINT};
--RT does not run under Perl's "taint mode". Remove -T from the command
--line, or remove the PerlTaintCheck parameter from your mod_perl
--configuration.
--EOT
--
- require File::Spec;
- my @libs = ("lib", "local/lib");
- my $bin_path;
@@ -10587,27 +11233,433 @@ index add9d01..0000000
-
-}
-
+-use RT;
+-RT::LoadConfig();
+-RT->Config->Set(RecordBaseClass => "DBIx::SearchBuilder::Record");
+-RT::Init();
+-
+-use RT::Migrate;
+-use RT::Migrate::Serializer::File;
-use Getopt::Long;
--no warnings 'once';
+-use Pod::Usage qw//;
+-use Time::HiRes qw//;
-
--if (grep { m/help/ } @ARGV) {
-- require Pod::Usage;
-- print Pod::Usage::pod2usage( { verbose => 2 } );
-- exit;
--}
+-my %OPT;
+-GetOptions(
+- \%OPT,
+- "help|?",
+- "verbose|v!",
+- "quiet|q!",
+-
+- "directory|d=s",
+- "force|f!",
+- "size|s=i",
+-
+- "users!",
+- "groups!",
+- "deleted!",
+-
+- "scrips!",
+- "tickets!",
+- "acls!",
+-
+- "clone",
+- "incremental",
+-
+- "gc=i",
+- "page=i",
+-) or Pod::Usage::pod2usage();
+-
+-Pod::Usage::pod2usage(-verbose => 1) if $OPT{help};
+-
+-my %args;
+-$args{Directory} = $OPT{directory};
+-$args{Force} = $OPT{force};
+-$args{MaxFileSize} = $OPT{size} if $OPT{size};
+-
+-$args{AllUsers} = $OPT{users} if defined $OPT{users};
+-$args{AllGroups} = $OPT{groups} if defined $OPT{groups};
+-$args{FollowDeleted} = $OPT{deleted} if defined $OPT{deleted};
+-
+-$args{FollowScrips} = $OPT{scrips} if defined $OPT{scrips};
+-$args{FollowTickets} = $OPT{tickets} if defined $OPT{tickets};
+-$args{FollowACL} = $OPT{acls} if defined $OPT{acls};
+-
+-$args{Clone} = $OPT{clone} if $OPT{clone};
+-$args{Incremental} = $OPT{incremental} if $OPT{incremental};
+-
+-$args{GC} = defined $OPT{gc} ? $OPT{gc} : 5000;
+-$args{Page} = defined $OPT{page} ? $OPT{page} : 100;
+-
+-if (($OPT{clone} or $OPT{incremental})
+- and grep { /^(users|groups|deleted|scrips|tickets|acls)$/ } keys %OPT) {
+- die "You cannot specify object types when cloning.\n\nPlease see $0 --help.\n";
+-}
+-
+-my $walker;
+-
+-my $gnuplot = `which gnuplot`;
+-my $msg = "";
+-if (-t STDOUT and not $OPT{verbose} and not $OPT{quiet}) {
+- $args{Progress} = RT::Migrate::progress(
+- top => \&gnuplot,
+- bottom => sub { print "\n$msg"; $msg = ""; },
+- counts => sub { $walker->ObjectCount },
+- max => { estimate() },
+- );
+- $args{MessageHandler} = sub {
+- print "\r", " "x60, "\r", $_[-1]; $msg = $_[-1];
+- };
+- $args{Verbose} = 0;
+-}
+-$args{Verbose} = 0 if $OPT{quiet};
+-
+-
+-$walker = RT::Migrate::Serializer::File->new( %args );
+-
+-my $log = RT::Migrate::setup_logging( $walker->{Directory} => 'serializer.log' );
+-print "Logging warnings and errors to $log\n" if $log;
+-
+-print "Beginning database serialization...";
+-my %counts = $walker->Export;
+-
+-my @files = $walker->Files;
+-print "Wrote @{[scalar @files]} files:\n";
+-print " $_\n" for @files;
+-print "\n";
+-
+-print "Total object counts:\n";
+-for (sort {$counts{$b} <=> $counts{$a}} keys %counts) {
+- printf "%8d %s\n", $counts{$_}, $_;
+-}
+-
+-if ($log and -s $log) {
+- print STDERR "\n! Some warnings or errors occurred during serialization."
+- ."\n! Please see $log for details.\n\n";
+-} else {
+- unlink $log;
+-}
+-
+-sub estimate {
+- $| = 1;
+- my %e;
+-
+- # Expected types we'll serialize
+- my @types = map {"RT::$_"} qw/
+- Queue Ticket Transaction Attachment Link
+- User Group GroupMember Attribute
+- CustomField CustomFieldValue
+- ObjectCustomField ObjectCustomFieldValue
+- /;
+-
+- for my $class (@types) {
+- print "Estimating $class count...";
+- my $collection = $class . "s";
+- if ($collection->require) {
+- my $objs = $collection->new( RT->SystemUser );
+- $objs->FindAllRows;
+- $objs->UnLimit;
+- $objs->{allow_deleted_search} = 1 if $class eq "RT::Ticket";
+- $e{$class} = $objs->DBIx::SearchBuilder::Count;
+- }
+- print "\r", " "x60, "\r";
+- }
+-
+- return %e;
+-}
+-
+-
+-sub gnuplot {
+- my ($elapsed, $rows, $cols) = @_;
+- my $length = $walker->StackSize;
+- my $file = $walker->Directory . "/progress.plot";
+- open(my $dat, ">>", $file);
+- printf $dat "%10.3f\t%8d\n", $elapsed, $length;
+- close $dat;
+-
+- if ($rows <= 24 or not $gnuplot) {
+- print "\n\n";
+- } elsif ($elapsed) {
+- my $gnuplot = qx|
+- gnuplot -e '
+- set term dumb $cols @{[$rows - 12]};
+- set xlabel "Seconds";
+- unset key;
+- set xrange [0:*];
+- set yrange [0:*];
+- set title "Queue length";
+- plot "$file" using 1:2 with lines
+- '
+- |;
+- if ($? == 0 and $gnuplot) {
+- $gnuplot =~ s/^(\s*\n)//;
+- print $gnuplot;
+- unlink $file;
+- } else {
+- warn "Couldn't run gnuplot (\$? == $?): $!\n";
+- }
+- } else {
+- print "\n" for 1..($rows - 13);
+- }
+-}
+-
+-=head1 NAME
+-
+-rt-serializer - Serialize an RT database to disk
+-
+-=head1 SYNOPSIS
+-
+- rt-validator --check && rt-serializer
+-
+-This script is used to write out the entire RT database to disk, for
+-later import into a different RT instance. It requires that the data in
+-the database be self-consistent, in order to do so; please make sure
+-that the database being exported passes validation by L<rt-validator>
+-before attempting to use C<rt-serializer>.
+-
+-While running, it will attempt to estimate the number of remaining
+-objects to be serialized; these estimates are pessimistic, and will be
+-incorrect if C<--no-users>, C<--no-groups>, or C<--no-tickets> are used.
+-
+-If the controlling terminal is large enough (more than 25 columns high)
+-and the C<gnuplot> program is installed, it will also show a textual
+-graph of the queue size over time.
+-
+-=head2 OPTIONS
+-
+-=over
+-
+-=item B<--directory> I<name>
+-
+-The name of the output directory to write data files to, which should
+-not exist yet; it is a fatal error if it does. Defaults to
+-C<< ./I<$Organization>:I<Date>/ >>, where I<$Organization> is as set in
+-F<RT_SiteConfig.pm>, and I<Date> is today's date.
+-
+-=item B<--force>
+-
+-Remove the output directory before starting.
+-
+-=item B<--size> I<megabytes>
+-
+-By default, C<rt-serializer> chunks its output into data files which are
+-around 32Mb in size; this option is used to set a different threshold
+-size, in megabytes. Note that this is the threshold after which it
+-rotates to writing a new file, and is as such the I<lower bound> on the
+-size of each output file.
+-
+-=item B<--no-users>
+-
+-By default, all privileged users are serialized; passing C<--no-users>
+-limits it to only those users which are referenced by serialized tickets
+-and history, and are thus necessary for internal consistency.
+-
+-=item B<--no-groups>
+-
+-By default, all groups are serialized; passing C<--no-groups> limits it
+-to only system-internal groups, which are needed for internal
+-consistency.
+-
+-=item B<--no-deleted>
+-
+-By default, all tickets, including deleted tickets, are serialized;
+-passing C<--no-deleted> skips deleted tickets during serialization.
+-
+-=item B<--scrips>
+-
+-No scrips or templates are serialized by default; this option forces all
+-scrips and templates to be serialized.
+-
+-=item B<--acls>
+-
+-No ACLs are serialized by default; this option forces all ACLs to be
+-serialized.
+-
+-=item B<--no-tickets>
+-
+-Skip serialization of all ticket data.
+-
+-=item B<--clone>
+-
+-Serializes your entire database, creating a clone. This option should
+-be used if you want to migrate your RT database from one database type
+-to another (e.g. MySQL to Postgres). It is an error to combine
+-C<--clone> with any option that limits object types serialized. No
+-dependency walking is performed when cloning. C<rt-importer> will detect
+-that your serialized data set was generated by a clone.
+-
+-=item B<--incremental>
+-
+-Will generate an incremenal serialized dataset using the data stored in
+-your IncrementalRecords database table. This assumes that you have created
+-that table and run RT using the Record_Local.pm shim as documented in
+-C<docs/incremental-export/>.
+-
+-=item B<--gc> I<n>
+-
+-Adjust how often the garbage collection sweep is done; lower numbers are
+-more frequent. See L</GARBAGE COLLECTION>.
+-
+-=item B<--page> I<n>
+-
+-Adjust how many rows are pulled from the database in a single query. Disable
+-paging by setting this to 0. Defaults to 100.
+-
+-Keep in mind that rows from RT's Attachments table are the limiting factor when
+-determining page size. You should likely be aiming for 60-75% of your total
+-memory on an otherwise unloaded box.
+-
+-=item B<--quiet>
+-
+-Do not show graphical progress UI.
+-
+-=item B<--verbose>
+-
+-Do not show graphical progress UI, but rather log was each row is
+-written out.
+-
+-=back
+-
+-=head1 GARBAGE COLLECTION
+-
+-C<rt-serializer> maintains a priority queue of objects to serialize, or
+-searches which may result in objects to serialize. When inserting into
+-this queue, it does no checking if the object in question is already in
+-the queue, or if the search will contain any results. These checks are
+-done when the object reaches the front of the queue, or during periodic
+-garbage collection.
+-
+-During periodic garbage collection, the entire queue is swept for
+-objects which have already been serialized, occur more than once in the
+-queue, and searches which contain no results in the database. This is
+-done to reduce the memory footprint of the serialization process, and is
+-triggered when enough new objects have been placed in the queue. This
+-parameter is tunable via the C<--gc> parameter, which defaults to
+-running garbage collection every 5,000 objects inserted into the queue;
+-smaller numbers will result in more frequent garbage collection.
+-
+-The default of 5,000 is roughly tuned based on a database with several
+-thousand tickets, but optimal values will vary wildly depending on
+-database configuration and size. Values as low as 25 have provided
+-speedups with smaller databases; if speed is a factor, experimenting
+-with different C<--gc> values may be helpful. Note that there are
+-significant boundary condition changes in serialization rate, as the
+-queue empties and fills, causing the time estimates to be rather
+-imprecise near the start and end of the process.
+-
+-Setting C<--gc> to 0 turns off all garbage collection. Be aware that
+-this will bloat the memory usage of the serializer. Any negative value
+-for C<--gc> turns off periodic garbage collection and instead objects
+-already serialized or in the queue are checked for at the time they
+-would be inserted.
+-
+-=cut
+-
+diff --git a/sbin/rt-server b/sbin/rt-server
+deleted file mode 100755
+index cd22bb2..0000000
+--- a/sbin/rt-server
++++ /dev/null
+@@ -1,181 +0,0 @@
+-#!/usr/bin/perl -w
+-# BEGIN BPS TAGGED BLOCK {{{
+-#
+-# COPYRIGHT:
+-#
+-# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
+-# <sales at bestpractical.com>
+-#
+-# (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 warnings;
+-use strict;
+-
+-BEGIN {
+- die <<EOT if ${^TAINT};
+-RT does not run under Perl's "taint mode". Remove -T from the command
+-line, or remove the PerlTaintCheck parameter from your mod_perl
+-configuration.
+-EOT
+-}
+-
+-# fix lib paths, some may be relative
+-BEGIN { # BEGIN RT CMD BOILERPLATE
+- require File::Spec;
+- require Cwd;
+- my @libs = ("lib", "local/lib");
+- my $bin_path;
+-
+- for my $lib (@libs) {
+- unless ( File::Spec->file_name_is_absolute($lib) ) {
+- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1];
+- $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib );
+- }
+- unshift @INC, $lib;
+- }
+-
+-}
+-
+-use Getopt::Long;
+-no warnings 'once';
+-
+-if (grep { m/help/ } @ARGV) {
+- require Pod::Usage;
+- print Pod::Usage::pod2usage( { verbose => 2 } );
+- exit;
+-}
+-
+-require RT;
+-die "Wrong version of RT $RT::VERSION found; need 4.2.*"
+- unless $RT::VERSION =~ /^4\.2\./;
-
--require RT;
-RT->LoadConfig();
-RT->InitPluginPaths();
-RT->InitLogging();
--require Module::Refresh if RT->Config->Get('DevelMode');
-
-require RT::Handle;
-my ($integrity, $state, $msg) = RT::Handle->CheckIntegrity;
-
-unless ( $integrity ) {
- print STDERR <<EOF;
--
+-
-RT couldn't connect to the database where tickets are stored.
-If this is a new installation of RT, you should visit the URL below
-to configure RT and initialize your database.
@@ -10650,127 +11702,27 @@ index add9d01..0000000
- undef $RT::Handle;
-}
-
--require RT::Interface::Web::Handler;
--my $app = RT::Interface::Web::Handler->PSGIApp;
--
--if ($ENV{RT_TESTING}) {
-- my $screen_logger = $RT::Logger->remove('screen');
-- require Log::Dispatch::Perl;
-- $RT::Logger->add(
-- Log::Dispatch::Perl->new(
-- name => 'rttest',
-- min_level => $screen_logger->min_level,
-- action => {
-- error => 'warn',
-- critical => 'warn'
-- }
-- )
-- );
-- require Plack::Middleware::Test::StashWarnings;
-- $app = Plack::Middleware::Test::StashWarnings->wrap($app);
--}
--
+-require RT::PlackRunner;
-# when used as a psgi file
-if (caller) {
-- return $app;
--}
--
--
--# load appropriate server
--
--require Plack::Runner;
--
--my $is_fastcgi = $0 =~ m/fcgi$/;
--my $r = Plack::Runner->new( $0 =~ /standalone/ ? ( server => 'Standalone' ) :
-- $is_fastcgi ? ( server => 'FCGI' )
-- : (),
-- env => 'deployment' );
--
--# figure out the port
--my $port;
--
--# handle "rt-server 8888" for back-compat, but complain about it
--if ($ARGV[0] && $ARGV[0] =~ m/^\d+$/) {
-- warn "Deprecated: please run $0 --port $ARGV[0] instead\n";
-- unshift @ARGV, '--port';
--}
--
--my @args = @ARGV;
--
--use List::MoreUtils 'last_index';
--my $last_index = last_index { $_ eq '--port' } @args;
--
--my $explicit_port;
--
--if ( $last_index != -1 && $args[$last_index+1] =~ /^\d+$/ ) {
-- $explicit_port = $args[$last_index+1];
-- $port = $explicit_port;
--
-- # inform the rest of the system what port we manually chose
-- my $old_app = $app;
-- $app = sub {
-- my $env = shift;
--
-- $env->{'rt.explicit_port'} = $port;
--
-- $old_app->($env, @_);
-- };
+- return RT::PlackRunner->app;
-}
--else {
-- # default to the configured WebPort and inform Plack::Runner
-- $port = RT->Config->Get('WebPort') || '8080';
-- push @args, '--port', $port;
--}
--
--push @args, '--server', 'Standalone' if RT->InstallMode;
--push @args, '--server', 'Starlet' unless $r->{server} || grep { m/--server/ } @args;
--
--$r->parse_options(@args);
--
--delete $r->{options} if $is_fastcgi; ### mangle_host_port_socket ruins everything
-
--unless ($r->{env} eq 'development') {
-- push @{$r->{options}}, server_ready => sub {
-- my($args) = @_;
-- my $name = $args->{server_software} || ref($args); # $args is $server
-- my $host = $args->{host} || 0;
-- my $proto = $args->{proto} || 'http';
-- print STDERR "$name: Accepting connections at $proto://$host:$args->{port}/\n";
-- };
--}
--eval { $r->run($app) };
--if (my $err = $@) {
-- handle_startup_error($err);
--}
-
--exit 0;
+-my $r = RT::PlackRunner->new( RT->InstallMode ? ( server => 'Standalone' ) :
+- $0 =~ /standalone/ ? ( server => 'Standalone' ) :
+- $0 =~ /fcgi$/ ? ( server => 'FCGI', env => "deployment" )
+- : ( server => 'Starlet', env => "deployment" ) );
+-$r->parse_options(@ARGV);
-
--sub handle_startup_error {
-- my $err = shift;
-- if ( $err =~ /listen/ ) {
-- handle_bind_error();
-- } else {
-- die
-- "Something went wrong while trying to run RT's standalone web server:\n\t"
-- . $err;
-- }
--}
--
--
--sub handle_bind_error {
--
-- print STDERR <<EOF;
--WARNING: RT couldn't start up a web server on port @{[$port]}.
--This is often the case if the port is already in use or you're running @{[$0]}
--as someone other than your system's "root" user. You may also specify a
--temporary port with: $0 --port <port>
--EOF
+-# Try to clean up wrong-permissions var/
+-$SIG{INT} = sub {
+- local $@;
+- system("chown", "-R", "www:www", "/opt/rt4/var");
+- exit 0;
+-} if $> == 0;
-
-- if ($explicit_port) {
-- print STDERR
-- "Please check your system configuration or choose another port\n\n";
-- }
--}
+-$r->run;
-
-__END__
-
@@ -10792,10 +11744,10 @@ index add9d01..0000000
- rt-server --server Starman --port 8080
diff --git a/sbin/rt-server.fcgi b/sbin/rt-server.fcgi
deleted file mode 100755
-index add9d01..0000000
+index cd22bb2..0000000
--- a/sbin/rt-server.fcgi
+++ /dev/null
-@@ -1,285 +0,0 @@
+@@ -1,181 +0,0 @@
-#!/usr/bin/perl -w
-# BEGIN BPS TAGGED BLOCK {{{
-#
@@ -10847,30 +11799,24 @@ index add9d01..0000000
-use warnings;
-use strict;
-
--# fix lib paths, some may be relative
-BEGIN {
- die <<EOT if ${^TAINT};
-RT does not run under Perl's "taint mode". Remove -T from the command
-line, or remove the PerlTaintCheck parameter from your mod_perl
-configuration.
-EOT
+-}
-
+-# fix lib paths, some may be relative
+-BEGIN { # BEGIN RT CMD BOILERPLATE
- require File::Spec;
+- require Cwd;
- my @libs = ("lib", "local/lib");
- my $bin_path;
-
- for my $lib (@libs) {
- unless ( File::Spec->file_name_is_absolute($lib) ) {
-- unless ($bin_path) {
-- if ( File::Spec->file_name_is_absolute(__FILE__) ) {
-- $bin_path = ( File::Spec->splitpath(__FILE__) )[1];
-- }
-- else {
-- require FindBin;
-- no warnings "once";
-- $bin_path = $FindBin::Bin;
-- }
-- }
+- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1];
- $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib );
- }
- unshift @INC, $lib;
@@ -10888,17 +11834,19 @@ index add9d01..0000000
-}
-
-require RT;
+-die "Wrong version of RT $RT::VERSION found; need 4.2.*"
+- unless $RT::VERSION =~ /^4\.2\./;
+-
-RT->LoadConfig();
-RT->InitPluginPaths();
-RT->InitLogging();
--require Module::Refresh if RT->Config->Get('DevelMode');
-
-require RT::Handle;
-my ($integrity, $state, $msg) = RT::Handle->CheckIntegrity;
-
-unless ( $integrity ) {
- print STDERR <<EOF;
--
+-
-RT couldn't connect to the database where tickets are stored.
-If this is a new installation of RT, you should visit the URL below
-to configure RT and initialize your database.
@@ -10934,134 +11882,34 @@ index add9d01..0000000
- }
-}
-
--# we must disconnect DB before fork
--if ($RT::Handle) {
-- $RT::Handle->dbh->disconnect if $RT::Handle->dbh;
-- $RT::Handle->dbh(undef);
-- undef $RT::Handle;
--}
--
--require RT::Interface::Web::Handler;
--my $app = RT::Interface::Web::Handler->PSGIApp;
--
--if ($ENV{RT_TESTING}) {
-- my $screen_logger = $RT::Logger->remove('screen');
-- require Log::Dispatch::Perl;
-- $RT::Logger->add(
-- Log::Dispatch::Perl->new(
-- name => 'rttest',
-- min_level => $screen_logger->min_level,
-- action => {
-- error => 'warn',
-- critical => 'warn'
-- }
-- )
-- );
-- require Plack::Middleware::Test::StashWarnings;
-- $app = Plack::Middleware::Test::StashWarnings->wrap($app);
--}
--
--# when used as a psgi file
--if (caller) {
-- return $app;
--}
--
--
--# load appropriate server
--
--require Plack::Runner;
--
--my $is_fastcgi = $0 =~ m/fcgi$/;
--my $r = Plack::Runner->new( $0 =~ /standalone/ ? ( server => 'Standalone' ) :
-- $is_fastcgi ? ( server => 'FCGI' )
-- : (),
-- env => 'deployment' );
--
--# figure out the port
--my $port;
--
--# handle "rt-server 8888" for back-compat, but complain about it
--if ($ARGV[0] && $ARGV[0] =~ m/^\d+$/) {
-- warn "Deprecated: please run $0 --port $ARGV[0] instead\n";
-- unshift @ARGV, '--port';
--}
--
--my @args = @ARGV;
--
--use List::MoreUtils 'last_index';
--my $last_index = last_index { $_ eq '--port' } @args;
--
--my $explicit_port;
--
--if ( $last_index != -1 && $args[$last_index+1] =~ /^\d+$/ ) {
-- $explicit_port = $args[$last_index+1];
-- $port = $explicit_port;
--
-- # inform the rest of the system what port we manually chose
-- my $old_app = $app;
-- $app = sub {
-- my $env = shift;
--
-- $env->{'rt.explicit_port'} = $port;
--
-- $old_app->($env, @_);
-- };
--}
--else {
-- # default to the configured WebPort and inform Plack::Runner
-- $port = RT->Config->Get('WebPort') || '8080';
-- push @args, '--port', $port;
--}
--
--push @args, '--server', 'Standalone' if RT->InstallMode;
--push @args, '--server', 'Starlet' unless $r->{server} || grep { m/--server/ } @args;
--
--$r->parse_options(@args);
--
--delete $r->{options} if $is_fastcgi; ### mangle_host_port_socket ruins everything
--
--unless ($r->{env} eq 'development') {
-- push @{$r->{options}}, server_ready => sub {
-- my($args) = @_;
-- my $name = $args->{server_software} || ref($args); # $args is $server
-- my $host = $args->{host} || 0;
-- my $proto = $args->{proto} || 'http';
-- print STDERR "$name: Accepting connections at $proto://$host:$args->{port}/\n";
-- };
--}
--eval { $r->run($app) };
--if (my $err = $@) {
-- handle_startup_error($err);
+-# we must disconnect DB before fork
+-if ($RT::Handle) {
+- $RT::Handle->dbh->disconnect if $RT::Handle->dbh;
+- $RT::Handle->dbh(undef);
+- undef $RT::Handle;
-}
-
--exit 0;
--
--sub handle_startup_error {
-- my $err = shift;
-- if ( $err =~ /listen/ ) {
-- handle_bind_error();
-- } else {
-- die
-- "Something went wrong while trying to run RT's standalone web server:\n\t"
-- . $err;
-- }
+-require RT::PlackRunner;
+-# when used as a psgi file
+-if (caller) {
+- return RT::PlackRunner->app;
-}
-
-
--sub handle_bind_error {
+-my $r = RT::PlackRunner->new( RT->InstallMode ? ( server => 'Standalone' ) :
+- $0 =~ /standalone/ ? ( server => 'Standalone' ) :
+- $0 =~ /fcgi$/ ? ( server => 'FCGI', env => "deployment" )
+- : ( server => 'Starlet', env => "deployment" ) );
+-$r->parse_options(@ARGV);
-
-- print STDERR <<EOF;
--WARNING: RT couldn't start up a web server on port @{[$port]}.
--This is often the case if the port is already in use or you're running @{[$0]}
--as someone other than your system's "root" user. You may also specify a
--temporary port with: $0 --port <port>
--EOF
+-# Try to clean up wrong-permissions var/
+-$SIG{INT} = sub {
+- local $@;
+- system("chown", "-R", "www:www", "/opt/rt4/var");
+- exit 0;
+-} if $> == 0;
-
-- if ($explicit_port) {
-- print STDERR
-- "Please check your system configuration or choose another port\n\n";
-- }
--}
+-$r->run;
-
-__END__
-
@@ -11083,10 +11931,10 @@ index add9d01..0000000
- rt-server --server Starman --port 8080
diff --git a/sbin/rt-session-viewer b/sbin/rt-session-viewer
deleted file mode 100755
-index 555fc32..0000000
+index 6dcfd4f..0000000
--- a/sbin/rt-session-viewer
+++ /dev/null
-@@ -1,121 +0,0 @@
+@@ -1,114 +0,0 @@
-#!/usr/bin/perl
-# BEGIN BPS TAGGED BLOCK {{{
-#
@@ -11139,27 +11987,20 @@ index 555fc32..0000000
-use warnings;
-
-# fix lib paths, some may be relative
--BEGIN {
+-BEGIN { # BEGIN RT CMD BOILERPLATE
- require File::Spec;
+- require Cwd;
- my @libs = ("lib", "local/lib");
- my $bin_path;
-
- for my $lib (@libs) {
- unless ( File::Spec->file_name_is_absolute($lib) ) {
-- unless ($bin_path) {
-- if ( File::Spec->file_name_is_absolute(__FILE__) ) {
-- $bin_path = ( File::Spec->splitpath(__FILE__) )[1];
-- }
-- else {
-- require FindBin;
-- no warnings "once";
-- $bin_path = $FindBin::Bin;
-- }
-- }
+- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1];
- $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib );
- }
- unshift @INC, $lib;
- }
+-
-}
-
-use Getopt::Long;
@@ -11210,10 +12051,10 @@ index 555fc32..0000000
-=cut
diff --git a/sbin/rt-setup-database b/sbin/rt-setup-database
deleted file mode 100755
-index 0b8be39..0000000
+index b599556..0000000
--- a/sbin/rt-setup-database
+++ /dev/null
-@@ -1,607 +0,0 @@
+@@ -1,795 +0,0 @@
-#!/usr/bin/perl
-# BEGIN BPS TAGGED BLOCK {{{
-#
@@ -11268,23 +12109,15 @@ index 0b8be39..0000000
-use vars qw($Nobody $SystemUser $item);
-
-# fix lib paths, some may be relative
--BEGIN {
+-BEGIN { # BEGIN RT CMD BOILERPLATE
- require File::Spec;
+- require Cwd;
- my @libs = ("lib", "local/lib");
- my $bin_path;
-
- for my $lib (@libs) {
- unless ( File::Spec->file_name_is_absolute($lib) ) {
-- unless ($bin_path) {
-- if ( File::Spec->file_name_is_absolute(__FILE__) ) {
-- $bin_path = ( File::Spec->splitpath(__FILE__) )[1];
-- }
-- else {
-- require FindBin;
-- no warnings "once";
-- $bin_path = $FindBin::Bin;
-- }
-- }
+- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1];
- $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib );
- }
- unshift @INC, $lib;
@@ -11294,11 +12127,11 @@ index 0b8be39..0000000
-
-use Term::ReadKey;
-use Getopt::Long;
+-use Data::GUID;
-
-$| = 1; # unbuffer all output.
-
-my %args = (
-- dba => 'root',
- package => 'RT',
-);
-GetOptions(
@@ -11307,6 +12140,7 @@ index 0b8be39..0000000
- 'force', 'debug',
- 'dba=s', 'dba-password=s', 'prompt-for-dba-password', 'package=s',
- 'datafile=s', 'datadir=s', 'skip-create', 'root-password-file=s',
+- 'package=s', 'ext-version=s',
- 'upgrade-from=s', 'upgrade-to=s',
- 'help|h',
-);
@@ -11324,9 +12158,10 @@ index 0b8be39..0000000
-
-# Force warnings to be output to STDERR if we're not already logging
-# them at a higher level
--RT->Config->Set( LogToScreen => 'warning')
-- unless ( RT->Config->Get( 'LogToScreen' )
-- && RT->Config->Get( 'LogToScreen' ) =~ /^(debug|info|notice)$/ );
+-RT->Config->Set( LogToSTDERR => 'warning')
+- unless ( RT->Config->Get( 'LogToSTDERR' )
+- && RT->Config->Get( 'LogToSTDERR' ) =~ /^(debug|info|notice)$/ );
+-RT::InitLogging();
-
-# get customized root password
-my $root_password;
@@ -11352,7 +12187,7 @@ index 0b8be39..0000000
- exit(-1);
-}
-foreach ( @actions ) {
-- unless ( /^(?:init|create|drop|schema|acl|coredata|insert|upgrade)$/ ) {
+- unless ( /^(?:init|create|drop|schema|acl|indexes|coredata|insert|upgrade)$/ ) {
- print STDERR "$0 called with an invalid --action parameter.\n";
- exit(-1);
- }
@@ -11395,7 +12230,7 @@ index 0b8be39..0000000
- RT->Config->Set( DatabaseName => $db_name );
-}
-
--my $dba_user = $args{'dba'} || $ENV{'RT_DBA_USER'} || $db_user || '';
+-my $dba_user = $args{'dba'} || $ENV{'RT_DBA_USER'} || RT->Config->Get('DatabaseAdmin') || '';
-my $dba_pass = $args{'dba-password'} || $ENV{'RT_DBA_PASSWORD'};
-
-if ($args{'skip-create'}) {
@@ -11415,6 +12250,17 @@ index 0b8be39..0000000
- ."Type:\t$db_type\nHost:\t$db_host\nPort:\t$db_port\nName:\t$db_name\n"
- ."User:\t$db_user\nDBA:\t$dba_user" . ($args{'skip-create'} ? ' (No DBA)' : '') . "\n";
-
+-my $package = $args{'package'} || 'RT';
+-my $ext_version = $args{'ext-version'};
+-my $full_id = Data::GUID->new->as_string;
+-
+-my $log_actions = 0;
+-if ($args{'package'} ne 'RT') {
+- RT->ConnectToDatabase();
+- RT->InitSystemObjects();
+- $log_actions = 1;
+-}
+-
-foreach my $action ( @actions ) {
- no strict 'refs';
- my ($status, $msg) = *{ 'action_'. $action }{'CODE'}->( %args );
@@ -11457,8 +12303,28 @@ index 0b8be39..0000000
- my ($status, $msg) = RT::Handle->CheckCompatibility( $dbh, 'schema' );
- return ($status, $msg) unless $status;
-
+- my $individual_id = Data::GUID->new->as_string();
+- my %upgrade_data = (
+- action => 'schema',
+- filename => Cwd::abs_path($args{'datafile'} || $args{'datadir'} || ''),
+- stage => 'before',
+- full_id => $full_id,
+- individual_id => $individual_id,
+- );
+- $upgrade_data{'ext_version'} = $ext_version if $ext_version;
+- RT->System->AddUpgradeHistory($package => \%upgrade_data) if $log_actions;
+-
- print "Now populating database schema.\n";
-- return RT::Handle->InsertSchema( $dbh, $args{'datafile'} || $args{'datadir'} );
+- my @ret = RT::Handle->InsertSchema( $dbh, $args{'datafile'} || $args{'datadir'} );
+-
+- %upgrade_data = (
+- stage => 'after',
+- individual_id => $individual_id,
+- return_value => [ @ret ],
+- );
+- RT->System->AddUpgradeHistory($package => \%upgrade_data) if $log_actions;
+-
+- return @ret;
-}
-
-sub action_acl {
@@ -11467,8 +12333,63 @@ index 0b8be39..0000000
- my ($status, $msg) = RT::Handle->CheckCompatibility( $dbh, 'acl' );
- return ($status, $msg) unless $status;
-
+- my $individual_id = Data::GUID->new->as_string();
+- my %upgrade_data = (
+- action => 'acl',
+- filename => Cwd::abs_path($args{'datafile'} || $args{'datadir'} || ''),
+- stage => 'before',
+- full_id => $full_id,
+- individual_id => $individual_id,
+- );
+- $upgrade_data{'ext_version'} = $ext_version if $ext_version;
+- RT->System->AddUpgradeHistory($package => \%upgrade_data) if $log_actions;
+-
- print "Now inserting database ACLs.\n";
-- return RT::Handle->InsertACL( $dbh, $args{'datafile'} || $args{'datadir'} );
+- my @ret = RT::Handle->InsertACL( $dbh, $args{'datafile'} || $args{'datadir'} );
+-
+- %upgrade_data = (
+- stage => 'after',
+- individual_id => $individual_id,
+- return_value => [ @ret ],
+- );
+- RT->System->AddUpgradeHistory($package => \%upgrade_data) if $log_actions;
+-
+- return @ret;
+-}
+-
+-sub action_indexes {
+- my %args = @_;
+- RT->ConnectToDatabase;
+- my $individual_id = Data::GUID->new->as_string();
+- my %upgrade_data = (
+- action => 'indexes',
+- filename => Cwd::abs_path($args{'datafile'} || $args{'datadir'} || ''),
+- stage => 'before',
+- full_id => $full_id,
+- individual_id => $individual_id,
+- );
+- $upgrade_data{'ext_version'} = $ext_version if $ext_version;
+- RT->System->AddUpgradeHistory($package => \%upgrade_data) if $log_actions;
+-
+- my $dbh = get_admin_dbh();
+- $RT::Handle = RT::Handle->new;
+- $RT::Handle->dbh( $dbh );
+- RT::InitLogging();
+-
+- print "Now inserting database indexes.\n";
+- my @ret = RT::Handle->InsertIndexes( $dbh, $args{'datafile'} || $args{'datadir'} );
+-
+- $RT::Handle = RT::Handle->new;
+- $RT::Handle->dbh( undef );
+- RT->ConnectToDatabase;
+- %upgrade_data = (
+- stage => 'after',
+- individual_id => $individual_id,
+- return_value => [ @ret ],
+- );
+- RT->System->AddUpgradeHistory($package => \%upgrade_data) if $log_actions;
+-
+- return @ret;
-}
-
-sub action_coredata {
@@ -11476,7 +12397,6 @@ index 0b8be39..0000000
- $RT::Handle = RT::Handle->new;
- $RT::Handle->dbh( undef );
- RT::ConnectToDatabase();
-- RT::InitLogging();
- my ($status, $msg) = RT::Handle->CheckCompatibility( $RT::Handle->dbh, 'coredata' );
- return ($status, $msg) unless $status;
-
@@ -11488,6 +12408,8 @@ index 0b8be39..0000000
- my %args = @_;
- $RT::Handle = RT::Handle->new;
- RT::Init();
+- $log_actions = 1;
+-
- my ($status, $msg) = RT::Handle->CheckCompatibility( $RT::Handle->dbh, 'insert' );
- return ($status, $msg) unless $status;
-
@@ -11496,29 +12418,54 @@ index 0b8be39..0000000
- $file = $RT::EtcPath . "/initialdata" if $init && !$file;
- $file ||= $args{'datadir'}."/content";
-
-- # Slurp in backcompat
-- my %removed;
-- my @back = @{$args{backcompat} || []};
-- if (@back) {
-- my @lines = do {local @ARGV = @back; <>};
-- for (@lines) {
-- s/\#.*//;
-- next unless /\S/;
-- my ($class, @fields) = split;
-- $class->_BuildTableAttributes;
-- $RT::Logger->debug("Temporarily removing @fields from $class");
-- $removed{$class}{$_} = delete $RT::Record::_TABLE_ATTR->{$class}{$_}
-- for @fields;
+- my $individual_id = Data::GUID->new->as_string();
+- my %upgrade_data = (
+- action => 'insert',
+- filename => Cwd::abs_path($file),
+- stage => 'before',
+- full_id => $full_id,
+- individual_id => $individual_id
+- );
+- $upgrade_data{'ext_version'} = $ext_version if $ext_version;
+-
+- open my $handle, '<', $file or warn "Unable to open $file: $!";
+- $upgrade_data{content} = do {local $/; <$handle>} if $handle;
+-
+- RT->System->AddUpgradeHistory($package => \%upgrade_data);
+-
+- my @ret;
+-
+- my $upgrade = sub { @ret = $RT::Handle->InsertData( $file, $root_password ) };
+-
+- for my $file (@{$args{backcompat} || []}) {
+- my $lines = do {local $/; local @ARGV = ($file); <>};
+- my $sub = eval "sub {\n# line 1 $file\n$lines\n}";
+- unless ($sub) {
+- warn "Failed to load backcompat $file: $@";
+- next;
- }
+- my $current = $upgrade;
+- $upgrade = sub { $sub->($current) };
- }
-
-- my @ret = $RT::Handle->InsertData( $file, $root_password );
+- $upgrade->();
+-
+- # XXX Reconnecting to insert the history entry
+- # until we can sort out removing
+- # the disconnect at the end of InsertData.
+- RT->ConnectToDatabase();
+-
+- %upgrade_data = (
+- stage => 'after',
+- individual_id => $individual_id,
+- return_value => [ @ret ],
+- );
+-
+- RT->System->AddUpgradeHistory($package => \%upgrade_data);
+-
+- my $db_type = RT->Config->Get('DatabaseType');
+- $RT::Handle->Disconnect() unless $db_type eq 'SQLite';
-
-- # Put back the fields we chopped off
-- for my $class (keys %removed) {
-- $RT::Record::_TABLE_ATTR->{$class}{$_} = $removed{$class}{$_}
-- for keys %{$removed{$class}};
-- }
- return @ret;
-}
-
@@ -11600,15 +12547,62 @@ index 0b8be39..0000000
- }
- }
-
-- print "\nIT'S VERY IMPORTANT TO BACK UP BEFORE THIS STEP\n\n";
-- _yesno() or exit(-2) unless $args{'force'};
+- unless ( $args{'force'} ) {
+- print "\nIT'S VERY IMPORTANT TO BACK UP BEFORE THIS STEP\n\n";
+- _yesno() or exit(-2);
+- }
+-
+- RT->ConnectToDatabase();
+- RT->InitSystemObjects();
+- $log_actions = 1;
+-
+- RT->System->AddUpgradeHistory($package => {
+- type => 'full upgrade',
+- action => 'upgrade',
+- stage => 'before',
+- from => $upgrading_from,
+- to => $upgrading_to,
+- versions => [@versions],
+- full_id => $full_id,
+- individual_id => $full_id
+- });
+-
+- # Ensure that the Attributes column is big enough to hold the
+- # upgrade steps we're going to add; this step exists in 4.0.6 for
+- # mysql, but that may be too late. Run it as soon as possible.
+- if (RT->Config->Get('DatabaseType') eq 'mysql'
+- and RT::Handle::cmp_version( $upgrading_from, '4.0.6') < 0) {
+- my $dbh = get_admin_dbh();
+- # Before the binary switch in 3.7.87, we want to alter text ->
+- # longtext, not blob -> longblob
+- if (RT::Handle::cmp_version( $upgrading_from, '3.7.87') < 0) {
+- $dbh->do("ALTER TABLE Attributes MODIFY Content LONGTEXT")
+- } else {
+- $dbh->do("ALTER TABLE Attributes MODIFY Content LONGBLOB")
+- }
+- }
-
+- my $previous = $upgrading_from;
- my ( $ret, $msg );
- foreach my $n ( 0..$#versions ) {
- my $v = $versions[$n];
+- my $individual_id = Data::GUID->new->as_string();
+-
- my @back = grep {-e $_} map {"$base_dir/$versions[$_]/backcompat"} $n+1..$#versions;
- print "Processing $v\n";
+-
+- RT->System->AddUpgradeHistory($package => {
+- action => 'upgrade',
+- type => 'individual upgrade',
+- stage => 'before',
+- from => $previous,
+- to => $v,
+- full_id => $full_id,
+- individual_id => $individual_id,
+- });
+-
- my %tmp = (%args, datadir => "$base_dir/$v", datafile => undef, backcompat => \@back);
+-
- if ( -e "$base_dir/$v/schema.$db_type" ) {
- ( $ret, $msg ) = action_schema( %tmp );
- return ( $ret, $msg ) unless $ret;
@@ -11617,11 +12611,33 @@ index 0b8be39..0000000
- ( $ret, $msg ) = action_acl( %tmp );
- return ( $ret, $msg ) unless $ret;
- }
+- if ( -e "$base_dir/$v/indexes" ) {
+- ( $ret, $msg ) = action_indexes( %tmp );
+- return ( $ret, $msg ) unless $ret;
+- }
- if ( -e "$base_dir/$v/content" ) {
- ( $ret, $msg ) = action_insert( %tmp );
- return ( $ret, $msg ) unless $ret;
- }
+-
+- # XXX: Another connect since the insert called
+- # previous to this step will disconnect.
+-
+- RT->ConnectToDatabase();
+-
+- RT->System->AddUpgradeHistory($package => {
+- stage => 'after',
+- individual_id => $individual_id,
+- });
+-
+- $previous = $v;
- }
+-
+- RT->System->AddUpgradeHistory($package => {
+- stage => 'after',
+- individual_id => $full_id,
+- });
+-
- return 1;
-}
-
@@ -11810,6 +12826,17 @@ index 0b8be39..0000000
-for 'init' and 'insert': rather than using the default administrative password
-for RT's "root" user, use the password in this file.
-
+-=item package
+-
+-the name of the entity performing a create or upgrade. Used for logging changes
+-in the DB. Defaults to RT, otherwise it should be the fully qualified package name
+-of the extension or plugin making changes to the DB.
+-
+-=item ext-version
+-
+-current version of extension making a change. Not needed for RT since RT has a
+-more elaborate system to track upgrades across multiple versions.
+-
-=item upgrade-from
-
-for 'upgrade': specifies the version to upgrade from, and do not prompt
@@ -11821,12 +12848,14 @@ index 0b8be39..0000000
-for it if it appears to be a valid version.
-
-=back
+-
+-=cut
diff --git a/sbin/rt-setup-fulltext-index b/sbin/rt-setup-fulltext-index
deleted file mode 100755
-index 871d419..0000000
+index 19d64f0..0000000
--- a/sbin/rt-setup-fulltext-index
+++ /dev/null
-@@ -1,720 +0,0 @@
+@@ -1,713 +0,0 @@
-#!/usr/bin/perl
-# BEGIN BPS TAGGED BLOCK {{{
-#
@@ -11880,27 +12909,20 @@ index 871d419..0000000
-no warnings 'once';
-
-# fix lib paths, some may be relative
--BEGIN {
+-BEGIN { # BEGIN RT CMD BOILERPLATE
- require File::Spec;
+- require Cwd;
- my @libs = ("lib", "local/lib");
- my $bin_path;
-
- for my $lib (@libs) {
- unless ( File::Spec->file_name_is_absolute($lib) ) {
-- unless ($bin_path) {
-- if ( File::Spec->file_name_is_absolute(__FILE__) ) {
-- $bin_path = ( File::Spec->splitpath(__FILE__) )[1];
-- }
-- else {
-- require FindBin;
-- no warnings "once";
-- $bin_path = $FindBin::Bin;
-- }
-- }
+- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1];
- $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib );
- }
- unshift @INC, $lib;
- }
+-
-}
-
-BEGIN {
@@ -11913,7 +12935,7 @@ index 871d419..0000000
-my %DB = (
- type => scalar RT->Config->Get('DatabaseType'),
- user => scalar RT->Config->Get('DatabaseUser'),
-- admin => 'root',
+- admin => scalar RT->Config->Get('DatabaseAdmin'),
- admin_password => undef,
-);
-
@@ -11999,7 +13021,7 @@ index 871d419..0000000
-
- my $schema = <<END;
-CREATE TABLE $table (
-- id INTEGER UNSIGNED NOT NULL,
+- id BIGINT NOT NULL,
- weight INTEGER NOT NULL,
- query VARCHAR(3072) NOT NULL,
- INDEX(query)
@@ -12549,10 +13571,10 @@ index 871d419..0000000
-
diff --git a/sbin/rt-shredder b/sbin/rt-shredder
deleted file mode 100755
-index 0198ab0..0000000
+index 14cba1f..0000000
--- a/sbin/rt-shredder
+++ /dev/null
-@@ -1,325 +0,0 @@
+@@ -1,317 +0,0 @@
-#!/usr/bin/perl
-# BEGIN BPS TAGGED BLOCK {{{
-#
@@ -12666,23 +13688,15 @@ index 0198ab0..0000000
-use warnings FATAL => 'all';
-
-# fix lib paths, some may be relative
--BEGIN {
+-BEGIN { # BEGIN RT CMD BOILERPLATE
- require File::Spec;
+- require Cwd;
- my @libs = ("lib", "local/lib");
- my $bin_path;
-
- for my $lib (@libs) {
- unless ( File::Spec->file_name_is_absolute($lib) ) {
-- unless ($bin_path) {
-- if ( File::Spec->file_name_is_absolute(__FILE__) ) {
-- $bin_path = ( File::Spec->splitpath(__FILE__) )[1];
-- }
-- else {
-- require FindBin;
-- no warnings "once";
-- $bin_path = $FindBin::Bin;
-- }
-- }
+- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1];
- $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib );
- }
- unshift @INC, $lib;
@@ -12711,7 +13725,7 @@ index 0198ab0..0000000
- file_name => $opt{'sqldump'},
- from_storage => 0,
- } ) };
-- if( $@ ) {
+- if( $@ ) {
- print STDERR "ERROR: Couldn't open SQL dump file: $@\n";
- exit 1 if $opt{'sqldump'};
-
@@ -12719,7 +13733,7 @@ index 0198ab0..0000000
- unless( $opt{'force'} ) {
- exit 0 unless prompt_yN( "Do you want to proceed?" );
- }
-- } else {
+- } else {
- print "SQL dump file is '". $plugin->FileName ."'\n";
- }
-}
@@ -12740,95 +13754,95 @@ index 0198ab0..0000000
-
-sub prompt_delete_objs
-{
-- my( $objs ) = @_;
-- unless( @$objs ) {
-- print "Objects list is empty, try refine search options\n";
-- exit 0;
-- }
-- my $list = "Next ". scalar( @$objs ) ." objects would be deleted:\n";
-- foreach my $o( @$objs ) {
-- $list .= "\t". $o->_AsString ." object\n";
-- }
-- print $list;
-- exit(0) unless prompt_yN( "Do you want to proceed?" );
+- my( $objs ) = @_;
+- unless( @$objs ) {
+- print "Objects list is empty, try refine search options\n";
+- exit 0;
+- }
+- my $list = "Next ". scalar( @$objs ) ." objects would be deleted:\n";
+- foreach my $o( @$objs ) {
+- $list .= "\t". $o->_AsString ." object\n";
+- }
+- print $list;
+- exit(0) unless prompt_yN( "Do you want to proceed?" );
-}
-
-sub prompt_yN
-{
-- my $text = shift;
-- print "$text [y/N] ";
-- unless( <STDIN> =~ /^(?:y|yes)$/i ) {
-- return 0;
-- }
-- return 1;
+- my $text = shift;
+- print "$text [y/N] ";
+- unless( <STDIN> =~ /^(?:y|yes)$/i ) {
+- return 0;
+- }
+- return 1;
-}
-
-sub usage
-{
-- require RT::Shredder::POD;
-- RT::Shredder::POD::shredder_cli( $0, \*STDOUT );
-- exit 1;
+- require RT::Shredder::POD;
+- RT::Shredder::POD::shredder_cli( $0, \*STDOUT );
+- exit 1;
-}
-
-sub parse_args
-{
-- my $tmp;
-- Getopt::Long::Configure( "pass_through" );
-- my @objs = ();
-- if( GetOptions( 'object=s' => \@objs ) && @objs ) {
-- print STDERR "Option --object had been deprecated, use plugin 'Objects' instead\n";
+- my $tmp;
+- Getopt::Long::Configure( "pass_through" );
+- my @objs = ();
+- if( GetOptions( 'object=s' => \@objs ) && @objs ) {
+- print STDERR "Option --object had been deprecated, use plugin 'Objects' instead\n";
- exit(1);
-- }
--
-- my @plugins = ();
-- if( GetOptions( 'plugin=s' => \@plugins ) && @plugins ) {
-- $opt{'plugin'} = \@plugins;
-- foreach my $str( @plugins ) {
-- if( $str =~ /^\s*list\s*$/ ) {
-- show_plugin_list();
-- } elsif( $str =~ /^\s*help-(\w+)\s*$/ ) {
-- show_plugin_help( $1 );
-- } elsif( $str =~ /^(\w+)(=.*)?$/ && !$plugins{$1} ) {
-- print "Couldn't find plugin '$1'\n";
-- show_plugin_list();
-- }
-- }
-- }
--
-- # other options make no sense without previouse
-- usage() unless keys %opt;
--
-- if( GetOptions( 'force' => \$tmp ) && $tmp ) {
-- $opt{'force'}++;
-- }
-- $tmp = undef;
-- if( GetOptions( 'sqldump=s' => \$tmp ) && $tmp ) {
-- $opt{'sqldump'} = $tmp;
-- }
-- return;
+- }
+-
+- my @plugins = ();
+- if( GetOptions( 'plugin=s' => \@plugins ) && @plugins ) {
+- $opt{'plugin'} = \@plugins;
+- foreach my $str( @plugins ) {
+- if( $str =~ /^\s*list\s*$/ ) {
+- show_plugin_list();
+- } elsif( $str =~ /^\s*help-(\w+)\s*$/ ) {
+- show_plugin_help( $1 );
+- } elsif( $str =~ /^(\w+)(=.*)?$/ && !$plugins{$1} ) {
+- print "Couldn't find plugin '$1'\n";
+- show_plugin_list();
+- }
+- }
+- }
+-
+- # other options make no sense without previouse
+- usage() unless keys %opt;
+-
+- if( GetOptions( 'force' => \$tmp ) && $tmp ) {
+- $opt{'force'}++;
+- }
+- $tmp = undef;
+- if( GetOptions( 'sqldump=s' => \$tmp ) && $tmp ) {
+- $opt{'sqldump'} = $tmp;
+- }
+- return;
-}
-
-sub process_plugins
-{
-- my $shredder = shift;
--
-- my @res;
-- foreach my $str( @{ $opt{'plugin'} } ) {
-- my $plugin = RT::Shredder::Plugin->new;
-- my( $status, $msg ) = $plugin->LoadByString( $str );
-- unless( $status ) {
-- print STDERR "Couldn't load plugin\n";
-- print STDERR "Error: $msg\n";
-- exit(1);
-- }
+- my $shredder = shift;
+-
+- my @res;
+- foreach my $str( @{ $opt{'plugin'} } ) {
+- my $plugin = RT::Shredder::Plugin->new;
+- my( $status, $msg ) = $plugin->LoadByString( $str );
+- unless( $status ) {
+- print STDERR "Couldn't load plugin\n";
+- print STDERR "Error: $msg\n";
+- exit(1);
+- }
- if ( lc $plugin->Type eq 'search' ) {
- push @res, _process_search_plugin( $shredder, $plugin );
- }
- elsif ( lc $plugin->Type eq 'dump' ) {
- _process_dump_plugin( $shredder, $plugin );
- }
-- }
-- return RT::Shredder->CastObjectsToRecords( Objects => \@res );
+- }
+- return RT::Shredder->CastObjectsToRecords( Objects => \@res );
-}
-
-sub _process_search_plugin {
@@ -12859,31 +13873,31 @@ index 0198ab0..0000000
-
-sub show_plugin_list
-{
-- print "Plugins list:\n";
-- print "\t$_\n" foreach( grep !/^Base$/, keys %plugins );
-- exit(1);
+- print "Plugins list:\n";
+- print "\t$_\n" foreach( grep !/^Base$/, keys %plugins );
+- exit(1);
-}
-
-sub show_plugin_help
-{
-- my( $name ) = @_;
-- require RT::Shredder::POD;
-- unless( $plugins{ $name } ) {
-- print "Couldn't find plugin '$name'\n";
-- show_plugin_list();
-- }
-- RT::Shredder::POD::plugin_cli( $plugins{'Base'}, \*STDOUT, 1 );
-- RT::Shredder::POD::plugin_cli( $plugins{ $name }, \*STDOUT );
-- exit(1);
+- my( $name ) = @_;
+- require RT::Shredder::POD;
+- unless( $plugins{ $name } ) {
+- print "Couldn't find plugin '$name'\n";
+- show_plugin_list();
+- }
+- RT::Shredder::POD::plugin_cli( $plugins{'Base'}, \*STDOUT, 1 );
+- RT::Shredder::POD::plugin_cli( $plugins{ $name }, \*STDOUT );
+- exit(1);
-}
-
-exit(0);
diff --git a/sbin/rt-test-dependencies b/sbin/rt-test-dependencies
deleted file mode 100755
-index 63a0956..0000000
+index 7da4d31..0000000
--- a/sbin/rt-test-dependencies
+++ /dev/null
-@@ -1,694 +0,0 @@
+@@ -1,652 +0,0 @@
-#!/usr/bin/perl
-# BEGIN BPS TAGGED BLOCK {{{
-#
@@ -12950,26 +13964,20 @@ index 63a0956..0000000
-
-GetOptions(
- \%args, 'v|verbose',
-- 'install!', 'with-MYSQL',
-- 'with-POSTGRESQL|with-pg|with-pgsql', 'with-SQLITE',
-- 'with-ORACLE', 'with-FASTCGI',
-- 'with-MODPERL1', 'with-MODPERL2',
-- 'with-STANDALONE',
+- 'install!',
+- 'with-MYSQL', 'with-PG', 'with-SQLITE', 'with-ORACLE',
+- 'with-FASTCGI', 'with-MODPERL1', 'with-MODPERL2', 'with-STANDALONE',
-
-- 'with-DEV',
+- 'with-DEVELOPER',
-
- 'with-GPG',
- 'with-ICAL',
-- 'with-SMTP',
- 'with-GRAPHVIZ',
- 'with-GD',
- 'with-DASHBOARDS',
- 'with-USERLOGO',
-- 'with-SSL-MAILGATE',
- 'with-HTML-DOC',
-
-- 'download=s',
-- 'repository=s',
- 'list-deps',
- 'help|h',
-);
@@ -12982,20 +13990,17 @@ index 63a0956..0000000
-
-# Set up defaults
-my %default = (
-- 'with-MASON' => 1,
-- 'with-PSGI' => 1,
- 'with-CORE' => 1,
- 'with-CLI' => 1,
- 'with-MAILGATE' => 1,
-- 'with-DEV' => 0,
+- 'with-DEVELOPER' => 0,
- 'with-GPG' => 1,
+- 'with-SMIME' => 1,
- 'with-ICAL' => 1,
-- 'with-SMTP' => 1,
- 'with-GRAPHVIZ' => 1,
- 'with-GD' => 1,
- 'with-DASHBOARDS' => 1,
- 'with-USERLOGO' => 1,
-- 'with-SSL-MAILGATE' => 0,
- 'with-HTML-DOC' => 0,
-);
-$args{$_} = $default{$_} foreach grep !exists $args{$_}, keys %default;
@@ -13053,6 +14058,10 @@ index 63a0956..0000000
- 0, $module->{error} );
- }
- }
+-
+- print "\nPerl library path for /usr/bin/perl:\n";
+- print " $_\n" for @INC;
+-
- exit 1;
- }
-}
@@ -13075,125 +14084,124 @@ index 63a0956..0000000
-}
-
-$deps{'CORE'} = [ text_to_hash( << '.') ];
+-Apache::Session 1.53
+-CGI 3.38
+-CGI::Cookie 1.20
+-CGI::Emulate::PSGI
+-CGI::PSGI 0.12
-Class::Accessor 0.34
+-Crypt::Eksblowfish
+-CSS::Squish 0.06
+-Data::GUID
+-Date::Extract 0.02
+-Date::Manip
-DateTime 0.44
+-DateTime::Format::Natural 0.67
-DateTime::Locale 0.40
+-DBI 1.37
+-DBIx::SearchBuilder 1.65
+-Devel::GlobalDestruction
+-Devel::StackTrace 1.19
-Digest::base
-Digest::MD5 2.27
-Digest::SHA
--DBI 1.37
--Class::ReturnValue 0.40
--DBIx::SearchBuilder 1.59
--Text::Template 1.44
+-Email::Address 1.897
+-Email::Address::List 0.02
+-Encode 2.39
+-Errno
+-File::Glob
-File::ShareDir
-File::Spec 0.8
+-File::Temp 0.19
+-HTML::Entities
+-HTML::FormatText::WithLinks 0.14
+-HTML::FormatText::WithLinks::AndTables
+-HTML::Mason 1.43
+-HTML::Mason::PSGIHandler 0.52
-HTML::Quoted
+-HTML::RewriteAttributes 0.05
-HTML::Scrubber 0.08
--HTML::TreeBuilder
--HTML::FormatText
--Log::Dispatch 2.23
--Sys::Syslog 0.16
+-HTTP::Message 6.0
+-IPC::Run3
+-JSON
+-LWP::Simple
+-List::MoreUtils
-Locale::Maketext 1.06
+-Locale::Maketext::Fuzzy 0.11
-Locale::Maketext::Lexicon 0.32
--Locale::Maketext::Fuzzy
--MIME::Entity 5.425
+-Log::Dispatch 2.30
+-Mail::Header 2.12
-Mail::Mailer 1.57
--Email::Address
--Text::Wrapper
--Time::ParseDate
--Time::HiRes
--File::Temp 0.19
--Text::Quoted 2.02
--Tree::Simple 1.04
--UNIVERSAL::require
--Regexp::Common
--Scalar::Util
+-MIME::Entity 5.504
+-Module::Refresh 0.03
-Module::Versions::Report 1.05
--Cache::Simple::TimedExpiry
--Encode 2.39
--CSS::Squish 0.06
--File::Glob
--Devel::StackTrace 1.19
--Text::Password::Pronounceable
--Devel::GlobalDestruction
--List::MoreUtils
-Net::CIDR
+-Plack 1.0002
+-Plack::Handler::Starlet
+-Regexp::Common
-Regexp::Common::net::CIDR
-Regexp::IPv6
--.
--
--$deps{'MASON'} = [ text_to_hash( << '.') ];
--HTML::Mason 1.43
--Errno
--Digest::MD5 2.27
--CGI::Cookie 1.20
+-Role::Basic 0.12
+-Scalar::Util
-Storable 2.08
--Apache::Session 1.53
--XML::RSS 1.05
+-Symbol::Global::Name 0.04
+-Sys::Syslog 0.16
+-Text::Password::Pronounceable
+-Text::Quoted 2.07
+-Text::Template 1.44
-Text::WikiFormat 0.76
--CSS::Squish 0.06
--Devel::StackTrace 1.19
--JSON
--IPC::Run3
--.
--
--$deps{'PSGI'} = [ text_to_hash( << '.') ];
--CGI 3.38
--CGI::PSGI 0.12
--HTML::Mason::PSGIHandler 0.52
--Plack 0.9971
--Plack::Handler::Starlet
--CGI::Emulate::PSGI
+-Text::Wrapper
+-Time::HiRes
+-Time::ParseDate
+-Tree::Simple 1.04
+-UNIVERSAL::require
+-XML::RSS 1.05
-.
--set_dep( PSGI => CGI => 4.00 ) if $] > 5.019003;
--
+-set_dep( CORE => 'Symbol::Global::Name' => 0.05 ) if $] >= 5.019003;
+-set_dep( CORE => CGI => 4.00 ) if $] > 5.019003;
-
-$deps{'MAILGATE'} = [ text_to_hash( << '.') ];
--Getopt::Long
--LWP::UserAgent
--Pod::Usage
--.
--
--$deps{'SSL-MAILGATE'} = [ text_to_hash( << '.') ];
--Crypt::SSLeay
--Net::SSL
--LWP::UserAgent 6.0
+-Crypt::SSLeay
+-Getopt::Long
-LWP::Protocol::https
+-LWP::UserAgent 6.0
-Mozilla::CA
+-Net::SSL
+-Pod::Usage
-.
-
-$deps{'CLI'} = [ text_to_hash( << '.') ];
-Getopt::Long 2.24
--LWP
-HTTP::Request::Common
--Text::ParseWords
--Term::ReadLine
+-LWP
-Term::ReadKey
+-Term::ReadLine
+-Text::ParseWords
-.
-
--$deps{'DEV'} = [ text_to_hash( << '.') ];
+-$deps{'DEVELOPER'} = [ text_to_hash( << '.') ];
-Email::Abstract
--Test::Email
--HTML::Form
--HTML::TokeParser
--WWW::Mechanize 1.52
--Test::WWW::Mechanize 1.30
--Module::Refresh 0.03
--Test::Expect 0.31
--XML::Simple
-File::Find
--Test::Deep 0 # needed for shredder tests
--String::ShellQuote 0 # needed for gnupg-incoming.t
--Log::Dispatch::Perl
--Test::Warn
--Test::Builder 0.90 # needed for is_passing
--Test::MockTime
+-File::Which
+-Locale::PO
-Log::Dispatch::Perl
--Test::WWW::Mechanize::PSGI
+-Mojo::DOM
-Plack::Middleware::Test::StashWarnings 0.08
+-Set::Tiny
+-String::ShellQuote 0 # needed for gnupg-incoming.t
+-Test::Builder 0.90 # needed for is_passing
+-Test::Deep 0 # needed for shredder tests
+-Test::Email
+-Test::Expect 0.31
-Test::LongString
+-Test::MockTime
-Test::NoWarnings
--Locale::PO
+-Test::Pod
+-Test::Warn
+-Test::WWW::Mechanize 1.30
+-Test::WWW::Mechanize::PSGI
+-WWW::Mechanize 1.52
+-XML::Simple
-.
-
-$deps{'FASTCGI'} = [ text_to_hash( << '.') ];
@@ -13202,13 +14210,12 @@ index 63a0956..0000000
-.
-
-$deps{'MODPERL1'} = [ text_to_hash( << '.') ];
--Apache::Request
-Apache::DBI 0.92
+-Apache::Request
-.
-
-$deps{'MODPERL2'} = [ text_to_hash( << '.') ];
-Apache::DBI
--HTML::Mason 1.36
-.
-
-$deps{'MYSQL'} = [ text_to_hash( << '.') ];
@@ -13219,7 +14226,7 @@ index 63a0956..0000000
-DBD::Oracle
-.
-
--$deps{'POSTGRESQL'} = [ text_to_hash( << '.') ];
+-$deps{'PG'} = [ text_to_hash( << '.') ];
-DBIx::SearchBuilder 1.66
-DBD::Pg 1.43
-.
@@ -13229,22 +14236,25 @@ index 63a0956..0000000
-.
-
-$deps{'GPG'} = [ text_to_hash( << '.') ];
+-File::Which
-GnuPG::Interface
-PerlIO::eol
-.
-
--$deps{'ICAL'} = [ text_to_hash( << '.') ];
--Data::ICal
+-$deps{'SMIME'} = [ text_to_hash( << '.') ];
+-Crypt::X509
+-File::Which
+-String::ShellQuote
-.
-
--$deps{'SMTP'} = [ text_to_hash( << '.') ];
--Net::SMTP
+-$deps{'ICAL'} = [ text_to_hash( << '.') ];
+-Data::ICal
-.
-
-$deps{'DASHBOARDS'} = [ text_to_hash( << '.') ];
--HTML::RewriteAttributes 0.05
-MIME::Types
-URI 1.59
+-URI::QueryParam
-.
-
-$deps{'GRAPHVIZ'} = [ text_to_hash( << '.') ];
@@ -13254,7 +14264,7 @@ index 63a0956..0000000
-
-$deps{'GD'} = [ text_to_hash( << '.') ];
-GD
--GD::Graph
+-GD::Graph 1.47
-GD::Text
-.
-
@@ -13263,13 +14273,12 @@ index 63a0956..0000000
-.
-
-$deps{'HTML-DOC'} = [ text_to_hash( <<'.') ];
--Pod::Simple 3.24
-HTML::Entities
+-Pod::Simple 3.24
-.
-
-my %AVOID = (
- 'DBD::Oracle' => [qw(1.23)],
-- 'Email::Address' => [qw(1.893 1.894)],
- 'Devel::StackTrace' => [qw(1.28 1.29)],
-);
-
@@ -13349,7 +14358,7 @@ index 63a0956..0000000
- }
- else {
- no warnings 'deprecated';
-- eval "use $module $version ()";
+- eval "{ local \$ENV{__WARN__}; use $module $version () }";
- if ( my $error = $@ ) {
- return 0 unless wantarray;
-
@@ -13357,6 +14366,10 @@ index 63a0956..0000000
- $error =~ s/at \(eval \d+\) line \d+\.$//;
- undef $error if $error =~ /this is only/;
-
+- my $path = $module;
+- $path =~ s{::}{/}g;
+- undef $error if defined $error and $error =~ /^Can't locate $path\.pm in \@INC/;
+-
- return ( 0, $error );
- }
-
@@ -13438,66 +14451,25 @@ index 63a0956..0000000
- return scalar `$ext 1>&2`;
-}
-
--sub download_mods {
-- my %modules;
-- use CPAN;
--
-- foreach my $key (keys %deps) {
-- my @deps = (@{$deps{$key}});
-- while (@deps) {
-- my $mod = shift @deps;
-- my $ver = shift @deps;
-- next if ($mod =~ /^(DBD-|Apache-Request)/);
-- $modules{$mod} = $ver;
-- }
-- }
-- my @mods = keys %modules;
-- CPAN::get();
-- my $moddir = $args{'download'};
-- foreach my $mod (@mods) {
-- $CPAN::Config->{'build_dir'} = $moddir;
-- CPAN::get($mod);
-- }
--
-- opendir(DIR, $moddir);
-- while ( my $dir = readdir(DIR)) {
-- print "Dir is $dir\n";
-- next if ( $dir =~ /^\.\.?$/);
--
-- # Skip things we've previously tagged
-- my $out = `svn ls $args{'repository'}/tags/$dir`;
-- next if ($out);
--
-- if ($dir =~ /^(.*)-(.*?)$/) {
-- `svn_load_dirs -no_user_input -t tags/$dir -v $args{'repository'} dists/$1 $moddir/$dir`;
-- `rm -rf $moddir/$dir`;
--
-- }
--
-- }
-- closedir(DIR);
-- exit;
--}
--
-sub check_perl_version {
- section("perl");
-- eval {require 5.008003};
+- eval {require 5.010_001};
- if ($@) {
-- print_found("5.8.3", 0,"RT is known to be non-functional on versions of perl older than 5.8.3. Please upgrade to 5.8.3 or newer.");
+- print_found("5.10.1", 0, sprintf("RT requires Perl v5.10.1 or newer. Your current Perl is v%vd", $^V));
- exit(1);
- } else {
-- print_found( sprintf(">=5.8.3(%vd)", $^V), 1 );
+- print_found( sprintf(">=5.10.1(%vd)", $^V), 1 );
- }
-}
-
-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;
@@ -13544,35 +14516,35 @@ index 63a0956..0000000
-
-=item --with-mysql
-
-- database interface for mysql
+-database interface for mysql
-
--=item --with-postgresql
+-=item --with-pg
-
-- database interface for postgresql
+-database interface for postgresql
-
--=item with-oracle
--
-- database interface for oracle
+-=item --with-oracle
-
--=item with-sqlite
+-database interface for oracle
-
-- database interface and driver for sqlite (unsupported)
+-=item --with-sqlite
-
--=item with-fastcgi
+-database interface and driver for sqlite (unsupported)
-
-- libraries needed to support the fastcgi handler
+-=item --with-fastcgi
-
--=item with-modperl1
+-libraries needed to support the fastcgi handler
-
-- libraries needed to support the modperl 1 handler
+-=item --with-modperl1
-
--=item with-modperl2
+-libraries needed to support the modperl 1 handler
-
-- libraries needed to support the modperl 2 handler
+-=item --with-modperl2
-
--=item with-dev
+-libraries needed to support the modperl 2 handler
-
-- tools needed for RT development
+-=item --with-developer
+-
+-tools needed for RT development
-
-=back
-
@@ -13580,10 +14552,10 @@ index 63a0956..0000000
-
diff --git a/sbin/rt-validate-aliases b/sbin/rt-validate-aliases
deleted file mode 100755
-index e4be013..0000000
+index 4af6188..0000000
--- a/sbin/rt-validate-aliases
+++ /dev/null
-@@ -1,343 +0,0 @@
+@@ -1,373 +0,0 @@
-#!/usr/bin/perl
-# BEGIN BPS TAGGED BLOCK {{{
-#
@@ -13650,6 +14622,7 @@ index e4be013..0000000
- }
- unshift @INC, $lib;
- }
+-
-}
-
-require RT;
@@ -13758,7 +14731,7 @@ index e4be013..0000000
-
- if (not $value) {
- my @other = grep {$_ ne $global{$setting}} @{$seen{lc $q->Name}{$action} || []};
-- warn "CorrespondAddress not set on $qname, but in aliases as "
+- warn "$setting not set on $qname, but in aliases as "
- .join(" and ", @other) . "\n" if @other;
- next;
- }
@@ -13927,12 +14900,41 @@ index e4be013..0000000
- return ();
- }
-}
+-
+-__END__
+-
+-=head1 NAME
+-
+-rt-validate-aliases - Check an MTA alias file against RT queue configuration
+-
+-=head1 SYNOPSIS
+-
+-rt-validate-aliases [options] /etc/aliases
+-
+-=head1 OPTIONS
+-
+-=over
+-
+-=item C<--prefix>
+-
+-An expected address prefix used in the alias file
+-
+-=item C<--url>
+-
+-The root URL of your RT server (the same URL you expect to be passed to
+-rt-mailgate)
+-
+-=item C<--host>
+-
+-The host part of your RT email addresses
+-
+-=back
diff --git a/sbin/rt-validator b/sbin/rt-validator
deleted file mode 100755
-index 84208a2..0000000
+index 1210d88..0000000
--- a/sbin/rt-validator
+++ /dev/null
-@@ -1,1182 +0,0 @@
+@@ -1,1464 +0,0 @@
-#!/usr/bin/perl
-# BEGIN BPS TAGGED BLOCK {{{
-#
@@ -13985,23 +14987,15 @@ index 84208a2..0000000
-use warnings;
-
-# fix lib paths, some may be relative
--BEGIN {
+-BEGIN { # BEGIN RT CMD BOILERPLATE
- require File::Spec;
+- require Cwd;
- my @libs = ("lib", "local/lib");
- my $bin_path;
-
- for my $lib (@libs) {
- unless ( File::Spec->file_name_is_absolute($lib) ) {
-- unless ($bin_path) {
-- if ( File::Spec->file_name_is_absolute(__FILE__) ) {
-- $bin_path = ( File::Spec->splitpath(__FILE__) )[1];
-- }
-- else {
-- require FindBin;
-- no warnings "once";
-- $bin_path = $FindBin::Bin;
-- }
-- }
+- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1];
- $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib );
- }
- unshift @INC, $lib;
@@ -14018,22 +15012,22 @@ index 84208a2..0000000
- 'force',
- 'verbose|v',
- 'help|h',
+- 'links-only',
-);
-
-if ( $opt{help} || !$opt{check} ) {
- require Pod::Usage;
- print Pod::Usage::pod2usage( { verbose => 2 } );
-- exit;
+- exit 2;
-}
-
-usage_warning() if $opt{'resolve'} && !$opt{'force'};
-
--
-sub usage_warning {
- print <<END;
-This utility can fix some issues with DB by creating or updating. In some
--cases there is no enough data to resurect a missing record, but records which
--refers to a missing can be deleted. It's up to you to decide what to do.
+-cases there is not enough data to resurect a missing record, but records which
+-refer to a missing record can be deleted. It's up to you to decide what to do.
-
-In any case it's highly recommended to have a backup before resolving anything.
-
@@ -14058,6 +15052,7 @@ index 84208a2..0000000
-
-my @models = qw(
- ACE
+- Article
- Attachment
- Attribute
- CachedGroupMember
@@ -14073,6 +15068,7 @@ index 84208a2..0000000
- ScripAction
- ScripCondition
- Scrip
+- ObjectScrip
- Template
- Ticket
- Transaction
@@ -14095,6 +15091,7 @@ index 84208a2..0000000
- Queues => [],
-
- Scrips => [],
+- ObjectScrips => [],
- ScripActions => [],
- ScripConditions => [],
- Templates => [],
@@ -14151,7 +15148,7 @@ index 84208a2..0000000
- ." The script can either create the missing record in Principals"
- ." or delete the record in $table.";
- my ($type) = ($table =~ /^(.*)s$/);
-- check_integrity(
+- return check_integrity(
- $table, 'id' => 'Principals', 'id',
- join_condition => 't.PrincipalType = ?',
- bind_values => [ $type ],
@@ -14179,7 +15176,7 @@ index 84208a2..0000000
- ." In some cases it's possible to manually resurrect such records,"
- ." but this utility can only delete records.";
-
-- check_integrity(
+- return check_integrity(
- 'Principals', 'id' => $table, 'id',
- condition => 's.PrincipalType = ?',
- bind_values => [ $table =~ /^(.*)s$/ ],
@@ -14194,8 +15191,9 @@ index 84208a2..0000000
-}
-
-push @CHECKS, 'User <-> ACL equivalence group' => sub {
+- my $res = 1;
- # from user to group
-- check_integrity(
+- $res *= check_integrity(
- 'Users', 'id' => 'Groups', 'Instance',
- join_condition => 't.Domain = ? AND t.Type = ?',
- bind_values => [ 'ACLEquivalence', 'UserEquiv' ],
@@ -14211,7 +15209,7 @@ index 84208a2..0000000
- },
- );
- # from group to user
-- check_integrity(
+- $res *= check_integrity(
- 'Groups', 'Instance' => 'Users', 'id',
- condition => 's.Domain = ? AND s.Type = ?',
- bind_values => [ 'ACLEquivalence', 'UserEquiv' ],
@@ -14225,25 +15223,27 @@ index 84208a2..0000000
- },
- );
- # one ACL equiv group for each user
-- check_uniqueness(
+- $res *= check_uniqueness(
- 'Groups',
- columns => ['Instance'],
- condition => '.Domain = ? AND .Type = ?',
- bind_values => [ 'ACLEquivalence', 'UserEquiv' ],
- );
+- return $res;
-};
-
-# check integrity of Queue role groups
-push @CHECKS, 'Queues <-> Role Groups' => sub {
- # XXX: we check only that there is at least one group for a queue
- # from queue to group
-- check_integrity(
+- my $res = 1;
+- $res *= check_integrity(
- 'Queues', 'id' => 'Groups', 'Instance',
- join_condition => 't.Domain = ?',
- bind_values => [ 'RT::Queue-Role' ],
- );
- # from group to queue
-- check_integrity(
+- $res *= check_integrity(
- 'Groups', 'Instance' => 'Queues', 'id',
- condition => 's.Domain = ?',
- bind_values => [ 'RT::Queue-Role' ],
@@ -14256,19 +15256,21 @@ index 84208a2..0000000
- delete_record( 'Groups', $id );
- },
- );
+- return $res;
-};
-
-# check integrity of Ticket role groups
-push @CHECKS, 'Tickets <-> Role Groups' => sub {
- # XXX: we check only that there is at least one group for a queue
- # from queue to group
-- check_integrity(
+- my $res = 1;
+- $res *= check_integrity(
- 'Tickets', 'id' => 'Groups', 'Instance',
- join_condition => 't.Domain = ?',
- bind_values => [ 'RT::Ticket-Role' ],
- );
- # from group to ticket
-- check_integrity(
+- $res *= check_integrity(
- 'Groups', 'Instance' => 'Tickets', 'id',
- condition => 's.Domain = ?',
- bind_values => [ 'RT::Ticket-Role' ],
@@ -14281,12 +15283,13 @@ index 84208a2..0000000
- delete_record( 'Groups', $id );
- },
- );
+- return $res;
-};
-
-# additional CHECKS on groups
-push @CHECKS, 'Role Groups (Instance, Type) uniqueness' => sub {
- # Check that Domain, Instance and Type are unique
-- check_uniqueness(
+- return check_uniqueness(
- 'Groups',
- columns => ['Domain', 'Instance', 'Type'],
- condition => '.Domain LIKE ?',
@@ -14295,7 +15298,7 @@ index 84208a2..0000000
-};
-
-push @CHECKS, 'System internal group uniqueness' => sub {
-- check_uniqueness(
+- return check_uniqueness(
- 'Groups',
- columns => ['Instance', 'Type'],
- condition => '.Domain = ?',
@@ -14305,7 +15308,7 @@ index 84208a2..0000000
-
-# CHECK that user defined group names are unique
-push @CHECKS, 'User Defined Group Name uniqueness' => sub {
-- check_uniqueness(
+- return check_uniqueness(
- 'Groups',
- columns => ['Name'],
- condition => '.Domain = ?',
@@ -14329,7 +15332,8 @@ index 84208a2..0000000
- my $msg = "A record in GroupMembers references an object that doesn't exist."
- ." Maybe you deleted a group or principal directly from the database?"
- ." Usually it's OK to delete such records.";
-- check_integrity(
+- my $res = 1;
+- $res *= check_integrity(
- 'GroupMembers', 'GroupId' => 'Groups', 'id',
- action => sub {
- my $id = shift;
@@ -14338,7 +15342,7 @@ index 84208a2..0000000
- delete_record( 'GroupMembers', $id );
- },
- );
-- check_integrity(
+- $res *= check_integrity(
- 'GroupMembers', 'MemberId' => 'Principals', 'id',
- action => sub {
- my $id = shift;
@@ -14347,12 +15351,14 @@ index 84208a2..0000000
- delete_record( 'GroupMembers', $id );
- },
- );
+- return $res;
-};
-
-# CGM and GM
-push @CHECKS, 'CGM vs. GM' => sub {
+- my $res = 1;
- # all GM record should be duplicated in CGM
-- check_integrity(
+- $res *= check_integrity(
- GroupMembers => ['GroupId', 'MemberId'],
- CachedGroupMembers => ['GroupId', 'MemberId'],
- join_condition => 't.ImmediateParentId = t.GroupId AND t.Via = t.id',
@@ -14375,7 +15381,7 @@ index 84208a2..0000000
- },
- );
- # all first level CGM records should have a GM record
-- check_integrity(
+- $res *= check_integrity(
- CachedGroupMembers => ['GroupId', 'MemberId'],
- GroupMembers => ['GroupId', 'MemberId'],
- condition => 's.ImmediateParentId = s.GroupId AND s.Via = s.id AND s.GroupId != s.MemberId',
@@ -14391,7 +15397,7 @@ index 84208a2..0000000
- },
- );
- # each group should have a CGM record where MemberId == GroupId
-- check_integrity(
+- $res *= check_integrity(
- Groups => ['id', 'id'],
- CachedGroupMembers => ['GroupId', 'MemberId'],
- join_condition => 't.ImmediateParentId = t.GroupId AND t.Via = t.id',
@@ -14418,7 +15424,7 @@ index 84208a2..0000000
-
- # and back, each record in CGM with MemberId == GroupId without exceptions
- # should reference a group
-- check_integrity(
+- $res *= check_integrity(
- CachedGroupMembers => ['GroupId', 'MemberId'],
- Groups => ['id', 'id'],
- condition => "s.GroupId = s.MemberId",
@@ -14433,7 +15439,7 @@ index 84208a2..0000000
- },
- );
- # Via
-- check_integrity(
+- $res *= check_integrity(
- CachedGroupMembers => 'Via',
- CachedGroupMembers => 'id',
- action => sub {
@@ -14449,7 +15455,7 @@ index 84208a2..0000000
-
- # for every CGM where ImmediateParentId != GroupId there should be
- # matching parent record (first level)
-- check_integrity(
+- $res *= check_integrity(
- CachedGroupMembers => ['ImmediateParentId', 'MemberId'],
- CachedGroupMembers => ['GroupId', 'MemberId'],
- join_condition => 't.Via = t.id',
@@ -14467,7 +15473,7 @@ index 84208a2..0000000
-
- # for every CGM where ImmediateParentId != GroupId there should be
- # matching "grand" parent record
-- check_integrity(
+- $res *= check_integrity(
- CachedGroupMembers => ['GroupId', 'ImmediateParentId', 'Via'],
- CachedGroupMembers => ['GroupId', 'MemberId', 'id'],
- condition => 's.ImmediateParentId != s.GroupId',
@@ -14513,6 +15519,7 @@ index 84208a2..0000000
-
- my $sth = execute_query( $query );
- while ( my ($g, $m, $via, $ip, $dis) = $sth->fetchrow_array ) {
+- $res = 0;
- print STDERR "Principal #$m is member of #$ip when #$ip is member of #$g,";
- print STDERR " but there is no cached GM record that $m is member of #$g.\n";
- $action->(
@@ -14521,11 +15528,14 @@ index 84208a2..0000000
- );
- }
- }
+-
+- return $res;
-};
-
-# Tickets
-push @CHECKS, 'Tickets -> other' => sub {
-- check_integrity(
+- my $res = 1;
+- $res *= check_integrity(
- 'Tickets', 'EffectiveId' => 'Tickets', 'id',
- action => sub {
- my $id = shift;
@@ -14537,19 +15547,34 @@ index 84208a2..0000000
- delete_record( 'Tickets', $id );
- },
- );
-- check_integrity(
+- $res *= check_integrity(
- 'Tickets', 'Queue' => 'Queues', 'id',
- );
-- check_integrity(
+- $res *= check_integrity(
- 'Tickets', 'Owner' => 'Users', 'id',
+- action => sub {
+- my ($id, %prop) = @_;
+- return unless my $replace_with = prompt_integer(
+- 'Replace',
+- "Column Owner should point to a user, but there is record #$id in Tickets\n"
+- ."where it's not true. It's ok to replace these wrong references with id of any user.\n"
+- ."Note that id you enter is not checked. You can pick any user from your DB, but it's\n"
+- ."may be better to create a special user for this, for example 'user_that_has_been_deleted'\n"
+- ."or something like that.",
+- "Tickets.Owner -> user #$prop{Owner}"
+- );
+- update_records( 'Tickets', { id => $id, Owner => $prop{Owner} }, { Owner => $replace_with } );
+- },
- );
- # XXX: check that owner is only member of owner role group
+- return $res;
-};
-
-
-push @CHECKS, 'Transactions -> other' => sub {
+- my $res = 1;
- foreach my $model ( @models ) {
-- check_integrity(
+- $res *= check_integrity(
- 'Transactions', 'ObjectId' => m2t($model), 'id',
- condition => 's.ObjectType = ?',
- bind_values => [ "RT::$model" ],
@@ -14564,13 +15589,13 @@ index 84208a2..0000000
- );
- }
- # type = CustomField
-- check_integrity(
+- $res *= check_integrity(
- 'Transactions', 'Field' => 'CustomFields', 'id',
- condition => 's.Type = ?',
- bind_values => [ 'CustomField' ],
- );
- # type = Take, Untake, Force, Steal or Give
-- check_integrity(
+- $res *= check_integrity(
- 'Transactions', 'OldValue' => 'Users', 'id',
- condition => 's.Type IN (?, ?, ?, ?, ?)',
- bind_values => [ qw(Take Untake Force Steal Give) ],
@@ -14584,7 +15609,7 @@ index 84208a2..0000000
- delete_record( 'Transactions', $id );
- },
- );
-- check_integrity(
+- $res *= check_integrity(
- 'Transactions', 'NewValue' => 'Users', 'id',
- condition => 's.Type IN (?, ?, ?, ?, ?)',
- bind_values => [ qw(Take Untake Force Steal Give) ],
@@ -14599,7 +15624,7 @@ index 84208a2..0000000
- },
- );
- # type = DelWatcher
-- check_integrity(
+- $res *= check_integrity(
- 'Transactions', 'OldValue' => 'Principals', 'id',
- condition => 's.Type = ?',
- bind_values => [ 'DelWatcher' ],
@@ -14614,7 +15639,7 @@ index 84208a2..0000000
- },
- );
- # type = AddWatcher
-- check_integrity(
+- $res *= check_integrity(
- 'Transactions', 'NewValue' => 'Principals', 'id',
- condition => 's.Type = ?',
- bind_values => [ 'AddWatcher' ],
@@ -14629,22 +15654,11 @@ index 84208a2..0000000
- },
- );
-
--# XXX: Links need more love, uri is stored instead of id
--# # type = DeleteLink
--# check_integrity(
--# 'Transactions', 'OldValue' => 'Links', 'id',
--# condition => 's.Type = ?',
--# bind_values => [ 'DeleteLink' ],
--# );
--# # type = AddLink
--# check_integrity(
--# 'Transactions', 'NewValue' => 'Links', 'id',
--# condition => 's.Type = ?',
--# bind_values => [ 'AddLink' ],
--# );
+-# type = DeleteLink or AddLink
+-# handled in 'Links: *' checks as {New,Old}Value store URIs
-
- # type = Set, Field = Queue
-- check_integrity(
+- $res *= check_integrity(
- 'Transactions', 'NewValue' => 'Queues', 'id',
- condition => 's.Type = ? AND s.Field = ?',
- bind_values => [ 'Set', 'Queue' ],
@@ -14658,7 +15672,7 @@ index 84208a2..0000000
- delete_record( 'Transactions', $id );
- },
- );
-- check_integrity(
+- $res *= check_integrity(
- 'Transactions', 'OldValue' => 'Queues', 'id',
- condition => 's.Type = ? AND s.Field = ?',
- bind_values => [ 'Set', 'Queue' ],
@@ -14673,17 +15687,19 @@ index 84208a2..0000000
- },
- );
- # Reminders
-- check_integrity(
+- $res *= check_integrity(
- 'Transactions', 'NewValue' => 'Tickets', 'id',
- join_condition => 't.Type = ?',
- condition => 's.Type IN (?, ?, ?)',
- bind_values => [ 'reminder', 'AddReminder', 'OpenReminder', 'ResolveReminder' ],
- );
+- return $res;
-};
-
-# Attachments
-push @CHECKS, 'Attachments -> other' => sub {
-- check_integrity(
+- my $res = 1;
+- $res *= check_integrity(
- Attachments => 'TransactionId', Transactions => 'id',
- action => sub {
- my $id = shift;
@@ -14693,7 +15709,7 @@ index 84208a2..0000000
- delete_record( 'Attachments', $id );
- },
- );
-- check_integrity(
+- $res *= check_integrity(
- Attachments => 'Parent', Attachments => 'id',
- action => sub {
- my $id = shift;
@@ -14703,64 +15719,75 @@ index 84208a2..0000000
- delete_record( 'Attachments', $id );
- },
- );
-- check_integrity(
+- $res *= check_integrity(
- Attachments => 'Parent',
- Attachments => 'id',
- join_condition => 's.TransactionId = t.TransactionId',
- );
+- return $res;
-};
-
-push @CHECKS, 'CustomFields and friends' => sub {
+- my $res = 1;
- #XXX: ObjectCustomFields needs more love
-- check_integrity(
+- $res *= check_integrity(
- 'CustomFieldValues', 'CustomField' => 'CustomFields', 'id',
- );
-- check_integrity(
+- $res *= check_integrity(
- 'ObjectCustomFieldValues', 'CustomField' => 'CustomFields', 'id',
- );
- foreach my $model ( @models ) {
-- check_integrity(
+- $res *= check_integrity(
- 'ObjectCustomFieldValues', 'ObjectId' => m2t($model), 'id',
- condition => 's.ObjectType = ?',
- bind_values => [ "RT::$model" ],
- );
- }
+- return $res;
-};
-
-push @CHECKS, Templates => sub {
-- check_integrity(
+- return check_integrity(
- 'Templates', 'Queue' => 'Queues', 'id',
- );
-};
-
-push @CHECKS, Scrips => sub {
-- check_integrity(
-- 'Scrips', 'Queue' => 'Queues', 'id',
-- );
-- check_integrity(
+- my $res = 1;
+- $res *= check_integrity(
- 'Scrips', 'ScripCondition' => 'ScripConditions', 'id',
- );
-- check_integrity(
+- $res *= check_integrity(
- 'Scrips', 'ScripAction' => 'ScripActions', 'id',
- );
-- check_integrity(
-- 'Scrips', 'Template' => 'Templates', 'id',
+- $res *= check_integrity(
+- 'Scrips', 'Template' => 'Templates', 'Name',
- );
+- $res *= check_integrity(
+- 'ObjectScrips', 'Scrip' => 'Scrips', 'id',
+- );
+- $res *= check_integrity(
+- 'ObjectScrips', 'ObjectId' => 'Queues', 'id',
+- );
+- return $res;
-};
-
-push @CHECKS, Attributes => sub {
+- my $res = 1;
- foreach my $model ( @models ) {
-- check_integrity(
+- $res *= check_integrity(
- 'Attributes', 'ObjectId' => m2t($model), 'id',
- condition => 's.ObjectType = ?',
- bind_values => [ "RT::$model" ],
- );
- }
+- return $res;
-};
-
-# Fix situations when Creator or LastUpdatedBy references ACL equivalence
-# group of a user instead of user
-push @CHECKS, 'FIX: LastUpdatedBy and Creator' => sub {
+- my $res = 1;
- my %fix = ();
- foreach my $model ( @models ) {
- my $class = "RT::$model";
@@ -14790,6 +15817,7 @@ index 84208a2..0000000
-
- my $sth = execute_query( $query, 'ACLEquivalence', 'UserEquiv' );
- while ( my ($rid, $gid, $uid) = $sth->fetchrow_array ) {
+- $res = 0;
- print STDERR "Record #$rid in $table refers to ACL equivalence group #$gid of user #$uid";
- print STDERR " when must reference user.\n";
- $action->( $gid, $uid );
@@ -14812,16 +15840,18 @@ index 84208a2..0000000
- }
- $redo_check{'FIX: LastUpdatedBy and Creator'} = 1;
- }
+- return $res;
-};
-
-push @CHECKS, 'LastUpdatedBy and Creator' => sub {
+- my $res = 1;
- foreach my $model ( @models ) {
- my $class = "RT::$model";
- my $object = $class->new( RT->SystemUser );
- my $table = $object->Table;
- foreach my $column ( qw(LastUpdatedBy Creator) ) {
- next unless $object->_Accessible( $column, 'auto' );
-- check_integrity(
+- $res *= check_integrity(
- $table, $column => 'Users', 'id',
- action => sub {
- my ($id, %prop) = @_;
@@ -14839,13 +15869,209 @@ index 84208a2..0000000
- );
- }
- }
+- return $res;
+-};
+-
+-push @CHECKS, 'Links: wrong organization' => sub {
+- my $res = 1;
+- my @URI_USES = (
+- { model => 'Transaction', column => 'OldValue', Additional => { Type => 'DeleteLink' } },
+- { model => 'Transaction', column => 'NewValue', Additional => { Type => 'AddLink' } },
+- { model => 'Link', column => 'Target' },
+- { model => 'Link', column => 'Base' },
+- );
+-
+- my @rt_uris = rt_uri_modules();
+- foreach my $package (@rt_uris) {
+-
+- my $rt_uri = $package->new( $RT::SystemUser );
+- my $scheme = $rt_uri->Scheme;
+- my $prefix = $rt_uri->LocalURIPrefix;
+-
+- foreach my $use ( @URI_USES ) {
+- my $table = m2t( $use->{'model'} );
+- my $column = $use->{'column'};
+-
+- my $query = "SELECT id, $column FROM $table WHERE"
+- . " $column LIKE ? AND $column NOT LIKE ?";
+- my @binds = ($scheme ."://%", $prefix ."%");
+-
+- while ( my ($k, $v) = each %{ $use->{'Additional'} || {} } ) {
+- $query .= " AND $k = ?";
+- push @binds, $v;
+- }
+- my $sth = execute_query( $query, @binds );
+- while ( my ($id, $value) = $sth->fetchrow_array ) {
+- $res = 0;
+- print STDERR "Record #$id in $table. Value of $column column most probably is an incorrect link\n";
+- my ($wrong_org) = ( $value =~ m{^\Q$scheme\E://(.+)/[^/]+/[0-9]*$} );
+- next unless my $replace_with = prompt(
+- 'Replace',
+- "Column $column in $table is a link. Local links has scheme '$scheme'"
+- ." followed by organization name from the config file. There is record"
+- ." #$id that has scheme '$scheme', but organization is '$wrong_org'."
+- ." Most probably you changed organization, but didn't update links."
+- ." It's ok to replace these wrong links.\n",
+- "Links: wrong organization $wrong_org"
+- );
+-
+- print "Updating record(s) in $table\n" if $opt{'verbose'};
+- 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 .'/%' );
+-
+- $redo_check{'Links: wrong organization'} = 1;
+- $redo_check{'Links: LocalX for non-ticket'} = 1;
+- last; # plenty of chances we covered all cases with one update
+- }
+- }
+- } # end foreach my $package (@rt_uris)
+- return $res;
+-};
+-
+-push @CHECKS, 'Links: LocalX for non-ticket' => sub {
+- my $res = 1;
+- my $rt_uri = RT::URI::fsck_com_rt->new( $RT::SystemUser );
+- my $scheme = $rt_uri->Scheme;
+- my $prefix = $rt_uri->LocalURIPrefix;
+- my $table = m2t('Link');
+-
+- foreach my $dir ( 'Target', 'Base' ) {
+- # 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 $sth = execute_query( "SELECT id FROM $table WHERE $where", @binds );
+- while ( my ($id, $value) = $sth->fetchrow_array ) {
+- $res = 0;
+- print STDERR "Record #$id in $table. Value of Local$dir is not 0\n";
+- next unless my $replace_with = prompt(
+- 'Replace',
+- "Column Local$dir in $table should be 0 if $dir column is not link"
+- ." to a ticket. It's ok to replace with 0.\n",
+- );
+-
+- print "Updating record(s) in $table\n" if $opt{'verbose'};
+- execute_query( "UPDATE $table SET Local$dir = 0 WHERE $where", @binds );
+- $redo_check{'Links: wrong organization'} = 1;
+-
+- last; # we covered all cases with one update
+- }
+- }
+- return $res;
+-};
+-
+-push @CHECKS, 'Links: LocalX != X' => sub {
+- my $res = 1;
+- my $rt_uri = RT::URI::fsck_com_rt->new( $RT::SystemUser );
+- my $scheme = $rt_uri->Scheme;
+- my $prefix = $rt_uri->LocalURIPrefix .'/ticket/';
+- my $table = m2t('Link');
+-
+- foreach my $dir ( 'Target', 'Base' ) {
+- # we limit to $dir = */ticket/* so it doesn't conflict with previouse check
+- # previouse check is more important as there was a bug in RT when Local$dir
+- # was set for not tickets
+- # 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 $sth = execute_query( "SELECT id FROM $table WHERE $where", @binds );
+- while ( my ($id, $value) = $sth->fetchrow_array ) {
+- $res = 0;
+- print STDERR "Record #$id in $table. Value of $dir doesn't match ticket id in Local$dir\n";
+- next unless my $replace_with = prompt(
+- 'Replace',
+- "For ticket links column $dir in $table table should end with"
+- ." ticket id from Local$dir. It's probably ok to fix $dir column.\n",
+- );
+-
+- print "Updating record(s) in $table\n" if $opt{'verbose'};
+- execute_query(
+- "UPDATE $table SET $dir = ". sql_concat('?', "Local$dir") ." WHERE $where",
+- $prefix, @binds
+- );
+-
+- last; # we covered all cases with one update
+- }
+- }
+- return $res;
+-};
+-
+-push @CHECKS, 'Links: missing object' => sub {
+- my $res = 1;
+- my @URI_USES = (
+- { model => 'Transaction', column => 'OldValue', Additional => { Type => 'DeleteLink' } },
+- { model => 'Transaction', column => 'NewValue', Additional => { Type => 'AddLink' } },
+- { model => 'Link', column => 'Target' },
+- { model => 'Link', column => 'Base' },
+- );
+-
+- my @rt_uris = rt_uri_modules();
+- foreach my $package (@rt_uris) {
+-
+- my $rt_uri = $package->new( $RT::SystemUser );
+- my $scheme = $rt_uri->Scheme;
+- my $prefix = $rt_uri->LocalURIPrefix;
+-
+- foreach my $use ( @URI_USES ) {
+- my $stable = m2t( $use->{'model'} );
+- my $scolumn = $use->{'column'};
+-
+- foreach my $tmodel ( @models ) {
+- my $tclass = 'RT::'. $tmodel;
+- my $ttable = m2t($tmodel);
+-
+- my $tprefix = $prefix .'/'. ($tclass eq 'RT::Ticket'? 'ticket' : $tclass) .'/';
+-
+- $tprefix = $prefix . '/article/' if $tclass eq 'RT::Article';
+-
+- 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.'%');
+-
+- while ( my ($k, $v) = each %{ $use->{'Additional'} || {} } ) {
+- $query .= " AND s.$k = ?";
+- push @binds, $v;
+- }
+-
+- my $sth = execute_query( $query, @binds );
+- while ( my ($sid) = $sth->fetchrow_array ) {
+- $res = 0;
+- print STDERR "Link in $scolumn column in record #$sid in $stable table points"
+- ." to not existing object.\n";
+- next unless prompt(
+- 'Delete',
+- "Column $scolumn in $stable table is a link to an object that doesn't exist."
+- ." You can delete such records, however make sure there is no other"
+- ." errors with links.\n",
+- 'Link to a missing object in $ttable'
+- );
+-
+- delete_record($stable, $sid);
+- }
+- }
+- }
+- } # end foreach my $package (@rt_uris)
+- return $res;
-};
+-
+-
-my %CHECKS = @CHECKS;
-
- at do_check = do { my $i = 1; grep $i++%2, @CHECKS };
-
+-if ($opt{'links-only'}) {
+- @do_check = grep { /^Links:/ } @do_check;
+-}
+-
+-my $status = 1;
-while ( my $check = shift @do_check ) {
-- $CHECKS{ $check }->();
+- $status *= $CHECKS{ $check }->();
-
- foreach my $redo ( keys %redo_check ) {
- die "check $redo doesn't exist" unless $CHECKS{ $redo };
@@ -14854,6 +16080,19 @@ index 84208a2..0000000
- push @do_check, $redo;
- }
-}
+-exit 1 unless $status;
+-exit 0;
+-
+-=head2 check_integrity
+-
+-Takes two (table name, column(s)) pairs. First pair
+-is reference we check and second is destination that
+-must exist. Array reference can be used for multiple
+-columns.
+-
+-Returns 0 if a record is missing or 1 otherwise.
+-
+-=cut
-
-sub check_integrity {
- my ($stable, @scols) = (shift, shift);
@@ -14889,15 +16128,21 @@ index 84208a2..0000000
- push @binds, 0;
- }
-
+- my $res = 1;
+-
- my $sth = execute_query( $query, @binds );
- while ( my ($sid, @set) = $sth->fetchrow_array ) {
+- $res = 0;
+-
- print STDERR "Record #$sid in $stable references a nonexistent record in $ttable\n";
- for ( my $i = 0; $i < @scols; $i++ ) {
- print STDERR "\t$scols[$i] => '$set[$i]' => $tcols[$i]\n";
- }
- print STDERR "\t". describe( $stable, $sid ) ."\n";
-- $args{'action'}->( $sid, map { $scols[$_] => $set[$_] } (0 .. (@scols-1)) ) if $args{'action'};
+- $args{'action'}->( $sid, map { $scols[$_] => $set[$_] } (0 .. (@scols-1)) )
+- if $args{'action'};
- }
+- return $res;
-}
-
-sub describe {
@@ -14957,13 +16202,16 @@ index 84208a2..0000000
- $args{'bind_values'}? (@{ $args{'bind_values'} }, @{ $args{'bind_values'} }): (),
- $args{'extra_values'}? (@{ $args{'extra_values'} }): ()
- );
+- my $res = 1;
- while ( my ($sid, $tid, @set) = $sth->fetchrow_array ) {
+- $res = 0;
- print STDERR "Record #$tid in $on has the same set of values as $sid\n";
- for ( my $i = 0; $i < @columns; $i++ ) {
- print STDERR "\t$columns[$i] => '$set[$i]'\n";
- }
- $args{'action'}->( $tid, map { $columns[$_] => $set[$_] } (0 .. (@columns-1)) ) if $args{'action'};
- }
+- return $res;
-}
-
-sub load_record {
@@ -15014,6 +16262,24 @@ index 84208a2..0000000
- return $sth;
-}
-
+-sub sql_concat {
+- return $_[0] if @_ <= 1;
+-
+- my $db_type = RT->Config->Get('DatabaseType');
+- if ( $db_type eq 'Pg' || $db_type eq 'SQLite' ) {
+- return '('. join( ' || ', @_ ) .')';
+- }
+- return sql_concat('CONCAT('. join( ', ', splice @_, 0, 2 ).')', @_);
+-}
+-
+-sub sql_str2int {
+- my $db_type = RT->Config->Get('DatabaseType');
+- if ( $db_type eq 'Pg' ) {
+- return "($_[0])::integer";
+- }
+- return $_[0];
+-}
+-
-{ my %cached_answer;
-sub prompt {
- my $action = shift;
@@ -15070,6 +16336,20 @@ index 84208a2..0000000
- return $cached_answer{ $token } = $a;
-} }
-
+-# Find all RT::URI modules RT has loaded
+-
+-sub rt_uri_modules {
+- my @uris = grep /^RT\/URI\/.+\.pm$/, keys %INC;
+- my @uri_modules;
+- foreach my $uri_path (@uris){
+- next if $uri_path =~ /base\.pm$/; # Skip base RT::URI object
+- $uri_path = substr $uri_path, 0, -3; # chop off .pm
+- push @uri_modules, join '::', split '/', $uri_path;
+- }
+-
+- return @uri_modules;
+-}
+-
-1;
-
-__END__
@@ -15113,14 +16393,18 @@ index 84208a2..0000000
-
- resolve without asking questions
-
+-=item links-only
+-
+- only run the Link validation routines, useful if you changed your Organization
+-
-=back
-
diff --git a/sbin/standalone_httpd b/sbin/standalone_httpd
deleted file mode 100755
-index add9d01..0000000
+index cd22bb2..0000000
--- a/sbin/standalone_httpd
+++ /dev/null
-@@ -1,285 +0,0 @@
+@@ -1,181 +0,0 @@
-#!/usr/bin/perl -w
-# BEGIN BPS TAGGED BLOCK {{{
-#
@@ -15172,30 +16456,24 @@ index add9d01..0000000
-use warnings;
-use strict;
-
--# fix lib paths, some may be relative
-BEGIN {
- die <<EOT if ${^TAINT};
-RT does not run under Perl's "taint mode". Remove -T from the command
-line, or remove the PerlTaintCheck parameter from your mod_perl
-configuration.
-EOT
+-}
-
+-# fix lib paths, some may be relative
+-BEGIN { # BEGIN RT CMD BOILERPLATE
- require File::Spec;
+- require Cwd;
- my @libs = ("lib", "local/lib");
- my $bin_path;
-
- for my $lib (@libs) {
- unless ( File::Spec->file_name_is_absolute($lib) ) {
-- unless ($bin_path) {
-- if ( File::Spec->file_name_is_absolute(__FILE__) ) {
-- $bin_path = ( File::Spec->splitpath(__FILE__) )[1];
-- }
-- else {
-- require FindBin;
-- no warnings "once";
-- $bin_path = $FindBin::Bin;
-- }
-- }
+- $bin_path ||= ( File::Spec->splitpath(Cwd::abs_path(__FILE__)) )[1];
- $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib );
- }
- unshift @INC, $lib;
@@ -15213,17 +16491,19 @@ index add9d01..0000000
-}
-
-require RT;
+-die "Wrong version of RT $RT::VERSION found; need 4.2.*"
+- unless $RT::VERSION =~ /^4\.2\./;
+-
-RT->LoadConfig();
-RT->InitPluginPaths();
-RT->InitLogging();
--require Module::Refresh if RT->Config->Get('DevelMode');
-
-require RT::Handle;
-my ($integrity, $state, $msg) = RT::Handle->CheckIntegrity;
-
-unless ( $integrity ) {
- print STDERR <<EOF;
--
+-
-RT couldn't connect to the database where tickets are stored.
-If this is a new installation of RT, you should visit the URL below
-to configure RT and initialize your database.
@@ -15266,127 +16546,27 @@ index add9d01..0000000
- undef $RT::Handle;
-}
-
--require RT::Interface::Web::Handler;
--my $app = RT::Interface::Web::Handler->PSGIApp;
--
--if ($ENV{RT_TESTING}) {
-- my $screen_logger = $RT::Logger->remove('screen');
-- require Log::Dispatch::Perl;
-- $RT::Logger->add(
-- Log::Dispatch::Perl->new(
-- name => 'rttest',
-- min_level => $screen_logger->min_level,
-- action => {
-- error => 'warn',
-- critical => 'warn'
-- }
-- )
-- );
-- require Plack::Middleware::Test::StashWarnings;
-- $app = Plack::Middleware::Test::StashWarnings->wrap($app);
--}
--
+-require RT::PlackRunner;
-# when used as a psgi file
-if (caller) {
-- return $app;
--}
--
--
--# load appropriate server
--
--require Plack::Runner;
--
--my $is_fastcgi = $0 =~ m/fcgi$/;
--my $r = Plack::Runner->new( $0 =~ /standalone/ ? ( server => 'Standalone' ) :
-- $is_fastcgi ? ( server => 'FCGI' )
-- : (),
-- env => 'deployment' );
--
--# figure out the port
--my $port;
--
--# handle "rt-server 8888" for back-compat, but complain about it
--if ($ARGV[0] && $ARGV[0] =~ m/^\d+$/) {
-- warn "Deprecated: please run $0 --port $ARGV[0] instead\n";
-- unshift @ARGV, '--port';
+- return RT::PlackRunner->app;
-}
-
--my @args = @ARGV;
-
--use List::MoreUtils 'last_index';
--my $last_index = last_index { $_ eq '--port' } @args;
+-my $r = RT::PlackRunner->new( RT->InstallMode ? ( server => 'Standalone' ) :
+- $0 =~ /standalone/ ? ( server => 'Standalone' ) :
+- $0 =~ /fcgi$/ ? ( server => 'FCGI', env => "deployment" )
+- : ( server => 'Starlet', env => "deployment" ) );
+-$r->parse_options(@ARGV);
-
--my $explicit_port;
--
--if ( $last_index != -1 && $args[$last_index+1] =~ /^\d+$/ ) {
-- $explicit_port = $args[$last_index+1];
-- $port = $explicit_port;
--
-- # inform the rest of the system what port we manually chose
-- my $old_app = $app;
-- $app = sub {
-- my $env = shift;
--
-- $env->{'rt.explicit_port'} = $port;
--
-- $old_app->($env, @_);
-- };
--}
--else {
-- # default to the configured WebPort and inform Plack::Runner
-- $port = RT->Config->Get('WebPort') || '8080';
-- push @args, '--port', $port;
--}
--
--push @args, '--server', 'Standalone' if RT->InstallMode;
--push @args, '--server', 'Starlet' unless $r->{server} || grep { m/--server/ } @args;
--
--$r->parse_options(@args);
--
--delete $r->{options} if $is_fastcgi; ### mangle_host_port_socket ruins everything
--
--unless ($r->{env} eq 'development') {
-- push @{$r->{options}}, server_ready => sub {
-- my($args) = @_;
-- my $name = $args->{server_software} || ref($args); # $args is $server
-- my $host = $args->{host} || 0;
-- my $proto = $args->{proto} || 'http';
-- print STDERR "$name: Accepting connections at $proto://$host:$args->{port}/\n";
-- };
--}
--eval { $r->run($app) };
--if (my $err = $@) {
-- handle_startup_error($err);
--}
--
--exit 0;
--
--sub handle_startup_error {
-- my $err = shift;
-- if ( $err =~ /listen/ ) {
-- handle_bind_error();
-- } else {
-- die
-- "Something went wrong while trying to run RT's standalone web server:\n\t"
-- . $err;
-- }
--}
--
--
--sub handle_bind_error {
--
-- print STDERR <<EOF;
--WARNING: RT couldn't start up a web server on port @{[$port]}.
--This is often the case if the port is already in use or you're running @{[$0]}
--as someone other than your system's "root" user. You may also specify a
--temporary port with: $0 --port <port>
--EOF
+-# Try to clean up wrong-permissions var/
+-$SIG{INT} = sub {
+- local $@;
+- system("chown", "-R", "www:www", "/opt/rt4/var");
+- exit 0;
+-} if $> == 0;
-
-- if ($explicit_port) {
-- print STDERR
-- "Please check your system configuration or choose another port\n\n";
-- }
--}
+-$r->run;
-
-__END__
-
@@ -15408,10 +16588,10 @@ index add9d01..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 cc1e4fe..0000000
+index bc07e43..0000000
--- a/t/data/configs/apache2.2+fastcgi.conf
+++ /dev/null
-@@ -1,50 +0,0 @@
+@@ -1,49 +0,0 @@
-ServerRoot %%SERVER_ROOT%%
-PidFile %%PID_FILE%%
-LockFile %%LOCK_FILE%%
@@ -15421,8 +16601,8 @@ index cc1e4fe..0000000
-
-<IfModule !mpm_netware_module>
-<IfModule !mpm_winnt_module>
--User www-data
--Group www-data
+-User www
+-Group www
-</IfModule>
-</IfModule>
-
@@ -15448,7 +16628,6 @@ index cc1e4fe..0000000
- -initial-env RT_SITE_CONFIG=%%RT_SITE_CONFIG%% \
- -initial-env RT_TESTING=1
-
--Alias /NoAuth/images/ %%DOCUMENT_ROOT%%/NoAuth/images/
-ScriptAlias / %%RT_SBIN_PATH%%/rt-server.fcgi/
-
-DocumentRoot "%%DOCUMENT_ROOT%%"
@@ -15464,7 +16643,7 @@ index cc1e4fe..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 @@
@@ -15495,8 +16674,8 @@ index e0ce14c..0000000
-
-<IfModule !mpm_netware_module>
-<IfModule !mpm_winnt_module>
--User www-data
--Group www-data
+-User www
+-Group www
-</IfModule>
-</IfModule>
-
@@ -15536,5 +16715,5 @@ index e0ce14c..0000000
-</Perl>
-
--
-1.9.3
+2.1.0
diff --git a/0001-Add-Fedora-configuration.patch b/0002-Add-Fedora-configuration.patch
similarity index 56%
rename from 0001-Add-Fedora-configuration.patch
rename to 0002-Add-Fedora-configuration.patch
index 508d953..97c7e41 100644
--- a/0001-Add-Fedora-configuration.patch
+++ b/0002-Add-Fedora-configuration.patch
@@ -1,22 +1,19 @@
-From abe19fcddf23c61c4ba5f4bc627cf70ea74ac21f Mon Sep 17 00:00:00 2001
+From 2eb20220b6acc85e52ff94a2293fa8ea91c6d302 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <corsepiu at fedoraproject.org>
-Date: Sat, 19 Jan 2013 08:28:35 +0100
-Subject: [PATCH 1/6] Add Fedora configuration.
+Date: Tue, 18 Mar 2014 14:44:14 +0100
+Subject: [PATCH 2/8] Add Fedora configuration.
---
- etc/RT_SiteConfig.pm | 7 ++++---
- 1 file changed, 4 insertions(+), 3 deletions(-)
+ 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 4d2ef35..0c09743 100755
+index 390a351..02495f6 100755
--- a/etc/RT_SiteConfig.pm
+++ b/etc/RT_SiteConfig.pm
-@@ -10,13 +10,14 @@
- #
- # The converse is also true, if this file isn't valid perl, you're
+@@ -12,11 +12,12 @@
# going to run into trouble. To check your SiteConfig file, use
--# this comamnd:
-+# this command:
+ # this command:
#
-# perl -c /path/to/your/etc/RT_SiteConfig.pm
+# perl -c /etc/rt/RT_SiteConfig.pm
@@ -28,7 +25,7 @@ index 4d2ef35..0c09743 100755
+Set($WebPath, '/rt');
# You must install Plugins on your own, this is only an example
- # of the correct syntax to use when activating them.
+ # of the correct syntax to use when activating them:
--
-1.9.3
+2.1.0
diff --git a/0003-Broken-test-dependencies.patch b/0003-Broken-test-dependencies.patch
new file mode 100644
index 0000000..a30e5ad
--- /dev/null
+++ b/0003-Broken-test-dependencies.patch
@@ -0,0 +1,25 @@
+From e65fe99b030e8955f522be7202a2e76f39cc9645 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <corsepiu at fedoraproject.org>
+Date: Tue, 18 Mar 2014 14:47:19 +0100
+Subject: [PATCH 3/8] 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
+--- a/sbin/rt-test-dependencies.in
++++ b/sbin/rt-test-dependencies.in
+@@ -189,7 +189,7 @@ CGI 3.38
+ CGI::Cookie 1.20
+ CGI::Emulate::PSGI
+ CGI::PSGI 0.12
+-Class::Accessor 0.34
++Class::Accessor::Fast 0.34
+ Crypt::Eksblowfish
+ CSS::Squish 0.06
+ Data::GUID
+--
+2.1.0
+
diff --git a/0003-Use-usr-bin-perl-instead-of-usr-bin-env-perl.patch b/0004-Use-usr-bin-perl-instead-of-usr-bin-env-perl.patch
similarity index 77%
rename from 0003-Use-usr-bin-perl-instead-of-usr-bin-env-perl.patch
rename to 0004-Use-usr-bin-perl-instead-of-usr-bin-env-perl.patch
index ac80dd5..abec54f 100644
--- a/0003-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,24 +1,24 @@
-From b8a30c1a215fd3eaa0f1bc607e71a194c67cbeff Mon Sep 17 00:00:00 2001
+From 9be38aa4c1524a287684f5fa1cd8841385a95722 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <corsepiu at fedoraproject.org>
-Date: Sat, 19 Jan 2013 08:47:25 +0100
-Subject: [PATCH 3/6] Use /usr/bin/perl instead of /usr/bin/env perl.
+Date: Tue, 18 Mar 2014 14:55:18 +0100
+Subject: [PATCH 4/8] Use /usr/bin/perl instead of /usr/bin/env perl.
---
devel/tools/change-loc-msgstr | 2 +-
+ devel/tools/cmd-boilerplate | 2 +-
devel/tools/extract-message-catalog | 2 +-
- devel/tools/factory | 2 +-
devel/tools/license_tag | 2 +-
- devel/tools/merge-rosetta.pl | 2 +-
devel/tools/rt-apache | 2 +-
devel/tools/rt-attributes-editor | 2 +-
devel/tools/rt-static-docs | 2 +-
devel/tools/tweak-template-locstring | 2 +-
etc/upgrade/shrink_cgm_table.pl | 2 +-
etc/upgrade/shrink_transactions_table.pl | 2 +-
+ etc/upgrade/time-worked-history.pl | 2 +-
etc/upgrade/upgrade-mysql-schema.pl | 2 +-
- sbin/rt-message-catalog | 2 +-
+ lib/RT/Interface/Web/QueryBuilder.pm | 1 +
t/mail/fake-sendmail | 2 +-
- 14 files changed, 14 insertions(+), 14 deletions(-)
+ 14 files changed, 14 insertions(+), 13 deletions(-)
diff --git a/devel/tools/change-loc-msgstr b/devel/tools/change-loc-msgstr
index bd1892a..ffeb5e1 100755
@@ -30,20 +30,20 @@ index bd1892a..ffeb5e1 100755
# BEGIN BPS TAGGED BLOCK {{{
#
# COPYRIGHT:
-diff --git a/devel/tools/extract-message-catalog b/devel/tools/extract-message-catalog
-index 0afec0b..5c654e0 100755
---- a/devel/tools/extract-message-catalog
-+++ b/devel/tools/extract-message-catalog
+diff --git a/devel/tools/cmd-boilerplate b/devel/tools/cmd-boilerplate
+index 2c6463d..8fa596c 100755
+--- a/devel/tools/cmd-boilerplate
++++ b/devel/tools/cmd-boilerplate
@@ -1,4 +1,4 @@
-#!/usr/bin/env perl
+#!/usr/bin/perl
+
+
# BEGIN BPS TAGGED BLOCK {{{
- #
- # COPYRIGHT:
-diff --git a/devel/tools/factory b/devel/tools/factory
-index 5d05d08..38d1fe8 100755
---- a/devel/tools/factory
-+++ b/devel/tools/factory
+diff --git a/devel/tools/extract-message-catalog b/devel/tools/extract-message-catalog
+index ad9e5f5..9e74b53 100755
+--- a/devel/tools/extract-message-catalog
++++ b/devel/tools/extract-message-catalog
@@ -1,4 +1,4 @@
-#!/usr/bin/env perl
+#!/usr/bin/perl
@@ -60,18 +60,8 @@ index 4cf0917..0d1e5f3 100755
# BEGIN BPS TAGGED BLOCK {{{
-diff --git a/devel/tools/merge-rosetta.pl b/devel/tools/merge-rosetta.pl
-index ec587ad..cfd1651 100755
---- a/devel/tools/merge-rosetta.pl
-+++ b/devel/tools/merge-rosetta.pl
-@@ -1,4 +1,4 @@
--#!/usr/bin/env perl
-+#!/usr/bin/perl
- # BEGIN BPS TAGGED BLOCK {{{
- #
- # COPYRIGHT:
diff --git a/devel/tools/rt-apache b/devel/tools/rt-apache
-index 22df8ee..7a39dcf 100755
+index 71b420b..545b3ba 100755
--- a/devel/tools/rt-apache
+++ b/devel/tools/rt-apache
@@ -1,4 +1,4 @@
@@ -91,7 +81,7 @@ index 92998a4..117f167 100755
#
# COPYRIGHT:
diff --git a/devel/tools/rt-static-docs b/devel/tools/rt-static-docs
-index 2c77711..99335dc 100755
+index ef3dc50..6c6514d 100755
--- a/devel/tools/rt-static-docs
+++ b/devel/tools/rt-static-docs
@@ -1,4 +1,4 @@
@@ -111,7 +101,7 @@ index ca44d39..b31570b 100755
#
# COPYRIGHT:
diff --git a/etc/upgrade/shrink_cgm_table.pl b/etc/upgrade/shrink_cgm_table.pl
-index fcfe8c5..585b210 100644
+index 7157b20..02f5555 100644
--- a/etc/upgrade/shrink_cgm_table.pl
+++ b/etc/upgrade/shrink_cgm_table.pl
@@ -1,4 +1,4 @@
@@ -121,7 +111,7 @@ index fcfe8c5..585b210 100644
#
# COPYRIGHT:
diff --git a/etc/upgrade/shrink_transactions_table.pl b/etc/upgrade/shrink_transactions_table.pl
-index 66bdcf5..3e82203 100644
+index 0b78f0f..026a863 100644
--- a/etc/upgrade/shrink_transactions_table.pl
+++ b/etc/upgrade/shrink_transactions_table.pl
@@ -1,4 +1,4 @@
@@ -130,6 +120,16 @@ index 66bdcf5..3e82203 100644
# BEGIN BPS TAGGED BLOCK {{{
#
# COPYRIGHT:
+diff --git a/etc/upgrade/time-worked-history.pl b/etc/upgrade/time-worked-history.pl
+index 46961aa..666498e 100644
+--- a/etc/upgrade/time-worked-history.pl
++++ b/etc/upgrade/time-worked-history.pl
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env perl
++#!/usr/bin/perl
+ # BEGIN BPS TAGGED BLOCK {{{
+ #
+ # COPYRIGHT:
diff --git a/etc/upgrade/upgrade-mysql-schema.pl b/etc/upgrade/upgrade-mysql-schema.pl
index 8d6615d..204676c 100755
--- a/etc/upgrade/upgrade-mysql-schema.pl
@@ -140,12 +140,11 @@ index 8d6615d..204676c 100755
# BEGIN BPS TAGGED BLOCK {{{
#
# COPYRIGHT:
-diff --git a/sbin/rt-message-catalog b/sbin/rt-message-catalog
-index b428369..6effdfd 100755
---- a/sbin/rt-message-catalog
-+++ b/sbin/rt-message-catalog
-@@ -1,4 +1,4 @@
--#!/usr/bin/env perl
+diff --git a/lib/RT/Interface/Web/QueryBuilder.pm b/lib/RT/Interface/Web/QueryBuilder.pm
+index a1b0662..4af51f4 100644
+--- a/lib/RT/Interface/Web/QueryBuilder.pm
++++ b/lib/RT/Interface/Web/QueryBuilder.pm
+@@ -1,3 +1,4 @@
+#!/usr/bin/perl
# BEGIN BPS TAGGED BLOCK {{{
#
@@ -161,5 +160,5 @@ index 44c2377..ab3b912 100755
# captures command line arguments so you can validate
# what is being generated in sendmailpipe
--
-1.9.3
+2.1.0
diff --git a/0004-Remove-fixperms-font-install.patch b/0005-Remove-fixperms-font-install.patch
similarity index 72%
rename from 0004-Remove-fixperms-font-install.patch
rename to 0005-Remove-fixperms-font-install.patch
index 6bb5aa1..0201b52 100644
--- a/0004-Remove-fixperms-font-install.patch
+++ b/0005-Remove-fixperms-font-install.patch
@@ -1,14 +1,14 @@
-From fff3f340cbf67886b292c77ae8774fe5bd8c4f68 Mon Sep 17 00:00:00 2001
+From ecea9d34aaec6fd23343c785a9f74593cd66baaa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <corsepiu at fedoraproject.org>
-Date: Sat, 19 Jan 2013 08:28:35 +0100
-Subject: [PATCH 4/6] Remove fixperms, font-install
+Date: Tue, 18 Mar 2014 14:59:31 +0100
+Subject: [PATCH 5/8] Remove fixperms, font-install.
---
Makefile.in | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/Makefile.in b/Makefile.in
-index d8c7799..54faca8 100755
+index f9b6402..5a23c85 100755
--- a/Makefile.in
+++ b/Makefile.in
@@ -260,7 +260,7 @@ upgrade-instruct:
@@ -20,18 +20,18 @@ index d8c7799..54faca8 100755
my_with_web_handlers= $(shell $(PERL) -e 'print join " ", map "--with-$$_", grep defined && length, split /,/, "$(WEB_HANDLER)"')
testdeps:
-@@ -346,9 +346,9 @@ dirs:
- $(INSTALL) -m 0755 -d $(DESTDIR)$(LOCAL_PLUGIN_PATH)
- $(INSTALL) -m 0755 -d $(DESTDIR)$(LOCAL_LEXICON_PATH)
+@@ -359,9 +359,9 @@ clean-mason-cache:
+ rm -rf $(DESTDIR)$(MASON_DATA_PATH)/etc/*
+ rm -rf $(DESTDIR)$(MASON_DATA_PATH)/obj/*
-install: testdeps config-install dirs files-install fixperms instruct
+install: testdeps config-install dirs files-install instruct
--files-install: libs-install etc-install config-install bin-install sbin-install html-install doc-install font-install po-install
-+files-install: libs-install etc-install config-install bin-install sbin-install html-install doc-install po-install
+-files-install: libs-install etc-install config-install bin-install sbin-install html-install doc-install font-install po-install static-install
++files-install: libs-install etc-install config-install bin-install sbin-install html-install doc-install po-install static-install
config-install:
@COMMENT_INPLACE_LAYOUT@ $(INSTALL) -m 0755 -o $(BIN_OWNER) -g $(RTGROUP) -d $(DESTDIR)$(CONFIG_FILE_PATH)
--
-1.9.3
+2.1.0
diff --git a/0005-Fix-permissions.patch b/0006-Fix-permissions.patch
similarity index 89%
rename from 0005-Fix-permissions.patch
rename to 0006-Fix-permissions.patch
index c76bf8f..fffe753 100644
--- a/0005-Fix-permissions.patch
+++ b/0006-Fix-permissions.patch
@@ -1,7 +1,7 @@
-From 6fd8bcac095f502bb3c196f86a8d2a85715b5f50 Mon Sep 17 00:00:00 2001
+From 83b48cfbc9dbb68e50055b6c51ec3582238e8fb1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <corsepiu at fedoraproject.org>
Date: Tue, 18 Mar 2014 10:00:00 +0100
-Subject: [PATCH 5/6] Fix permissions.
+Subject: [PATCH 6/8] Fix permissions.
---
Makefile.in | 0
@@ -14,13 +14,12 @@ Subject: [PATCH 5/6] Fix permissions.
etc/acl.Oracle | 0
etc/acl.Pg | 0
etc/acl.mysql | 0
- etc/initialdata | 0
etc/schema.Oracle | 0
etc/schema.Pg | 0
etc/schema.SQLite | 0
etc/schema.mysql | 0
etc/upgrade/vulnerable-passwords.in | 0
- 16 files changed, 0 insertions(+), 0 deletions(-)
+ 15 files changed, 0 insertions(+), 0 deletions(-)
mode change 100755 => 100644 Makefile.in
mode change 100755 => 100644 aclocal.m4
mode change 100755 => 100644 config.layout
@@ -31,7 +30,6 @@ Subject: [PATCH 5/6] Fix permissions.
mode change 100755 => 100644 etc/acl.Oracle
mode change 100755 => 100644 etc/acl.Pg
mode change 100755 => 100644 etc/acl.mysql
- mode change 100755 => 100644 etc/initialdata
mode change 100755 => 100644 etc/schema.Oracle
mode change 100755 => 100644 etc/schema.Pg
mode change 100755 => 100644 etc/schema.SQLite
@@ -68,9 +66,6 @@ new mode 100644
diff --git a/etc/acl.mysql b/etc/acl.mysql
old mode 100755
new mode 100644
-diff --git a/etc/initialdata b/etc/initialdata
-old mode 100755
-new mode 100644
diff --git a/etc/schema.Oracle b/etc/schema.Oracle
old mode 100755
new mode 100644
@@ -87,5 +82,5 @@ diff --git a/etc/upgrade/vulnerable-passwords.in b/etc/upgrade/vulnerable-passwo
old mode 100755
new mode 100644
--
-1.9.3
+2.1.0
diff --git a/0007-Fix-translation.patch b/0007-Fix-translation.patch
new file mode 100644
index 0000000..7f093b8
--- /dev/null
+++ b/0007-Fix-translation.patch
@@ -0,0 +1,25 @@
+From 08352fe91e355ee16c8531b3ea335c060a005b17 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <corsepiu at fedoraproject.org>
+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 0eaf1e7..a952f0a 100644
+--- a/share/po/de.po
++++ b/share/po/de.po
+@@ -1002,7 +1002,7 @@ msgstr "Alle Tickets"
+
+ #: share/html/User/Prefs.html:171
+ 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-Adjust-path-to-html-autohandler.patch b/0008-Adjust-path-to-html-autohandler.patch
similarity index 87%
rename from 0007-Adjust-path-to-html-autohandler.patch
rename to 0008-Adjust-path-to-html-autohandler.patch
index 7d332bd..c155f79 100644
--- a/0007-Adjust-path-to-html-autohandler.patch
+++ b/0008-Adjust-path-to-html-autohandler.patch
@@ -1,7 +1,7 @@
-From 775af7e4827e723ba8b4ccc210dc0eaa876ab797 Mon Sep 17 00:00:00 2001
+From 20ae18d6de75fd426eff2e33ab4bfd84dfdcdfaa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <corsepiu at fedoraproject.org>
Date: Fri, 23 Jan 2015 04:38:35 +0100
-Subject: [PATCH 7/7] Adjust path to html/autohandler.
+Subject: [PATCH 8/8] Adjust path to html/autohandler.
---
t/web/query_log.t | 2 +-
diff --git a/0009-Work-around-testsuite-failure.patch b/0009-Work-around-testsuite-failure.patch
new file mode 100644
index 0000000..66fd1f5
--- /dev/null
+++ b/0009-Work-around-testsuite-failure.patch
@@ -0,0 +1,47 @@
+From 4ed130621f75bcb8271240b676544693ea9b0cf9 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= <corsepiu at fedoraproject.org>
+Date: Sat, 24 Jan 2015 04:49:25 +0100
+Subject: [PATCH] Work-around testsuite failure. cf.
+ https://bugzilla.redhat.com/show_bug.cgi?id=1121601#c36.
+
+---
+ t/mail/html-outgoing.t | 23 -----------------------
+ 1 file changed, 23 deletions(-)
+
+diff --git a/t/mail/html-outgoing.t b/t/mail/html-outgoing.t
+index 6a0f2be..18eb9a1 100644
+--- a/t/mail/html-outgoing.t
++++ b/t/mail/html-outgoing.t
+@@ -82,29 +82,6 @@ mail_ok {
+ };
+
+
+-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 at 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 => 'enduser at example.com',
+- subject => qr/\Q[example.com #1] The internet is broken\E/,
+- body => qr{<table><tr><td><table><tr><td>Foo</td></tr></table></td></tr></table>},
+- 'Content-Type' => qr{text/html}, # TODO
+- };
+-} [(qr/uninitialized value/, qr/Failed to downgrade HTML/)x3];
+-
+ diag "Admin Comment in HTML";
+ mail_ok {
+ ($ok, $tmsg) = $t->Comment(
+--
+2.1.0
+
diff --git a/README.fedora.in b/README.fedora.in
index ae19e13..09617af 100644
--- a/README.fedora.in
+++ b/README.fedora.in
@@ -4,9 +4,9 @@ Some random notes on rt on Fedora:
Finalizing the installation
===========================
-The default configuration is set up for a mysql based rt system.
-It requires additional steps to be performed by the sysadmin to be
-fully functional.
+The default configuration is set up for a mysql based rt system.
+It requires additional steps to be performed by the sysadmin to be
+fully functional.
If you have never set up rt before, proceed as follows:
1. Log-in to the server as root
@@ -18,13 +18,13 @@ If you have never set up rt before, proceed as follows:
# systemctl start mysqld.service
4. Set up the mysql server.
-If not already done, at minimum, you will want to set up a mysql root
+If not already done, at minimum, you will want to set up a mysql root
password:
# mysqladmin -u root password <mysql-root-password>
5. Edit /etc/rt/RT_SiteConfig.pm to meet your demands.
You will want to compare RT_SiteConfig.pm against RT_Config.pm and
-add customized versions of those settings from RT_Config.pm to
+add customized versions of those settings from RT_Config.pm to
RT_SiteConfig.pm.
In particular, you probably will want to add customized versions of
@@ -47,14 +47,14 @@ http:-access to your rt-host:
e.g.:
<your-favorite-browser> http://<rt-host>/rt
-You should be greeted with a login window. Login with
+You should be greeted with a login window. Login with
Username: root, Password: password.
The next step should be to change your rt's "root" account's password,
-otherwise anybody with web access to your site will be able to abuse
+otherwise anybody with web access to your site will be able to abuse
your site.
-Afterwards, you should be ready to create user accounts, configure
+Afterwards, you should be ready to create user accounts, configure
the mail-interface etc.
@@ -66,3 +66,6 @@ drwxr-xr-x. root root system_u:object_r:httpd_cache_t:s0 /var/cache/rt
If not, perform the following to add the required file context:
# semanage fcontext -a -t httpd_cache_t '/var/cache/rt(/.*)?'
# restorecon -R -v /var/cache/rt
+
+Depending on your email-setup you may also need to set:
+# setsebool -P httpd_can_sendmail=1
diff --git a/rt.spec b/rt.spec
index 32666c6..14c4af2 100644
--- a/rt.spec
+++ b/rt.spec
@@ -52,10 +52,11 @@
%global RT_LOGDIR %{_localstatedir}/log/%{name}
%global RT_CACHEDIR %{_localstatedir}/cache/%{name}
%global RT_LOCALSTATEDIR %{_localstatedir}/lib/%{name}
+%global RT_STATICDIR %{_datadir}/%{name}/static
Name: rt
-Version: 4.0.22
-Release: 3%{?dist}
+Version: 4.2.9
+Release: 1%{?dist}
Summary: Request tracker
Group: Applications/Internet
@@ -71,13 +72,15 @@ Source3: README.fedora.in
# rt's logrotate configuration
Source4: rt.logrotate.in
-Patch1: 0001-Add-Fedora-configuration.patch
-Patch2: 0002-Broken-test-dependencies.patch
-Patch3: 0003-Use-usr-bin-perl-instead-of-usr-bin-env-perl.patch
-Patch4: 0004-Remove-fixperms-font-install.patch
-Patch5: 0005-Fix-permissions.patch
-Patch6: 0006-Remove-configure-time-generated-files.patch
-Patch7: 0007-Adjust-path-to-html-autohandler.patch
+Patch1: 0001-Remove-configure-time-generated-files.patch
+Patch2: 0002-Add-Fedora-configuration.patch
+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-Adjust-path-to-html-autohandler.patch
+Patch9: 0009-Work-around-testsuite-failure.patch
BuildArch: noarch
@@ -94,16 +97,20 @@ BuildRequires: perl(CGI::Emulate::PSGI)
BuildRequires: perl(Class::ReturnValue) >= 0.40
BuildRequires: perl(Convert::Color)
BuildRequires: perl(CPAN)
+BuildRequires: perl(Crypt::Eksblowfish)
+BuildRequires: perl(Crypt::SSLeay)
+BuildRequires: perl(Crypt::X509)
BuildRequires: perl(CSS::Squish) >= 0.06
+BuildRequires: perl(Data::GUID)
BuildRequires: perl(Data::ICal)
+BuildRequires: perl(Date::Extract) >= 0.02
+BuildRequires: perl(Date::Manip)
+BuildRequires: perl(DateTime::Format::Natural) >= 0.67
BuildRequires: perl(Date::Format)
BuildRequires: perl(DateTime) >= 0.44
BuildRequires: perl(DateTime::Locale) >= 0.40
%{?with_mysql:BuildRequires: perl(DBD::mysql) >= 2.1018}
-# This should be: BuildRequires: perl(DBD::Pg) != 3.3.0
-# cf. RHBZ#1138926
-%{?with_pg:BuildConflicts: perl(DBD::Pg) == 3.3.0}
-%{?with_pg:BuildRequires: perl(DBD::Pg)}
+%{?with_pg:BuildRequires: perl(DBD::Pg) >= 1.43}
BuildRequires: perl(DBI) >= 1.37
BuildRequires: perl(DBIx::SearchBuilder) >= 1.59
BuildRequires: perl(Devel::StackTrace) >= 1.19
@@ -111,6 +118,7 @@ BuildRequires: perl(Devel::GlobalDestruction)
BuildRequires: perl(Digest::base)
BuildRequires: perl(Digest::MD5) >= 2.27
BuildRequires: perl(Email::Address)
+BuildRequires: perl(Email::Address::List) >= 0.02
BuildRequires: perl(Encode) >= 2.39
BuildRequires: perl(Errno)
%{?with_devel_mode:BuildRequires: perl(File::Find)}
@@ -118,8 +126,9 @@ BuildRequires: perl(File::Glob)
BuildRequires: perl(File::ShareDir)
BuildRequires: perl(File::Spec) >= 0.8
BuildRequires: perl(File::Temp) >= 0.19
+BuildRequires: perl(File::Which)
%{?with_gd:BuildRequires: perl(GD)}
-%{?with_gd:BuildRequires: perl(GD::Graph)}
+%{?with_gd:BuildRequires: perl(GD::Graph) >= 1.47}
%{?with_gd:BuildRequires: perl(GD::Text)}
%{?with_gpg:BuildRequires: perl(GnuPG::Interface)}
%{?with_graphviz:BuildRequires: perl(GraphViz)}
@@ -127,6 +136,8 @@ BuildRequires: perl(Getopt::Long) >= 2.24
BuildRequires: perl(HTML::Entities)
%{?with_devel_mode:BuildRequires: perl(HTML::Form)}
BuildRequires: perl(HTML::FormatText)
+BuildRequires: perl(HTML::FormatText::WithLinks) >= 0.14
+BuildRequires: perl(HTML::FormatText::WithLinks::AndTables)
BuildRequires: perl(HTML::Mason) >= 1.43
BuildRequires: perl(HTML::Mason::PSGIHandler)
BuildRequires: perl(HTML::Quoted)
@@ -136,10 +147,6 @@ BuildRequires: perl(HTML::TreeBuilder)
BuildRequires: perl(HTTP::Request::Common)
BuildRequires: perl(HTTP::Server::Simple) >= 0.34
BuildRequires: perl(HTTP::Server::Simple::Mason) >= 0.09
-BuildRequires: perl(Imager)
-BuildRequires: perl(Imager::File::GIF)
-BuildRequires: perl(Imager::File::PNG)
-BuildRequires: perl(Imager::File::JPEG)
%{?with_graphviz:BuildRequires: perl(IPC::Run)}
BuildRequires: perl(IPC::Run3)
%{?with_graphviz:BuildRequires: perl(IPC::Run::SafeHandles)}
@@ -147,22 +154,26 @@ BuildRequires: perl(JSON)
BuildRequires: perl(JavaScript::Minifier)
BuildRequires: perl(List::MoreUtils)
BuildRequires: perl(Locale::Maketext) >= 1.06
-BuildRequires: perl(Locale::Maketext::Fuzzy)
+BuildRequires: perl(Locale::Maketext::Fuzzy) >= 0.11
BuildRequires: perl(Locale::Maketext::Lexicon) >= 0.32
BuildRequires: perl(Locale::PO)
BuildRequires: perl(Log::Dispatch) >= 2.23
%{?with_devel_mode:BuildRequires: perl(Log::Dispatch::Perl)}
BuildRequires: perl(LWP)
BuildRequires: perl(LWP::UserAgent)
+BuildRequires: perl(LWP::Protocol::https)
BuildRequires: perl(Mail::Mailer) >= 1.57
BuildRequires: perl(MIME::Entity) >= 5.425
BuildRequires: perl(MIME::Types)
%{?with_devel_mode:BuildRequires: perl(Module::Refresh) >= 0.03}
BuildRequires: perl(Module::Versions::Report) >= 1.05
+BuildRequires: perl(Mozilla::CA)
+BuildRequires: perl(Mojo::DOM)
BuildRequires: perl(Net::CIDR)
BuildRequires: perl(Net::Server)
BuildRequires: perl(Net::Server::PreFork)
BuildRequires: perl(Net::SMTP)
+BuildRequires: perl(Net::SSL)
%{?with_gpg:BuildRequires: perl(PerlIO::eol)}
BuildRequires: perl(Pod::Usage)
BuildRequires: perl(Plack)
@@ -171,20 +182,22 @@ BuildRequires: perl(Plack::Handler::Starlet)
BuildRequires: perl(Regexp::Common)
BuildRequires: perl(Regexp::Common::net::CIDR)
BuildRequires: perl(Regexp::IPv6)
+BuildRequires: perl(Role::Basic) >= 0.12
BuildRequires: perl(Scalar::Util)
+BuildRequires: perl(Set::Tiny)
BuildRequires: perl(Storable) >= 2.08
%{?with_devel_mode:BuildRequires: perl(String::ShellQuote)}
+BuildRequires: perl(Symbol::Global::Name) >= 0.04
BuildRequires: perl(Term::ReadKey)
BuildRequires: perl(Term::ReadLine)
-BuildRequires: perl(Term::EditorEdit)
%{?with_devel_mode:BuildRequires: perl(Test::Builder) >= 0.77}
%{?with_devel_mode:BuildRequires: perl(Test::Deep)}
%{?with_devel_mode:BuildRequires: perl(Test::Email)}
%{?with_devel_mode:BuildRequires: perl(Email::Abstract)}
%{?with_devel_mode:BuildRequires: perl(Test::Expect) >= 0.31}
-%{?with_devel_mode:BuildRequires: perl(Test::HTTP::Server::Simple) >= 0.09}
%{?with_devel_mode:BuildRequires: perl(Test::MockTime)}
%{?with_devel_mode:BuildRequires: perl(Test::NoWarnings)}
+%{?with_devel_mode:BuildRequires: perl(Test::Pod) >= 1.14}
%{?with_devel_mode:BuildRequires: perl(Test::Warn)}
%{?with_devel_mode:BuildRequires: perl(Test::WWW::Mechanize)}
%{?with_devel_mode:BuildRequires: perl(Test::WWW::Mechanize::PSGI)}
@@ -198,7 +211,6 @@ BuildRequires: perl(Time::HiRes)
BuildRequires: perl(Time::ParseDate)
BuildRequires: perl(Tree::Simple) >= 1.04
BuildRequires: perl(UNIVERSAL::require)
-%{?with_devel_mode:BuildRequires: perl(Web::Scraper)}
%{?with_devel_mode:BuildRequires: perl(WWW::Mechanize)}
BuildRequires: perl(XML::RSS) >= 1.05
%{?with_devel_mode:BuildRequires: perl(XML::Simple)}
@@ -207,10 +219,8 @@ BuildRequires: perl(XML::RSS) >= 1.05
%{?with_runtests:BuildRequires: perl(Test::Warn)}
%{?with_runtests:BuildRequires: perl(Test::MockTime)}
%{?with_runtests:BuildRequires: perl(String::ShellQuote)}
-%{?with_runtests:BuildRequires: perl(Test::Pod) >= 1.14}
%{?with_runtests:BuildRequires: perl(PerlIO::eol)}
%{?with_runtests:BuildRequires: perl(Test::Expect)}
-BuildRequires: perl(Test::Pod) >= 1.14
BuildRequires: /usr/bin/pod2man
BuildRequires: /usr/sbin/apachectl
@@ -279,7 +289,6 @@ Requires: rt-mailgate
# Filter bogus provides
%global __provides_exclude %{?__provides_exclude:%__provides_exclude|}^perl\\(HTML::Mason
%global __provides_exclude %{?__provides_exclude:%__provides_exclude|}^perl\\(IO::Handle::CRLF\\)$
-%global __provides_exclude %{?__provides_exclude:%__provides_exclude|}^perl\\(Log::Dispatch\\)$
%description
@@ -317,11 +326,12 @@ Requires: perl(GnuPG::Interface)
Requires: perl(GraphViz)
Requires: perl(PerlIO::eol)
Requires: perl(Plack::Handler::Apache2)
-Requires: perl(String::ShellQuote)
-Requires: perl(Test::Deep)
-Requires: perl(Test::Expect)
+Requires: perl(Set::Tiny)
+Requires: perl(String::ShellQuote)
+Requires: perl(Test::Deep)
+Requires: perl(Test::Expect)
Requires: perl(Test::MockTime)
-Requires: perl(Test::Warn)
+Requires: perl(Test::Warn)
Obsoletes: rt3-tests < %{version}-%{release}
Provides: rt3-tests = %{version}-%{release}
@@ -345,6 +355,7 @@ Requires: perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version))
# rpm doesn't catch these:
Requires: perl(Test::WWW::Mechanize::PSGI)
+Requires: perl(Mojo::DOM)
%description -n perl-RT-Test
%{summary}
@@ -366,6 +377,8 @@ sed -e 's, at RT_LOGDIR@,%{RT_LOGDIR},' %{SOURCE4} \
%patch5 -p1
%patch6 -p1
%patch7 -p1
+%patch8 -p1
+%patch9 -p1
# Propagate rpm's directories to config.layout
cat << \EOF >> config.layout
@@ -381,6 +394,7 @@ cat << \EOF >> config.layout
localstatedir: %{RT_LOCALSTATEDIR}
htmldir: %{RT_WWWDIR}
fontdir: %{RT_FONTSDIR}
+ staticdir: %{RT_STATICDIR}
logfiledir: %{RT_LOGDIR}
masonstatedir: %{RT_CACHEDIR}/mason_data
sessionstatedir: %{RT_CACHEDIR}/session_data
@@ -465,7 +479,10 @@ for file in bin/*.1 sbin/*.1; do
install -m 0644 $file ${RPM_BUILD_ROOT}%{_mandir}/man1
done
+# missed by "make install"
install -d -m755 ${RPM_BUILD_ROOT}%{RT_LOGDIR}
+# missed by "make install"
+install -d -m755 ${RPM_BUILD_ROOT}%{RT_LOCALSTATEDIR}
# install log rotation stuff
mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d
@@ -487,14 +504,16 @@ cp -R devel/tools ${RPM_BUILD_ROOT}%{perl_testdir}/%{name}/devel
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
+ln -s %{RT_STATICDIR} ${RPM_BUILD_ROOT}%{perl_testdir}/%{name}/share/static
ln -s %{_bindir} ${RPM_BUILD_ROOT}%{perl_testdir}/%{name}/bin
ln -s %{_sbindir} ${RPM_BUILD_ROOT}%{perl_testdir}/%{name}/sbin
ln -s %{_sysconfdir}/%{name} ${RPM_BUILD_ROOT}%{perl_testdir}/%{name}/etc
ln -s %{RT_LIBDIR} ${RPM_BUILD_ROOT}%{perl_testdir}/%{name}/lib
-# This file should not be installed
+# These files should not be installed
rm ${RPM_BUILD_ROOT}%{RT_LEXDIR}/*.pot
+rm ${RPM_BUILD_ROOT}%{RT_LIBDIR}/RT/Generated.pm.in
# Fix permissions
find ${RPM_BUILD_ROOT}%{RT_WWWDIR} \
@@ -510,7 +529,9 @@ ${RPM_BUILD_ROOT}%{_datadir}/%{name}/upgrade/split-out-cf-categories \
${RPM_BUILD_ROOT}%{_datadir}/%{name}/upgrade/4.0-customfield-checkbox-extension \
${RPM_BUILD_ROOT}%{_datadir}/%{name}/upgrade/vulnerable-passwords \
${RPM_BUILD_ROOT}%{_datadir}/%{name}/upgrade/upgrade-mysql-schema.pl \
-${RPM_BUILD_ROOT}%{_datadir}/%{name}/upgrade/shrink_cgm_table.pl
+${RPM_BUILD_ROOT}%{_datadir}/%{name}/upgrade/shrink_cgm_table.pl \
+${RPM_BUILD_ROOT}%{_datadir}/%{name}/upgrade/switch-templates-to \
+${RPM_BUILD_ROOT}%{_datadir}/%{name}/upgrade/time-worked-history.pl
%check
# The tests don't work in buildroots, they
@@ -536,6 +557,7 @@ fi
%{RT_LIBDIR}/*
%exclude %{RT_LIBDIR}/RT/Test*
%attr(0700,apache,apache) %{RT_LOGDIR}
+%attr(0760,apache,apache) %{RT_LOCALSTATEDIR}
%dir %{_sysconfdir}/%{name}
%attr(-,root,root)%{_datadir}/%{name}/upgrade
@@ -559,6 +581,7 @@ fi
%{RT_WWWDIR}
%{RT_LEXDIR}
%{RT_FONTSDIR}
+%{RT_STATICDIR}
%config(noreplace) %{_sysconfdir}/httpd/conf.d/%{name}.conf
@@ -587,38 +610,5 @@ fi
%endif
%changelog
-* Fri Jan 23 2015 Ralf Corsépius <corsepiu at fedoraproject.org> - 4.0.22-3
-- Fix testsuite failure (Add 0007-Adjust-path-to-html-autohandler.patch)
- (From Jason Tibbitts).
-
-* Thu Jan 22 2015 Ralf Corsépius <corsepiu at fedoraproject.org> - 4.0.22-2
-- Misc. cosmetical changes.
-- Rework --with mysql/pg processing.
-- Filter out P: perl(Log::Dispatch).
-- Add R: %%{_sysconfdir}/httpd/conf.d.
-- Add note on SELinux to README.fedora.
-
-* Wed Oct 08 2014 Ralf Corsépius <corsepiu at fedoraproject.org> - 4.0.22-1
-- Upstream update.
-- Reflect rt-server being installed to %%{_sbindir}.
-- Add BuildConflicts/Conflicts: perl(DBD::Pg) == 3.3.0.
-- Install updates into %%{_datadir}.
-- Various misc. cosmetic fixes.
-
-* Sun Sep 07 2014 Ralf Corsépius <corsepiu at fedoraproject.org> - 4.0.21-4
-- Remove artefacts of installation outside of %%{_bindir}.
-- Add optional support for pg.
-- Introduce RT_FONTSDIR.
-- Require: perl(DBD::Pg) and perl(DBD::mysql).
-- Exclude unsupported upgrade files.
-
-* Wed Aug 20 2014 Ralf Corsépius <corsepiu at fedoraproject.org> - 4.0.21-3
-- Add rt-attributes-editor.
-
-* Tue Jul 22 2014 Ralf Corsépius <corsepiu at fedoraproject.org> - 4.0.21-2
-- Address misc. cosmetical issues.
-- Own %%{perl_testdir}.
-- Add COPYING to perl-RT-Tests.
-
-* Mon Jul 21 2014 Ralf Corsépius <corsepiu at fedoraproject.org> - 4.0.21-1
-- Fedora submission.
+* Mon Jan 26 2015 Ralf Corsépius <corsepiu at fedoraproject.org> - 4.2.9-1
+- Update to rt-4.2.9.
More information about the perl-devel
mailing list