| <?php␊ | 
| /* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */␊ | 
| /*␊ | 
| # ***** BEGIN LICENSE BLOCK *****␊ | 
| # This file is part of InDefero, an open source project management application.␊ | 
| # Copyright (C) 2008 Céondo Ltd and contributors.␊ | 
| #␊ | 
| # InDefero 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 2 of the License, or␊ | 
| # (at your option) any later version.␊ | 
| #␊ | 
| # InDefero 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, write to the Free Software␊ | 
| # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA␊ | 
| #␊ | 
| # ***** END LICENSE BLOCK ***** */␊ | 
| ␊ | 
| /**␊ | 
| * Git utils.␊ | 
| */␊ | 
| class IDF_Git␊ | 
| {␊ | 
| public $repo = '';␊ | 
| ␊ | 
| public function __construct($repo)␊ | 
| {␊ | 
| $this->repo = $repo;␊ | 
| }␊ | 
| ␊ | 
| /**␊ | 
| * Given a commit hash (or a branch) returns an array of files in␊ | 
| * it.␊ | 
| *␊ | 
| * A file is a class with the following properties:␊ | 
| *␊ | 
| * 'perm', 'type', 'size', 'hash', 'file'␊ | 
| *␊ | 
| * @param string Commit/Branch ('HEAD')␊ | 
| * @param string Base folder ('')␊ | 
| * @return array ␊ | 
| */␊ | 
| public function filesInTree($commit='HEAD', $basefolder='')␊ | 
| {␊ | 
| if (is_object($basefolder)) {␊ | 
| $base = $basefolder;␊ | 
| } else if ($basefolder != '' ␊ | 
| and ␊ | 
| (␊ | 
| (false === ($base=$this->getFileInfo($basefolder, $commit)))␊ | 
| or␊ | 
| ($base->type != 'tree')␊ | 
| )) {␊ | 
| throw new Exception(sprintf('Base folder "%s" not found.', $basefolder));␊ | 
| } else {␊ | 
| // no base␊ | 
| $base = (object) array('file' => '',␊ | 
| 'hash' => $commit);␊ | 
| }␊ | 
| ␊ | 
| $res = array();␊ | 
| $out = array();␊ | 
| $cmd = sprintf('GIT_DIR=%s git-ls-tree -t -l %s', $this->repo, $base->hash);␊ | 
| exec($cmd, &$out);␊ | 
| $current_dir = getcwd();␊ | 
| chdir(substr($this->repo, 0, -5));␊ | 
| foreach ($out as $line) {␊ | 
| list($perm, $type, $hash, $size, $file) = preg_split('/ |\t/', $line, 5, PREG_SPLIT_NO_EMPTY);␊ | 
| $cm = array();␊ | 
| $cmd = sprintf('GIT_DIR=%s git log -1 --pretty=format:\'%%H %%at %%s\' %s -- %s', $this->repo, $commit, ($base->file) ? $base->file.'/'.$file : $file);␊ | 
| exec($cmd, &$cm);␊ | 
| list($h, $time, $log) = explode(' ', $cm[0], 3);␊ | 
| $res[] = (object) array('perm' => $perm, 'type' => $type, ␊ | 
| 'size' => $size, 'hash' => $hash, ␊ | 
| 'fullpath' => ($base->file) ? $base->file.'/'.$file : $file,␊ | 
| 'log' => $log, 'time' => $time,␊ | 
| 'file' => $file);␊ | 
| }␊ | 
| chdir($current_dir);␊ | 
| return $res;␊ | 
| }␊ | 
| ␊ | 
| /**␊ | 
| * Get the file info.␊ | 
| *␊ | 
| * @param string Tree to test␊ | 
| * @param string Commit/Branch ('HEAD')␊ | 
| * @return false or Tree information␊ | 
| */␊ | 
| public function getFileInfo($totest, $commit='HEAD')␊ | 
| {␊ | 
| $cmd_tmpl = 'GIT_DIR=%s git-ls-tree -r -t -l %s';␊ | 
| $cmd = sprintf($cmd_tmpl, $this->repo, $commit);␊ | 
| $out = array();␊ | 
| exec($cmd, &$out);␊ | 
| foreach ($out as $line) {␊ | 
| list($perm, $type, $hash, $size, $file) = preg_split('/ |\t/', $line, 5, PREG_SPLIT_NO_EMPTY);␊ | 
| if ($totest == $file) {␊ | 
| return (object) array('perm' => $perm, 'type' => $type, ␊ | 
| 'size' => $size, 'hash' => $hash, ␊ | 
| 'file' => $file);␊ | 
| }␊ | 
| }␊ | 
| return false;␊ | 
| }␊ | 
| ␊ | 
| /**␊ | 
| * Get a blob.␊ | 
| *␊ | 
| * @param string Blob hash␊ | 
| * @return string Raw blob␊ | 
| */␊ | 
| public function getBlob($hash)␊ | 
| {␊ | 
| return shell_exec(sprintf('GIT_DIR=%s git-cat-file blob %s',␊ | 
| $this->repo, $hash));␊ | 
| }␊ | 
| ␊ | 
| /**␊ | 
| * Get the branches.␊ | 
| */␊ | 
| public function getBranches()␊ | 
| {␊ | 
| $out = array();␊ | 
| exec(sprintf('GIT_DIR=%s git branch', $this->repo), &$out);␊ | 
| $res = array();␊ | 
| foreach ($out as $b) {␊ | 
| $res[] = substr($b, 2);␊ | 
| }␊ | 
| return $res;␊ | 
| }␊ | 
| } |