Hi,

Attached is our long-waited patch that replaces sh by python so that
lyx/win does not have to be bundled with sh, sed etc. I plan to test
and apply this patch (without changes to configure.py) and then
translate shell scripts in lib/scripts one by one (and change
configure.py accordingly).

Question: are these all the necessary changes?

Problem: I do not exactly know what these scripts are doing, and when
they will be called. Angus, I notice that you wrote most of them. Will
you be able to help me test the python version, or better, translate
them into Python?

Cheers,
Bo
Index: src/graphics/GraphicsConverter.C
===================================================================
--- src/graphics/GraphicsConverter.C	(revision 14200)
+++ src/graphics/GraphicsConverter.C	(working copy)
@@ -161,14 +161,15 @@
 
 	// The conversion commands are stored in a stringstream
 	ostringstream script;
-	script << "#!/bin/sh\n";
+	script << "#!/use/bin/env python\n";
+	script << "import os, sys, shutil, glob\n";
 	bool const success = build_script(from_file, to_file_base,
 					  from_format, to_format, script);
 
 	if (!success) {
 		script_command_ =
-			"sh " +
-			quoteName(libFileSearch("scripts", "convertDefault.sh")) +
+			"python " +
+			quoteName(libFileSearch("scripts", "convertDefault.py")) +
 			' ' +
 			quoteName((from_format.empty() ? "" : from_format + ':') + from_file) +
 			' ' +
@@ -188,7 +189,7 @@
 		// Output the script to file.
 		static int counter = 0;
 		script_file_ = onlyPath(to_file_base) + "lyxconvert" +
-			convert<string>(counter++) + ".sh";
+			convert<string>(counter++) + ".py";
 
 		std::ofstream fs(script_file_.c_str());
 		if (!fs.good()) {
@@ -206,7 +207,7 @@
 		// We create a dummy command for ease of understanding of the
 		// list of forked processes.
 		// Note: 'sh ' is absolutely essential, or execvp will fail.
-		script_command_ = "sh " + quoteName(script_file_) + ' ' +
+		script_command_ = "python " + quoteName(script_file_) + ' ' +
 			quoteName(onlyFilename(from_file)) + ' ' +
 			quoteName(to_format);
 	}
@@ -259,21 +260,112 @@
 		return string();
 
 	ostringstream command;
-	command << "fromfile=" << from_file << "\n"
-		<< "tofile="   << to_file << "\n\n"
-		<< "'mv' -f \"${fromfile}\" \"${tofile}\" ||\n"
-		<< "{\n"
-		<< "\t'cp' -f \"${fromfile}\" \"${tofile}\" ||\n"
-		<< "\t{\n"
-		<< "\t\texit 1\n"
-		<< "\t}\n"
-		<< "\t'rm' -f \"${fromfile}\"\n"
-		<< "}\n";
+	command << "fromfile = " << from_file << "\n"
+		<< "tofile = "   << to_file << "\n\n"
+		<< "try:\n"
+		<< "  os.rename(fromfile, tofile)\n"
+		<< "except:\n"
+		<< "  try:\n"
+		<< "    shutil.copy(fromfile, tofile)\n"
+		<< "  except:\n"
+		<< "    sys.exit(1)\n"
+		<< "  os.unlink(fromfile)\n";
 
 	return command.str();
 }
 
 
+/*
+A typical .sh script (old):
+
+infile='/home/bpeng/lyx-devel/lyx-win/lib/doc/mobius.eps'
+infile_base='/home/bpeng/lyx-devel/lyx-win/lib/doc/mobius'
+outfile='/tmp/lyx_tmpdir12763s927TU/gconvert1127639nJZCm.pdf'
+
+epstopdf --outfile="${outfile}" "${infile}" ||
+{
+        'rm' -f "${outfile}"
+        exit 1
+}
+
+if [ ! -f "${outfile}" ]; then
+        if [ -f "${outfile}".0 ]; then
+                'mv' -f "${outfile}".0 "${outfile}"
+                'rm' -f "${outfile}".?
+        else
+                exit 1
+        fi
+fi
+
+infile='/tmp/lyx_tmpdir12763s927TU/gconvert1127639nJZCm.pdf'
+infile_base='/tmp/lyx_tmpdir12763s927TU/gconvert1127639nJZCm'
+outfile='/tmp/lyx_tmpdir12763s927TU/gconvert1127639nJZCm.ppm'
+
+convert "${infile}" "${outfile}" ||
+{
+        'rm' -f "${outfile}"
+        exit 1
+}
+
+if [ ! -f "${outfile}" ]; then
+        if [ -f "${outfile}".0 ]; then
+                'mv' -f "${outfile}".0 "${outfile}"
+                'rm' -f "${outfile}".?
+        else
+                exit 1
+        fi
+fi
+
+'rm' -f "${infile}"
+
+fromfile="${outfile}"
+tofile='/tmp/lyx_tmpdir12763s927TU/mobius12763kagOO5.ppm'
+
+'mv' -f "${fromfile}" "${tofile}" ||
+{
+        'cp' -f "${fromfile}" "${tofile}" ||
+        {
+                exit 1
+        }
+        'rm' -f "${fromfile}"
+}
+
+The new python version is:
+
+#!/use/bin/env python
+import os, sys, shutil, glob
+infile = '/home/bpeng/research/cdcvPaper/Figure3a.pdf'
+infile_base = '/home/bpeng/research/cdcvPaper/Figure3a'
+outfile = '/tmp/lyx_tmpdir12992hUwBqt/gconvert0129929eUBPm.ppm'
+
+if os.system(r'convert ' + '"' + infile + '"' + ' ' + '"' + outfile + '"' + '') != 0:
+  try:
+    os.unlink(outfile)
+  except:
+    pass
+  sys.exit(1)
+
+if not os.path.isfile(outfile):
+  if os.path.isfile(outfile + '.0'):
+    os.rename(outfile + '.0', outfile)
+    for file in glob.glob(outfile + '.?'):
+      os.unlink(file)
+  else:
+    sys.exit(1)
+
+fromfile = outfile
+tofile = '/tmp/lyx_tmpdir12992hUwBqt/Figure3a129927ByaCl.ppm'
+
+try:
+  os.rename(fromfile, tofile)
+except:
+  try:
+    shutil.copy(fromfile, tofile)
+  except:
+    sys.exit(1)
+  os.unlink(fromfile)
+
+*/
 bool build_script(string const & from_file,
 		  string const & to_file_base,
 		  string const & from_format,
@@ -331,48 +423,48 @@
 		outfile = changeExtension(to_base, conv.To->extension());
 
 		// Store these names in the shell script
-		script << "infile="      << quoteName(infile) << '\n'
-		       << "infile_base=" << quoteName(infile_base) << '\n'
-		       << "outfile="     << quoteName(outfile) << '\n';
+		script << "infile = "      << quoteName(infile) << '\n'
+		       << "infile_base = " << quoteName(infile_base) << '\n'
+		       << "outfile = "     << quoteName(outfile) << '\n';
 
 		string command = conv.command;
-		command = subst(command, token_from, "\"${infile}\"");
-		command = subst(command, token_base, "\"${infile_base}\"");
-		command = subst(command, token_to,   "\"${outfile}\"");
+		command = subst(command, token_from, "' + '\"' + infile + '\"' + '");
+		command = subst(command, token_base, "' + '\"' + infile_base + '\"' + '");
+		command = subst(command, token_to,   "' + '\"' + outfile + '\"' + '");
 		command = libScriptSearch(command);
 
 		// Store in the shell script
-		script << "\n" << command << " ||\n";
+		script << "\nif os.system(r'" << command << "') != 0:\n";
 
 		// Test that this was successful. If not, remove
 		// ${outfile} and exit the shell script
-		script << "{\n"
-		       << "\t'rm' -f \"${outfile}\"\n"
-		       << "\texit 1\n"
-		       << "}\n\n";
+		script << "  try:\n"
+           << "    os.unlink(outfile)\n"
+           << "  except:\n"
+           << "    pass\n"
+           << "  sys.exit(1)\n\n";
 
 		// Test that the outfile exists.
 		// ImageMagick's convert will often create ${outfile}.0,
 		// ${outfile}.1.
 		// If this occurs, move ${outfile}.0 to ${outfile}
 		// and delete ${outfile}.?
-		script << "if [ ! -f \"${outfile}\" ]; then\n"
-		       << "\tif [ -f \"${outfile}\".0 ]; then\n"
-		       << "\t\t'mv' -f \"${outfile}\".0 \"${outfile}\"\n"
-		       << "\t\t'rm' -f \"${outfile}\".?\n"
-		       << "\telse\n"
-		       << "\t\texit 1\n"
-		       << "\tfi\n"
-		       << "fi\n\n";
+		script << "if not os.path.isfile(outfile):\n"
+		       << "  if os.path.isfile(outfile + '.0'):\n"
+		       << "    os.rename(outfile + '.0', outfile)\n"
+		       << "    for file in glob.glob(outfile + '.?'):\n"
+		       << "      os.unlink(file)\n"
+		       << "  else:\n"
+		       << "    sys.exit(1)\n\n";
 
 		// Delete the infile, if it isn't the original, from_file.
 		if (infile != from_file) {
-			script << "'rm' -f \"${infile}\"\n\n";
+			script << "os.unlink(infile)\n\n";
 		}
 	}
 
 	// Move the final outfile to to_file
-	script << move_file("\"${outfile}\"", quoteName(to_file));
+	script << move_file("outfile", quoteName(to_file));
 	lyxerr[Debug::GRAPHICS] << "ready!" << endl;
 
 	return true;
Index: src/converter.C
===================================================================
--- src/converter.C	(revision 14200)
+++ src/converter.C	(working copy)
@@ -298,8 +298,8 @@
 				getExtension(from_file) :
 				formats.extension(from_format);
 			string const command =
-				"sh " +
-				quoteName(libFileSearch("scripts", "convertDefault.sh")) +
+				"python " +
+				quoteName(libFileSearch("scripts", "convertDefault.py")) +
 				' ' +
 				quoteName(from_ext + ':' + from_file) +
 				' ' +
Index: src/frontends/controllers/tex_helpers.C
===================================================================
--- src/frontends/controllers/tex_helpers.C	(revision 14200)
+++ src/frontends/controllers/tex_helpers.C	(working copy)
@@ -52,8 +52,8 @@
 	Path p(package().user_support());
 	Systemcall one;
 	one.startscript(Systemcall::Wait,
-			"sh " +
-			quoteName(libFileSearch("scripts", "TeXFiles.sh")));
+			"python " +
+			quoteName(libFileSearch("scripts", "TeXFiles.py")));
 }
 
 
Index: src/support/filetools.h
===================================================================
--- src/support/filetools.h	(revision 14200)
+++ src/support/filetools.h	(working copy)
@@ -98,7 +98,7 @@
 		  std::string const & name,
 		  std::string const & ext = std::string());
 
-/** Takes a command such as "sh $$s/scripts/convertDefault.sh file.in file.out"
+/** Takes a command such as "python $$s/scripts/convertDefault.py file.in file.out"
  *  and replaces "$$s/" with the path to the LyX support directory containing
  *  this script. If the script is not found, "$$s/" is removed. Executing the
  *  command will still fail, but the error message will make some sort of
Index: lib/scripts/convertDefault.py
===================================================================
--- lib/scripts/convertDefault.py	(revision 0)
+++ lib/scripts/convertDefault.py	(revision 0)
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+
+# file convertDefault.py
+# This file is part of LyX, the document processor.
+# Licence details can be found in the file COPYING.
+
+# \author Herbert Voß
+# \author Bo Peng
+
+# Full author contact details are available in file CREDITS.
+
+# The default converter if no other has been defined by the user from the
+# Conversion->Converter tab of the Preferences dialog.
+
+# The user can also redefine this default converter, placing their
+# replacement in ~/.lyx/scripts
+
+# converts an image from $1 to $2 format
+import os, sys
+if os.system(r'convert -depth 8 "%s" "%s"' % (sys.argv[1], sys.argv[2])) != 0:
+  print >> sys.stderr, sys.argv[0], ERROR
+  print >> sys.stderr, 'Execution of "convert" failed.'
+  sys.exit(1)
+

Property changes on: lib/scripts/convertDefault.py
___________________________________________________________________
Name: svn:executable
   + *

Index: lib/scripts/convertDefault.sh
===================================================================
--- lib/scripts/convertDefault.sh	(revision 14200)
+++ lib/scripts/convertDefault.sh	(working copy)
@@ -1,22 +0,0 @@
-#! /bin/sh
-
-# file convertDefault.sh
-# This file is part of LyX, the document processor.
-# Licence details can be found in the file COPYING.
-
-# author Herbert Voß
-
-# Full author contact details are available in file CREDITS.
-
-# The default converter if no other has been defined by the user from the
-# Conversion->Converter tab of the Preferences dialog.
-
-# The user can also redefine this default converter, placing their
-# replacement in ~/.lyx/scripts
-
-# converts an image from $1 to $2 format
-convert -depth 8 "$1" "$2" || {
-	echo "$0 ERROR" >&2
-	echo "Execution of \"convert\" failed." >&2
-	exit 1
-}
Index: lib/configure.py
===================================================================
--- lib/configure.py	(revision 14200)
+++ lib/configure.py	(working copy)
@@ -391,8 +391,8 @@
 \converter date       dateout    "date +%d-%m-%Y > $$o"	""
 \converter docbook    docbook-xml "cp $$i $$o"	"xml"
 \converter fen        asciichess "python $$s/scripts/fen2ascii.py $$i $$o"	""
-\converter fig        pdftex     "sh $$s/scripts/fig2pdftex.sh $$i $$o"	""
-\converter fig        pstex      "sh $$s/scripts/fig2pstex.sh $$i $$o"	""
+\converter fig        pdftex     "sh $$s/scripts/fig2pdftex.py $$i $$o"	""
+\converter fig        pstex      "sh $$s/scripts/fig2pstex.py $$i $$o"	""
 \converter lyx        lyx13x     "python $$s/lyx2lyx/lyx2lyx -t 221 $$i > $$o"	""
 ''')
 
@@ -456,7 +456,7 @@
 \print_spool_command "lpr"''',
       ''])
   # Add the rest of the entries (no checkProg is required)
-  addToRC(r'''\copier    fig        "sh $$s/scripts/fig_copy.sh $$i $$o"
+  addToRC(r'''\copier    fig        "sh $$s/scripts/fig_copy.py $$i $$o"
 \copier    pstex      "python $$s/scripts/tex_copy.py $$i $$o $$l"
 \copier    pdftex     "python $$s/scripts/tex_copy.py $$i $$o $$l"
 ''')




Reply via email to