function git_commitdiff_plain($projectroot, $project, $hash, $hash_parent) { global $tpl; $cachekey = sha1($project) . "|" . $hash . "|" . $hash_parent; header("Content-type: text/plain; charset=UTF-8"); header("Content-disposition: inline; filename=\"git-" . $hash . ".patch\""); if (!$tpl->is_cached('diff_plaintext.tpl', $cachekey)) { $ret = prep_tmpdir(); if ($ret !== TRUE) { echo $ret; return; } $co = git_read_commit($projectroot . $project, $hash); if (!isset($hash_parent)) { $hash_parent = $co['parent']; } $diffout = git_diff_tree($projectroot . $project, $hash_parent . " " . $hash); $difftree = explode("\n", $diffout); $refs = read_info_ref($projectroot . $project, "tags"); $listout = git_read_revlist($projectroot . $project, "HEAD"); foreach ($listout as $i => $rev) { if (isset($refs[$rev])) { $tagname = $refs[$rev]; } if ($rev == $hash) { break; } } $ad = date_str($co['author_epoch'], $co['author_tz']); $tpl->assign("from", $co['author']); $tpl->assign("date", $ad['rfc2822']); $tpl->assign("subject", $co['title']); if (isset($tagname)) { $tpl->assign("tagname", $tagname); } $tpl->assign("url", script_url() . "?p=" . $project . "&a=commitdiff&h=" . $hash); $tpl->assign("comment", $co['comment']); $diffs = array(); foreach ($difftree as $i => $line) { if (preg_match("/^:([0-7]{6}) ([0-7]{6}) ([0-9a-fA-F]{40}) ([0-9a-fA-F]{40}) (.)\t(.*)\$/", $line, $regs)) { if ($regs[5] == "A") { $diffs[] = git_diff($projectroot . $project, null, "/dev/null", $regs[4], "b/" . $regs[6]); } else { if ($regs[5] == "D") { $diffs[] = git_diff($projectroot . $project, $regs[3], "a/" . $regs[6], null, "/dev/null"); } else { if ($regs[5] == "M") { $diffs[] = git_diff($projectroot . $project, $regs[3], "a/" . $regs[6], $regs[4], "b/" . $regs[6]); } } } } } $tpl->assign("diffs", $diffs); } $tpl->display('diff_plaintext.tpl', $cachekey); }
function git_commitdiff($projectroot, $project, $hash, $hash_parent) { global $tpl; $cachekey = sha1($project) . "|" . $hash . "|" . $hash_parent; if (!$tpl->is_cached('commitdiff.tpl', $cachekey)) { $ret = prep_tmpdir(); if ($ret !== TRUE) { echo $ret; return; } $co = git_read_commit($projectroot . $project, $hash); if (!isset($hash_parent)) { $hash_parent = $co['parent']; } $diffout = git_diff_tree($projectroot . $project, $hash_parent . " " . $hash); $difftree = explode("\n", $diffout); $refs = read_info_ref($projectroot . $project); $tpl->assign("hash", $hash); $tpl->assign("tree", $co['tree']); $tpl->assign("hashparent", $hash_parent); $tpl->assign("title", $co['title']); if (isset($refs[$co['id']])) { $tpl->assign("commitref", $refs[$co['id']]); } $tpl->assign("comment", $co['comment']); $difftreelines = array(); foreach ($difftree as $i => $line) { if (preg_match("/^:([0-7]{6}) ([0-7]{6}) ([0-9a-fA-F]{40}) ([0-9a-fA-F]{40}) (.)\t(.*)\$/", $line, $regs)) { $difftreeline = array(); $difftreeline["from_mode"] = $regs[1]; $difftreeline["to_mode"] = $regs[2]; $difftreeline["from_id"] = $regs[3]; $difftreeline["to_id"] = $regs[4]; $difftreeline["status"] = $regs[5]; $difftreeline["file"] = $regs[6]; $difftreeline["from_type"] = file_type($regs[1]); $difftreeline["to_type"] = file_type($regs[2]); if ($regs[5] == "A") { $difftreeline['diffout'] = explode("\n", git_diff($projectroot . $project, null, "/dev/null", $regs[4], "b/" . $regs[6])); } else { if ($regs[5] == "D") { $difftreeline['diffout'] = explode("\n", git_diff($projectroot . $project, $regs[3], "a/" . $regs[6], null, "/dev/null")); } else { if ($regs[5] == "M" && $regs[3] != $regs[4]) { $difftreeline['diffout'] = explode("\n", git_diff($projectroot . $project, $regs[3], "a/" . $regs[6], $regs[4], "b/" . $regs[6])); } } } $difftreelines[] = $difftreeline; } } $tpl->assign("difftreelines", $difftreelines); } $tpl->display('commitdiff.tpl', $cachekey); }
function git_rss($projectroot, $project) { global $tpl; header("Content-type: text/xml; charset=UTF-8"); $cachekey = sha1($project); if (!$tpl->is_cached('rss.tpl', $cachekey)) { $head = git_read_head($projectroot . $project); $revlist = git_read_revlist($projectroot . $project, $head, GITPHP_RSS_ITEMS); $tpl->assign("self", script_url()); $commitlines = array(); $revlistcount = count($revlist); for ($i = 0; $i < $revlistcount; ++$i) { $commit = $revlist[$i]; $co = git_read_commit($projectroot . $project, $commit); if ($i >= 20 && time() - $co['committer_epoch'] > 48 * 60 * 60) { break; } $cd = date_str($co['committer_epoch']); $difftree = array(); $parent = ''; if (!empty($co['parent'])) { $parent = $co['parent']; } $diffout = git_diff_tree($projectroot . $project, $parent . " " . $co['id']); $tok = strtok($diffout, "\n"); while ($tok !== false) { if (preg_match("/^:([0-7]{6}) ([0-7]{6}) ([0-9a-fA-F]{40}) ([0-9a-fA-F]{40}) (.)([0-9]{0,3})\t(.*)\$/", $tok, $regs)) { $difftree[] = $regs[7]; } $tok = strtok("\n"); } $commitline = array(); $commitline["cdmday"] = $cd['mday']; $commitline["cdmonth"] = $cd['month']; $commitline["cdhour"] = $cd['hour']; $commitline["cdminute"] = $cd['minute']; $commitline["title"] = $co['title']; $commitline["author"] = $co['author']; $commitline["cdrfc2822"] = $cd['rfc2822']; $commitline["commit"] = $commit; $commitline["comment"] = $co['comment']; $commitline["difftree"] = $difftree; $commitlines[] = $commitline; } $tpl->assign("commitlines", $commitlines); } $tpl->display('rss.tpl', $cachekey); }
function git_commit($projectroot, $project, $hash) { global $tpl; $cachekey = sha1($project) . "|" . $hash; if (!$tpl->is_cached('commit.tpl', $cachekey)) { $co = git_read_commit($projectroot . $project, $hash); $ad = date_str($co['author_epoch'], $co['author_tz']); $cd = date_str($co['committer_epoch'], $co['committer_tz']); if (isset($co['parent'])) { $root = ""; $parent = $co['parent']; } else { $root = "--root"; $parent = ""; } $diffout = git_diff_tree($projectroot . $project, $root . " " . $parent . " " . $hash, TRUE); $difftree = explode("\n", $diffout); $tpl->assign("hash", $hash); $tpl->assign("tree", $co['tree']); if (isset($co['parent'])) { $tpl->assign("parent", $co['parent']); } $tpl->assign("title", $co['title']); $refs = read_info_ref($projectroot . $project); if (isset($refs[$co['id']])) { $tpl->assign("commitref", $refs[$co['id']]); } $tpl->assign("author", $co['author']); $tpl->assign("adrfc2822", $ad['rfc2822']); $tpl->assign("adhourlocal", $ad['hour_local']); $tpl->assign("adminutelocal", $ad['minute_local']); $tpl->assign("adtzlocal", $ad['tz_local']); $tpl->assign("committer", $co['committer']); $tpl->assign("cdrfc2822", $cd['rfc2822']); $tpl->assign("cdhourlocal", $cd['hour_local']); $tpl->assign("cdminutelocal", $cd['minute_local']); $tpl->assign("cdtzlocal", $cd['tz_local']); $tpl->assign("id", $co['id']); $tpl->assign("repository", preg_replace('/^([a-zA-Z0-9\\-\\_]+).git$/', '$1', $project)); $tpl->assign("parents", $co['parents']); $tpl->assign("comment", $co['comment']); $tpl->assign("difftreesize", count($difftree) + 1); $difftreelines = array(); foreach ($difftree as $i => $line) { if (preg_match("/^:([0-7]{6}) ([0-7]{6}) ([0-9a-fA-F]{40}) ([0-9a-fA-F]{40}) (.)([0-9]{0,3})\t(.*)\$/", $line, $regs)) { $difftreeline = array(); $difftreeline["from_mode"] = $regs[1]; $difftreeline["to_mode"] = $regs[2]; $difftreeline["from_mode_cut"] = substr($regs[1], -4); $difftreeline["to_mode_cut"] = substr($regs[2], -4); $difftreeline["from_id"] = $regs[3]; $difftreeline["to_id"] = $regs[4]; $difftreeline["status"] = $regs[5]; $difftreeline["similarity"] = ltrim($regs[6], "0"); $difftreeline["file"] = $regs[7]; $difftreeline["from_file"] = strtok($regs[7], "\t"); $difftreeline["from_filetype"] = file_type($regs[1]); $difftreeline["to_file"] = strtok("\t"); $difftreeline["to_filetype"] = file_type($regs[2]); if ((octdec($regs[2]) & 0x8000) == 0x8000) { $difftreeline["isreg"] = TRUE; } $modestr = ""; if ((octdec($regs[1]) & 0x17000) != (octdec($regs[2]) & 0x17000)) { $modestr .= " from " . file_type($regs[1]) . " to " . file_type($regs[2]); } if ((octdec($regs[1]) & 0777) != (octdec($regs[2]) & 0777)) { if (octdec($regs[1]) & 0x8000 && octdec($regs[2]) & 0x8000) { $modestr .= " mode: " . (octdec($regs[1]) & 0777) . "->" . (octdec($regs[2]) & 0777); } else { if (octdec($regs[2]) & 0x8000) { $modestr .= " mode: " . (octdec($regs[2]) & 0777); } } } $difftreeline["modechange"] = $modestr; $simmodechg = ""; if ($regs[1] != $regs[2]) { $simmodechg .= ", mode: " . (octdec($regs[2]) & 0777); } $difftreeline["simmodechg"] = $simmodechg; $difftreelines[] = $difftreeline; } } $tpl->assign("difftreelines", $difftreelines); } $tpl->display('commit.tpl', $cachekey); }