6 changed files with 181 additions and 0 deletions
@ -0,0 +1,6 @@ |
|||
<?php |
|||
require(dirname(__FILE__) . "/class.repository.php"); |
|||
require(dirname(__FILE__) . "/class.object.php"); |
|||
require(dirname(__FILE__) . "/class.commit.php"); |
|||
require(dirname(__FILE__) . "/class.actor.php"); |
|||
?> |
@ -0,0 +1,25 @@ |
|||
<?php |
|||
class GitActor |
|||
{ |
|||
public $timestamp = 0; |
|||
public $name = ""; |
|||
|
|||
function __construct($stamp) |
|||
{ |
|||
$parts = explode(" ", $stamp); |
|||
$parts_count = count($parts); |
|||
|
|||
$name_parts = array(); |
|||
|
|||
for($i = 0; $i < $parts_count - 2; $i++) |
|||
{ |
|||
$name_parts[] = $parts[$i]; |
|||
} |
|||
|
|||
$this->name = implode(" ", $name_parts); |
|||
$timestamp = $parts[$parts_count - 2] . " " . $parts[$parts_count - 1]; |
|||
|
|||
date_default_timezone_set("GMT"); |
|||
$this->timestamp = strtotime($parts[$parts_count - 1], $parts[$parts_count - 2]); |
|||
} |
|||
} |
@ -0,0 +1,59 @@ |
|||
<?php |
|||
class GitCommit extends GitObject |
|||
{ |
|||
public $tree = ""; |
|||
public $author = ""; |
|||
public $committer = ""; |
|||
public $message = ""; |
|||
public $parents = array(); |
|||
|
|||
function __construct($headerdata, $data) |
|||
{ |
|||
parent::__construct($headerdata, $data); |
|||
|
|||
$lines = explode("\n", $data); |
|||
$message_parts = array(); |
|||
$parsing_message = false; |
|||
|
|||
foreach($lines as $line) |
|||
{ |
|||
$line = trim($line); |
|||
|
|||
if(!empty($line)) |
|||
{ |
|||
$line = trim($line); |
|||
|
|||
if($parsing_message === false) |
|||
{ |
|||
list($key, $value) = explode(" ", $line, 2); |
|||
|
|||
switch($key) |
|||
{ |
|||
case "tree": |
|||
$this->tree = $value; |
|||
break; |
|||
case "parent": |
|||
$this->parents[] = $value; |
|||
break; |
|||
case "committer": |
|||
$this->committer = new GitActor($value); |
|||
break; |
|||
case "author": |
|||
$this->author = new GitActor($value); |
|||
break; |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
$message_parts[] = $line; |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
$parsing_message = true; |
|||
} |
|||
} |
|||
|
|||
$this->message = implode("\n", $message_parts); |
|||
} |
|||
} |
@ -0,0 +1,12 @@ |
|||
<?php |
|||
class GitObject |
|||
{ |
|||
public $rawdata = ""; |
|||
public $size = 0; |
|||
|
|||
function __construct($headerdata, $data) |
|||
{ |
|||
$this->size = (int)$headerdata; |
|||
$this->rawdata = $data; |
|||
} |
|||
} |
@ -0,0 +1,74 @@ |
|||
<?php |
|||
function pretty_dump($input) |
|||
{ |
|||
ob_start(); |
|||
|
|||
var_dump($input); |
|||
|
|||
$output = ob_get_contents(); |
|||
ob_end_clean(); |
|||
|
|||
while(preg_match("/^[ ]*[ ]/m", $output) == 1) |
|||
{ |
|||
$output = preg_replace("/^([ ]*)[ ]/m", "$1 ", $output); |
|||
} |
|||
|
|||
$output = nl2br($output); |
|||
|
|||
echo($output); |
|||
} |
|||
|
|||
|
|||
class GitRepository |
|||
{ |
|||
public $path = ""; |
|||
|
|||
function __construct($path) |
|||
{ |
|||
$this->path = $path; |
|||
} |
|||
|
|||
function GetObjectRaw($sha) |
|||
{ |
|||
return gzuncompress( |
|||
file_get_contents( |
|||
sprintf("{$this->path}/objects/%s/%s", |
|||
substr($sha, 0, 2), |
|||
substr($sha, 2) |
|||
))); |
|||
} |
|||
|
|||
function GetObject($sha) |
|||
{ |
|||
list($header, $data) = explode("\0", $this->GetObjectRaw($sha), 2); |
|||
|
|||
if(strpos($header, " ") !== false) |
|||
{ |
|||
list($type, $headerdata) = explode(" ", $header, 2); |
|||
} |
|||
else |
|||
{ |
|||
$type = $header; |
|||
$headerdata = ""; |
|||
} |
|||
|
|||
switch($type) |
|||
{ |
|||
case "commit": |
|||
return new GitCommit($headerdata, $data); |
|||
break; |
|||
case "blob": |
|||
return new GitBlob($headerdata, $data); |
|||
break; |
|||
case "tree": |
|||
return new GitTree($headerdata, $data); |
|||
break; |
|||
case "tag": |
|||
return new GitTag($headerdata, $data); |
|||
break; |
|||
default: |
|||
return new GitObject($headerdata, $data); |
|||
break; |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,5 @@ |
|||
<?php |
|||
require("libgit/base.php"); |
|||
|
|||
$s = new GitRepository("/home/occupy/testrepo.git"); |
|||
pretty_dump($s->GetObject("54e03e490b1bee1c154c3545bf258cab0629ee02")); |
Loading…
Reference in new issue