X-Git-Url: http://git.pjr.cc/?p=gwvp-mini.git;a=blobdiff_plain;f=gwvpmini%2Fgwvpmini_gitbackend.php;h=5fe188ab3bd5ef3de2bc58404cf09039e9c12487;hp=27ccee7b1d97cf06e5528f9ebfc9909ca3fd2e09;hb=1801e714ec1393dfe1a8a35aa22429eb8483ef4a;hpb=a48b0aeb6ebace96e4da61738641b87ff4240c5f diff --git a/gwvpmini/gwvpmini_gitbackend.php b/gwvpmini/gwvpmini_gitbackend.php index 27ccee7..5fe188a 100644 --- a/gwvpmini/gwvpmini_gitbackend.php +++ b/gwvpmini/gwvpmini_gitbackend.php @@ -223,7 +223,7 @@ function gwvpmini_canManageRepo($userid, $repoid) } -// TODO: this whole bit needs a re-write +// TODO: this whole bit needs a re-write - seriously, like totally! function gwvpmini_callGitBackend($username, $repo) { // this is where things become a nightmare @@ -287,16 +287,8 @@ function gwvpmini_callGitBackend($username, $repo) $headers = getallheaders(); - error_log("path trans'd is /$repo_base/$repo.git/$euri from $ruri with ".$_REQUEST["q"]." $strrem pre is ".print_r($_REQUEST,true)." and foff ".print_r($headers, true)); + //error_log("path trans'd is /$repo_base/$repo.git/$euri from $ruri with ".$_REQUEST["q"]." $strrem pre is ".print_r($_REQUEST,true)." and foff ".print_r($headers, true)); - if(isset($headers["Content-Encoding"])) { - if($headers["Content-Encoding"] == "gzip") { - error_log("DAM YOU GIT CLIENT"); - } - } - - - $pwd = "/$repo_base/"; $proc = proc_open("/usr/lib/git-core/git-http-backend", array(array("pipe","rb"),array("pipe","wb"),array("file","/tmp/err", "a")), $pipes, $pwd, $procenv); @@ -331,31 +323,41 @@ function gwvpmini_callGitBackend($username, $repo) $stlimit = 0; - $fp = fopen("/tmp/gitup.".rand(0,4000000), "w"); + //$fp = fopen("/tmp/gitup.".rand(0,4000000), "w"); + $from_client_data = ""; // i was going to use stream_select, but i feel this works better like this while($continue) { // do client + + // lets start again.... + if(!feof($fh)) { - $from_client_data = fread($fh,8192); + if(isset($headers["Content-Length"])) { + $cl = $headers["Content-Length"]; + while(strlen($from_client_data) < $cl) { + error_log("re-read ".strlen($from_client_data)); + $from_client_data .= fread($fh, $cl); + } + } else $from_client_data = fread($fh,8192); - // TODO: BIG TODO: must rewrite this bit. I need to read the entire client bit if its posting in one piece so i can then decode. - // if the client sends more then 8192, i could be very well screwed. must handle content-length on read... + // TODO: BIG TODO: must rewrite this bit. its ugly as sin, it works, but it probably shouldnt. if(isset($headers["Content-Encoding"])) { if($headers["Content-Encoding"] == "gzip") { //error_log("DAM YOU GIT CLIENT and your retarded gzip encoding"); $from_client_data = gzinflate(substr($from_client_data, 10)); + //$from_client_data = gzdecode($from_client_data); } } if($from_client_data !== false) { fwrite($pipes[0], $from_client_data); - fwrite($fp, $from_client_data); + //fwrite($fp, $from_client_data); } fflush($pipes[0]); //fwrite($fl, $from_client_data); $client_len = strlen($from_client_data); } else { - error_log("client end"); + //error_log("client end"); $client_len = 0; //$continue = false; } @@ -379,17 +381,20 @@ function gwvpmini_callGitBackend($username, $repo) // or something the git-http-backend thing is doing.. // TODO: find out why this happens $from_cgi_data = preg_replace("/^\r\n/", "", $from_cgi_data_t); + /* if(strlen($from_cgi_data)!=strlen($from_cgi_data_t)) { error_log("MOOOKS - we did trunc"); } else { error_log("MOOOKS - we did not trunc"); - } + }*/ $firstline = false; } } - if($from_cgi_data !== false) { + if($from_cgi_data !== false && $from_cgi_data != "") { + //error_log("send to client of size ".strlen($from_cgi_data)); echo $from_cgi_data; + ob_flush(); flush(); } $cgi_len = strlen($from_cgi_data); @@ -398,22 +403,23 @@ function gwvpmini_callGitBackend($username, $repo) $cgi_len = 0; } + flush(); + if(feof($pipes[1])) $continue = false; else { if($client_len == 0 && $cgi_len == 0) { usleep(200000); - error_log("sleep tick"); + //error_log("sleep tick"); $stlimit++; - if($stlimit > 50) $continue = false; + if($stlimit > 300) $continue = false; // if we get no output from git backend after 1 minute, we close..... something went wrong } else { $stlimit = 0; - error_log("sizes: $client_len, $cgi_len"); + //error_log("sizes: $client_len, $cgi_len"); if($cgi_len > 0) { - error_log("from cgi: \"$from_cgi_data\""); + //error_log("from cgi: \"$from_cgi_data\""); } } } - } @@ -462,7 +468,7 @@ function gwvpmini_createGitRepo($name, $ownerid, $desc, $defperms, $clonefrom, $ $rn = gwvpmini_getRepo(null, $name, null); $rid = $rn["id"]; gwvpmini_SetRepoCloning($rid); - gwvpmini_SendMessage("info", "Background clone initiated for $name ($rid) from $clonefrom... your repo will be available once the background clone is finished"); + gwvpmini_SendMessageByDb("info", "Background clone initiated for $name ($rid) from $clonefrom... your repo will be available once the background clone is finished", $ownerid); return false; } } else { @@ -480,4 +486,5 @@ function gwvpmini_createGitRepo($name, $ownerid, $desc, $defperms, $clonefrom, $ return true; } + ?> \ No newline at end of file