1 <?php # vim:ts=2:sw=2:et:
2 /* For licensing and copyright terms, see the file named LICENSE */
5 // partly - event.toHTML is borked... - we should use templating for this..
6 require_once 'MTrackWeb/Ticket.php';
8 class MTrackWeb_Events extends MTrackWeb_Ticket
19 $this->id = $pi ? $pi: (isset($_GET['id']) ? $_GET['id'] : 0);
20 $this->id = (int) $this->id ;
27 $start = isset($_REQUEST['start']) ? (int) $_REQUEST['start'] : 0;
28 $limit = isset($_REQUEST['limit']) ? (int) $_REQUEST['limit'] : 100;
32 //DB_DataObject::debugLevel(1);
33 $d = DB_DataObject::factory('mtrack_change');
34 $d->ontable = 'mtrack_ticket';
36 $d->orderBy('changedate ASC'); // last first?
37 $d->limit ($start, $limit);
41 $this->events = array();
43 $this->events[$d->id] = clone($d);
46 $d = DB_DataObject::factory('mtrack_change_audit');
47 $d->whereAddIn('change_id', array_keys($this->events), 'int');
51 $this->events[$d->change_id]->audit[] = clone($d);
55 foreach($this->events as $id=>$c) {
56 echo $this->eventToHtml($c);
59 //$this->renderEvents();
62 function eventToHtml($e)
69 $cid = "comment:{$e->id}";
71 // tidied up by jquery..
72 $timestamp = $this->link->date($e->changedate, false);
77 // default is that something changed..
83 $comment_fields = array();
86 if (!empty($e->reason)) {
87 $comments[] = $e->reason;
88 $type = 'Comment added';
89 $comment_title = array_shift(explode("\n", $e->reason));
93 $comment_fields = str_replace("\n", "<BR>" , htmlspecialchars($e->cachedAuditToString()."\n"));
94 //$comment_body .= "<b>$label</b> $citem[action]<br>\n";
98 $commit_info = array();
100 preg_match('/\(In \[changeset:([^,]+),([a-z0-9]+)\]\)(.*)$/i', $comment_title, $commit_info)) {
104 $comment_title = '<a class="changesetlink" href="'. $GLOBALS['ABSWEB'] . 'changeset.php/'.
105 $commit_info[1].'/'.$commit_info[2]. '">[' . $commit_info[2] . ']</a>'.$commit_info[3];
109 if ($this->id == $this->issue->created) {
111 $comment_title = 'Issue Created';
119 <div class="ticketevent">
120 <span class="ticketevent-expand" id="ticketevent-expand-' . $e->id . '">+ ' . $type.'</span>
121 <a class="pmark" href="#'.$cid.'">#'.$e->id.'</a>
123 <span class="ticketevent-expand" id="ticketevent-expand-title-' . $e->id . '">' .
124 (strlen($comment_title) ? $comment_title : $comment_fields) . '
127 <span style="float:right">' .
128 $this->link->username($e->person_id, array('no_image' => true, 'fullname' => true)) . '
129 - <a name="'.$cid.'">'.$timestamp.'</a>
137 foreach ($this->effort as $eff) {
138 $exp = (float)$eff['expended'];
139 if ($eff['expended'] != 0) {
140 $comment_body .= "<b>spent</b> $exp hours<br>\n";
151 foreach ($comments as $cid => $text) {
152 // look for changesets in the comments..
153 // and display them as expandable linsk..
154 $html .= '<pre class="showdown-render">' . htmlspecialchars($text) .
155 "\n\n" . $comment_fields . '</PRE>'; // MTrack_Wiki::format_to_html($text);
164 // list the files that where changed...
165 //$html.= print_r($M, true);
166 $rp = '/' . $commit_info[1] . '/' . $commit_info[2];
168 $repo = MTrackSCM::factory($rp);
169 $cd = $repo->historyWithChangelog(null, 1, 'rev', $rp);
173 if (!is_array($cd->ent->files) || !count($cd->ent->files)) {
177 $num = count(array_keys($cd->ent->files));
184 $file_summary = array();
185 foreach($map as $k=>$v) {
188 foreach ($cd->ent->files as $id => $file) {
191 $type = isset($map[$file->status]) ? $map[$file->status] : '??? '. $file->status;
195 // will bork on unknown...
202 <div class="ticketevent ticketevent-fileitem">
203 <span class="ticketevent-expand" id="ticketevent-expand-' . $this->cid . '.' . $id .'">+ ' . $type.'</span>
204 <span title="' . $fullrp . '?part=' . $id. '" class="ticketevent-expand" id="ticketevent-expand-title-' . $this->cid . '.' . $id . '">' .
205 $file->nameToHtml() . '
207 <span title="' . $fullrp . '?part=' . $id. '" class="ticketevent-expand-diff changesetlink">[View Diff]</span>
208 <span title="' . $fullrp . '" class="ticketevent-expand-view changesetlink">[View File]</span>
209 <span title="' . $fullrp . '" class="ticketevent-expand-view changesetlink">[View History]</span>
211 <div class="ticketchangeinfo" id="ticketchangeinfo-' . $this->cid . '.' . $id . '"></div>
220 foreach($summary as $k=>$v) {
224 $ar[] = $v . ' ' . $k;
227 <div class="ticketevent ticketevent-fileitem">
228 <span class="ticketevent-expand" id="ticketevent-expand-' . $this->cid . '.0">+ MULTIPLE FILES: </span>
229 <span title="' . $fullrp . '?part=' . 0 . '" class="ticketevent-expand" id="ticketevent-expand-title-' . $this->cid . '.' . $id . '">' .
230 implode(', ', $ar) . '
232 <span title="' . $fullrp . '" class="ticketevent-expand-diff changesetlink">[View Diff]</span>
233 <span title="' . $fullrp . '" class="ticketevent-expand-view changesetlink">[View File]</span>
234 <span title="' . $fullrp . '" class="ticketevent-expand-view changesetlink">[View History]</span>
236 <div class="ticketchangeinfo" id="ticketchangeinfo-' . $this->cid . '"></div>
241 //$html .= print_r($cd, true);
252 function collapse_diff($diff)
255 require_once 'MTrackWeb/Changeset.php';
256 $cs = new MTrackWeb_Changeset();
257 $id = 'diff_' . $idnum++;
259 "<button onclick='\$("#$id").toggle(); return false;'>Toggle diff</button>".
260 "<div id='$id' style='display:none'>" .
261 $cs->diff($diff) . "</div>";
264 function diff_strings($before, $now)
267 $tempdir = sys_get_temp_dir();
268 $afile = tempnam($tempdir, "mtrack");
269 $bfile = tempnam($tempdir, "mtrack");
270 file_put_contents($afile, $before);
271 file_put_contents($bfile, $now);
272 static $diff = false;
274 require_once 'System.php';
275 $diff= System::which('diff');
277 if (PHP_OS == 'SunOS') {
278 // TODO: make an option to allow use of gnu diff on solaris
279 $diff = shell_exec("$diff -u $afile $bfile");
280 $diff = str_replace($afile, 'before', $diff);
281 $diff = str_replace($bfile, 'now', $diff);
283 $diff = shell_exec("$diff --label before --label now -u $afile $bfile");
287 $diff = htmlentities($diff, ENT_COMPAT, 'utf-8');