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; } }