xaizek / rocketgit (License: AGPLv3+) (since 2018-12-09)
Light and fast Git hosting solution suitable to serve both as a hub or as a personal code storage with its tickets, pull requests, API and much more.
<root> / tests / repo.php (c5880f9395b05a5903c055829a24c9992cabd539) (5,246B) (mode 100644) [raw]
<?php
error_reporting(E_ALL | E_STRICT);
ini_set("track_errors", "On");

$INC = "../inc";
require_once($INC . "/init.inc.php");
require_once($INC . "/repo.inc.php");
require_once($INC . "/sql.inc.php");
require_once($INC . "/struct.inc.php");

rg_log_set_file("repo.log");

$rg_sql_debug = 1;

// defaults
$rg_repo_max_len = 100;
$rg_repos = "/base";


rg_log("name2base1");
$rr = array("prefix" => "/user", "user" => "user1", "repo" => "junk");
$e = "/base/users/u/s/user1/repos/";
$c = rg_repo_name2base($rr);
if (strcmp($c, $e) != 0) {
	rg_log("name2base1 is not working correctly: c=$c e=$e.");
	exit(1);
}

rg_log("name2base2");
$rr = array("prefix" => "", "user" => "u", "repo" => "junk");
$e = "/base/orgs/u/_/u/repos/";
$c = rg_repo_name2base($rr);
if (strcmp($c, $e) != 0) {
	rg_log("name2base2 is not working correctly: c=$c e=$e.");
	exit(1);
}

rg_log("test if repo_allow works correctly (0)");
$rg_repo_allow = '/^[A-Za-z0-9]*$/';
$v = "xx";
$c = rg_repo_ok($v);
if ($c !== TRUE) {
	rg_log("repo_allow problem for valid repo [$v] (c=$c).");
	exit(1);
}

rg_log("test if repo_allow works correctly (1)");
$rg_repo_allow = '/^[A-Za-z0-9]*$/';
$v = "eyhtmcmet_";
$c = rg_repo_ok($v);
if ($c !== FALSE) {
	rg_log("repo_allow problem for '_' in [$v] (c=$c).");
	exit(1);
}

rg_log("test if repo_allow works correctly (2)");
$rg_repo_allow = '/^[A-Za-z0-9_.-]*$/';
$v = ".e&y.h-tmcmet&_.-";
$c = rg_repo_ok($v);
if ($c !== FALSE) {
	rg_log("repo_allow problem for '&'.");
	exit(1);
}

rg_log("check if we allow '..'");
$rg_repo_allow = '/^[A-Za-z0-9_.-]*$/';
$v = "a..b";
$c = rg_repo_ok($v);
if ($c !== FALSE) {
	rg_log("repo_allow problem for '..'.");
	exit(1);
}

rg_log("check len test");
$v = "0123456789A";
$rg_repo_allow = '/^[A-Za-z0-9]*$/';
$rg_repo_max_len = 10;
$c = rg_repo_ok($v);
if ($c !== FALSE) {
	rg_log("repo_ok: max length is not enforced!");
	exit(1);
}

$db = rg_sql_open("dbname=trg");
if ($db === FALSE) {
	rg_log("Cannot create a database (" . rg_sql_error() . ")!");
	exit(1);
}

$r = rg_sql_struct_update($db, RG_DROP_TABLES|RG_IGNORE_ERRORS);
if ($r !== TRUE) {
	rg_log("Cannot create struct (" . rg_sql_error() . ")!");
	exit(1);
}

$uid = time();
rg_log("Inserting a fake user");
$sql = "INSERT INTO users (uid, username, realname, salt, pass, email, itime, suspended"
	. ", rights)"
	. " VALUES ($uid, 'user-$uid', 'realname-$uid', '', '', '', $uid, 0"
	. ", '')";
$res = rg_sql_query($db, $sql);
if ($res === FALSE) {
	rg_log("Cannot insert a user (" . rg_sql_error() . ")!");
	exit(1);
}

$repo_id = time();
$repo_name = "repo-" . $repo_id;
rg_log("Inserting a fake repo");
$sql = "INSERT INTO repos (repo_id, name, uid, itime"
	. ", disk_quota_mb, max_commit_size"
	. ", master, description, git_dir_done, default_rights)"
	. " VALUES ($repo_id, '$repo_name', $uid, 0, 0, 0, 0, 'bla bla desc', 1, 'F')";
$res = rg_sql_query($db, $sql);
if ($res === FALSE) {
	rg_log("Cannot insert a repo (" . rg_sql_error() . ")!");
	exit(1);
}

rg_log("test giving rights");
$rr = array("repo_id" => $repo_id);
$ri = rg_repo_info($db, $rr);
if ($ri['exists'] != 1) {
	rg_log("ri: " . print_r($ri, TRUE));
	rg_log("Cannot lookup repo_id $repo_id!");
	exit(1);
}
$tuid = 10;
$v = rg_repo_rights_set($db, $ri, $tuid, "P");
if ($v === FALSE) {
	rg_log("Cannot give rights (1)!");
	exit(1);
}

rg_log("owner gets all rights");
$e = rg_rights_all("repo");
$r = rg_repo_rights_get($db, $ri, $uid, 0);
$c = $r['rights'];
if (strcmp($c, $e) != 0) {
	rg_log("Owner did not get all rights: c=$c e=$e.");
	exit(1);
}

rg_log("non-owner gets correct rights: F gets from default rights.");
$xuid = 12;
$r = rg_repo_rights_set($db, $ri, $xuid, "P");
if ($r !== TRUE) {
	rg_log("Cannot set rights (" . rg_repo_error() . ")!");
	exit(1);
}
$e = "FP";
$r = rg_repo_rights_get($db, $ri, $xuid, 0);
$c = $r['rights'];
if (strcmp($c, $e) != 0) {
	rg_log("Non-owner did not get correct rights: c=$c e=$e.");
	exit(1);
}

rg_log("owner can set separate rights for him");
$v = rg_repo_rights_set($db, $ri, $uid, "A");
if ($v === FALSE) {
	rg_log("Owner cannot set separate rights for him!");
	exit(1);
}

rg_log("list1");
$r = rg_repo_rights_load($db, $ri);
if ($r === FALSE) {
	rg_log("Cannot list rights (" . rg_repo_error() . ")");
	exit(1);
}
// TODO: we should test if expected fields are returned!

rg_log("disk1");
$ri['disk_quota_mb'] = 10;
$ri['disk_used_mb'] = 20;
$r = rg_repo_over_limit($ri);
if ($r !== TRUE) {
	rg_log("Over limit is wrong (1)!");
	exit(1);
}

rg_log("disk2");
$ri['disk_quota_mb'] = 20;
$ri['disk_used_mb'] = 10;
$r = rg_repo_over_limit($ri);
if ($r !== FALSE) {
	rg_log("Over limit is wrong (2)!");
	exit(1);
}


// test stats
$rg_state_dir = "repos";
$a = array(
	"itime" => time(),
	"ip" => "IPIPIPIPIPIP1",
	"repo_id" => 3000,
	"old_rev" => "abcdef",
	"new_rev" => "434343",
	"refname" => "refs/heads/xxx");
$f = rg_repo_stats_push2file($a);
if ($f === FALSE) {
	echo "push2file returned FALSE!\n";
	exit(1);
}
$r = unserialize(file_get_contents($rg_state_dir . "/qstats/$f"));
if ($r === FALSE) {
	echo "Cannot get file or unserialize!\n";
	exit(1);
}
if ($r['repo_id'] != 3000) {
	print_r($r);
	echo "rg_repo_stats_push2file is not working right!\n";
	exit(1);
}

rg_sql_close($db);

echo "repo: OK!\n";
?>
Hints

Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://code.reversed.top/user/xaizek/rocketgit

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@code.reversed.top/user/xaizek/rocketgit

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a pull request:
... clone the repository ...
... make some changes and some commits ...
git push origin master