diff --git a/overviewer.py b/overviewer.py index c715a4c..6e755bd 100755 --- a/overviewer.py +++ b/overviewer.py @@ -29,17 +29,45 @@ import multiprocessing import time import logging import util +import platform logging.basicConfig(level=logging.INFO,format="%(asctime)s [%(levelname)s] %(message)s") +this_dir = util.get_program_path() + # make sure the c_overviewer extension is available try: import c_overviewer except ImportError: + ## try to find the build extension + ext = os.path.join(this_dir, "c_overviewer.%s" % ("pyd" if platform.system() == "Windows" else "so")) + if os.path.exists(ext): + print "Something has gone wrong importing the c_overviewer extension. Please" + print "make sure it is up-to-date (clean and rebuild)" + sys.exit(1) + 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." sys.exit(1) +if hasattr(sys, "frozen"): + pass # we don't bother with a compat test since it should always be in sync +elif "extension_version" in dir(c_overviewer): + # check to make sure the binary matches the headers + if os.path.exists(os.path.join(this_dir, "src", "overviewer.h")): + with open(os.path.join(this_dir, "src", "overviewer.h")) as f: + lines = f.readlines() + lines = filter(lambda x: x.startswith("#define OVERVIEWER_EXTENSION_VERSION"), lines) + if lines: + l = lines[0] + if int(l.split()[2].strip()) != c_overviewer.extension_version(): + print "Please rebuild your c_overviewer module. It is out of date!" + sys.exit(1) +else: + print "Please rebuild your c_overviewer module. It is out of date!" + sys.exit(1) + + import optimizeimages import world import quadtree diff --git a/src/main.c b/src/main.c index e2be7a3..ddbe0af 100644 --- a/src/main.c +++ b/src/main.c @@ -17,6 +17,11 @@ #include "overviewer.h" +PyObject *get_extension_version(PyObject *self, PyObject *args) { + + return Py_BuildValue("i", OVERVIEWER_EXTENSION_VERSION); +} + static PyMethodDef COverviewerMethods[] = { {"alpha_over", alpha_over_wrap, METH_VARARGS, "alpha over composite function"}, @@ -26,9 +31,12 @@ static PyMethodDef COverviewerMethods[] = { "returns available render modes"}, {"get_render_mode_info", get_render_mode_info, METH_VARARGS, "returns info for a particular render mode"}, + {"extension_version", get_extension_version, METH_VARARGS, + "Returns the extension version"}, {NULL, NULL, 0, NULL} /* Sentinel */ }; + PyMODINIT_FUNC initc_overviewer(void) { diff --git a/src/overviewer.h b/src/overviewer.h index dc1c31e..c978773 100644 --- a/src/overviewer.h +++ b/src/overviewer.h @@ -24,6 +24,10 @@ #ifndef __OVERVIEWER_H_INCLUDED__ #define __OVERVIEWER_H_INCLUDED__ +// increment this value if you've made a change to the c extesion +// and want to force users to rebuild +#define OVERVIEWER_EXTENSION_VERSION 2 + /* Python PIL, and numpy headers */ #include #include diff --git a/util.py b/util.py index f39798a..83f5383 100644 --- a/util.py +++ b/util.py @@ -34,11 +34,14 @@ def get_program_path(): def findGitVersion(): - if os.path.exists(".git"): - with open(os.path.join(".git","HEAD")) as f: + this_dir = get_program_path() + if os.path.exists(os.path.join(this_dir,".git")): + with open(os.path.join(this_dir,".git","HEAD")) as f: data = f.read().strip() if data.startswith("ref: "): - with open(os.path.join(".git", data[5:])) as g: + if not os.path.exists(os.path.join(this_dir,data[5:])): + return data + with open(os.path.join(this_dir, ".git", data[5:])) as g: return g.read().strip() else: return data