summaryrefslogtreecommitdiffstats
path: root/contrib/gnats2bz.pl
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/gnats2bz.pl')
-rwxr-xr-xcontrib/gnats2bz.pl1067
1 files changed, 0 insertions, 1067 deletions
diff --git a/contrib/gnats2bz.pl b/contrib/gnats2bz.pl
deleted file mode 100755
index 27f3ad84a..000000000
--- a/contrib/gnats2bz.pl
+++ /dev/null
@@ -1,1067 +0,0 @@
-#!/usr/bin/perl -w
-# -*- Mode: perl; indent-tabs-mode: nil -*-
-#
-# The contents of this file are subject to the Mozilla Public
-# License Version 1.1 (the "License"); you may not use this file
-# except in compliance with the License. You may obtain a copy of
-# the License at http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS
-# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
-# implied. See the License for the specific language governing
-# rights and limitations under the License.
-#
-# The Original Code is the Gnats To Bugzilla Conversion Utility.
-#
-# The Initial Developer of the Original Code is Tom
-# Schutter. Portions created by Tom Schutter are
-# Copyright (C) 1999 Tom Schutter. All
-# Rights Reserved.
-#
-# Contributor(s): Tom Schutter <tom@platte.com>
-#
-# Perl script to convert a GNATS database to a Bugzilla database.
-# This script generates a file that contains SQL commands for MySQL.
-# This script DOES NOT MODIFY the GNATS database.
-# This script DOES NOT MODIFY the Bugzilla database.
-#
-# Usage procedure:
-# 1) Regenerate the GNATS index file. It sometimes has inconsistencies,
-# and this script relies on it being correct. Use the GNATS command:
-# gen-index --numeric --outfile=$GNATS_DIR/gnats-db/gnats-adm/index
-# 2) Modify variables at the beginning of this script to match
-# what your site requires.
-# 3) Modify translate_pr() and write_bugs() below to fixup mapping from
-# your GNATS policies to Bugzilla. For example, how do the
-# Severity/Priority fields map to bug_severity/priority?
-# 4) Run this script.
-# 5) Fix the problems in the GNATS database identified in the output
-# script file gnats2bz_cleanup.sh. Fixing problems may be a job
-# for a custom perl script. If you make changes to GNATS, goto step 2.
-# 6) Examine the statistics in the output file gnats2bz_stats.txt.
-# These may indicate some more cleanup that is needed. For example,
-# you may find that there are invalid "State"s, or not a consistent
-# scheme for "Release"s. If you make changes to GNATS, goto step 2.
-# 7) Examine the output data file gnats2bz_data.sql. If problems
-# exist, goto step 2.
-# 8) Create a new, empty Bugzilla database.
-# 9) Import the data using the command:
-# mysql -uroot -p'ROOT_PASSWORD' bugs < gnats2bz_data.sql
-# 10) Update the shadow directory with the command:
-# cd $BUGZILLA_DIR; ./processmail regenerate
-# 11) Run a sanity check by visiting the sanitycheck.cgi page.
-# 12) Manually verify that the database is ok. If it is not, goto step 2.
-#
-# Important notes:
-# Confidential is not mapped or exported.
-# Submitter-Id is not mapped or exported.
-#
-# Design decisions:
-# This script generates a SQL script file rather than dumping the data
-# directly into the database. This is to allow the user to check
-# and/or modify the results before they are put into the database.
-# The PR number is very important and must be maintained as the Bugzilla
-# bug number, because there are many references to the PR number, such
-# as in code comments, CVS comments, customer communications, etc.
-# Reading ENUMERATED and TEXT fields:
-# 1) All leading and trailing whitespace is stripped.
-# Reading MULTITEXT fields:
-# 1) All leading blank lines are stripped.
-# 2) All trailing whitespace is stripped.
-# 3) Indentation is preserved.
-# Audit-Trail is not mapped to bugs_activity table, because there
-# is no place to put the "Why" text, which can have a fair amount
-# of information content.
-#
-# 15 January 2002 - changes from Andrea Dell'Amico <adellam@link.it>
-#
-# * Adapted to the new database structure: now long_descs is a
-# separate table.
-# * Set a default for the target milestone, otherwise bugzilla
-# doesn't work with the imported database if milestones are used.
-# * In gnats version 3.113 records are separated by "|" and not ":".
-# * userid "1" is for the bugzilla administrator, so it's better to
-# start from 2.
-#
-
-use strict;
-
-# Suffix to be appended to username to make it an email address.
-my($username_suffix) = "\@platte.com";
-
-# Default organization that should be ignored and not passed on to Bugzilla.
-# Only bugs that are reported outside of the default organization will have
-# their Originator,Organization fields passed on.
-# The assumption here is that if the Organization is identical to the
-# $default_organization, then the Originator will most likely be only an
-# alias for the From field in the mail header.
-my($default_organization) = "Platte River Associates|platte";
-
-# Username for reporter field if unable to determine from mail header
-my($gnats_username) = "gnats\@platte.com";
-
-# Flag indicating if cleanup file should use edit-pr or ${EDITOR}.
-# Using edit-pr is safer, but may be too slow if there are too many
-# PRs that need cleanup. If you use ${EDITOR}, then you must make
-# sure that you have exclusive access to the database, and that you
-# do not screw up any fields.
-my($cleanup_with_edit_pr) = 0;
-
-# Component name and description for bugs imported from GNATS.
-my($default_component) = "GNATS Import";
-my($default_component_description) = "Bugs imported from GNATS.";
-
-# First generated userid. Start from 2: 1 is used for the bugzilla
-# administrator.
-my($userid_base) = 2;
-
-# Output filenames.
-my($cleanup_pathname) = "gnats2bz_cleanup.sh";
-my($stats_pathname) = "gnats2bz_stats.txt";
-my($data_pathname) = "gnats2bz_data.sql";
-
-# List of ENUMERATED and TEXT fields.
-my(@text_fields) = qw(Number Category Synopsis Confidential Severity
- Priority Responsible State Class Submitter-Id
- Arrival-Date Originator Release);
-
-# List of MULTITEXT fields.
-my(@multitext_fields) = qw(Mail-Header Organization Environment Description
- How-To-Repeat Fix Audit-Trail Unformatted);
-
-# List of fields to report statistics for.
-my(@statistics_fields) = qw(Category Confidential Severity Priority
- Responsible State Class Submitter-Id Originator
- Organization Release Environment);
-
-# Array to hold list of GNATS PRs.
-my(@pr_list);
-
-# Array to hold list of GNATS categories.
-my(@categories_list);
-
-# Array to hold list of GNATS responsible users.
-my(@responsible_list);
-
-# Array to hold list of usernames.
-my(@username_list);
-# Put the gnats_username in first.
-get_userid($gnats_username);
-
-# Hash to hold list of versions.
-my(%versions_table);
-
-# Hash to hold contents of PR.
-my(%pr_data);
-
-# String to hold duplicate fields found during read of PR.
-my($pr_data_dup_fields) = "";
-
-# String to hold badly labeled fields found during read of PR.
-# This usually happens when the user does not separate the field name
-# from the field data with whitespace.
-my($pr_data_bad_fields) = " ";
-
-# Hash to hold statistics (note that this a hash of hashes).
-my(%pr_stats);
-
-# Process commmand line.
-my($gnats_db_dir) = @ARGV;
-defined($gnats_db_dir) || die "gnats-db dir not specified";
-(-d $gnats_db_dir) || die "$gnats_db_dir is not a directory";
-
-# Load @pr_list from GNATS index file.
-my($index_pathname) = $gnats_db_dir . "/gnats-adm/index";
-(-f $index_pathname) || die "$index_pathname not found";
-print "Reading $index_pathname...\n";
-if (!load_index($index_pathname)) {
- return(0);
-}
-
-# Load @category_list from GNATS categories file.
-my($categories_pathname) = $gnats_db_dir . "/gnats-adm/categories";
-(-f $categories_pathname) || die "$categories_pathname not found";
-print "Reading $categories_pathname...\n";
-if (!load_categories($categories_pathname)) {
- return(0);
-}
-
-# Load @responsible_list from GNATS responsible file.
-my($responsible_pathname) = $gnats_db_dir . "/gnats-adm/responsible";
-(-f $responsible_pathname) || die "$responsible_pathname not found";
-print "Reading $responsible_pathname...\n";
-if (!load_responsible($responsible_pathname)) {
- return(0);
-}
-
-# Open cleanup file.
-open(CLEANUP, ">$cleanup_pathname") ||
- die "Unable to open $cleanup_pathname: $!";
-chmod(0744, $cleanup_pathname) || warn "Unable to chmod $cleanup_pathname: $!";
-print CLEANUP "#!/bin/sh\n";
-print CLEANUP "# List of PRs that have problems found by gnats2bz.pl.\n";
-
-# Open data file.
-open(DATA, ">$data_pathname") || die "Unable to open $data_pathname: $!";
-print DATA "-- Exported data from $gnats_db_dir by gnats2bz.pl.\n";
-print DATA "-- Load it into a Bugzilla database using the command:\n";
-print DATA "-- mysql -uroot -p'ROOT_PASSWORD' bugs < gnats2bz_data.sql\n";
-print DATA "--\n";
-
-# Loop over @pr_list.
-my($pr);
-foreach $pr (@pr_list) {
- print "Processing $pr...\n";
- if (!read_pr("$gnats_db_dir/$pr")) {
- next;
- }
-
- translate_pr();
-
- check_pr($pr);
-
- collect_stats();
-
- update_versions();
-
- write_bugs();
-
- write_longdescs();
-
-}
-
-write_non_bugs_tables();
-
-close(CLEANUP) || die "Unable to close $cleanup_pathname: $!";
-close(DATA) || die "Unable to close $data_pathname: $!";
-
-print "Generating $stats_pathname...\n";
-report_stats();
-
-sub load_index {
- my($pathname) = @_;
- my($record);
- my(@fields);
-
- open(INDEX, $pathname) || die "Unable to open $pathname: $!";
-
- while ($record = <INDEX>) {
- @fields = split(/\|/, $record);
- push(@pr_list, $fields[0]);
- }
-
- close(INDEX) || die "Unable to close $pathname: $!";
-
- return(1);
-}
-
-sub load_categories {
- my($pathname) = @_;
- my($record);
-
- open(CATEGORIES, $pathname) || die "Unable to open $pathname: $!";
-
- while ($record = <CATEGORIES>) {
- if ($record =~ /^#/) {
- next;
- }
- push(@categories_list, [split(/:/, $record)]);
- }
-
- close(CATEGORIES) || die "Unable to close $pathname: $!";
-
- return(1);
-}
-
-sub load_responsible {
- my($pathname) = @_;
- my($record);
-
- open(RESPONSIBLE, $pathname) || die "Unable to open $pathname: $!";
-
- while ($record = <RESPONSIBLE>) {
- if ($record =~ /^#/) {
- next;
- }
- push(@responsible_list, [split(/\|/, $record)]);
- }
-
- close(RESPONSIBLE) || die "Unable to close $pathname: $!";
-
- return(1);
-}
-
-sub read_pr {
- my($pr_filename) = @_;
- my($multitext) = "Mail-Header";
- my($field, $mail_header);
-
- # Empty the hash.
- %pr_data = ();
-
- # Empty the list of duplicate fields.
- $pr_data_dup_fields = "";
-
- # Empty the list of badly labeled fields.
- $pr_data_bad_fields = "";
-
- unless (open(PR, $pr_filename)) {
- warn "error opening $pr_filename: $!";
- return(0);
- }
-
- LINELOOP: while (<PR>) {
- chomp;
-
- if ($multitext eq "Unformatted") {
- # once we reach "Unformatted", rest of file goes there
- $pr_data{$multitext} = append_multitext($pr_data{$multitext}, $_);
- next LINELOOP;
- }
-
- # Handle ENUMERATED and TEXT fields.
- foreach $field (@text_fields) {
- if (/^>$field:($|\s+)/) {
- $pr_data{$field} = $'; # part of string after match
- $pr_data{$field} =~ s/\s+$//; # strip trailing whitespace
- $multitext = "";
- next LINELOOP;
- }
- }
-
- # Handle MULTITEXT fields.
- foreach $field (@multitext_fields) {
- if (/^>$field:\s*$/) {
- $_ = $'; # set to part of string after match part
- if (defined($pr_data{$field})) {
- if ($pr_data_dup_fields eq "") {
- $pr_data_dup_fields = $field;
- } else {
- $pr_data_dup_fields = "$pr_data_dup_fields $field";
- }
- }
- $pr_data{$field} = $_;
- $multitext = $field;
- next LINELOOP;
- }
- }
-
- # Check for badly labeled fields.
- foreach $field ((@text_fields, @multitext_fields)) {
- if (/^>$field:/) {
- if ($pr_data_bad_fields eq "") {
- $pr_data_bad_fields = $field;
- } else {
- $pr_data_bad_fields = "$pr_data_bad_fields $field";
- }
- }
- }
-
- # Handle continued MULTITEXT field.
- $pr_data{$multitext} = append_multitext($pr_data{$multitext}, $_);
- }
-
- close(PR) || warn "error closing $pr_filename: $!";
-
- # Strip trailing newlines from MULTITEXT fields.
- foreach $field (@multitext_fields) {
- if (defined($pr_data{$field})) {
- $pr_data{$field} =~ s/\s+$//;
- }
- }
-
- return(1);
-}
-
-sub append_multitext {
- my($original, $addition) = @_;
-
- if (defined($original) && $original ne "") {
- return "$original\n$addition";
- } else {
- return $addition;
- }
-}
-
-sub check_pr {
- my($pr) = @_;
- my($error_list) = "";
-
- if ($pr_data_dup_fields ne "") {
- $error_list = append_error($error_list, "Multiple '$pr_data_dup_fields'");
- }
-
- if ($pr_data_bad_fields ne "") {
- $error_list = append_error($error_list, "Bad field labels '$pr_data_bad_fields'");
- }
-
- if (!defined($pr_data{"Description"}) || $pr_data{"Description"} eq "") {
- $error_list = append_error($error_list, "Description empty");
- }
-
- if (defined($pr_data{"Unformatted"}) && $pr_data{"Unformatted"} ne "") {
- $error_list = append_error($error_list, "Unformatted text");
- }
-
- if (defined($pr_data{"Release"}) && length($pr_data{"Release"}) > 16) {
- $error_list = append_error($error_list, "Release > 16 chars");
- }
-
- if (defined($pr_data{"Fix"}) && $pr_data{"Fix"} =~ /State-Changed-/) {
- $error_list = append_error($error_list, "Audit in Fix field");
- }
-
- if (defined($pr_data{"Arrival-Date"})) {
- if ($pr_data{"Arrival-Date"} eq "") {
- $error_list = append_error($error_list, "Arrival-Date empty");
-
- } elsif (unixdate2datetime($pr, $pr_data{"Arrival-Date"}) eq "") {
- $error_list = append_error($error_list, "Arrival-Date format");
- }
- }
-
- # More checks should go here.
-
- if ($error_list ne "") {
- if ($cleanup_with_edit_pr) {
- my(@parts) = split("/", $pr);
- my($pr_num) = $parts[1];
- print CLEANUP "echo \"$error_list\"; edit-pr $pr_num\n";
- } else {
- print CLEANUP "echo \"$error_list\"; \${EDITOR} $pr\n";
- }
- }
-}
-
-sub append_error {
- my($original, $addition) = @_;
-
- if ($original ne "") {
- return "$original, $addition";
- } else {
- return $addition;
- }
-}
-
-sub translate_pr {
- # This function performs GNATS -> Bugzilla translations that should
- # happen before collect_stats().
-
- if (!defined($pr_data{"Organization"})) {
- $pr_data{"Originator"} = "";
- }
- if ($pr_data{"Organization"} =~ /$default_organization/) {
- $pr_data{"Originator"} = "";
- $pr_data{"Organization"} = "";
- }
- $pr_data{"Organization"} =~ s/^\s+//g; # strip leading whitespace
-
- if (!defined($pr_data{"Release"}) ||
- $pr_data{"Release"} eq "" ||
- $pr_data{"Release"} =~ /^unknown-1.0$/
- ) {
- $pr_data{"Release"} = "unknown";
- }
-
- if (defined($pr_data{"Responsible"})) {
- $pr_data{"Responsible"} =~ /\w+/;
- $pr_data{"Responsible"} = "$&$username_suffix";
- }
-
- my($rep_platform, $op_sys) = ("All", "All");
- if (defined($pr_data{"Environment"})) {
- if ($pr_data{"Environment"} =~ /[wW]in.*NT/) {
- $rep_platform = "PC";
- $op_sys = "Windows NT";
- } elsif ($pr_data{"Environment"} =~ /[wW]in.*95/) {
- $rep_platform = "PC";
- $op_sys = "Windows 95";
- } elsif ($pr_data{"Environment"} =~ /[wW]in.*98/) {
- $rep_platform = "PC";
- $op_sys = "Windows 98";
- } elsif ($pr_data{"Environment"} =~ /OSF/) {
- $rep_platform = "DEC";
- $op_sys = "OSF/1";
- } elsif ($pr_data{"Environment"} =~ /AIX/) {
- $rep_platform = "RS/6000";
- $op_sys = "AIX";
- } elsif ($pr_data{"Environment"} =~ /IRIX/) {
- $rep_platform = "SGI";
- $op_sys = "IRIX";
- } elsif ($pr_data{"Environment"} =~ /SunOS.*5\.\d/) {
- $rep_platform = "Sun";
- $op_sys = "Solaris";
- } elsif ($pr_data{"Environment"} =~ /SunOS.*4\.\d/) {
- $rep_platform = "Sun";
- $op_sys = "SunOS";
- }
- }
-
- $pr_data{"Environment"} = "$rep_platform:$op_sys";
-}
-
-sub collect_stats {
- my($field, $value);
-
- foreach $field (@statistics_fields) {
- $value = $pr_data{$field};
- if (!defined($value)) {
- $value = "";
- }
- if (defined($pr_stats{$field}{$value})) {
- $pr_stats{$field}{$value}++;
- } else {
- $pr_stats{$field}{$value} = 1;
- }
- }
-}
-
-sub report_stats {
- my($field, $value, $count);
-
- open(STATS, ">$stats_pathname") ||
- die "Unable to open $stats_pathname: $!";
- print STATS "Statistics of $gnats_db_dir collated by gnats2bz.pl.\n";
-
- my($field_stats);
- while (($field, $field_stats) = each(%pr_stats)) {
- print STATS "\n$field:\n";
- while (($value, $count) = each(%$field_stats)) {
- print STATS " $value: $count\n";
- }
- }
-
- close(STATS) || die "Unable to close $stats_pathname: $!";
-}
-
-sub get_userid {
- my($responsible) = @_;
- my($username, $userid);
-
- if (!defined($responsible)) {
- return(-1);
- }
-
- # Search for current username in the list.
- $userid = $userid_base;
- foreach $username (@username_list) {
- if ($username eq $responsible) {
- return($userid);
- }
- $userid++;
- }
-
- push(@username_list, $responsible);
- return($userid);
-}
-
-sub update_versions {
-
- if (!defined($pr_data{"Release"}) || !defined($pr_data{"Category"})) {
- return;
- }
-
- my($curr_product) = $pr_data{"Category"};
- my($curr_version) = $pr_data{"Release"};
-
- if ($curr_version eq "") {
- return;
- }
-
- if (!defined($versions_table{$curr_product})) {
- $versions_table{$curr_product} = [ ];
- }
-
- my($version_list) = $versions_table{$curr_product};
- my($version);
- foreach $version (@$version_list) {
- if ($version eq $curr_version) {
- return;
- }
- }
-
- push(@$version_list, $curr_version);
-}
-
-sub write_bugs {
- my($bug_id) = $pr_data{"Number"};
-
- my($userid) = get_userid($pr_data{"Responsible"});
-
- # Mapping from Class,Severity to bug_severity
- # At our site, the Severity,Priority fields have degenerated
- # into a 9-level priority field.
- my($bug_severity) = "normal";
- if ($pr_data{"Class"} eq "change-request") {
- $bug_severity = "enhancement";
- } elsif (defined($pr_data{"Synopsis"})) {
- if ($pr_data{"Synopsis"} =~ /crash|assert/i) {
- $bug_severity = "critical";
- } elsif ($pr_data{"Synopsis"} =~ /wrong|error/i) {
- $bug_severity = "major";
- }
- }
- $bug_severity = SqlQuote($bug_severity);
-
- # Mapping from Severity,Priority to priority
- # At our site, the Severity,Priority fields have degenerated
- # into a 9-level priority field.
- my($priority) = "Highest";
- if (defined($pr_data{"Severity"}) && defined($pr_data{"Severity"})) {
- if ($pr_data{"Severity"} eq "critical") {
- if ($pr_data{"Priority"} eq "high") {
- $priority = "Highest";
- } else {
- $priority = "High";
- }
- } elsif ($pr_data{"Severity"} eq "serious") {
- if ($pr_data{"Priority"} eq "low") {
- $priority = "Low";
- } else {
- $priority = "Normal";
- }
- } else {
- if ($pr_data{"Priority"} eq "high") {
- $priority = "Low";
- } else {
- $priority = "Lowest";
- }
- }
- }
- $priority = SqlQuote($priority);
-
- # Map State,Class to bug_status,resolution
- my($bug_status, $resolution);
- if ($pr_data{"State"} eq "open" || $pr_data{"State"} eq "analyzed") {
- $bug_status = "ASSIGNED";
- $resolution = "";
- } elsif ($pr_data{"State"} eq "feedback") {
- $bug_status = "RESOLVED";
- $resolution = "FIXED";
- } elsif ($pr_data{"State"} eq "closed") {
- $bug_status = "CLOSED";
- if (defined($pr_data{"Class"}) && $pr_data{"Class"} =~ /^duplicate/) {
- $resolution = "DUPLICATE";
- } elsif (defined($pr_data{"Class"}) && $pr_data{"Class"} =~ /^mistaken/) {
- $resolution = "INVALID";
- } else {
- $resolution = "FIXED";
- }
- } elsif ($pr_data{"State"} eq "suspended") {
- $bug_status = "RESOLVED";
- $resolution = "WONTFIX";
- } else {
- $bug_status = "NEW";
- $resolution = "";
- }
- $bug_status = SqlQuote($bug_status);
- $resolution = SqlQuote($resolution);
-
- my($creation_ts) = "";
- if (defined($pr_data{"Arrival-Date"}) && $pr_data{"Arrival-Date"} ne "") {
- $creation_ts = unixdate2datetime($bug_id, $pr_data{"Arrival-Date"});
- }
- $creation_ts = SqlQuote($creation_ts);
-
- my($delta_ts) = "";
- if (defined($pr_data{"Audit-Trail"})) {
- # note that (?:.|\n)+ is greedy, so this should match the
- # last Changed-When
- if ($pr_data{"Audit-Trail"} =~ /(?:.|\n)+-Changed-When: (.+)/) {
- $delta_ts = unixdate2timestamp($bug_id, $1);
- }
- }
- if ($delta_ts eq "") {
- if (defined($pr_data{"Arrival-Date"}) && $pr_data{"Arrival-Date"} ne "") {
- $delta_ts = unixdate2timestamp($bug_id, $pr_data{"Arrival-Date"});
- }
- }
- $delta_ts = SqlQuote($delta_ts);
-
- my($short_desc) = SqlQuote($pr_data{"Synopsis"});
-
- my($rep_platform, $op_sys) = split(/\|/, $pr_data{"Environment"});
- $rep_platform = SqlQuote($rep_platform);
- $op_sys = SqlQuote($op_sys);
-
- my($reporter) = get_userid($gnats_username);
- if (
- defined($pr_data{"Mail-Header"}) &&
- $pr_data{"Mail-Header"} =~ /From ([\w.]+\@[\w.]+)/
- ) {
- $reporter = get_userid($1);
- }
-
- my($version) = "";
- if (defined($pr_data{"Release"})) {
- $version = substr($pr_data{"Release"}, 0, 16);
- }
- $version = SqlQuote($version);
-
- my($product) = "";
- if (defined($pr_data{"Category"})) {
- $product = $pr_data{"Category"};
- }
- $product = SqlQuote($product);
-
- my($component) = SqlQuote($default_component);
-
- my($target_milestone) = "0";
- # $target_milestone = SqlQuote($target_milestone);
-
- my($qa_contact) = "0";
-
- # my($bug_file_loc) = "";
- # $bug_file_loc = SqlQuote($bug_file_loc);
-
- # my($status_whiteboard) = "";
- # $status_whiteboard = SqlQuote($status_whiteboard);
-
- print DATA "\ninsert into bugs (\n";
- print DATA " bug_id, assigned_to, bug_severity, priority, bug_status, creation_ts, delta_ts,\n";
- print DATA " short_desc,\n";
- print DATA " rep_platform, op_sys, reporter, version,\n";
- print DATA " product, component, resolution, target_milestone, qa_contact\n";
- print DATA ") values (\n";
- print DATA " $bug_id, $userid, $bug_severity, $priority, $bug_status, $creation_ts, $delta_ts,\n";
- print DATA " $short_desc,\n";
- print DATA " $rep_platform, $op_sys, $reporter, $version,\n";
- print DATA " $product, $component, $resolution, $target_milestone, $qa_contact\n";
- print DATA ");\n";
-}
-
-sub write_longdescs {
-
- my($bug_id) = $pr_data{"Number"};
- my($who) = get_userid($pr_data{"Responsible"});;
- my($bug_when) = "";
- if (defined($pr_data{"Arrival-Date"}) && $pr_data{"Arrival-Date"} ne "") {
- $bug_when = unixdate2datetime($bug_id, $pr_data{"Arrival-Date"});
- }
- $bug_when = SqlQuote($bug_when);
- my($thetext) = $pr_data{"Description"};
- if (defined($pr_data{"How-To-Repeat"}) && $pr_data{"How-To-Repeat"} ne "") {
- $thetext =
- $thetext . "\n\nHow-To-Repeat:\n" . $pr_data{"How-To-Repeat"};
- }
- if (defined($pr_data{"Fix"}) && $pr_data{"Fix"} ne "") {
- $thetext = $thetext . "\n\nFix:\n" . $pr_data{"Fix"};
- }
- if (defined($pr_data{"Originator"}) && $pr_data{"Originator"} ne "") {
- $thetext = $thetext . "\n\nOriginator:\n" . $pr_data{"Originator"};
- }
- if (defined($pr_data{"Organization"}) && $pr_data{"Organization"} ne "") {
- $thetext = $thetext . "\n\nOrganization:\n" . $pr_data{"Organization"};
- }
- if (defined($pr_data{"Audit-Trail"}) && $pr_data{"Audit-Trail"} ne "") {
- $thetext = $thetext . "\n\nAudit-Trail:\n" . $pr_data{"Audit-Trail"};
- }
- if (defined($pr_data{"Unformatted"}) && $pr_data{"Unformatted"} ne "") {
- $thetext = $thetext . "\n\nUnformatted:\n" . $pr_data{"Unformatted"};
- }
- $thetext = SqlQuote($thetext);
-
- print DATA "\ninsert into longdescs (\n";
- print DATA " bug_id, who, bug_when, thetext\n";
- print DATA ") values (\n";
- print DATA " $bug_id, $who, $bug_when, $thetext\n";
- print DATA ");\n";
-
-}
-
-sub write_non_bugs_tables {
-
- my($categories_record);
- foreach $categories_record (@categories_list) {
- my($component) = SqlQuote($default_component);
- my($product) = SqlQuote(@$categories_record[0]);
- my($description) = SqlQuote(@$categories_record[1]);
- my($initialowner) = SqlQuote(@$categories_record[2] . $username_suffix);
-
- print DATA "\ninsert into products (\n";
- print DATA
- " product, description, milestoneurl, isactive\n";
- print DATA ") values (\n";
- print DATA
- " $product, $description, '', 1\n";
- print DATA ");\n";
-
- print DATA "\ninsert into components (\n";
- print DATA
- " value, program, initialowner, initialqacontact, description\n";
- print DATA ") values (\n";
- print DATA
- " $component, $product, $initialowner, '', $description\n";
- print DATA ");\n";
-
- print DATA "\ninsert into milestones (\n";
- print DATA
- " value, product, sortkey\n";
- print DATA ") values (\n";
- print DATA
- " 0, $product, 0\n";
- print DATA ");\n";
- }
-
- my($username);
- my($userid) = $userid_base;
- my($password) = "password";
- my($realname);
- my($groupset) = 0;
- foreach $username (@username_list) {
- $realname = map_username_to_realname($username);
- $username = SqlQuote($username);
- $realname = SqlQuote($realname);
- print DATA "\ninsert into profiles (\n";
- print DATA
- " userid, login_name, cryptpassword, realname, groupset\n";
- print DATA ") values (\n";
- print DATA
- " $userid, $username, encrypt('$password'), $realname, $groupset\n";
- print DATA ");\n";
- $userid++;
- }
-
- my($product);
- my($version_list);
- while (($product, $version_list) = each(%versions_table)) {
- $product = SqlQuote($product);
-
- my($version);
- foreach $version (@$version_list) {
- $version = SqlQuote($version);
-
- print DATA "\ninsert into versions (value, program) ";
- print DATA "values ($version, $product);\n";
- }
- }
-
-}
-
-sub map_username_to_realname() {
- my($username) = @_;
- my($name, $realname);
-
- # get the portion before the @
- $name = $username;
- $name =~ s/\@.*//;
-
- my($responsible_record);
- foreach $responsible_record (@responsible_list) {
- if (@$responsible_record[0] eq $name) {
- return(@$responsible_record[1]);
- }
- if (defined(@$responsible_record[2])) {
- if (@$responsible_record[2] eq $username) {
- return(@$responsible_record[1]);
- }
- }
- }
-
- return("");
-}
-
-sub detaint_string {
- my ($str) = @_;
- $str =~ m/^(.*)$/s;
- $str = $1;
-}
-
-sub SqlQuote {
- my ($str) = (@_);
- $str =~ s/([\\\'])/\\$1/g;
- $str =~ s/\0/\\0/g;
- # If it's been SqlQuote()ed, then it's safe, so we tell -T that.
- $str = detaint_string($str);
- return "'$str'";
-}
-
-sub unixdate2datetime {
- my($bugid, $unixdate) = @_;
- my($year, $month, $day, $hour, $min, $sec);
-
- if (!split_unixdate($bugid, $unixdate, \$year, \$month, \$day, \$hour, \$min, \$sec)) {
- return("");
- }
-
- return("$year-$month-$day $hour:$min:$sec");
-}
-
-sub unixdate2timestamp {
- my($bugid, $unixdate) = @_;
- my($year, $month, $day, $hour, $min, $sec);
-
- if (!split_unixdate($bugid, $unixdate, \$year, \$month, \$day, \$hour, \$min, \$sec)) {
- return("");
- }
-
- return("$year$month$day$hour$min$sec");
-}
-
-sub split_unixdate {
- # "Tue Jun 6 14:50:00 1995"
- # "Mon Nov 20 17:03:11 [MST] 1995"
- # "12/13/94"
- # "jan 1, 1995"
- my($bugid, $unixdate, $year, $month, $day, $hour, $min, $sec) = @_;
- my(@parts);
-
- $$hour = "00";
- $$min = "00";
- $$sec = "00";
-
- @parts = split(/ +/, $unixdate);
- if (@parts >= 5) {
- # year
- $$year = $parts[4];
- if ($$year =~ /[A-Z]{3}/) {
- # Must be timezone, try next field.
- $$year = $parts[5];
- }
- if ($$year =~ /\D/) {
- warn "$bugid: Error processing year part '$$year' of date '$unixdate'\n";
- return(0);
- }
- if ($$year < 30) {
- $$year = "20" . $$year;
- } elsif ($$year < 100) {
- $$year = "19" . $$year;
- } elsif ($$year < 1970 || $$year > 2029) {
- warn "$bugid: Error processing year part '$$year' of date '$unixdate'\n";
- return(0);
- }
-
- # month
- $$month = $parts[1];
- if ($$month =~ /\D/) {
- if (!month2number($month)) {
- warn "$bugid: Error processing month part '$$month' of date '$unixdate'\n";
- return(0);
- }
-
- } elsif ($$month < 1 || $$month > 12) {
- warn "$bugid: Error processing month part '$$month' of date '$unixdate'\n";
- return(0);
-
- } elsif (length($$month) == 1) {
- $$month = "0" . $$month;
- }
-
- # day
- $$day = $parts[2];
- if ($$day < 1 || $$day > 31) {
- warn "$bugid: Error processing day part '$day' of date '$unixdate'\n";
- return(0);
-
- } elsif (length($$day) == 1) {
- $$day = "0" . $$day;
- }
-
- @parts = split(/:/, $parts[3]);
- $$hour = $parts[0];
- $$min = $parts[1];
- $$sec = $parts[2];
-
- return(1);
-
- } elsif (@parts == 3) {
- # year
- $$year = $parts[2];
- if ($$year =~ /\D/) {
- warn "$bugid: Error processing year part '$$year' of date '$unixdate'\n";
- return(0);
- }
- if ($$year < 30) {
- $$year = "20" . $$year;
- } elsif ($$year < 100) {
- $$year = "19" . $$year;
- } elsif ($$year < 1970 || $$year > 2029) {
- warn "$bugid: Error processing year part '$$year' of date '$unixdate'\n";
- return(0);
- }
-
- # month
- $$month = $parts[0];
- if ($$month =~ /\D/) {
- if (!month2number($month)) {
- warn "$bugid: Error processing month part '$$month' of date '$unixdate'\n";
- return(0);
- }
-
- } elsif ($$month < 1 || $$month > 12) {
- warn "$bugid: Error processing month part '$$month' of date '$unixdate'\n";
- return(0);
-
- } elsif (length($$month) == 1) {
- $$month = "0" . $$month;
- }
-
- # day
- $$day = $parts[1];
- $$day =~ s/,//;
- if ($$day < 1 || $$day > 31) {
- warn "$bugid: Error processing day part '$day' of date '$unixdate'\n";
- return(0);
-
- } elsif (length($$day) == 1) {
- $$day = "0" . $$day;
- }
-
- return(1);
- }
-
- @parts = split(/:/, $unixdate);
- if (@parts == 3 && length($unixdate) <= 8) {
- $$year = "19" . $parts[2];
-
- $$month = $parts[0];
- if (length($$month) == 1) {
- $$month = "0" . $$month;
- }
-
- $$day = $parts[1];
- if (length($$day) == 1) {
- $$day = "0" . $$day;
- }
-
- return(1);
- }
-
- warn "$bugid: Error processing date '$unixdate'\n";
- return(0);
-}
-
-sub month2number {
- my($month) = @_;
-
- if ($$month =~ /jan/i) {
- $$month = "01";
- } elsif ($$month =~ /feb/i) {
- $$month = "02";
- } elsif ($$month =~ /mar/i) {
- $$month = "03";
- } elsif ($$month =~ /apr/i) {
- $$month = "04";
- } elsif ($$month =~ /may/i) {
- $$month = "05";
- } elsif ($$month =~ /jun/i) {
- $$month = "06";
- } elsif ($$month =~ /jul/i) {
- $$month = "07";
- } elsif ($$month =~ /aug/i) {
- $$month = "08";
- } elsif ($$month =~ /sep/i) {
- $$month = "09";
- } elsif ($$month =~ /oct/i) {
- $$month = "10";
- } elsif ($$month =~ /nov/i) {
- $$month = "11";
- } elsif ($$month =~ /dec/i) {
- $$month = "12";
- } else {
- return(0);
- }
-
- return(1);
-}
-