Add option to filter commits from feeds using a pattern
[gitphp.git] / include / git / log / Log.class.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<?php
/**
 * Class to represent a project log
 *
 * @author Christopher Han <xiphux@gmail.com>
 * @copyright Copyright (c) 2012 Christopher Han
 * @package GitPHP
 * @subpackage Git\Log
 */
class GitPHP_Log extends GitPHP_RevList
{
        /**
         * Data load strategy
         *
         * @var GitPHP_LogLoadStrategy_Interface
         */
        protected $strategy;
 
        /**
         * Constructor
         *
         * @param GitPHP_Project $project project
         * @param GitPHP_Commit $head head to walk back from
         * @param GitPHP_LogLoadStrategy_Interface $strategy log load strategy
         * @param int $limit limit of revisions to walk
         * @param int $skip number of revisions to skip
         */
        public function __construct($project, $head = null, GitPHP_LogLoadStrategy_Interface $strategy, $limit = 50, $skip = 0)
        {
                parent::__construct($project, $head, $limit, $skip);
 
                if (!$strategy)
                        throw new Exception('Log load strategy is required');
 
                $this->SetStrategy($strategy);
        }
 
        /**
         * Set data load strategy
         *
         * @param GitPHP_LogLoadStrategy_Interface $strategy load strategy
         */
        public function SetStrategy(GitPHP_LogLoadStrategy_Interface $strategy)
        {
                if (!$strategy)
                        return;
 
                $this->strategy = $strategy;
        }
 
        /**
         * Loads the data for this log
         */
        protected function LoadData()
        {
                $this->dataLoaded = true;
 
                if (empty($this->hash))
                        return;
 
                $this->hashList = $this->strategy->Load($this);
        }
 
        /**
         * Filters out commits older than a certain age
         *
         * @param int $age age in seconds
         * @param int $min minimum number of commits to retain
         */
        public function FilterOldCommits($age, $min = 0)
        {
                if (!$this->dataLoaded) {
                        $this->LoadData();
                }
 
                if (count($this->hashList) > $min) {
                        for ($i = $min; $i < count($this->hashList); ++$i) {
                                $commit = $this->project->GetCommit($this->hashList[$i]);
                                if ((time() - $commit->GetCommitterEpoch()) > $age) {
                                        $this->hashList = array_slice($this->hashList, 0, $i);
                                        break;
                                }
                        }
                }
 
        }
 
        /**
         * Filters out commits matching a certain pattern
         *
         * @param string $pattern pattern
         */
        public function FilterCommits($pattern)
        {
                if (empty($pattern))
                        return;
 
                if (!$this->dataLoad) {
                        $this->LoadData();
                }
 
                $filtered = false;
                foreach ($this->hashList as $i => $hash) {
                        $commit = $this->project->GetCommit($hash);
                        $comment = $commit->GetComment();
                        foreach ($comment as $commentline) {
                                if (preg_match($pattern, $commentline)) {
                                        unset($this->hashList[$i]);
                                        $filtered = true;
                                        break;
                                }
                        }
                }
 
                if ($filtered) {
                        $this->hashList = array_values($this->hashList);
                }
        }
}
 
comments