On Wed, Oct 26, 2011 at 03:20:09PM +0200, Enrico Forestieri wrote:
> On Wed, Oct 26, 2011 at 12:04:08PM +0000, Julien Rioux wrote:
> 
> > Can somebody with more know-how do this?
> 
> If you mean runtime detection, I could try to do it.

Please try the attached patch.

-- 
Enrico
Index: src/support/os.cpp
===================================================================
--- src/support/os.cpp  (revisione 40014)
+++ src/support/os.cpp  (copia locale)
@@ -10,6 +10,11 @@
 
 #include <config.h>
 
+#include "filetools.h"
+#include "qstring_helpers.h"
+
+#include <QDir>
+
 #if defined(__CYGWIN__) || defined(__CYGWIN32__)
 #include "support/os_cygwin.cpp"
 #elif defined(_WIN32)
@@ -31,11 +36,64 @@ namespace lyx {
 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";
+               } else {
+                       string const ext =
+                               ascii_lowercase(getExtension(command));
+                       string const pathext =
+                               ascii_lowercase(getEnv("PATHEXT"));
+                       if (contains(pathext, ext))
+                               removeExtension(command);
+               }
+
+               // Add the -tt switch so that mixed tab/whitespace
+               // indentation is an error
+               command += " -tt";
+       }
        return command;
 }
 

Reply via email to