Metadata
{
+
"abstracts_in_pod": { … - "HIST": "historical perlbug data processor",
- "Perlbug": "PerlBug DataBase",
- "Perlbug::Base": "Module for bringing together Config, Log, Format, Do, TM, Mysql etc.",
- "Perlbug::Cmd": "Command line interface to perlbug database.",
- "Perlbug::Config": "Perlbug Configuration data handler",
- "Perlbug::Do": "Commands (switches) for generic interface to perlbug database.",
- "Perlbug::Email": "Email interface to perlbug database.",
- "Perlbug::Fix": "Command line interface to fixing perlbug database.",
- "Perlbug::Format": "Formats for email interface to perlbug database.",
- "Perlbug::Log": "Module for generic logging/debugging functions to all Perlbug.",
- "Perlbug::TM": "Bug support functions for Perlbug",
- "Perlbug::Table": "Table access",
- "Perlbug::Test": "Perlbug test module placeholder",
- "Perlbug::Testing": "Perlbug testing module",
- "Perlbug::Web": "Web interface to perlbug database."
},- "author": "RFOLEY",
- "buildfile_executable": 0,
- "dir_t": "t",
+
"dirs_array": [ … - "Mail/inbox",
- "Mail",
- "Perlbug",
- "config",
- "scripts",
- "site",
- "spool/archive",
- "spool/logs",
- "spool/ranges",
- "spool/results",
- "spool/temp",
- "spool",
- "sql/generic",
- "sql/mysql",
- "sql/oracle",
- "sql",
- "t/quick",
- "t/testmails/bugdb",
- "t/testmails/get_headers",
- "t/testmails/head_to_head",
- "t/testmails/redundant",
- "t/testmails/scan_body",
- "t/testmails/switch",
- "t/testmails",
- "t",
- "web/admin/images",
- "web/admin",
- "web/images",
- "web"
],- "dist": "Perlbug",
+
"error": { … - "consistent_version": "0.01,1,1.00,1.01,1.02,1.03,1.05,1.11,1.12,1.22,1.28,1.3,1.33,1.41,1.63,1.64,2.27",
+
"no_invalid_versions": { … +
"Perlbug/Database.pm": { … - "Perlbug::Database": "my $VERSION = 0.00;"
},+
"Perlbug/Message.pm": { … - "Perlbug::Message": "my $VERSION = 0.00;"
},+
"Perlbug/Ticket.pm": { … - "PbDb::Ticket": "my $VERSION = 0.00;"
}
},- "no_pod_errors": "Perlbug-2.27/Perlbug/Table.pm -- Around line 35: '=item' outside of any '=over' =over without closing =back ",
+
"portable_filenames": [ … - "t/quick/close_<tid>@bugs.perl.org",
- "t/quick/note_<tid>@bugs.perl.org",
- "t/quick/on_low_<tid>_mac@bugs.perl.org",
- "t/quick/patch_<tid>@bugs.perl.org",
- "t/quick/test_<tid>@bugs.perl.org"
],+
"prereq_matches_use": [ … - "DBI",
- "HTML::Entities",
- "Mail::Address",
- "Mail::Header",
- "Mail::Internet",
- "Mail::Send",
- "Mysql",
- "URI::Escape"
],+
"test_prereq_matches_use": [ … ],- "use_strict": "PbDb::Ticket, Perlbug, Perlbug::Admin, Perlbug::Bug, Perlbug::Database, Perlbug::Format, Perlbug::JS, Perlbug::Message, Perlbug::User",
- "use_warnings": "MyDBD, PbDb::Ticket, Perlbug, Perlbug::Admin, Perlbug::Base, Perlbug::Bug, Perlbug::Cmd, Perlbug::Config, Perlbug::Database, Perlbug::Do, Perlbug::Email, Perlbug::Fix, Perlbug::Format, Perlbug::JS, Perlbug::Log, Perlbug::Message, Perlbug::TM, Perlbug::Table, Perlbug::Test, Perlbug::Test, Perlbug::Test, Perlbug::Testing, Perlbug::Tk, Perlbug::User, Perlbug::Web"
},- "extension": "tar.gz",
- "extractable": 1,
- "extracts_nicely": 1,
- "file__build": 0,
- "file_blib": 0,
- "file_build": 0,
- "file_changelog": "Changes",
- "file_makefile": 0,
- "file_makefile_pl": "Makefile.PL",
- "file_manifest": "MANIFEST",
- "file_pm_to_blib": 0,
- "file_readme": "README",
+
"files_array": [ … - "Changes",
- "INSTALL",
- "MANIFEST",
- "Mail/inbox/.xmhcache",
- "Makefile.PL",
- "Perlbug/Admin.pm",
- "Perlbug/Base.pm",
- "Perlbug/Bug.pm",
- "Perlbug/Cmd.pm",
- "Perlbug/Config.pm",
- "Perlbug/Database.pm",
- "Perlbug/Do.pm",
- "Perlbug/Email.pm",
- "Perlbug/Fix.pm",
- "Perlbug/Format.pm",
- "Perlbug/JS.pm",
- "Perlbug/Log.pm",
- "Perlbug/Message.pm",
- "Perlbug/MyDBD.pm",
- "Perlbug/Note.pm",
- "Perlbug/Patch.pm",
- "Perlbug/TC",
- "Perlbug/TM.pm",
- "Perlbug/Table.pm",
- "Perlbug/Test.pm",
- "Perlbug/Testing.pm",
- "Perlbug/Ticket.pm",
- "Perlbug/Tk.pm",
- "Perlbug/User.pm",
- "Perlbug/Web.pm",
- "Perlbug/_REF_",
- "Perlbug/subs",
- "Perlbug.pm",
- "README",
- "bashrc",
- "config/.htpasswd",
- "config/.mysql",
- "config/Configuration",
- "config/Matches",
- "config/enabler_redundant",
- "config/p5p_list",
- "config/tmtowtdi_Configuration",
- "scripts/bugdb",
- "scripts/bugtk",
- "scripts/cron.cmd",
- "scripts/exbugtk",
- "scripts/fixit",
- "scripts/graph.pl",
- "scripts/hist.cmd",
- "scripts/mail.pl",
- "scripts/pbugtk",
- "scripts/tron.pl",
- "site/adminfaq",
- "site/adminfaq.html",
- "site/footer",
- "site/footer.html",
- "site/header",
- "site/header.html",
- "site/response",
- "site/todo",
- "site/todo.html",
- "spool/archive/.exists",
- "spool/logs/.exists",
- "spool/ranges/.exists",
- "spool/results/.exists",
- "spool/temp/.exists",
- "sql/generic/insert_admin.sql",
- "sql/generic/insert_flags.sql",
- "sql/install",
- "sql/mysql/create_database.sql",
- "sql/mysql/create_dbuser.sql",
- "sql/mysql/create_tables.sql",
- "sql/mysql/ex_create_tables.sql",
- "sql/mysql/install",
- "sql/oracle/create_database.sql",
- "sql/oracle/create_dbuser.sql",
- "sql/oracle/create_tables.mysql",
- "sql/oracle/install",
- "t/00_Test.t",
- "t/10_Config.t",
- "t/11_Config.t",
- "t/20_Log.t",
- "t/30_Format.t",
- "t/31_Format.t",
- "t/32_Format.t",
- "t/33_Format.t",
- "t/34_Format.t",
- "t/35_Format.t",
- "t/40_TM.t",
- "t/50_Do.t",
- "t/51_Do.t",
- "t/52_Do.t",
- "t/53_Do.t",
- "t/60_Base.t",
- "t/61_Base.t",
- "t/70_Email.t",
- "t/71_Email.t",
- "t/72_Email.t",
- "t/73_Email.t",
- "t/74_Email.t",
- "t/75_Email.t",
- "t/76_Email.t",
- "t/77_Email.t",
- "t/80_Cmd.t",
- "t/90_Web.t",
- "t/99_Test.t",
- "t/TC",
- "t/quick/README",
- "t/quick/admins@bugs.perl.org",
- "t/quick/bugdb_A",
- "t/quick/bugdb_I",
- "t/quick/bugdb_N",
- "t/quick/bugdb_P",
- "t/quick/bugdb_V",
- "t/quick/bugdb_a",
- "t/quick/bugdb_admins",
- "t/quick/bugdb_b",
- "t/quick/bugdb_cc",
- "t/quick/bugdb_h",
- "t/quick/bugdb_help",
- "t/quick/bugdb_i",
- "t/quick/bugdb_info",
- "t/quick/bugdb_note",
- "t/quick/bugdb_p",
- "t/quick/bugdb_patch",
- "t/quick/bugdb_propose",
- "t/quick/bugdb_register",
- "t/quick/bugdb_s",
- "t/quick/bugdb_spec",
- "t/quick/bugdb_t",
- "t/quick/bugdb_v",
- "t/quick/bugdb_y",
- "t/quick/close_<tid>@bugs.perl.org",
- "t/quick/doD",
- "t/quick/help@bugs.perl.org",
- "t/quick/info@bugs.perl.org",
- "t/quick/longsubject@perl.org",
- "t/quick/mod_t",
- "t/quick/modulebug@perl.org",
- "t/quick/note_<tid>@bugs.perl.org",
- "t/quick/on_low_<tid>_mac@bugs.perl.org",
- "t/quick/password@bugs.perl.org",
- "t/quick/patch_<tid>@bugs.perl.org",
- "t/quick/perlbug.rep_inst_none",
- "t/quick/perlbug.rep_ok",
- "t/quick/perlbugtron@bugs.perl.org",
- "t/quick/propose@bugs.perl.org",
- "t/quick/register_XUSERID@bugs.perl.org",
- "t/quick/spec@bugs.perl.org",
- "t/quick/targettest@bugs.perl.org",
- "t/quick/test_<tid>@bugs.perl.org",
- "t/quick/test_notid@bugs.perl.org",
- "t/quick/tron_newbug",
- "t/quick/tron_newbug_test",
- "t/quick/www_i",
- "t/ref",
- "t/subs",
- "t/testmails/bugdb/body_1",
- "t/testmails/bugdb/body_2",
- "t/testmails/bugdb/header2admin_0",
- "t/testmails/bugdb/header2admin_1",
- "t/testmails/bugdb/header2admin_2",
- "t/testmails/bugdb/parse_commands_0",
- "t/testmails/bugdb/parse_commands_2",
- "t/testmails/bugdb/parse_commands_4",
- "t/testmails/bugdb/parse_mail_0",
- "t/testmails/bugdb/parse_mail_2",
- "t/testmails/bugdb/parse_mail_4",
- "t/testmails/bugdb/parse_mail_5",
- "t/testmails/bugdb/parse_mail_6",
- "t/testmails/bugdb/parse_mail_8",
- "t/testmails/bugdb/propose_0",
- "t/testmails/bugdb/register_0",
- "t/testmails/bugdb/scan_header_0",
- "t/testmails/bugdb/scan_header_10",
- "t/testmails/bugdb/scan_header_2",
- "t/testmails/bugdb/scan_header_4",
- "t/testmails/bugdb/scan_header_6",
- "t/testmails/bugdb/scan_header_8",
- "t/testmails/bugdb/subject_1",
- "t/testmails/bugdb/subject_2",
- "t/testmails/bugdb/subject_3",
- "t/testmails/get_headers/default_0",
- "t/testmails/get_headers/default_1",
- "t/testmails/get_headers/default_2",
- "t/testmails/get_headers/default_3",
- "t/testmails/get_headers/default_4",
- "t/testmails/get_headers/default_5",
- "t/testmails/get_headers/default_6",
- "t/testmails/get_headers/default_7",
- "t/testmails/get_headers/default_9",
- "t/testmails/get_headers/dodgy_addresses_1",
- "t/testmails/get_headers/get_forward_0",
- "t/testmails/get_headers/get_forward_1",
- "t/testmails/get_headers/get_forward_2",
- "t/testmails/get_headers/get_header_0",
- "t/testmails/get_headers/get_header_default_0",
- "t/testmails/get_headers/get_header_default_1",
- "t/testmails/get_headers/get_header_default_2",
- "t/testmails/get_headers/get_header_remap_0",
- "t/testmails/get_headers/remap_0",
- "t/testmails/get_headers/remap_1",
- "t/testmails/get_headers/remap_10",
- "t/testmails/get_headers/remap_12",
- "t/testmails/get_headers/remap_2",
- "t/testmails/get_headers/remap_3",
- "t/testmails/get_headers/remap_4",
- "t/testmails/get_headers/remap_6",
- "t/testmails/get_headers/remap_7",
- "t/testmails/head_to_head/admin_of_bug_0",
- "t/testmails/head_to_head/admin_of_bug_1",
- "t/testmails/head_to_head/admin_of_bug_2",
- "t/testmails/head_to_head/admin_of_bug_3",
- "t/testmails/head_to_head/admin_of_bug_4",
- "t/testmails/head_to_head/admin_of_bug_5",
- "t/testmails/head_to_head/admin_of_bug_6",
- "t/testmails/head_to_head/admin_of_ticket_0",
- "t/testmails/head_to_head/admin_of_ticket_1",
- "t/testmails/head_to_head/admin_of_ticket_2",
- "t/testmails/head_to_head/admin_of_ticket_3",
- "t/testmails/head_to_head/admin_of_ticket_4",
- "t/testmails/head_to_head/admin_of_ticket_5",
- "t/testmails/head_to_head/admin_of_ticket_6",
- "t/testmails/head_to_head/check_header_0",
- "t/testmails/head_to_head/check_header_1",
- "t/testmails/head_to_head/check_header_2",
- "t/testmails/head_to_head/check_header_3",
- "t/testmails/head_to_head/check_header_4",
- "t/testmails/head_to_head/check_header_5",
- "t/testmails/head_to_head/clean_header_0",
- "t/testmails/head_to_head/clean_header_2",
- "t/testmails/head_to_head/defense_1",
- "t/testmails/head_to_head/defense_2",
- "t/testmails/head_to_head/defense_3",
- "t/testmails/head_to_head/defense_4",
- "t/testmails/head_to_head/in_master_list_0",
- "t/testmails/head_to_head/in_master_list_1",
- "t/testmails/head_to_head/in_master_list_2",
- "t/testmails/head_to_head/process_header_0",
- "t/testmails/head_to_head/splice_0",
- "t/testmails/head_to_head/trim_to_0",
- "t/testmails/head_to_head/trim_to_1",
- "t/testmails/head_to_head/trim_to_2",
- "t/testmails/head_to_head/trim_to_3",
- "t/testmails/head_to_head/trim_to_4",
- "t/testmails/redundant/admin_0",
- "t/testmails/redundant/admin_1",
- "t/testmails/redundant/disappear_1",
- "t/testmails/redundant/disappear_2",
- "t/testmails/redundant/disappear_3",
- "t/testmails/redundant/disappear_4",
- "t/testmails/redundant/propose_0",
- "t/testmails/redundant/propose_1",
- "t/testmails/redundant/register_0",
- "t/testmails/redundant/targets_1",
- "t/testmails/redundant/tm_cc_0",
- "t/testmails/redundant/transparent_1",
- "t/testmails/redundant/transparent_2",
- "t/testmails/redundant/transparent_3",
- "t/testmails/scan_body/category_1",
- "t/testmails/scan_body/category_2",
- "t/testmails/scan_body/category_3",
- "t/testmails/scan_body/category_4",
- "t/testmails/scan_body/osname_1",
- "t/testmails/scan_body/osname_2",
- "t/testmails/scan_body/severity_1",
- "t/testmails/scan_body/severity_2",
- "t/testmails/scan_body/severity_3",
- "t/testmails/scan_body/status_2",
- "t/testmails/scan_body/version_1",
- "t/testmails/scan_body/version_2",
- "t/testmails/scan_body/version_3",
- "t/testmails/switch/bounce_1",
- "t/testmails/switch/bounce_2",
- "t/testmails/switch/insert_0",
- "t/testmails/switch/insert_1",
- "t/testmails/switch/insert_2",
- "t/testmails/switch/new_1",
- "t/testmails/switch/new_2",
- "t/testmails/switch/new_3",
- "t/testmails/switch/new_4",
- "t/testmails/switch/new_ok",
- "t/testmails/switch/quiet_2",
- "t/testmails/switch/quiet_3",
- "t/testmails/switch/quiet_4",
- "t/testmails/switch/quiet_6",
- "t/testmails/switch/quiet_7",
- "t/testmails/switch/reply_1",
- "t/testmails/switch/reply_2",
- "t/testmails/switch/reply_3",
- "t/testmails/switch/reply_4",
- "t/testmails/switch/reply_to",
- "t/testmails/switch/reply_to_2",
- "web/admin/.htaccess",
- "web/admin/.tmtowtdi.htaccess",
- "web/admin/images/home.gif",
- "web/admin/images/linux.gif",
- "web/admin/images/mysql.gif",
- "web/admin/images/perl_republic.gif",
- "web/admin/images/perl_title.gif",
- "web/admin/images/powered_by_mysql.gif",
- "web/admin/images/xxx.gif",
- "web/admin/index.html",
- "web/admin/pbdb.cgi",
- "web/admin/perlbug.cgi",
- "web/footer.html",
- "web/graph.cgi",
- "web/images/home.gif",
- "web/images/linux.gif",
- "web/images/mysql.gif",
- "web/images/perl_republic.gif",
- "web/images/perl_title.gif",
- "web/images/powered_by_mysql.gif",
- "web/images/xxx.gif",
- "web/index.html",
- "web/pbdb.cgi",
- "web/perlbug.cgi",
- "web/perlbug_input"
],+
"files_hash": { … +
"Changes": { … - "mtime": 964104607,
- "size": 4086
},+
"INSTALL": { … - "mtime": 970752451,
- "size": 3706
},+
"MANIFEST": { … - "mtime": 973850351,
- "size": 8005
},+
"Mail/inbox/.xmhcache": { … - "mtime": 964157846,
- "size": 0
},+
"Makefile.PL": { … - "mtime": 965899094,
+
"requires": { … - "ExtUtils::MakeMaker": "0"
},- "size": 954
},+
"Perlbug.pm": { … - "license": "Perl_5",
- "module": "Perlbug",
- "mtime": 971691632,
+
"requires": { … },- "size": 4879
},+
"Perlbug/Admin.pm": { … - "module": "Perlbug::Admin",
- "mtime": 964806880,
+
"requires": { … },- "size": 230
},+
"Perlbug/Base.pm": { … - "module": "Perlbug::Base",
- "mtime": 973604039,
+
"requires": { … - "CGI": "0",
- "Carp": "0",
- "Data::Dumper": "0",
- "File::Spec": "0",
- "FileHandle": "0",
- "Mail::Address": "0",
- "Mail::Header": "0",
- "Mysql": "0",
- "Perlbug": "0",
- "Perlbug::Config": "0",
- "Perlbug::Do": "0",
- "Perlbug::Format": "0",
- "Perlbug::Log": "0",
- "Perlbug::TM": "0",
- "lib": "0",
- "strict": "0",
- "vars": "0"
},- "scan_error": "mismatch ( ]\n(\");\n kill('HUP', -$$);\n croak($alert);\n};\n=head1 DESCRIPTION\nMethods for perlbug database access, all_flags, check_user, get_list, get_data, clean_up, etc.\n=head1 SYNOPSIS\n my $o_base = Perlbug::Base->new;\n my %user = $o_base->user_data('richard');\n print \"User is: \".$user{'username'};\n=head1 METHODS\n=over 4\n=item new\nCreate new Perlbug object, (see also L<Description> above):\n my $pb = Perlbug->new();\n=cut\nsub new {\n my $proto = shift;\n my $class = ref($proto) || $proto;\n my $self = Perlbug::Config->new(@_);\n bless($self, $class);\n # setup the log, results and ranges dir/files...\n my $log = $self->directory('spool').'/logs/' . $self->current('log_file');\n my $res = $self->directory('spool').'/results/' . $self->current('res_file');\n my $rng = $self->directory('spool').'/ranges/' . $self->current('rng_file');\n my $hst = $self->directory('perlbug'.'/.bugdb');\n my $tmp = $self->directory('spool').'/temp/' . $self->current('tmp_file');\n $self->{'o_log'} = Perlbug::Log->new(\n 'log_file' => $log,\n 'res_file' => $res,\n 'rng_file' => $rng,\n 'hst_file' => $hst,\n 'tmp_file' => $tmp,\n 'debug' => $self->current('debug'),\n 'user' => $self->system('user'),\n );\n $self->{'flags'} = {}; # cache\n $self->{'users'} = {}; # cache\n $self->{'_line_break'} = \"\\n\";\n $self->{'_pre'} = '';\n $self->{'_post'} = '';\n $self->{'CGI'} = CGI->new('nodebug') unless defined $self->{'CGI'};\n my $version = $Perlbug::VERSION;\n my $enabler = $self->system('enabled');\n if ($enabler) { # OK\n # Perlbug::Base::debug($self, 0, \"INIT ($$) call debug(\".$self->current('debug').\") $self, enabled($version), scr($0): (UID($<, $>), GID($(, $)))\");\n Perlbug::Base::result($self, '');\n } else { # not OK\n &fatal($self, \"Enabler($enabler) disabled($version) - not OK ($$ - $0) - cutting out!\");\n }\n return $self;\n}\nsub version {\n return $Perlbug::VERSION;\n}\nsub isatest {\n my $self = shift;\n $self->debug('IN', @_);\n my $arg = shift;\n if (defined($arg) and $arg =~ /\\w+/) {\n $self->current('isatest', 1);\n $self->debug(1, \"setting isatest($arg)\");\n }\n $self->debug('OUT', $self->current('isatest'));\n return $self->current('isatest');\n}\n=item url\nStore and return the given url.\n=cut\nsub url { # should be redundant (just a bit shorter to type :)\n my $self = shift;\n my ($url) = shift;\n if (defined($url)) { # may be blank\n $self->current('url', $url);\n }\n return $self->current('url');\n}\nsub qm {\n my $self = shift;\n # return $self->SUPER::qm($_[0]);\n return Perlbug::TM::qm($_[0]);\n}\nsub quote {\n my $self = shift;\n my $dbh = $self->DBConnect;\n return $dbh->quote($_[0]);\n}\n=item do\nWrap a Perlbug::Do command\n my $i_ok = $pb->do('b', 'bugid');\n=cut\nsub do {\n my $self = shift;\n my $arg = shift;\n $self->debug('IN', @_);\n my $user = $self->isadmin;\n my @switches = $self->get_switches;\n my @res = ();\n if ($arg =~ /^[a-z]$/i and grep($arg, @switches)) {\n my @args = (ref($_[0]) eq 'ARRAY') ? @{$_[0]} : @_;\n $self->debug(1, \"Allowing user($user) to Do::do$arg(@args)\");\n my $this = \"do$arg\";\n @res = $self->$this(@_);\n } else {\n $self->debug(0, \"User($user) not allowed to do $arg(@_) with switches(@switches)\");\n }\n $self->debug('OUT', scalar(@res));\n return @res;\n}\n=item debug\nWrap o_log->debug calls\n=cut\nsub debug {\n my $self = shift;\n my @caller = caller;\n $self->{'o_log'}{'caller'} = join(', ', @caller);\n return $self->{'o_log'}->debug(@_);\n}\n=item dodgy_addresses\nReturns quoted, OR-d dodgy addresses prepared for a pattern match ...|...|...\n my $regex = $o_obj->dodgy_addresses('from'); # $rex = 'perlbug\\@perl\\.com|perl5\\-porters\\@perl\\.org|...'\n=cut\nsub dodgy_addresses { # context sensitive (in|out|to|from)\n my $self = shift;\n $self->debug('IN', @_);\n my $scope = shift; # (from|to|cc|test...\n my $i_ok = 1;\n my @duff = (qw(MAILER-DAEMON postmaster));\n if ($scope =~ /^(from|sender)$/i) { # FROM - don't accept mails from here\n push(@duff, $self->get_vals('target'), $self->get_vals('forward'),\n $self->email('bugdb'), $self->email('bugtron'));\n } elsif ($scope =~ /^(to|cc|reply-to)$/i) { # TO - don't send mails in this direction\n push(@duff, $self->get_vals('target'),\n $self->email('bugdb'), $self->email('bugtron'));\n } elsif ($scope =~ /^test$/i) { # TEST\n push(@duff, $self->email('test'), $self->target('test'), $self->forward('test'));\n } else { # ANY\n push(@duff); # could get paranoid :-)\n }\n chomp(@duff); # just in case\n my $dodgy = '';\n foreach my $duff ( map {split(/\\s+/, $_) } @duff) {\n next unless $duff =~ /\\w+/;\n $dodgy .= quotemeta($duff).'|';\n }\n chomp $dodgy; # just in case again\n $dodgy =~ s/^(.+)?\\|/$1/;\n undef $dodgy unless $i_ok == 1; # something in it for example?\n $self->debug(3, \"dodgy_addresses($scope) -> '$dodgy'\");\n $self->debug('OUT', $dodgy);\n return $dodgy; # regex\n}\n=item link\nWrap o_log->link calls\n=cut\nsub link {\n my $self = shift;\n return $self->{'o_log'}->link(@_);\n}\n=item AUTOLOAD\nWrapper for debug functions, translates this:\n $o_obj->debug3($data); # to\n $o_obj->{'o_log'}->debug(3, $data); # this\n=cut\nsub _AUTOLOAD {\n my $self = shift;\n my $meth = $AUTOLOAD;\n $AutoLoader::AUTOLOAD = $AUTOLOAD;\n return if $meth =~ /::DESTROY$/;\n $meth =~ s/^(.*):://;\n my $level = 1;\n if ($meth =~ /debug(\\.)/) { # one of ours :-)\n $level = $1;\n print \"Perlbug::Base->$meth(@_) called debug level($level) as ($AUTOLOAD)\\n\";\n } else {\n $self->SUPER::AUTOLOAD(@_);\n }\n return $self->{'o_log'}->debug($level, @_);\n}\n=item dump\nWrap Data::Dumper catering for www also.\n=cut\nsub dump {\n my $self = shift;\n my $item = shift;\n my $fmt = shift || $self->current('format') || 'a';\n my $ITEM = Dumper($item);\n my @caller = caller(1);\n if ($fmt =~ /h/i) {\n $ITEM = \"<pre>$caller[0] $caller[1] -> $ITEM</pre>\\n\";\n }\n return $ITEM;\n}\n=item can_update\nCheck if current user is allowed to update given item/s.\n print 'yes' if $o_perlbug->can_update([$user||$bid||$mid||$bid|$pid]);\n=cut\nsub can_update {\n my $self = shift;\n my $atem = shift;\n my $scope= shift || 'm'; # message, patch, test\n my $user = $self->isadmin;\n my $i_ok = 0;\n my @atem = (ref($atem) eq 'ARRAY') ? @{$atem} : ($atem);\n if (scalar(@atem) >= 1) {\n ITEM:\n foreach my $item (@atem) { # perlbug_test_653\n # last ITEM unless $i_ok == 1;\n if ($item =~ /^([_\\w]+)$/i) { # userid\n $i_ok = 1 if (($user eq $item) || ($user eq $self->system('bugmaster')) or $self->local_conditions($1, $user));\n $self->debug(3, \"userid($item)->($i_ok)\");\n } elsif ($item =~ /^(\\d{8}\\.\\d{3})$/) { # bug id\n $i_ok = 1 if $self->admin_of_bug($1, $user) or $self->isadmin or $self->local_conditions($1, $user);\n $self->debug(3, \"bugid($item)->($i_ok)\");\n } elsif ($item =~ /^(\\d+)$/) { # messageID or testID or patchID\n my %map = (\n 'm' => 'tm_message',\n 'p' => 'tm_patch',\n 't' => 'tm_test',\n );\n my ($bugid) = $self->get_list(\"SELECT bugid FROM tm_message WHERE messageid = '$1'\");\n $i_ok = 1 if $self->admin_of_bug($bugid, $user) or $self->isadmin or $self->local_conditions($1, $user);\n $self->debug(3, \"messageid($item)->($i_ok)\");\n } else { # unknown type\n # $i_ok = 0;\n # $self->debug(0, \"unrecognised item($item) from user($user)\");\n }\n }\n } else {\n $i_ok = 0;\n $self->debug(0, \"requires something (@atem) to check\");\n }\n $self->debug(0, \"user($user) can_update(@atem) -> isok?($i_ok)\");\n return $i_ok;\n}\nsub local_conditions {\n return 0;\n}\n=item fatal\nWrap o_log->fatal calls\n=cut\nsub fatal {\n my $self = shift;\n my @caller = caller(1);\n return $self->{'o_log'}->fatal(@_, @caller);\n}\n=item start\n=cut\nsub start {\n my $self = shift;\n return Perlbug::Format::start($self, @_);\n}\n=item finish\n=cut\nsub finish {\n my $self = shift;\n return Perlbug::Format::finish($self, @_);\n}\n# YUK: all these format calls should be remapped properly!\n=item format\nWrap o_format->format calls\n=cut\nsub format {\n my $self = shift;\n my $args = shift;\n return Perlbug::Format::fmt($self, $args, $self->current('format'));\n}\n=item format_overview\nWrap o_format->overview calls\n=cut\nsub format_overview {\n my $self = shift;\n my $args = shift;\n return $self->SUPER::overview($args, $self->current('format'));\n}\n=item format_schema\nWrap o_format->schema calls\n=cut\nsub format_schema {\n my $self = shift;\n my $args = shift;\n return $self->schema($args, 'a'); # hardwire ascii formatting\n}\n=item copy\nWrap Log::copy\n=cut\nsub copy {\n my $self = shift;\n return $self->{'o_log'}->copy(@_);\n}\n=item flags\nReturns array of options for given type.\n my @list = $pb->flags('category');\n=cut\nsub flags {\n my $self = shift;\n my $arg = shift;\n # $self->debug(3, \"flags called with($arg)\");\n my @caller = caller(1);\n # $self->debug(3, \"flags: arg($arg) from caller(@caller)\");\n my @flags = ();\n if ( (defined($arg)) && ($arg =~ /^(\\w+)$/) ) {\n if ((defined($self->{'flags'}{$arg})) && ($self->{'flags'}{$arg}[0] =~ /\\w+/)) {\n # use existing values\n @flags = @{$self->{'flags'}{$arg}};\n # $self->debug(3, \"Reusing data for $arg flags\");\n } else {\n # get new values\n @flags = $self->get_list(\"SELECT flag FROM tm_flags WHERE type = '$arg'\");\n # store them for later\n $self->{'flags'}{$arg} = \\@flags;\n # $self->debug(2, \"New data for flag '$arg': @flags\");\n }\n } else {\n $self->fatal(\"Can't get flags for invalid arg($arg)\");\n }\n # $self->debug(2, \"Returning flags: @flags\");\n return @flags;\n}\n=item all_flags\nReturn all flags available in db keyed by type.\n my %flags = $pb->all_flags;\n %flags = ( # now looks like this:\n 'category' => ['core', 'docs', 'install'], # ...\n 'status' => ['open', 'onhold', 'onhold'], # ...\n # ...\n );\n=cut\nsub all_flags {\n my $self = shift;\n my %flags = ();\n my @types = ();\n if (defined($self->{'flag_types'}) && ref($self->{'flag_types'}) eq 'ARRAY') {\n @types = @{$self->{'flag_types'}};\n } else {\n @types = $self->get_list(\"SELECT DISTINCT type FROM tm_flags\");\n $self->{'flag_types'} = \\@types;\n }\n foreach my $flag (@types) {\n my @flags = $self->flags($flag);\n $flags{$flag} = \\@flags;\n }\n return %flags;\n}\n=item date_hash\n=cut\nsub date_hash {\n my $self = shift;\n my %dates = (\n 'any' => '',\n 'today' => ' TO_DAYS(NOW()) - TO_DAYS(created) <= 1 ',\n 'this week' => ' TO_DAYS(NOW()) - TO_DAYS(created) <= 7 ',\n 'less than 1 month' => ' TO_DAYS(NOW()) - TO_DAYS(created) <= 30 ',\n 'less than 3 months'=> ' TO_DAYS(NOW()) - TO_DAYS(created) <= 90 ',\n 'over 3 months' => ' TO_DAYS(NOW()) - TO_DAYS(created) >= 90 ',\n );\n return %dates;\n}\n=item active_admins\nReturns active admins from db.\n my @active = $pb->active_admins;\n=cut\nsub active_admins {\n my $self = shift;\n my @active = $self->get_list(\"SELECT DISTINCT userid FROM tm_user WHERE active = '1'\");\n return @active;\n}\n=item active_admin_addresses\nReturns active admin addresses from db.\n my @addrs = $pb->active_admin_addresses;\n=cut\nsub active_admin_addresses {\n my $self = shift;\n my $active = join(\"', '\", $self->active_admins);\n my @active = $self->get_list(\"SELECT DISTINCT address FROM tm_user WHERE userid IN ('$active')\");\n return @active;\n}\n=item user_data\nReturn (cached) data on given user\n my %data = $pb->user_data('richard');\n=cut\nsub user_data {\n my $self = shift;\n my $user = shift;\n my $h_cache = {};\n if ((defined($self->{'users'}{$user})) &&\n (ref($self->{'users'}{$user}) eq 'HASH') &&\n ($self->{'users'}{$user}{'name'} =~ /\\w+/)\n ) { # ok, give up and use it.\n $self->debug(3, \"Reusing cached data for '$user'\");\n $h_cache = $self->{'users'}{$user};\n } else {\n $h_cache = $self->user_get($user); # TM\n if (ref($h_cache) eq 'HASH') {\n if ($$h_cache{'name'} =~ /\\w+/) {\n # store it for later\n $self->{'users'}{$user} = $h_cache;\n my ($tkts) = $self->get_list(\"SELECT count('bugid') FROM tm_bug_user WHERE userid = '$user'\");\n $$h_cache{'bugs'} = $tkts;\n $self->debug(3, \"New data for user: '$user': $h_cache\");\n } else {\n # looks like duff data\n $self->debug(0, \"Can't get any data for '$user' from '$h_cache'\");\n }\n } else {\n $self->debug(0, \"Duff data for '$user'\");\n }\n }\n return $h_cache; # return whatever we got\n}\n=item help\nReturns help message for perlbug database.\n my $help = $pb->help;\n=cut\nsub help {\n my $self = shift;\n $self->debug('IN', '');\n my $url = $self->web('hard_wired_url');\n my $help = qq|A searchable live reference database of email-initiated bugs and patches.|;\n # Or request information: spec\\@bugs.perl.org\n $self->debug('OUT', $help);\n return $help;\n}\nsub theflags { # should be in db\n my $self = shift;\n $self->debug('IN', '');\n my $info = q|\nA brief explanation of the usually available flags follows:\nStatus:\n abandoned\n closed\n ok\n onhold\n open\nCategory:\n bounce\n core\n docs\n install\n library\n notabug\n patch\n unknown\n utilities\nOsname:\n generic\n macos\n unix\n win32\n etc...\nSeverity:\n critical\n fatal\n high\n low\n medium\n none\n wishlist\n zero\n |;\n $self->debug('OUT', length($info));\n return $info;\n}\n=item spec\nReturns spec message for perlbug database.\n my $spec = $pb->spec();\n=cut\nsub spec {\n my $self = shift;\n $self->debug('IN', '');\n my $data = '';\n my %flags = $self->all_flags;\n foreach my $key (keys %flags) {\n my $vals = join(', ', $self->flags($key));\n $data .= sprintf('%-15s', ucfirst($key).':').\"$vals\\n\";\n }\n my $ehelp= $self->email('help');\n my $bids = my @bids = $self->get_list(\"SELECT bugid FROM tm_bug\");\n my $open = my @open = $self->get_list(\"SELECT bugid FROM tm_bug WHERE status = 'open'\");\n my $admins = my @admins = $self->get_list(\"SELECT userid FROM tm_user WHERE active = '1'\");\n my ($bugdb, $cgi, $title) = ($self->email('bugdb'), $self->web('hard_wired_url'), $self->system('title'));\n # my @targets = $self->get_list(\"SELECT DISTINCT flag FROM tm_flags WHERE type = 'osname' AND flag != 'unix'\");\n my @targets = $self->get_keys('target');\n $data .= qq|\nMail sent to the following targets will register a new bug in the database and\nforward it onto the appropriate mailing list:\n|;\n foreach my $tgt (@targets) { #\n next unless $tgt =~ /\\w+/;\n my $first = sprintf('%-15s', ucfirst($tgt).':');\n my @notify = split(/\\s+/, $self->target($tgt));\n my $notify = join(' or ', @notify);\n my $reply = $self->forward($tgt);\n $data .= qq|${first} ${notify} -> ($reply)\\n|;\n }\n $data .= \"\\n\";\n my $info = qq|\nThe $title bug tracking system: $bids bugs ($open open) with the following categories:\n$data\nAnyone may search the database via the web:\n $cgi\nor the email interface:\n To: $ehelp\nSeveral additional mail commands are available, send an email with an address,\n(subject line is ignored), of the following form:\nPropose changes to the status of a bug:\n To: propose_close_bugid_install\\@bugs.perl.org\nRegister to be an administrator, (currently we have $admins active admins):\n To: register_MYUSERID\\@bugs.perl.org\nForward the body of this email to all active administrators:\n To: admins\\@bugs.perl.org\nFeatures:\n Written in perl\n Robust, with test suites:\n All tests successful.\n Files=28, Tests=162, 148 wallclock secs (59.27 cusr + 2.61 csys = 61.88 CPU)\n Documented (in perldoc -> do what I say _and_ what I do :)\n Downloadable open source and data.\n All under RCS -> current v$Perlbug::VERSION.\n Integrated with perlbug (configurable via Matches file).\n It has a simple (single config file) installation (other people can use it).\n Site configurable email newbug recognition and forwarding.\n Site configurable scanning of email bodies -> categorisation of reports.\n Standard installation*: make; make test; make install.\n Multiple interfaces (take your pick):\n Web -> search, browse and destroy interface\n Tron -> target and mailing list slurper/forwarder\n Email 1 -> subject: oriented search, report and admin\n Email 2 -> to: oriented report and admin\n Command line -> for local db (similar to email)\n 5+ different formatting types for all discrete objects are supported across\n all outputs for both public and administrative interfaces for:\n bugs, messages, patches, notes, tests, users\n Differential user/admin help/spec for all formats.\n Several utility scripts:\n cron.cmd -> regular backup, notification and cleanup jobs\n fixit -> fix issues with database inconsistencies, or ever changing\n requirements...\n hist.cmd -> slurp data into db from archives\n Accepts target mail addresses (and thereby sets category etc) and forwards to\n appropriate mailing list/s.\n Watches various mailing list for replies to existing bugs to slurp,\n checking subject and reply-to, etc.\n Defense mechanisms against loops, spam, and other entertaining factors.\n Ignores previously seen message-ids, non-relevant mail.\n Test targets to email interfaces (dumps header -> originator)\n Email interface handles any of the following To lines:\n close_<bugid>_\\@bugs.perl.org -> bug admin\n busy_win32_install_fatal_<bugid>\\@bugs.perl.org -> admin\n propose_close_<bugid>_\\@bugs.perl.org -> bug admin proposal\n note_<bugid>_\\@bugs.perl.org -> assign note\n patch_<version>_<bugid>_<changeid>\\@bugs.perl.org -> assign a patch\n register_me\\@bugs.perl.org -> admin registration request\n admins\\@bugs.perl.org -> admin mail forward\n help\\@bugs.perl.org -> :-)\n Or the following (not very cryptic) Subject lines:\n -h\n -b <bugid>+\n -c category search\n -s subject_search\n -r retrieval by original message body search criteria\n -q select * from tm_bug\n -H -d2 -l -A close <bugid>+ lib -c patch -e some\\@one.net\n -c pa cl wi -m77 812 1 21 -b 33 -B 34 35 -o -l -d2 -a clo inst <bugid>+ -fA\n etc...\n Auto database dump, email of overview and bugid->admin assignation\n Patches can be emailed in -> auto close of bug\n Notes can be assigned from any interface to any bug\n Non-admin emails -> converted to proposals -> mailed to active\n administrators/bugmongers\n Cc: list (and admins) are optionally auto-notified of any status\n changes to bugs\n Relationships between bugs (parent-child) are assignable.\n Retrieval of databank via email.\n Logging of all activities, admin history tracking.\n Graphical display of overview (admins, categories, severity, osname, status).\n|;\n $self->debug('OUT', $info);\n return $info;\n}\n=item flow\nDetails how the mail / web mechanism flows\n=cut\nsub flow {\n my $self = shift;\n $self->debug('IN', '');\n my $flow = qq|\nWe have bugs, messages(related to bugs), tests(against bugs), patches(against bugs and software versions),\nadmins(who categorise and deal with bugs) and users(who can browse the database).\nThis describes the interaction between the different parts of the system:\nBUGS\nA bug is created by sending an email to one of the target addresses.\nThe mail is intered into the database, and is forwarded with a bugid onto the appropriate mailing list.\nBugs may be related to one another, where repeated, or the chain of events has been interrupted.\nMESSAGES\nThe mailing lists are then tracked for replies to this bug, when found these are also put into the database, and assigned the appropriate bugid.\nADMINS\nRegistered admins are the only people permitted to alter the status of a bug.\nAnyone may search the system for bugs using one of several interfaces.\nAnyone may propose bug changes by emailing the administrators.\nIf a close_<bugid>@* mail is recieved from an admin, the contents will go as a comment against the bug.\nNOTES\nAdmins may assign one or more comments to a bug to indicate why the status has changed.\nPATCHES\nAnyone may throw a patch at the system, though a non-admin mail will be forwarded to active administrators (as per proposals - above).\nAn accepted patch will close related bugids (if there are any), pick up the changeID and be entered in the database as a discrete object. Patches may be assigned to more than one bug - bugs may be assigned to more than one patch.\nIn this case a comment will not be entered into the db, the presence of the patch is expected to be evidence of the bug's demise.\nCHANGE IDs\nWhen a patch is recieved, it is expected to have a changeID (from the Changes... file/s), and one or more bugids. Neither of these are mandatory - read: nice to have :-)\n CC_LIST\n LOG\n|;\n $self->debug('OUT', $flow);\n return $flow;\n}\n=item administration_failure\nDeal with a failed administration attempt\n my $i_ok = $self->administration_failure($bid, $user, $commands);\n=cut\nsub administration_failure {\n my $self = shift;\n $self->debug('IN', @_);\n my $bid = shift;\n my $cmds = shift;\n my $user = shift || $self->isadmin;\n my $reason = shift || '';\n my $i_ok = 1;\n $self->debug(0, \"XXX: bugid($bid) update($cmds) FAILED for user($user) -> $reason!\");\n $self->debug('OUT', $i_ok);\n return $i_ok;\n}\n=item check_user\nChecks given user is registered in the database as an admin.\nSets userid in L<admin> and thereby L<status> for later reference.\n $pb->check_user($user_name);\n=cut\nsub check_user {\n #default administrator check (email uses from, web uses user/pass)\n my $self = shift;\n my $user = shift || 'generic';\n $self->debug(2, \"check_user($user)\");\n if ($self->system('restricted')) {\n my $sql = \"SELECT userid FROM tm_user WHERE userid = '$user' AND active IS NOT NULL\";\n my @ids = grep(!/generic/i, $self->get_list($sql));\n ID:\n foreach my $id (@ids) {\n if (($id =~ /^\\w+$/) && ($id =~ /$user/)) {\n $self->current('admin', $id);\n $self->current('switches', $self->system('user_switches').$self->system('admin_switches'));\n $self->debug(2, \"given param ($user) taken as admin id ($id), switches set: \".$self->current('switches'));\n last ID;\n }\n }\n } else {\n $self->current('admin', $user);\n $self->current('switches', $self->system('user_switches').$self->system('admin_switches'));\n $self->debug(2, \"Non-restricted user($user) taken as admin id, switches set: \".$self->current('switches'));\n }\n return $self->isadmin;\n}\n=item isadmin\nStores and returns current admin userid (post check_user), checks whether system is restricted or not.\n next unless $pb->isadmin;\n=cut\nsub isadmin { #store and retrieve admin flag (and id)\n my $self = shift;\n my $prop = shift;\n my ($user) = ($self->system('restricted')) ? grep(!/generic/i, $self->current('admin')) : $self->current('admin');\n return $user;\n}\n=item status\nReturns 'A' or 'U' depending on whether user is an admin or a 'mere' user.\n my $thing = ($self->status eq 'A') ? 'key' : 'lock';\n=cut\nsub status {\n my $self = shift;\n return $self->current('admin') ? 'A' : 'U';\n}\n=item ok\nChecks bugid is in valid format (looks like a bugid) (uses get_id):\n &do_this($id) if $pb->ok($id);\n=cut\nsub ok {\n my $self = shift;\n my $given = shift;\n my ($ok, $bid) = $self->get_id($given);\n return $ok;\n}\n=item get_id\nDetermine if the string contains a valid bug ID\n=cut\nsub get_id {\n my $self = shift;\n my $str = shift;\n my ($ok, $id) = $self->SUPER::get_id($str);\n return ($ok, $id);\n}\n=item _switches\nStores and returns ref to list of switches given by calling script.\nOnly these will be parsed within the command hash in L<process_commands>.\n my $switches = $pb->_switches(qw(e t T s S h l)); #sample\n=cut\nsub _switches {\n my $self = shift;\n if (@_) {\n my $switches = join(' ', grep(/^a-z$/i, @_));\n $self->debug(1, \"Setting allowed, and order of, switches ($switches)\");\n $self->current('switches', $switches);\n }\n return $self->current('switches');\n}\n=item result\nStorage area (file) for results from queries, returns the FH.\n my $res = $pb->result('store this stuff'); #store\n=cut\nsub result {\n my $self = shift;\n return $self->{'o_log'}->append('res', $_[0].$self->line_break);\n}\n=item fh\nWrapper for Log fh\n=cut\nsub fh {\n my $self = shift;\n return $self->{'o_log'}->fh($_[0], $_[1]);\n}\n=item set_site\nSet the site directory for text files, headers, todos etc.\n=cut\nsub set_site {\n my $self = shift;\n my $tgt = shift;\n if ($tgt !~ /^\\w+$/) {\n $self->debug(0, \"set_site($tgt) requires a plain target\");\n }\n my $target = $self->directory('site').\"/$tgt\".$self->file_ext;\n if (-e $target && -f _) { # OK - site spec\n $self->{'o_log'}->{$tgt.'_file'} = $target;\n $self->debug(0, \"target($tgt) set to '$target'\");\n } else { # give up\n croak(\"Can't locate target($tgt) file($target) - check directory contents?\");\n }\n}\nsub file_ext { return ''; }\n=item read\n=cut\nsub read {\n my $self = shift;\n my $tgt = shift;\n if (!defined($self->{'o_log'}->{$tgt.'_file'})) { # !~ /\\w+/) {\n $self->set_site($tgt);\n }\n return join('', @{ $self->{'o_log'}->read($tgt) });\n}\n=item append\nWrapper for Log append\n=cut\nsub append {\n my $self = shift;\n if ($self->{'o_log'}->{$_[0].'_file'} !~ /\\w+/) {\n $self->set_site($_[0]);\n }\n return $self->{'o_log'}->append($_[0], $_[1]);\n}\n=item get_results\nReturn the results of the queries from this session.\n my $a_data = $pb->get_results;\n=cut\nsub get_results {\n my $self = shift;\n return join('', @{ $self->{'o_log'}->read('res') });\n}\n=item get_list\nReturns a simple list of items (column values?), from a sql query.\n my @list = $pb->get_data('SELECT bugid FROM tm_bug');\n=cut\nsub get_list {\n my $self = shift;\n $self->debug('IN', @_);\n my ($sql) = @_;\n my @info = ();\n if ($sql) {\n my $csr = $self->query($sql);\n if (defined($csr)) {\n while ( (my $info) = $csr->fetchrow) { #? fetchrow.$ref(_hashref)\n push (@info, $info) if defined $info;\n }\n $self->debug(3, 'get_list found '.$csr->num_rows.' rows');\n my $res = $csr->finish;\n } else {\n $self->debug(0, \"undefined cursor for get_list(): $Mysql::db_errstr\");\n }\n }\n $self->debug('OUT', scalar(@info));\n return @info;\n}\n=item get_data\nReturns a list of hash references, from a sql query.\n my @hash_refs = $pb->get_data('SELECT * FROM tm_bug');\n=cut\nsub get_data {\n my $self = shift;\n $self->debug('IN', @_);\n my ($sql) = @_;\n #? return $self->get_list($sql, '_hashref');\n my @results = ();\n if ($sql) {\n my $csr = $self->query($sql);\n if (defined($csr)) {\n while (my $info = $csr->fetchrow_hashref) {\n if (ref($info) eq 'HASH') {\n push @results, $info;\n }\n }\n $self->debug(3, 'get_data found '.$csr->num_rows.' rows');\n my $res = $csr->finish\n } else {\n $self->debug(0, \"undefined cursor: '$Mysql::db_errstr'\");\n }\n }\n $self->debug('OUT', scalar(@results));\n return @results;\n}\n=item exec\nReturns statement handle from sql query.\n my $sth = $pb->exec(\"INSERT @data INTO table\");\n=cut\nsub exec {\n my $self = shift;\n $self->debug('IN', @_);\n my ($sql) = @_;\n $self->debug(1, \"exec($sql)\");\n return undef unless $sql;\n my $sth = $self->query($sql);\n if ($sth) {\n my $rows = $sth->num_rows;\n $self->debug(2, \"Exec rows ($rows) affected.\");\n } else {\n $self->debug(0, \"Exec ($sql) error: $Mysql::db_errstr\");\n }\n $self->debug('OUT', $sth);\n return $sth;\n}\n=item exists\nDoes this bugid exist in the db?\n=cut\nsub exists {\n my $self = shift;\n $self->debug('IN', @_);\n my $bid = shift;\n my $i_ok = 0;\n if (!$self->ok($bid)) {\n $i_ok = 0;\n $self->debug(0, \"bugid($bid) doesn't look good!\");\n } else {\n $i_ok = my @bugids = $self->get_list(\"SELECT bugid FROM tm_bug WHERE bugid = '$bid'\");\n $self->debug(2, \"bugid($bid)? -> $i_ok(@bugids)\");\n }\n $self->debug('OUT', $i_ok);\n return $i_ok;\n}\n=item tm_parent_child\nAssign to given bugid, given list of parent and child bugids\n=cut\nsub tm_parent_child {\n my $self = shift;\n $self->debug('IN', @_);\n $self->debug(0, \"TPC: @_\");\n my $bid = shift;\n my $a_p = shift;\n my $a_c = shift;\n my @cc = @_;\n my @ccs = ();\n my $i_ok = 1;\n if ($bid !~ /\\d{8}\\.\\d{3}/) {\n $i_ok = 0;\n $self->debug(0, \"requires bid($bid)\");\n } else {\n my @parents = ();\n my @children = ();\n my @xp = @{$a_p} if ref($a_p) eq 'ARRAY';\n my @xc = @{$a_c} if ref($a_c) eq 'ARRAY';\n XP:\n foreach my $p (@xp) {\n next XP if grep(/^$p$/, @xc);\n push(@parents, $p); # otherwise\n }\n $self->debug(0, \"TPC 1: p(@parents), c(@children)\");\n XC:\n foreach my $c (@xc) {\n next XC if grep(/^$c$/, @xp);\n push(@children, $c); # otherwise\n }\n $self->debug(0, \"TPC 2: p(@parents), c(@children)\");\n PARENT:\n foreach my $p (@parents) {\n next PARENT unless $p =~ /\\b\\d{8}\\.\\d{3}\\b/;\n next PARENT if $p eq $bid;\n next PARENT if grep(/^$p$/, @children);\n my ($ok) = $self->get_list(\"SELECT bugid FROM tm_bug WHERE bugid = '$p'\");\n if ($ok) {\n my @pexists = $self->get_list(\"SELECT parentid FROM tm_parent_child WHERE parentid = '$p' and childid = '$bid'\");\n my @cexists = $self->get_list(\"SELECT childid FROM tm_parent_child WHERE childid = '$p' and parentid = '$bid'\");\n if (!@pexists and !@cexists) {\n my $insert = \"INSERT INTO tm_parent_child values ('$p', '$bid')\";\n my $sth = $self->exec($insert);\n $ok = $self->track('r', $bid, \"attached parent($p)\");\n $self->debug(0, \"Inserted ($insert) previous(@pexists, @cexists)\");\n }\n }\n }\n CHILD:\n foreach my $c (@children) {\n next CHILD unless $c =~ /\\b\\d{8}\\.\\d{3}\\b/;\n next CHILD if $c eq $bid;\n next PARENT if grep(/^$c$/, @parents);\n my ($ok) = $self->get_list(\"SELECT bugid FROM tm_bug WHERE bugid = '$c'\");\n $self->debug(0, \"TPC 3: c($c) -> ok($ok)\");\n if ($ok) {\n my @pexists = $self->get_list(\"SELECT parentid FROM tm_parent_child WHERE parentid = '$bid' and childid = '$c'\");\n my @cexists = $self->get_list(\"SELECT childid FROM tm_parent_child WHERE childid = '$bid' and parentid = '$c'\");\n if (!@pexists and !@cexists) {\n my $insert = \"INSERT INTO tm_parent_child values ('$bid', '$c')\";\n my $sth = $self->exec($insert);\n $ok = $self->track('r', $bid, \"attached child($c)\");\n $self->debug(0, \"Inserted ($insert) previous(@pexists, @cexists)\");\n }\n }\n }\n }\n $self->debug('OUT', $i_ok);\n return $i_ok; # \\@parents, \\@children\n}\n=item tm_cc\nAssign to given bugid, given list of cc's, return current cc's\n=cut\nsub tm_cc {\n my $self = shift;\n $self->debug('IN', @_);\n my $bid = shift;\n my @cc = @_;\n my @ccs = ();\n my $i_ok = 1;\n my $get_cc = qq|SELECT DISTINCT address FROM tm_cc WHERE bugid = '$bid'|;\n if (!$self->exists($bid)) {\n $i_ok = 0;\n $self->debug(2, \"tm_cc requires a valid bugid($bid) for an update\");\n } else {\n @ccs = $self->get_list($get_cc);\n my @o_ccs = Mail::Address->parse(@cc); # foreach @cc ?\n my @targets = map { split(/\\s+/, $_) } ($self->get_vals('target'), $self->get_vals('forward'), $self->email('bugdb'), $self->email('bugtron'));\n CC:\n foreach my $o_cc (@o_ccs) {\n next CC unless ref($o_cc);\n my $cc = $o_cc->address;\n chomp($cc);\n next CC if grep(/^$cc$/i, @targets);\n next CC if grep(/^$cc$/i, @ccs);\n next CC unless $self->ck822($cc);\n my $insert = \"INSERT INTO tm_cc values ('$bid', '$cc')\";\n my $sth = $self->exec($insert);\n my $ok = $self->track('c', $bid, \"assigned cc($cc)\");\n $self->debug(0, \"Assigned($bid) <- cc($cc)\");\n }\n }\n @ccs = $self->get_list($get_cc);\n $self->debug('OUT', $i_ok, @ccs);\n return ($i_ok, @ccs);\n}\n=item current_status\nGet's current status of bug for reference.\n=cut\nsub current_status {\n my $self = shift;\n $self->debug('IN', @_);\n my $bid = shift;\n my $data = '';\n my $i_ok = 1;\n my $get_cc = qq|SELECT * FROM tm_bug WHERE bugid = '$bid'|;\n if (!$self->exists($bid)) {\n $i_ok = 0;\n $self->debug(2, \"requires a valid bugid($bid) to read\");\n } else {\n my ($h_data) = $self->get_data(\"SELECT * FROM tm_bug WHERE bugid = '$bid'\");\n if (ref($h_data) eq 'HASH') {\n my %data = %{$h_data};\n $data = qq|\n Version: $data{'version'}\n Status: $data{'status'}\n Category: $data{'category'}\n Severity: $data{'severity'}\n Os: $data{'osname'}\n Fixed in: $data{'fixed'}\n|; } else {\n $self->debug(0, \"retrieved duff data($h_data) with bugid($bid)\");\n }\n }\n $self->debug('OUT', $data);\n return $data;\n}\n=item tm_bug_patch\nAssign to given bugid, given list of patchids, return valid, @pids\n=cut\nsub tm_bug_patch {\n my $self = shift;\n $self->debug('IN', @_);\n my $bid = shift;\n my @patches = @_;\n my @pids = ();\n my $i_ok = 1;\n my $get_pids = qq|SELECT DISTINCT patchid FROM tm_bug_patch WHERE bugid = '$bid'|;\n if (!$self->exists($bid)) {\n $i_ok = 0;\n $self->debug(2, \"tm_bug_patch requires a valid bugid($bid) for an update\");\n } else {\n my @current = $self->get_list($get_pids);\n my @exists = $self->get_list(\"SELECT patchid FROM tm_patch\");\n PID:\n foreach my $pid (@patches) {\n next PID unless $pid =~ /^\\d+$/;\n next PID unless grep(/^$pid$/, @exists);\n next PID if grep(/^$pid$/, @current);\n my $insert = \"INSERT INTO tm_bug_patch values ('$bid', '$pid')\";\n my $sth = $self->exec($insert);\n my $ok = $self->track('x', $bid, \"assigned patchid($pid)\");\n $self->debug(0, \"Assigned($bid) <- patchid($pid)\");\n }\n }\n @pids = $self->get_list($get_pids);\n $self->debug('OUT', $i_ok, @pids);\n return ($i_ok, @pids);\n}\n=item tm_bug_note\nAssign to given bugid, given list of note ids, return valid, @nids\n=cut\nsub tm_bug_note {\n my $self = shift;\n $self->debug('IN', @_);\n my $bid = shift;\n my @nids = @_;\n my @tids = ();\n my $i_ok = 1;\n my $get_tids = qq|SELECT DISTINCT noteid FROM tm_bug_note WHERE bugid = '$bid'|;\n if (!$self->exists($bid)) {\n $i_ok = 0;\n $self->debug(2, \"tm_bug_note requires a valid bugid($bid) for an update\");\n } else {\n my @current = $self->get_list($get_tids);\n my @exists = $self->get_list(\"SELECT noteid FROM tm_note\");\n TID:\n foreach my $nid (@nids) {\n next TID unless $nid =~ /^\\d+$/;\n next TID unless grep(/^$nid$/, @exists);\n next TID if grep(/^$nid$/, @current);\n my $insert = \"INSERT INTO tm_bug_note values ('$bid', '$nid')\";\n my $sth = $self->exec($insert);\n my $ok = $self->track('x', $bid, \"assigned noteid($nid)\");\n $self->debug(0, \"Assigned($bid) <- noteid($nid)\");\n push(@current, $nid);\n }\n }\n @nids = $self->get_list($get_tids);\n $self->debug('OUT', $i_ok, @nids);\n return ($i_ok, @nids);\n}\n=item tm_bug_test\nAssign to given bugid, given list of testids, return valid, @tids\n=cut\nsub tm_bug_test {\n my $self = shift;\n $self->debug('IN', @_);\n my $bid = shift;\n my @tests = @_;\n my @tids = ();\n my $i_ok = 1;\n my $get_tids = qq|SELECT DISTINCT testid FROM tm_bug_test WHERE bugid = '$bid'|;\n if (!$self->exists($bid)) {\n $i_ok = 0;\n $self->debug(2, \"tm_bug_test requires a valid bugid($bid) for an update\");\n } else {\n my @current = $self->get_list($get_tids);\n my @exists = $self->get_list(\"SELECT testid FROM tm_test\");\n TID:\n foreach my $tid (@tests) {\n next TID unless $tid =~ /^\\d+$/;\n next TID unless grep(/^$tid$/, @exists);\n next TID if grep(/^$tid$/, @current);\n my $insert = \"INSERT INTO tm_bug_test values ('$tid', '$bid')\";\n my $sth = $self->exec($insert);\n my $ok = $self->track('x', $bid, \"assigned testid($tid)\");\n $self->debug(0, \"Assigned($bid) <- testid($tid)\");\n push(@current, $tid);\n }\n }\n @tids = $self->get_list($get_tids);\n $self->debug('OUT', $i_ok, @tids);\n return ($i_ok, @tids);\n}\n=item notify_cc\nNotify tm_cc addresses of changes, current status of bug.\n=cut\nsub notify_cc {\n my $self = shift;\n $self->debug('IN', @_);\n my $bid = shift;\n my $cmds = shift;\n my $orig = shift || '';\n my $i_ok = 1;\n if (!($self->ok($bid) and $self->exists($bid))) {\n $i_ok = 0;\n $self->debug(0, \"notify_cc requires a valid bugid($bid)\");\n } else {\n my %p = $self->parse_str($cmds);\n my @unknown = (ref($p{'unknown'}) eq 'ARRAY') ? @{$p{'unknown'}} : ();\n my @versions = (ref($p{'versions'}) eq 'ARRAY') ? @{$p{'versions'}} : ();\n my $fmt = $self->current('format');\n my $bugdb = $self->email('bugdb');\n $self->context('a');\n my $url = $self->web('hard_wired_url').\"?req=bid&bid=$bid\\n\";\n $self->{'o_log'}->setresult($self->directory('spool').'/temp/'.$self->current('tmp_file'));\n $self->dob([$bid]); # a bit less more data :-)\n my $status = qq|The status of bug($bid) has been updated:\nOriginal status:\n$orig\nCurrent status:\n|;\n $status .= $self->get_results;\n $status .= qq|\nTo see current data on this bug($bid) send an email of the following form:\n To: $bugdb\n Subject: -B $bid\nOr to see this data on the web, visit:\n $url\n |;\n $self->{'o_log'}->setresult;\n $self->context($fmt);\n my ($addr) = $self->get_list(\"SELECT sourceaddr FROM tm_bug WHERE bugid = '$bid'\");\n my ($o_to) = Mail::Address->parse($addr);\n my ($to) = (ref($o_to)) ? $o_to->address : $self->system('maintainer');\n my ($i_cc, @ccs) = $self->tm_cc($bid);\n my @uids = $self->get_list(\"SELECT userid FROM tm_bug_user WHERE bugid = '$bid'\");\n my $claimants = join(\"', '\", @uids);\n my @claimants = $self->get_list(\"SELECT address FROM tm_user WHERE userid IN ('$claimants')\");\n require Perlbug::Email; # yek\n my $o_email = Perlbug::Email->new;\n $o_email->_original_mail($o_email->_duff_mail); # dummy\n my $o_notify = $o_email->get_header;\n $o_notify->add('To', $to);\n $o_notify->add('Cc', join(', ', @ccs, @claimants)) unless grep(/nocc/i, @unknown, @versions);\n $o_notify->add('From', $self->email('bugdb'));\n $o_notify->add('Subject', $self->system('title').\" $bid status update\");\n $i_ok = $o_email->send_mail($o_notify, $status);\n $self->debug(0, \"notified($i_ok) <- ($bid)\");\n }\n $self->debug('OUT', $i_ok);\n return $i_ok\n}\nsub todo {\n my $self = shift;\n $self->debug('IN', @_);\n my $todo = shift;\n my $i_ok = 1;\n if ($todo !~ /\\w+/) {\n $i_ok = 0;\n $self->debug(0, \"requires a something todo($todo)\");\n } else {\n my $fmt = $self->current('format');\n $self->current('format', 'a');\n my $to = $self->system('maintainer');\n require Perlbug::Email; # yek\n my $o_email = Perlbug::Email->new;\n my $o_todo = $o_email->get_header;\n $o_todo->add('To', $to);\n $o_todo->add('From', $self->email('bugdb'));\n $o_todo->add('Subject', $self->system('title').\" todo request\");\n $i_ok = $o_email->send_mail($o_todo, $todo);\n $self->debug(0, \"todo'd($i_ok) <- ($todo)\");\n $self->current('format', $fmt);\n }\n $self->debug('OUT', $i_ok);\n return $i_ok\n}\n=item track\nTrack some function or modification to the db.\n $i_tracked = $self->track($type, $id, $entry);\n=cut\nsub track {\n my $self = shift;\n $self->debug('IN', @_);\n my $type = shift;\n my $id = shift;\n my $entry = shift; # cmd\n my $userid = $self->isadmin;\n my $quoted = $self->quote($entry);\n $self->debug(3, \"type($type), id($id), entry($entry)->quoted($quoted), userid($userid)\");\n my $i_ok = 1;\n my $insert = qq|INSERT INTO tm_log values (now(), NULL, $quoted, '$userid', '$id', '$type')|;\n my $res = $self->query($insert);\n if (!ref($res)) {\n $i_ok = 0;\n $self->debug(0, \"track failure ($insert) -> '$res'\");\n }\n $self->debug('OUT', $i_ok);\n return $i_ok;\n}\n=item ck822\nEmail address checker (RFC822) courtesy Tom Christiansen/Jeffrey Friedl.\n print (($o_email->ck822($addr)) ? \"yup($addr)\\n\" : \"nope($addr)\\n\");\n=cut\nsub ck822 { # RFC internet address checker\n my $self = shift;\n $self->debug('IN', @_);\n my $addr = shift;\n my $isok = '';\n my $i_ok = 0;\n local $_;\n # ck822 -- check whether address is valid rfc 822 address\n # tchrist@perl.com\n #\n # pattern developed in program by jfriedl;\n # see \"Mastering Regular Expressions\" from ORA for details\n # this will error on something like \"ftp.perl.com.\" because\n # even though dns wants it, rfc822 hates it. shucks.\n ($isok = <<'EOSCARY') =~ s/\\n//g;\n(?:[\\040\\t]|\\((?:[^\\\\\\x80-\\xff\\n\\015()]|\\\\[^\\x80-\\xff]|\\((?:[^\\\\\\x80-\\xff\\n\n\\015()]|\\\\[^\\x80-\\xff])*\\))*\\))*(?:(?:[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\\nxff]\n,[[\"{\", 760, \"sub\"], [\"(\", 1094, \"\"]]",
- "size": 55943
},+
"Perlbug/Bug.pm": { … - "module": "Perlbug::Bug",
- "mtime": 967809008,
+
"requires": { … },- "size": 233
},+
"Perlbug/Cmd.pm": { … - "module": "Perlbug::Cmd",
- "mtime": 967809010,
+
"requires": { … - "Data::Dumper": "0",
- "File::Spec": "0",
- "Perlbug::Base": "0",
- "lib": "0",
- "strict": "0",
- "vars": "0"
},- "size": 10164
},+
"Perlbug/Config.pm": { … - "module": "Perlbug::Config",
- "mtime": 973600211,
+
"requires": { … - "Carp": "0",
- "Data::Dumper": "0",
- "File::Spec": "0",
- "FileHandle": "0",
- "lib": "0",
- "strict": "0",
- "vars": "0"
},- "size": 9129
},+
"Perlbug/Database.pm": { … - "module": "Perlbug::Database",
- "mtime": 967809011,
- "size": 188
},+
"Perlbug/Do.pm": { … - "module": "Perlbug::Do",
- "mtime": 969366781,
+
"requires": { … - "Data::Dumper": "0",
- "File::Spec": "0",
- "lib": "0",
- "strict": "0",
- "vars": "0"
},- "size": 51993
},+
"Perlbug/Email.pm": { … - "module": "Perlbug::Email",
- "mtime": 973582237,
+
"requires": { … - "Data::Dumper": "0",
- "File::Spec": "0",
- "Mail::Address": "0",
- "Mail::Header": "0",
- "Mail::Internet": "0",
- "Mail::Send": "0",
- "Perlbug::Cmd": "0",
- "Sys::Hostname": "0",
- "lib": "0",
- "strict": "0",
- "vars": "0"
},- "size": 78939
},+
"Perlbug/Fix.pm": { … - "module": "Perlbug::Fix",
- "mtime": 973609574,
+
"requires": { … - "Data::Dumper": "0",
- "File::Spec": "0",
- "Perlbug::Cmd": "0",
- "lib": "0",
- "strict": "0",
- "vars": "0"
},- "size": 36427
},+
"Perlbug/Format.pm": { … - "module": "Perlbug::Format",
- "mtime": 969365330,
+
"noes": { … },+
"requires": { … - "CGI": "0",
- "Carp": "0",
- "Data::Dumper": "0",
- "FileHandle": "0",
- "HTML::Entities": "0",
- "vars": "0"
},- "size": 57595
},+
"Perlbug/JS.pm": { … - "module": "Perlbug::JS",
- "mtime": 967809012,
- "size": 1829
},+
"Perlbug/Log.pm": { … - "module": "Perlbug::Log",
- "mtime": 967809012,
+
"requires": { … - "Carp": "0",
- "Data::Dumper": "0",
- "File::Spec": "0",
- "FileHandle": "0",
- "Shell": "0",
- "lib": "0",
- "strict": "0",
- "vars": "0"
},- "size": 15546
},+
"Perlbug/Message.pm": { … - "module": "Perlbug::Message",
- "mtime": 964806859,
+
"requires": { … },- "size": 236
},+
"Perlbug/MyDBD.pm": { … - "module": "MyDBD",
- "mtime": 970726874,
+
"requires": { … - "Carp": "0",
- "DBI": "0",
- "Exporter": "0",
- "strict": "0",
- "vars": "0"
},- "size": 2380
},+
"Perlbug/Note.pm": { … - "module": "Perlbug::Test",
- "mtime": 967809014,
+
"requires": { … - "Data::Dumper": "0",
- "Exporter": "0",
- "File::Spec": "0",
- "Test": "0",
- "lib": "0",
- "strict": "0",
- "vars": "0"
},- "size": 701
},+
"Perlbug/Patch.pm": { … - "module": "Perlbug::Test",
- "mtime": 967809015,
+
"requires": { … - "Data::Dumper": "0",
- "Exporter": "0",
- "File::Spec": "0",
- "Test": "0",
- "lib": "0",
- "strict": "0",
- "vars": "0"
},- "size": 702
},+
"Perlbug/TC": { … - "mtime": 955637612,
- "size": 18550
},+
"Perlbug/TM.pm": { … - "module": "Perlbug::TM",
- "mtime": 968950072,
+
"requires": { … - "Carp": "0",
- "IO::File": "0",
- "Mysql": "0",
- "strict": "0",
- "vars": "0"
},- "size": 11906
},+
"Perlbug/Table.pm": { … - "module": "Perlbug::Table",
- "mtime": 968081142,
+
"requires": { … - "Perlbug::Database": "0",
- "lib": "0",
- "strict": "0"
},- "size": 4432
},+
"Perlbug/Test.pm": { … - "module": "Perlbug::Test",
- "mtime": 968930608,
+
"requires": { … - "Data::Dumper": "0",
- "Exporter": "0",
- "File::Spec": "0",
- "Test": "0",
- "lib": "0",
- "strict": "0",
- "vars": "0"
},- "size": 693
},+
"Perlbug/Testing.pm": { … - "module": "Perlbug::Testing",
- "mtime": 967809016,
+
"requires": { … - "Data::Dumper": "0",
- "Exporter": "0",
- "File::Spec": "0",
- "Test": "0",
- "lib": "0",
- "strict": "0",
- "vars": "0"
},- "size": 4674
},+
"Perlbug/Ticket.pm": { … - "module": "PbDb::Ticket",
- "mtime": 965810888,
+
"requires": { … },- "size": 218
},+
"Perlbug/Tk.pm": { … - "module": "Perlbug::Tk",
- "mtime": 971962920,
+
"requires": { … - "Carp": "0",
- "DBI": "0",
- "Exporter": "0",
- "strict": "0",
- "vars": "0"
},- "size": 2386
},+
"Perlbug/User.pm": { … - "module": "Perlbug::User",
- "mtime": 970043962,
+
"requires": { … },- "size": 180
},+
"Perlbug/Web.pm": { … - "module": "Perlbug::Web",
- "mtime": 973582266,
+
"requires": { … - "CGI": "0",
- "CGI::Carp": "0",
- "Data::Dumper": "0",
- "HTML::Entities": "0",
- "Perlbug::Base": "0",
- "URI::Escape": "0",
- "lib": "0",
- "strict": "0",
- "vars": "0"
},- "size": 51659,
+
"suggests": { … }
},+
"Perlbug/_REF_": { … - "mtime": 964806788,
- "size": 2973
},+
"Perlbug/subs": { … - "mtime": 963388441,
- "size": 8336
},+
"README": { … - "mtime": 970752286,
- "size": 524
},+
"bashrc": { … - "mtime": 953890025,
- "size": 52
},+
"config/.htpasswd": { … - "mtime": 969366811,
- "size": 851
},+
"config/.mysql": { … - "mtime": 951484763,
- "size": 5
},+
"config/Configuration": { … - "mtime": 970637073,
- "size": 6218
},+
"config/Matches": { … - "mtime": 970656575,
- "size": 2815
},+
"config/enabler_redundant": { … - "mtime": 951484763,
- "size": 29
},+
"config/p5p_list": { … - "mtime": 963319583,
- "size": 10705
},+
"config/tmtowtdi_Configuration": { … - "mtime": 969367131,
- "size": 6047
},+
"scripts/bugdb": { … - "mtime": 965047846,
- "size": 630
},+
"scripts/bugtk": { … - "mtime": 972030066,
- "size": 19038
},+
"scripts/cron.cmd": { … - "mtime": 969351053,
- "size": 2072
},+
"scripts/exbugtk": { … - "mtime": 967195743,
- "size": 641
},+
"scripts/fixit": { … - "mtime": 965047851,
- "size": 741
},+
"scripts/graph.pl": { … - "mtime": 965047856,
- "size": 1921
},+
"scripts/hist.cmd": { … - "mtime": 965047838,
- "size": 2192
},+
"scripts/mail.pl": { … - "mtime": 965047842,
- "size": 652
},+
"scripts/pbugtk": { … - "mtime": 970726859,
- "size": 18771
},+
"scripts/tron.pl": { … - "mtime": 965047830,
- "size": 540
},+
"site/adminfaq": { … - "mtime": 965369931,
- "size": 5156
},+
"site/adminfaq.html": { … - "mtime": 965369951,
- "size": 9006
},+
"site/footer": { … - "mtime": 964071798,
- "size": 144
},+
"site/footer.html": { … - "mtime": 966836004,
- "size": 1023
},+
"site/header": { … - "mtime": 964522085,
- "size": 144
},+
"site/header.html": { … - "mtime": 964509433,
- "size": 250
},+
"site/response": { … - "mtime": 965971089,
- "size": 282
},+
"site/todo": { … - "mtime": 972640177,
- "size": 1493
},+
"site/todo.html": { … - "mtime": 972640177,
- "size": 1493
},+
"spool/archive/.exists": { … - "mtime": 961498732,
- "size": 29
},+
"spool/logs/.exists": { … - "mtime": 951484763,
- "size": 29
},+
"spool/ranges/.exists": { … - "mtime": 951484763,
- "size": 0
},+
"spool/results/.exists": { … - "mtime": 951484763,
- "size": 29
},+
"spool/temp/.exists": { … - "mtime": 951484763,
- "size": 29
},+
"sql/generic/insert_admin.sql": { … - "mtime": 970122289,
- "size": 217
},+
"sql/generic/insert_flags.sql": { … - "mtime": 968939444,
- "size": 1555
},+
"sql/install": { … - "mtime": 970752137,
- "size": 461
},+
"sql/mysql/create_database.sql": { … - "mtime": 968915421,
- "size": 56
},+
"sql/mysql/create_dbuser.sql": { … - "mtime": 970751223,
- "size": 163
},+
"sql/mysql/create_tables.sql": { … - "mtime": 973601556,
- "size": 3043
},+
"sql/mysql/ex_create_tables.sql": { … - "mtime": 971672581,
- "size": 4489
},+
"sql/mysql/install": { … - "mtime": 970752137,
- "size": 461
},+
"sql/oracle/create_database.sql": { … - "mtime": 957955618,
- "size": 1046
},+
"sql/oracle/create_dbuser.sql": { … - "mtime": 970121273,
- "size": 163
},+
"sql/oracle/create_tables.mysql": { … - "mtime": 970121323,
- "size": 4513
},+
"sql/oracle/install": { … - "mtime": 970121932,
- "size": 307
},+
"t/00_Test.t": { … - "mtime": 968949990,
+
"requires": { … - "File::Spec": "0",
- "FileHandle": "0",
- "Mail::Internet": "0",
- "Perlbug::Base": "0",
- "Perlbug::Testing": "0",
- "Sys::Hostname": "0",
- "lib": "0",
- "strict": "0"
},- "size": 6419
},+
"t/10_Config.t": { … - "mtime": 965304095,
+
"requires": { … - "Data::Dumper": "0",
- "File::Spec": "0",
- "Perlbug::Config": "0",
- "Perlbug::Testing": "0",
- "lib": "0",
- "strict": "0"
},- "size": 8540
},+
"t/11_Config.t": { … - "mtime": 965304090,
+
"requires": { … - "Data::Dumper": "0",
- "File::Spec": "0",
- "Perlbug::Config": "0",
- "Perlbug::Testing": "0",
- "lib": "0",
- "strict": "0"
},- "size": 1523
},+
"t/20_Log.t": { … - "mtime": 965729483,
+
"requires": { … - "Carp": "0",
- "File::Spec": "0",
- "Perlbug::Log": "0",
- "Perlbug::Testing": "0",
- "lib": "0",
- "strict": "0"
},- "size": 2194
},+
"t/30_Format.t": { … - "mtime": 965729725,
+
"requires": { … - "File::Spec": "0",
- "Perlbug::Base": "0",
- "Perlbug::Testing": "0",
- "lib": "0",
- "strict": "0"
},- "size": 1905
},+
"t/31_Format.t": { … - "mtime": 968949601,
+
"requires": { … - "Data::Dumper": "0",
- "File::Spec": "0",
- "Perlbug::Base": "0",
- "Perlbug::Testing": "0",
- "lib": "0",
- "strict": "0"
},- "size": 2644
},+
"t/32_Format.t": { … - "mtime": 968949623,
+
"requires": { … - "Data::Dumper": "0",
- "File::Spec": "0",
- "Perlbug::Base": "0",
- "Perlbug::Testing": "0",
- "lib": "0",
- "strict": "0"
},- "size": 1751
},+
"t/33_Format.t": { … - "mtime": 969020737,
+
"requires": { … - "Data::Dumper": "0",
- "File::Spec": "0",
- "Perlbug::Base": "0",
- "Perlbug::Testing": "0",
- "lib": "0",
- "strict": "0"
},- "size": 1880
},+
"t/34_Format.t": { … - "mtime": 969024917,
+
"requires": { … - "Data::Dumper": "0",
- "File::Spec": "0",
- "Perlbug::Base": "0",
- "Perlbug::Testing": "0",
- "lib": "0",
- "strict": "0"
},- "size": 1360
},+
"t/35_Format.t": { … - "mtime": 969361659,
+
"requires": { … - "Data::Dumper": "0",
- "File::Spec": "0",
- "Perlbug::Base": "0",
- "Perlbug::Testing": "0",
- "lib": "0",
- "strict": "0"
},- "size": 1517
},+
"t/40_TM.t": { … - "mtime": 965304077,
+
"requires": { … - "File::Spec": "0",
- "Perlbug::Base": "0",
- "Perlbug::Testing": "0",
- "lib": "0",
- "strict": "0"
},- "size": 1692
},+
"t/50_Do.t": { … - "mtime": 970207743,
+
"requires": { … - "File::Spec": "0",
- "Perlbug::Base": "0",
- "Perlbug::Testing": "0",
- "lib": "0",
- "strict": "0"
},- "size": 1729
},+
"t/51_Do.t": { … - "mtime": 969020223,
+
"requires": { … - "Data::Dumper": "0",
- "File::Spec": "0",
- "Perlbug::Base": "0",
- "Perlbug::Testing": "0",
- "lib": "0",
- "strict": "0"
},- "size": 2359
},+
"t/52_Do.t": { … - "mtime": 969019818,
+
"requires": { … - "Data::Dumper": "0",
- "File::Spec": "0",
- "Perlbug::Base": "0",
- "Perlbug::Testing": "0",
- "lib": "0",
- "strict": "0"
},- "size": 1143
},+
"t/53_Do.t": { … - "mtime": 969365187,
+
"requires": { … - "Data::Dumper": "0",
- "File::Spec": "0",
- "Perlbug::Base": "0",
- "Perlbug::Testing": "0",
- "lib": "0",
- "strict": "0"
},- "size": 1795
},+
"t/60_Base.t": { … - "mtime": 965304067,
+
"requires": { … - "File::Spec": "0",
- "Perlbug::Base": "0",
- "Perlbug::Testing": "0",
- "lib": "0",
- "strict": "0"
},- "size": 2019
},+
"t/61_Base.t": { … - "mtime": 969019880,
+
"requires": { … - "Data::Dumper": "0",
- "File::Spec": "0",
- "Perlbug::Base": "0",
- "Perlbug::Testing": "0",
- "lib": "0",
- "strict": "0"
},- "size": 3070
},+
"t/70_Email.t": { … - "mtime": 965304063,
+
"requires": { … - "File::Spec": "0",
- "FileHandle": "0",
- "Mail::Internet": "0",
- "Perlbug::Email": "0",
- "Perlbug::Testing": "0",
- "Sys::Hostname": "0",
- "lib": "0",
- "strict": "0"
},- "size": 3574
},+
"t/71_Email.t": { … - "mtime": 965304059,
+
"requires": { … - "File::Spec": "0",
- "Perlbug::Email": "0",
- "Perlbug::Testing": "0",
- "Sys::Hostname": "0",
- "lib": "0",
- "strict": "0"
},- "size": 3150
},+
"t/72_Email.t": { … - "mtime": 970656477,
+
"requires": { … - "File::Spec": "0",
- "FileHandle": "0",
- "Mail::Internet": "0",
- "Perlbug::Email": "0",
- "Perlbug::Testing": "0",
- "Sys::Hostname": "0",
- "lib": "0",
- "strict": "0"
},- "size": 4496
},+
"t/73_Email.t": { … - "mtime": 965304047,
+
"requires": { … - "File::Spec": "0",
- "FileHandle": "0",
- "Mail::Internet": "0",
- "Perlbug::Email": "0",
- "Perlbug::Testing": "0",
- "Sys::Hostname": "0",
- "lib": "0",
- "strict": "0"
},- "size": 2984
},+
"t/74_Email.t": { … - "mtime": 969019955,
+
"requires": { … - "Data::Dumper": "0",
- "File::Spec": "0",
- "FileHandle": "0",
- "Mail::Internet": "0",
- "Perlbug::Email": "0",
- "Perlbug::Testing": "0",
- "Sys::Hostname": "0",
- "lib": "0",
- "strict": "0"
},- "size": 5699
},+
"t/75_Email.t": { … - "mtime": 969021286,
+
"requires": { … - "Data::Dumper": "0",
- "File::Spec": "0",
- "FileHandle": "0",
- "Mail::Internet": "0",
- "Perlbug::Email": "0",
- "Perlbug::Testing": "0",
- "Sys::Hostname": "0",
- "lib": "0",
- "strict": "0"
},- "size": 4669
},+
"t/76_Email.t": { … - "mtime": 965304031,
+
"requires": { … - "Data::Dumper": "0",
- "File::Spec": "0",
- "FileHandle": "0",
- "Mail::Internet": "0",
- "Perlbug::Email": "0",
- "Perlbug::Testing": "0",
- "Sys::Hostname": "0",
- "lib": "0",
- "strict": "0"
},- "size": 8196
},+
"t/77_Email.t": { … - "mtime": 965304025,
+
"requires": { … - "Data::Dumper": "0",
- "File::Spec": "0",
- "FileHandle": "0",
- "Mail::Internet": "0",
- "Perlbug::Email": "0",
- "Perlbug::Testing": "0",
- "Sys::Hostname": "0",
- "lib": "0",
- "strict": "0"
},- "size": 2283
},+
"t/80_Cmd.t": { … - "mtime": 965898314,
+
"requires": { … - "File::Spec": "0",
- "Perlbug::Cmd": "0",
- "Perlbug::Testing": "0",
- "lib": "0",
- "strict": "0"
},- "size": 1234
},+
"t/90_Web.t": { … - "mtime": 965304010,
+
"requires": { … - "File::Spec": "0",
- "Perlbug::Testing": "0",
- "Perlbug::Web": "0",
- "lib": "0",
- "strict": "0"
},- "size": 1239
},+
"t/99_Test.t": { … - "mtime": 969359526,
+
"requires": { … - "File::Spec": "0",
- "Perlbug::Base": "0",
- "Perlbug::Testing": "0",
- "lib": "0",
- "strict": "0"
},- "size": 1912
},+
"t/TC": { … - "mtime": 955637713,
- "size": 18550
},+
"t/quick/README": { … - "mtime": 965820150,
- "size": 42
},+
"t/quick/admins@bugs.perl.org": { … - "mtime": 965820150,
- "size": 183
},+
"t/quick/bugdb_A": { … - "mtime": 965896463,
- "size": 170
},+
"t/quick/bugdb_I": { … - "mtime": 965888066,
- "size": 153
},+
"t/quick/bugdb_N": { … - "mtime": 965896668,
- "size": 180
},+
"t/quick/bugdb_P": { … - "mtime": 965896317,
- "size": 208
},+
"t/quick/bugdb_V": { … - "mtime": 964371169,
- "size": 161
},+
"t/quick/bugdb_a": { … - "mtime": 965896552,
- "size": 165
},+
"t/quick/bugdb_admins": { … - "mtime": 964371049,
- "size": 183
},+
"t/quick/bugdb_b": { … - "mtime": 965821600,
- "size": 259
},+
"t/quick/bugdb_cc": { … - "mtime": 965826769,
- "size": 255
},+
"t/quick/bugdb_h": { … - "mtime": 965896621,
- "size": 142
},+
"t/quick/bugdb_help": { … - "mtime": 964371123,
- "size": 142
},+
"t/quick/bugdb_i": { … - "mtime": 965820150,
- "size": 238
},+
"t/quick/bugdb_info": { … - "mtime": 964371140,
- "size": 141
},+
"t/quick/bugdb_note": { … - "mtime": 964696910,
- "size": 180
},+
"t/quick/bugdb_p": { … - "mtime": 965896714,
- "size": 161
},+
"t/quick/bugdb_patch": { … - "mtime": 964696925,
- "size": 250
},+
"t/quick/bugdb_propose": { … - "mtime": 964370999,
- "size": 167
},+
"t/quick/bugdb_register": { … - "mtime": 964371107,
- "size": 161
},+
"t/quick/bugdb_s": { … - "mtime": 965820150,
- "size": 251
},+
"t/quick/bugdb_spec": { … - "mtime": 964375631,
- "size": 142
},+
"t/quick/bugdb_t": { … - "mtime": 965821638,
- "size": 248
},+
"t/quick/bugdb_v": { … - "mtime": 965896810,
- "size": 179
},+
"t/quick/bugdb_y": { … - "mtime": 965988259,
- "size": 157
},+
"t/quick/close_<tid>@bugs.perl.org": { … - "mtime": 966493377,
- "size": 168
},+
"t/quick/doD": { … - "mtime": 964102779,
- "size": 311
},+
"t/quick/help@bugs.perl.org": { … - "mtime": 965896390,
- "size": 142
},+
"t/quick/info@bugs.perl.org": { … - "mtime": 965820150,
- "size": 141
},+
"t/quick/longsubject@perl.org": { … - "mtime": 965970696,
- "size": 456
},+
"t/quick/mod_t": { … - "mtime": 960303281,
- "size": 357
},+
"t/quick/modulebug@perl.org": { … - "mtime": 965820150,
- "size": 335
},+
"t/quick/note_<tid>@bugs.perl.org": { … - "mtime": 965887541,
- "size": 211
},+
"t/quick/on_low_<tid>_mac@bugs.perl.org": { … - "mtime": 965896509,
- "size": 167
},+
"t/quick/password@bugs.perl.org": { … - "mtime": 965987344,
- "size": 177
},+
"t/quick/patch_<tid>@bugs.perl.org": { … - "mtime": 965820150,
- "size": 250
},+
"t/quick/perlbug.rep_inst_none": { … - "mtime": 970643575,
- "size": 2792
},+
"t/quick/perlbug.rep_ok": { … - "mtime": 970643670,
- "size": 2796
},+
"t/quick/perlbugtron@bugs.perl.org": { … - "mtime": 965820150,
- "size": 156
},+
"t/quick/propose@bugs.perl.org": { … - "mtime": 965820150,
- "size": 167
},+
"t/quick/register_XUSERID@bugs.perl.org": { … - "mtime": 965820150,
- "size": 161
},+
"t/quick/spec@bugs.perl.org": { … - "mtime": 965820150,
- "size": 142
},+
"t/quick/targettest@bugs.perl.org": { … - "mtime": 965820150,
- "size": 341
},+
"t/quick/test_<tid>@bugs.perl.org": { … - "mtime": 965820150,
- "size": 248
},+
"t/quick/test_notid@bugs.perl.org": { … - "mtime": 965971552,
- "size": 241
},+
"t/quick/tron_newbug": { … - "mtime": 964599743,
- "size": 335
},+
"t/quick/tron_newbug_test": { … - "mtime": 964599198,
- "size": 341
},+
"t/quick/www_i": { … - "mtime": 965896886,
- "size": 47
},+
"t/ref": { … - "mtime": 968940497,
- "size": 3836
},+
"t/subs": { … - "mtime": 964173588,
- "size": 11487
},+
"t/testmails/bugdb/body_1": { … - "mtime": 962802667,
- "size": 739
},+
"t/testmails/bugdb/body_2": { … - "mtime": 959961054,
- "size": 860
},+
"t/testmails/bugdb/header2admin_0": { … - "mtime": 963556354,
- "size": 527
},+
"t/testmails/bugdb/header2admin_1": { … - "mtime": 963556807,
- "size": 538
},+
"t/testmails/bugdb/header2admin_2": { … - "mtime": 964101445,
- "size": 551
},+
"t/testmails/bugdb/parse_commands_0": { … - "mtime": 965811764,
- "size": 459
},+
"t/testmails/bugdb/parse_commands_2": { … - "mtime": 965811980,
- "size": 532
},+
"t/testmails/bugdb/parse_commands_4": { … - "mtime": 965811985,
- "size": 532
},+
"t/testmails/bugdb/parse_mail_0": { … - "mtime": 965811878,
- "size": 385
},+
"t/testmails/bugdb/parse_mail_2": { … - "mtime": 965811895,
- "size": 453
},+
"t/testmails/bugdb/parse_mail_4": { … - "mtime": 965811908,
- "size": 446
},+
"t/testmails/bugdb/parse_mail_5": { … - "mtime": 968921858,
- "size": 493
},+
"t/testmails/bugdb/parse_mail_6": { … - "mtime": 963562497,
- "size": 423
},+
"t/testmails/bugdb/parse_mail_8": { … - "mtime": 965811861,
- "size": 490
},+
"t/testmails/bugdb/propose_0": { … - "mtime": 963499398,
- "size": 407
},+
"t/testmails/bugdb/register_0": { … - "mtime": 963499410,
- "size": 407
},+
"t/testmails/bugdb/scan_header_0": { … - "mtime": 963557511,
- "size": 406
},+
"t/testmails/bugdb/scan_header_10": { … - "mtime": 967187677,
- "size": 489
},+
"t/testmails/bugdb/scan_header_2": { … - "mtime": 965811935,
- "size": 532
},+
"t/testmails/bugdb/scan_header_4": { … - "mtime": 965811947,
- "size": 575
},+
"t/testmails/bugdb/scan_header_6": { … - "mtime": 965811721,
- "size": 513
},+
"t/testmails/bugdb/scan_header_8": { … - "mtime": 965811716,
- "size": 506
},+
"t/testmails/bugdb/subject_1": { … - "mtime": 955463074,
- "size": 598
},+
"t/testmails/bugdb/subject_2": { … - "mtime": 955463074,
- "size": 598
},+
"t/testmails/bugdb/subject_3": { … - "mtime": 959961087,
- "size": 740
},+
"t/testmails/get_headers/default_0": { … - "mtime": 963333453,
- "size": 233
},+
"t/testmails/get_headers/default_1": { … - "mtime": 963478084,
- "size": 92
},+
"t/testmails/get_headers/default_2": { … - "mtime": 963478069,
- "size": 176
},+
"t/testmails/get_headers/default_3": { … - "mtime": 963478095,
- "size": 259
},+
"t/testmails/get_headers/default_4": { … - "mtime": 963478052,
- "size": 181
},+
"t/testmails/get_headers/default_5": { … - "mtime": 963478126,
- "size": 929
},+
"t/testmails/get_headers/default_6": { … - "mtime": 963478028,
- "size": 214
},+
"t/testmails/get_headers/default_7": { … - "mtime": 962868708,
- "size": 739
},+
"t/testmails/get_headers/default_9": { … - "mtime": 963405801,
- "size": 183
},+
"t/testmails/get_headers/dodgy_addresses_1": { … - "mtime": 961146304,
- "size": 1258
},+
"t/testmails/get_headers/get_forward_0": { … - "mtime": 963472612,
- "size": 1285
},+
"t/testmails/get_headers/get_forward_1": { … - "mtime": 963472648,
- "size": 1244
},+
"t/testmails/get_headers/get_forward_2": { … - "mtime": 963472735,
- "size": 1236
},+
"t/testmails/get_headers/get_header_0": { … - "mtime": 962793824,
- "size": 1258
},+
"t/testmails/get_headers/get_header_default_0": { … - "mtime": 963480679,
- "size": 853
},+
"t/testmails/get_headers/get_header_default_1": { … - "mtime": 963480692,
- "size": 853
},+
"t/testmails/get_headers/get_header_default_2": { … - "mtime": 963480720,
- "size": 853
},+
"t/testmails/get_headers/get_header_remap_0": { … - "mtime": 963483724,
- "size": 678
},+
"t/testmails/get_headers/remap_0": { … - "mtime": 963407239,
- "size": 136
},+
"t/testmails/get_headers/remap_1": { … - "mtime": 963408683,
- "size": 113
},+
"t/testmails/get_headers/remap_10": { … - "mtime": 963415257,
- "size": 521
},+
"t/testmails/get_headers/remap_12": { … - "mtime": 963415280,
- "size": 594
},+
"t/testmails/get_headers/remap_2": { … - "mtime": 963415274,
- "size": 593
},+
"t/testmails/get_headers/remap_3": { … - "mtime": 963416091,
- "size": 542
},+
"t/testmails/get_headers/remap_4": { … - "mtime": 963415245,
- "size": 546
},+
"t/testmails/get_headers/remap_6": { … - "mtime": 963415262,
- "size": 551
},+
"t/testmails/get_headers/remap_7": { … - "mtime": 963415467,
- "size": 542
},+
"t/testmails/head_to_head/admin_of_bug_0": { … - "mtime": 963923388,
- "size": 411
},+
"t/testmails/head_to_head/admin_of_bug_1": { … - "mtime": 963576274,
- "size": 450
},+
"t/testmails/head_to_head/admin_of_bug_2": { … - "mtime": 963923398,
- "size": 420
},+
"t/testmails/head_to_head/admin_of_bug_3": { … - "mtime": 963576319,
- "size": 428
},+
"t/testmails/head_to_head/admin_of_bug_4": { … - "mtime": 963923253,
- "size": 426
},+
"t/testmails/head_to_head/admin_of_bug_5": { … - "mtime": 963924007,
- "size": 421
},+
"t/testmails/head_to_head/admin_of_bug_6": { … - "mtime": 963923919,
- "size": 424
},+
"t/testmails/head_to_head/admin_of_ticket_0": { … - "mtime": 963923388,
- "size": 411
},+
"t/testmails/head_to_head/admin_of_ticket_1": { … - "mtime": 963576274,
- "size": 450
},+
"t/testmails/head_to_head/admin_of_ticket_2": { … - "mtime": 963923398,
- "size": 420
},+
"t/testmails/head_to_head/admin_of_ticket_3": { … - "mtime": 963576319,
- "size": 428
},+
"t/testmails/head_to_head/admin_of_ticket_4": { … - "mtime": 963923253,
- "size": 426
},+
"t/testmails/head_to_head/admin_of_ticket_5": { … - "mtime": 963924007,
- "size": 421
},+
"t/testmails/head_to_head/admin_of_ticket_6": { … - "mtime": 963923919,
- "size": 424
},+
"t/testmails/head_to_head/check_header_0": { … - "mtime": 963822068,
- "size": 538
},+
"t/testmails/head_to_head/check_header_1": { … - "mtime": 963822069,
- "size": 536
},+
"t/testmails/head_to_head/check_header_2": { … - "mtime": 965116489,
- "size": 520
},+
"t/testmails/head_to_head/check_header_3": { … - "mtime": 965116487,
- "size": 542
},+
"t/testmails/head_to_head/check_header_4": { … - "mtime": 963822091,
- "size": 569
},+
"t/testmails/head_to_head/check_header_5": { … - "mtime": 963822098,
- "size": 566
},+
"t/testmails/head_to_head/clean_header_0": { … - "mtime": 961143904,
- "size": 1258
},+
"t/testmails/head_to_head/clean_header_2": { … - "mtime": 961144178,
- "size": 1070
},+
"t/testmails/head_to_head/defense_1": { … - "mtime": 963472018,
- "size": 1499
},+
"t/testmails/head_to_head/defense_2": { … - "mtime": 963472190,
- "size": 638
},+
"t/testmails/head_to_head/defense_3": { … - "mtime": 963472269,
- "size": 638
},+
"t/testmails/head_to_head/defense_4": { … - "mtime": 963922204,
- "size": 501
},+
"t/testmails/head_to_head/in_master_list_0": { … - "mtime": 963566765,
- "size": 436
},+
"t/testmails/head_to_head/in_master_list_1": { … - "mtime": 963566562,
- "size": 475
},+
"t/testmails/head_to_head/in_master_list_2": { … - "mtime": 963566749,
- "size": 436
},+
"t/testmails/head_to_head/process_header_0": { … - "mtime": 962284666,
- "size": 1258
},+
"t/testmails/head_to_head/splice_0": { … - "mtime": 961144501,
- "size": 1427
},+
"t/testmails/head_to_head/trim_to_0": { … - "mtime": 963921802,
- "size": 633
},+
"t/testmails/head_to_head/trim_to_1": { … - "mtime": 963921815,
- "size": 633
},+
"t/testmails/head_to_head/trim_to_2": { … - "mtime": 963921828,
- "size": 632
},+
"t/testmails/head_to_head/trim_to_3": { … - "mtime": 963922222,
- "size": 513
},+
"t/testmails/head_to_head/trim_to_4": { … - "mtime": 963921860,
- "size": 631
},+
"t/testmails/redundant/admin_0": { … - "mtime": 963320539,
- "size": 470
},+
"t/testmails/redundant/admin_1": { … - "mtime": 963320326,
- "size": 416
},+
"t/testmails/redundant/disappear_1": { … - "mtime": 955463074,
- "size": 641
},+
"t/testmails/redundant/disappear_2": { … - "mtime": 955463074,
- "size": 647
},+
"t/testmails/redundant/disappear_3": { … - "mtime": 955463074,
- "size": 653
},+
"t/testmails/redundant/disappear_4": { … - "mtime": 955463074,
- "size": 661
},+
"t/testmails/redundant/propose_0": { … - "mtime": 963320533,
- "size": 416
},+
"t/testmails/redundant/propose_1": { … - "mtime": 963320523,
- "size": 416
},+
"t/testmails/redundant/register_0": { … - "mtime": 963311707,
- "size": 374
},+
"t/testmails/redundant/targets_1": { … - "mtime": 961146251,
- "size": 1258
},+
"t/testmails/redundant/tm_cc_0": { … - "mtime": 963377399,
- "size": 691
},+
"t/testmails/redundant/transparent_1": { … - "mtime": 955463074,
- "size": 990
},+
"t/testmails/redundant/transparent_2": { … - "mtime": 955463074,
- "size": 977
},+
"t/testmails/redundant/transparent_3": { … - "mtime": 955463074,
- "size": 1024
},+
"t/testmails/scan_body/category_1": { … - "mtime": 970653952,
- "size": 5520
},+
"t/testmails/scan_body/category_2": { … - "mtime": 970653940,
- "size": 5525
},+
"t/testmails/scan_body/category_3": { … - "mtime": 970653137,
- "size": 5541
},+
"t/testmails/scan_body/category_4": { … - "mtime": 970653136,
- "size": 5539
},+
"t/testmails/scan_body/osname_1": { … - "mtime": 970654024,
- "size": 5486
},+
"t/testmails/scan_body/osname_2": { … - "mtime": 970654069,
- "size": 5486
},+
"t/testmails/scan_body/severity_1": { … - "mtime": 955463074,
- "size": 5534
},+
"t/testmails/scan_body/severity_2": { … - "mtime": 955540484,
- "size": 5530
},+
"t/testmails/scan_body/severity_3": { … - "mtime": 955544963,
- "size": 5532
},+
"t/testmails/scan_body/status_2": { … - "mtime": 955463074,
- "size": 5520
},+
"t/testmails/scan_body/version_1": { … - "mtime": 970656395,
- "size": 5420
},+
"t/testmails/scan_body/version_2": { … - "mtime": 955463074,
- "size": 1888
},+
"t/testmails/scan_body/version_3": { … - "mtime": 970656383,
- "size": 2164
},+
"t/testmails/switch/bounce_1": { … - "mtime": 955521749,
- "size": 5292
},+
"t/testmails/switch/bounce_2": { … - "mtime": 955463074,
- "size": 698
},+
"t/testmails/switch/insert_0": { … - "mtime": 963403202,
- "size": 617
},+
"t/testmails/switch/insert_1": { … - "mtime": 963403985,
- "size": 591
},+
"t/testmails/switch/insert_2": { … - "mtime": 963338745,
- "size": 637
},+
"t/testmails/switch/new_1": { … - "mtime": 963400128,
- "size": 1582
},+
"t/testmails/switch/new_2": { … - "mtime": 955463074,
- "size": 5537
},+
"t/testmails/switch/new_3": { … - "mtime": 958978253,
- "size": 5474
},+
"t/testmails/switch/new_4": { … - "mtime": 955463074,
- "size": 739
},+
"t/testmails/switch/new_ok": { … - "mtime": 955463074,
- "size": 3230
},+
"t/testmails/switch/quiet_2": { … - "mtime": 955463074,
- "size": 716
},+
"t/testmails/switch/quiet_3": { … - "mtime": 955463074,
- "size": 5492
},+
"t/testmails/switch/quiet_4": { … - "mtime": 955463074,
- "size": 266
},+
"t/testmails/switch/quiet_6": { … - "mtime": 955540749,
- "size": 770
},+
"t/testmails/switch/quiet_7": { … - "mtime": 955544615,
- "size": 1305
},+
"t/testmails/switch/reply_1": { … - "mtime": 963403887,
- "size": 1797
},+
"t/testmails/switch/reply_2": { … - "mtime": 963409864,
- "size": 1011
},+
"t/testmails/switch/reply_3": { … - "mtime": 963403920,
- "size": 1810
},+
"t/testmails/switch/reply_4": { … - "mtime": 955532390,
- "size": 1853
},+
"t/testmails/switch/reply_to": { … - "mtime": 963411506,
- "size": 1777
},+
"t/testmails/switch/reply_to_2": { … - "mtime": 964170847,
- "size": 1777
},+
"web/admin/.htaccess": { … - "mtime": 965285427,
- "size": 122
},+
"web/admin/.tmtowtdi.htaccess": { … - "mtime": 964538890,
- "size": 122
},+
"web/admin/images/home.gif": { … - "mtime": 951484764,
- "size": 47018
},+
"web/admin/images/linux.gif": { … - "mtime": 951484764,
- "size": 880
},+
"web/admin/images/mysql.gif": { … - "mtime": 951484764,
- "size": 1595
},+
"web/admin/images/perl_republic.gif": { … - "mtime": 951484764,
- "size": 1911
},+
"web/admin/images/perl_title.gif": { … - "mtime": 951484764,
- "size": 5316
},+
"web/admin/images/powered_by_mysql.gif": { … - "mtime": 951484764,
- "size": 909
},+
"web/admin/images/xxx.gif": { … - "mtime": 951484764,
- "size": 1911
},+
"web/admin/index.html": { … - "mtime": 965196179,
- "size": 1437
},+
"web/admin/pbdb.cgi": { … - "mtime": 952954467,
- "size": 400
},+
"web/admin/perlbug.cgi": { … - "mtime": 952954467,
- "size": 400
},+
"web/footer.html": { … - "mtime": 953714335,
- "size": 1015
},+
"web/graph.cgi": { … - "mtime": 965047856,
- "size": 1921
},+
"web/images/home.gif": { … - "mtime": 951484764,
- "size": 47018
},+
"web/images/linux.gif": { … - "mtime": 951484764,
- "size": 880
},+
"web/images/mysql.gif": { … - "mtime": 951484764,
- "size": 1595
},+
"web/images/perl_republic.gif": { … - "mtime": 951484764,
- "size": 1911
},+
"web/images/perl_title.gif": { … - "mtime": 951484764,
- "size": 5316
},+
"web/images/powered_by_mysql.gif": { … - "mtime": 951484764,
- "size": 909
},+
"web/images/xxx.gif": { … - "mtime": 951484764,
- "size": 1911
},+
"web/index.html": { … - "mtime": 965196179,
- "size": 1437
},+
"web/pbdb.cgi": { … - "mtime": 952954467,
- "size": 400
},+
"web/perlbug.cgi": { … - "mtime": 952954467,
- "size": 400
},+
"web/perlbug_input": { … - "mtime": 952954467,
- "size": 104
}
},- "got_prereq_from": "Makefile.PL",
+
"kwalitee": { … - "buildtool_not_executable": 1,
- "configure_prereq_matches_use": 1,
- "consistent_version": 0,
- "core_kwalitee": "84.38",
- "distname_matches_name_in_meta": 1,
- "extractable": 1,
- "extracts_nicely": 1,
- "has_abstract_in_pod": 1,
- "has_buildtool": 1,
- "has_changelog": 1,
- "has_contributing_doc": 0,
- "has_human_readable_license": 1,
- "has_known_license_in_source_file": 1,
- "has_license_in_source_file": 1,
- "has_manifest": 1,
- "has_meta_json": 0,
- "has_meta_yml": 0,
- "has_proper_version": 1,
- "has_readme": 1,
- "has_security_doc": 0,
- "has_separate_license_file": 0,
- "has_tests": 1,
- "has_tests_in_t_dir": 1,
- "has_version": 1,
- "kwalitee": "125.00",
- "main_module_version_matches_dist_version": 1,
- "manifest_matches_dist": 1,
- "meta_json_conforms_to_known_spec": 1,
- "meta_json_is_parsable": 1,
- "meta_yml_conforms_to_known_spec": 1,
- "meta_yml_declares_perl_version": 1,
- "meta_yml_has_license": 0,
- "meta_yml_has_provides": 1,
- "meta_yml_has_repository_resource": 1,
- "meta_yml_is_parsable": 1,
- "no_abstract_stub_in_pod": 1,
- "no_broken_auto_install": 1,
- "no_broken_module_install": 1,
- "no_dot_dirs": 1,
- "no_dot_underscore_files": 1,
- "no_files_to_be_skipped": 1,
- "no_generated_files": 1,
- "no_invalid_versions": 0,
- "no_local_dirs": 1,
- "no_maniskip_error": 1,
- "no_missing_files_in_provides": 1,
- "no_mymeta_files": 1,
- "no_pax_headers": 1,
- "no_pod_errors": 0,
- "no_stdin_for_prompting": 1,
- "no_symlinks": 1,
- "no_unauthorized_packages": 1,
- "portable_filenames": 0,
- "prereq_matches_use": 0,
- "proper_libs": 1,
- "security_doc_contains_contact": 0,
- "test_prereq_matches_use": 0,
- "use_strict": 0,
- "use_warnings": 0,
- "valid_signature": 1
},- "latest_mtime": 973850351,
- "license": "defined in POD (Perlbug.pm)",
- "license_file": "Perlbug.pm",
- "license_in_pod": 1,
- "license_type": "Perl_5",
+
"licenses": { … },- "manifest_matches_dist": 1,
- "maturity": "released",
+
"modules": [ … +
{ … - "file": "Perlbug/MyDBD.pm",
- "in_basedir": 0,
- "in_lib": 0,
- "module": "MyDBD"
},+
{ … - "file": "Perlbug/Ticket.pm",
- "in_basedir": 0,
- "in_lib": 0,
- "module": "PbDb::Ticket"
},+
{ … - "file": "Perlbug.pm",
- "in_basedir": 1,
- "in_lib": 0,
- "module": "Perlbug"
},+
{ … - "file": "Perlbug/Admin.pm",
- "in_basedir": 0,
- "in_lib": 0,
- "module": "Perlbug::Admin"
},+
{ … - "file": "Perlbug/Base.pm",
- "in_basedir": 0,
- "in_lib": 0,
- "module": "Perlbug::Base"
},+
{ … - "file": "Perlbug/Bug.pm",
- "in_basedir": 0,
- "in_lib": 0,
- "module": "Perlbug::Bug"
},+
{ … - "file": "Perlbug/Cmd.pm",
- "in_basedir": 0,
- "in_lib": 0,
- "module": "Perlbug::Cmd"
},+
{ … - "file": "Perlbug/Config.pm",
- "in_basedir": 0,
- "in_lib": 0,
- "module": "Perlbug::Config"
},+
{ … - "file": "Perlbug/Database.pm",
- "in_basedir": 0,
- "in_lib": 0,
- "module": "Perlbug::Database"
},+
{ … - "file": "Perlbug/Do.pm",
- "in_basedir": 0,
- "in_lib": 0,
- "module": "Perlbug::Do"
},+
{ … - "file": "Perlbug/Email.pm",
- "in_basedir": 0,
- "in_lib": 0,
- "module": "Perlbug::Email"
},+
{ … - "file": "Perlbug/Fix.pm",
- "in_basedir": 0,
- "in_lib": 0,
- "module": "Perlbug::Fix"
},+
{ … - "file": "Perlbug/Format.pm",
- "in_basedir": 0,
- "in_lib": 0,
- "module": "Perlbug::Format"
},+
{ … - "file": "Perlbug/JS.pm",
- "in_basedir": 0,
- "in_lib": 0,
- "module": "Perlbug::JS"
},+
{ … - "file": "Perlbug/Log.pm",
- "in_basedir": 0,
- "in_lib": 0,
- "module": "Perlbug::Log"
},+
{ … - "file": "Perlbug/Message.pm",
- "in_basedir": 0,
- "in_lib": 0,
- "module": "Perlbug::Message"
},+
{ … - "file": "Perlbug/TM.pm",
- "in_basedir": 0,
- "in_lib": 0,
- "module": "Perlbug::TM"
},+
{ … - "file": "Perlbug/Table.pm",
- "in_basedir": 0,
- "in_lib": 0,
- "module": "Perlbug::Table"
},+
{ … - "file": "Perlbug/Note.pm",
- "in_basedir": 0,
- "in_lib": 0,
- "module": "Perlbug::Test"
},+
{ … - "file": "Perlbug/Patch.pm",
- "in_basedir": 0,
- "in_lib": 0,
- "module": "Perlbug::Test"
},+
{ … - "file": "Perlbug/Test.pm",
- "in_basedir": 0,
- "in_lib": 0,
- "module": "Perlbug::Test"
},+
{ … - "file": "Perlbug/Testing.pm",
- "in_basedir": 0,
- "in_lib": 0,
- "module": "Perlbug::Testing"
},+
{ … - "file": "Perlbug/Tk.pm",
- "in_basedir": 0,
- "in_lib": 0,
- "module": "Perlbug::Tk"
},+
{ … - "file": "Perlbug/User.pm",
- "in_basedir": 0,
- "in_lib": 0,
- "module": "Perlbug::User"
},+
{ … - "file": "Perlbug/Web.pm",
- "in_basedir": 0,
- "in_lib": 0,
- "module": "Perlbug::Web"
}
],- "no_pax_headers": 1,
- "path": "R/RF/RFOLEY/Perlbug-2.27.tar.gz",
- "prereq": [ ],
- "released_epoch": 973849145,
- "required_perl": null,
- "size_packed": 306328,
- "size_unpacked": 987644,
+
"unindexed_runtime_requires": [ … ],+
"uses": { … +
"configure": { … +
"requires": { … - "ExtUtils::MakeMaker": "0"
}
},+
"runtime": { … +
"noes": { … },+
"requires": { … - "CGI": "0",
- "CGI::Carp": "0",
- "Carp": "0",
- "DBI": "0",
- "Data::Dumper": "0",
- "Exporter": "0",
- "File::Spec": "0",
- "FileHandle": "0",
- "HTML::Entities": "0",
- "IO::File": "0",
- "Mail::Address": "0",
- "Mail::Header": "0",
- "Mail::Internet": "0",
- "Mail::Send": "0",
- "Mysql": "0",
- "PbDb::Base": "0",
- "Shell": "0",
- "Sys::Hostname": "0",
- "Test": "0",
- "URI::Escape": "0",
- "lib": "0",
- "strict": "0",
- "vars": "0"
},+
"suggests": { … }
},+
"test": { … +
"requires": { … - "Carp": "0",
- "Data::Dumper": "0",
- "File::Spec": "0",
- "FileHandle": "0",
- "Mail::Internet": "0",
- "Sys::Hostname": "0",
- "lib": "0",
- "strict": "0"
}
}
},- "valid_signature": -1,
- "version": "2.27",
+
"versions": { … +
"Perlbug.pm": { … },+
"Perlbug/Admin.pm": { … },+
"Perlbug/Base.pm": { … },+
"Perlbug/Bug.pm": { … },+
"Perlbug/Cmd.pm": { … },+
"Perlbug/Config.pm": { … - "Perlbug::Config": "1.22"
},+
"Perlbug/Database.pm": { … - "Perlbug::Database": "undef"
},+
"Perlbug/Do.pm": { … },+
"Perlbug/Email.pm": { … },+
"Perlbug/Fix.pm": { … },+
"Perlbug/Format.pm": { … - "Perlbug::Format": "1.33"
},+
"Perlbug/Log.pm": { … },+
"Perlbug/Message.pm": { … - "Perlbug::Message": "undef"
},+
"Perlbug/MyDBD.pm": { … },+
"Perlbug/TM.pm": { … },+
"Perlbug/Table.pm": { … },+
"Perlbug/Test.pm": { … },+
"Perlbug/Testing.pm": { … - "Perlbug::Testing": "1.03"
},+
"Perlbug/Ticket.pm": { … },+
"Perlbug/Tk.pm": { … },+
"Perlbug/User.pm": { … },+
"Perlbug/Web.pm": { … }
},- "vname": "Perlbug-2.27"
}