]> git.lyx.org Git - features.git/commitdiff
Improve systemlyxdir handling
authorEnrico Forestieri <forenr@lyx.org>
Sat, 17 Sep 2016 20:38:27 +0000 (22:38 +0200)
committerEnrico Forestieri <forenr@lyx.org>
Sat, 17 Sep 2016 20:38:27 +0000 (22:38 +0200)
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.

src/BufferParams.cpp

index fa95e6a8f584d38a0685d3e4983ec75bd3c486b8..eff684d42edc91e0cb557ea0b445d97803a4abd6 100644 (file)
@@ -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))