From 333846ace1ec12152bc645ff59f682825dad8f02 Mon Sep 17 00:00:00 2001 From: Paul J R Date: Mon, 24 Sep 2012 09:15:42 +1000 Subject: [PATCH] figured out how to get commits contained in a pack thanks to cbreak on freenode irc. very useful command. --- bin/gwvpminicmdtool.php | 17 ++++++++++++++- gwvpmini/gwvpmini_gitbackend.php | 40 ++++++++++++++++++++++++++++++++++--- gwvpmini/gwvpmini_gitrepo.php | 6 ++-- www/config.php | 1 + www/index.php | 4 ++- 5 files changed, 58 insertions(+), 10 deletions(-) diff --git a/bin/gwvpminicmdtool.php b/bin/gwvpminicmdtool.php index 3d23011..83bfd06 100644 --- a/bin/gwvpminicmdtool.php +++ b/bin/gwvpminicmdtool.php @@ -3,7 +3,7 @@ $WEB_ROOT_FS = realpath(dirname(__FILE__)); $BASE_URL = "/"; -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; 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"; + passthru("git rev-list --reverse ".$argv[3]." --not --all "); } ?> \ No newline at end of file diff --git a/gwvpmini/gwvpmini_gitbackend.php b/gwvpmini/gwvpmini_gitbackend.php index 6c8b8b5..8b4c1c2 100644 --- a/gwvpmini/gwvpmini_gitbackend.php +++ b/gwvpmini/gwvpmini_gitbackend.php @@ -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"); header_remove("Cache-Control"); @@ -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 { diff --git a/gwvpmini/gwvpmini_gitrepo.php b/gwvpmini/gwvpmini_gitrepo.php index b24e4bd..1da83b9 100644 --- a/gwvpmini/gwvpmini_gitrepo.php +++ b/gwvpmini/gwvpmini_gitrepo.php @@ -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 "$name$desc"; echo ""; error_log("CMD: $cmd"); @@ -95,7 +95,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"; error_log("CMD: $cmd"); //system("$cmd"); $fls = popen($cmd, "r"); @@ -151,7 +151,7 @@ function gwvpmini_GitLogProvider() echo "$name$desc"; echo ""; $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"); diff --git a/www/config.php b/www/config.php index 3549c29..6c195f4 100644 --- a/www/config.php +++ b/www/config.php @@ -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 diff --git a/www/index.php b/www/index.php index c0b765b..acb44a1 100644 --- a/www/index.php +++ b/www/index.php @@ -3,7 +3,7 @@ error_log("INCALLSTART ".print_r($_COOKIE, true)." -------------------- ".print_ $WEB_ROOT_FS = realpath(dirname(__FILE__)); $BASE_URL = dirname($_SERVER["PHP_SELF"]); -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; @@ -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"); -- 1.7.0.4