register_action('addrepo');
$this->register_hook('header');
$this->register_hook('page_start');
$this->register_hook('summary');
}
}
function action($action) {
if ($action === 'addrepo') {
global $page;
global $conf;
if (isset($_POST['repo_name']) && isset($_POST['repo_desc']) && isset($_POST['repo_pwd'])) {
$create=True;
$name=rtrim($_POST['repo_name']);
if (!$this -> validate_repo_name($name)) {
$this -> add_display_message('Invalid name of repository. Must only contain letters, numbers or caraters "_" or "-". ',True);
$create=False;
}
$desc=rtrim($_POST['repo_desc']);
if (empty($desc)) {
$this -> add_display_message('Repository description is required.',True);
$create=False;
}
if (!isset($conf['addrepo']['password']) || empty($conf['addrepo']['password'])) {
$this -> add_display_message('Password not defined in configuration. Creation disable.',True);
$create=False;
}
else {
$pwd=rtrim($_POST['repo_pwd']);
if ($pwd!=$conf['addrepo']['password']) {
$this -> add_display_message('Password incorrect',True);
$create=False;
}
}
if ($create && $this -> create_repo($name,$desc)) {
$this -> add_display_message("Repository $name successfully created !
To access to your new repository, click here.");
}
else {
$page['addrepo']['values']['name']=$name;
$page['addrepo']['values']['desc']=$desc;
}
}
$this->display_plugin_template('addrepo');
}
}
function hook($type) {
if ($type == 'header') {
echo "\t\n";
}
elseif ($type == 'page_start') {
$this->display_plugin_template('start',False);
}
elseif ($type == 'summary') {
global $page;
global $conf;
$infos=get_project_info($page['project']);
if (empty($infos['head_hash'])) {
if (isset($conf['addrepo']['url_format'])) {
$page['addrepo']['URL']=sprintf($conf['addrepo']['url_format'],$page['project']);
}
else {
$page['addrepo']['URL']='[URL]';
}
$this->display_plugin_template('summary',False);
}
}
}
/**
* Display the given template.
* Fixe global variables inclusion
*/
function display_template($template, $with_headers = true) {
global $conf;
global $page;
if ($with_headers) {
require 'templates/header.php';
}
require "$template";
if ($with_headers) {
require 'templates/footer.php';
}
}
function add_display_message($msg,$error=false) {
global $page;
if ($error) {
$page['addrepo']['error'][]=$msg;
}
else {
$page['addrepo']['msg'][]=$msg;
}
}
function validate_repo_name($name) {
if (preg_match('/^[a-zA-Z0-9\-\_]*$/',$name)) {
return True;
}
return False;
}
function create_repo($name,$desc) {
global $conf;
if (!isset($conf['addrepo']['root_path'])) {
$this -> add_display_message('Root path not configured !',True);
return;
}
elseif(!is_dir($conf['addrepo']['root_path'])) {
$this -> add_display_message('Root directory not found. Check your configuration !',True);
return;
}
$path=$conf['addrepo']['root_path'].'/'.$name;
if (is_dir($path)) {
$this -> add_display_message("Repository $name still exist !",True);
return;
}
if (!mkdir($path)) {
$this -> add_display_message("Fail to create repository's directory. Check permission.",True);
return;
}
global $conf;
$conf['project'][$name]=array(
'repo' => $path
);
$cmd = $conf['git'] ." --git-dir=$path init";
exec($cmd,$out,$ret);
if ($ret !== 0) {
$this -> add_display_message("Error initializing repository !");
return;
}
try {
$fd = fopen($path.'/description','w');
fwrite($fd,$desc);
fclose($fd);
}
catch (Exception $e) {
$this -> add_display_message("Error setting repository's description : ".$e->getMessage());
return;
}
$cmd = "chmod g+rw -R $path";
exec($cmd,$out,$ret);
if ($ret !== 0) {
$this -> add_display_message("Error fixing repository permission. You may not be able to push in this repository.");
}
return True;
}
}