On Sat, Sep 17, 2016 at 10:48:08PM +0200, Enrico Forestieri wrote:

> commit ade098e2896bd9d7d87b3df1a9276661dd3f7c78
> Author: Enrico Forestieri <for...@lyx.org>
> Date:   Sat Sep 17 22:38:27 2016 +0200
> 
>     Improve systemlyxdir handling
>     
>     Do not assume that the /systemlyxdir path prefix in \origin refers
>     to the system directory of the running instance, but check through
>     some heuristics what the real system dir is. In this way, a document
>     in the system dir of any other LyX installation is correctly spotted
>     and the \origin tag properly updated. For example, one can use an
>     installed version of lyx to edit a document in the lib/doc dir of a
>     git repo and obtain the same result as when running lyx in place.

Richard, I think that this most useful in stable, as Uwe seems using that
version for editing docs in the master version.

> ---
>  src/BufferParams.cpp |   41 ++++++++++++++++++++++++++++++++++++++---
>  1 files changed, 38 insertions(+), 3 deletions(-)
> 
> diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp
> index fa95e6a..eff684d 100644
> --- a/src/BufferParams.cpp
> +++ b/src/BufferParams.cpp
> @@ -305,6 +305,35 @@ SpaceTranslator const & spacetranslator()
>       return translator;
>  }
>  
> +
> +bool inSystemDir(FileName const & document_dir, string & system_dir)
> +{
> +     // A document is assumed to be in a system LyX directory (not
> +     // necessarily the system directory of the running instance)
> +     // if both "configure.py" and "chkconfig.ltx" are found in
> +     // either document_dir/../ or document_dir/../../.
> +     // If true, the system directory path is returned in system_dir
> +     // with a trailing path separator.
> +
> +     string const msg = "Checking whether document is in a system dir...";
> +
> +     string dir = document_dir.absFileName();
> +
> +     for (int i = 0; i < 2; ++i) {
> +             dir = addPath(dir, "..");
> +             if (!fileSearch(dir, "configure.py").empty() &&
> +                 !fileSearch(dir, "chkconfig.ltx").empty()) {
> +                     LYXERR(Debug::FILES, msg << " yes");
> +                     system_dir = addPath(FileName(dir).realPath(), "");
> +                     return true;
> +             }
> +     }
> +
> +     LYXERR(Debug::FILES, msg << " no");
> +     system_dir = string();
> +     return false;
> +}
> +
>  } // anon namespace
>  
>  
> @@ -683,8 +712,12 @@ string BufferParams::readToken(Lexer & lex, string const 
> & token,
>               origin = lex.getString();
>               string const sysdirprefix = "/systemlyxdir/";
>               if (prefixIs(origin, sysdirprefix)) {
> -                     origin.replace(0, sysdirprefix.length() - 1,
> -                             package().system_support().absFileName());
> +                     string docsys;
> +                     if (inSystemDir(filepath, docsys))
> +                             origin.replace(0, sysdirprefix.length() - 1, 
> docsys);
> +                     else
> +                             origin.replace(0, sysdirprefix.length() - 1,
> +                                     
> package().system_support().absFileName());
>               }
>       } else if (token == "\\begin_preamble") {
>               readPreamble(lex);
> @@ -1028,8 +1061,10 @@ void BufferParams::writeFile(ostream & os, Buffer 
> const * buf) const
>       // the document directory (must end with a path separator)
>       // realPath() is used to resolve symlinks, while addPath(..., "")
>       // ensures a trailing path separator.
> +     string docsys;
>       string filepath = addPath(buf->fileName().onlyPath().realPath(), "");
> -     string const sysdir = addPath(package().system_support().realPath(), 
> "");
> +     string const sysdir = inSystemDir(FileName(filepath), docsys) ? docsys
> +                     : addPath(package().system_support().realPath(), "");
>       string const relpath =
>               to_utf8(makeRelPath(from_utf8(filepath), from_utf8(sysdir)));
>       if (!prefixIs(relpath, "../") && !FileName::isAbsolute(relpath))

-- 
Enrico

Reply via email to