X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=htdocs%2Flib%2FGitCommand.class.php;h=86174b5e6e29551eba91a7757378208d913fe9eb;hb=5a1b314c0a0ab8ed9be7b857c7996d8a3f87e7ed;hp=cb63050a46612cd0f1569ffd885d9fb8b2b6efdc;hpb=27626297549b51277777302328ce6e793b6e5e17;p=phpgitweb.git diff --git a/htdocs/lib/GitCommand.class.php b/htdocs/lib/GitCommand.class.php index cb63050..86174b5 100644 --- a/htdocs/lib/GitCommand.class.php +++ b/htdocs/lib/GitCommand.class.php @@ -124,7 +124,7 @@ class GitCommand { } public static function get_commit($git_path, $commit_id) { - $args = array("rev-list", "--header", "--max-count=1", $commit_id, "--"); + $args = array("rev-list", "--header", "--max-count=1", ($commit_id ? $commit_id : "--all"), "--"); $commit_data = self::git_execute($args, $git_path); $commit = self::parse_commit($commit_data); return $commit; @@ -138,4 +138,117 @@ class GitCommand { return null; } + private static function parse_difftree($line) { + $entry = array(); + if(preg_match('/^:([0-7]{6}) ([0-7]{6}) ([0-9a-fA-F]{40}) ([0-9a-fA-F]{40}) (.)([0-9]{0,3})\t(.*)$/i', $line, $matches)) { + $entry['parents'] = 1; + $entry['from_mode'] = $matches[1]; + $entry['to_mode'] = $matches[2]; + $entry['from_id'] = $matches[3]; + $entry['to_id'] = $matches[4]; + $entry['status'] = $matches[5]; + $entry['similarity'] = $matches[6]; + $entry['file'] = $matches[7]; + if($entry['status'] == 'R' || $entry['status'] == 'C') { //renamed or copied + $files = explode("\t", $entry['file']); + $entry['from_file'] = $files[0]; + $entry['to_file'] = $files[1]; + } else + $entry['from_file'] = $entry['to_file'] = $entry['file']; + } else if(preg_match('/^(::+)((?:[0-7]{6} )+)((?:[0-9a-fA-F]{40} )+)([a-zA-Z]+)\t(.*)$/i', $line, $matches)) { + $entry['parents'] = strlen($matches[1]); + $from_modes = explode(" ", $matches[2]); + $entry['from_mode'] = array_slice($from_modes, 1, -1); + $entry['to_mode'] = $from_modes[0]; + $from_ids = explode(" ", $matches[3]); + $entry['from_id'] = array_slice($from_ids, 1, -1); + $entry['to_id'] = $from_ids[0]; + $entry['status'] = str_split($matches[4]); + $entry['file'] = $entry['from_file'] = $entry['to_file'] = $matches[5]; + } + return $entry; + } + + public static function get_commit_changes($git_path, $commit_id, $parents) { + $args = array("diff-tree", "-r", "--no-commit-id"); + switch(GitConfig::DETECT_RENAME_LEVEL) { + case 0: + $args[] = "-M"; + break; + case 1: + $args[] = "-C"; + break; + case 2: + $args[] = "-C"; + $args[] = "--find-copies-harder"; + break; + } + if(GitConfig::DETECT_REWRITES) + $args[] = "-B"; + if(is_array($parents) && count($parents) > 1) + $args[] = "-c"; + else if(is_array($parents) && count($parents) == 1) + $args[] = $parents[0]; + else + $args[] = "--root"; + $args[] = $commit_id; + $args[] = "--"; + $result = self::git_execute($args, $git_path); + $tree = array(); + foreach(explode("\n", $result) as $line) { + if($line == "") + continue; + $tree[] = self::parse_difftree($line); + } + return $tree; + } + + public static function get_commit_diff($git_path, $commit_id, $parents) { + $args = array("diff-tree", "-r", "--no-commit-id", "--patch-with-raw", "--full-index"); + switch(GitConfig::DETECT_RENAME_LEVEL) { + case 0: + $args[] = "-M"; + break; + case 1: + $args[] = "-C"; + break; + case 2: + $args[] = "-C"; + $args[] = "--find-copies-harder"; + break; + } + if(GitConfig::DETECT_REWRITES) + $args[] = "-B"; + if(is_array($parents) && count($parents) > 1) + $args[] = "--cc"; + else if(is_array($parents) && count($parents) == 1) + $args[] = $parents[0]; + else + $args[] = "--root"; + $args[] = $commit_id; + $args[] = "--"; + $result = self::git_execute($args, $git_path); + $tree = array(); + $diffs = array(); + $diff = null; + $parse_difftree = true; + foreach(explode("\n", $result) as $line) { + if($line == "" && $parse_difftree) + $parse_difftree = false; + else if($parse_difftree) + $tree[] = self::parse_difftree($line); + else { + if(preg_match('/^diff/i', $line)) { + if($diff) + $diffs[] = $diff; + $diff = array(); + } + $diff[] = $line; + } + } + if($diff) + $diffs[] = $diff; + $diff_data['tree'] = $tree; + return array('tree' => $tree, 'diffs' => $diffs); + } }