diff --git a/contrib/validateRegionFile.py b/contrib/validateRegionFile.py index 3846784..1e5320a 100644 --- a/contrib/validateRegionFile.py +++ b/contrib/validateRegionFile.py @@ -1,12 +1,9 @@ #!/usr/bin/python -usage = "python contrib/%prog [OPTIONS] " +usage = "python contrib/%prog [OPTIONS] ()*" description = """ -This script will delete files from the old chunk-based cache, a lot -like the old `gmap.py -d World/` command. You should only use this if -you're updating from an older version of Overviewer, and you want to -clean up your world folder. +This script will valide a minecraft region file for errors """ from optparse import OptionParser @@ -21,56 +18,74 @@ sys.path.insert(0, overviewer_dir) import nbt import chunk +import quadtree def main(): parser = OptionParser(usage=usage, description=description) -# parser.add_option("-d", "--dry-run", dest="dry", action="store_true", -# help="Don't actually delete anything. Best used with -v.") + parser.add_option("-r", "--regions", dest="regiondir", help="Use path to the regions instead of a list of files") + parser.add_option("-v", dest="verbose", action="store_true", help="Lists why a chunk in a region failed") opt, args = parser.parse_args() - if not len(args) == 1: + if opt.regiondir: + if os.path.exists(opt.regiondir): + for dirpath, dirnames, filenames in os.walk(opt.regiondir, 'region'): + if not dirnames and filenames and "DIM-1" not in dirpath: + for f in filenames: + if f.startswith("r.") and f.endswith(".mcr"): + p = f.split(".") + args.append(os.path.join(dirpath, f)) + + if len(args) < 1: + print "You must list at least one region file" parser.print_help() sys.exit(1) - - regionfile = args[0] - - if not os.path.exists(regionfile): - parser.print_help() - print "\nFile not found" - sys.exit(1) - chunk_pass = 0 - chunk_total = 0 - print( "Loading region: %s" % ( regionfile)) - try: - mcr = nbt.load_region(regionfile) - except IOError, e: - print("Error opening regionfile. It may be corrupt. %s"%( e)) - pass - if mcr is not None: + + for regionfile in args: + _,shortname = os.path.split(regionfile) + chunk_pass = 0 + chunk_total = 0 + if not os.path.exists(regionfile): + print("Region:%s Passed %s/%s"%(shortname,chunk_pass,chunk_total)) + continue try: - chunks = mcr.get_chunk_info(False) + mcr = nbt.load_region(regionfile) except IOError, e: - print("Error opening regionfile(bad header info). It may be corrupt. %s"%( e)) - chunks = [] - pass - for x, y in chunks: - chunk_total += 1 - #try: - chunk_data = mcr.load_chunk(x, y) - if chunk_data is None: - print("Chunk %s:%s is unexpectedly empty"%(x, y)) - else: - try: - processed = chunk_data.read_all() - if processed == []: - print("Chunk %s:%s is an unexpectedly empty set"%(x, y)) - else: - chunk_pass += 1 - except Exception, e: - print("Error opening chunk (%i, %i) It may be corrupt. %s"%( x, y, e)) - else: - print("Error opening regionfile.") - print("Done; Passed %s/%s"%(chunk_pass,chunk_total)) + if options.verbose: + print("Error opening regionfile. It may be corrupt. %s"%( e)) + if mcr is not None: + try: + chunks = mcr.get_chunk_info(False) + except IOError, e: + if options.verbose: + print("Error opening regionfile(bad header info). It may be corrupt. %s"%( e)) + chunks = [] + for x, y in chunks: + chunk_total += 1 + #try: + chunk_data = mcr.load_chunk(x, y) + if chunk_data is None: + if options.verbose: + print("Chunk %s:%s is unexpectedly empty"%(x, y)) + else: + try: + processed = chunk_data.read_all() + if processed == []: + if options.verbose: + print("Chunk %s:%s is an unexpectedly empty set"%(x, y)) + else: + chunk_pass += 1 + except Exception, e: + if options.verbose: + print("Error opening chunk (%i, %i) It may be corrupt. %s"%( x, y, e)) + else: + if options.verbose: + print("Error opening regionfile.") + + print("Region:%s Passed %s/%s"%(shortname,chunk_pass,chunk_total)) if __name__ == "__main__": - main() + try: + main() + except KeyboardInterrupt: + print "Caught Ctrl-C" +