MTrackWeb/Events.php
[web.mtrack] / MTrackWeb / Events.php
1 <?php # vim:ts=2:sw=2:et:
2 /* For licensing and copyright terms, see the file named LICENSE */
3  
4 // is this working ???
5 // partly - event.toHTML is borked... - we should use templating for this..
6 require_once 'MTrackWeb/Ticket.php';
7
8 class MTrackWeb_Events extends MTrackWeb_Ticket
9 {
10     var $id; // 0 = new
11     var $issue = false;
12     var $preview;
13     var $error;
14     var $editable;
15     var $tid = 0;
16     
17     function get($pi=0)
18     {
19         $this->id = $pi ?  $pi: (isset($_GET['id']) ? $_GET['id'] : 0);
20         $this->id  = (int) $this->id ;
21         $this->loadIssue();
22         
23         if (!$this->issue) {
24             $this->jerr( "OPPS");
25         }
26  
27         $start = isset($_REQUEST['start']) ? (int) $_REQUEST['start'] : 0;
28         $limit = isset($_REQUEST['limit']) ? (int) $_REQUEST['limit'] : 100;
29         
30         // fetch all the 
31         
32         //DB_DataObject::debugLevel(1);
33         $d = DB_DataObject::factory('mtrack_change');
34         $d->ontable = 'mtrack_ticket';
35         $d->onid = $this->id;
36         $d->orderBy('changedate ASC'); // last first?
37         $d->limit ($start, $limit);
38         $d->audit = array();
39         $d->find();
40         
41         $this->events = array();
42         while ($d->fetch()) {
43             $this->events[$d->id] = clone($d);
44         }
45         /*
46         $d = DB_DataObject::factory('mtrack_change_audit');
47         $d->whereAddIn('change_id', array_keys($this->events), 'int');
48         $d->find();
49         
50         while ($d->fetch()) {
51             $this->events[$d->change_id]->audit[] = clone($d);
52         }
53         
54         */
55         foreach($this->events as $id=>$c) {
56             echo $this->eventToHtml($c);
57         }
58         exit;
59         //$this->renderEvents();
60     }
61     
62     function eventToHtml($e)
63     {
64         
65     
66         
67         $preamble = 0;
68         
69         $cid = "comment:{$e->id}";
70         
71         // tidied up by jquery..
72         $timestamp = $this->link->date($e->changedate, false);
73          
74   
75         $comments = array();
76
77         // default is that something changed..
78         $type = 'Changed';
79         
80         $comment_body = '';
81         
82         $comment_title = '';
83         $comment_fields = array();
84         
85               
86         if (!empty($e->reason)) {
87             $comments[] = $e->reason;
88             $type = 'Comment added';
89             $comment_title = array_shift(explode("\n", $e->reason));
90         }
91         
92          
93         $comment_fields = str_replace("\n", "<BR>" , htmlspecialchars($e->cachedAuditToString()."\n"));
94             //$comment_body .= "<b>$label</b> $citem[action]<br>\n";
95             
96         
97         
98         $commit_info = array();
99         if ($comment_title && 
100             preg_match('/\(In \[changeset:([^,]+),([a-z0-9]+)\]\)(.*)$/i', $comment_title, $commit_info)) {
101             $type = 'Commit';
102             
103             
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];
106             
107             
108         }
109         if ($this->id == $this->issue->created) {
110             $type = 'Created';
111             $comment_title = 'Issue Created';
112         }
113         
114         
115         
116         
117       
118         $html = '
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> 
122                 
123                 <span class="ticketevent-expand" id="ticketevent-expand-title-' . $e->id . '">' .
124                 (strlen($comment_title) ? $comment_title :  $comment_fields) . '
125                 </span>
126                 
127                 <span style="float:right">' . 
128                     $this->link->username($e->person_id, array('no_image' => true, 'fullname' => true))  . '
129                     -  <a name="'.$cid.'">'.$timestamp.'</a> 
130                 </span>
131                 
132             </div>
133             <div class="ticketchangeinfo" id="ticketchangeinfo-' . $e->id . '">' . 
134                $this->link->username($e->person_id, array('no_name' => true, 'size' => 48));
135                    
136               
137               
138          /*
139         foreach ($this->effort as $eff) {
140             $exp = (float)$eff['expended'];
141             if ($eff['expended'] != 0) {
142                 $comment_body .= "<b>spent</b> $exp hours<br>\n";
143                 $preamble++;
144             }
145         }
146          */
147  
148         if ($preamble) {
149             $html .= "<br>\n";
150             $preamble = 0;
151         }
152         
153         foreach ($comments as $cid => $text) {
154             // look for changesets in the comments..
155             // and display them as expandable linsk..
156             $html .= '<pre>' . htmlspecialchars($text) .
157             "\n\n" .  $comment_fields . '</PRE>'; // MTrack_Wiki::format_to_html($text);
158         }
159         
160         
161         $html .= '</div>';
162         
163         
164         
165         if ($commit_info) {
166             // list the files that where changed...
167             //$html.= print_r($M, true);
168             $rp = '/' . $commit_info[1] . '/' . $commit_info[2];
169             $fullrp = $rp;
170             $repo = MTrackSCM::factory($rp);
171             $cd = $repo->historyWithChangelog(null, 1, 'rev', $rp);
172             //print_r($cd);exit; 
173             
174             
175             if (!is_array($cd->ent->files) || !count($cd->ent->files)) {
176                 return $html;
177             }
178             
179             $num = count(array_keys($cd->ent->files));
180             $map = array(
181                 'D' => 'DELETED',
182                 'M' => 'MODIFIED',
183                 'A' => 'ADDED'
184             );
185             
186             $file_summary = array();
187             foreach($map as $k=>$v) {
188                 $summary[$v] = 0;
189             }
190             foreach ($cd->ent->files as $id => $file) {
191                
192                 
193                 $type = isset($map[$file->status])  ? $map[$file->status] : '??? '. $file->status;
194                 
195                 if ($num > 10) 
196                 {
197                     // will bork on unknown...
198                     $summary[$type]++;
199                     continue;
200                 }
201                 
202                 
203             $html .= '
204                 <div class="ticketevent ticketevent-fileitem">
205                     <span class="ticketevent-expand" id="ticketevent-expand-' . $this->cid . '.' . $id .'">+ ' . $type.'</span> 
206                     <span title="' . $fullrp . '?part=' . $id. '"  class="ticketevent-expand" id="ticketevent-expand-title-' . $this->cid . '.' . $id . '">' .
207                     $file->nameToHtml() . '
208                     </span>
209                     <span title="' . $fullrp . '?part=' . $id. '"  class="ticketevent-expand-diff changesetlink">[View Diff]</span> 
210                     <span title="' . $fullrp . '" class="ticketevent-expand-view changesetlink">[View File]</span>
211                     <span title="' . $fullrp . '" class="ticketevent-expand-view changesetlink">[View History]</span>
212                 </div>
213                 <div class="ticketchangeinfo" id="ticketchangeinfo-' . $this->cid . '.' . $id  . '"></div>
214         ';            
215                 
216                 
217                
218             }
219             
220             if ($num>  10) {
221                 $ar = array();
222                 foreach($summary as $k=>$v) {
223                     if (empty($v)) {
224                         continue;
225                     }
226                     $ar[] = $v . ' ' . $k;
227                 }
228                 $html .= '
229                 <div class="ticketevent ticketevent-fileitem">
230                     <span class="ticketevent-expand" id="ticketevent-expand-' . $this->cid . '.0">+ MULTIPLE FILES: </span>
231                     <span title="' . $fullrp . '?part=' . 0 . '"  class="ticketevent-expand" id="ticketevent-expand-title-' . $this->cid . '.' . $id . '">' .
232                     implode(', ', $ar) . '
233                     </span>
234                     <span title="' . $fullrp . '"  class="ticketevent-expand-diff changesetlink">[View Diff]</span> 
235                     <span title="' . $fullrp . '" class="ticketevent-expand-view changesetlink">[View File]</span>
236                     <span title="' . $fullrp . '" class="ticketevent-expand-view changesetlink">[View History]</span>
237                 </div>
238                 <div class="ticketchangeinfo" id="ticketchangeinfo-' . $this->cid . '"></div>
239         ';            
240                 
241             }
242             
243             //$html .= print_r($cd, true);
244              
245         }
246         
247          
248         return $html ;
249                 
250                 
251     }
252     
253     
254     function collapse_diff($diff)
255     {
256       static $idnum = 1;
257       require_once 'MTrackWeb/Changeset.php';
258       $cs = new MTrackWeb_Changeset();
259       $id = 'diff_' . $idnum++;
260       return "<br>" .
261         "<button onclick='\$(&quot;#$id&quot;).toggle(); return false;'>Toggle diff</button>".
262         "<div id='$id' style='display:none'>" .
263             $cs->diff($diff) . "</div>";
264     }
265     
266     function diff_strings($before, $now)
267     {
268          
269         $tempdir = sys_get_temp_dir();
270         $afile = tempnam($tempdir, "mtrack");
271         $bfile = tempnam($tempdir, "mtrack");
272         file_put_contents($afile, $before);
273         file_put_contents($bfile, $now);
274         static $diff = false;
275         if (!$diff) {
276             require_once 'System.php';
277             $diff= System::which('diff');
278         }
279         if (PHP_OS == 'SunOS') {
280             // TODO: make an option to allow use of gnu diff on solaris
281            $diff = shell_exec("$diff -u $afile $bfile");
282            $diff = str_replace($afile, 'before', $diff);
283            $diff = str_replace($bfile, 'now', $diff);
284          } else {
285             $diff = shell_exec("$diff --label before --label now -u $afile $bfile");
286          }
287         unlink($afile);
288         unlink($bfile);
289         $diff = htmlentities($diff, ENT_COMPAT, 'utf-8');
290         return $diff;
291     }
292      
293     
294       
295 }