On Wed, Sep 21, 2016 at 10:13:54AM +0100, Jean-Pierre Chrétien wrote:

> Hello,
> 
> I just wanted to edit a minor typo in the recently updated beamer.lyx French
> example file.
> After git pull, I loaded the file with lyx-2.2.2dev (recently up to date),
> make one change ('la' instead of 'le') and saved the file.
> 
> Below is the result of git diff, I'm puzzled because other changes appeared:
>  * change of \origin (not uncommon, how can I avoid it?)

Please, try cherry picking ade098e2 (or apply the attached patch). It is
intended to avoid such issue. I asked Richard about backporting it, but
I have got no reply, yet.

>  * addition of \use microtype false
>  * change of format, seemingly the current format of lyx-2.3

These are strange and I could not reproduce.

-- 
Enrico
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))

Reply via email to