On Tue, Mar 12, 2013 at 12:23:52PM -0700, David Aguilar wrote:
> I don't think we could do this without adding an additional flag
> to trigger this change in behavior (e.g. --null-sha1-for-....?)
> so that existing users are unaffected by the change.
> 
> It feels like forcing the null SHA-1 is heavy-handed, but I
> haven't thought it through enough.
> 
> While this may be a quick way to get this behavior,
> I wonder if there is a better way.
> 
> Does anybody else have any comments/suggestions on how to
> better accomplish this?

How about something like "--symlink-all" where the everything in the
right-hand tree is symlink'd?

Something like this perhaps:

-- >8 --
diff --git a/git-difftool.perl b/git-difftool.perl
index 0a90de4..cab7c45 100755
--- a/git-difftool.perl
+++ b/git-difftool.perl
@@ -85,7 +85,7 @@ sub exit_cleanup
 
 sub setup_dir_diff
 {
-       my ($repo, $workdir, $symlinks) = @_;
+       my ($repo, $workdir, $symlinks, $symlink_all) = @_;
 
        # Run the diff; exit immediately if no diff found
        # 'Repository' and 'WorkingCopy' must be explicitly set to insure that
@@ -159,10 +159,10 @@ EOF
                }
 
                if ($rmode ne $null_mode) {
-                       if ($rsha1 ne $null_sha1) {
-                               $rindex .= "$rmode $rsha1\t$dst_path\0";
-                       } else {
+                       if ($symlink_all or $rsha1 eq $null_sha1) {
                                push(@working_tree, $dst_path);
+                       } else {
+                               $rindex .= "$rmode $rsha1\t$dst_path\0";
                        }
                }
        }
@@ -299,6 +299,7 @@ sub main
                prompt => undef,
                symlinks => $^O ne 'cygwin' &&
                                $^O ne 'MSWin32' && $^O ne 'msys',
+               symlink_all => undef,
                tool_help => undef,
        );
        GetOptions('g|gui!' => \$opts{gui},
@@ -308,6 +309,7 @@ sub main
                'y' => sub { $opts{prompt} = 0; },
                'symlinks' => \$opts{symlinks},
                'no-symlinks' => sub { $opts{symlinks} = 0; },
+               'symlink-all' => \$opts{symlink_all},
                't|tool:s' => \$opts{difftool_cmd},
                'tool-help' => \$opts{tool_help},
                'x|extcmd:s' => \$opts{extcmd});
@@ -346,7 +348,7 @@ sub main
        # will invoke a separate instance of 'git-difftool--helper' for
        # each file that changed.
        if (defined($opts{dirdiff})) {
-               dir_diff($opts{extcmd}, $opts{symlinks});
+               dir_diff($opts{extcmd}, $opts{symlinks}, $opts{symlink_all});
        } else {
                file_diff($opts{prompt});
        }
@@ -354,13 +356,13 @@ sub main
 
 sub dir_diff
 {
-       my ($extcmd, $symlinks) = @_;
+       my ($extcmd, $symlinks, $symlink_all) = @_;
        my $rc;
        my $error = 0;
        my $repo = Git->repository();
        my $workdir = find_worktree($repo);
        my ($a, $b, $tmpdir, @worktree) =
-               setup_dir_diff($repo, $workdir, $symlinks);
+               setup_dir_diff($repo, $workdir, $symlinks, $symlink_all);
 
        if (defined($extcmd)) {
                $rc = system($extcmd, $a, $b);
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to