function GetFormattedDiff($text1, $text2) { $lines1 = explode("\n", $text1); $lines2 = explode("\n", $text2); /* Create the Diff object. */ $diff = new Text_Diff('native', array($lines1, $lines2)); /* Output the diff in unified format. */ $renderer = new Text_Diff_Renderer_unified(); return $renderer->render($diff); }
public static function compare($lines1, $lines2, $render_mode) { if (is_string($lines1)) { $lines1 = explode("\n", $lines1); } if (is_string($lines2)) { $lines2 = explode("\n", $lines2); } $diff = new Text_Diff('auto', array($lines1, $lines2)); if ($render_mode == 'inline') { $renderer = new Text_Diff_Renderer_inline(); } else { $renderer = new Text_Diff_Renderer_unified(); } return $renderer->render($diff); }
function getTextDiff($method, $diff1, $diff2) { switch ($method) { case 'unified': require_once '/data/project/xtools/textdiff/textdiff/Diff/Renderer/unified.php'; $diff = new Text_Diff('auto', array(explode("\n", $diff1), explode("\n", $diff2))); $renderer = new Text_Diff_Renderer_unified(); $diff = $renderer->render($diff); break; case 'inline': require_once '/data/project/xtools/textdiff/textdiff/Diff/Renderer/inline.php'; $diff = new Text_Diff('auto', array(explode("\n", $diff1), explode("\n", $diff2))); $renderer = new Text_Diff_Renderer_inline(); $diff = $renderer->render($diff); break; } unset($renderer); return $diff; }
/** * Use the lexer to generate a new PHP file and to compare it with the * production version. Any variance is reported in a diff file. * * @param string Name of the source .plex file. * @param string Name of the generated PHP file. * @param string Name of the expected PHP file. * @param string Name of the file to save differences in. * @return boolean True if actual and expected files match. */ public function runCodeTestCore($plexFile, $phpFile, $expectFile, $diffFile) { $lex = new PHP_LexerGenerator($plexFile, $phpFile); $actual = str_replace("\r\n", "\n", file_get_contents($phpFile)); $expect = str_replace("\r\n", "\n", file_get_contents($expectFile)); if (md5($expect) != md5($actual)) { // Turn strict off for a bit... $errLev = error_reporting(); error_reporting($errLev & ~E_STRICT); require_once 'Text/Diff.php'; require_once 'Text/Diff/Renderer.php'; require_once 'Text/Diff/Renderer/unified.php'; $actual = explode("\n", $actual); $expect = explode("\n", $expect); $diff = new Text_Diff('auto', array($expect, $actual)); $renderer = new Text_Diff_Renderer_unified(); file_put_contents($diffFile, $renderer->render($diff)); error_reporting($errLev); return false; } return true; }
public function text_diff($unchangedSentence_array, $changedSentence_array) { $changed_diff_unchanged = array(); $diff = new Text_Diff($unchangedSentence_array, $changedSentence_array); $context = count($unchangedSentence_array); $renderer = new Text_Diff_Renderer_unified($context); $arr = $renderer->render($diff); $kk = 0; $body = 0; $del = 0; $add = 0; foreach ($arr as $ee) { if ($kk != 0) { foreach ($ee as $key => $val) { if ($val == "diffbody") { $body = 1; } if ($val == "diffdeleted") { $del = 1; } if ($val == "diffadded") { $add = 1; } if ($key == "data") { foreach ($val as $item) { if ($body == 1) { $changed_diff_unchanged[] = $item; } if ($del == 1) { $changed_diff_unchanged[] = "-" . $item; } if ($add == 1) { $changed_diff_unchanged[] = "+" . $item; } } $body = 0; $del = 0; $add = 0; } } } $kk = $kk + 1; } return $changed_diff_unchanged; }
/** * Produce differences using PHP * * @param string comapre string 1 * @param string comapre string 2 * @return @e string */ protected function _getPhpDiff($str1, $str2, $method = 'inline') { $str1 = explode("\n", str_replace("\r\n", "\n", $str1)); $str2 = explode("\n", str_replace("\r\n", "\n", $str2)); /* Set include path.. */ @set_include_path(IPS_KERNEL_PATH . 'PEAR/'); /*noLibHook*/ /* OMG.. too many PHP 5 errors under strict standards */ $oldReportLevel = error_reporting(0); error_reporting($oldReportLevel ^ E_STRICT); require_once 'Text/Diff.php'; /*noLibHook*/ require_once 'Text/Diff/Renderer.php'; /*noLibHook*/ $diff = new Text_Diff('auto', array($str1, $str2)); if ($method == 'inline') { require_once 'Text/Diff/Renderer/inline.php'; /*noLibHook*/ $renderer = new Text_Diff_Renderer_inline(); } else { require_once 'Text/Diff/Renderer/unified.php'; /*noLibHook*/ $renderer = new Text_Diff_Renderer_unified(); $renderer->_leading_context_lines = 10000; $renderer->_trailing_context_lines = 10000; } $result = $renderer->render($diff); /* Go back to old reporting level */ error_reporting($oldReportLevel | E_STRICT); $result = str_replace("<ins>", '<ins style="-ips-match:1">', $result); $result = str_replace("<del>", '<del style="-ips-match:1">', $result); # Got a match? if (strstr($result, 'style="-ips-match:1"')) { $this->diff_found = 1; } # No post processing please $this->post_process = 0; # Convert lines to a space, and two spaces to a single line //$result = str_replace(' ', chr(10), str_replace( "\n", " ", $result ) ); //$result = $this->_diffTagSpace($result,1); return $result; }
/** * Returns the diff from the old Gruntfile and the new one * * @return string */ public function showDiff() { $currentGruntfileContent = $this->loadGruntfile(); $diff = new Text_Diff('auto', array($this->oldGruntfileContent, $currentGruntfileContent)); $renderer = new Text_Diff_Renderer_unified(); $content = array(); foreach (explode("\n", $renderer->render($diff)) as $line) { $line = rtrim($line); if (strlen($line) > 0) { if ($line[0] == '+') { $line = $this->colorGreen($line); } elseif ($line[0] == '-') { $line = $this->colorRed($line); } } $content[] = $line; } return implode(PHP_EOL, $content) . PHP_EOL; }
/** * Inline diff * * @param string $text1 * @param string $text2 * @return string */ function inline_diff($text1, $text2) { $hlines1 = explode("\n", $text1); $hlines2 = explode("\n", $text2); include_once dirname(dirname(__FILE__)) . '/libraries/Text/Diff.php'; // create the diff object $diff = new Text_Diff($hlines1, $hlines2); // get the diff in unified format // you can add 4 other parameters, which will be the ins/del prefix/suffix tags include_once dirname(dirname(__FILE__)) . '/libraries/Text/Diff/Renderer/unified.php'; $renderer = new Text_Diff_Renderer_unified(); //include_once dirname(dirname(__FILE__)).'/libraries/Text/Diff/Renderer/inline.php'; //$renderer = new Text_Diff_Renderer_Inline(50000); return $renderer->render($diff); }
/** * Gets the snippet text for the two revisions as well as a unified diff file of the revisions * @param {stdClass} $data Data passed from ActionScript * @return {array} Standard response base */ public function getSnippetDiff($data) { $response = CodeBank_ClientAPI::responseBase(); //Get the Main Revision $snippet1 = SnippetVersion::get()->byID(intval($data->mainRev)); if (empty($snippet1) || $snippet1 === false || $snippet1->ID == 0) { $response['status'] = 'EROR'; $response['message'] = _t('CodeBankAPI.MAIN_REVISION_NOT_FOUND', '_Main revision not found'); return $response; } $snippet1 = preg_replace('/\\r\\n|\\n|\\r/', "\n", $snippet1->Text); //Get the Comparision Revision $snippet2 = SnippetVersion::get()->byID(intval($data->compRev)); if (empty($snippet2) || $snippet1 === false || $snippet2->ID == 0) { $response['status'] = 'EROR'; $response['message'] = _t('CodeBankAPI.COMPARE_REVISION_NOT_FOUND', '_Compare revision not found'); return $response; } $snippet2 = preg_replace('/\\r\\n|\\n|\\r/', "\n", $snippet2->Text); //Generate the diff file $diff = new Text_Diff('auto', array(preg_split('/\\n/', $snippet2), preg_split('/\\n/', $snippet1))); $renderer = new Text_Diff_Renderer_unified(array('leading_context_lines' => 1, 'trailing_context_lines' => 1)); $response['data'] = array('mainRev' => $snippet1, 'compRev' => $snippet2, 'diff' => $renderer->render($diff)); return $response; }
<?php /** * Decode note bodies again which have failed to decode unicode html entities */ // notes that need to be decoded $res = $db->getAll('select not_id, not_iss_id, not_is_blocked, not_created_date, not_note, not_full_message from {{%note}} where not_note like ?', array('%�%')); $render_diff = function ($old, $new) { $diff = new Text_Diff(explode(PHP_EOL, $old), explode(PHP_EOL, $new)); $renderer = new Text_Diff_Renderer_unified(); return $renderer->render($diff); }; $now = Date_Helper::getCurrentDateGMT(); foreach ($res as $i => $row) { $email = Mime_Helper::decode($row['not_full_message'], true); $note = trim($email->body); if ($row['not_is_blocked']) { $note = Mail_Helper::getCannedBlockedMsgExplanation() . $note; } $diff = $render_diff($row['not_note'], $note); echo "--- issue #{$row['not_iss_id']} {$row['not_created_date']} GMT\n"; echo "+++ issue #{$row['not_iss_id']} {$now} GMT\n"; echo $diff; $db->query('UPDATE {{%note}} ' . 'SET not_note=? ' . 'WHERE not_id=?', array($note, $row['not_id'])); } echo count($res), " notes updated\n";
$data['f1'] = $f1; $data['f2'] = $f2; $data['perm1'] = makePermStr($f1); $data['perm2'] = makePermStr($f2); // ファイルを読み込み $file1 = file($f1); $file2 = file($f2); $file1 = str_replace("\r", "[CR]", $file1); $file1 = str_replace("\n", "[LF]", $file1); $file1 = str_replace("[LF]", "[LF]\n", $file1); $file2 = str_replace("\r", "[CR]", $file2); $file2 = str_replace("\n", "[LF]", $file2); $file2 = str_replace("[LF]", "[LF]\n", $file2); // diifる $diff = new Text_Diff('auto', array($file2, $file1)); $renderer = new Text_Diff_Renderer_unified(); $data['diff_lines'] = array(); foreach (explode("\n", $renderer->render($diff)) as $line) { $type = "none"; if (strpos($line, '+') === 0) { $type = "add"; } else { if (strpos($line, '-') === 0) { $type = "remove"; } } $data['diff_lines'][] = array('type' => $type, 'line' => $line); } $template->display($data); /** * パーミッション文字列作成
/** * Returns custom field updates in a diff format * * @param array $updated_fields * @param bool $role If specified only fields that $role can see will be returned * @return array */ public static function formatUpdatesToDiffs($updated_fields, $role = false) { if ($role) { $updated_fields = self::getUpdatedFieldsForRole($updated_fields, $role); } $diffs = array(); foreach ($updated_fields as $fld_id => $field) { if ($field['old_display'] != $field['new_display']) { if ($field['type'] == 'textarea') { $old = explode("\n", $field['old_display']); $new = explode("\n", $field['new_display']); $diff = new Text_Diff($old, $new); $renderer = new Text_Diff_Renderer_unified(); $desc_diff = explode("\n", trim($renderer->render($diff))); $diffs[] = $field['title'] . ':'; foreach ($desc_diff as $diff) { $diffs[] = $diff; } $diffs[] = ''; } else { $diffs[] = '-' . $field['title'] . ': ' . $field['old_display']; $diffs[] = '+' . $field['title'] . ': ' . $field['new_display']; } } } return $diffs; }
function post_updated($post_id, $post_after, $post_before) { $options = $this->get_options(); // Transitioning from an Auto Draft to Published shouldn't result in a notification. if ($post_before->post_status === 'auto-draft' && $post_after->post_status === 'publish') { return; } // If we're purely saving a draft, and don't have the draft option enabled, skip. If we're transitioning one way or the other, send a notification. if (0 == $options['drafts'] && in_array($post_before->post_status, array('draft', 'auto-draft')) && 'draft' == $post_after->post_status) { return; } if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return; } if (!in_array($post_before->post_type, $options['post_types'])) { return; } $this->left_post = $post_before; $this->right_post = $post_after; // If this is a new post, set an empty title for $this->left_post so that it appears in the diff. $child_posts = wp_get_post_revisions($post_id, array('numberposts' => 1)); if (count($child_posts) == 0) { $this->left_post->post_title = ''; } if (!$this->left_post || !$this->right_post) { return; } $html_diffs = array(); $text_diffs = array(); $identical = true; foreach (_wp_post_revision_fields() as $field => $field_title) { $left = apply_filters("_wp_post_revision_field_{$field}", $this->left_post->{$field}, $field); $right = apply_filters("_wp_post_revision_field_{$field}", $this->right_post->{$field}, $field); if (!($diff = $this->wp_text_diff($left, $right))) { continue; } $html_diffs[$field_title] = $diff; $left = normalize_whitespace($left); $right = normalize_whitespace($right); $left_lines = explode("\n", $left); $right_lines = explode("\n", $right); require_once dirname(__FILE__) . '/unified.php'; $text_diff = new Text_Diff($left_lines, $right_lines); $renderer = new Text_Diff_Renderer_unified(); $text_diffs[$field_title] = $renderer->render($text_diff); $identical = false; } if ($identical) { $this->left_post = null; $this->right_post = null; return; } // Grab the meta data $the_author = get_the_author_meta('display_name', get_current_user_id()); // The revision $the_title = get_the_title($this->right_post->ID); // New title (may be same as old title) $the_date = gmdate('j F, Y \\a\\t G:i \\U\\T\\C', strtotime($this->right_post->post_modified_gmt . '+0000')); // Modified time $the_permalink = esc_url(get_permalink($this->right_post->ID)); $the_edit_link = esc_url(get_edit_post_link($this->right_post->ID)); // Send email $charset = apply_filters('wp_mail_charset', get_option('blog_charset')); $blogname = html_entity_decode(get_option('blogname'), ENT_QUOTES, $charset); $title = html_entity_decode($the_title, ENT_QUOTES, $charset); add_action('phpmailer_init', array($this, 'phpmailer_init')); $user_emails = array(); foreach ($options['users'] as $user_id) { if (function_exists('is_multisite') && is_multisite()) { if (is_user_member_of_blog($user_id, get_current_blog_id())) { $user_emails[] = get_user_option('user_email', $user_id); } } else { if ($user_email = get_user_option('user_email', $user_id)) { $user_emails[] = $user_email; } } } $emails = array_unique(array_merge($options['emails'], $user_emails)); if (!count($emails) && apply_filters('email_post_changes_admin_email_fallback', true)) { $emails[] = get_option('admin_email'); } $emails = apply_filters('email_post_changes_emails', $emails, $this->left_post->ID, $this->right_post->ID); foreach ($emails as $email) { do_action('email_post_changes_before_email_generation', $email); $left_title = __('Revision'); $right_title = sprintf(__('Current %s'), $post_type = ucfirst($this->right_post->post_type)); $head_sprintf = __('%s made the following changes to the %s %s on %s'); // HTML $html_diff_head = '<h2>' . sprintf(__('%s changed'), $post_type) . "</h2>\n"; $html_diff_head .= '<p>' . sprintf($head_sprintf, esc_html($the_author), sprintf(_x('“%s” [%s]', '1 = link, 2 = "edit"'), "<a href='{$the_permalink}'>" . esc_html($the_title) . '</a>', "<a href='{$the_edit_link}'>" . __('edit') . '</a>'), $this->right_post->post_type, $the_date) . "</p>\n\n"; $html_diff_head .= "<table style='width: 100%; border-collapse: collapse; border: none;'><tr>\n"; $html_diff_head .= "<td style='width: 50%; padding: 0; margin: 0;'>" . esc_html($left_title) . ' @ ' . esc_html($this->left_post->post_date_gmt) . "</td>\n"; $html_diff_head .= "<td style='width: 50%; padding: 0; margin: 0;'>" . esc_html($right_title) . ' @ ' . esc_html($this->right_post->post_modified_gmt) . "</td>\n"; $html_diff_head .= "</tr></table>\n\n"; $html_diff = ''; foreach ($html_diffs as $field_title => $diff) { $html_diff .= '<h3>' . esc_html($field_title) . "</h3>\n"; $html_diff .= "{$diff}\n\n"; } $html_diff = rtrim($html_diff); // Replace classes with inline style $html_diff = str_replace("class='diff'", 'style="width: 100%; border-collapse: collapse; border: none; white-space: pre-wrap; word-wrap: break-word; font-family: Consolas,Monaco,Courier,monospace;"', $html_diff); $html_diff = preg_replace('#<col[^>]+/?>#i', '', $html_diff); $html_diff = str_replace("class='diff-deletedline'", 'style="padding: 5px; width: 50%; background-color: #fdd;"', $html_diff); $html_diff = str_replace("class='diff-addedline'", 'style="padding: 5px; width: 50%; background-color: #dfd;"', $html_diff); $html_diff = str_replace("class='diff-context'", 'style="padding: 5px; width: 50%;"', $html_diff); $html_diff = str_replace('<td>', '<td style="padding: 5px;">', $html_diff); $html_diff = str_replace('<del>', '<del style="text-decoration: none; background-color: #f99;">', $html_diff); $html_diff = str_replace('<ins>', '<ins style="text-decoration: none; background-color: #9f9;">', $html_diff); $html_diff = str_replace(array('</td>', '</tr>', '</tbody>'), array("</td>\n", "</tr>\n", "</tbody>\n"), $html_diff); $html_diff = $html_diff_head . $html_diff; // Refactor some of the meta data for TEXT $length = max(strlen($left_title), strlen($right_title)); $left_title = str_pad($left_title, $length + 2); $right_title = str_pad($right_title, $length + 2); // TEXT $text_diff = sprintf($head_sprintf, $the_author, '"' . $the_title . '"', $this->right_post->post_type, $the_date) . "\n"; $text_diff .= "URL: {$the_permalink}\n"; $text_diff .= "Edit: {$the_edit_link}\n\n"; foreach ($text_diffs as $field_title => $diff) { $text_diff .= "{$field_title}\n"; $text_diff .= "===================================================================\n"; $text_diff .= "--- {$left_title}\t({$this->left_post->post_date_gmt})\n"; $text_diff .= "+++ {$right_title}\t({$this->right_post->post_modified_gmt})\n"; $text_diff .= "{$diff}\n\n"; } $this->text_diff = $text_diff = rtrim($text_diff); wp_mail($email, sprintf(__('[%s] %s changed: %s'), $blogname, $post_type, $title), $html_diff); do_action('email_post_changes_after_email_sent', $email); } remove_action('phpmailer_init', array($this, 'phpmailer_init')); do_action('email_post_changes_email_sent'); }
$diff_from_file4disp .= "<span style='color:blue;'>" . $line . "</span>\n"; } else { $diff_from_file4disp .= $line . "\n"; } } } error_reporting($original_error_level); } // diff from DB-default to selected DB template $diff_from_default4disp = ''; if ($tpl['tpl_tplset'] != 'default') { $original_error_level = error_reporting(); error_reporting($original_error_level & ~E_NOTICE & ~E_WARNING); list($default_source) = $db->fetchRow($db->query("SELECT tpl_source FROM " . $db->prefix("tplfile") . " NATURAL LEFT JOIN " . $db->prefix("tplsource") . " WHERE tpl_tplset='default' AND tpl_file='" . addslashes($tpl['tpl_file']) . "' AND tpl_module='" . addslashes($tpl['tpl_module']) . "'")); $diff = new Text_Diff(explode("\n", $default_source), explode("\n", $tpl['tpl_source'])); $renderer = new Text_Diff_Renderer_unified(); $diff_str = htmlspecialchars($renderer->render($diff), ENT_QUOTES); foreach (explode("\n", $diff_str) as $line) { if (ord($line) == 0x2d) { $diff_from_default4disp .= "<span style='color:red;'>" . $line . "</span>\n"; } else { if (ord($line) == 0x2b) { $diff_from_default4disp .= "<span style='color:blue;'>" . $line . "</span>\n"; } else { $diff_from_default4disp .= $line . "\n"; } } } error_reporting($original_error_level); } echo "\n\t<form name='diff_form' id='diff_form' action='' method='get'>\n";
/** * Method used to send a diff-style notification email to the issue * subscribers about updates to its attributes. * * @param integer $issue_id The issue ID * @param array $old The old issue details * @param array $new The new issue details * @param array $updated_custom_fields An array of the custom fields that were changed. */ public static function notifyIssueUpdated($issue_id, $old, $new, $updated_custom_fields) { $prj_id = Issue::getProjectID($issue_id); $diffs = array(); if (@$new['keep_assignments'] == 'no') { if (empty($new['assignments'])) { $new['assignments'] = array(); } $assign_diff = Misc::arrayDiff($old['assigned_users'], $new['assignments']); if (count($assign_diff) > 0) { $diffs[] = '-' . ev_gettext('Assignment List') . ': ' . $old['assignments']; @($diffs[] = '+' . ev_gettext('Assignment List') . ': ' . implode(', ', User::getFullName($new['assignments']))); } } if (isset($new['expected_resolution_date']) && @$old['iss_expected_resolution_date'] != $new['expected_resolution_date']) { $diffs[] = '-' . ev_gettext('Expected Resolution Date') . ': ' . $old['iss_expected_resolution_date']; $diffs[] = '+' . ev_gettext('Expected Resolution Date') . ': ' . $new['expected_resolution_date']; } if (isset($new['category']) && $old['iss_prc_id'] != $new['category']) { $diffs[] = '-' . ev_gettext('Category') . ': ' . Category::getTitle($old['iss_prc_id']); $diffs[] = '+' . ev_gettext('Category') . ': ' . Category::getTitle($new['category']); } if (isset($new['release']) && $old['iss_pre_id'] != $new['release']) { $diffs[] = '-' . ev_gettext('Release') . ': ' . Release::getTitle($old['iss_pre_id']); $diffs[] = '+' . ev_gettext('Release') . ': ' . Release::getTitle($new['release']); } if (isset($new['priority']) && $old['iss_pri_id'] != $new['priority']) { $diffs[] = '-' . ev_gettext('Priority') . ': ' . Priority::getTitle($old['iss_pri_id']); $diffs[] = '+' . ev_gettext('Priority') . ': ' . Priority::getTitle($new['priority']); } if (isset($new['severity']) && $old['iss_sev_id'] != $new['severity']) { $diffs[] = '-' . ev_gettext('Severity') . ': ' . Severity::getTitle($old['iss_sev_id']); $diffs[] = '+' . ev_gettext('Severity') . ': ' . Severity::getTitle($new['severity']); } if (isset($new['status']) && $old['iss_sta_id'] != $new['status']) { $diffs[] = '-' . ev_gettext('Status') . ': ' . Status::getStatusTitle($old['iss_sta_id']); $diffs[] = '+' . ev_gettext('Status') . ': ' . Status::getStatusTitle($new['status']); } if (isset($new['resolution']) && $old['iss_res_id'] != $new['resolution']) { $diffs[] = '-' . ev_gettext('Resolution') . ': ' . Resolution::getTitle($old['iss_res_id']); $diffs[] = '+' . ev_gettext('Resolution') . ': ' . Resolution::getTitle($new['resolution']); } if (isset($new['estimated_dev_time']) && $old['iss_dev_time'] != $new['estimated_dev_time']) { $diffs[] = '-' . ev_gettext('Estimated Dev. Time') . ': ' . Misc::getFormattedTime($old['iss_dev_time'] * 60); $diffs[] = '+' . ev_gettext('Estimated Dev. Time') . ': ' . Misc::getFormattedTime($new['estimated_dev_time'] * 60); } if (isset($new['summary']) && $old['iss_summary'] != $new['summary']) { $diffs[] = '-' . ev_gettext('Summary') . ': ' . $old['iss_summary']; $diffs[] = '+' . ev_gettext('Summary') . ': ' . $new['summary']; } if (isset($new['percent_complete']) && $old['iss_original_percent_complete'] != $new['percent_complete']) { $diffs[] = '-' . ev_gettext('Percent complete') . ': ' . $old['iss_original_percent_complete']; $diffs[] = '+' . ev_gettext('Percent complete') . ': ' . $new['percent_complete']; } if (isset($new['description']) && $old['iss_description'] != $new['description']) { $old['iss_description'] = explode("\n", $old['iss_original_description']); $new['description'] = explode("\n", $new['description']); $diff = new Text_Diff($old['iss_description'], $new['description']); $renderer = new Text_Diff_Renderer_unified(); $desc_diff = explode("\n", trim($renderer->render($diff))); $diffs[] = 'Description:'; foreach ($desc_diff as $diff) { $diffs[] = $diff; } } $data = Issue::getDetails($issue_id); $data['diffs'] = implode("\n", $diffs); $data['updated_by'] = User::getFullName(Auth::getUserID()); $all_emails = array(); $role_emails = array(User::ROLE_VIEWER => array(), User::ROLE_REPORTER => array(), User::ROLE_CUSTOMER => array(), User::ROLE_USER => array(), User::ROLE_DEVELOPER => array(), User::ROLE_MANAGER => array(), User::ROLE_ADMINISTRATOR => array()); $users = self::getUsersByIssue($issue_id, 'updated'); foreach ($users as $user) { if (empty($user['sub_usr_id'])) { $email = $user['sub_email']; // non users are treated as "Viewers" for permission checks $role = User::ROLE_VIEWER; } else { $prefs = Prefs::get($user['sub_usr_id']); if (Auth::getUserID() == $user['sub_usr_id'] && (empty($prefs['receive_copy_of_own_action'][$prj_id]) || $prefs['receive_copy_of_own_action'][$prj_id] == false)) { continue; } $email = User::getFromHeader($user['sub_usr_id']); $role = $user['pru_role']; } // now add it to the list of emails if (!empty($email) && !in_array($email, $all_emails)) { $all_emails[] = $email; $role_emails[$role][] = $email; } } // get additional email addresses to notify $additional_emails = Workflow::getAdditionalEmailAddresses($prj_id, $issue_id, 'issue_updated', array('old' => $old, 'new' => $new)); $data['custom_field_diffs'] = implode("\n", Custom_Field::formatUpdatesToDiffs($updated_custom_fields, User::ROLE_VIEWER)); foreach ($additional_emails as $email) { if (!in_array($email, $all_emails)) { $role_emails[User::ROLE_VIEWER][] = $email; } } // send email to each role separately due to custom field restrictions foreach ($role_emails as $role => $emails) { if (count($emails) > 0) { $data['custom_field_diffs'] = implode("\n", Custom_Field::formatUpdatesToDiffs($updated_custom_fields, $role)); if (!empty($data['custom_field_diffs']) || !empty($data['diffs'])) { self::notifySubscribers($issue_id, $emails, 'updated', $data, ev_gettext('Updated'), false); } } } }
/** * Text_Diff example script. * * Take two files from the command line args and produce a unified * diff of them. * * @package Text_Diff */ require_once 'Text/Diff.php'; require_once 'Text/Diff/Renderer.php'; require_once 'Text/Diff/Renderer/unified.php'; /* Make sure we have enough arguments. */ if (count($argv) < 3) { echo "Usage: diff.php <file1> <file2>\n\n"; exit; } /* Make sure both files exist. */ if (!is_readable($argv[1])) { echo "{$argv['1']} not found or not readable.\n\n"; } if (!is_readable($argv[2])) { echo "{$argv['2']} not found or not readable.\n\n"; } /* Load the lines of each file. */ $lines1 = file($argv[1]); $lines2 = file($argv[2]); /* Create the Diff object. */ $diff = new Text_Diff('auto', array($lines1, $lines2)); /* Output the diff in unified format. */ $renderer = new Text_Diff_Renderer_unified(); echo $renderer->render($diff);
function createPatch($updatecache = false) { include_once "Lib/Archive/Tar.php"; include_once 'Lib/Text/Diff.php'; include_once 'Lib/Text/Diff/Renderer/unified.php'; $start = microtime(true); $tar_object = new Archive_Tar(_bmoddir . "Data/Cache.tar"); $tar_object->setErrorHandling(PEAR_ERROR_PRINT); $tardata = $tar_object->listContent(); $working = checkDir2(""); $fmerged = array_merge($tardata, $working); $tarf_db = reIndexByFile($tardata); $work_db = reIndexByFile($working); $workidx = indexFilename($working); $tar_idx = indexFilename($tardata); $f_names = array_unique(array_merge($workidx, $tar_idx)); $out = ""; foreach ($f_names as $file) { //speed optimization if ($tarf_db[$file] && $work_db[$file] && $tarf_db[$file]["mtime"] == $work_db[$file]["mtime"] && $updatecache != true) { continue; } if ($tarf_db[$file]) { $fts1 = $tarf_db[$file]["mtime"]; $fdata = $tar_object->extractInString($file); $lines1 = explode("\n", $fdata); //$lines1 = file("Data/$file"); if (substr($fdata, -1, 1) == "\n") { //$lines1[] = ""; } } else { $fts1 = 0; $lines1 = array(); } if ($work_db[$file]) { $fts2 = $work_db[$file]["mtime"]; //$lines2 = file(_bpatdir."$file"); $filetext = file_get_contents(_bmoddir . _bpatdir . "{$file}"); $lines2 = explode("\n", $filetext); } else { $fts2 = 0; $lines2 = array(); $filetext = ""; } if (array_search($file, $workidx) === false && array_search($file, $tar_idx) !== false) { //delted file $out .= renderHeader($file, $fts1, $fts2); $out .= "@@ -0,0 @@\n\n"; continue; } if (array_search($file, $workidx) !== false && array_search($file, $tar_idx) === false) { //added file } if ($filetext == $fdata) { continue; } $diff = new Text_Diff('auto', array($lines1, $lines2)); $renderer = new Text_Diff_Renderer_unified(); $render = $renderer->render($diff); if ($render != "") { $out .= renderHeader($file, $fts1, $fts2); //get ts to work! $out .= $render . "\n"; if (substr($filetext, -1, 1) != "\n") { $out .= "\\ No newline at end of file\n\n"; } } } if ($updatecache == true) { $tar_object->create(array()); foreach ($f_names as $file) { $tar_object->addString($file, file_get_contents(_bmoddir . _bpatdir . "{$file}")); } } return array(microtime(true) - $start, $out, count($addlist)); }
protected function main() { $this->set_title(Nw::$lang['news']['en_attente_title']); $this->set_tpl('news/list_versions.html'); inc_lib('news/news_exists'); $count_news_existe = news_exists($_GET['id']); if ($count_news_existe == false) { redir(Nw::$lang['news']['news_not_exist'], false, 'news-70.html'); } inc_lib('news/get_info_news'); $donnees_news = get_info_news($_GET['id']); // Fil ariane $this->set_filAriane(array(Nw::$lang['news']['news_section'] => array('news-70.html'), $donnees_news['c_nom'] => array($donnees_news['c_rewrite'] . '/'), $donnees_news['n_titre'] => array($donnees_news['c_rewrite'] . '/' . rewrite($donnees_news['n_titre']) . '-' . $_GET['id'] . '/'), Nw::$lang['news']['gestion_vrs'] => array('news-16-' . $_GET['id'] . '.html'), Nw::$lang['news']['list_vrs_fa'] => array(''))); // Ce membre a le droit d'éditer la news ? if ($donnees_news['n_etat'] != 3 && !is_logged_in()) { redir(Nw::$lang['news']['not_view_news_perm'], false, './'); } // Redirection pour comparer 2 versions if (isset($_POST['compare_diff']) && isset($_POST['rev_old']) && isset($_POST['rev_new'])) { if ($_POST['rev_new'] != $_POST['rev_old']) { header('Location: news-16-' . $_GET['id'] . '.html?vrs1=' . intval($_POST['rev_old']) . '&vrs2=' . intval($_POST['rev_new'])); } } /** * Comparaison de 2 versions d'une news * Requiert SHELL /!\ **/ $output_compare = ''; $compare_versions = false; $news_vrs1 = 0; $news_vrs2 = 0; if ($donnees_news['n_nb_versions'] > 1) { // Parser BBcode inc_lib('bbcode/unparse'); $news_vrs1 = 0; $news_vrs2 = 0; $id_unique = uniqid(); // On compare 2 versions if (isset($_GET['vrs1']) && is_numeric($_GET['vrs1']) && isset($_GET['vrs2']) && is_numeric($_GET['vrs2'])) { $news_vrs1 = $_GET['vrs1']; $news_vrs2 = $_GET['vrs2']; $compare_versions = true; } inc_lib('news/get_compare_text_vrs'); $textes_compare = get_compare_text_vrs($_GET['id'], $news_vrs1, $news_vrs2); $news_vrs1 = isset($textes_compare[1][0]) ? $textes_compare[1][0] : ''; $news_vrs2 = isset($textes_compare[0][0]) ? $textes_compare[0][0] : ''; function clean_cache_file($content) { $content = explode("\r", trim($content)); $array_return = array(); foreach ($content as $texte_trim) { if (strlen(trim($texte_trim)) > 0) { $array_return[] = trim($texte_trim); } } return $array_return; } /** * Utilisation de la classe Text_diff (http://pear.php.net/package/Text_Diff/download/1.1.0) **/ include_once 'Text/Diff.php'; include_once 'Text/Diff/Renderer/unified.php'; $lines1 = clean_cache_file(unparse($textes_compare[1][1], 0)); $lines2 = clean_cache_file(unparse($textes_compare[0][1], 0)); $diff = new Text_Diff($lines1, $lines2); $renderer = new Text_Diff_Renderer_unified(); $array_compare = explode("\n", $renderer->render($diff)); foreach ($array_compare as $donnees) { $first_cararacter = ''; $style_line = ''; if (isset($donnees[0]) && in_array($donnees[0], array('-', '+'))) { if ($donnees[0] == '-') { $style_line = ' style="background-color: #ffcccc;"'; } elseif ($donnees[0] == '+') { $style_line = ' style="background-color: #ccffcc;"'; } $first_cararacter = $donnees[0]; $ligne_changee = substr($donnees, 1); } else { $ligne_changee = $donnees; } if (!in_array(substr($donnees, 0, 2), array('@@')) && strlen(trim($ligne_changee)) > 0) { $output_compare .= '<tr> <td class="line_statut">' . $first_cararacter . '</td> <td' . $style_line . '>' . trim($ligne_changee) . '</td> </tr>'; } } } /** * Affichage de la liste des versions **/ inc_lib('news/get_list_vrs'); $numeros_version = array(); $donnees_version = get_list_vrs($_GET['id']); foreach ($donnees_version as $donnees) { Nw::$tpl->setBlock('versions', array('ID' => $donnees['v_id'], 'NUM' => $donnees['v_number'], 'AUTEUR' => $donnees['u_pseudo'], 'AUTEUR_ID' => $donnees['u_id'], 'AUTEUR_ALIAS' => $donnees['u_alias'], 'MINEURE' => $donnees['v_mineure'], 'DATE' => date_sql($donnees['date'], $donnees['heures_date'], $donnees['jours_date']), 'COMMENT' => $donnees['v_raison'], 'IP' => long2ip($donnees['v_ip']))); $numeros_version[$donnees['v_id']] = $donnees['v_number']; } $numbers_vrs = array_flip($numeros_version); $texte_compare = ''; if ($donnees_news['n_nb_versions'] > 1) { $texte_compare = sprintf(Nw::$lang['news']['comparaison_2_versions'], $numeros_version[$news_vrs1], $numeros_version[$news_vrs2]); } $droit_edit_news = false; if (is_logged_in()) { inc_lib('news/can_edit_news'); $droit_edit_news = can_edit_news($donnees_news['n_id_auteur'], $donnees_news['n_etat']); } Nw::$tpl->set(array('ID' => $_GET['id'], 'TITRE' => $donnees_news['n_titre'], 'REWRITE' => rewrite($donnees_news['n_titre']), 'CAT_REWRITE' => $donnees_news['c_rewrite'], 'COMPARAISON' => $output_compare, 'LAST_VERSION' => $donnees_news['n_last_version'], 'NB_VERSIONS' => $donnees_news['n_nb_versions'], 'NUMBERS_VRS' => $numbers_vrs, 'TXT_COMPARE' => $texte_compare, 'DRT_VIEW_IP' => is_logged_in() && Nw::$droits['can_see_ip'], 'NUM_OLD' => $news_vrs1, 'NUM_NEW' => $news_vrs2, 'NEWS_AUTEUR' => $donnees_news['n_id_auteur'], 'CHG_MY_VERSIONS' => is_logged_in() && Nw::$droits['can_change_version_my_news'], 'CHG_ALL_VERSIONS' => is_logged_in() && Nw::$droits['can_change_version_all_news'], 'DLT_VERSIONS' => is_logged_in() && Nw::$droits['can_delete_version'], 'LINK_NB_CONTRIB' => sprintf(Nw::$lang['news']['edit_nb_contrib'], $donnees_news['n_nb_versions']), 'DRT_EDIT' => $droit_edit_news)); }
/** * Function to view the changes between revisions of the specified object. * @param type $path The path to the object (file or directory). * @param type $revFrom Initial revision. * @param type $revTo The final revision. */ public function diffVersions($path = '', $revFrom = 0, $revTo = 0) { require_once 'ext/Diff/Diff.php'; require_once 'ext/Diff/Renderer.php'; require_once 'ext/Diff/Renderer/unified.php'; $this->mime_array = $this->get_mime_array(); //Get a list of objects to be updated. $objects_list = $this->getLogsForUpdate($path, $revFrom, $revTo, false); if (!is_null($objects_list)) { // print_r($objects_list); foreach ($objects_list['files'] as $file) { if ($file != '') { $path_info = pathinfo($file); $mime_type = $this->mime_array[$path_info['extension']]; if (strpos($mime_type, "text") !== false) { $file_revFrom = $this->getFile($file, $revFrom); $file_revFrom = $this->explodeX(array("\r\n", "\r", "\n"), $file_revFrom); $file_revTo = $this->getFile($file, $revTo); $file_revTo = $this->explodeX(array("\r\n", "\r", "\n"), $file_revTo); /* Create the Diff object. */ $diff = new Text_Diff('auto', array($file_revFrom, $file_revTo)); /* Output the diff in unified format. */ $renderer = new Text_Diff_Renderer_unified(); $result = $renderer->render($diff); if (strlen($result) > 1) { //echo "Index: " . $file . " \r\n"; //echo "===================================================================" . " \r\n"; //echo "--- " . $file . " (revision " . $revFrom . ")" . " \r\n"; //echo "+++ " . $file . " (revision " . $revTo . ")" . " \r\n"; //echo $renderer->render($diff) . " \r\n"; } } } } foreach ($objects_list['filesDelete'] as $file) { if ($file != '') { $path_info = pathinfo($file); $mime_type = $this->mime_array[$path_info['extension']]; if (strpos($mime_type, "text") !== false) { $file_revFrom = $this->getFile($file, $revFrom); $file_revFrom = $this->explodeX(array("\r\n", "\r", "\n"), $file_revFrom); $file_revTo = $this->getFile($file, $revTo); $file_revTo = $this->explodeX(array("\r\n", "\r", "\n"), $file_revTo); /* Create the Diff object. */ $diff = new Text_Diff('auto', array($file_revFrom, $file_revTo)); /* Output the diff in unified format. */ $renderer = new Text_Diff_Renderer_unified(); $result = $renderer->render($diff); if (strlen($result) > 1) { //echo "Index: " . $file . " \r\n"; //echo "===================================================================" . " \r\n"; //echo "--- " . $file . " (revision " . $revFrom . ")" . " \r\n"; //echo "+++ " . $file . " (revision " . $revTo . ")" . " \r\n"; //echo $renderer->render($diff) . " \r\n"; } } } } } }
protected function main() { // Seuls les membres peuvent créer des brouillons if (!is_logged_in()) { redir(Nw::$lang['common']['need_login'], false, 'users-10.html'); } // Si le paramètre ID manque if (empty($_GET['id']) || !is_numeric($_GET['id'])) { header('Location: news-70.html'); } inc_lib('news/news_exists'); $count_news_existe = news_exists($_GET['id']); if ($count_news_existe == 0) { redir(Nw::$lang['news']['news_not_exist'], false, 'news-70.html'); } inc_lib('news/get_info_news'); $donnees_news = get_info_news($_GET['id']); // Ce membre a le droit d'éditer la news ? inc_lib('news/can_edit_news'); if (!can_edit_news($donnees_news['n_id_auteur'], $donnees_news['n_etat'])) { redir(Nw::$lang['news']['not_edit_news_perm'], false, 'news-70.html'); } // Est-ce que le membre peut éditer le titre, la catégorie et les tags de la news ? inc_lib('news/can_edit_news_related'); $edit_related = can_edit_news_related($donnees_news['n_id_auteur'], $donnees_news['n_etat']); $edition_grilled = false; $this->set_title(sprintf(Nw::$lang['news']['title_edit_news'], $donnees_news['n_titre'])); $this->set_tpl('news/edit_news.html'); $this->add_css('forms.css'); $this->add_css('code.css'); $this->add_js('write.js'); $this->add_form('contenu'); // Pour rediriger le visiteur d'où il est venu if (!empty($_SERVER['HTTP_REFERER']) && strpos($_SERVER['HTTP_REFERER'], Nw::$site_url) !== false && strpos($_SERVER['HTTP_REFERER'], Nw::$site_url . 'news-60-' . $_GET['id'] . '.html') === false) { $_SESSION['nw_referer_edit'] = $_SERVER['HTTP_REFERER']; } $link_redir = !empty($_SESSION['nw_referer_edit']) ? $_SESSION['nw_referer_edit'] : 'news-60-' . intval($_GET['id']) . '.html'; // Fil ariane $this->set_filAriane(array(Nw::$lang['news']['news_section'] => array('news-70.html'), $donnees_news['c_nom'] => array($donnees_news['c_rewrite'] . '/'), $donnees_news['n_titre'] => array($donnees_news['c_rewrite'] . '/' . rewrite($donnees_news['n_titre']) . '-' . $_GET['id'] . '/'), Nw::$lang['news']['edit_fil_ariane'] => array(''))); $array_status = array(3 => Nw::$lang['news']['etat_news_3'], 2 => Nw::$lang['news']['etat_news_2'], 1 => Nw::$lang['news']['etat_news_1'], 0 => Nw::$lang['news']['etat_news_0']); $list_src = array(); $list_src_url = array(); $position = 0; if ($donnees_news['n_nb_src'] > 0) { inc_lib('news/get_list_src'); $donnees_src = get_list_src($_GET['id']); foreach ($donnees_src as $donnees) { ++$position; $list_src[$position] = $donnees['src_media']; $list_src_url[$position] = $donnees['src_url']; Nw::$tpl->setBlock('src', array('ID' => $position)); } } Nw::$tpl->set(array('ID' => $_GET['id'], 'TITRE' => $donnees_news['n_titre'], 'REWRITE' => rewrite($donnees_news['n_titre']), 'CAT_REWRITE' => $donnees_news['c_rewrite'], 'ID_CAT' => $donnees_news['n_id_cat'], 'IMAGE_ID' => $donnees_news['i_id'], 'IMAGE_NOM' => $donnees_news['i_nom'], 'LINK_NB_CONTRIB' => sprintf(Nw::$lang['news']['edit_nb_contrib'], $donnees_news['n_nb_versions']), 'LAST_VERSION' => $donnees_news['n_last_version'], 'BAL_CHAMP' => 'contenu', 'ETAT_ACTUEL' => $donnees_news['n_etat'], 'ETATS_NEWS' => $array_status, 'EDIT_RELATED' => $edit_related, 'MOD_STATUS' => Nw::$droits['mod_news_status'], 'GRILLED' => false, 'MAX_SRC' => $position == 0 ? $position + 1 : $position)); // Formulaire soumis if (isset($_POST['submit'])) { $array_post = array('titre_news' => $_POST['titre_news'], 'cat' => isset($_POST['cat']) ? $_POST['cat'] : 0, 'contenu' => $_POST['contenu'], 'tags' => isset($_POST['tags']) ? $_POST['tags'] : '', 'private_news' => isset($_POST['private_news']), 'sources' => isset($_POST['sources']) ? $_POST['sources'] : '', 'sources_nom' => isset($_POST['sources_nom']) ? $_POST['sources_nom'] : ''); $var_titre = trim($_POST['titre_news']); $var_content = trim($_POST['contenu']); // Les champs titre & contenu & source ne sont pas vides if ($edit_related && !multi_empty($var_titre, $var_content) || !$edit_related && !empty($var_content)) { // On édite la news inc_lib('news/count_anti_grille'); inc_lib('news/edit_news'); $anti_grille = count_anti_grille($_GET['id'], $_POST['last_version']); if ($anti_grille['count']) { inc_lib('bbcode/parse'); inc_lib('bbcode/unparse'); inc_lib('news/get_info_vrs'); $output_compare = ''; $dn_vrs_grilled = get_info_vrs($donnees_news['n_last_version']); $news_vrs1 = $dn_vrs_grilled['v_texte']; $news_vrs2 = parse($_POST['contenu']); function clean_cache_file($content) { $content = explode("\r", trim($content)); $array_return = array(); foreach ($content as $texte_trim) { if (strlen(trim($texte_trim)) > 0) { $array_return[] = trim($texte_trim); } } return $array_return; } include_once 'Text/Diff.php'; include_once 'Text/Diff/Renderer/unified.php'; $lines1 = clean_cache_file(unparse($news_vrs1, 0)); $lines2 = clean_cache_file(unparse($news_vrs2, 0)); $diff = new Text_Diff($lines1, $lines2); $renderer = new Text_Diff_Renderer_unified(); $array_compare = explode("\n", $renderer->render($diff)); foreach ($array_compare as $donnees) { $first_cararacter = ''; $style_line = ''; if (isset($donnees[0]) && in_array($donnees[0], array('-', '+'))) { if ($donnees[0] == '-') { $style_line = ' style="background-color: #ffcccc;"'; } elseif ($donnees[0] == '+') { $style_line = ' style="background-color: #ccffcc;"'; } $first_cararacter = $donnees[0]; $ligne_changee = substr($donnees, 1); } else { $ligne_changee = $donnees; } if (!in_array(substr($donnees, 0, 2), array('@@')) && strlen(trim($ligne_changee)) > 0) { $output_compare .= '<tr> <td class="line_statut">' . $first_cararacter . '</td> <td' . $style_line . '>' . trim($ligne_changee) . '</td> </tr>'; } } display_form($array_post); Nw::$tpl->set(array('GRILLED' => true, 'COMPARAISON' => $output_compare, 'TEXTE_GRILLED' => sprintf(Nw::$lang['news']['mbr_grilled_edit'], $dn_vrs_grilled['u_alias'], $dn_vrs_grilled['u_pseudo']))); } else { edit_news($_GET['id'], $edit_related); redir(Nw::$lang['news']['msg_news_edit'], true, $link_redir); } } else { display_form($array_post, Nw::$lang['news']['title_content_oblig']); } return; } // Si l'auteur veut supprimer la news if (isset($_GET['imgdel']) && is_numeric($_GET['imgdel']) && $edit_related) { inc_lib('news/delete_img_news'); delete_img_news($_GET['imgdel'], $_GET['id']); redir(Nw::$lang['news']['msg_image_delete'], true, 'news-60-' . $_GET['id'] . '.html'); } // Catégories de news foreach (Nw::$cache_categories as $idcs => $donnees_categorie) { Nw::$tpl->setBlock('cats_news', array('ID' => $idcs, 'TITRE' => $donnees_categorie[0])); } inc_lib('news/get_list_tags_news'); $list_tags = get_list_tags_news(0, $_GET['id']); $list_tags_html = ''; foreach ($list_tags as $dn_tags) { $list_tags_html .= $dn_tags['t_tag'] . ', '; } // On affiche le template inc_lib('bbcode/unparse'); display_form(array('titre_news' => $donnees_news['n_titre'], 'cat' => 0, 'contenu' => unparse($donnees_news['v_texte']), 'tags' => substr($list_tags_html, 0, -2), 'private_news' => $donnees_news['n_private'], 'sources' => $list_src_url, 'sources_nom' => $list_src)); }
function inline_diff($all, $ignoreWhitespace, $ent, $newtname, $oldtname) { global $arrayBased, $fileBased; $context = 5; if ($all) { // Setting the context to 0 makes diff generate the wrong line numbers! $context = 1; } // modify error reporting level to suppress deprecated/strict warning "Assigning the return value of new by reference" $bckLevel = error_reporting(); $removeLevel = 0; if (version_compare(PHP_VERSION, '5.3.0alpha') !== -1) { $removeLevel = E_DEPRECATED; } else { if (version_compare(PHP_VERSION, '5.0.0') !== -1) { $removeLevel = E_STRICT; } } $modLevel = $bckLevel & ~$removeLevel; error_reporting($modLevel); // Create the diff class $fromLines = explode("\n", file_get_contents($oldtname)); $toLines = explode("\n", file_get_contents($newtname)); if (!$ignoreWhitespace) { $diff = new Text_Diff('auto', array($fromLines, $toLines)); } else { $whitespaces = array(' ', "\t", "\n", "\r"); $mappedFromLines = array(); foreach ($fromLines as $line) { $mappedFromLines[] = str_replace($whitespaces, array(), $line); } $mappedToLines = array(); foreach ($toLines as $line) { $mappedToLines[] = str_replace($whitespaces, array(), $line); } $diff = new Text_MappedDiff($fromLines, $toLines, $mappedFromLines, $mappedToLines); } $renderer = new Text_Diff_Renderer_unified(array('leading_context_lines' => $context, 'trailing_context_lines' => $context)); $rendered = explode("\n", $renderer->render($diff)); // restore previous error reporting level error_reporting($bckLevel); $arrayBased = true; $fileBased = false; $listing = diff_result($all, $ent, $newtname, $oldtname, $rendered); return $listing; }
/** * Method used to send a diff-style notification email to the issue * subscribers about updates to its attributes. * * @param integer $issue_id The issue ID * @param array $old The old issue details * @param array $new The new issue details */ public static function notifyIssueUpdated($issue_id, $old, $new) { $prj_id = Issue::getProjectID($issue_id); $diffs = array(); if (@$new['keep_assignments'] == 'no') { if (empty($new['assignments'])) { $new['assignments'] = array(); } $assign_diff = Misc::arrayDiff($old['assigned_users'], $new['assignments']); if (count($assign_diff) > 0) { $diffs[] = '-' . ev_gettext('Assignment List') . ': ' . $old['assignments']; @($diffs[] = '+' . ev_gettext('Assignment List') . ': ' . implode(', ', User::getFullName($new['assignments']))); } } if (isset($new['expected_resolution_date']) && @$old['iss_expected_resolution_date'] != $new['expected_resolution_date']) { $diffs[] = '-' . ev_gettext('Expected Resolution Date') . ': ' . $old['iss_expected_resolution_date']; $diffs[] = '+' . ev_gettext('Expected Resolution Date') . ': ' . $new['expected_resolution_date']; } if (isset($new['category']) && $old['iss_prc_id'] != $new['category']) { $diffs[] = '-' . ev_gettext('Category') . ': ' . Category::getTitle($old['iss_prc_id']); $diffs[] = '+' . ev_gettext('Category') . ': ' . Category::getTitle($new['category']); } if (isset($new['release']) && $old['iss_pre_id'] != $new['release']) { $diffs[] = '-' . ev_gettext('Release') . ': ' . Release::getTitle($old['iss_pre_id']); $diffs[] = '+' . ev_gettext('Release') . ': ' . Release::getTitle($new['release']); } if (isset($new['priority']) && $old['iss_pri_id'] != $new['priority']) { $diffs[] = '-' . ev_gettext('Priority') . ': ' . Priority::getTitle($old['iss_pri_id']); $diffs[] = '+' . ev_gettext('Priority') . ': ' . Priority::getTitle($new['priority']); } if (isset($new['severity']) && $old['iss_sev_id'] != $new['severity']) { $diffs[] = '-' . ev_gettext('Severity') . ': ' . Severity::getTitle($old['iss_sev_id']); $diffs[] = '+' . ev_gettext('Severity') . ': ' . Severity::getTitle($new['severity']); } if (isset($new['status']) && $old['iss_sta_id'] != $new['status']) { $diffs[] = '-' . ev_gettext('Status') . ': ' . Status::getStatusTitle($old['iss_sta_id']); $diffs[] = '+' . ev_gettext('Status') . ': ' . Status::getStatusTitle($new['status']); } if (isset($new['resolution']) && $old['iss_res_id'] != $new['resolution']) { $diffs[] = '-' . ev_gettext('Resolution') . ': ' . Resolution::getTitle($old['iss_res_id']); $diffs[] = '+' . ev_gettext('Resolution') . ': ' . Resolution::getTitle($new['resolution']); } if (isset($new['estimated_dev_time']) && $old['iss_dev_time'] != $new['estimated_dev_time']) { $diffs[] = '-' . ev_gettext('Estimated Dev. Time') . ': ' . Misc::getFormattedTime($old['iss_dev_time'] * 60); $diffs[] = '+' . ev_gettext('Estimated Dev. Time') . ': ' . Misc::getFormattedTime($new['estimated_dev_time'] * 60); } if (isset($new['summary']) && $old['iss_summary'] != $new['summary']) { $diffs[] = '-' . ev_gettext('Summary') . ': ' . $old['iss_summary']; $diffs[] = '+' . ev_gettext('Summary') . ': ' . $new['summary']; } if (isset($new['percent_complete']) && $old['iss_original_percent_complete'] != $new['percent_complete']) { $diffs[] = '-' . ev_gettext('Percent complete') . ': ' . $old['iss_original_percent_complete']; $diffs[] = '+' . ev_gettext('Percent complete') . ': ' . $new['percent_complete']; } if (isset($new['description']) && $old['iss_description'] != $new['description']) { $old['iss_description'] = explode("\n", $old['iss_original_description']); $new['description'] = explode("\n", $new['description']); $diff = new Text_Diff($old['iss_description'], $new['description']); $renderer = new Text_Diff_Renderer_unified(); $desc_diff = explode("\n", trim($renderer->render($diff))); $diffs[] = 'Description:'; foreach ($desc_diff as $diff) { $diffs[] = $diff; } } $emails = array(); $users = self::getUsersByIssue($issue_id, 'updated'); $user_emails = Project::getUserEmailAssocList(Issue::getProjectID($issue_id), 'active', User::getRoleID('Customer')); // FIXME: $user_emails unused $user_emails = array_map(function ($s) { return strtolower($s); }, $user_emails); foreach ($users as $user) { if (empty($user['sub_usr_id'])) { $email = $user['sub_email']; } else { $prefs = Prefs::get($user['sub_usr_id']); if (Auth::getUserID() == $user['sub_usr_id'] && (empty($prefs['receive_copy_of_own_action'][$prj_id]) || $prefs['receive_copy_of_own_action'][$prj_id] == false)) { continue; } $email = User::getFromHeader($user['sub_usr_id']); } // now add it to the list of emails if (!empty($email) && !in_array($email, $emails)) { $emails[] = $email; } } // get additional email addresses to notify $emails = array_merge($emails, Workflow::getAdditionalEmailAddresses($prj_id, $issue_id, 'issue_updated', array('old' => $old, 'new' => $new))); $data = Issue::getDetails($issue_id); $data['diffs'] = implode("\n", $diffs); $data['updated_by'] = User::getFullName(Auth::getUserID()); self::notifySubscribers($issue_id, $emails, 'updated', $data, ev_gettext('Updated'), false); }