Benjamin Renard commited on 2013-08-21 14:38:18
Showing 6 changed files, with 303 additions and 0 deletions.
... | ... |
@@ -0,0 +1,42 @@ |
1 |
+AddRepo plugin for ViewGit |
|
2 |
+========================== |
|
3 |
+ |
|
4 |
+This plugin add an interface to create new repositry directly from |
|
5 |
+ViewGit : A form permit to give |
|
6 |
+ |
|
7 |
+* repository name |
|
8 |
+* repository description |
|
9 |
+* a password witch protect this feature |
|
10 |
+ |
|
11 |
+The repository name will be validated : it must contain only letter, number, |
|
12 |
+"_" or "-" caracter. |
|
13 |
+ |
|
14 |
+The repository description is required. This description will be put in the |
|
15 |
+description file of the repository. |
|
16 |
+ |
|
17 |
+The given password will be compare with $conf['addrepo']['password'] value. |
|
18 |
+If password is ommit in the configuration, the creation will be refused. |
|
19 |
+ |
|
20 |
+After create a new repository, if you go on the repository page, you will have |
|
21 |
+a message that explain you how to push your first commits. This message could |
|
22 |
+be change by editing template file summary.php. This message is displayed only |
|
23 |
+if the head hash is empty. |
|
24 |
+ |
|
25 |
+Prerequisites |
|
26 |
+------------- |
|
27 |
+ |
|
28 |
+* User witch running apache must have right access to the directory |
|
29 |
+ witch contains your repositories |
|
30 |
+* You must have dynamic viewgit projects detection |
|
31 |
+ |
|
32 |
+Install |
|
33 |
+------- |
|
34 |
+ |
|
35 |
+* Put addrepo directory in plugins directory |
|
36 |
+* Add this block in inc/localconfig.php : |
|
37 |
+ |
|
38 |
+$conf['addrepo'] = array( |
|
39 |
+ 'root_path' => '/full/path/to/your/repos', |
|
40 |
+ 'password' => 'secret', |
|
41 |
+ 'url_format' => 'git@git.example.com:public_git/%s' |
|
42 |
+); |
... | ... |
@@ -0,0 +1,158 @@ |
1 |
+<?php |
|
2 |
+ |
|
3 |
+class AddRepoPlugin extends VGPlugin |
|
4 |
+{ |
|
5 |
+ function __construct() { |
|
6 |
+ global $conf; |
|
7 |
+ if (isset($conf['addrepo'])) { |
|
8 |
+ $this->register_action('addrepo'); |
|
9 |
+ $this->register_hook('header'); |
|
10 |
+ $this->register_hook('page_start'); |
|
11 |
+ $this->register_hook('summary'); |
|
12 |
+ } |
|
13 |
+ } |
|
14 |
+ |
|
15 |
+ function action($action) { |
|
16 |
+ if ($action === 'addrepo') { |
|
17 |
+ global $page; |
|
18 |
+ global $conf; |
|
19 |
+ if (isset($_POST['repo_name']) && isset($_POST['repo_desc']) && isset($_POST['repo_pwd'])) { |
|
20 |
+ $create=True; |
|
21 |
+ $name=rtrim($_POST['repo_name']); |
|
22 |
+ if (!$this -> validate_repo_name($name)) { |
|
23 |
+ $this -> add_display_message('Invalid name of repository. Must only contain letters, numbers or caraters "_" or "-". ',True); |
|
24 |
+ $create=False; |
|
25 |
+ } |
|
26 |
+ $desc=rtrim($_POST['repo_desc']); |
|
27 |
+ if (empty($desc)) { |
|
28 |
+ $this -> add_display_message('Repository description is required.',True); |
|
29 |
+ $create=False; |
|
30 |
+ } |
|
31 |
+ |
|
32 |
+ if (!isset($conf['addrepo']['password']) || empty($conf['addrepo']['password'])) { |
|
33 |
+ $this -> add_display_message('Password not defined in configuration. Creation disable.',True); |
|
34 |
+ $create=False; |
|
35 |
+ } |
|
36 |
+ else { |
|
37 |
+ $pwd=rtrim($_POST['repo_pwd']); |
|
38 |
+ if ($pwd!=$conf['addrepo']['password']) { |
|
39 |
+ $this -> add_display_message('Password incorrect',True); |
|
40 |
+ $create=False; |
|
41 |
+ } |
|
42 |
+ } |
|
43 |
+ |
|
44 |
+ if ($create && $this -> create_repo($name,$desc)) { |
|
45 |
+ $this -> add_display_message("Repository $name successfully created !<br>To access to your new repository, click <a href='?a=summary&p=$name'>here</a>."); |
|
46 |
+ } |
|
47 |
+ else { |
|
48 |
+ $page['addrepo']['values']['name']=$name; |
|
49 |
+ $page['addrepo']['values']['desc']=$desc; |
|
50 |
+ } |
|
51 |
+ } |
|
52 |
+ $this->display_plugin_template('addrepo'); |
|
53 |
+ } |
|
54 |
+ } |
|
55 |
+ |
|
56 |
+ function hook($type) { |
|
57 |
+ if ($type == 'header') { |
|
58 |
+ echo "\t<link rel='stylesheet' href='plugins/addrepo/style.css' type='text/css' />\n"; |
|
59 |
+ } |
|
60 |
+ elseif ($type == 'page_start') { |
|
61 |
+ $this->display_plugin_template('start',False); |
|
62 |
+ } |
|
63 |
+ elseif ($type == 'summary') { |
|
64 |
+ global $page; |
|
65 |
+ global $conf; |
|
66 |
+ $infos=get_project_info($page['project']); |
|
67 |
+ if (empty($infos['head_hash'])) { |
|
68 |
+ if (isset($conf['addrepo']['url_format'])) { |
|
69 |
+ $page['addrepo']['URL']=sprintf($conf['addrepo']['url_format'],$page['project']); |
|
70 |
+ } |
|
71 |
+ else { |
|
72 |
+ $page['addrepo']['URL']='[URL]'; |
|
73 |
+ } |
|
74 |
+ $this->display_plugin_template('summary',False); |
|
75 |
+ } |
|
76 |
+ } |
|
77 |
+ } |
|
78 |
+ |
|
79 |
+ /** |
|
80 |
+ * Display the given template. |
|
81 |
+ * Fixe global variables inclusion |
|
82 |
+ */ |
|
83 |
+ function display_template($template, $with_headers = true) { |
|
84 |
+ global $conf; |
|
85 |
+ global $page; |
|
86 |
+ if ($with_headers) { |
|
87 |
+ require 'templates/header.php'; |
|
88 |
+ } |
|
89 |
+ require "$template"; |
|
90 |
+ if ($with_headers) { |
|
91 |
+ require 'templates/footer.php'; |
|
92 |
+ } |
|
93 |
+ } |
|
94 |
+ |
|
95 |
+ function add_display_message($msg,$error=false) { |
|
96 |
+ global $page; |
|
97 |
+ if ($error) { |
|
98 |
+ $page['addrepo']['error'][]=$msg; |
|
99 |
+ } |
|
100 |
+ else { |
|
101 |
+ $page['addrepo']['msg'][]=$msg; |
|
102 |
+ } |
|
103 |
+ } |
|
104 |
+ |
|
105 |
+ function validate_repo_name($name) { |
|
106 |
+ if (preg_match('/^[a-zA-Z0-9\-\_]*$/',$name)) { |
|
107 |
+ return True; |
|
108 |
+ } |
|
109 |
+ return False; |
|
110 |
+ } |
|
111 |
+ |
|
112 |
+ function create_repo($name,$desc) { |
|
113 |
+ global $conf; |
|
114 |
+ if (!isset($conf['addrepo']['root_path'])) { |
|
115 |
+ $this -> add_display_message('Root path not configured !',True); |
|
116 |
+ return; |
|
117 |
+ } |
|
118 |
+ elseif(!is_dir($conf['addrepo']['root_path'])) { |
|
119 |
+ $this -> add_display_message('Root directory not found. Check your configuration !',True); |
|
120 |
+ return; |
|
121 |
+ } |
|
122 |
+ $path=$conf['addrepo']['root_path'].'/'.$name; |
|
123 |
+ if (is_dir($path)) { |
|
124 |
+ $this -> add_display_message("Repository $name still exist !",True); |
|
125 |
+ return; |
|
126 |
+ } |
|
127 |
+ |
|
128 |
+ if (!mkdir($path)) { |
|
129 |
+ $this -> add_display_message("Fail to create repository's directory. Check permission.",True); |
|
130 |
+ return; |
|
131 |
+ } |
|
132 |
+ |
|
133 |
+ global $conf; |
|
134 |
+ $conf['project'][$name]=array( |
|
135 |
+ 'repo' => $path |
|
136 |
+ ); |
|
137 |
+ |
|
138 |
+ $cmd = $conf['git'] ." --git-dir=$path init"; |
|
139 |
+ exec($cmd,$out,$ret); |
|
140 |
+ if ($ret !== 0) { |
|
141 |
+ $this -> add_display_message("Error initializing repository !"); |
|
142 |
+ return; |
|
143 |
+ } |
|
144 |
+ |
|
145 |
+ try { |
|
146 |
+ $fd = fopen($path.'/description','w'); |
|
147 |
+ fwrite($fd,$desc); |
|
148 |
+ fclose($fd); |
|
149 |
+ } |
|
150 |
+ catch (Exception $e) { |
|
151 |
+ $this -> add_display_message("Error setting repository's description : ".$e->getMessage()); |
|
152 |
+ return; |
|
153 |
+ } |
|
154 |
+ return True; |
|
155 |
+ } |
|
156 |
+ |
|
157 |
+} |
|
158 |
+ |
... | ... |
@@ -0,0 +1,70 @@ |
1 |
+h1.addrepo { |
|
2 |
+ background-color: #cfcfcf; |
|
3 |
+ border-bottom: 1px solid #666; |
|
4 |
+ border-top: 1px solid #666; |
|
5 |
+ padding: 6px 2px; |
|
6 |
+} |
|
7 |
+ |
|
8 |
+div.addrepo_error, div.addrepo_msg { |
|
9 |
+ width: 28em; |
|
10 |
+ padding: 0.5em; |
|
11 |
+ margin: 0.5em; |
|
12 |
+ text-align: center; |
|
13 |
+} |
|
14 |
+ |
|
15 |
+div.addrepo_error { |
|
16 |
+ color: #fff; |
|
17 |
+ background-color: #cb4545; |
|
18 |
+ border: 1px solid #f00; |
|
19 |
+} |
|
20 |
+ |
|
21 |
+div.addrepo_msg { |
|
22 |
+ color: #fff; |
|
23 |
+ background-color: #5dc85d; |
|
24 |
+ border: 1px solid #426f3a; |
|
25 |
+} |
|
26 |
+dl.addrepo { |
|
27 |
+ margin: 0; |
|
28 |
+ padding: 0; |
|
29 |
+} |
|
30 |
+ |
|
31 |
+dl.addrepo dt { |
|
32 |
+ position: relative; |
|
33 |
+ width: 8em; |
|
34 |
+ left: 0.2em; |
|
35 |
+ font-weight: bold; |
|
36 |
+} |
|
37 |
+ |
|
38 |
+dl.addrepo dd { |
|
39 |
+ margin-left: 9em; |
|
40 |
+ margin-top: -1.3em; |
|
41 |
+ padding: 0; |
|
42 |
+} |
|
43 |
+ |
|
44 |
+dl.addrepo dd input { |
|
45 |
+ width: 20em; |
|
46 |
+} |
|
47 |
+ |
|
48 |
+#addrepo_submit { |
|
49 |
+ background-color: #cfcfcf; |
|
50 |
+ border: 1px solid #666; |
|
51 |
+ padding: 6px; |
|
52 |
+ margin-top: 1em; |
|
53 |
+ margin-left: 12em; |
|
54 |
+} |
|
55 |
+ |
|
56 |
+#addrepo_btn { |
|
57 |
+ float: left; |
|
58 |
+ padding: 0.5em; |
|
59 |
+ background: #cfcfcf; |
|
60 |
+ -webkit-border-bottom-right-radius: 1em; |
|
61 |
+ -moz-border-radius-bottomright: 1em; |
|
62 |
+ border-bottom-right-radius: 1em; |
|
63 |
+} |
|
64 |
+ |
|
65 |
+#addrepo_btn a { |
|
66 |
+ text-decoration: none; |
|
67 |
+ font-weight: bold; |
|
68 |
+ font-size: 1.3em; |
|
69 |
+} |
|
70 |
+ |
... | ... |
@@ -0,0 +1,25 @@ |
1 |
+<h1 class='addrepo'>Add repository</h1> |
|
2 |
+<?php |
|
3 |
+if (isset($page['addrepo']['error'])) { |
|
4 |
+ foreach($page['addrepo']['error'] as $e) { |
|
5 |
+ echo "<div class='addrepo_error'>$e</div>\n"; |
|
6 |
+ } |
|
7 |
+} |
|
8 |
+if (isset($page['addrepo']['msg'])) { |
|
9 |
+ foreach($page['addrepo']['msg'] as $msg) { |
|
10 |
+ echo "<div class='addrepo_msg'>$msg</div>\n"; |
|
11 |
+ } |
|
12 |
+} |
|
13 |
+?> |
|
14 |
+ |
|
15 |
+<form action="?a=addrepo" method='POST'> |
|
16 |
+<dl class='addrepo'> |
|
17 |
+ <dt>Name</dt> |
|
18 |
+ <dd><input type='text' name='repo_name' class='addrepo' value="<?php echo (isset($page['addrepo']['values']['name'])?$page['addrepo']['values']['name']:''); ?>"/></dd> |
|
19 |
+ <dt>Description</dt> |
|
20 |
+ <dd><input type='text' name='repo_desc' class='addrepo' value="<?php echo (isset($page['addrepo']['values']['desc'])?$page['addrepo']['values']['desc']:''); ?>"/></dd> |
|
21 |
+ <dt>Password</dt> |
|
22 |
+ <dd><input type='password' name='repo_pwd' class='addrepo'/></dd> |
|
23 |
+</dl> |
|
24 |
+<input type='submit' value='Create' id='addrepo_submit'/> |
|
25 |
+</form> |
... | ... |
@@ -0,0 +1 @@ |
1 |
+<div id="addrepo_btn"><a href='?a=addrepo'>+</a></div> |