Login   Register  
PHP Classes
elePHPant
Icontem

File: phpgit/git.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Cesar D. Rodas  >  PHP Git  >  phpgit/git.php  >  Download  
File: phpgit/git.php
Role: Class source
Content type: text/plain
Description: Main class
Class: PHP Git
Retrieve project files from GIT repositories
Author: By
Last change: - Upgrading to the last version
Date: 2009-04-20 22:11
Size: 5,705 bytes
 

Contents

Class file image Download
<?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 <crodas@member.fsf.org>
 *  @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($path03) == "git") {
        require_once 
"{$path}.php";
    }
}

/**
 *  Git Class
 *
 *  @category VersionControl
 *  @package  PHP-Git
 *  @author   César D. Rodas <crodas@member.fsf.org>
 *  @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
 */

?>