On Fri, Oct 28, 2011 at 01:51:49PM +0200, for...@lyx.org wrote:

> Author: forenr
> Date: Fri Oct 28 13:51:48 2011
> New Revision: 40049
> URL: http://www.lyx.org/trac/changeset/40049
> 
> Log:
> Detect the correct version of python at runtime and store the result
> for later calls. The check is only performed on the major version
> number, such as to avoid using python 3.

What about branch?

> Modified:
>    lyx-devel/trunk/src/support/Systemcall.cpp
>    lyx-devel/trunk/src/support/os.cpp
> 
> Modified: lyx-devel/trunk/src/support/Systemcall.cpp
> ==============================================================================
> --- lyx-devel/trunk/src/support/Systemcall.cpp        Fri Oct 28 10:41:43 
> 2011        (r40048)
> +++ lyx-devel/trunk/src/support/Systemcall.cpp        Fri Oct 28 13:51:48 
> 2011        (r40049)
> @@ -100,8 +100,13 @@
>  int Systemcall::startscript(Starttype how, string const & what,
>                           std::string const & path, bool /*process_events*/)
>  {
> -     string command =
> -             to_filesystem8bit(from_utf8(latexEnvCmdPrefix(path))) + what;
> +     string const python_call = "python -tt";
> +     string command = to_filesystem8bit(from_utf8(latexEnvCmdPrefix(path)));
> +
> +     if (prefixIs(what, python_call))
> +             command += os::python() + what.substr(python_call.length());
> +     else
> +             command += what;
>  
>       if (how == DontWait) {
>               switch (os::shell()) {
> @@ -162,9 +167,16 @@
>       bool in_single_quote = false;
>       bool in_double_quote = false;
>       bool escaped = false;
> +     string const python_call = "python -tt";
>       string cmd;
> +     int start = 0;
> +
> +     if (prefixIs(inputcmd, python_call)) {
> +             cmd = os::python();
> +             start = python_call.length();
> +     }
>  
> -     for (size_t i = 0; i < inputcmd.length(); ++i) {
> +     for (size_t i = start; i < inputcmd.length(); ++i) {
>               char c = inputcmd[i];
>               if (c == '\'') {
>                       if (in_double_quote || escaped) {
> 
> Modified: lyx-devel/trunk/src/support/os.cpp
> ==============================================================================
> --- lyx-devel/trunk/src/support/os.cpp        Fri Oct 28 10:41:43 2011        
> (r40048)
> +++ lyx-devel/trunk/src/support/os.cpp        Fri Oct 28 13:51:48 2011        
> (r40049)
> @@ -4,13 +4,19 @@
>   * Licence details can be found in the file COPYING.
>   *
>   * \author Ruurd A. Reitsma
> + * \author Enrico Forestieri
>   *
>   * Full author contact details are available in file CREDITS.
>   */
>  
>  #include <config.h>
>  
> -#if defined(__CYGWIN__) || defined(__CYGWIN32__)
> +#include "filetools.h"
> +#include "qstring_helpers.h"
> +
> +#include <QDir>
> +
> +#if defined(__CYGWIN__)
>  #include "support/os_cygwin.cpp"
>  #elif defined(_WIN32)
>  #include "support/os_win32.cpp"
> @@ -31,11 +37,57 @@
>  namespace support {
>  namespace os {
>  
> +static string const python2(string const & binary, bool verbose = false)
> +{
> +     if (verbose)
> +             lyxerr << "Examining " << binary << "\n";
> +
> +     // Check whether this is a python 2 binary.
> +     cmd_ret const out = runCommand(binary + " -V 2>&1");
> +     if (out.first < 0 || !prefixIs(out.second, "Python 2"))
> +             return string();
> +
> +     if (verbose)
> +             lyxerr << "Found " << out.second << "\n";
> +     return binary;
> +}
> +
> +
>  string const python()
>  {
> -     // Use the -tt switch so that mixed tab/whitespace indentation is
> -     // an error
> -     static string const command("python -tt");
> +     // Check whether the first python in PATH is the right one.
> +     static string command = python2("python -tt");
> +
> +     if (command.empty()) {
> +             // It was not, so check whether we can find it elsewhere in
> +             // PATH, maybe with some suffix appended.
> +             vector<string> const path = getEnvPath("PATH");
> +             vector<string>::const_iterator it = path.begin();
> +             vector<string>::const_iterator const end = path.end();
> +             lyxerr << "Looking for python v2.x ...\n";
> +             for (; it != end; ++it) {
> +                     QString const dir = toqstr(*it);
> +                     string const localdir = dir.toLocal8Bit().constData();
> +                     QDir qdir(dir);
> +                     qdir.setFilter(QDir::Files | QDir::Executable);
> +                     QStringList list = 
> qdir.entryList(QStringList("python*"));
> +                     for (int i = 0; i < list.size() && command.empty(); 
> ++i) {
> +                             string const binary = addName(localdir,
> +                                     list.at(i).toLocal8Bit().constData());
> +                             command = python2(binary, true);
> +                     }
> +             }
> +
> +             // Default to "python" if no usable binary was found.
> +             if (command.empty()) {
> +                     lyxerr << "Warning: No python v2.x binary found.\n";
> +                     command = "python";
> +             }
> +
> +             // Add the -tt switch so that mixed tab/whitespace
> +             // indentation is an error
> +             command += " -tt";
> +     }
>       return command;
>  }
>  

-- 
Enrico

Reply via email to