read-tree -m -u: avoid getting confused by intermediate symlinks.
[gitweb.git] / gitweb / gitweb.perl
index b3e2e07a2bd06659dc602fcbdd57fb43b21c3fab..21864c62a9092394a473d89ac98848e170ceab02 100755 (executable)
@@ -458,10 +458,16 @@ sub evaluate_path_info {
        "project_index" => \&git_project_index,
 );
 
-if (defined $project) {
-       $action ||= 'summary';
-} else {
-       $action ||= 'project_list';
+if (!defined $action) {
+       if (defined $hash) {
+               $action = git_get_type($hash);
+       } elsif (defined $hash_base && defined $file_name) {
+               $action = git_get_type("$hash_base:$file_name");
+       } elsif (defined $project) {
+               $action = 'summary';
+       } else {
+               $action = 'project_list';
+       }
 }
 if (!defined($actions{$action})) {
        die_error(undef, "Unknown action");
@@ -4026,14 +4032,13 @@ sub git_commit {
                $parent = "--root";
        }
        my @difftree;
-       if (@$parents <= 1) {
-               # difftree output is not printed for merges
-               open my $fd, "-|", git_cmd(), "diff-tree", '-r', "--no-commit-id",
-                       @diff_opts, $parent, $hash, "--"
-                       or die_error(undef, "Open git-diff-tree failed");
-               @difftree = map { chomp; $_ } <$fd>;
-               close $fd or die_error(undef, "Reading git-diff-tree failed");
-       }
+       open my $fd, "-|", git_cmd(), "diff-tree", '-r', "--no-commit-id",
+               @diff_opts,
+               (@$parents <= 1 ? $parent : '-c'),
+               $hash, "--"
+               or die_error(undef, "Open git-diff-tree failed");
+       @difftree = map { chomp; $_ } <$fd>;
+       close $fd or die_error(undef, "Reading git-diff-tree failed");
 
        # non-textual hash id's can be cached
        my $expires;
@@ -4111,10 +4116,7 @@ sub git_commit {
        git_print_log($co{'comment'});
        print "</div>\n";
 
-       if (@$parents <= 1) {
-               # do not output difftree/whatchanged for merges
-               git_difftree_body(\@difftree, $hash, $parent);
-       }
+       git_difftree_body(\@difftree, $hash, @$parents);
 
        git_footer_html();
 }
@@ -4391,8 +4393,10 @@ sub git_commitdiff {
                }
        }
 
+       my $hash_parent_param = $hash_parent;
        if (!defined $hash_parent) {
-               $hash_parent = $co{'parent'} || '--root';
+               $hash_parent_param =
+                       @{$co{'parents'}} > 1 ? '-c' : $co{'parent'} || '--root';
        }
 
        # read commitdiff
@@ -4401,7 +4405,7 @@ sub git_commitdiff {
        if ($format eq 'html') {
                open $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts,
                        "--no-commit-id", "--patch-with-raw", "--full-index",
-                       $hash_parent, $hash, "--"
+                       $hash_parent_param, $hash, "--"
                        or die_error(undef, "Open git-diff-tree failed");
 
                while (my $line = <$fd>) {
@@ -4413,7 +4417,7 @@ sub git_commitdiff {
 
        } elsif ($format eq 'plain') {
                open $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts,
-                       '-p', $hash_parent, $hash, "--"
+                       '-p', $hash_parent_param, $hash, "--"
                        or die_error(undef, "Open git-diff-tree failed");
 
        } else {
@@ -4469,10 +4473,10 @@ sub git_commitdiff {
 
        # write patch
        if ($format eq 'html') {
-               git_difftree_body(\@difftree, $hash, $hash_parent);
+               git_difftree_body(\@difftree, $hash, $hash_parent || @{$co{'parents'}});
                print "<br/>\n";
 
-               git_patchset_body($fd, \@difftree, $hash, $hash_parent);
+               git_patchset_body($fd, \@difftree, $hash, $hash_parent || @{$co{'parents'}});
                close $fd;
                print "</div>\n"; # class="page_body"
                git_footer_html();