--- /dev/null
+<?php
+/* git.class.php
+ * Copyright (C) 2013 Jan Altensen (Stricted)
+ * http://stricted.de/
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+class git {
+ /**
+ * parse all commits from repo
+ *
+ * @param string $repo
+ * @param int $count
+ * @param string $branch
+ * @return array
+ */
+ public function get_commits ($repo, $count = -1, $branch = "master") {
+ $data = array();
+ if(!$data) {
+ $cmd = "git --git-dir=".$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);
+ if($opt[0] == "tree") {
+ $commit['tree'] = $opt[1];
+ } else if($opt[0] == "parent") {
+ $commit['parent'][] = $opt[1];
+ } else if($opt[0] == "author") {
+ $commit['author'] = $opt[1];
+ $commit['author_mail'] = $opt[2];
+ $commit['author_time'] = $opt[3];
+ } else if($opt[0] == "committer") {
+ $commit['committer'] = $opt[1];
+ $commit['committer_mail'] = $opt[2];
+ $commit['committer_time'] = $this->get_age($opt[3]);
+ }
+ }
+ }
+ $data[] = $commit;
+ }
+ }
+ return $data;
+ }
+
+ /**
+ * get latest commit hash
+ *
+ * @param string $repo
+ * @param string $branch
+ * @raturn string
+ */
+ public function get_hash ($repo, $branch = "master") {
+ $hash = shell_exec('git --git-dir='.$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 $repo
+ * @param string $branch
+ * @raturn string
+ */
+ public function get_count ($repo, $branch = "master") {
+ $count = shell_exec('git --git-dir='.$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 $repo
+ * @param string $branch
+ * @raturn string
+ */
+ public function get_version ($repo, $branch = "master") {
+ return "git-".$this->get_count($repo, $branch)."-".$this->get_hash($repo, $branch);
+ }
+
+ /**
+ * get commit age
+ *
+ * @param string $age
+ * @raturn string
+ */
+ public function get_age($age) {
+ $age= time() - $age;
+ 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 {
+ $age_str = "right now";
+ }
+ return $age_str;
+ }
+
+ /**
+ * get repo list from projects.list file
+ *
+ * @param string $path
+ * @raturn array
+ */
+ public function get_repos ($path) {
+ $repo_list = file_get_contents($path);
+ $repo_list = explode("\n", $repo_list);
+ $data = array();
+ foreach($repo_list as $id => $repo) {
+ $test = explode(" ",$repo);
+ $data[] = $test[0];
+ }
+ return $data;
+ }
+}
+?>
\ No newline at end of file