From: David Aguilar <davvid@gmail.com>
To: "Đoàn Trần Công Danh" <congdanhqx@gmail.com>
Cc: Alan Blotz <work@blotz.org>,
Git Mailing List <git@vger.kernel.org>,
Johannes Schindelin <Johannes.Schindelin@gmx.de>
Subject: Re: git difftool: No such file or directory
Date: Sun, 29 Aug 2021 17:32:28 -0700 [thread overview]
Message-ID: <CAJDDKr6Z9E6MbQReTXtF3k9V8YJ-mv9swgsazdD0eeAA35UY0A@mail.gmail.com> (raw)
In-Reply-To: <YN0N6tUeSJM1EBHD@danh.dev>
On Wed, Jun 30, 2021 at 5:38 PM Đoàn Trần Công Danh
<congdanhqx@gmail.com> wrote:
>
> On 2021-06-30 11:38:21+0200, Alan Blotz <work@blotz.org> wrote:
>
> > Thank you for filling out a Git bug report!
> > Please answer the following questions to help us understand your issue.
> >
> > What did you do before the bug happened? (Steps to reproduce your issue)
> >
> > mkdir broken-diff
> > cd broken-diff
> > git init
> > mkdir dir1
> > mkdir dir2
> > touch dir1/orig
> > cd dir2/
> > ln -s ../dir1/orig sym
> > cd ..
> > git add dir*
> > git ci -m "init"
> > git checkout -b b
> > git rm dir2/sym
> > git ci -m "remove"
> > git difftool -d master HEAD
> >
> > What did you expect to happen? (Expected behavior)
> >
> > git difftool shall compare both branches.
> >
> > What happened instead? (Actual behavior)
> >
> > git difftool prints an error:
> >
> > fatal: could not open '/tmp/git-difftool.l4UM7e/left/dir2/sym' for writing: No such file or directory
>
> It looks like this behaviour was there from the time difftool was
> re-written in C in 03831ef7b5, (difftool: implement the functionality
> in the builtin, 2017-01-19). The perl version didn't have this
> problem.
>
> The perl version create a file in place of that symlink and write the
> symlink's target into that file. The C version tries to write (and
> follow?) the symlink.
>
> This hack can fix the problem but I'm not sure it's correct:
> ----8<---
>
> diff --git a/builtin/difftool.c b/builtin/difftool.c
> index 2115e548a5..737ebb5b1a 100644
> --- a/builtin/difftool.c
> +++ b/builtin/difftool.c
> @@ -492,12 +492,14 @@ static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix,
> if (*entry->left) {
> add_path(&ldir, ldir_len, entry->path);
> ensure_leading_directories(ldir.buf);
> - write_file(ldir.buf, "%s", entry->left);
> + unlink(ldir.buf);
> + write_file_buf(ldir.buf, entry->left, strlen(entry->left));
> }
> if (*entry->right) {
> add_path(&rdir, rdir_len, entry->path);
> ensure_leading_directories(rdir.buf);
> - write_file(rdir.buf, "%s", entry->right);
> + unlink(rdir.buf);
> + write_file_buf(rdir.buf, entry->right, strlen(entry->right));
> }
> }
> ---->8-----
>
> +Cc: Dscho, who wrote the C version.
Thank you for tracking this down!
I re-read the original perl version and this indeed looks like it
should do the trick since it's doing the same thing we did in perl.
I'm a little ashamed that we didn't have a test case to cover this use
case but the reproduction recipe you included looks like a great
start. We already have a few tests that use the SYMLINKS test prereq
so this would slot in well there.
--
David
prev parent reply other threads:[~2021-08-30 0:35 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-30 9:38 git difftool: No such file or directory Alan Blotz
2021-07-01 0:35 ` Đoàn Trần Công Danh
2021-08-30 0:32 ` David Aguilar [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAJDDKr6Z9E6MbQReTXtF3k9V8YJ-mv9swgsazdD0eeAA35UY0A@mail.gmail.com \
--to=davvid@gmail.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=congdanhqx@gmail.com \
--cc=git@vger.kernel.org \
--cc=work@blotz.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).