#!/usr/bin/python3
import os, sys, xml.dom.minidom, re, os.path
def findAllFzp(dirList=["bins","contrib","core","obsolete"]):
result=[]
for d in dirList:
for root, dirs, files in os.walk(d):
for file in files:
if file.endswith(".fzp"):
result.append(os.path.join(root, file))
return result
class Author:
def __init__(self,name="", year=""):
self.name=name.strip()
self.year=year.strip()
def __str__(self):
template="{year} {name}"
return template.format(**self.__dict__)
def __eq__(self, other):
return self.name==other.name and self.year==other.year
def __lt__(self, other):
return self.name < other.name or self.year < other.year
yearpattern=re.compile(r".*(\d\d\d\d).*")
def fzp2authorDict(paths):
result={}
i=0
for p in paths:
try:
msg="file not parsed"
doc=xml.dom.minidom.parse(open(p, "rt", encoding="utf-8"))
msg="date not parsed"
date=doc.getElementsByTagName("date")[0]
msg="author's name not parsed"
name=doc.getElementsByTagName("author")[0]
msg="year not parsed"
year=yearpattern.match(date.firstChild.nodeValue).group(1)
sys.stdout.write("{}\r".format(i))
i+=1
author=Author(name.firstChild.nodeValue, year)
# add paths into the dictionary. In order to be able
# to make space separated path lists, the space characters
# are replaced by the '?' wildcards.
if str(author) in result:
result[str(author)].append(p.replace(" ","?"))
else:
result[str(author)]=[p.replace(" ","?")]
except Exception as e:
sys.stderr.write("{}\n".format(e))
sys.stderr.write("Error, malformed XML file: {} ({})\n".format(p, msg))
sys.stdout.write("\n")
return result
def authorDict2copyright(d):
result=""
authors=sorted(d.keys())
for a in authors:
result+="""
Files: {}
Copyright: {}
License: CC-BY-SA-3.0
""".format(" ".join(d[a]), a)
return result
if __name__=="__main__":
fzps=findAllFzp()
dictAuthor=fzp2authorDict(fzps)
copyrightFile=os.path.abspath(os.path.join(os.path.dirname(__file__),
"copyright"))
with open(copyrightFile, "wt", encoding="utf-8") as outfile, \
open(copyrightFile+".in", "rt", encoding="utf-8") as infile:
lines=infile.readlines()
for l in lines:
if "#end authors of parts" not in l:
outfile.write(l)
else:
outfile.write(authorDict2copyright(dictAuthor))
outfile.write("Comment: "+l)
print("wrote", copyrightFile)