edf8fd692f287a43ea1b27402f577ce97c40dd7f
[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["gitlog"] = "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                                 $repo_base = gwvpmini_getConfigVal("repodir");
67                                 $cmd = "git --git-dir=\"$repo_base/$name.git\" log --all -1 2> /dev/null";
68                                 echo "<tr><td><a href=\"$BASE_URL/view/$name\">$name</a></td><td>$desc</td>";
69                                 echo "<td>";\r
70                                 // error_log("CMD: $cmd");
71                                 //system("$cmd");
72                                 $fls = popen($cmd, "r");
73                                 $tks = "";
74                                 if($fls !== false) while(!feof($fls)) {
75                                         $tks .= fread($fls,1024);
76                                 }
77                                 
78                                 if($tks == "") {
79                                         echo "No Log Info Yet";
80                                 } else echo $tks;
81                                 echo "</td>";
82                                 echo "</tr>";
83                         }
84                         echo "</table>";
85                 }
86                 gwvpmini_GitCreateRepoForm();\r
87                 
88                 
89                 $contreps = gwvpmini_GetContributedRepos($_SESSION["username"]);
90                 
91                 if($contreps !== false) {
92                         echo "<h2>Repos you contribute to</h2>";
93                         echo "<table border=\"1\"><tr><th>Repo Name</th><th>Owner</th><th>Repo Description</th><th>Last Log</th></tr>";
94                         foreach($contreps as $repo) {
95                                 $name = $repo["name"];\r
96                                 $desc = $repo["desc"];
97                                 $repo_base = gwvpmini_getConfigVal("repodir");\r
98                                 $cmd = "git --git-dir=\"$repo_base/$name.git\" log --all -1 2> /dev/null";
99                                 // error_log("CMD: $cmd");
100                                 //system("$cmd");
101                                 $fls = popen($cmd, "r");
102                                 $tks = "";
103                                 if($fls !== false) while(!feof($fls)) {
104                                         $tks .= fread($fls,1024);
105                                 }
106                                 
107                                 if($tks == "") {
108                                         $lastlog = "No Log Info Yet";
109                                 } else $lastlog = $tks;
110                                 
111                                 $owner = gwvpmini_getUser(null, null, $repo["owner"]);
112                                 $repname = "<a href=\"$BASE_URL/view/$name\">$name</a>";
113                                 $repown = gwvpmini_HtmlGravatar($owner["email"], 30, "<br>")."<a href=\"$BASE_URL/user/".$owner["username"]."\">".$owner["username"]."</a>";
114                                 
115                                 
116                                 echo "<tr><td>$repname</td><td>$repown</td><td>$desc</td><td>$lastlog</td></tr>";
117                         }
118                         echo "</table>";
119                 }
120         }
121         return true;
122 }
123
124
125 function gwvpmini_GitLogProvider()\r
126 {\r
127         /*\r
128          * The home page provider will:\r
129         * 1) show the last 10 commits for every repository - though, excluding private repos\r
130         * 2) if loged in, show the last commit on any repo's the user owns\r
131         *\r
132         * So i need a table thats going to list "writes" by user - as in POST writes but only\r
133         * put that info into the stats (doesnt exist) db if the repo is publically readable\r
134         *\r
135         * Or... should we instead just list every repo?\r
136         */
137         
138         global $BASE_URL;
139         
140         echo "<h2>Repo Activity</h2>";
141         if(gwvpmini_isLoggedIn()) {\r
142                 $repos = gwvpmini_GetOwnedRepos($_SESSION["username"]);
143                 if(!$repos) {
144                         echo "You currently own no repos<br>";  
145                 } else {
146                         echo "<h2>Your Repos</h2>";
147                         echo "<table border=\"1\"><tr><th>Repo Name</th><th>Repo Description</th><th>Repo Log</th></tr>";
148                         foreach($repos as $repo) {
149                                 $name = $repo["name"];
150                                 $desc = $repo["desc"];
151                                 echo "<tr><td><a href=\"$BASE_URL/view/$name\">$name</a></td><td>$desc</td>";
152                                 echo "<td>";
153                                 $repo_base = gwvpmini_getConfigVal("repodir");
154                                 $cmd = "git --git-dir=\"$repo_base/$name.git\" log --all -1 2> /dev/null";
155                                 // error_log("CMD: $cmd");
156                                 //system("$cmd");
157                                 $fls = popen($cmd, "r");
158                                 $tks = "";
159                                 if($fls !== false) while(!feof($fls)) {
160                                         $tks .= fread($fls,1024);
161                                 }
162                                 
163                                 if($tks == "") {
164                                         echo "No Log Info Yet";
165                                 } else echo $tks;
166                                 echo "</td>";
167                                 echo "</tr>";
168                         }
169                         echo "</table>";
170                 }\r
171         }
172         
173         $logs = gwvpmini_GetActivityLog();
174         if($logs !== null) {
175                 echo "<h2>Global Log</h2><table>";
176                 foreach($logs as $ents) {
177                         echo "<tr><td>".$ents["type"]."</td><td>".$ents["commitid"]."</td></tr>";
178                 }
179                 echo "</table>";
180         }
181 }
182
183 function gwvpmini_GitCreateRepoForm()
184 {
185         global $BASE_URL;
186         
187         echo "<form method=\"post\" action=\"$BASE_URL/repos/create\">";
188         echo "<table border=\"1\">";
189         echo "<tr><th colspan=\"2\">Create Repo</th></tr>";
190         echo "<tr><th>Repo Name</th><td><input type=\"text\" name=\"reponame\"></td></tr>";
191         echo "<tr><th>Repo Description</th><td><input type=\"text\" name=\"repodesc\"></td></tr>";
192         echo "<tr><th>Read Permissions</th><td>";
193         echo "<select name=\"perms\">";
194         echo "<option value=\"perms-public\">Anyone Can Read</option>";
195         echo "<option value=\"perms-registered\">Must be Registered To Read</option>";
196         echo "<option value=\"perms-onlywrite\">Only Writers can Read</option>";
197         echo "</select>";
198         echo "</td></tr>";
199         echo "<tr><td colspan=\"2\"><input type=\"submit\" name=\"Create\" value=\"Create\"></td></tr>";
200         echo "</table>";
201         echo "</form>";
202 }
203
204 function gwvpmini_RepoCreate()
205 {
206         
207         global $BASE_URL;
208         
209         // TODO: check the stuff out
210         // first reponame
211         $inputcheck = true;
212
213         // remove a .git at the end if it was input
214         $_REQUEST["reponame"] = preg_replace("/\.git$/", "", $_REQUEST["reponame"]);
215         
216         // check for valid chars
217         $replcheck = preg_replace("/[a-zA-Z0-9_\-\.]/", "", $_REQUEST["reponame"]);
218         if(strlen($replcheck)>0) {
219                 $inputcheck = false;
220                 $inputcheckerror = "Repo name contains invalid characters, repos can only contain a-z, A-Z, 0-9, _, - and .";
221         }
222         
223         if(!$inputcheck) {
224                 gwvpmini_SendMessage("error", "$inputcheckerror");\r
225                 header("Location: $BASE_URL/repos");
226         } else  if(gwvpmini_isLoggedIn()) {
227                 //gwvpmini_createGitRepo($name, $ownerid, $desc, $bundle=null, $defaultperms=0)
228                 if(gwvpmini_HaveRepo($_REQUEST["reponame"])) {
229                         gwvpmini_SendMessage("error", "Repo ".$_REQUEST["reponame"]." already exists");\r
230                         header("Location: $BASE_URL/repos");
231                 } else {
232                         gwvpmini_createGitRepo($_REQUEST["reponame"], $_SESSION["id"], $_REQUEST["repodesc"], $_REQUEST["perms"]);
233                         gwvpmini_SendMessage("info", "Repo ".$_REQUEST["reponame"]." has been created");
234                         header("Location: $BASE_URL/repos");
235                 }
236         } else {
237                 gwvpmini_SendMessage("info", "Must be logged in to create repo");
238                 header("Location: $BASE_URL/repos");
239         }
240 }
241
242 function gwvpmini_HaveRepo($reponame)
243 {
244         $repo_base = gwvpmini_getConfigVal("repodir");
245         
246         if(file_exists("$repo_base/$reponame.git")) return true;
247 }
248
249
250 function gwvpmini_RemoveRepo($rid)
251 {
252         $repo_base = gwvpmini_getConfigVal("repodir");
253         
254         $repdet = gwvpmini_getRepo(null, null, $rid);
255         
256         $rname = $repdet["name"];
257         
258         // error_log("FROM PANTS:".print_r($repdet,true)." ----------- ".print_r($rname, true));
259         
260         if($repdet != false && $rname != "") {
261                 if(file_exists("$repo_base/$rname.git")) {
262                         // recursive remove - frightening
263                         if(gwvpmini_RecursiveDelete("$repo_base/$rname.git")) {
264                                 gwvpmini_RemoveRepoDB($rid);
265                         }
266                 }
267         } return false;
268 }
269
270 function gwvpmini_RecursiveDelete($fpath)
271 {
272         // error_log("RECURSEDETELE: ".$fpath);
273         if(is_file($fpath)){\r
274                 return @unlink($fpath);\r
275         }\r
276         elseif(is_dir($fpath)){\r
277                 $scan = glob(rtrim($fpath,'/').'/*');\r
278                 foreach($scan as $index=>$path){\r
279                         gwvpmini_RecursiveDelete($path);\r
280                 }\r
281                 return @rmdir($fpath);\r
282         }
283 }
284         
285 ?>