Re: [LyX/master] Improve systemlyxdir handling

2016-09-22 Thread Enrico Forestieri
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


Re: [LyX/master] Improve systemlyxdir handling

2016-09-17 Thread Enrico Forestieri
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