0

Reworked handling of bare consoles

Now the "Please run overviewer from the command line" message will
only be displayed in select cases.  This supports cases when users
want to give all the correct arguments to overviewer via a shortcut
or something similar.  In these cases, a 'Press [enter] to close
this window' message will still be displayed.
This commit is contained in:
Andrew Chin
2011-11-25 16:13:36 -05:00
parent 2dcf22294f
commit 59c1812154

View File

@@ -24,18 +24,15 @@ if not (sys.version_info[0] == 2 and sys.version_info[1] >= 6):
print "and will not run on Python 3.0 or later" print "and will not run on Python 3.0 or later"
sys.exit(1) sys.exit(1)
isBareConsole = False
if platform.system() == 'Windows': if platform.system() == 'Windows':
try: try:
import ctypes import ctypes
GetConsoleProcessList = ctypes.windll.kernel32.GetConsoleProcessList GetConsoleProcessList = ctypes.windll.kernel32.GetConsoleProcessList
num = GetConsoleProcessList(ctypes.byref(ctypes.c_int(0)), ctypes.c_int(1)) num = GetConsoleProcessList(ctypes.byref(ctypes.c_int(0)), ctypes.c_int(1))
if (num == 1): if (num == 1):
print "The Overviewer is a console program. Please open a Windows command prompt" isBareConsole = True
print "first and run Overviewer from there. Further documentation is available at"
print "http://docs.overviewer.org/\n"
print "Press [Enter] to close this window."
raw_input()
sys.exit(1)
except Exception: except Exception:
pass pass
@@ -49,6 +46,35 @@ import time
import logging import logging
from overviewer_core import util from overviewer_core import util
def doExit(msg=None, code=1, wait=None, consoleMsg=True):
'''Exits Overviewer. If `wait` is None, the default
will be true is 'isBareConsole' is true'''
global isBareConsole
if msg:
print msg
if wait == None:
if isBareConsole:
if consoleMsg:
print "\n"
print "The Overviewer is a console program. Please open a Windows command prompt"
print "first and run Overviewer from there. Further documentation is available at"
print "http://docs.overviewer.org/\n"
print "Press [Enter] to close this window."
raw_input()
else:
if wait:
if consoleMsg:
print "\n"
print "The Overviewer is a console program. Please open a Windows command prompt"
print "first and run Overviewer from there. Further documentation is available at"
print "http://docs.overviewer.org/\n"
print "Press [Enter] to close this window."
raw_input()
sys.exit(code)
this_dir = util.get_program_path() this_dir = util.get_program_path()
# make sure the c_overviewer extension is available # make sure the c_overviewer extension is available
@@ -61,7 +87,7 @@ except ImportError:
print "Something has gone wrong importing the c_overviewer extension. Please" print "Something has gone wrong importing the c_overviewer extension. Please"
print "make sure the 2008 and 2010 redistributable packages from Microsoft" print "make sure the 2008 and 2010 redistributable packages from Microsoft"
print "are installed." print "are installed."
sys.exit(1) doExit()
## try to find the build extension ## try to find the build extension
@@ -69,7 +95,7 @@ except ImportError:
if os.path.exists(ext): if os.path.exists(ext):
print "Something has gone wrong importing the c_overviewer extension. Please" print "Something has gone wrong importing the c_overviewer extension. Please"
print "make sure it is up-to-date (clean and rebuild)" print "make sure it is up-to-date (clean and rebuild)"
sys.exit(1) doExit()
import traceback import traceback
traceback.print_exc() traceback.print_exc()
@@ -77,7 +103,7 @@ except ImportError:
print "" print ""
print "You need to compile the c_overviewer module to run Minecraft Overviewer." print "You need to compile the c_overviewer module to run Minecraft Overviewer."
print "Run `python setup.py build`, or see the README for details." print "Run `python setup.py build`, or see the README for details."
sys.exit(1) doExit()
from overviewer_core import textures from overviewer_core import textures
@@ -93,10 +119,10 @@ elif "extension_version" in dir(c_overviewer):
l = lines[0] l = lines[0]
if int(l.split()[2].strip()) != c_overviewer.extension_version(): if int(l.split()[2].strip()) != c_overviewer.extension_version():
print "Please rebuild your c_overviewer module. It is out of date!" print "Please rebuild your c_overviewer module. It is out of date!"
sys.exit(1) doExit(code=1, consoleMsg=True)
else: else:
print "Please rebuild your c_overviewer module. It is out of date!" print "Please rebuild your c_overviewer module. It is out of date!"
sys.exit(1) doExit()
from overviewer_core.configParser import ConfigOptionParser from overviewer_core.configParser import ConfigOptionParser
from overviewer_core import optimizeimages, world, quadtree from overviewer_core import optimizeimages, world, quadtree
@@ -225,7 +251,7 @@ def main():
except Exception: except Exception:
print "version info not found" print "version info not found"
pass pass
sys.exit(0) doExit(code=0, consoleMsg=False)
# setup c_overviewer rendermode customs / options # setup c_overviewer rendermode customs / options
for mode in builtin_custom_rendermodes: for mode in builtin_custom_rendermodes:
@@ -245,7 +271,7 @@ def main():
if options.list_rendermodes: if options.list_rendermodes:
list_rendermodes() list_rendermodes()
sys.exit(0) doExit(code=0, consoleMsg=False)
if options.check_terrain: if options.check_terrain:
import hashlib import hashlib
@@ -257,22 +283,22 @@ def main():
f = _find_file("terrain.png", verbose=True) f = _find_file("terrain.png", verbose=True)
except IOError: except IOError:
logging.error("Could not find the file terrain.png") logging.error("Could not find the file terrain.png")
sys.exit(1) doExit(code=1, consoleMsg=False)
h = hashlib.sha1() h = hashlib.sha1()
h.update(f.read()) h.update(f.read())
logging.info("Hash of terrain.png file is: `%s`", h.hexdigest()) logging.info("Hash of terrain.png file is: `%s`", h.hexdigest())
sys.exit(0) doExit(code=0, consoleMsg=False)
if options.advanced_help: if options.advanced_help:
parser.advanced_help() parser.advanced_help()
sys.exit(0) doExit(code=0, consoleMsg=False)
if len(args) < 1: if len(args) < 1:
logging.error("You need to give me your world number or directory") logging.error("You need to give me your world number or directory")
parser.print_help() parser.print_help()
list_worlds() list_worlds()
sys.exit(1) doExit(code=1, consoleMsg=True)
worlddir = os.path.expanduser(args[0]) worlddir = os.path.expanduser(args[0])
if len(args) > 2: if len(args) > 2:
@@ -284,7 +310,7 @@ def main():
if os.path.exists(" ".join(args[start:end])): if os.path.exists(" ".join(args[start:end])):
logging.warning("It looks like you meant to specify \"%s\" as your world dir or your output\n\ logging.warning("It looks like you meant to specify \"%s\" as your world dir or your output\n\
dir but you forgot to put quotes around the directory, since it contains spaces." % " ".join(args[start:end])) dir but you forgot to put quotes around the directory, since it contains spaces." % " ".join(args[start:end]))
sys.exit(1) doExit(code=1, consoleMsg=False)
if not os.path.exists(worlddir): if not os.path.exists(worlddir):
# world given is either world number, or name # world given is either world number, or name
@@ -294,7 +320,7 @@ dir but you forgot to put quotes around the directory, since it contains spaces.
if not worlds: if not worlds:
parser.print_help() parser.print_help()
logging.error("Invalid world path") logging.error("Invalid world path")
sys.exit(1) doExit(code=1, consoleMsg=False)
try: try:
worldnum = int(worlddir) worldnum = int(worlddir)
@@ -307,32 +333,32 @@ dir but you forgot to put quotes around the directory, since it contains spaces.
# it's not a number, name, or path # it's not a number, name, or path
parser.print_help() parser.print_help()
logging.error("Invalid world name or path") logging.error("Invalid world name or path")
sys.exit(1) doExit(code=1, consoleMsg=False)
except KeyError: except KeyError:
# it was an invalid number # it was an invalid number
parser.print_help() parser.print_help()
logging.error("Invalid world number") logging.error("Invalid world number")
sys.exit(1) doExit(code=1, consoleMsg=False)
# final sanity check for worlddir # final sanity check for worlddir
if not os.path.exists(os.path.join(worlddir, 'level.dat')): if not os.path.exists(os.path.join(worlddir, 'level.dat')):
logging.error("Invalid world path -- does not contain level.dat") logging.error("Invalid world path -- does not contain level.dat")
sys.exit(1) doExit(code=1, consoleMsg=False)
if len(args) < 2: if len(args) < 2:
logging.error("Where do you want to save the tiles?") logging.error("Where do you want to save the tiles?")
sys.exit(1) doExit(code=1, consoleMsg=False)
elif len(args) > 2: elif len(args) > 2:
parser.print_help() parser.print_help()
logging.error("Sorry, you specified too many arguments") logging.error("Sorry, you specified too many arguments")
sys.exit(1) doExit(code=1, consoleMsg=False)
destdir = os.path.expanduser(args[1]) destdir = os.path.expanduser(args[1])
if options.display_config: if options.display_config:
# just display the config file and exit # just display the config file and exit
parser.display_config() parser.display_config()
sys.exit(0) doExit(code=0, consoleMsg=False)
if options.regionlist: if options.regionlist:
@@ -365,11 +391,11 @@ dir but you forgot to put quotes around the directory, since it contains spaces.
except IOError as e: except IOError as e:
logging.error("Unable to open file %s to use for changelist." % options.changelist) logging.error("Unable to open file %s to use for changelist." % options.changelist)
logging.error("I/O Error: %s" % e.strerror) logging.error("I/O Error: %s" % e.strerror)
sys.exit(1) doExit(code=1, consoleMsg=False)
if options.changelist_format != "auto" and not options.changelist: if options.changelist_format != "auto" and not options.changelist:
logging.error("changelist_format specified without changelist.") logging.error("changelist_format specified without changelist.")
sys.exit(1) doExit(code=1, consoleMsg=False)
if options.changelist_format == "auto": if options.changelist_format == "auto":
options.changelist_format = "relative" options.changelist_format = "relative"
@@ -385,7 +411,7 @@ dir but you forgot to put quotes around the directory, since it contains spaces.
textures.generate(path=options.textures_path) textures.generate(path=options.textures_path)
except IOError, e: except IOError, e:
logging.error(str(e)) logging.error(str(e))
sys.exit(1) doExit(code=1, consoleMsg=False)
# First do world-level preprocessing # First do world-level preprocessing
w = world.World(worlddir, destdir, useBiomeData=useBiomeData, regionlist=regionlist, north_direction=north_direction) w = world.World(worlddir, destdir, useBiomeData=useBiomeData, regionlist=regionlist, north_direction=north_direction)
@@ -397,7 +423,7 @@ dir but you forgot to put quotes around the directory, since it contains spaces.
logging.error("Overviewer.dat gives previous north-direction as "+w.persistentData['north_direction']) logging.error("Overviewer.dat gives previous north-direction as "+w.persistentData['north_direction'])
logging.error("Requested north-direction was "+north_direction) logging.error("Requested north-direction was "+north_direction)
logging.error("To change north-direction of an existing render, --forcerender must be specified") logging.error("To change north-direction of an existing render, --forcerender must be specified")
sys.exit(1) doExit(code=1, consoleMsg=False)
w.go(options.procs) w.go(options.procs)
@@ -529,8 +555,9 @@ if __name__ == "__main__":
except Exception, e: except Exception, e:
if e.message == "Exiting": if e.message == "Exiting":
logging.info("Exiting...") logging.info("Exiting...")
sys.exit(0) doExit(code=0, wait=False)
logging.exception("""An error has occurred. This may be a bug. Please let us know! logging.exception("""An error has occurred. This may be a bug. Please let us know!
See http://docs.overviewer.org/en/latest/index.html#help See http://docs.overviewer.org/en/latest/index.html#help
This is the error that occurred:""") This is the error that occurred:""")
doExit(code=1, consoleMsg=False)