158 lines
4.4 KiB
Python
158 lines
4.4 KiB
Python
|
|
||
|
import glob
|
||
|
import os
|
||
|
import shutil
|
||
|
import sys
|
||
|
import xml.dom.minidom
|
||
|
|
||
|
#------------------------------------------------------------------------------------------
|
||
|
# DOM helper functions
|
||
|
#------------------------------------------------------------------------------------------
|
||
|
def getMatchingChildNodes(node, name):
|
||
|
l = list()
|
||
|
for item in node.childNodes:
|
||
|
if (item.nodeType == node.ELEMENT_NODE) and (item.nodeName == name):
|
||
|
l.append(item)
|
||
|
return l
|
||
|
|
||
|
def getText(nodelist):
|
||
|
rc = ""
|
||
|
for node in nodelist:
|
||
|
if node.nodeType == node.TEXT_NODE:
|
||
|
rc = rc + node.data
|
||
|
return rc
|
||
|
|
||
|
#------------------------------------------------------------------------------------------
|
||
|
def copyFiles(files):
|
||
|
|
||
|
for item in files:
|
||
|
src = item[0]
|
||
|
dst = item[1]
|
||
|
#print "%s -> %s" % (src, dst)
|
||
|
try:
|
||
|
os.makedirs(os.path.dirname(dst))
|
||
|
except:
|
||
|
pass
|
||
|
|
||
|
shutil.copy2(src, dst)
|
||
|
|
||
|
return True
|
||
|
|
||
|
#------------------------------------------------------------------------------------------
|
||
|
def handleDir(dirName, dstDir, root, recursive=False):
|
||
|
|
||
|
#print "handleDir: ENTER (%s)" % dirName
|
||
|
fileList = list()
|
||
|
fileNodes = getMatchingChildNodes(root, "File")
|
||
|
for fileNode in fileNodes:
|
||
|
name = getText(fileNode.childNodes)
|
||
|
if (fileNode.getAttribute("name")):
|
||
|
newName = fileNode.getAttribute("name")
|
||
|
else:
|
||
|
newName = None
|
||
|
|
||
|
files = glob.glob("%s/%s" % (dirName, name))
|
||
|
for item in files:
|
||
|
item = os.path.basename(item)
|
||
|
dstName = newName
|
||
|
if (dstName == None):
|
||
|
dstName = item
|
||
|
if (len(dirName) > 0):
|
||
|
if (os.path.isfile("%s/%s" % (dirName, item))):
|
||
|
fileList.append(("%s/%s" % (dirName, item), "%s/%s/%s" % (dstDir, dirName, dstName)))
|
||
|
else:
|
||
|
if (os.path.isfile(item)):
|
||
|
fileList.append((item, "%s/%s" % (dstDir, dstName)))
|
||
|
|
||
|
# handle any sub-dirs
|
||
|
if (recursive):
|
||
|
dirNodes = [root]
|
||
|
else:
|
||
|
dirNodes = getMatchingChildNodes(root, "Dir")
|
||
|
for dirNode in dirNodes:
|
||
|
if (recursive):
|
||
|
ignoreNodes = list()
|
||
|
if (len(dirName) > 0):
|
||
|
subDirName = "%s/*" % dirName
|
||
|
else:
|
||
|
subDirName = "*"
|
||
|
else:
|
||
|
ignoreNodes = getMatchingChildNodes(dirNode, "Ignore")
|
||
|
if (len(dirName) > 0):
|
||
|
subDirName = "%s/%s" % (dirName, dirNode.getAttribute("name"))
|
||
|
else:
|
||
|
subDirName = dirNode.getAttribute("name")
|
||
|
|
||
|
subRecursive = recursive
|
||
|
if (not subRecursive):
|
||
|
rStr = dirNode.getAttribute("recursive")
|
||
|
if ((rStr != None) and (rStr == "true")):
|
||
|
subRecursive = True
|
||
|
#print "RECURSIVE (%s)" % subDirName
|
||
|
|
||
|
#print "Checking for '%s'" % subDirName
|
||
|
names = glob.glob("%s" % subDirName)
|
||
|
for name in names:
|
||
|
if (os.path.basename(name) == ".svn"):
|
||
|
continue
|
||
|
|
||
|
# make sure it's not ignored
|
||
|
ignore = False
|
||
|
for ignoreNode in ignoreNodes:
|
||
|
ignoreName = getText(ignoreNode.childNodes)
|
||
|
#print "<----------------Checking '%s' for ignored '%s'" % (os.path.basename(name), ignoreName)
|
||
|
if (ignoreName == os.path.basename(name)):
|
||
|
ignore = True
|
||
|
|
||
|
if (ignore):
|
||
|
#print "IGNORING %s" % name
|
||
|
continue
|
||
|
|
||
|
if (os.path.isdir(name)):
|
||
|
dirList = handleDir(os.path.normpath(name), dstDir, dirNode, subRecursive)
|
||
|
for item in dirList:
|
||
|
fileList.append(item)
|
||
|
|
||
|
return fileList
|
||
|
|
||
|
#------------------------------------------------------------------------------------------
|
||
|
def main(argv):
|
||
|
|
||
|
# rootDir = os.path.dirname(argv[0])
|
||
|
# if (len(rootDir) == 0):
|
||
|
# rootDir = "."
|
||
|
# xmlName = "%s/replay.xml" % rootDir
|
||
|
|
||
|
rootDir = "."
|
||
|
xmlName = "%s/replay.xml" % rootDir
|
||
|
|
||
|
dom1 = xml.dom.minidom.parse(xmlName)
|
||
|
root = dom1.getElementsByTagName("ReplayFiles")
|
||
|
|
||
|
dstDir = None
|
||
|
while (dstDir == None):
|
||
|
dstDir = os.path.normpath("%s/../ReplayDisk" % rootDir)
|
||
|
sys.stdout.write("Enter the replay destination directory [%s]:" % dstDir)
|
||
|
dir = sys.stdin.readline().rstrip('\r\n')
|
||
|
if (len(dir) > 0):
|
||
|
dstDir = dir
|
||
|
|
||
|
fileCopyList = list()
|
||
|
|
||
|
rootList = handleDir(rootDir, dstDir, root[0])
|
||
|
for item in rootList:
|
||
|
fileCopyList.append(item)
|
||
|
|
||
|
if (not copyFiles(fileCopyList)):
|
||
|
return False
|
||
|
|
||
|
print "\n-----------------------------"
|
||
|
print "Replay disk creation complete"
|
||
|
print "-----------------------------"
|
||
|
return True
|
||
|
|
||
|
#------------------------------------------------------------------------------------------
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
if (main(sys.argv) != True):
|
||
|
sys.exit(-1);
|