ba00862d35d8c78fb66703522482ed2264acfb40
[gwvp-mini.git] / gwvpmini / gwvpmini_gitrepo.php
1 <?php
2 global $HOME_PAGE_PROVIDERS;\r
3
4
5 $CALL_ME_FUNCTIONS["repoadmin"] = "gwvpmini_RepoCallMe";
6 $HOME_PAGE_PROVIDERS["00gitlog"] = "gwvpmini_GitLogProvider";\r
7 \r
8 \r
9 // the home_page_provders bit is an array\r
10 \r
11 $MENU_ITEMS["10repos"]["text"] = "Repos";\r
12 $MENU_ITEMS["10repos"]["link"] = "$BASE_URL/repos";
13
14
15 function gwvpmini_RepoCallMe()\r
16 {\r
17 \r
18         // error_log("in repoadmin callme - err?");
19         // error_log(print_r($_REQUEST, true));\r
20         if(isset($_REQUEST["q"])) {
21                 // error_log("in repoadmin callme, for Q");\r
22                 $query = $_REQUEST["q"];\r
23                 $qspl = explode("/", $query);\r
24                 if(isset($qspl[0])) {\r
25                         if($qspl[0] == "repos") {
26                                 // error_log("in repos call");
27                                 if(isset($qspl[1])) {
28                                         if($qspl[1] == "create") {
29                                                 return "gwvpmini_RepoCreate";
30                                         } else {
31                                                 return "gwvpmini_RepoMainPage";
32                                         }
33                                 } else {\r
34                                         // error_log("i got here, where next?");\r
35                                         return "gwvpmini_RepoMainPage";
36                                 }\r
37                         } else return false;\r
38                 }\r
39                 else return false;\r
40         }\r
41 \r
42         return false;\r
43 }\r
44
45
46 function gwvpmini_RepoMainPage()\r
47 {\r
48         gwvpmini_goMainPage("gwvpmini_RepoMainPageBody");\r
49 }\r
50 \r
51
52 function gwvpmini_RepoMainPageBody()
53 {
54         global $BASE_URL;
55         
56         if(gwvpmini_isLoggedIn()) {
57                 $repos = gwvpmini_GetOwnedRepos($_SESSION["username"]);
58                 if(!$repos) {
59                         echo "You currently own no repos<br>";  
60                 } else {
61                         echo "<h2>Your Repos</h2>";
62                         echo "<table border=\"1\"><tr><th>Repo Name</th><th>Repo Description</th><th>Last Log</th></tr>";
63                         foreach($repos as $repo) {
64                                 $name = $repo["name"];
65                                 $desc = $repo["desc"];
66                                 
67                                 if($desc == "") $desc = "none";
68                                 
69                                 $repo_base = gwvpmini_getConfigVal("repodir");
70                                 $cmd = "git --git-dir=\"$repo_base/$name.git\" log --all -1 2> /dev/null";
71                                 echo "<tr><td><a href=\"$BASE_URL/view/$name\">$name</a></td><td>$desc</td>";
72                                 echo "<td>";\r
73                                 // error_log("CMD: $cmd");
74                                 //system("$cmd");
75                                 $fls = popen($cmd, "r");
76                                 $tks = "";
77                                 if($fls !== false) while(!feof($fls)) {
78                                         $tks .= fread($fls,1024);
79                                 }
80                                 
81                                 if($tks == "") {
82                                         echo "No Log Info Yet";
83                                 } else echo $tks;
84                                 echo "</td>";
85                                 echo "</tr>";
86                         }
87                         echo "</table>";
88                 }
89                 gwvpmini_GitCreateRepoForm();\r
90                 
91                 
92                 $contreps = gwvpmini_GetContributedRepos($_SESSION["username"]);
93                 
94                 if($contreps !== false) {
95                         echo "<h2>Repos you contribute to</h2>";
96                         echo "<table border=\"1\"><tr><th>Repo Name</th><th>Owner</th><th>Repo Description</th><th>Last Log</th></tr>";
97                         foreach($contreps as $repo) {
98                                 $name = $repo["name"];\r
99                                 $desc = $repo["desc"];
100                                 $repo_base = gwvpmini_getConfigVal("repodir");\r
101                                 $cmd = "git --git-dir=\"$repo_base/$name.git\" log --all -1 2> /dev/null";
102                                 // error_log("CMD: $cmd");
103                                 //system("$cmd");
104                                 $fls = popen($cmd, "r");
105                                 $tks = "";
106                                 if($fls !== false) while(!feof($fls)) {
107                                         $tks .= fread($fls,1024);
108                                 }
109                                 
110                                 if($tks == "") {
111                                         $lastlog = "No Log Info Yet";
112                                 } else $lastlog = $tks;
113                                 
114                                 $owner = gwvpmini_getUser(null, null, $repo["owner"]);
115                                 $repname = "<a href=\"$BASE_URL/view/$name\">$name</a>";
116                                 $repown = gwvpmini_HtmlGravatar($owner["email"], 30, "<br>")."<a href=\"$BASE_URL/user/".$owner["username"]."\">".$owner["username"]."</a>";
117                                 
118                                 
119                                 echo "<tr><td>$repname</td><td>$repown</td><td>$desc</td><td>$lastlog</td></tr>";
120                         }
121                         echo "</table>";
122                 }
123         }
124         return true;
125 }
126
127
128 function gwvpmini_GitLogProvider()\r
129 {\r
130         /*\r
131          * The home page provider will:\r
132         * 1) show the last 10 commits for every repository - though, excluding private repos\r
133         * 2) if loged in, show the last commit on any repo's the user owns\r
134         *\r
135         * So i need a table thats going to list "writes" by user - as in POST writes but only\r
136         * put that info into the stats (doesnt exist) db if the repo is publically readable\r
137         *\r
138         * Or... should we instead just list every repo?\r
139         */
140         
141         global $BASE_URL;
142         
143         echo "<h2>Repo Activity</h2>";
144         if(gwvpmini_isLoggedIn()) {\r
145                 $repos = gwvpmini_GetOwnedRepos($_SESSION["username"]);
146                 if(!$repos) {
147                         echo "You currently own no repos<br>";  
148                 } else {
149                         echo "<h2>Your Repos</h2>";
150                         echo "<table border=\"1\"><tr><th>Repo Name</th><th>Repo Description</th><th>Repo Log</th></tr>";
151                         foreach($repos as $repo) {
152                                 $name = $repo["name"];
153                                 $desc = $repo["desc"];
154                                 
155                                 if($desc == "") $desc = "-";
156                                 echo "<tr><td><a href=\"$BASE_URL/view/$name\">$name</a></td><td>$desc</td>";
157                                 echo "<td>";
158                                 $repo_base = gwvpmini_getConfigVal("repodir");
159                                 $cmd = "git --git-dir=\"$repo_base/$name.git\" log --all -1 2> /dev/null";
160                                 // error_log("CMD: $cmd");
161                                 //system("$cmd");
162                                 $fls = popen($cmd, "r");
163                                 $tks = "";
164                                 if($fls !== false) while(!feof($fls)) {
165                                         $tks .= fread($fls,1024);
166                                 }
167                                 
168                                 if($tks == "") {
169                                         echo "No Log Info Yet";
170                                 } else echo $tks;
171                                 echo "</td>";
172                                 echo "</tr>";
173                         }
174                         echo "</table>";
175                 }\r
176         }
177 }
178
179 function gwvpmini_GitCreateRepoForm()
180 {
181         global $BASE_URL;
182         
183         echo "<form method=\"post\" action=\"$BASE_URL/repos/create\">";
184         echo "<table border=\"1\">";
185         echo "<tr><th colspan=\"2\">Create Repo</th></tr>";
186         echo "<tr><th>Repo Name</th><td><input type=\"text\" name=\"reponame\"></td><td>Name of your repo - letters, numbers _ and - only</td></tr>";
187         echo "<tr><th>Repo Description</th><td><input type=\"text\" name=\"repodesc\"></td><td>Description of your repo</td></tr>";
188         echo "<tr><th>Read Permissions</th><td>";
189         echo "<select name=\"perms\">";
190         echo "<option value=\"perms-public\">Anyone Can Read</option>";
191         echo "<option value=\"perms-registered\">Must be Registered To Read</option>";
192         echo "<option value=\"perms-onlywrite\">Only Writers can Read</option>";
193         echo "</select></td><td>The basic permissions for the initial repo creation</td></tr>";
194         echo "<tr><th>Clone From</th><td><input type=\"text\" name=\"clonefrom\"></td><td>Either a repo name (existing on this site) or a git url to clone from (blank for none)</td></tr>";
195         echo "<tr><td colspan=\"2\"><input type=\"submit\" name=\"Create\" value=\"Create\"></td></tr>";
196         echo "</table>";
197         echo "</form>";
198 }
199
200 function gwvpmini_RepoCreate()
201 {
202         
203         global $BASE_URL;
204         
205         // TODO: check the stuff out
206         // first reponame
207         $inputcheck = true;
208         
209
210         // remove a .git at the end if it was input
211         $_REQUEST["reponame"] = preg_replace("/\.git$/", "", $_REQUEST["reponame"]);
212         
213         // check for valid chars
214         $replcheck = preg_replace("/[a-zA-Z0-9_\-\.]/", "", $_REQUEST["reponame"]);
215         if(strlen($replcheck)>0) {
216                 $inputcheck = false;
217                 $inputcheckerror = "Repo name contains invalid characters, repos can only contain a-z, A-Z, 0-9, _, - and .";
218         }
219         
220         $clonefrom = false;
221         $fromremote = false;
222         if(isset($_REQUEST["clonefrom"])) {
223                 if($_REQUEST["clonefrom"] != "") {
224                         $clonefrom = $_REQUEST["clonefrom"];
225                         if(preg_match("/git.*:\/\/.*/", $clonefrom)>0) {
226                                 $fromremote = true;
227                         }
228                         if(preg_match("/http.*\:\/\//", $clonefrom)>0) $fromremote = true;
229                 }
230         }
231         
232         if($clonefrom !== false && $fromremote == false) {
233                 // check the local repo exists
234                 $rn = gwvpmini_getRepo(null, $clonefrom, null);
235                 $uid = $_SESSION["id"];
236                 
237                 if($rn == false) {
238                         gwvpmini_SendMessage("error", "local repo $clonefrom given as upstream clone, however $clonefrom doesnt exist on this site (or you cant read it)");
239                         header("Location: $BASE_URL/repos");
240                         return;
241                 }
242                 
243                 // resolve repo permissions on the read/clone
244                 if(gwvpmini_GetRepoPerm($rn, $uid) < 1) {
245                         gwvpmini_SendMessage("error", "local repo $clonefrom given as upstream clone, however $clonefrom doesnt exist on this site (or you cant read it)");
246                         header("Location: $BASE_URL/repos");
247                         return;
248                 }
249         }
250         
251         $defperms = "a";
252         switch($_REQUEST["perms"]) {
253                 case "perms-registered":
254                         $defperms = "r";
255                         break;
256                 case "perms-onlywrite":
257                         $defperms = "x";
258                         break;
259         }
260         
261         if(!$inputcheck) {
262                 gwvpmini_SendMessage("error", "$inputcheckerror");\r
263                 header("Location: $BASE_URL/repos");
264         } else  if(gwvpmini_isLoggedIn()) {
265                 //gwvpmini_createGitRepo($name, $ownerid, $desc, $bundle=null, $defaultperms=0)
266                 if(gwvpmini_HaveRepo($_REQUEST["reponame"])) {
267                         gwvpmini_SendMessage("error", "Repo ".$_REQUEST["reponame"]." already exists");\r
268                         header("Location: $BASE_URL/repos");
269                 } else {
270                         gwvpmini_createGitRepo($_REQUEST["reponame"], $_SESSION["id"], $_REQUEST["repodesc"], $defperms, $clonefrom, $fromremote);
271                         gwvpmini_SendMessage("info", "Repo ".$_REQUEST["reponame"]." has been created");
272                         header("Location: $BASE_URL/repos");
273                 }
274         } else {
275                 gwvpmini_SendMessage("info", "Must be logged in to create repo");
276                 header("Location: $BASE_URL/repos");
277         }
278 }
279
280 function gwvpmini_HaveRepo($reponame)
281 {
282         $repo_base = gwvpmini_getConfigVal("repodir");
283         
284         if(file_exists("$repo_base/$reponame.git")) return true;
285 }
286
287
288 function gwvpmini_RemoveRepo($rid)
289 {
290         $repo_base = gwvpmini_getConfigVal("repodir");
291         
292         $repdet = gwvpmini_getRepo(null, null, $rid);
293         
294         $rname = $repdet["name"];
295         
296         // error_log("FROM PANTS:".print_r($repdet,true)." ----------- ".print_r($rname, true));
297         
298         if($repdet != false && $rname != "") {
299                 if(file_exists("$repo_base/$rname.git")) {
300                         // recursive remove - frightening
301                         if(gwvpmini_RecursiveDelete("$repo_base/$rname.git")) {
302                                 gwvpmini_RemoveRepoDB($rid);
303                         }
304                 }
305         } return false;
306 }
307
308 function gwvpmini_RecursiveDelete($fpath)
309 {
310         // error_log("RECURSEDETELE: ".$fpath);
311         if(is_file($fpath)){\r
312                 return @unlink($fpath);\r
313         }\r
314         elseif(is_dir($fpath)){\r
315                 $scan = glob(rtrim($fpath,'/').'/*');\r
316                 foreach($scan as $index=>$path){\r
317                         gwvpmini_RecursiveDelete($path);\r
318                 }\r
319                 return @rmdir($fpath);\r
320         }
321 }
322
323 function gwvpmini_CompressCommitId($cid)
324 {
325         $compressedcid = substr($cid, 0, 5)."...".substr($cid, strlen($cid)-5, strlen($cid));
326         
327         return $compressedcid;
328 }
329         
330 ?>