Richard?
On Sat, Sep 17, 2016 at 11:17:41PM +0200, Enrico Forestieri wrote:
> On Sat, Sep 17, 2016 at 10:48:08PM +0200, Enrico Forestieri wrote:
>
> > commit ade098e2896bd9d7d87b3df1a9276661dd3f7c78
> > Author: Enrico Forestieri
> > 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
--
Enrico