commit ae0679926e46295272228c90ef81c7bcd4b4b879
Author: Enrico Forestieri <[email protected]>
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.
    
    (cherry picked from commit ade098e2896bd9d7d87b3df1a9276661dd3f7c78)
---
 src/BufferParams.cpp |   41 ++++++++++++++++++++++++++++++++++++++---
 status.22x           |    4 +++-
 2 files changed, 41 insertions(+), 4 deletions(-)

diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp
index a8c0a49..6af82c1 100644
--- a/src/BufferParams.cpp
+++ b/src/BufferParams.cpp
@@ -304,6 +304,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
 
 
@@ -681,8 +710,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);
@@ -1024,8 +1057,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))
diff --git a/status.22x b/status.22x
index 2645994..dde374f 100644
--- a/status.22x
+++ b/status.22x
@@ -15,7 +15,9 @@ What's new
 
 * DOCUMENT INPUT/OUTPUT
 
-- .xlsx is now a suggested extension in the spreadsheet external template
+- .xlsx is now a suggested extension in the spreadsheet external template.
+
+- Improve systemlyxdir handling.
 
 
 * TEX2LYX IMPROVEMENTS

Reply via email to