搜索
首页php教程php手册最近都在使用 Git@OSC 代码托管,分享一个php写的获取git仓库信

这个类可以获取信息的一个Git仓库。 它使用的Git客户端程序查询库来获得某些类型的统计信息。 目前,它可以得到所有提交给定的分支,得到的最新提交的哈希,一个给定的分支的数量提交并获得一个给定的分支版本。 PHP 源码与演示: 源码出处演示出处 ?phprequi

这个类可以获取信息的一个Git仓库。

它使用的Git客户端程序查询库来获得某些类型的统计信息。

目前,它可以得到所有提交给定的分支,得到的最新提交的哈希,一个给定的分支的数量提交并获得一个给定的分支版本。 PHP

源码与演示:源码出处 演示出处

最近都在使用 Git@OSC 代码托管,分享一个php写的获取git仓库信
<?php
require_once("git.class.php");
$repo_path = "/home/git/repositories/";
$git = new git;
$repos = $git->get_repos("/home/git/projects.list");
if(isset($_GET['git']) && in_array($_GET['git'], $repos) && file_exists($repo_path.$_GET['git']."/refs/heads/master")) {
	if(isset($_GET['header']) && !empty($_GET['header']) && file_exists($repo_path.$_GET['git']."/refs/heads/".$_GET['header'])) {
		$header=$_GET['header'];
	} else {
		$header="master";
	}
	echo $git->get_version($repo_path.$_GET['git'], $header);
} else {
	echo "404 Not Found - No such project";
}

?>
<?php

class git {
	/**
	 * parse all commits from repo
	 *
	 * @param	string	$repo
	 * @param	int		$count
	 * @param	string	$branch
	 * @return	array
	 */
	public function get_commits ($repo, $count = -1, $branch = "master") {
		$data = array();
		if(!$data) {
			$cmd = "git --git-dir=".$repo." rev-list --header --max-count=".$count." ".$branch." ";
			$rev_list = shell_exec($cmd);
			foreach(explode("\000", $rev_list) as $rev) {
				$commit = array();
				$rev_lines = explode("\n", str_replace("\r", "", $rev));
				$commit['id'] = $rev_lines[0];
				foreach($rev_lines as $rev_line) {
					if(substr($rev_line, 0, 4) == "    ") {
						if(isset($commit['text'])) {
							$commit['text'] .= "\n".substr($rev_line, 4);
						} else
							$commit['text'] = substr($rev_line, 4);
					} else {
						$opt = explode(" ", $rev_line);
						if($opt[0] == "tree") {
							$commit['tree'] = $opt[1];
						} else if($opt[0] == "parent") {
							$commit['parent'][] = $opt[1];
						} else if($opt[0] == "author") {
							$commit['author'] = $opt[1];
							$commit['author_mail'] = $opt[2];
							$commit['author_time'] = $opt[3];
						} else if($opt[0] == "committer") {
							$commit['committer'] = $opt[1];
							$commit['committer_mail'] = $opt[2];
							$commit['committer_time'] = $this->get_age($opt[3]);
						}
					}
				}
				$data[] = $commit;
			}
		}
		return $data;
	}
	
	/**
	 * get latest commit hash
	 *
	 * @param	string	$repo
	 * @param	string	$branch
	 * @raturn	string
	 */
	public function get_hash ($repo, $branch = "master") {
		$hash = shell_exec('git --git-dir='.$repo.' rev-list -n 1 --pretty="format:%h" --header '.$branch.' | grep "^[0-9a-f]*$"');
		$hash = str_replace("\r","",str_replace("\n","",$hash));
		return $hash;
	}
	
	/**
	 * get commit count
	 *
	 * @param	string	$repo
	 * @param	string	$branch
	 * @raturn	string
	 */
	public function get_count ($repo, $branch = "master") {
		$count = shell_exec('git --git-dir='.$repo.' rev-list --oneline --first-parent --header '.$branch.' | wc -l | sed "s/[ \t]//g"');
		$count = str_replace("\r","",str_replace("\n","",$count));
		return $count;
	}
	
	/**
	 * get commit version
	 *
	 * @param	string	$repo
	 * @param	string	$branch
	 * @raturn	string
	 */
	public function get_version ($repo, $branch = "master") {
		return "git-".$this->get_count($repo, $branch)."-".$this->get_hash($repo, $branch);
	}
	
	/**
	 * get commit age
	 *
	 * @param	string	$age
	 * @raturn	string
	 */
	public function get_age($age) {
		$age= time() - $age;
		if ($age > 60*60*24*365*2) {
			$age_str = floor($age/60/60/24/365);
			$age_str .= " years ago";
		} else if ($age > 60*60*24*(365/12)*2) {
			$age_str = floor($age/60/60/24/(365/12));
			$age_str .= " months ago";
		} else if ($age > 60*60*24*7*2) {
			$age_str = floor($age/60/60/24/7);
			$age_str .= " weeks ago";
		} else if ($age > 60*60*24*2) {
			$age_str = floor($age/60/60/24);
			$age_str .= " days ago";
		} else if ($age > 60*60*2) {
			$age_str = floor($age/60/60);
			$age_str .= " hours ago";
		} else if ($age > 60*2) {
			$age_str = floor($age/60);
			$age_str .= " min ago";
		} else if ($age > 2) {
			$age_str = $age;
			$age_str .= " sec ago";
		} else {
			$age_str = "right now";
		}
		return $age_str;
	}
	
	/**
	 * get repo list from projects.list file
	 *
	 * @param	string	$path
	 * @raturn	array
	 */
	public function get_repos ($path) {
		$repo_list = file_get_contents($path);
		$repo_list = explode("\n", $repo_list);
		$data = array();
		foreach($repo_list as $id => $repo) {
			$test = explode(" ",$repo);
			$data[] = $test[0];
		}
		return $data;
	}
}
//end FROM http:www.codepearl.com
?>
声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能