On Fri, Apr 14, 2006 at 08:56:51PM +0200, Enrico Forestieri wrote:

> On Fri, Apr 14, 2006 at 09:57:21AM +0200, Georg Baum wrote:
> 
> > Am Mittwoch, 12. April 2006 23:39 schrieb Enrico Forestieri:
> 
> > > Is it sufficient adding a comment? Changing that would require more
> > > than one line for no good...
> > 
> > If you add a comment with the mount output then it would be OK with me.
> 
> I added a comment and also took into account a fix for the separator
> in lib/scripts/TeXFiles.sh. Here SEP is set to ';' or ':' simply based
> on the existence or not of the environment variable COMSPEC.
> But the cygwin tetex uses ':' and COMSPEC is set, as the Windows
> environment in inherited. The fix is quite simple and effective,
> I think, as, instead of guessing, it now ascertains what the correct
> separator is.
> 
> Log:
>       * src/support/os_win32.C
>       (init, latex_path, cygwin_path_fix): Add support for cygwin tetex.
> 
>       * lib/scripts/TeXFiles.sh: Fix setting of path separator SEP.

Argh! Someone changed "RunCommand" to "runCommand". Patch with corrected
case attached. Sorry for not having checked that before.

-- 
Enrico
Index: src/support/os_win32.C
===================================================================
--- src/support/os_win32.C      (revision 13679)
+++ src/support/os_win32.C      (working copy)
@@ -17,6 +17,7 @@
 #include "support/os.h"
 #include "support/os_win32.h"
 #include "support/lstrings.h"
+#include "support/filetools.h"
 
 #include "debug.h"
 
@@ -62,11 +63,22 @@
 using std::endl;
 using std::string;
 
+using lyx::support::runCommand;
+using lyx::support::split;
+
 
 namespace lyx {
 namespace support {
 namespace os {
 
+namespace {
+
+bool cygwin_path_fix_ = false;
+
+string cygdrive = "/cygdrive";
+
+} // namespace anon
+
 void init(int /* argc */, char * argv[])
 {
        /* Note from Angus, 17 Jan 2005:
@@ -146,6 +158,20 @@ void init(int /* argc */, char * argv[])
                if (hwndFound != NULL)
                        ShowWindow( hwndFound, SW_HIDE);
        }
+
+       // If cygwin is detected, query the cygdrive prefix
+       cmd_ret const c = runCommand("sh -c uname");
+       if (c.first != -1 && prefixIs(c.second, "CYGWIN")) {
+               cmd_ret const p = runCommand("mount --show-cygdrive-prefix");
+               // The output of the mount command is as follows:
+               // Prefix              Type         Flags
+               // /cygdrive           system       binmode
+               // So, we use the inner split to pass the second line to the
+               // outer split which sets cygdrive with its contents until
+               // the first blank, discarding the unneeded return value.
+               if (p.first != -1 && prefixIs(p.second, "Prefix"))
+                       (void) split(split(p.second, '\n'), cygdrive, ' ');
+       }
 }
 
 
@@ -230,6 +256,20 @@ string internal_path_list(string const &
 
 string latex_path(string const & p)
 {
+       // We may need a posix style path or a windows style path (depending
+       // on cygwin_path_fix_), but we use always forward slashes, since it
+       // gets written into a .tex file.
+
+       if (cygwin_path_fix_ && is_absolute_path(p)) {
+               string const drive = p.substr(0, 2);
+               string const cygprefix = cygdrive + "/" + drive.substr(0, 1);
+               string const cygpath = subst(subst(p, '\\', '/'), drive, 
cygprefix);
+               lyxerr[Debug::LATEX]
+                       << "<Cygwin path correction> ["
+                       << p << "]->>["
+                       << cygpath << ']' << endl;
+               return cygpath;
+       }
        return subst(p, '\\', '/');
 }
 
@@ -279,8 +319,10 @@ char path_separator()
 }
 
 
-void cygwin_path_fix(bool)
-{}
+void cygwin_path_fix(bool use_cygwin_paths)
+{
+       cygwin_path_fix_ = !use_cygwin_paths;
+}
 
 
 namespace {
Index: lib/scripts/TeXFiles.sh
===================================================================
--- lib/scripts/TeXFiles.sh     (revision 13679)
+++ lib/scripts/TeXFiles.sh     (working copy)
@@ -42,14 +42,13 @@ test -z "$types" && types="cls sty bst b
 
 #
 # MS-DOS and MS-Windows define $COMSPEC or $ComSpec and use ';' to separate
-# directories in path lists whereas Unixes uses ':'.
+# directories in path lists whereas Unixes uses ':'. However, on MS-Windows
+# we should also take into account Cygwin, which uses ':'. So, instead of
+# guessing based on $COMSPEC, we try to directly determine the path separator.
 # $SEP holds the right character to be used by the scripts.
 #
-#???????????????
-# never used this one with windows and what happens with mac??
-#???????????????
-#
-if test -z "$COMSPEC" && test -z "$ComSpec"; then SEP=':'; else SEP=';'; fi
+SEP=`kpsewhich --show-path=.tex 2>/dev/null | sed 's/.*\(;\).*/\1/'`
+if test "$SEP" != ";"; then SEP=':'; fi
 
 #
 # A copy of some stuff from mktex.opt, so we can run in the presence of

Reply via email to