On Fri, Feb 14, 2020 at 09:00:48PM +0100, Stephan Witt wrote:
> Hi all,
> 
> I’ve a problem in LyX master with reverse search I don’t have in 2.3.x.
> Unfortunately I cannot see the difference in LyX code causing it.
> 
> The situation is: on Mac the directory /var is an symlink to private/var.
> So the temporary files are with real path below /private/var/. The SyncTex
> file contains this path name, e.g.
> 
> Input:1:/private/var/folders/1x/zm63s22x7s591xrlgm4rl9v40000gn/T/lyx_tmpdir.pfyyHSvCxUfX/lyx_tmpbuf0/./Tutorial.tex
> 
> But the reverse search script is called with file name:
> 
> /var/folders/1x/zm63s22x7s591xrlgm4rl9v40000gn/T/lyx_tmpdir.pfyyHSvCxUfX/lyx_tmpbuf0/Tutorial.tex
> 
> Some normalization happens here. I’ve changed the lyxeditor script to see the
> call. It’s not
> the operation in line 85 (were sed is used to remove /private from path name).
> 
> To make the GuiView::goToFileRow() implementation more robust I came to the
> attached patch.
> 
> I’m confident it cannot hurt. But as I don’t understand the situation
> completely I ask for comments.
> 
> Stephan

> [-- mutt.octet.filter file type: "unified diff output, ASCII text" --]
> 
> diff --git a/src/frontends/qt/GuiView.cpp b/src/frontends/qt/GuiView.cpp
> index eec1b7ae6e..f215389adc 100644
> --- a/src/frontends/qt/GuiView.cpp
> +++ b/src/frontends/qt/GuiView.cpp
> @@ -3675,9 +3675,17 @@ bool GuiView::goToFileRow(string const & argument)
>               LYXERR0("Wrong argument: " << argument);
>               return false;
>       }
> +     LYXERR(Debug::FILES, "goToFileRow: row " << row << " in file " << 
> file_name);
>       Buffer * buf = 0;
>       string const abstmp = package().temp_dir().absFileName();
> -     string const realtmp = package().temp_dir().realPath();
> +     string realtmp = package().temp_dir().realPath();
> +
> +#ifdef Q_OS_MAC
> +     if (realtmp == abstmp &&
> +             os::path_prefix_is(realtmp,"/private/var/",os::CASE_ADJUSTED)) {
> +             realtmp = realtmp.substr(8);
> +     }
> +#endif
>       // We have to use os::path_prefix_is() here, instead of
>       // simply prefixIs(), because the file name comes from
>       // an external application and may need case adjustment.

I think I don't understand what is the problem. The code snippet you are
changing is as follows:
        ...
        string const abstmp = package().temp_dir().absFileName();
        string const realtmp = package().temp_dir().realPath();
        // We have to use os::path_prefix_is() here, instead of
        // simply prefixIs(), because the file name comes from
        // an external application and may need case adjustment.
        if (os::path_prefix_is(file_name, abstmp, os::CASE_ADJUSTED)
                || os::path_prefix_is(file_name, realtmp, os::CASE_ADJUSTED)) {
                // Needed by inverse dvi search. If it is a file
                // in tmpdir, call the apropriated function.
                // If tmpdir is a symlink, we may have the real
                // path passed back, so we correct for that.
                if (!prefixIs(file_name, abstmp))
                        file_name = subst(file_name, realtmp, abstmp);
                buf = theBufferList().getBufferFromTmp(file_name);
        } else {
        ...

meaning that file_name is compared with both abstmp (with possibly
unexpanded symlink) and realtmp (with expanded symlink). Hence both
cases are considered and your patch should not be needed.

-- 
Enrico
-- 
lyx-devel mailing list
[email protected]
http://lists.lyx.org/mailman/listinfo/lyx-devel

Reply via email to