git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 2/2] difftool --dir-diff: symlink all files matching the working tree

From
David Aguilar <davvid@gmail.com>
Date
Mar 14, 2013, 03:41 UTC
Message-ID
<CAJDDKr5M4pqmd9HSVT8hDJB9AxgV2RexN6B6v6ccTS6raWY_Qg@mail.gmail.com>
In-Reply-To
<796eafb6816b302c87873c8f4a1bd2225ce40c55.1363206651.git.john@keeping.me.uk>
On Wed, Mar 13, 2013 at 1:33 PM, John Keeping <john@keeping.me.uk> wrote:
Show 86 quoted lines
> Some users like to edit files in their diff tool when using "git
> difftool --dir-diff --symlink" to compare against the working tree but
> difftool currently only created symlinks when a file contains unstaged
> changes.
>
> Change this behaviour so that symlinks are created whenever the
> right-hand side of the comparison has the same SHA1 as the file in the
> working tree.
>
> Note that textconv filters are handled in the same way as by git-diff
> and if a clean filter is not the inverse of its smudge filter we already
> get a null SHA1 from "diff --raw" and will symlink the file without
> going through the new hash-object based check.
>
> Reported-by: Matt McClure <matthewlmcclure@gmail.com>
> Signed-off-by: John Keeping <john@keeping.me.uk>
> ---
>  Documentation/git-difftool.txt |  4 +++-
>  git-difftool.perl              | 21 ++++++++++++++++++---
>  t/t7800-difftool.sh            | 14 ++++++++++++++
>  3 files changed, 35 insertions(+), 4 deletions(-)
>
> diff --git a/Documentation/git-difftool.txt b/Documentation/git-difftool.txt
> index e575fea..8361e6e 100644
> --- a/Documentation/git-difftool.txt
> +++ b/Documentation/git-difftool.txt
> @@ -72,7 +72,9 @@ with custom merge tool commands and has the same value as `$MERGED`.
>  --symlinks::
>  --no-symlinks::
>         'git difftool''s default behavior is create symlinks to the
> -       working tree when run in `--dir-diff` mode.
> +       working tree when run in `--dir-diff` mode and the right-hand
> +       side of the comparison yields the same content as the file in
> +       the working tree.
>  +
>  Specifying `--no-symlinks` instructs 'git difftool' to create copies
>  instead.  `--no-symlinks` is the default on Windows.
> diff --git a/git-difftool.perl b/git-difftool.perl
> index 0a90de4..5f093ae 100755
> --- a/git-difftool.perl
> +++ b/git-difftool.perl
> @@ -83,6 +83,21 @@ sub exit_cleanup
>         exit($status | ($status >> 8));
>  }
>
> +sub use_wt_file
> +{
> +       my ($repo, $workdir, $file, $sha1, $symlinks) = @_;
> +       my $null_sha1 = '0' x 40;
> +
> +       if ($sha1 eq $null_sha1) {
> +               return 1;
> +       } elsif (not $symlinks) {
> +               return 0;
> +       }
> +
> +       my $wt_sha1 = $repo->command_oneline('hash-object', "$workdir/$file");
> +       return $sha1 eq $wt_sha1;
> +}
> +
>  sub setup_dir_diff
>  {
>         my ($repo, $workdir, $symlinks) = @_;
> @@ -159,10 +174,10 @@ EOF
>                 }
>
>                 if ($rmode ne $null_mode) {
> -                       if ($rsha1 ne $null_sha1) {
> -                               $rindex .= "$rmode $rsha1\t$dst_path\0";
> -                       } else {
> +                       if (use_wt_file($repo, $workdir, $dst_path, $rsha1, $symlinks)) {
>                                 push(@working_tree, $dst_path);
> +                       } else {
> +                               $rindex .= "$rmode $rsha1\t$dst_path\0";
>                         }
>                 }
>         }
> diff --git a/t/t7800-difftool.sh b/t/t7800-difftool.sh
> index eb1d3f8..8102ce1 100755
> --- a/t/t7800-difftool.sh
> +++ b/t/t7800-difftool.sh
> @@ -370,6 +370,20 @@ test_expect_success PERL 'difftool --dir-diff' '
>         echo "$diff" | stdin_contains file
>  '
>
> +write_script .git/CHECK_SYMLINKS <<\EOF &&

Tiny nit. Is there any downside to leaving this file at the root instead of inside the .git dir?

Show 13 quoted lines
> +#!/bin/sh
> +test -L "$2/file" &&
> +test -L "$2/file2" &&
> +test -L "$2/sub/sub"
> +echo $?
> +EOF
> +
> +test_expect_success PERL,SYMLINKS 'difftool --dir-diff --symlink without unstaged changes' '
> +       result=$(git difftool --dir-diff --symlink \
> +               --extcmd "./.git/CHECK_SYMLINKS" branch HEAD) &&
> +       test "$result" = 0
> +'
> +
How about something like this?
+       echo 0 >expect &&
+       git difftool --dir-diff --symlink \
+               --extcmd ./CHECK_SYMLINKS branch HEAD >actual &&
+       test_cmp expect actual

(sans gmail whitespace damage) so that we can keep it chained with &&. Ah.. it seems your branch is based on master, perhaps?

There's stuff cooking in next for difftool's tests. I'm not sure if this patch is based on top of them. Can you rebase the tests so that the chaining is done like it is in 'next'?

-- 
David
Previous: John KeepingNext: John Keeping
Message 27 of 50 in “difftool -d symlinks, under what conditions”
  1. Matt McClureNov 26, 2012
  2. David AguilarNov 27, 2012
  3. Matt McClureNov 27, 2012
  4. Matt McClureMar 12, 2013
  5. John KeepingMar 12, 2013
  6. David AguilarMar 12, 2013
  7. John KeepingMar 12, 2013
  8. Junio C HamanoMar 12, 2013
  9. John KeepingMar 12, 2013
  10. Junio C HamanoMar 12, 2013
  11. Matt McClureMar 12, 2013
  12. Matt McClureMar 12, 2013
  13. Junio C HamanoMar 12, 2013
  14. Matt McClureMar 12, 2013
  15. John KeepingMar 13, 2013
  16. Matt McClureMar 13, 2013
  17. David AguilarMar 13, 2013
  18. Junio C HamanoMar 13, 2013
  19. Junio C HamanoMar 13, 2013
  20. John KeepingMar 13, 2013
  21. Junio C HamanoMar 13, 2013
  22. John KeepingMar 13, 2013
  23. Junio C HamanoMar 13, 2013
  24. 0/2 difftool --dir-diff: symlink all files matching the working treeJohn Keeping, Mar 13, 2013
  25. 1/2 git-difftool(1): fix formatting of --symlink descriptionJohn Keeping, Mar 13, 2013
  26. 2/2 difftool --dir-diff: symlink all files matching the working treeJohn Keeping, Mar 13, 2013
  27. David AguilarMar 14, 2013
  28. John KeepingMar 14, 2013
  29. Junio C HamanoMar 14, 2013
  30. 0/3 difftool --dir-diff: symlink all files matching the working treeJohn Keeping, Mar 14, 2013
  31. 1/3 git-difftool(1): fix formatting of --symlink descriptionJohn Keeping, Mar 14, 2013
  32. 2/3 difftool: avoid double slashes in symlink targetsJohn Keeping, Mar 14, 2013
  33. Junio C HamanoMar 14, 2013
  34. 3/3 difftool --dir-diff: symlink all files matching the working treeJohn Keeping, Mar 14, 2013
  35. Junio C HamanoMar 14, 2013
  36. John KeepingMar 14, 2013
  37. Junio C HamanoMar 14, 2013
  38. John KeepingMar 14, 2013
  39. John KeepingMar 14, 2013
  40. Junio C HamanoMar 14, 2013
  41. 0/2 checkout-index: fix .gitattributes handling with --prefixJohn Keeping, Mar 14, 2013
  42. 1/2 t2003: modernize styleJohn Keeping, Mar 14, 2013
  43. 2/2 entry: fix filter lookupJohn Keeping, Mar 14, 2013
  44. Junio C HamanoMar 14, 2013
  45. Junio C HamanoMar 12, 2013
  46. John KeepingMar 12, 2013
  47. Matt McClureMar 12, 2013
  48. John KeepingMar 12, 2013
  49. Matt McClureMar 13, 2013
  50. John KeepingMar 13, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.