From 3fa54aff2685e14a118a8457d762ff3481556097 Mon Sep 17 00:00:00 2001 From: Aaron Griffith Date: Tue, 29 Mar 2011 11:10:24 -0400 Subject: [PATCH 01/19] initial work at reorganizing source tree --- .gitignore | 8 +++---- blockcounter.py => contrib/blockcounter.py | 0 overviewer.py | 13 ++++------ overviewer/__init__.py | 0 chunk.py => overviewer/chunk.py | 0 composite.py => overviewer/composite.py | 0 configParser.py => overviewer/configParser.py | 0 googlemap.py => overviewer/googlemap.py | 0 nbt.py => overviewer/nbt.py | 0 .../optimizeimages.py | 0 quadtree.py => overviewer/quadtree.py | 0 rendernode.py => overviewer/rendernode.py | 0 {src => overviewer/src}/composite.c | 0 {src => overviewer/src}/endian.c | 0 {src => overviewer/src}/iterate.c | 4 ++-- {src => overviewer/src}/main.c | 0 {src => overviewer/src}/overviewer.h | 0 {src => overviewer/src}/rendermode-lighting.c | 0 {src => overviewer/src}/rendermode-night.c | 0 {src => overviewer/src}/rendermode-normal.c | 0 {src => overviewer/src}/rendermode-spawn.c | 0 {src => overviewer/src}/rendermodes.c | 0 {src => overviewer/src}/rendermodes.h | 0 textures.py => overviewer/textures.py | 0 util.py => overviewer/util.py | 3 ++- world.py => overviewer/world.py | 0 setup.py | 24 ++++++++++++------- 27 files changed, 29 insertions(+), 23 deletions(-) rename blockcounter.py => contrib/blockcounter.py (100%) create mode 100644 overviewer/__init__.py rename chunk.py => overviewer/chunk.py (100%) rename composite.py => overviewer/composite.py (100%) rename configParser.py => overviewer/configParser.py (100%) rename googlemap.py => overviewer/googlemap.py (100%) rename nbt.py => overviewer/nbt.py (100%) rename optimizeimages.py => overviewer/optimizeimages.py (100%) rename quadtree.py => overviewer/quadtree.py (100%) rename rendernode.py => overviewer/rendernode.py (100%) rename {src => overviewer/src}/composite.c (100%) rename {src => overviewer/src}/endian.c (100%) rename {src => overviewer/src}/iterate.c (99%) rename {src => overviewer/src}/main.c (100%) rename {src => overviewer/src}/overviewer.h (100%) rename {src => overviewer/src}/rendermode-lighting.c (100%) rename {src => overviewer/src}/rendermode-night.c (100%) rename {src => overviewer/src}/rendermode-normal.c (100%) rename {src => overviewer/src}/rendermode-spawn.c (100%) rename {src => overviewer/src}/rendermodes.c (100%) rename {src => overviewer/src}/rendermodes.h (100%) rename textures.py => overviewer/textures.py (100%) rename util.py => overviewer/util.py (93%) rename world.py => overviewer/world.py (100%) diff --git a/.gitignore b/.gitignore index 5871f26..1a71f3c 100644 --- a/.gitignore +++ b/.gitignore @@ -14,10 +14,10 @@ ImPlatform.h Imaging.h # various forms of compiled c_overviewer extensions -c_overviewer.so -c_overviewer.pyd -c_overviewer_d.pyd -c_overviewer.dylib +overviewer/c_overviewer.so +overviewer/c_overviewer.pyd +overviewer/c_overviewer_d.pyd +overviewer/c_overviewer.dylib # Mac OS X noise .DS_Store diff --git a/blockcounter.py b/contrib/blockcounter.py similarity index 100% rename from blockcounter.py rename to contrib/blockcounter.py diff --git a/overviewer.py b/overviewer.py index b16f835..c7a84d7 100755 --- a/overviewer.py +++ b/overviewer.py @@ -22,29 +22,26 @@ if not (sys.version_info[0] == 2 and sys.version_info[1] >= 6): import os import os.path -from configParser import ConfigOptionParser import re import subprocess import multiprocessing import time import logging -import util logging.basicConfig(level=logging.INFO,format="%(asctime)s [%(levelname)s] %(message)s") # make sure the c_overviewer extension is available try: - import c_overviewer + import overviewer.c_overviewer as c_overviewer except ImportError: 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) -import optimizeimages -import world -import quadtree -import googlemap -import rendernode +from overviewer.configParser import ConfigOptionParser +from overviewer import optimizeimages, world, quadtree +from overviewer import googlemap, rendernode, util + helptext = """ %prog [OPTIONS] diff --git a/overviewer/__init__.py b/overviewer/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/chunk.py b/overviewer/chunk.py similarity index 100% rename from chunk.py rename to overviewer/chunk.py diff --git a/composite.py b/overviewer/composite.py similarity index 100% rename from composite.py rename to overviewer/composite.py diff --git a/configParser.py b/overviewer/configParser.py similarity index 100% rename from configParser.py rename to overviewer/configParser.py diff --git a/googlemap.py b/overviewer/googlemap.py similarity index 100% rename from googlemap.py rename to overviewer/googlemap.py diff --git a/nbt.py b/overviewer/nbt.py similarity index 100% rename from nbt.py rename to overviewer/nbt.py diff --git a/optimizeimages.py b/overviewer/optimizeimages.py similarity index 100% rename from optimizeimages.py rename to overviewer/optimizeimages.py diff --git a/quadtree.py b/overviewer/quadtree.py similarity index 100% rename from quadtree.py rename to overviewer/quadtree.py diff --git a/rendernode.py b/overviewer/rendernode.py similarity index 100% rename from rendernode.py rename to overviewer/rendernode.py diff --git a/src/composite.c b/overviewer/src/composite.c similarity index 100% rename from src/composite.c rename to overviewer/src/composite.c diff --git a/src/endian.c b/overviewer/src/endian.c similarity index 100% rename from src/endian.c rename to overviewer/src/endian.c diff --git a/src/iterate.c b/overviewer/src/iterate.c similarity index 99% rename from src/iterate.c rename to overviewer/src/iterate.c index 71bd7e3..4cf63c1 100644 --- a/src/iterate.c +++ b/overviewer/src/iterate.c @@ -31,7 +31,7 @@ int init_chunk_render(void) { * */ if (blockmap) return 1; - textures = PyImport_ImportModule("textures"); + textures = PyImport_ImportModule("overviewer.textures"); /* ensure none of these pointers are NULL */ if ((!textures)) { fprintf(stderr, "\ninit_chunk_render failed to load; textures\n"); @@ -39,7 +39,7 @@ int init_chunk_render(void) { return 1; } - chunk_mod = PyImport_ImportModule("chunk"); + chunk_mod = PyImport_ImportModule("overviewer.chunk"); /* ensure none of these pointers are NULL */ if ((!chunk_mod)) { fprintf(stderr, "\ninit_chunk_render failed to load; chunk\n"); diff --git a/src/main.c b/overviewer/src/main.c similarity index 100% rename from src/main.c rename to overviewer/src/main.c diff --git a/src/overviewer.h b/overviewer/src/overviewer.h similarity index 100% rename from src/overviewer.h rename to overviewer/src/overviewer.h diff --git a/src/rendermode-lighting.c b/overviewer/src/rendermode-lighting.c similarity index 100% rename from src/rendermode-lighting.c rename to overviewer/src/rendermode-lighting.c diff --git a/src/rendermode-night.c b/overviewer/src/rendermode-night.c similarity index 100% rename from src/rendermode-night.c rename to overviewer/src/rendermode-night.c diff --git a/src/rendermode-normal.c b/overviewer/src/rendermode-normal.c similarity index 100% rename from src/rendermode-normal.c rename to overviewer/src/rendermode-normal.c diff --git a/src/rendermode-spawn.c b/overviewer/src/rendermode-spawn.c similarity index 100% rename from src/rendermode-spawn.c rename to overviewer/src/rendermode-spawn.c diff --git a/src/rendermodes.c b/overviewer/src/rendermodes.c similarity index 100% rename from src/rendermodes.c rename to overviewer/src/rendermodes.c diff --git a/src/rendermodes.h b/overviewer/src/rendermodes.h similarity index 100% rename from src/rendermodes.h rename to overviewer/src/rendermodes.h diff --git a/textures.py b/overviewer/textures.py similarity index 100% rename from textures.py rename to overviewer/textures.py diff --git a/util.py b/overviewer/util.py similarity index 93% rename from util.py rename to overviewer/util.py index f39798a..12d21fd 100644 --- a/util.py +++ b/overviewer/util.py @@ -27,7 +27,8 @@ def get_program_path(): return os.path.dirname(sys.executable) else: try: - return os.path.dirname(__file__) + # normally, we're in ./overviewer/util.py + return os.path.dirname(os.path.dirname(__file__)) except NameError: return os.path.dirname(sys.argv[0]) diff --git a/world.py b/overviewer/world.py similarity index 100% rename from world.py rename to overviewer/world.py diff --git a/setup.py b/setup.py index 62cc86e..759efba 100644 --- a/setup.py +++ b/setup.py @@ -27,9 +27,6 @@ setup_kwargs['cmdclass'] = {} if py2exe is not None: setup_kwargs['console'] = ['overviewer.py'] - setup_kwargs['data_files'] = [('textures', ['textures/lava.png', 'textures/water.png', 'textures/fire.png']), - ('', ['config.js', 'COPYING.txt', 'README.rst']), - ('web_assets', glob.glob('web_assets/*'))] setup_kwargs['zipfile'] = None if platform.system() == 'Windows' and '64bit' in platform.architecture(): b = 3 @@ -37,6 +34,17 @@ if py2exe is not None: b = 1 setup_kwargs['options']['py2exe'] = {'bundle_files' : b, 'excludes': 'Tkinter'} +# +# script, package, and data +# + +setup_kwargs['packages'] = ['overviewer'] +setup_kwargs['scripts'] = ['overviewer.py'] +setup_kwargs['data_files'] = [('textures', glob.glob('textures/*')), + ('', ['config.js', 'COPYING.txt', 'README.rst']), + ('web_assets', glob.glob('web_assets/*'))] + + # # c_overviewer extension # @@ -50,10 +58,10 @@ except AttributeError: numpy_include = numpy.get_numpy_include() -c_overviewer_files = ['src/main.c', 'src/composite.c', 'src/iterate.c', 'src/endian.c'] -c_overviewer_files += ['src/rendermodes.c', 'src/rendermode-normal.c', 'src/rendermode-lighting.c', 'src/rendermode-night.c', 'src/rendermode-spawn.c'] -c_overviewer_includes = ['src/overviewer.h', 'src/rendermodes.h'] -setup_kwargs['ext_modules'].append(Extension('c_overviewer', c_overviewer_files, include_dirs=['.', numpy_include], depends=c_overviewer_includes, extra_link_args=[])) +c_overviewer_files = ['overviewer/src/main.c', 'overviewer/src/composite.c', 'overviewer/src/iterate.c', 'overviewer/src/endian.c'] +c_overviewer_files += ['overviewer/src/rendermodes.c', 'overviewer/src/rendermode-normal.c', 'overviewer/src/rendermode-lighting.c', 'overviewer/src/rendermode-night.c', 'overviewer/src/rendermode-spawn.c'] +c_overviewer_includes = ['overviewer/src/overviewer.h', 'overviewer/src/rendermodes.h'] +setup_kwargs['ext_modules'].append(Extension('overviewer.c_overviewer', c_overviewer_files, include_dirs=['.', numpy_include], depends=c_overviewer_includes, extra_link_args=[])) # tell build_ext to build the extension in-place # (NOT in build/) setup_kwargs['options']['build_ext'] = {'inplace' : 1} @@ -69,7 +77,7 @@ class CustomClean(clean): # try to remove '_composite.{so,pyd,...}' extension, # regardless of the current system's extension name convention build_ext = self.get_finalized_command('build_ext') - pretty_fname = build_ext.get_ext_filename('c_overviewer') + pretty_fname = build_ext.get_ext_filename('overviewer.c_overviewer') fname = pretty_fname if os.path.exists(fname): try: From 42596416d9128059e76e4a1f6def2a644abe31f2 Mon Sep 17 00:00:00 2001 From: Aaron Griffith Date: Tue, 29 Mar 2011 13:49:50 -0400 Subject: [PATCH 02/19] sdist and install now work next step is using a custom data dir, and falling back on the package data dir. Also, fixing --version. --- .gitignore | 12 +++-- MANIFEST.in | 7 +++ overviewer.py | 10 ++-- {overviewer => overviewer_core}/__init__.py | 0 {overviewer => overviewer_core}/chunk.py | 0 {overviewer => overviewer_core}/composite.py | 0 .../configParser.py | 0 config.js => overviewer_core/data/config.js | 0 .../data/textures}/fire.png | Bin .../data/textures}/lava.png | Bin .../data/textures}/water.png | Bin .../data/web_assets}/compass.png | Bin .../data/web_assets}/functions.js | 0 .../data/web_assets}/index.html | 0 .../data/web_assets}/signpost-shadow.png | Bin .../data/web_assets}/signpost.png | Bin .../data/web_assets}/signpost_icon.png | Bin .../data/web_assets}/style.css | 0 {overviewer => overviewer_core}/googlemap.py | 0 {overviewer => overviewer_core}/nbt.py | 0 .../optimizeimages.py | 0 {overviewer => overviewer_core}/quadtree.py | 0 {overviewer => overviewer_core}/rendernode.py | 0 .../src/composite.c | 0 {overviewer => overviewer_core}/src/endian.c | 0 {overviewer => overviewer_core}/src/iterate.c | 4 +- {overviewer => overviewer_core}/src/main.c | 0 .../src/overviewer.h | 0 .../src/rendermode-lighting.c | 0 .../src/rendermode-night.c | 0 .../src/rendermode-normal.c | 0 .../src/rendermode-spawn.c | 0 .../src/rendermodes.c | 0 .../src/rendermodes.h | 0 {overviewer => overviewer_core}/textures.py | 0 {overviewer => overviewer_core}/util.py | 3 +- {overviewer => overviewer_core}/world.py | 0 setup.py | 44 ++++++++++++------ 38 files changed, 53 insertions(+), 27 deletions(-) create mode 100644 MANIFEST.in rename {overviewer => overviewer_core}/__init__.py (100%) rename {overviewer => overviewer_core}/chunk.py (100%) rename {overviewer => overviewer_core}/composite.py (100%) rename {overviewer => overviewer_core}/configParser.py (100%) rename config.js => overviewer_core/data/config.js (100%) rename {textures => overviewer_core/data/textures}/fire.png (100%) rename {textures => overviewer_core/data/textures}/lava.png (100%) rename {textures => overviewer_core/data/textures}/water.png (100%) rename {web_assets => overviewer_core/data/web_assets}/compass.png (100%) rename {web_assets => overviewer_core/data/web_assets}/functions.js (100%) rename {web_assets => overviewer_core/data/web_assets}/index.html (100%) rename {web_assets => overviewer_core/data/web_assets}/signpost-shadow.png (100%) rename {web_assets => overviewer_core/data/web_assets}/signpost.png (100%) rename {web_assets => overviewer_core/data/web_assets}/signpost_icon.png (100%) rename {web_assets => overviewer_core/data/web_assets}/style.css (100%) rename {overviewer => overviewer_core}/googlemap.py (100%) rename {overviewer => overviewer_core}/nbt.py (100%) rename {overviewer => overviewer_core}/optimizeimages.py (100%) rename {overviewer => overviewer_core}/quadtree.py (100%) rename {overviewer => overviewer_core}/rendernode.py (100%) rename {overviewer => overviewer_core}/src/composite.c (100%) rename {overviewer => overviewer_core}/src/endian.c (100%) rename {overviewer => overviewer_core}/src/iterate.c (99%) rename {overviewer => overviewer_core}/src/main.c (100%) rename {overviewer => overviewer_core}/src/overviewer.h (100%) rename {overviewer => overviewer_core}/src/rendermode-lighting.c (100%) rename {overviewer => overviewer_core}/src/rendermode-night.c (100%) rename {overviewer => overviewer_core}/src/rendermode-normal.c (100%) rename {overviewer => overviewer_core}/src/rendermode-spawn.c (100%) rename {overviewer => overviewer_core}/src/rendermodes.c (100%) rename {overviewer => overviewer_core}/src/rendermodes.h (100%) rename {overviewer => overviewer_core}/textures.py (100%) rename {overviewer => overviewer_core}/util.py (93%) rename {overviewer => overviewer_core}/world.py (100%) mode change 100644 => 100755 setup.py diff --git a/.gitignore b/.gitignore index 1a71f3c..9ed59d6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ *.pyc -build +MANIFEST +build/ +dist/ terrain.png cachedir* @@ -14,10 +16,10 @@ ImPlatform.h Imaging.h # various forms of compiled c_overviewer extensions -overviewer/c_overviewer.so -overviewer/c_overviewer.pyd -overviewer/c_overviewer_d.pyd -overviewer/c_overviewer.dylib +overviewer_core/c_overviewer.so +overviewer_core/c_overviewer.pyd +overviewer_core/c_overviewer_d.pyd +overviewer_core/c_overviewer.dylib # Mac OS X noise .DS_Store diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..f8e6fd7 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,7 @@ +include COPYING.txt +include README.rst +include overviewer.py +recursive-include contrib/ *.py +recursive-include overviewer_core/*.py +recursive-include overviewer_core/src/ *.c *.h +recursive-include overviewer_core/data/ *.png *.js index.html style.css diff --git a/overviewer.py b/overviewer.py index c7a84d7..e30b85c 100755 --- a/overviewer.py +++ b/overviewer.py @@ -32,15 +32,17 @@ logging.basicConfig(level=logging.INFO,format="%(asctime)s [%(levelname)s] %(mes # make sure the c_overviewer extension is available try: - import overviewer.c_overviewer as c_overviewer + from overviewer_core import c_overviewer except ImportError: 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." + import traceback + traceback.print_exc() sys.exit(1) -from overviewer.configParser import ConfigOptionParser -from overviewer import optimizeimages, world, quadtree -from overviewer import googlemap, rendernode, util +from overviewer_core.configParser import ConfigOptionParser +from overviewer_core import optimizeimages, world, quadtree +from overviewer_core import googlemap, rendernode, util helptext = """ diff --git a/overviewer/__init__.py b/overviewer_core/__init__.py similarity index 100% rename from overviewer/__init__.py rename to overviewer_core/__init__.py diff --git a/overviewer/chunk.py b/overviewer_core/chunk.py similarity index 100% rename from overviewer/chunk.py rename to overviewer_core/chunk.py diff --git a/overviewer/composite.py b/overviewer_core/composite.py similarity index 100% rename from overviewer/composite.py rename to overviewer_core/composite.py diff --git a/overviewer/configParser.py b/overviewer_core/configParser.py similarity index 100% rename from overviewer/configParser.py rename to overviewer_core/configParser.py diff --git a/config.js b/overviewer_core/data/config.js similarity index 100% rename from config.js rename to overviewer_core/data/config.js diff --git a/textures/fire.png b/overviewer_core/data/textures/fire.png similarity index 100% rename from textures/fire.png rename to overviewer_core/data/textures/fire.png diff --git a/textures/lava.png b/overviewer_core/data/textures/lava.png similarity index 100% rename from textures/lava.png rename to overviewer_core/data/textures/lava.png diff --git a/textures/water.png b/overviewer_core/data/textures/water.png similarity index 100% rename from textures/water.png rename to overviewer_core/data/textures/water.png diff --git a/web_assets/compass.png b/overviewer_core/data/web_assets/compass.png similarity index 100% rename from web_assets/compass.png rename to overviewer_core/data/web_assets/compass.png diff --git a/web_assets/functions.js b/overviewer_core/data/web_assets/functions.js similarity index 100% rename from web_assets/functions.js rename to overviewer_core/data/web_assets/functions.js diff --git a/web_assets/index.html b/overviewer_core/data/web_assets/index.html similarity index 100% rename from web_assets/index.html rename to overviewer_core/data/web_assets/index.html diff --git a/web_assets/signpost-shadow.png b/overviewer_core/data/web_assets/signpost-shadow.png similarity index 100% rename from web_assets/signpost-shadow.png rename to overviewer_core/data/web_assets/signpost-shadow.png diff --git a/web_assets/signpost.png b/overviewer_core/data/web_assets/signpost.png similarity index 100% rename from web_assets/signpost.png rename to overviewer_core/data/web_assets/signpost.png diff --git a/web_assets/signpost_icon.png b/overviewer_core/data/web_assets/signpost_icon.png similarity index 100% rename from web_assets/signpost_icon.png rename to overviewer_core/data/web_assets/signpost_icon.png diff --git a/web_assets/style.css b/overviewer_core/data/web_assets/style.css similarity index 100% rename from web_assets/style.css rename to overviewer_core/data/web_assets/style.css diff --git a/overviewer/googlemap.py b/overviewer_core/googlemap.py similarity index 100% rename from overviewer/googlemap.py rename to overviewer_core/googlemap.py diff --git a/overviewer/nbt.py b/overviewer_core/nbt.py similarity index 100% rename from overviewer/nbt.py rename to overviewer_core/nbt.py diff --git a/overviewer/optimizeimages.py b/overviewer_core/optimizeimages.py similarity index 100% rename from overviewer/optimizeimages.py rename to overviewer_core/optimizeimages.py diff --git a/overviewer/quadtree.py b/overviewer_core/quadtree.py similarity index 100% rename from overviewer/quadtree.py rename to overviewer_core/quadtree.py diff --git a/overviewer/rendernode.py b/overviewer_core/rendernode.py similarity index 100% rename from overviewer/rendernode.py rename to overviewer_core/rendernode.py diff --git a/overviewer/src/composite.c b/overviewer_core/src/composite.c similarity index 100% rename from overviewer/src/composite.c rename to overviewer_core/src/composite.c diff --git a/overviewer/src/endian.c b/overviewer_core/src/endian.c similarity index 100% rename from overviewer/src/endian.c rename to overviewer_core/src/endian.c diff --git a/overviewer/src/iterate.c b/overviewer_core/src/iterate.c similarity index 99% rename from overviewer/src/iterate.c rename to overviewer_core/src/iterate.c index 4cf63c1..6f944de 100644 --- a/overviewer/src/iterate.c +++ b/overviewer_core/src/iterate.c @@ -31,7 +31,7 @@ int init_chunk_render(void) { * */ if (blockmap) return 1; - textures = PyImport_ImportModule("overviewer.textures"); + textures = PyImport_ImportModule("overviewer_core.textures"); /* ensure none of these pointers are NULL */ if ((!textures)) { fprintf(stderr, "\ninit_chunk_render failed to load; textures\n"); @@ -39,7 +39,7 @@ int init_chunk_render(void) { return 1; } - chunk_mod = PyImport_ImportModule("overviewer.chunk"); + chunk_mod = PyImport_ImportModule("overviewer_core.chunk"); /* ensure none of these pointers are NULL */ if ((!chunk_mod)) { fprintf(stderr, "\ninit_chunk_render failed to load; chunk\n"); diff --git a/overviewer/src/main.c b/overviewer_core/src/main.c similarity index 100% rename from overviewer/src/main.c rename to overviewer_core/src/main.c diff --git a/overviewer/src/overviewer.h b/overviewer_core/src/overviewer.h similarity index 100% rename from overviewer/src/overviewer.h rename to overviewer_core/src/overviewer.h diff --git a/overviewer/src/rendermode-lighting.c b/overviewer_core/src/rendermode-lighting.c similarity index 100% rename from overviewer/src/rendermode-lighting.c rename to overviewer_core/src/rendermode-lighting.c diff --git a/overviewer/src/rendermode-night.c b/overviewer_core/src/rendermode-night.c similarity index 100% rename from overviewer/src/rendermode-night.c rename to overviewer_core/src/rendermode-night.c diff --git a/overviewer/src/rendermode-normal.c b/overviewer_core/src/rendermode-normal.c similarity index 100% rename from overviewer/src/rendermode-normal.c rename to overviewer_core/src/rendermode-normal.c diff --git a/overviewer/src/rendermode-spawn.c b/overviewer_core/src/rendermode-spawn.c similarity index 100% rename from overviewer/src/rendermode-spawn.c rename to overviewer_core/src/rendermode-spawn.c diff --git a/overviewer/src/rendermodes.c b/overviewer_core/src/rendermodes.c similarity index 100% rename from overviewer/src/rendermodes.c rename to overviewer_core/src/rendermodes.c diff --git a/overviewer/src/rendermodes.h b/overviewer_core/src/rendermodes.h similarity index 100% rename from overviewer/src/rendermodes.h rename to overviewer_core/src/rendermodes.h diff --git a/overviewer/textures.py b/overviewer_core/textures.py similarity index 100% rename from overviewer/textures.py rename to overviewer_core/textures.py diff --git a/overviewer/util.py b/overviewer_core/util.py similarity index 93% rename from overviewer/util.py rename to overviewer_core/util.py index 12d21fd..a1d07f8 100644 --- a/overviewer/util.py +++ b/overviewer_core/util.py @@ -28,7 +28,8 @@ def get_program_path(): else: try: # normally, we're in ./overviewer/util.py - return os.path.dirname(os.path.dirname(__file__)) + # we want ./overviewer/data/ + return os.path.join(os.path.dirname(__file__), 'data') except NameError: return os.path.dirname(sys.argv[0]) diff --git a/overviewer/world.py b/overviewer_core/world.py similarity index 100% rename from overviewer/world.py rename to overviewer_core/world.py diff --git a/setup.py b/setup.py old mode 100644 new mode 100755 index 759efba..1f34f3f --- a/setup.py +++ b/setup.py @@ -1,3 +1,5 @@ +#!/usr/bin/python + from distutils.core import setup, Extension from distutils.command.build import build from distutils.command.clean import clean @@ -17,32 +19,41 @@ except ImportError: # now, setup the keyword arguments for setup # (because we don't know until runtime if py2exe is available) setup_kwargs = {} -setup_kwargs['options'] = {} setup_kwargs['ext_modules'] = [] setup_kwargs['cmdclass'] = {} +# +# metadata +# + +setup_kwargs['name'] = 'minecraft-overviewer' +setup_kwargs['version'] = '0.0.0' # TODO useful version + # # py2exe options # if py2exe is not None: setup_kwargs['console'] = ['overviewer.py'] + setup_kwargs['data_files'] = [('', ['COPYING.txt', 'README.rst'])] setup_kwargs['zipfile'] = None if platform.system() == 'Windows' and '64bit' in platform.architecture(): b = 3 else: b = 1 + setup_kwargs['options'] = {} setup_kwargs['options']['py2exe'] = {'bundle_files' : b, 'excludes': 'Tkinter'} # # script, package, and data # -setup_kwargs['packages'] = ['overviewer'] +setup_kwargs['packages'] = ['overviewer_core'] setup_kwargs['scripts'] = ['overviewer.py'] -setup_kwargs['data_files'] = [('textures', glob.glob('textures/*')), - ('', ['config.js', 'COPYING.txt', 'README.rst']), - ('web_assets', glob.glob('web_assets/*'))] +setup_kwargs['package_data'] = {'overviewer_core': + ['data/config.js', + 'data/textures/*', + 'data/web_assets/*']} # @@ -58,15 +69,14 @@ except AttributeError: numpy_include = numpy.get_numpy_include() -c_overviewer_files = ['overviewer/src/main.c', 'overviewer/src/composite.c', 'overviewer/src/iterate.c', 'overviewer/src/endian.c'] -c_overviewer_files += ['overviewer/src/rendermodes.c', 'overviewer/src/rendermode-normal.c', 'overviewer/src/rendermode-lighting.c', 'overviewer/src/rendermode-night.c', 'overviewer/src/rendermode-spawn.c'] -c_overviewer_includes = ['overviewer/src/overviewer.h', 'overviewer/src/rendermodes.h'] -setup_kwargs['ext_modules'].append(Extension('overviewer.c_overviewer', c_overviewer_files, include_dirs=['.', numpy_include], depends=c_overviewer_includes, extra_link_args=[])) -# tell build_ext to build the extension in-place -# (NOT in build/) -setup_kwargs['options']['build_ext'] = {'inplace' : 1} -# tell the build command to only run build_ext -build.sub_commands = [('build_ext', None)] +c_overviewer_files = ['main.c', 'composite.c', 'iterate.c', 'endian.c'] +c_overviewer_files += ['rendermodes.c', 'rendermode-normal.c', 'rendermode-lighting.c', 'rendermode-night.c', 'rendermode-spawn.c'] +c_overviewer_includes = ['overviewer.h', 'rendermodes.h'] + +c_overviewer_files = map(lambda s: 'overviewer_core/src/'+s, c_overviewer_files) +c_overviewer_includes = map(lambda s: 'overviewer_core/src/'+s, c_overviewer_includes) + +setup_kwargs['ext_modules'].append(Extension('overviewer_core.c_overviewer', c_overviewer_files, include_dirs=['.', numpy_include], depends=c_overviewer_includes, extra_link_args=[])) # custom clean command to remove in-place extension class CustomClean(clean): @@ -77,7 +87,7 @@ class CustomClean(clean): # try to remove '_composite.{so,pyd,...}' extension, # regardless of the current system's extension name convention build_ext = self.get_finalized_command('build_ext') - pretty_fname = build_ext.get_ext_filename('overviewer.c_overviewer') + pretty_fname = build_ext.get_ext_filename('overviewer_core.c_overviewer') fname = pretty_fname if os.path.exists(fname): try: @@ -99,6 +109,10 @@ class CustomBuild(build_ext): for e in self.extensions: e.extra_link_args.append("/MANIFEST") + # build in place, and in the build/ tree + self.inplace = False + build_ext.build_extensions(self) + self.inplace = True build_ext.build_extensions(self) From e8f9a8bf3ed68628be54f0f0744e44cfef82ba11 Mon Sep 17 00:00:00 2001 From: Aaron Griffith Date: Tue, 10 May 2011 20:22:00 -0400 Subject: [PATCH 03/19] added CONTRIBUTORS.rst to dist stuff, capitalized package name --- MANIFEST.in | 1 + setup.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index f8e6fd7..1f852d6 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,5 +1,6 @@ include COPYING.txt include README.rst +include CONTRIBUTORS.rst include overviewer.py recursive-include contrib/ *.py recursive-include overviewer_core/*.py diff --git a/setup.py b/setup.py index a961f66..69bf470 100755 --- a/setup.py +++ b/setup.py @@ -27,7 +27,7 @@ setup_kwargs['options'] = {} # metadata # -setup_kwargs['name'] = 'minecraft-overviewer' +setup_kwargs['name'] = 'Minecraft-Overviewer' setup_kwargs['version'] = '0.0.0' # TODO useful version # @@ -36,7 +36,7 @@ setup_kwargs['version'] = '0.0.0' # TODO useful version if py2exe is not None: setup_kwargs['console'] = ['overviewer.py'] - setup_kwargs['data_files'] = [('', ['COPYING.txt', 'README.rst'])] + setup_kwargs['data_files'] = [('', ['COPYING.txt', 'README.rst', 'CONTRIBUTORS.rst'])] setup_kwargs['zipfile'] = None if platform.system() == 'Windows' and '64bit' in platform.architecture(): b = 3 From 4ec1b4c97143f40c7ba52bcccbc9ee9a8eece7e3 Mon Sep 17 00:00:00 2001 From: Aaron Griffith Date: Fri, 13 May 2011 22:24:49 -0400 Subject: [PATCH 04/19] working versions, data files, and package metadata --- .gitignore | 3 +++ MANIFEST.in | 1 + overviewer.py | 11 ++++----- overviewer_core/googlemap.py | 2 +- overviewer_core/textures.py | 6 ++--- overviewer_core/util.py | 6 ++--- setup.py | 48 ++++++++++++++++++++++-------------- 7 files changed, 45 insertions(+), 32 deletions(-) diff --git a/.gitignore b/.gitignore index 9ed59d6..dbd0cd7 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,9 @@ overviewer_core/c_overviewer.pyd overviewer_core/c_overviewer_d.pyd overviewer_core/c_overviewer.dylib +# generated version file +overviewer_core/overviewer_version.py + # Mac OS X noise .DS_Store diff --git a/MANIFEST.in b/MANIFEST.in index 1f852d6..a1ea81c 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -4,5 +4,6 @@ include CONTRIBUTORS.rst include overviewer.py recursive-include contrib/ *.py recursive-include overviewer_core/*.py +exclude overviewer_core/overviewer_version.py recursive-include overviewer_core/src/ *.c *.h recursive-include overviewer_core/data/ *.png *.js index.html style.css diff --git a/overviewer.py b/overviewer.py index f88dd20..3a0cb44 100755 --- a/overviewer.py +++ b/overviewer.py @@ -56,8 +56,8 @@ 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: + if os.path.exists(os.path.join(this_dir, "overviewer_core", "src", "overviewer.h")): + with open(os.path.join(this_dir, "overviewer_core", "src", "overviewer.h")) as f: lines = f.readlines() lines = filter(lambda x: x.startswith("#define OVERVIEWER_EXTENSION_VERSION"), lines) if lines: @@ -116,10 +116,9 @@ def main(): print "Minecraft-Overviewer" print "Git version: %s" % util.findGitVersion() try: - import overviewer_version - if hasattr(sys, "frozen"): - print "py2exe version build on %s" % overviewer_version.BUILD_DATE - print "Build machine: %s %s" % (overviewer_version.BUILD_PLATFORM, overviewer_version.BUILD_OS) + import overviewer_core.overviewer_version as overviewer_version + print "built on %s" % overviewer_version.BUILD_DATE + print "Build machine: %s %s" % (overviewer_version.BUILD_PLATFORM, overviewer_version.BUILD_OS) except: pass sys.exit(0) diff --git a/overviewer_core/googlemap.py b/overviewer_core/googlemap.py index daf0e0e..44fadff 100644 --- a/overviewer_core/googlemap.py +++ b/overviewer_core/googlemap.py @@ -97,7 +97,7 @@ class MapGen(object): blank.save(os.path.join(tileDir, "blank."+quadtree.imgformat)) # copy web assets into destdir: - mirror_dir(os.path.join(util.get_program_path(), "web_assets"), self.destdir) + mirror_dir(os.path.join(util.get_program_path(), "overviewer_core", "data", "web_assets"), self.destdir) # do the same with the local copy, if we have it if self.web_assets_path: mirror_dir(self.web_assets_path, self.destdir) diff --git a/overviewer_core/textures.py b/overviewer_core/textures.py index 611353a..a6ee715 100644 --- a/overviewer_core/textures.py +++ b/overviewer_core/textures.py @@ -32,8 +32,8 @@ def _find_file(filename, mode="rb"): This searches the following locations in this order: * the textures_path given in the config file (if present) - * The program dir (same dir as this file) - * The program dir / textures + * The program dir (same dir as overviewer.py) + * The overviewer_core textures dir * On Darwin, in /Applications/Minecraft * Inside minecraft.jar, which is looked for at these locations @@ -53,7 +53,7 @@ def _find_file(filename, mode="rb"): if os.path.exists(path): return open(path, mode) - path = os.path.join(programdir, "textures", filename) + path = os.path.join(programdir, "overviewer_core", "data", "textures", filename) if os.path.exists(path): return open(path, mode) diff --git a/overviewer_core/util.py b/overviewer_core/util.py index 65c9f5c..2da93ed 100644 --- a/overviewer_core/util.py +++ b/overviewer_core/util.py @@ -27,9 +27,9 @@ def get_program_path(): return os.path.dirname(sys.executable) else: try: - # normally, we're in ./overviewer/util.py - # we want ./overviewer/data/ - return os.path.join(os.path.dirname(__file__), 'data') + # normally, we're in ./overviewer_core/util.py + # we want ./ + return os.path.dirname(os.path.dirname(__file__)) except NameError: return os.path.dirname(sys.argv[0]) diff --git a/setup.py b/setup.py index f5e942f..08e7927 100755 --- a/setup.py +++ b/setup.py @@ -29,6 +29,9 @@ setup_kwargs['options'] = {} setup_kwargs['name'] = 'Minecraft-Overviewer' setup_kwargs['version'] = '0.0.0' # TODO useful version +setup_kwargs['author'] = 'Andrew Brown' +setup_kwargs['author_email'] = 'brownan@gmail.com' +setup_kwargs['url'] = 'http://overviewer.org/' # # py2exe options @@ -36,7 +39,6 @@ setup_kwargs['version'] = '0.0.0' # TODO useful version if py2exe is not None: setup_kwargs['console'] = ['overviewer.py'] - setup_kwargs['data_files'] = [('', ['COPYING.txt', 'README.rst', 'CONTRIBUTORS.rst'])] setup_kwargs['zipfile'] = None if platform.system() == 'Windows' and '64bit' in platform.architecture(): b = 3 @@ -53,6 +55,7 @@ setup_kwargs['scripts'] = ['overviewer.py'] setup_kwargs['package_data'] = {'overviewer_core': ['data/textures/*', 'data/web_assets/*']} +setup_kwargs['data_files'] = [('Minecraft-Overviewer', ['COPYING.txt', 'README.rst', 'CONTRIBUTORS.rst', 'sample.settings.py'])] # @@ -93,6 +96,7 @@ setup_kwargs['options']['build_ext'] = {'inplace' : 1} build.sub_commands = [('build_ext', None)] # custom clean command to remove in-place extension +# and the version file class CustomClean(clean): def run(self): # do the normal cleanup @@ -114,8 +118,32 @@ class CustomClean(clean): else: log.debug("'%s' does not exist -- can't clean it", pretty_fname) + + versionpath = os.path.join("overviewer_core", "overviewer_version.py") + try: + if not self.dry_run: + os.remove(versionpath) + log.info("removing '%s'", versionpath) + except OSError: + log.warn("'%s' could not be cleaned -- permission denied", versionpath) + +def generate_version_py(): + try: + import overviewer_core.util as util + f = open("overviewer_core/overviewer_version.py", "w") + f.write("VERSION=%r\n" % util.findGitVersion()) + f.write("BUILD_DATE=%r\n" % time.asctime()) + f.write("BUILD_PLATFORM=%r\n" % platform.processor()) + f.write("BUILD_OS=%r\n" % platform.platform()) + f.close() + except: + print "WARNING: failed to build overview_version file" class CustomBuild(build_ext): + def run(self): + # generate the version file + generate_version_py() + build_ext.run(self) def build_extensions(self): c = self.compiler.compiler_type if c == "msvc": @@ -130,24 +158,6 @@ class CustomBuild(build_ext): build_ext.build_extensions(self) -if py2exe is not None: -# define a subclass of py2exe to build our version file on the fly - class CustomPy2exe(py2exe.build_exe.py2exe): - def run(self): - try: - import util - f = open("overviewer_version.py", "w") - f.write("VERSION=%r\n" % util.findGitVersion()) - f.write("BUILD_DATE=%r\n" % time.asctime()) - f.write("BUILD_PLATFORM=%r\n" % platform.processor()) - f.write("BUILD_OS=%r\n" % platform.platform()) - f.close() - setup_kwargs['data_files'].append(('.', ['overviewer_version.py'])) - except: - print "WARNING: failed to build overview_version file" - py2exe.build_exe.py2exe.run(self) - setup_kwargs['cmdclass']['py2exe'] = CustomPy2exe - setup_kwargs['cmdclass']['clean'] = CustomClean setup_kwargs['cmdclass']['build_ext'] = CustomBuild ### From 8aafd3476980354d4818e1b3d373ada4224d0306 Mon Sep 17 00:00:00 2001 From: Aaron Griffith Date: Fri, 13 May 2011 22:40:18 -0400 Subject: [PATCH 05/19] --version now works with sdist --- MANIFEST.in | 1 - setup.py | 27 ++++++++++++++++++++------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index a1ea81c..1f852d6 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -4,6 +4,5 @@ include CONTRIBUTORS.rst include overviewer.py recursive-include contrib/ *.py recursive-include overviewer_core/*.py -exclude overviewer_core/overviewer_version.py recursive-include overviewer_core/src/ *.c *.h recursive-include overviewer_core/data/ *.png *.js index.html style.css diff --git a/setup.py b/setup.py index 08e7927..cb4e4a8 100755 --- a/setup.py +++ b/setup.py @@ -4,6 +4,7 @@ from distutils.core import setup, Extension from distutils.command.build import build from distutils.command.clean import clean from distutils.command.build_ext import build_ext +from distutils.command.sdist import sdist from distutils.dir_util import remove_tree from distutils import log import os, os.path @@ -130,20 +131,30 @@ class CustomClean(clean): def generate_version_py(): try: import overviewer_core.util as util + outstr = "" + outstr += "VERSION=%r\n" % util.findGitVersion() + outstr += "BUILD_DATE=%r\n" % time.asctime() + outstr += "BUILD_PLATFORM=%r\n" % platform.processor() + outstr += "BUILD_OS=%r\n" % platform.platform() f = open("overviewer_core/overviewer_version.py", "w") - f.write("VERSION=%r\n" % util.findGitVersion()) - f.write("BUILD_DATE=%r\n" % time.asctime()) - f.write("BUILD_PLATFORM=%r\n" % platform.processor()) - f.write("BUILD_OS=%r\n" % platform.platform()) + f.write(outstr) f.close() except: print "WARNING: failed to build overview_version file" -class CustomBuild(build_ext): +class CustomSDist(sdist): def run(self): # generate the version file generate_version_py() - build_ext.run(self) + sdist.run(self) + +class CustomBuild(build): + def run(self): + # generate the version file + generate_version_py() + build.run(self) + +class CustomBuildExt(build_ext): def build_extensions(self): c = self.compiler.compiler_type if c == "msvc": @@ -159,7 +170,9 @@ class CustomBuild(build_ext): setup_kwargs['cmdclass']['clean'] = CustomClean -setup_kwargs['cmdclass']['build_ext'] = CustomBuild +setup_kwargs['cmdclass']['sdist'] = CustomSDist +setup_kwargs['cmdclass']['build'] = CustomBuild +setup_kwargs['cmdclass']['build_ext'] = CustomBuildExt ### setup(**setup_kwargs) From c12f95b0a14fbff8a15497389a7d4ded7407af79 Mon Sep 17 00:00:00 2001 From: Aaron Griffith Date: Fri, 13 May 2011 23:39:44 -0400 Subject: [PATCH 06/19] nice version numbers, and metadata update --- MANIFEST.in | 1 + overviewer.py | 7 ++++--- overviewer_core/googlemap.py | 4 +++- overviewer_core/util.py | 23 +++++++++++++++++++++-- setup.py | 20 +++++++++++++++----- 5 files changed, 44 insertions(+), 11 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index 1f852d6..fe84bcb 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -2,6 +2,7 @@ include COPYING.txt include README.rst include CONTRIBUTORS.rst include overviewer.py +include sample.settings.py recursive-include contrib/ *.py recursive-include overviewer_core/*.py recursive-include overviewer_core/src/ *.c *.h diff --git a/overviewer.py b/overviewer.py index 3a0cb44..18b085e 100755 --- a/overviewer.py +++ b/overviewer.py @@ -39,7 +39,7 @@ try: from overviewer_core 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")) + ext = os.path.join(this_dir, "overviewer_core", "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)" @@ -113,13 +113,14 @@ def main(): if options.version: - print "Minecraft-Overviewer" - print "Git version: %s" % util.findGitVersion() try: import overviewer_core.overviewer_version as overviewer_version + print "Minecraft-Overviewer %s" % overviewer_version.VERSION + print "Git commit: %s" % overviewer_version.HASH print "built on %s" % overviewer_version.BUILD_DATE print "Build machine: %s %s" % (overviewer_version.BUILD_PLATFORM, overviewer_version.BUILD_OS) except: + print "version info not found" pass sys.exit(0) diff --git a/overviewer_core/googlemap.py b/overviewer_core/googlemap.py index 44fadff..8edb0a3 100644 --- a/overviewer_core/googlemap.py +++ b/overviewer_core/googlemap.py @@ -24,6 +24,7 @@ import json import util from c_overviewer import get_render_mode_inheritance +import overviewer_version """ This module has routines related to generating a Google Maps-based @@ -132,7 +133,8 @@ class MapGen(object): index = open(indexpath, 'r').read() index = index.replace( "{time}", str(strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()))) - index = index.replace("{version}", util.findGitVersion()) + versionstr = "%s (%s)" % (overviewer_version.VERSION, overviewer_version.HASH[:7]) + index = index.replace("{version}", versionstr) with open(os.path.join(self.destdir, "index.html"), 'w') as output: output.write(index) diff --git a/overviewer_core/util.py b/overviewer_core/util.py index 2da93ed..2bd15b5 100644 --- a/overviewer_core/util.py +++ b/overviewer_core/util.py @@ -21,6 +21,7 @@ import imp import os import os.path import sys +from subprocess import Popen, PIPE def get_program_path(): if hasattr(sys, "frozen") or imp.is_frozen("__main__"): @@ -34,8 +35,8 @@ def get_program_path(): return os.path.dirname(sys.argv[0]) - -def findGitVersion(): +# does not require git, very likely to work everywhere +def findGitHash(): 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: @@ -48,6 +49,24 @@ def findGitVersion(): else: return data else: + try: + import overviewer_version + return overviewer_version.HASH + except: + return "unknown" + +def findGitVersion(): + try: + p = Popen(['git', 'describe', '--tags'], stdout=PIPE, stderr=PIPE) + p.stderr.close() + line = p.stdout.readlines()[0] + if line.startswith('release-'): + line = line.split('-', 1)[1] + # turn 0.1.2-50-somehash into 0.1.2-50 + # and 0.1.3 into 0.1.3 + line = '-'.join(line.split('-', 2)[:2]) + return line.strip() + except: try: import overviewer_version return overviewer_version.VERSION diff --git a/setup.py b/setup.py index cb4e4a8..675b222 100755 --- a/setup.py +++ b/setup.py @@ -11,6 +11,7 @@ import os, os.path import glob import platform import time +import overviewer_core.util as util try: import py2exe @@ -28,11 +29,21 @@ setup_kwargs['options'] = {} # metadata # +# Utility function to read the README file. +# Used for the long_description. It's nice, because now 1) we have a top level +# README file and 2) it's easier to type in the README file than to put a raw +# string in below ... +def read(fname): + return open(os.path.join(os.path.dirname(__file__), fname)).read() + setup_kwargs['name'] = 'Minecraft-Overviewer' -setup_kwargs['version'] = '0.0.0' # TODO useful version +setup_kwargs['version'] = util.findGitVersion() +setup_kwargs['description'] = 'Generates large resolution images of a Minecraft map.' +setup_kwargs['url'] = 'http://overviewer.org/' setup_kwargs['author'] = 'Andrew Brown' setup_kwargs['author_email'] = 'brownan@gmail.com' -setup_kwargs['url'] = 'http://overviewer.org/' +setup_kwargs['license'] = 'GNU General Public License v3' +setup_kwargs['long_description'] = read('README.rst') # # py2exe options @@ -130,9 +141,9 @@ class CustomClean(clean): def generate_version_py(): try: - import overviewer_core.util as util outstr = "" outstr += "VERSION=%r\n" % util.findGitVersion() + outstr += "HASH=%r\n" % util.findGitHash() outstr += "BUILD_DATE=%r\n" % time.asctime() outstr += "BUILD_PLATFORM=%r\n" % platform.processor() outstr += "BUILD_OS=%r\n" % platform.platform() @@ -153,6 +164,7 @@ class CustomBuild(build): # generate the version file generate_version_py() build.run(self) + print "\nBuild Complete" class CustomBuildExt(build_ext): def build_extensions(self): @@ -177,5 +189,3 @@ setup_kwargs['cmdclass']['build_ext'] = CustomBuildExt setup(**setup_kwargs) - -print "\nBuild Complete" From 0104847c04cbb20ed11dcdb2bb3a456a4aa1514d Mon Sep 17 00:00:00 2001 From: Aaron Griffith Date: Sat, 14 May 2011 15:34:26 -0400 Subject: [PATCH 07/19] changed extra file install location to something more sane --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 675b222..8bbaaca 100755 --- a/setup.py +++ b/setup.py @@ -67,7 +67,7 @@ setup_kwargs['scripts'] = ['overviewer.py'] setup_kwargs['package_data'] = {'overviewer_core': ['data/textures/*', 'data/web_assets/*']} -setup_kwargs['data_files'] = [('Minecraft-Overviewer', ['COPYING.txt', 'README.rst', 'CONTRIBUTORS.rst', 'sample.settings.py'])] +setup_kwargs['data_files'] = [('share/doc/minecraft-overviewer', ['COPYING.txt', 'README.rst', 'CONTRIBUTORS.rst', 'sample.settings.py'])] # From 561bb64c7c4dc075433a4e70d7a2e83b99088a8e Mon Sep 17 00:00:00 2001 From: Aaron Griffith Date: Sat, 28 May 2011 15:05:52 -0400 Subject: [PATCH 08/19] fixes for py2exe/windows --- overviewer_core/googlemap.py | 6 +++++- overviewer_core/textures.py | 6 ++++++ setup.py | 9 ++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/overviewer_core/googlemap.py b/overviewer_core/googlemap.py index 8edb0a3..d853534 100644 --- a/overviewer_core/googlemap.py +++ b/overviewer_core/googlemap.py @@ -98,7 +98,11 @@ class MapGen(object): blank.save(os.path.join(tileDir, "blank."+quadtree.imgformat)) # copy web assets into destdir: - mirror_dir(os.path.join(util.get_program_path(), "overviewer_core", "data", "web_assets"), self.destdir) + global_assets = os.path.join(util.get_program_path(), "overviewer_core", "data", "web_assets") + if not os.path.isdir(global_assets): + global_assets = os.path.join(util.get_program_path(), "web_assets") + mirror_dir(global_assets, self.destdir) + # do the same with the local copy, if we have it if self.web_assets_path: mirror_dir(self.web_assets_path, self.destdir) diff --git a/overviewer_core/textures.py b/overviewer_core/textures.py index a6ee715..f7b6f36 100644 --- a/overviewer_core/textures.py +++ b/overviewer_core/textures.py @@ -14,6 +14,7 @@ # with the Overviewer. If not, see . import sys +import imp import os import os.path import zipfile @@ -56,6 +57,11 @@ def _find_file(filename, mode="rb"): path = os.path.join(programdir, "overviewer_core", "data", "textures", filename) if os.path.exists(path): return open(path, mode) + elif hasattr(sys, "frozen") or imp.is_frozen("__main__"): + # windows special case, when the package dir doesn't exist + path = os.path.join(programdir, "textures", filename) + if os.path.exists(path): + return open(path, mode) if sys.platform == "darwin": path = os.path.join("/Applications/Minecraft", filename) diff --git a/setup.py b/setup.py index 8bbaaca..63bae35 100755 --- a/setup.py +++ b/setup.py @@ -45,12 +45,18 @@ setup_kwargs['author_email'] = 'brownan@gmail.com' setup_kwargs['license'] = 'GNU General Public License v3' setup_kwargs['long_description'] = read('README.rst') +# top-level files that should be included as documentation +doc_files = ['COPYING.txt', 'README.rst', 'CONTRIBUTORS.rst', 'sample.settings.py'] + # # py2exe options # if py2exe is not None: setup_kwargs['console'] = ['overviewer.py'] + setup_kwargs['data_files'] = [('', doc_files), + ('textures', glob.glob('overviewer_core/data/textures/*')), + ('web_assets', glob.glob('overviewer_core/data/web_assets/*'))] setup_kwargs['zipfile'] = None if platform.system() == 'Windows' and '64bit' in platform.architecture(): b = 3 @@ -67,7 +73,8 @@ setup_kwargs['scripts'] = ['overviewer.py'] setup_kwargs['package_data'] = {'overviewer_core': ['data/textures/*', 'data/web_assets/*']} -setup_kwargs['data_files'] = [('share/doc/minecraft-overviewer', ['COPYING.txt', 'README.rst', 'CONTRIBUTORS.rst', 'sample.settings.py'])] +if py2exe is None: + setup_kwargs['data_files'] = [('share/doc/minecraft-overviewer', doc_files)] # From 387f97d64d61afc9b94d1e382048958064bc9743 Mon Sep 17 00:00:00 2001 From: Aaron Griffith Date: Sat, 28 May 2011 19:07:05 -0400 Subject: [PATCH 09/19] initial work on py2app for OSX --- setup.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/setup.py b/setup.py index 63bae35..5f29069 100755 --- a/setup.py +++ b/setup.py @@ -1,13 +1,14 @@ #!/usr/bin/python -from distutils.core import setup, Extension +from distutils.core import setup +from distutils.extension import Extension from distutils.command.build import build from distutils.command.clean import clean from distutils.command.build_ext import build_ext from distutils.command.sdist import sdist from distutils.dir_util import remove_tree from distutils import log -import os, os.path +import sys, os, os.path import glob import platform import time @@ -18,8 +19,14 @@ try: except ImportError: py2exe = None +try: + import py2app + from setuptools.extension import Extension +except ImportError: + py2app = None + # now, setup the keyword arguments for setup -# (because we don't know until runtime if py2exe is available) +# (because we don't know until runtime if py2exe/py2app is available) setup_kwargs = {} setup_kwargs['ext_modules'] = [] setup_kwargs['cmdclass'] = {} @@ -64,6 +71,15 @@ if py2exe is not None: b = 1 setup_kwargs['options']['py2exe'] = {'bundle_files' : b, 'excludes': 'Tkinter'} +# +# py2app options +# + +if py2app is not None: + setup_kwargs['app'] = ['overviewer.py'] + setup_kwargs['options']['py2app'] = {'argv_emulation' : False} + setup_kwargs['setup_requires'] = ['py2app'] + # # script, package, and data # @@ -111,8 +127,6 @@ setup_kwargs['ext_modules'].append(Extension('overviewer_core.c_overviewer', c_o # tell build_ext to build the extension in-place # (NOT in build/) setup_kwargs['options']['build_ext'] = {'inplace' : 1} -# tell the build command to only run build_ext -build.sub_commands = [('build_ext', None)] # custom clean command to remove in-place extension # and the version file From aed6938d2271c1538e6ce6a8737095e6dddc9ac9 Mon Sep 17 00:00:00 2001 From: Aaron Griffith Date: Wed, 22 Jun 2011 14:19:50 -0400 Subject: [PATCH 10/19] now fails correctly if --settings is given but file does not exist --- configParser.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/configParser.py b/configParser.py index 01e6a14..7a9adaa 100644 --- a/configParser.py +++ b/configParser.py @@ -81,6 +81,10 @@ class ConfigOptionParser(object): if os.path.exists(self.configFile): execfile(self.configFile, g, l) + elif options.config_file: + # file does not exist, but *was* specified on the command line + logging.error("Could not open %s." % self.configFile) + sys.exit(1) except NameError, ex: import traceback traceback.print_exc() From 79944d4f9065477b6b5c66dc734e5e07082bdab6 Mon Sep 17 00:00:00 2001 From: Aaron Griffith Date: Thu, 23 Jun 2011 17:44:04 -0400 Subject: [PATCH 11/19] fixed out-of-bounds index segfault --- src/rendermode-lighting.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/rendermode-lighting.c b/src/rendermode-lighting.c index 0a92554..c515db5 100644 --- a/src/rendermode-lighting.c +++ b/src/rendermode-lighting.c @@ -88,6 +88,14 @@ estimate_blocklevel(RenderModeLighting *self, RenderState *state, for (dx = -1; dx <= 1; dx += 2) { for (dy = -1; dy <= 1; dy += 2) { for (dz = -1; dz <= 1; dz += 2) { + + /* skip if block is out of range */ + if (x+dx < 0 || x+dx >= 16 || + y+dy < 0 || y+dy >= 16 || + z+dz < 0 || z+dz >= 128) { + continue; + } + coeff = estimate_blocklevel(self, state, x+dx, y+dy, z+dz, &auth); local_block = getArrayByte3D(blocks, x+dx, y+dy, z+dz); /* only add if the block is transparent, this seems to look better than From 62119c37eff8045e1d18fe3d2e84b777105b297d Mon Sep 17 00:00:00 2001 From: Aaron Griffith Date: Thu, 23 Jun 2011 15:21:46 -0700 Subject: [PATCH 12/19] bumped extension version for fix that closes #414 --- src/overviewer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/overviewer.h b/src/overviewer.h index 49e70fa..a0c5316 100644 --- a/src/overviewer.h +++ b/src/overviewer.h @@ -26,7 +26,7 @@ // increment this value if you've made a change to the c extesion // and want to force users to rebuild -#define OVERVIEWER_EXTENSION_VERSION 7 +#define OVERVIEWER_EXTENSION_VERSION 8 /* Python PIL, and numpy headers */ #include From c88d5b2c1a3329ac090b48932e3d363351426442 Mon Sep 17 00:00:00 2001 From: Andrew Clunis Date: Sat, 25 Jun 2011 19:43:10 -0400 Subject: [PATCH 13/19] Reimplemented search box. --- web_assets/overviewer.css | 31 ++++++++++++++++ web_assets/overviewer.js | 77 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) diff --git a/web_assets/overviewer.css b/web_assets/overviewer.css index f4bdd98..d875cdb 100644 --- a/web_assets/overviewer.css +++ b/web_assets/overviewer.css @@ -100,3 +100,34 @@ body { background-color: #fff; /* fallback */ background-color: rgba(255,255,255,0.8); } + +#searchControl { + padding: 5px; + height: 20px; + font-family: Arial, sans-serif; +} + +#searchControl > input { + border: 2px solid #000; + font-size: 12pt; + width: 20em; + background-colour: #fff; +} + +div#searchDropDown { + border: 1px solid #000; + width: 17em; + font-size: 14pt; + background-color: #fff; + display: none; +} + +div.searchResultItem { + overflow: hidden; + text-overflow: ellipsis; +} + +div.searchResultItem img { + width: 24px; + height: 24px; +} diff --git a/web_assets/overviewer.js b/web_assets/overviewer.js index ea87a19..a97341c 100644 --- a/web_assets/overviewer.js +++ b/web_assets/overviewer.js @@ -58,6 +58,7 @@ var overviewer = { overviewer.util.initializeMarkers(); overviewer.util.initializeRegions(); overviewer.util.createMapControls(); + overviewer.util.createSearchBox(); }, /** * This adds some methods to these classes because Javascript is stupid @@ -96,6 +97,25 @@ var overviewer = { return div; }; }, + /** + * Quote an arbitrary string for use in a regex matcher. + * WTB parametized regexes, JavaScript... + * + * From http://kevin.vanzonneveld.net + * original by: booeyOH + * improved by: Ates Goral (http://magnetiq.com) + * improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) + * bugfixed by: Onno Marsman + * example 1: preg_quote("$40"); + * returns 1: '\$40' + * example 2: preg_quote("*RRRING* Hello?"); + * returns 2: '\*RRRING\* Hello\?' + * example 3: preg_quote("\\.+*?[^]$(){}=!<>|:"); + * returns 3: '\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:' + */ + "pregQuote": function(str) { + return (str+'').replace(/([\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:])/g, "\\$1"); + }, /** * Setup the varous mapTypes before we actually create the map. This used * to be a bunch of crap down at the bottom of functions.js @@ -317,6 +337,7 @@ var overviewer = { 'icon': iconURL, 'visible': false }); + item.marker = marker; overviewer.util.debug(label); overviewer.collections.markers[label].push(marker); if (item.type == 'sign') { @@ -339,6 +360,7 @@ var overviewer = { 'icon': iconURL, 'visible': false }); + item.marker = marker; if (overviewer.collections.markers['__others__']) { overviewer.collections.markers['__others__'].push(marker); } else { @@ -758,6 +780,61 @@ var overviewer = { itemDiv.appendChild(textNode); } }, + /** + * Create search box and dropdown in the top right google maps area. + */ + 'createSearchBox': function() { + var searchControl = document.createElement("div"); + searchControl.id = "searchControl"; + + var searchInput = document.createElement("input"); + searchInput.type = "text"; + + searchControl.appendChild(searchInput); + + var searchDropDown = document.createElement("div"); + searchDropDown.id = "searchDropDown"; + searchControl.appendChild(searchDropDown); + + $(searchInput).keyup(function(e) { + var newline_stripper = new RegExp("[\\r\\n]", "g") + if(searchInput.value.length !== 0) { + $(searchDropDown).fadeIn(); + + $(searchDropDown).empty(); + + overviewer.collections.markerDatas.forEach(function(marker_list) { + marker_list.forEach(function(sign) { + var regex = new RegExp(overviewer.util.pregQuote(searchInput.value), "mi"); + if(sign.msg.match(regex)) { + if(sign.marker !== undefined && sign.marker.getVisible()) { + var t = document.createElement("div"); + t.className = "searchResultItem"; + var i = document.createElement("img"); + i.src = sign.marker.getIcon(); + t.appendChild(i); + var s = document.createElement("span"); + + $(s).text(sign.msg.replace(newline_stripper, "")); + t.appendChild(s); + searchDropDown.appendChild(t); + $(t).click(function(e) { + $(searchDropDown).fadeOut(); + overviewer.map.setZoom(7); + overviewer.map.setCenter(sign.marker.getPosition()); + }); + + } + } + }); + }); + } else { + $(searchDropDown).fadeOut(); + } + }); + + overviewer.map.controls[google.maps.ControlPosition.TOP_RIGHT].push(searchControl); + }, /** * Create the pop-up infobox for when you click on a region, this can't * be done in-line because of stupid Javascript scoping problems with From c1f13775d978c415449ca6b298e0c67adbbea79a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Ma=C5=82ecki?= Date: Mon, 4 Jul 2011 12:54:34 +0200 Subject: [PATCH 14/19] setup.py now checks for Imaging directory in Python include path. Appears to fix #402 --- setup.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index a5baa97..17b37c1 100644 --- a/setup.py +++ b/setup.py @@ -3,6 +3,7 @@ from distutils.command.build import build from distutils.command.clean import clean from distutils.command.build_ext import build_ext from distutils.dir_util import remove_tree +from distutils.sysconfig import get_python_inc from distutils import log import os, os.path import glob @@ -52,7 +53,10 @@ except AttributeError: try: pil_include = os.environ['PIL_INCLUDE_DIR'].split(os.pathsep) except: - pil_include = [] + pil_include = [ os.path.join(get_python_inc(plat_specific=1), 'Imaging') ] + if not os.path.exists(pil_include[0]): + pil_include = [ ] + # used to figure out what files to compile render_modes = ['normal', 'overlay', 'lighting', 'night', 'spawn', 'cave'] From 0c63bcb5fe5f1bc5518e5bc7badf95fb99d5f323 Mon Sep 17 00:00:00 2001 From: Aaron Griffith Date: Thu, 7 Jul 2011 16:35:48 -0400 Subject: [PATCH 15/19] changed setup.py to copy web_assets recursively for py2exe --- setup.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 17b37c1..da767ed 100644 --- a/setup.py +++ b/setup.py @@ -22,6 +22,24 @@ setup_kwargs['options'] = {} setup_kwargs['ext_modules'] = [] setup_kwargs['cmdclass'] = {} +# helper to create a 'data_files'-type sequence recursively for a given dir +def recursive_data_files(src, dest=None): + if dest is None: + dest = src + + ret = [] + for dirpath, dirnames, filenames in os.walk(src): + current_dest = os.path.relpath(dirpath, src) + if current_dest == '.': + current_dest = dest + else: + current_dest = os.path.join(dest, current_dest) + + current_sources = map(lambda p: os.path.join(dirpath, p), filenames) + + ret.append((current_dest, current_sources)) + return ret + # # py2exe options # @@ -29,8 +47,8 @@ setup_kwargs['cmdclass'] = {} if py2exe is not None: setup_kwargs['console'] = ['overviewer.py'] setup_kwargs['data_files'] = [('textures', ['textures/lava.png', 'textures/water.png', 'textures/fire.png', 'textures/portal.png']), - ('', ['COPYING.txt', 'README.rst']), - ('web_assets', glob.glob('web_assets/*'))] + ('', ['COPYING.txt', 'README.rst'])] + setup_kwargs['data_files'] += recursive_data_files('web_assets') setup_kwargs['zipfile'] = None if platform.system() == 'Windows' and '64bit' in platform.architecture(): b = 3 From da421a29a2a33e72ede08450f5c6e3f514b07efb Mon Sep 17 00:00:00 2001 From: Aaron Griffith Date: Sat, 9 Jul 2011 09:37:06 -0400 Subject: [PATCH 16/19] added --forcerender to the readme --- README.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.rst b/README.rst index 11f9f10..942e4cb 100644 --- a/README.rst +++ b/README.rst @@ -169,6 +169,10 @@ Options *Note*: Currently only the overviewer.dat file is deleted when you run with this option +--forcerender + Force re-rendering the entire map (or the given regionlist). This + is an easier way to completely re-render without deleting the map. + --regionlist=regionlist Use this option to specify manually a list of regions to consider for updating. Without this option, every chunk in every region is checked for From 410fdfb3a562030fd3dd928b41485b27e066dc0f Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Sat, 9 Jul 2011 11:29:23 -0400 Subject: [PATCH 17/19] Provide a better error message when a Windows package fails to import c_overviewer --- overviewer.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/overviewer.py b/overviewer.py index 1bf6790..9f13b8f 100755 --- a/overviewer.py +++ b/overviewer.py @@ -39,6 +39,15 @@ this_dir = util.get_program_path() try: import c_overviewer except ImportError: + ## if this is a frozen windows package, the following error messages about + ## building the c_overviewer extension are not appropriate + if hasattr(sys, "frozen"): + print "Something has gone wrong importing the c_overviewer extension. Please" + print "make sure the 2008 and 2010 redistributable packages from Microsoft" + print "are installed." + sys.exit(1) + + ## 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): From 65aecb97830c4449dd453bc6674f2ffc16dcb13c Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Sun, 10 Jul 2011 18:49:06 -0400 Subject: [PATCH 18/19] Purge pyc files on "setup.py clean" --- setup.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/setup.py b/setup.py index a3a4c37..d21e1be 100755 --- a/setup.py +++ b/setup.py @@ -182,6 +182,15 @@ class CustomClean(clean): except OSError: log.warn("'%s' could not be cleaned -- permission denied", versionpath) + # now try to purge all *.pyc files + for root, dirs, files in os.walk(os.path.join(os.path.dirname(__file__), ".")): + for f in files: + if f.endswith(".pyc"): + if self.dry_run: + log.warn("Would remove %s", os.path.join(root,f)) + else: + os.remove(os.path.join(root, f)) + def generate_version_py(): try: outstr = "" From 482ccd3dd87ef8e619cc49daa495eb6159e89bd3 Mon Sep 17 00:00:00 2001 From: Aaron Griffith Date: Sun, 10 Jul 2011 20:43:43 -0400 Subject: [PATCH 19/19] updated CONTRIBUTORS.rst --- CONTRIBUTORS.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTORS.rst b/CONTRIBUTORS.rst index ae100b4..30c5ffe 100644 --- a/CONTRIBUTORS.rst +++ b/CONTRIBUTORS.rst @@ -4,7 +4,8 @@ Contributors This file contains a list of every person who has contributed code to Overviewer. It was created from the git commit log, and should include -everyone, but we may have missed a few. +everyone, but we may have missed a few and it is manually updated +now. If you feel like you've been left out, feel free to tell us! Not currently included (but hopefully soon) are countless testers and bug reporters that helped fixed the many bugs that have popped up in the course of @@ -40,14 +41,17 @@ feature. * arrai * Kyle Brantley + * Eric Carr * cbarber * Alex Cline + * Andrew Clunis * CounterPillow * Stephen Fluin * Benjamin Herr * Ryan Hitchman * Jenny * Michael Jensen + * Maciej MaƂecki * Ryan McCue * Morlok8k * Gregory Short