final move of files
[web.mtrack] / MTrackWeb / Timeline.php
1 <?php # vim:ts=2:sw=2:et:
2 /* For licensing and copyright terms, see the file named LICENSE */
3
4
5
6
7 require_once 'MTrack/Attachment.php';
8 require_once 'MTrackWeb.php';
9
10 class MTrackWeb_Timeline extends MTrackWeb
11 {
12         
13     var $template = 'wiki.html';
14     var $title = 'Timeline';
15     
16      var $start_time = '-2 weeks';
17     var $limit = 50;
18     // fixme = this should be alot more efficient...
19     
20     $events = mtrack_get_timeline('-2 weeks', $user, $limit);
21     
22     function getAuth()
23     {
24         parent::getAuth();
25         MTrackACL::requireAllRights('Timeline', 'read');
26     }
27     
28     
29     function get($only_users)
30     {
31         
32         if (is_string($this->start_time)) {
33            $date_limit = strtotime($this->start_time);
34         } else {
35            $date_limit = $this->start_time; // assume that it's a timestamp
36         }
37         /* round back to earlier minute (aids caching) */
38         $date_limit -= $date_limit % 60;
39         $db_date_limit = MTrackDB::unixtime($date_limit);
40         $last_date = null;
41         
42         $filter_users = null;
43         /*if (is_string($only_users)) { FIXME
44            $filter_users = array(mtrack_canon_username($only_users));
45         } else if (is_array($only_users)) { // will not happen....
46            $filter_users = array();
47            foreach ($only_users as $user) {
48                $filter_users[] = mtrack_canon_username($user);
49            }
50        } */
51     
52         $proj_by_id = array();
53         foreach (MTrackDB::q('select projid from projects')->fetchAll() as $r) {
54            $proj_by_id[$r[0]] = MTrackProject::loadById($r[0]);
55         }
56         $events = array();
57         
58         // check commits.
59         foreach (MTrackDB::q('select repoid from repos')->fetchAll() as $row) {
60             list($repoid) = $row;
61             $repo = MTrackRepo::loadById($repoid);
62             $reponame = $repo->getBrowseRootName();
63             if ($reponame == 'default/wiki') continue;
64             $checker = new MTrackCommitChecker($repo);
65     
66             $hist = $repo->history(null, $db_date_limit);
67             if (is_array($hist)) foreach ($hist as $e) {
68                 if (is_array($filter_users)) {
69                    $wanted_user = false;
70                    foreach ($filter_users as $fuser) {
71                        if (mtrack_canon_username($e->changeby) === $fuser) {
72                            $wanted_user = true;
73                            break;
74                        }
75                    }
76                    if (!$wanted_user) {
77                        continue;
78                    }
79                 }
80                 /* we want to include changesets that do not reference tickets */
81                 $pid = $repo->projectFromPath($e->files);
82                 if ($pid > 1) {
83                     $proj = $proj_by_id[$pid];
84                     $e->changelog = $proj->adjust_links($e->changelog, true);
85                 }
86                 $actions = $checker->parseCommitMessage($e->changelog);
87                 $tickets = array();
88                 foreach ($actions as $act) {
89                    $tkt = $act[1];
90                    $tickets[$tkt] = $tkt;
91                    $repo_changes_by_ticket[$tkt][$reponame][$e->rev] = $e->rev;
92                 }
93                 if (count($tickets) == 0) {
94                     $events[] = array(
95                            'changedate' => $e->ctime,
96                            'who' => $e->changeby,
97                            'object' => "changeset:$reponame:$e->rev",
98                            'reason' => $e->changelog,
99                            );
100                 }
101            }
102        }
103        // look in changes
104        foreach (MTrackDB::q("select 
105                changedate, who, object, reason from changes
106                where changedate > ?
107                order by changedate desc
108                ", $db_date_limit)->fetchAll(PDO::FETCH_ASSOC) as $row) {
109            if (is_array($filter_users)) {
110                $wanted_user = false;
111                foreach ($filter_users as $fuser) {
112                    if (mtrack_canon_username($row['who']) === $fuser) {
113                        $wanted_user = true;
114                        break;
115                    }
116                }
117                if (!$wanted_user) {
118                    continue;
119                }
120            }
121            $events[] = $row;
122         }
123     
124         usort($events, function ($a, $b) {
125                    return strcmp($b['changedate'], $a['changedate']);
126         });
127         $this->events = [];
128         $last_date  = false;
129         foreach($events as $e) {
130             $d = date_create($e['changedate'], new DateTimeZone('UTC'));
131             date_timezone_set($d, new DateTimeZone(date_default_timezone_get()));
132             $e['time'] = $d->format('H:i');
133             $day = $d->format('D, M d Y');
134             if ($last_date != $day) {
135                 $this->events[] = (object) array(
136                     'day' => $day,
137                     'isDay' => 1;
138                 );
139                   
140                 $last_date = $day;
141             }
142             
143             $this->events[] = (object)$e;
144             
145             
146         }
147          
148     
149     }
150     
151     function  is_repo_visible($reponame)
152     {
153         static $cache = array();
154         $me = MTrackAuth::whoami();
155         if (isset($cache[$me][$reponame])) {
156             return $cache[$me][$reponame];
157         }
158     
159         if (ctype_digit($reponame)) {
160             $oid = "repo:$reponame";
161         } else {
162             $repo = MTrackRepo::loadByName($reponame);
163             if ($repo) {
164                 $oid = "repo:$repo->repoid";
165             } else {
166                 $oid = null;
167             }
168         }
169         if ($oid) {
170             $ok = MTrackACL::hasAnyRights($oid, array(
171             'read', 'checkout'));
172         } else {
173             $ok = false;
174         }
175         $cache[$me][$reponame] = $ok;
176         return $ok;
177     }
178
179 }
180