Steps towards making wmlmove work better.

This commit is contained in:
Eric S. Raymond 2007-07-22 04:43:45 +00:00
parent 3ee8174406
commit 289175a7b5
2 changed files with 45 additions and 36 deletions

View File

@ -287,11 +287,11 @@ class CrossRef:
def scopelist(): def scopelist():
"Return a list of (separate) package scopes, core first." "Return a list of (separate) package scopes, core first."
return ["data/core"] + glob.glob("data/campaigns/*") return map(os.path.basename, ["data/core"] + glob.glob("data/campaigns/*"))
def is_namespace(name): def is_namespace(name):
"Is the name either a valid campaign name or core?" "Is the name either a valid campaign name or core?"
return name in map(os.path.basename, scopelist()) return name in scopelist()
def namespace_directory(name): def namespace_directory(name):
"Go from namespace to directory." "Go from namespace to directory."

View File

@ -38,12 +38,13 @@ translation files.
''' '''
import sys, os, time, re, getopt, sre_constants, md5 import sys, os, time, re, getopt, sre_constants, md5
import wesnoth.wmltools from wesnoth.wmltools import *
if __name__ == "__main__": if __name__ == "__main__":
# Process options. # Process options.
(options, arguments) = getopt.getopt(sys.argv[1:], "dhilr", ['delete', 'help', 'imageclass', 'list', 'revert']) (options, arguments) = getopt.getopt(sys.argv[1:], "dhi:lLr", ['delete', 'help', 'imageclass', 'list', 'listspaces', 'revert'])
listem = False listem = False
listspaces = False
iclass = None iclass = None
delete = False delete = False
revert = False revert = False
@ -54,22 +55,26 @@ if __name__ == "__main__":
elif switch in ('-d', '--delete'): elif switch in ('-d', '--delete'):
delete = True delete = True
elif switch in ('-i', '--imageclass'): elif switch in ('-i', '--imageclass'):
iclass = True iclass = val
elif switch in ('-l', '--list'): elif switch in ('-l', '--list'):
listem = True listem = True
elif switch in ('-L', '--listspaces'):
listspaces = True
elif switch in ('-r', '--revert'): elif switch in ('-r', '--revert'):
listem = True listem = True
if len(arguments) == 0:
sys.stderr.write("wmlmove: at least one path to a unit is required.\n") if not listspaces:
sys.stderr.write(__doc__) if len(arguments) == 0:
sys.exit(1) sys.stderr.write("wmlmove: at least one path to a unit is required.\n")
if not delete:
if len(arguments) == 1:
sys.stderr.write("wmlmove: a campaign name or 'core' is required.\n")
sys.stderr.write(__doc__) sys.stderr.write(__doc__)
sys.exit(1) sys.exit(1)
else: if not delete:
dst = arguments.pop() if len(arguments) == 1:
sys.stderr.write("wmlmove: a campaign name or 'core' is required.\n")
sys.stderr.write(__doc__)
sys.exit(1)
else:
dst = arguments.pop()
# First, pop upward to the top-level directory. # First, pop upward to the top-level directory.
upwards = os.getcwd().split(os.sep) upwards = os.getcwd().split(os.sep)
@ -84,6 +89,10 @@ if __name__ == "__main__":
"for Wesnoth source tree.\n") "for Wesnoth source tree.\n")
sys.exit(1) sys.exit(1)
if listspaces:
print " ".join(scopelist())
sys.exit(0)
# Locate the unit .cfgs to be moved. # Locate the unit .cfgs to be moved.
srclist = [] srclist = []
for src in arguments: for src in arguments:
@ -93,10 +102,10 @@ if __name__ == "__main__":
sys.stderr.write("wmlmove: source name must be in the form " sys.stderr.write("wmlmove: source name must be in the form "
"namespace::resource.\n") "namespace::resource.\n")
sys.exit(1) sys.exit(1)
if not wmltools.is_namespace(namespace): if not is_namespace(namespace):
sys.stderr.write("wmlmove: no such scope as %s.\n" % namespace) sys.stderr.write("wmlmove: no such scope as %s.\n" % namespace)
sys.exit(1) sys.exit(1)
src = wmltools.resolve_unit_cfg(namespace, resource) src = resolve_unit_cfg(namespace, resource)
if not os.path.exists(src): if not os.path.exists(src):
sys.stderr.write("wmlmove: can't find %s to move it.\n" % src) sys.stderr.write("wmlmove: can't find %s to move it.\n" % src)
sys.exit(1) sys.exit(1)
@ -104,13 +113,13 @@ if __name__ == "__main__":
# Validate the destination. # Validate the destination.
if not delete: if not delete:
dstdir = wmltools.namespace_directory(arguments[dst]) dstdir = namespace_directory(dst)
if dstdir == None: if dstdir == None:
sys.stderr.write("wmlmove: invalid namespace %s\n" % dstdir) sys.stderr.write("wmlmove: invalid namespace %s\n" % dstdir)
sys.exit(1) sys.exit(1)
# Cross-reference all files. # Cross-reference all files.
cref = wmltools.CrossRef(wmltools.scopelist()) cref = CrossRef(scopelist())
# Filter reference information on all files referenced in the source .cfgs # Filter reference information on all files referenced in the source .cfgs
srcrefs = cref.subtract(srclist) srcrefs = cref.subtract(srclist)
@ -168,45 +177,45 @@ overwrite()
if delete: if delete:
print "# Image deletions:" print "# Image deletions:"
for (name, defloc) in srcrefs.fileref.items(): for (name, defloc) in srcrefs.fileref.items():
for namespace in map(wmltools.directory_namespace, srclist): for namespace in map(directory_namespace, srclist):
if wmltools.namespace_member(name, namespace) and cref.refcount(name) == 0: if namespace_member(name, namespace) and cref.refcount(name) == 0:
if revert: if revert:
print wmltools.vcundelete(name) print vcundelete(name)
else: else:
print wmltools.vcdelete(name) print vcdelete(name)
break break
print "" print ""
print "# .cfg deletions" print "# .cfg deletions"
for filename in srclist: for filename in srclist:
if revert: if revert:
print wmltools.vcundelete(filename) print vcundelete(filename)
else: else:
print wmltools.vcdelete(filename) print vcdelete(filename)
else: else:
if iclass == None: if iclass == None:
print "# Defaulting image subclass to 'monsters', use -i to set it." print "# Defaulting image subclass to 'monsters', use -i to set it."
iclass = 'monsters' iclass = 'monsters'
print "# Image moves:" print "# Image moves:"
for (name, defloc) in srcrefs.fileref.items(): for (name, defloc) in srcrefs.fileref.items():
source = wmltools.directory_namespace(name) source = directory_namespace(name)
target = wmltools.resolve_unit_image(dst, iclass, os.path.basename(name)) target = resolve_unit_image(dst, iclass, os.path.basename(name))
if revert: if revert:
if not wmltools.namespace_member(name, source): if not namespace_member(name, source):
print wmltools.vcunmove(name, target) print vcunmove(name, target)
else: else:
if not wmltools.namespace_member(name, dst): if not namespace_member(name, dst):
print wmltools.vcmove(name, target) print vcmove(name, target)
print "" print ""
print "# .cfg moves and transformations" print "# .cfg moves and transformations"
for filename in srclist: for filename in srclist:
source = wmltools.directory_namespace(name) source = directory_namespace(filename)
target = wmltools.resolve_unit_cfg(dst, os.path.basename(filename)) target = resolve_unit_cfg(dst, os.path.basename(filename))
if revert: if revert:
if not wmltools.namespace_member(filename, source): if not namespace_member(filename, source):
print wmltools.vcunmove(filename, target) print vcunmove(filename, target)
else: else:
if not wmltools.namespace_member(filename, dst): if not namespace_member(filename, dst):
print wmltools.vcmove(filename, target) print vcmove(filename, target)
if iclass: if iclass:
print "replace 'units/' 'units/%s/' %s" % (iclass, target) print "replace 'units/' 'units/%s/' %s" % (iclass, target)
if dst == "core": if dst == "core":