git.pm: Handle operating in sub-trees of a git repository.
authorjoshtriplett <joshtriplett@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>
Thu, 30 Aug 2007 02:32:35 +0000 (02:32 +0000)
committerjoshtriplett <joshtriplett@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>
Thu, 30 Aug 2007 02:32:35 +0000 (02:32 +0000)
When looking for git commits that affect the wiki, only include changes
that affect the ikiwiki source directory. If that is not the top-level
directory in this git repository, strip off the prefix as given by
`git-rev-parse --show-prefix` from all names reported by git-log.

Patch by Jamey Sharp <jamey@minilop.net>.

IkiWiki/Rcs/git.pm

index fcf8994a31b15e372a2f9ba1da85deb524f177ef..9f64b8630dce9c6f8d4f6c08de51ad551fc24c51 100644 (file)
@@ -144,11 +144,11 @@ sub _merge_past ($$$) { #{{{
        return $conflict;
 } #}}}
 
-sub _parse_diff_tree (@) { #{{{
+sub _parse_diff_tree ($@) { #{{{
        # Parse the raw diff tree chunk and return the info hash.
        # See git-diff-tree(1) for the syntax.
 
-       my ($dt_ref) = @_;
+       my ($prefix, $dt_ref) = @_;
 
        # End of stream?
        return if !defined @{ $dt_ref } ||
@@ -230,6 +230,7 @@ sub _parse_diff_tree (@) { #{{{
                        if ($file =~ m/^"(.*)"$/) {
                                ($file=$1) =~ s/\\([0-7]{1,3})/chr(oct($1))/eg;
                        }
+                       $file =~ s/^\Q$prefix\E//;
                        if (length $file) {
                                push @{ $ci{'details'} }, {
                                        'file'      => decode_utf8($file),
@@ -256,10 +257,11 @@ sub git_commit_info ($;$) { #{{{
        $num ||= 1;
 
        my @raw_lines =
-           run_or_die('git-log', "--max-count=$num", '--pretty=raw', '--raw', '--abbrev=40', '--always', '-m', '-r', $sha1);
+           run_or_die('git-log', "--max-count=$num", '--pretty=raw', '--raw', '--abbrev=40', '--always', '-m', '-r', $sha1, '--', '.');
+       my ($prefix) = run_or_die('git-rev-parse', '--show-prefix');
 
        my @ci;
-       while (my $parsed = _parse_diff_tree(\@raw_lines)) {
+       while (my $parsed = _parse_diff_tree(($prefix or ""), \@raw_lines)) {
                push @ci, $parsed;
        }