<?php 
/** 
 *  PHP Git 
 * 
 *  Pure-PHP class to read GIT repositories. It allows to 
 *  perform read-only operations such as get commit history 
 *  get files, get branches, and so forth. 
 * 
 *  PHP version 5 
 * 
 *  @category VersionControl 
 *  @package  PHP-Git 
 *  @author   César D. Rodas <[email protected]> 
 *  @license  http://www.php.net/license/3_01.txt  PHP License 3.01 
 *  @link     http://cesar.la/git 
 */ 
 
 
/** 
 *  __autoload 
 * 
 *  @param string $path Class to load 
 * 
 *  @return nothing 
 */ 
function __autoload($path) 
{ 
    $path = strtolower($path); 
    if (substr($path, 0, 3) == "git") { 
        require_once "{$path}.php"; 
    } 
} 
 
/** 
 *  Git Class 
 * 
 *  @category VersionControl 
 *  @package  PHP-Git 
 *  @author   César D. Rodas <[email protected]> 
 *  @license  http://www.php.net/license/3_01.txt  PHP License 3.01 
 *  @link     http://cesar.la/git 
 */ 
class Git extends GitBase 
{ 
    private $_cache; 
 
    // {{{ __construct  
    /** 
     *  Class constructor 
     * 
     *  @param string $path Git path repo. 
     * 
     *  @return null 
     */ 
    final function __construct($path='') 
    { 
        if ($path=='') { 
            return; 
        } 
        $this->setRepo($path); 
    } 
    // }}} 
 
    // {{{ getBranches 
    /** 
     *  Returns all the branches 
     * 
     *  @return Array list of branches 
     */ 
    function getBranches() 
    { 
        return array_keys($this->branch); 
    } 
    // }}} 
 
    // {{{ getHistory 
    /** 
     *  Returns all commit history on a given branch. 
     * 
     *  @param string $branch Branch name 
     *  @param int    $limit  History limitation 
     * 
     *  @return mixed Array with commits history or exception 
     */ 
    function getHistory($branch,$limit=10) 
    { 
        if ($this->branch[$branch] === false) { 
            $this->throwException("$branch is not a valid branch"); 
        } 
        
        $object_id = $this->branch[$branch]; 
        $history   = array(); 
        $e         = 0; 
        do {    
            $commit = $this->getObject($object_id, $type); 
            if ($commit == false || $type != OBJ_COMMIT) { 
                $this->throwException("Unexpected datatype"); 
            } 
            $commit["id"] = $object_id;  
            $history[]    = $commit; 
            if (!isset($commit["parent"]) || ++$e == $limit) { 
                break; 
            } 
            $object_id = $commit["parent"]; 
        } while (1); 
        return $history; 
    }     
    // }}}  
 
    // {{{ getTags 
    /** 
     *  Get Tags 
     * 
     *  Returns the avaliable tags on a git repo. 
     * 
     *  @return array All tags avaliable 
     */ 
    function getTags() 
    { 
        $tags = $this->getRefInfo('tags'); 
        if (count($tags) == 0) { 
            return array(); 
        } 
        return array_combine(array_values($tags), 
                array_keys($tags)); 
             
    } 
    // }}} 
 
    // {{{ getCommit 
    /** 
     *  Get commit list of files. 
     * 
     *  @param string $id Commit Id. 
     * 
     *  @return mixed Array with commit's files or an exception 
     */ 
    function getCommit($id) 
    { 
        $obj = $this->getObject($id, $type); 
        if ($obj === false || $type != OBJ_COMMIT) { 
            $this->throwException("$id is not a valid commit"); 
        } 
        $obj['Tree'] = $this->getObject($obj['tree']); 
        return $obj; 
    } 
    // }}} 
 
    //{{{ getTag 
    /**  
     *  Get information about a tag. 
     * 
     *  @param string $id Tag commit id. 
     * 
     *  @return object Object. 
     */ 
    function getTag($id) 
    { 
        $obj = $this->getObject($id, $type); 
        if ($obj === false) { 
            $this->throwException("There is not object $id"); 
        } 
        switch ($type) { 
        case OBJ_TAG: 
            break; 
        case OBJ_COMMIT: 
            /* A tag can be a commit, so simulate it */ 
            $nobj = array( 
                "object"  => $id, 
                "type"    => "commit", 
                "tag"     => "", 
                "tagger"  => $obj["committer"], 
                "comment" => $obj["comment"], 
                "Tree"    => $this->getObject($obj['tree']) 
            ); 
            $obj  = $nobj; 
            break; 
        default: 
            $this->throwException("Unexpected ($type) object type."); 
        } 
        return $obj; 
    } 
    //}}} 
 
    // {{{ getFile 
    /** 
     *  Returns a parsed object from the repo. 
     * 
     *  @param string $id    Sha1 object id. 
     *  @param int    &$type Object type 
     * 
     *  @return mixed file content or an exception   
     */ 
    function getFile($id,&$type=null) 
    { 
        $obj = $this->getObject($id, $type); 
        return $obj; 
        if ($obj === false) { 
            if ( sha1("blob 0".chr(0)) == $id) { 
                return ""; 
            } 
            $this->throwException("Object $id doesn't exists"); 
        } 
        switch ($type) { 
        case OBJ_TREE: 
            $obj = $this->parseTreeObject($obj); 
            break; 
        case OBJ_COMMIT: 
            $obj = $this->parseCommitObject($id); 
            break; 
        } 
        return $obj; 
    } 
    // }}}  
 
    // {{{ getCommitDiff 
    /** 
     *  Get a diff form the $id commit and the 
     *  previous commit. 
     * 
     *  @param string $id Commit id. 
     * 
     *  @return array Array with changes 
     */ 
    function getCommitDiff($id) 
    { 
        $tree  = $this->getCommit($id);  
        $tree1 = $this->getCommit($tree["parent"]); 
 
        return $this->getTreeDiff($tree['tree'], $tree1['tree']); 
    }  
    // }}} 
 
} 
 
/* 
 * Local variables: 
 * tab-width: 4 
 * c-basic-offset: 4 
 * End: 
 * vim600: sw=4 ts=4 fdm=marker 
 * vim<600: sw=4 ts=4 
 */ 
 
?> 
 
 |