replacing the cli cmds with variables and configuration in config.php
[gwvp-mini.git] / gwvpmini / gwvpmini_gitrepo.php
index 502210e..3c19507 100644 (file)
@@ -3,7 +3,7 @@ global $HOME_PAGE_PROVIDERS;
 
 
 $CALL_ME_FUNCTIONS["repoadmin"] = "gwvpmini_RepoCallMe";
-$HOME_PAGE_PROVIDERS["gitlog"] = "gwvpmini_GitLogProvider";\r
+$HOME_PAGE_PROVIDERS["00gitlog"] = "gwvpmini_GitLogProvider";\r
 \r
 \r
 // the home_page_provders bit is an array\r
@@ -15,15 +15,15 @@ $MENU_ITEMS["10repos"]["link"] = "$BASE_URL/repos";
 function gwvpmini_RepoCallMe()\r
 {\r
 \r
-       error_log("in repoadmin callme - err?");
-       error_log(print_r($_REQUEST, true));\r
+       // error_log("in repoadmin callme - err?");
+       // error_log(print_r($_REQUEST, true));\r
        if(isset($_REQUEST["q"])) {
-               error_log("in repoadmin callme, for Q");\r
+               // error_log("in repoadmin callme, for Q");\r
                $query = $_REQUEST["q"];\r
                $qspl = explode("/", $query);\r
                if(isset($qspl[0])) {\r
                        if($qspl[0] == "repos") {
-                               error_log("in repos call");
+                               // error_log("in repos call");
                                if(isset($qspl[1])) {
                                        if($qspl[1] == "create") {
                                                return "gwvpmini_RepoCreate";
@@ -31,7 +31,7 @@ function gwvpmini_RepoCallMe()
                                                return "gwvpmini_RepoMainPage";
                                        }
                                } else {\r
-                                       error_log("i got here, where next?");\r
+                                       // error_log("i got here, where next?");\r
                                        return "gwvpmini_RepoMainPage";
                                }\r
                        } else return false;\r
@@ -55,6 +55,7 @@ function gwvpmini_RepoMainPageBody()
        
        if(gwvpmini_isLoggedIn()) {
                $repos = gwvpmini_GetOwnedRepos($_SESSION["username"]);
+               error_log("repos, ".print_r($repos, true));
                if(!$repos) {
                        echo "You currently own no repos<br>";  
                } else {
@@ -63,23 +64,37 @@ function gwvpmini_RepoMainPageBody()
                        foreach($repos as $repo) {
                                $name = $repo["name"];
                                $desc = $repo["desc"];
-                               $repo_base = gwvpmini_getConfigVal("repodir");
-                               $cmd = "git --git-dir=\"$repo_base/$name.git\" log --all -1 2> /dev/null";
-                               echo "<tr><td><a href=\"$BASE_URL/view/$name\">$name</a></td><td>$desc</td>";
-                               echo "<td>";\r
-                               error_log("CMD: $cmd");
-                               //system("$cmd");
-                               $fls = popen($cmd, "r");
-                               $tks = "";
-                               if($fls !== false) while(!feof($fls)) {
-                                       $tks .= fread($fls,1024);
-                               }
+                               $stat = $repo["status"];
+                               $llog = "";\r
+                               if($stat != 0) {\r
+                                       switch($stat) {\r
+                                               case 1:\r
+                                                       $llog = "Repo Administratively Disabled";\r
+                                                       break;\r
+                                               case 2:\r
+                                                       $llog = "Repo Cloning from remote";\r
+                                                       break;\r
+                                       }\r
+                               } else {
                                
-                               if($tks == "") {
-                                       echo "No Log Info Yet";
-                               } else echo $tks;
-                               echo "</td>";
-                               echo "</tr>";
+                                       if($desc == "") $desc = "none";
+                                       
+                                       $repo_base = gwvpmini_getConfigVal("repodir");
+                                       $cmd = "git --git-dir=\"$repo_base/$name.git\" log --all -1 2> /dev/null";
+                                       // error_log("CMD: $cmd");
+                                       //system("$cmd");
+                                       $fls = popen($cmd, "r");
+                                       $tks = "";
+                                       if($fls !== false) while(!feof($fls)) {
+                                               $tks .= fread($fls,1024);
+                                       }
+                                       
+                                       if($tks == "") {
+                                               $llog =  "No Log Info Yet";
+                                       } else $llog = $tks;
+                                       
+                               }
+                               echo "<tr><td><a href=\"$BASE_URL/view/$name\">$name</a></td><td>$desc</td><td>$llog</td></tr>";
                        }
                        echo "</table>";
                }
@@ -94,20 +109,32 @@ function gwvpmini_RepoMainPageBody()
                        foreach($contreps as $repo) {
                                $name = $repo["name"];\r
                                $desc = $repo["desc"];
-                               $repo_base = gwvpmini_getConfigVal("repodir");\r
-                               $cmd = "git --git-dir=\"$repo_base/$name.git\" log --all -1 2> /dev/null";
-                               error_log("CMD: $cmd");
-                               //system("$cmd");
-                               $fls = popen($cmd, "r");
-                               $tks = "";
-                               if($fls !== false) while(!feof($fls)) {
-                                       $tks .= fread($fls,1024);
+                               $stat = $repo["status"];
+                               if($stat != 0) {
+                                       switch($stat) {
+                                               case 1:
+                                                       $lastlog = "Repo Administratively Disabled";
+                                                       break;
+                                               case 2:
+                                                       $lastlog = "Repo Cloning from remote";
+                                                       break;
+                                       }
+                               } else {
+                                       $repo_base = gwvpmini_getConfigVal("repodir");\r
+                                       $cmd = "git --git-dir=\"$repo_base/$name.git\" log --all -1 2> /dev/null";
+                                       // error_log("CMD: $cmd");
+                                       //system("$cmd");
+                                       $fls = popen($cmd, "r");
+                                       $tks = "";
+                                       if($fls !== false) while(!feof($fls)) {
+                                               $tks .= fread($fls,1024);
+                                       }
+                                       
+                                       if($tks == "") {
+                                               $lastlog = "No Log Info Yet";
+                                       } else $lastlog = $tks;
                                }
                                
-                               if($tks == "") {
-                                       $lastlog = "No Log Info Yet";
-                               } else $lastlog = $tks;
-                               
                                $owner = gwvpmini_getUser(null, null, $repo["owner"]);
                                $repname = "<a href=\"$BASE_URL/view/$name\">$name</a>";
                                $repown = gwvpmini_HtmlGravatar($owner["email"], 30, "<br>")."<a href=\"$BASE_URL/user/".$owner["username"]."\">".$owner["username"]."</a>";
@@ -123,7 +150,8 @@ function gwvpmini_RepoMainPageBody()
 
 
 function gwvpmini_GitLogProvider()\r
-{\r
+{
+       global $cmd_line_tool,$git_cli_cmd,$php_cli_cmd;\r
        /*\r
         * The home page provider will:\r
        * 1) show the last 10 commits for every repository - though, excluding private repos\r
@@ -148,11 +176,13 @@ function gwvpmini_GitLogProvider()
                        foreach($repos as $repo) {
                                $name = $repo["name"];
                                $desc = $repo["desc"];
+                               
+                               if($desc == "") $desc = "-";
                                echo "<tr><td><a href=\"$BASE_URL/view/$name\">$name</a></td><td>$desc</td>";
                                echo "<td>";
                                $repo_base = gwvpmini_getConfigVal("repodir");
-                               $cmd = "git --git-dir=\"$repo_base/$name.git\" log --all -1 2> /dev/null";
-                               error_log("CMD: $cmd");
+                               $cmd = "$git_cli_cmd --git-dir=\"$repo_base/$name.git\" log --all -1 2> /dev/null";
+                               // error_log("CMD: $cmd");
                                //system("$cmd");
                                $fls = popen($cmd, "r");
                                $tks = "";
@@ -169,15 +199,6 @@ function gwvpmini_GitLogProvider()
                        echo "</table>";
                }\r
        }
-       
-       $logs = gwvpmini_GetActivityLog();
-       if($logs !== null) {
-               echo "<h2>Global Log</h2><table>";
-               foreach($logs as $ents) {
-                       echo "<tr><td>".$ents["type"]."</td><td>".$ents["commitid"]."</td></tr>";
-               }
-               echo "</table>";
-       }
 }
 
 function gwvpmini_GitCreateRepoForm()
@@ -187,15 +208,15 @@ function gwvpmini_GitCreateRepoForm()
        echo "<form method=\"post\" action=\"$BASE_URL/repos/create\">";
        echo "<table border=\"1\">";
        echo "<tr><th colspan=\"2\">Create Repo</th></tr>";
-       echo "<tr><th>Repo Name</th><td><input type=\"text\" name=\"reponame\"></td></tr>";
-       echo "<tr><th>Repo Description</th><td><input type=\"text\" name=\"repodesc\"></td></tr>";
+       echo "<tr><th>Repo Name</th><td><input type=\"text\" name=\"reponame\"></td><td>Name of your repo - letters, numbers _ and - only</td></tr>";
+       echo "<tr><th>Repo Description</th><td><input type=\"text\" name=\"repodesc\"></td><td>Description of your repo</td></tr>";
        echo "<tr><th>Read Permissions</th><td>";
        echo "<select name=\"perms\">";
        echo "<option value=\"perms-public\">Anyone Can Read</option>";
        echo "<option value=\"perms-registered\">Must be Registered To Read</option>";
        echo "<option value=\"perms-onlywrite\">Only Writers can Read</option>";
-       echo "</select>";
-       echo "</td></tr>";
+       echo "</select></td><td>The basic permissions for the initial repo creation</td></tr>";
+       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>";
        echo "<tr><td colspan=\"2\"><input type=\"submit\" name=\"Create\" value=\"Create\"></td></tr>";
        echo "</table>";
        echo "</form>";
@@ -209,6 +230,7 @@ function gwvpmini_RepoCreate()
        // TODO: check the stuff out
        // first reponame
        $inputcheck = true;
+       
 
        // remove a .git at the end if it was input
        $_REQUEST["reponame"] = preg_replace("/\.git$/", "", $_REQUEST["reponame"]);
@@ -220,6 +242,47 @@ function gwvpmini_RepoCreate()
                $inputcheckerror = "Repo name contains invalid characters, repos can only contain a-z, A-Z, 0-9, _, - and .";
        }
        
+       $clonefrom = false;
+       $fromremote = false;
+       if(isset($_REQUEST["clonefrom"])) {
+               if($_REQUEST["clonefrom"] != "") {
+                       $clonefrom = $_REQUEST["clonefrom"];
+                       if(preg_match("/git.*:\/\/.*/", $clonefrom)>0) {
+                               $fromremote = true;
+                       }
+                       if(preg_match("/http.*\:\/\//", $clonefrom)>0) $fromremote = true;
+               }
+       }
+       
+       if($clonefrom !== false && $fromremote == false) {
+               // check the local repo exists
+               $rn = gwvpmini_getRepo(null, $clonefrom, null);
+               $uid = $_SESSION["id"];
+               
+               if($rn == false) {
+                       gwvpmini_SendMessage("error", "local repo $clonefrom given as upstream clone, however $clonefrom doesnt exist on this site (or you cant read it unbake)");
+                       header("Location: $BASE_URL/repos");
+                       return;
+               }
+               
+               // resolve repo permissions on the read/clone
+               if(gwvpmini_GetRepoPerm($rn["id"], $uid) < 1) {
+                       gwvpmini_SendMessage("error", "local repo $clonefrom given as upstream clone, however $clonefrom doesnt exist on this site (or you cant read it bake)");
+                       header("Location: $BASE_URL/repos");
+                       return;
+               }
+       }
+       
+       $defperms = "a";
+       switch($_REQUEST["perms"]) {
+               case "perms-registered":
+                       $defperms = "r";
+                       break;
+               case "perms-onlywrite":
+                       $defperms = "x";
+                       break;
+       }
+       
        if(!$inputcheck) {
                gwvpmini_SendMessage("error", "$inputcheckerror");\r
                header("Location: $BASE_URL/repos");
@@ -229,8 +292,9 @@ function gwvpmini_RepoCreate()
                        gwvpmini_SendMessage("error", "Repo ".$_REQUEST["reponame"]." already exists");\r
                        header("Location: $BASE_URL/repos");
                } else {
-                       gwvpmini_createGitRepo($_REQUEST["reponame"], $_SESSION["id"], $_REQUEST["repodesc"], $_REQUEST["perms"]);
-                       gwvpmini_SendMessage("info", "Repo ".$_REQUEST["reponame"]." has been created");
+                       if(gwvpmini_createGitRepo($_REQUEST["reponame"], $_SESSION["id"], $_REQUEST["repodesc"], $defperms, $clonefrom, $fromremote)) {
+                               gwvpmini_SendMessage("info", "Repo ".$_REQUEST["reponame"]." has been created");
+                       }
                        header("Location: $BASE_URL/repos");
                }
        } else {
@@ -255,7 +319,7 @@ function gwvpmini_RemoveRepo($rid)
        
        $rname = $repdet["name"];
        
-       error_log("FROM PANTS:".print_r($repdet,true)." ----------- ".print_r($rname, true));
+       // error_log("FROM PANTS:".print_r($repdet,true)." ----------- ".print_r($rname, true));
        
        if($repdet != false && $rname != "") {
                if(file_exists("$repo_base/$rname.git")) {
@@ -269,7 +333,7 @@ function gwvpmini_RemoveRepo($rid)
 
 function gwvpmini_RecursiveDelete($fpath)
 {
-       error_log("RECURSEDETELE: ".$fpath);
+       // error_log("RECURSEDETELE: ".$fpath);
        if(is_file($fpath)){\r
                return @unlink($fpath);\r
        }\r
@@ -281,5 +345,58 @@ function gwvpmini_RecursiveDelete($fpath)
                return @rmdir($fpath);\r
        }
 }
+
+function gwvpmini_CompressCommitId($cid)
+{
+       $compressedcid = substr($cid, 0, 5)."...".substr($cid, strlen($cid)-5, strlen($cid));
+       
+       return $compressedcid;
+}
+
+function gwvpmini_GetCommitDetail($repo, $commitid)
+{
+       global $cmd_line_tool,$git_cli_cmd,$php_cli_cmd;
+       
+       $repo_base = gwvpmini_getConfigVal("repodir");
+       
+       $cmd = "$git_cli_cmd --git-dir=$repo_base/$repo.git log $commitid -1 --format='%an'";   
+       exec($cmd, $commitername, $returnvar);
+
+       $cmd = "$git_cli_cmd --git-dir=$repo_base/$repo.git log $commitid -1 --format='%ae'";   
+       exec($cmd, $commiteremail, $returnvar);
+
+       $cmd = "$git_cli_cmd --git-dir=$repo_base/$repo.git log $commitid -1 --format='%ct'";   
+       exec($cmd, $commitertime, $returnvar);
+
+       $cmd = "$git_cli_cmd --git-dir=$repo_base/$repo.git log $commitid -1 --format='%s'";    
+       exec($cmd, $commiterlog, $returnvar);
+
+       $cmd = "$git_cli_cmd --git-dir=$repo_base/$repo.git log $commitid -1 --format='%b'";    
+       exec($cmd, $commiterbody, $returnvar);
+}
+
+function gwvpmini_GetCommitList($repo, $branch, $num=20)
+{
+       global $git_cli_cmd,$git_cli_cmd,$php_cli_cmd;
+       
+       $repo_base = gwvpmini_getConfigVal("repodir");
+       
+       $cmd = "$git_cli_cmd --git-dir=$repo_base/$repo.git log $commitid -1 --format='%an'";\r
+       exec($cmd, $commitername, $returnvar);\r
+       
+}
+
+function gwvpmini_GetRefList($repo)
+{
+       global $cmd_line_tool,$git_cli_cmd,$php_cli_cmd;
+       
+       $repo_base = gwvpmini_getConfigVal("repodir");
+
+       $cmd = "$git_cli_cmd --git-dir=$repo_base/$repo.git for-each-ref $commitid --format='%(objecttype):%(objectname):%(refname)'";
+       error_log("command was $cmd");
+       exec($cmd, $reflist, $returnvar);
+       
+       return $reflist;
+}
        
 ?>
\ No newline at end of file