1 <?php
2 /**
3  * Gitblame report for PHP_CodeSniffer.
4  *
5  * PHP version 5
6  *
7  * @category  PHP
8  * @package   PHP_CodeSniffer
9  * @author    Ben Selby <benmatselby@gmail.com>
10  * @copyright 2009-2014 SQLI <www.sqli.com>
11  * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600)
12  * @license   https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
13  * @link      http://pear.php.net/package/PHP_CodeSniffer
14  */
15 
16 /**
17  * Gitblame report for PHP_CodeSniffer.
18  *
19  * PHP version 5
20  *
21  * @category  PHP
22  * @package   PHP_CodeSniffer
23  * @author    Ben Selby <benmatselby@gmail.com>
24  * @copyright 2009-2014 SQLI <www.sqli.com>
25  * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600)
26  * @license   https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
27  * @version   Release: 1.2.2
28  * @link      http://pear.php.net/package/PHP_CodeSniffer
29  */
30 class PHP_CodeSniffer_Reports_Gitblame extends PHP_CodeSniffer_Reports_VersionControl
31 {
32 
33     /**
34      * The name of the report we want in the output
35      *
36      * @var string
37      */
38     protected $reportName = 'GIT';
39 
40 
41     /**
42      * Extract the author from a blame line.
43      *
44      * @param string $line Line to parse.
45      *
46      * @return mixed string or false if impossible to recover.
47      */
48     protected function getAuthor($line)
49     {
50         $blameParts = array();
51         $line       = preg_replace('|\s+|', ' ', $line);
52         preg_match(
53             '|\(.+[0-9]{4}-[0-9]{2}-[0-9]{2}\s+[0-9]+\)|',
54             $line,
55             $blameParts
56         );
57 
58         if (isset($blameParts[0]) === false) {
59             return false;
60         }
61 
62         $parts = explode(' ', $blameParts[0]);
63 
64         if (count($parts) < 2) {
65             return false;
66         }
67 
68         $parts  = array_slice($parts, 0, (count($parts) - 2));
69         $author = preg_replace('|\(|', '', implode($parts, ' '));
70         return $author;
71 
72     }//end getAuthor()
73 
74 
75     /**
76      * Gets the blame output.
77      *
78      * @param string $filename File to blame.
79      *
80      * @return array
81      */
82     protected function getBlameContent($filename)
83     {
84         $cwd = getcwd();
85 
86         chdir(dirname($filename));
87         $command = 'git blame --date=short "'.$filename.'" 2>&1';
88         $handle  = popen($command, 'r');
89         if ($handle === false) {
90             echo 'ERROR: Could not execute "'.$command.'"'.PHP_EOL.PHP_EOL;
91             exit(2);
92         }
93 
94         $rawContent = stream_get_contents($handle);
95         fclose($handle);
96 
97         $blames = explode("\n", $rawContent);
98         chdir($cwd);
99 
100         return $blames;
101 
102     }//end getBlameContent()
103 
104 
105 }//end class
106