*/ class git { protected $repo; /** * Constructs a new instance of git class. * * @param string $repo */ public function __construct ($repo) { $this->repo = $repo; } /* * parse all commits from repo * * @param integer $count * @param string $branch * @return array */ public function get_commits ($count = -1, $branch = "master") { $data = array(); if (!$data) { $cmd = "git --git-dir=".$this->repo." rev-list --header --max-count=".$count." ".$branch." "; $rev_list = shell_exec($cmd); foreach(explode("\000", $rev_list) as $rev) { $commit = array(); $rev_lines = explode("\n", str_replace("\r", "", $rev)); $commit['id'] = $rev_lines[0]; foreach($rev_lines as $rev_line) { if (substr($rev_line, 0, 4) == " ") { if (isset($commit['text'])) { $commit['text'] .= "\n".substr($rev_line, 4); } else { $commit['text'] = substr($rev_line, 4); } } else { $opt = explode(" ", $rev_line, 2); if ($opt[0] == "tree") { $commit['tree'] = $opt[1]; } else if ($opt[0] == "parent") { $commit['parent'][] = $opt[1]; } else if ($opt[0] == "author") { preg_match('/(.*) <([^>]*)> ([0-9]*) ([+\-0-9]{5})/i', $opt[1], $matches); $commit['author'] = $matches[1]; $commit['author_mail'] = $matches[2]; $commit['author_time'] = $matches[3]; $commit['author_timezone'] = $matches[4]; } else if ($opt[0] == "committer") { preg_match('/(.*) <([^>]*)> ([0-9]*) ([+\-0-9]{5})/i', $opt[1], $matches); $commit['committer'] = $matches[1]; $commit['committer_mail'] = $matches[2]; $commit['committer_time'] = $matches[3]; $commit['committer_timezone'] = $matches[4]; } } } $data[] = $commit; } } return $data; } /* * get latest commit hash * * @param string $branch * @raturn string */ public function get_hash ($branch = "master") { $hash = shell_exec('git --git-dir='.$this->repo.' rev-list -n 1 --pretty="format:%h" --header '.$branch.' | grep "^[0-9a-f]*$"'); $hash = str_replace("\r","",str_replace("\n","",$hash)); return $hash; } /* * get commit count * * @param string $branch * @raturn integer */ public function get_count ($branch = "master") { $count = shell_exec('git --git-dir='.$this->repo.' rev-list --oneline --first-parent --header '.$branch.' | wc -l | sed "s/[ \t]//g"'); $count = str_replace("\r","",str_replace("\n","",$count)); return $count; } /* * get commit version * * @param string $branch * @raturn string */ public function get_version ($branch = "master") { return "git-".$this->get_count($this->repo, $branch)."-".$this->get_hash($repo, $branch); } /* * get commit age * * @param string $last_change * @raturn string */ public function get_age ($last_change) { $now = time(); $age = ($last_change > 0 ? ($now - $last_change) : 0); if ($age > 60*60*24*365*2) { $age_str = floor($age/60/60/24/365); $age_str .= " years ago"; } else if ($age > 60*60*24*(365/12)*2) { $age_str = floor($age/60/60/24/(365/12)); $age_str .= " months ago"; } else if ($age > 60*60*24*7*2) { $age_str = floor($age/60/60/24/7); $age_str .= " weeks ago"; } else if ($age > 60*60*24*2) { $age_str = floor($age/60/60/24); $age_str .= " days ago"; } else if ($age > 60*60*2) { $age_str = floor($age/60/60); $age_str .= " hours ago"; } else if ($age > 60*2) { $age_str = floor($age/60); $age_str .= " min ago"; } else if ($age > 2) { $age_str = $age; $age_str .= " sec ago"; } else if ($age >= 0) { $age_str = "right now"; } else { $age_str = "right now"; } return $age_str; } /* * get css class from age * * @param string $last_change * @return string */ public function get_age_class ($last_change) { $now = time(); $age = ($last_change > 0 ? ($now - $last_change) : 0); if ($age == 0) { $age_class = "noage"; } else if ($age < 60*60*2) { $age_class = "age0"; } else if ($age < 60*60*24*2) { $age_class = "age1"; } else { $age_class = "age2"; } return $age_class; } /* * pull current repo */ public function pull () { shell_exec("git --git-dir=".$this->repo." pull"); } /* * clone repo */ public function clone () { shell_exec("git clone --bare ".$this->repo); } } ?>