retire.py (120 lines of code) (raw):

#!/usr/bin/env python3 """ Script to create retirement files for a project. Input: - https://whimsy.apache.org/public/committee-retired.json - https://lists.apache.org/api/preferences.lua - xdocs/projects/_template.xml - _template.jira Output: - xdocs/flagged/<pid> (created) - xdocs/projects/<pid>.xml (created) - xdocs/stylesheets/project.xml (updated) - cwiki_retired/<wiki_id>.txt (created) - <pid>.jira.tmp (created) - this is for pasting into an Attic JIRA issue N.B. The generated pid.xml file may need tweaking """ import sys import os.path from os.path import dirname, abspath, join from inspect import getsourcefile from string import Template import os import re from urlutils import loadyaml, loadjson, urlexists CWIKI='https://cwiki.apache.org/confluence/display/' if len(sys.argv) == 1: print("Please provide a list of project ids") sys.exit(1) JIRA='https://issues.apache.org/jira/rest/api/2/project' MYHOME = dirname(abspath(getsourcefile(lambda:0))) projects = join((MYHOME), 'xdocs', 'projects') stylesheets = join((MYHOME), 'xdocs', 'stylesheets') flagged = join((MYHOME), 'xdocs', 'flagged') cwiki_retired = join((MYHOME), 'cwiki_retired') # get details of the retired projects retirees = loadyaml('https://whimsy.apache.org/public/committee-retired.json')['retired'] lists = {} for host,names in loadyaml('https://lists.apache.org/api/preferences.lua')['lists'].items(): proj = host.replace('.apache.org','') if proj in retirees: lists[proj] = list(names.keys()) def list_jira(pid): jira = loadjson(JIRA) jiras = [] for project in jira: key = project['key'] catname = '' if 'projectCategory' in project: catname = project['projectCategory']['name'] if pid.upper() == key: jiras.append(key) elif catname.lower() == pid: jiras.append(key) return jiras # updates xdocs/stylesheets/project.xml # <li><a href="/projects/abdera.html">Abdera</a></li> def update_stylesheet(pid): xmlfile = join(stylesheets,'project.xml') xmlfilet = join(stylesheets,'project.xml.t') print("Updating %s" % xmlfile) found = False with open(xmlfile,'r') as r, open(xmlfilet,'w') as w: for l in r: if not found: m = re.search(r'^(\s+<li><a href="/projects/)([^.]+)(.html">)[^<]+(</a></li>)', l) if m: stem = m.group(2) if stem == pid: print("Already present in projects.xml") print(l) w.close() os.remove(xmlfilet) return if stem > pid: # Found insertion point found = True name = retirees[pid]['display_name'] w.write("%s%s%s%s%s\n" % (m.group(1), pid, m.group(3), name, m.group(4))) w.write(l) # write the original line if found: print("Successfully added %s to %s" % (pid, xmlfile)) os.system("diff %s %s" % (xmlfile, xmlfilet)) os.rename(xmlfilet, xmlfile) else: print("Could not find where to add %s" % pid) # create JIRA template def create_jira_template(pid): outfile = join(MYHOME, "%s.jira.tmp" % pid) print("Creating %s" % outfile) with open(join(MYHOME, '_template.jira'), 'r') as t: template = Template(t.read()) out = template.substitute(tlpid = pid) with open(outfile, 'w') as o: o.write(out) # create the project.xml file from the template def create_project(pid): outfile = join(projects, "%s.xml" % pid) print("Creating %s" % outfile) with open(join(projects, '_template.xml'), 'r') as t: template = Template(t.read()) meta = retirees[pid] mnames = lists[pid] mnames.remove('dev') jiras = list_jira(pid) out = template.substitute(tlpid = pid, FullName = meta['display_name'], Month_Year = meta['retired'], mail_names = ",".join(sorted(mnames)), jira_names = ",".join(sorted(jiras)), description = meta.get('description', 'TBA')) with open(outfile, 'w') as o: o.write(out) os.system("svn add %s" % outfile) print("Check XML file for customisations such as JIRA and mailing lists") def check_wiki(pid): url = CWIKI + pid.upper() if urlexists(url): flagfile = join(cwiki_retired, f"{pid}.txt") with open(flagfile, 'a'): pass # if wiki uses alias, would need to add tlp name here os.system("svn add %s" % flagfile) pass else: print(f"Could not find CWIKI entry at {url}, perhaps it uses an alias?") # TODO how to search cwiki for aliases? for arg in sys.argv[1:]: print("Processing "+arg) if not arg in retirees: print("%s does not appear to be a retired project" % arg) continue flagdir = join(flagged, arg) if os.path.exists(flagdir): print("flagged/%s already exists" % arg) continue create_jira_template(arg) try: os.mkdir(flagdir) os.system("svn add %s" % flagdir) create_project(arg) update_stylesheet(arg) check_wiki(arg) except Exception as e: print(e)