figured out how to get commits contained in a pack thanks to cbreak on
authorPaul J R <me@pjr.cc>
Sun, 23 Sep 2012 23:15:42 +0000 (09:15 +1000)
committerPaul J R <me@pjr.cc>
Sun, 23 Sep 2012 23:15:42 +0000 (09:15 +1000)
freenode irc. very useful command.

bin/gwvpminicmdtool.php
gwvpmini/gwvpmini_gitbackend.php
gwvpmini/gwvpmini_gitrepo.php
www/config.php
www/index.php

index 3d23011..83bfd06 100644 (file)
@@ -3,7 +3,7 @@
 $WEB_ROOT_FS = realpath(dirname(__FILE__));
 $BASE_URL = "/";\r
 
-global $WEB_ROOT_FS, $BASE_URL, $IS_WEB_REQUEST;
+global $WEB_ROOT_FS, $BASE_URL, $IS_WEB_REQUEST, $data_directory, $db_type, $db_name, $db_username, $db_password, $IS_WEB_REQUEST, $cmd_line_tool;
 $IS_WEB_REQUEST = false;\r
 
 if(file_exists("../www/config.php")) require_once("../www/config.php");
@@ -15,9 +15,12 @@ else if(file_exists("/usr/share/gwvpmini/lib/gwvpmini/gwvpmini.php")) require_on
 
 if(isset($argv["1"])) {
        switch($argv["1"]) {
-               case "updatehook":
+               case "update":
                        gwvpcmdtool_UpdateHook();
                        break;
+               case "pre-receive":
+                       gwvpcmdtool_PreReceive();
+                       break;
                default:
                        gwvpcmdtool_Usage();
        }
@@ -36,6 +39,16 @@ function gwvpcmdtool_Usage()
 
 function gwvpcmdtool_UpdateHook()
 {
+       global $argv;
+       echo "got ".$argv[2].", ".$argv[3].", ".$argv[4]."\n";
+}
+
+function gwvpcmdtool_PreReceive()
+{
+       global $argv;
+
+       echo "got from prereceive ".$argv[2].", ".$argv[3].", ".$argv[4]."\n";\r
        
+       passthru("git rev-list --reverse ".$argv[3]." --not --all ");
 }
 ?>
\ No newline at end of file
index 6c8b8b5..8b4c1c2 100644 (file)
@@ -26,20 +26,42 @@ function gwvpmini_gitControlCallMe()
 }
 
 
-function gwvpmini_CreateUpdateHookInRepo($repopath)
+function gwvpmini_CreateRepoHooks($repopath, $cmdpath)
 {
-       $fp = fopen("$repopath/hooks/$repopath", "w");
+       $fp = fopen("$repopath/hooks/pre-receive", "w");
+       
+       if(!$fp) error_log("could not create pre-receive hook");
+       
+       // TODO: think about this one
+       $script = '#!/bin/bash'."\n\n".'DCOMMIT=`cat`'."\n".'START=`echo $DCOMMIT|cut -d " " -f 1`'."\n".'END=`echo $DCOMMIT|cut -d " " -f 2`'."\n".'REF=`echo $DCOMMIT|cut -d " " -f 3`'."\n\n";
+       $script .= "php $cmdpath pre-receive ";
+       $script .= '$START $END $REF'."\n\n";
+       fwrite($fp, $script);
+       
+       fclose($fp);
+       
+       chmod("$repopath/hooks/pre-receive", 0755);
+
+
+       $fp = fopen("$repopath/hooks/update", "w");
        
        if(!$fp) error_log("could not create update hook");
        
        // TODO: think about this one
+       $script = "#!/bin/bash\n\n";
+       $script .= "php $cmdpath update ";
+       $script .= '$1 $2 $3'."\n\n";
+       fwrite($fp, $script);
        
+       fclose($fp);
+       
+       chmod("$repopath/hooks/update", 0755);
 }
 
 function gwvpmini_gitBackendInterface()
 {
        // and this is where i re-code the git backend interface from scratch
-       global $BASE_URL;
+       global $BASE_URL, $cmd_line_tool;
        
        header_remove("Pragma");\r
        header_remove("Cache-Control");\r
@@ -89,6 +111,11 @@ function gwvpmini_gitBackendInterface()
        chdir("$repo_base/$repo.git");
        exec("/usr/bin/git update-server-info");
        
+       if(!file_exists("$repo_base/$repo.git/hooks/pre-receive") || !file_exists("$repo_base/$repo.git/hooks/update")) {
+               error_log("WRITING HOOKS");
+               gwvpmini_CreateRepoHooks("$repo_base/$repo.git", $cmd_line_tool);
+       }
+       
        
        // so now we have the repo
        // next we determine if this is a read or a write
@@ -219,7 +246,8 @@ function gwvpmini_callGitBackend($username, $repo)
                }
                
                //sleep(2);
-
+               
+               $userdets = gwvpmini_getUser($username);
                
                // this is where the fun, it ends.
                $myoutput = "";
@@ -232,6 +260,8 @@ function gwvpmini_callGitBackend($username, $repo)
                $procenv["GATEWAY_INTERFACE"] = "CGI/1.1";
                $procenv["PATH_TRANSLATED"] = "/$repo_base/$repo.git/$euri";
                $procenv["REQUEST_METHOD"] = "$rmeth";
+               $procenv["GIT_COMMITTER_NAME"] = $userdets["fullname"];
+               $procenv["GIT_COMMITTER_EMAIL"] = $userdets["email"];
                $procenv["GIT_HTTP_EXPORT_ALL"] = "1";
                $procenv["QUERY_STRING"] = "$qs";
                $procenv["HTTP_USER_AGENT"] = "git/1.7.1";
@@ -239,6 +269,8 @@ function gwvpmini_callGitBackend($username, $repo)
                $procenv["REMOTE_ADDR"] = $_SERVER["REMOTE_ADDR"];
                $procenv["AUTH_TYPE"] = "Basic";
                
+               error_log("PROCENV: ".print_r($procenv,true));
+               
                if(isset($_SERVER["CONTENT_TYPE"])) { 
                        $procenv["CONTENT_TYPE"] = $_SERVER["CONTENT_TYPE"];
                } else {
index b24e4bd..1da83b9 100644 (file)
@@ -64,7 +64,7 @@ function gwvpmini_RepoMainPageBody()
                                $name = $repo["name"];
                                $desc = $repo["desc"];
                                $repo_base = gwvpmini_getConfigVal("repodir");
-                               $cmd = "git --git-dir=\"$repo_base/$name.git\" log -1 2> /dev/null";
+                               $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");
@@ -95,7 +95,7 @@ function gwvpmini_RepoMainPageBody()
                                $name = $repo["name"];\r
                                $desc = $repo["desc"];
                                $repo_base = gwvpmini_getConfigVal("repodir");\r
-                               $cmd = "git --git-dir=\"$repo_base/$name.git\" log -1 2> /dev/null";
+                               $cmd = "git --git-dir=\"$repo_base/$name.git\" log --all -1 2> /dev/null";
                                error_log("CMD: $cmd");
                                //system("$cmd");
                                $fls = popen($cmd, "r");
@@ -151,7 +151,7 @@ function gwvpmini_GitLogProvider()
                                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 -1 2> /dev/null";
+                               $cmd = "git --git-dir=\"$repo_base/$name.git\" log --all -1 2> /dev/null";
                                error_log("CMD: $cmd");
                                //system("$cmd");
                                $fls = popen($cmd, "r");
index 3549c29..6c195f4 100644 (file)
@@ -11,6 +11,7 @@ $db_name = "$data_directory/gwvpmini.db"; // just a file for sqlite, for anythin
 $db_username = "";
 $db_password = "";
 
+$cmd_line_tool = realpath("../bin/gwvpminicmdtool.php");
 
 //error_log("included config file");
 ?>
\ No newline at end of file
index c0b765b..acb44a1 100644 (file)
@@ -3,7 +3,7 @@ error_log("INCALLSTART ".print_r($_COOKIE, true)." -------------------- ".print_
 $WEB_ROOT_FS = realpath(dirname(__FILE__));\r
 $BASE_URL = dirname($_SERVER["PHP_SELF"]);\r
 \r
-global $WEB_ROOT_FS, $BASE_URL, $data_directory, $db_type, $db_name, $db_username, $db_password, $IS_WEB_REQUEST;
+global $WEB_ROOT_FS, $BASE_URL, $data_directory, $db_type, $db_name, $db_username, $db_password, $IS_WEB_REQUEST, $cmd_line_tool;
 
 $IS_WEB_REQUEST = true;\r
 
@@ -20,6 +20,8 @@ if(isset($noconfig)) {
        return;
 }
 
+error_log("CMDLINETOOL: ".$cmd_line_tool);
+
 // need to make this db agnostic
 if(!gwvpmini_DBExists($db_name)) {
        if(!is_dir("$data_directory/repos")) mkdir("$data_directory/repos");