def main(): options = parse_args() if options.release_version: with open(os.path.join(os.path.dirname(__file__), "../VERSION"), 'r') as ver_file: print ver_file.read() sys.exit(0) if options.output_directory is not None: # Create the output directory if it does not exist. # Equivalent to `mkdir -p`. try: os.makedirs(options.output_directory) except OSError as exc: if exc.errno == errno.EEXIST and os.path.isdir( options.output_directory): pass else: print "Unable to create output directory %s: %s" % \ (options.output_directory, exc.message) sys.exit(1) os.chdir(options.output_directory) if options.base_url is not None: global JIRA_BASE_URL JIRA_BASE_URL = options.base_url if options.incompatible_label is not None: global BACKWARD_INCOMPATIBLE_LABEL BACKWARD_INCOMPATIBLE_LABEL = options.incompatible_label projects = options.projects if options.range is True: versions = [ Version(v) for v in GetVersions(options.versions, projects).getlist() ] else: versions = [Version(v) for v in options.versions] versions.sort() global SORTTYPE SORTTYPE = options.sorttype global SORTORDER SORTORDER = options.sortorder if options.title is None: title = projects[0] else: title = options.title if options.retries is not None: global NUM_RETRIES NUM_RETRIES = options.retries[0] haderrors = False for version in versions: vstr = str(version) linter = Linter(vstr, options) jlist = sorted(JiraIter(vstr, projects)) if len(jlist) == 0: print "There is no issue which has the specified version: %s" % version continue if vstr in RELEASE_VERSION: reldate = RELEASE_VERSION[vstr] elif options.usetoday: reldate = strftime("%Y-%m-%d", gmtime()) else: reldate = "Unreleased (as of %s)" % strftime("%Y-%m-%d", gmtime()) if not os.path.exists(vstr): os.mkdir(vstr) reloutputs = Outputs("%(ver)s/RELEASENOTES.%(ver)s.md", "%(ver)s/RELEASENOTES.%(key)s.%(ver)s.md", [], { "ver": version, "date": reldate, "title": title }) choutputs = Outputs("%(ver)s/CHANGES.%(ver)s.md", "%(ver)s/CHANGES.%(key)s.%(ver)s.md", [], { "ver": version, "date": reldate, "title": title }) if options.license is True: reloutputs.write_all(ASF_LICENSE) choutputs.write_all(ASF_LICENSE) relhead = '# %(title)s %(key)s %(ver)s Release Notes\n\n' \ 'These release notes cover new developer and user-facing ' \ 'incompatibilities, important issues, features, and major improvements.\n\n' chhead = '# %(title)s Changelog\n\n' \ '## Release %(ver)s - %(date)s\n'\ '\n' reloutputs.write_all(relhead) choutputs.write_all(chhead) incompatlist = [] importantlist = [] buglist = [] improvementlist = [] newfeaturelist = [] subtasklist = [] tasklist = [] testlist = [] otherlist = [] for jira in jlist: if jira.get_incompatible_change(): incompatlist.append(jira) elif jira.get_important(): importantlist.append(jira) elif jira.get_type() == "Bug": buglist.append(jira) elif jira.get_type() == "Improvement": improvementlist.append(jira) elif jira.get_type() == "New Feature": newfeaturelist.append(jira) elif jira.get_type() == "Sub-task": subtasklist.append(jira) elif jira.get_type() == "Task": tasklist.append(jira) elif jira.get_type() == "Test": testlist.append(jira) else: otherlist.append(jira) line = '* [%s](' % (sanitize_text(jira.get_id())) + JIRA_BASE_URL + \ '/browse/%s) | *%s* | **%s**\n' \ % (sanitize_text(jira.get_id()), sanitize_text(jira.get_priority()), sanitize_text(jira.get_summary())) if len(jira.get_release_note()) > 0 or \ jira.get_incompatible_change() or jira.get_important(): reloutputs.write_key_raw(jira.get_project(), "\n---\n\n") reloutputs.write_key_raw(jira.get_project(), line) if len(jira.get_release_note()) == 0: line = '\n**WARNING: No release note provided for this change.**\n\n' else: line = '\n%s\n\n' % (processrelnote( jira.get_release_note())) reloutputs.write_key_raw(jira.get_project(), line) linter.lint(jira) if linter.enabled: print linter.message() if linter.had_errors(): haderrors = True shutil.rmtree(vstr) continue reloutputs.write_all("\n\n") reloutputs.close() if options.skip_credits: CHANGEHDR1 = "| JIRA | Summary | Priority | " + \ "Component |\n" CHANGEHDR2 = "|:---- |:---- | :--- |:---- |\n" else: CHANGEHDR1 = "| JIRA | Summary | Priority | " + \ "Component | Reporter | Contributor |\n" CHANGEHDR2 = "|:---- |:---- | :--- |:---- |:---- |:---- |\n" if incompatlist: choutputs.write_all("### INCOMPATIBLE CHANGES:\n\n") choutputs.write_all(CHANGEHDR1) choutputs.write_all(CHANGEHDR2) choutputs.write_list(incompatlist, options.skip_credits) if importantlist: choutputs.write_all("\n\n### IMPORTANT ISSUES:\n\n") choutputs.write_all(CHANGEHDR1) choutputs.write_all(CHANGEHDR2) choutputs.write_list(importantlist, options.skip_credits) if newfeaturelist: choutputs.write_all("\n\n### NEW FEATURES:\n\n") choutputs.write_all(CHANGEHDR1) choutputs.write_all(CHANGEHDR2) choutputs.write_list(newfeaturelist, options.skip_credits) if improvementlist: choutputs.write_all("\n\n### IMPROVEMENTS:\n\n") choutputs.write_all(CHANGEHDR1) choutputs.write_all(CHANGEHDR2) choutputs.write_list(improvementlist, options.skip_credits) if buglist: choutputs.write_all("\n\n### BUG FIXES:\n\n") choutputs.write_all(CHANGEHDR1) choutputs.write_all(CHANGEHDR2) choutputs.write_list(buglist, options.skip_credits) if testlist: choutputs.write_all("\n\n### TESTS:\n\n") choutputs.write_all(CHANGEHDR1) choutputs.write_all(CHANGEHDR2) choutputs.write_list(testlist, options.skip_credits) if subtasklist: choutputs.write_all("\n\n### SUB-TASKS:\n\n") choutputs.write_all(CHANGEHDR1) choutputs.write_all(CHANGEHDR2) choutputs.write_list(subtasklist, options.skip_credits) if tasklist or otherlist: choutputs.write_all("\n\n### OTHER:\n\n") choutputs.write_all(CHANGEHDR1) choutputs.write_all(CHANGEHDR2) choutputs.write_list(otherlist, options.skip_credits) choutputs.write_list(tasklist, options.skip_credits) choutputs.write_all("\n\n") choutputs.close() if options.index: buildindex(title, options.license) buildreadme(title, options.license) if haderrors is True: sys.exit(1)
def main(): options = parse_args() if options.release_version: with open( os.path.join( os.path.dirname(__file__), "../VERSION"), 'r') as ver_file: print ver_file.read() sys.exit(0) if options.output_directory is not None: # Create the output directory if it does not exist. # Equivalent to `mkdir -p`. try: os.makedirs(options.output_directory) except OSError as exc: if exc.errno == errno.EEXIST and os.path.isdir( options.output_directory): pass else: print "Unable to create output directory %s: %s" % \ (options.output_directory, exc.message) sys.exit(1) os.chdir(options.output_directory) if options.base_url is not None: global JIRA_BASE_URL JIRA_BASE_URL = options.base_url if options.incompatible_label is not None: global BACKWARD_INCOMPATIBLE_LABEL BACKWARD_INCOMPATIBLE_LABEL = options.incompatible_label proxy = urllib2.ProxyHandler() opener = urllib2.build_opener(proxy) urllib2.install_opener(opener) projects = options.projects if options.range is True: versions = [Version(v) for v in GetVersions(options.versions, projects).getlist()] else: versions = [Version(v) for v in options.versions] versions.sort() global SORTTYPE SORTTYPE = options.sorttype global SORTORDER SORTORDER = options.sortorder if options.title is None: title = projects[0] else: title = options.title if options.retries is not None: global NUM_RETRIES NUM_RETRIES = options.retries[0] haderrors = False for version in versions: vstr = str(version) linter = Linter(vstr, options) jlist = sorted(JiraIter(vstr, projects)) if len(jlist) == 0: print "There is no issue which has the specified version: %s" % version continue if vstr in RELEASE_VERSION: reldate = RELEASE_VERSION[vstr] elif options.usetoday: reldate = strftime("%Y-%m-%d", gmtime()) else: reldate = "Unreleased (as of %s)" % strftime("%Y-%m-%d", gmtime()) if not os.path.exists(vstr): os.mkdir(vstr) reloutputs = Outputs("%(ver)s/RELEASENOTES.%(ver)s.md", "%(ver)s/RELEASENOTES.%(key)s.%(ver)s.md", [], {"ver": version, "date": reldate, "title": title}) choutputs = Outputs("%(ver)s/CHANGES.%(ver)s.md", "%(ver)s/CHANGES.%(key)s.%(ver)s.md", [], {"ver": version, "date": reldate, "title": title}) if options.license is True: reloutputs.write_all(ASF_LICENSE) choutputs.write_all(ASF_LICENSE) relhead = '# %(title)s %(key)s %(ver)s Release Notes\n\n' \ 'These release notes cover new developer and user-facing ' \ 'incompatibilities, important issues, features, and major improvements.\n\n' chhead = '# %(title)s Changelog\n\n' \ '## Release %(ver)s - %(date)s\n'\ '\n' reloutputs.write_all(relhead) choutputs.write_all(chhead) incompatlist = [] importantlist = [] buglist = [] improvementlist = [] newfeaturelist = [] subtasklist = [] tasklist = [] testlist = [] otherlist = [] for jira in jlist: if jira.get_incompatible_change(): incompatlist.append(jira) elif jira.get_important(): importantlist.append(jira) elif jira.get_type() == "Bug": buglist.append(jira) elif jira.get_type() == "Improvement": improvementlist.append(jira) elif jira.get_type() == "New Feature": newfeaturelist.append(jira) elif jira.get_type() == "Sub-task": subtasklist.append(jira) elif jira.get_type() == "Task": tasklist.append(jira) elif jira.get_type() == "Test": testlist.append(jira) else: otherlist.append(jira) line = '* [%s](' % (sanitize_text(jira.get_id())) + JIRA_BASE_URL + \ '/browse/%s) | *%s* | **%s**\n' \ % (sanitize_text(jira.get_id()), sanitize_text(jira.get_priority()), sanitize_text(jira.get_summary())) if len(jira.get_release_note()) > 0 or \ jira.get_incompatible_change() or jira.get_important(): reloutputs.write_key_raw(jira.get_project(), "\n---\n\n") reloutputs.write_key_raw(jira.get_project(), line) if len(jira.get_release_note()) == 0: line = '\n**WARNING: No release note provided for this change.**\n\n' else: line = '\n%s\n\n' % ( processrelnote(jira.get_release_note())) reloutputs.write_key_raw(jira.get_project(), line) linter.lint(jira) if linter.enabled: print linter.message() if linter.had_errors(): haderrors = True shutil.rmtree(vstr) continue reloutputs.write_all("\n\n") reloutputs.close() if incompatlist: choutputs.write_all("### INCOMPATIBLE CHANGES:\n\n") choutputs.write_all(CHANGEHDR1) choutputs.write_all(CHANGEHDR2) choutputs.write_list(incompatlist) if importantlist: choutputs.write_all("\n\n### IMPORTANT ISSUES:\n\n") choutputs.write_all(CHANGEHDR1) choutputs.write_all(CHANGEHDR2) choutputs.write_list(importantlist) if newfeaturelist: choutputs.write_all("\n\n### NEW FEATURES:\n\n") choutputs.write_all(CHANGEHDR1) choutputs.write_all(CHANGEHDR2) choutputs.write_list(newfeaturelist) if improvementlist: choutputs.write_all("\n\n### IMPROVEMENTS:\n\n") choutputs.write_all(CHANGEHDR1) choutputs.write_all(CHANGEHDR2) choutputs.write_list(improvementlist) if buglist: choutputs.write_all("\n\n### BUG FIXES:\n\n") choutputs.write_all(CHANGEHDR1) choutputs.write_all(CHANGEHDR2) choutputs.write_list(buglist) if testlist: choutputs.write_all("\n\n### TESTS:\n\n") choutputs.write_all(CHANGEHDR1) choutputs.write_all(CHANGEHDR2) choutputs.write_list(testlist) if subtasklist: choutputs.write_all("\n\n### SUB-TASKS:\n\n") choutputs.write_all(CHANGEHDR1) choutputs.write_all(CHANGEHDR2) choutputs.write_list(subtasklist) if tasklist or otherlist: choutputs.write_all("\n\n### OTHER:\n\n") choutputs.write_all(CHANGEHDR1) choutputs.write_all(CHANGEHDR2) choutputs.write_list(otherlist) choutputs.write_list(tasklist) choutputs.write_all("\n\n") choutputs.close() if options.index: buildindex(title, options.license) buildreadme(title, options.license) if haderrors is True: sys.exit(1)