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():
"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):
"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):
"Go from namespace to directory."

View file

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