function add_changes_for_ticket($ticket, $ticketLabels) { global $trac_db, $tickets, $labels, $users_list, $milestones, $skip_comments, $time_in_us, $verbose; $res = $trac_db->query("SELECT ticket_change.* FROM ticket_change, ticket WHERE ticket.id = ticket_change.ticket AND ticket = {$ticket} ORDER BY ticket, time, field <> 'comment'"); foreach ($res->fetchAll() as $row) { if ($verbose) { print_r($row); } if (!isset($tickets[$row['ticket']])) { echo "Skipping comment " . $row['time'] . " on unknown ticket " . $row['ticket'] . "\n"; continue; } $timestamp = date("j M Y H:i e", $row['time'] / ($time_in_us ? 1000000 : 1)); if ($row['field'] == 'comment') { if ($row['newvalue'] != '') { $text = '**Comment by ' . $row['author'] . ' on ' . $timestamp . "**\n" . $row['newvalue']; } else { $text = '**Modified by ' . $row['author'] . ' on ' . $timestamp . "**"; } $resp = github_add_comment($tickets[$row['ticket']], translate_markup($text)); } else { if (in_array($row['field'], ['component', 'priority', 'type', 'resolution'])) { if (in_array($labels[strtoupper($row['field'])[0]][crc32($row['oldvalue'])], $ticketLabels)) { $index = array_search($labels[strtoupper($row['field'])[0]][crc32($row['oldvalue'])], $ticketLabels); $ticketLabels[$index] = $labels[strtoupper($row['field'])[0]][crc32($row['newvalue'])]; } else { $ticketLabels[] = $labels[strtoupper($row['field'])[0]][crc32($row['newvalue'])]; } $resp = github_update_issue($tickets[$ticket], array('labels' => array_values(array_filter($ticketLabels, 'strlen')))); } else { if ($row['field'] == 'status') { $resp = github_update_issue($tickets[$ticket], array('state' => $row['newvalue'] == 'closed' ? 'closed' : 'open')); } else { if ($row['field'] == 'summary') { $resp = github_update_issue($tickets[$ticket], array('title' => $row['newvalue'])); } else { if (false and $row['field'] == 'description') { // TODO? $body = make_body($row['newvalue']); $timestamp = date("j M Y H:i e", $row['time'] / ($time_in_us ? 1000000 : 1)); // TODO: //$body = '**Reported by ' . obfuscate_email($row['reporter']) . ' on ' . $timestamp . "**\n" . $body; $resp = github_update_issue($tickets[$ticket], array('body' => $body)); } else { if ($row['field'] == 'owner') { if (!empty($row['newvalue'])) { $assignee = isset($users_list[$row['newvalue']]) ? $users_list[$row['newvalue']] : NULL; } else { $assignee = NULL; } $resp = github_update_issue($tickets[$ticket], array('assignee' => $assignee)); } else { if ($row['field'] == 'milestone') { if (empty($row['newvalue'])) { $milestone = NULL; } else { $milestone = $milestones[crc32($row['newvalue'])]; } $resp = github_update_issue($tickets[$ticket], array('milestone' => $milestone)); } else { echo "WARNING: ignoring change of {$row['field']} to {$row['newvalue']}\n"; continue; } } } } } } } if (isset($resp['url'])) { // OK echo "Added change {$resp['url']}\n"; } else { // Error $error = print_r($resp, 1); echo "Failed to add a comment for " . $row['ticket'] . ": {$error}\n"; return false; } // Wait 1sec to ensure the next event will be after // just added (apparently github can reorder // changes/comments if added too fast) sleep(1); } return true; }
} if (!empty($labels['P'][crc32($row['priority'])])) { $ticketLabels[] = $labels['P'][crc32($row['priority'])]; } if (!empty($labels['R'][crc32($row['resolution'])])) { $ticketLabels[] = $labels['R'][crc32($row['resolution'])]; } // There is a strange issue with summaries containing percent signs... $resp = github_add_issue(array('title' => preg_replace("/%/", '[pct]', $row['summary']), 'body' => empty($row['description']) ? 'None' : translate_markup($row['description']), 'assignee' => isset($users_list[$row['owner']]) ? $users_list[$row['owner']] : $row['owner'], 'milestone' => $milestones[crc32($row['milestone'])], 'labels' => $ticketLabels)); if (isset($resp['number'])) { // OK $tickets[$row['id']] = (int) $resp['number']; echo "Ticket #{$row['id']} converted to issue #{$resp['number']}\n"; if ($row['status'] == 'closed') { // Close the issue $resp = github_update_issue($resp['number'], array('title' => preg_replace("/%/", '[pct]', $row['summary']), 'body' => empty($row['description']) ? 'None' : translate_markup($row['description']), 'assignee' => isset($users_list[$row['owner']]) ? $users_list[$row['owner']] : $row['owner'], 'milestone' => $milestones[crc32($row['milestone'])], 'labels' => $ticketLabels, 'state' => 'closed')); if (isset($resp['number'])) { echo "Closed issue #{$resp['number']}\n"; } } } else { // Error $error = print_r($resp, 1); echo "Failed to convert a ticket #{$row['id']}: {$error}\n"; } } // Serialize to restore in future file_put_contents($save_tickets, serialize($tickets)); } if (!$skip_comments) { // Export all comments