You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@incubator.apache.org by wa...@apache.org on 2019/03/18 03:12:22 UTC
svn commit: r1855728 [1/2] - in /incubator/public/trunk: ./ content/clutch/
content/clutch/_includes/
Author: wave
Date: Mon Mar 18 03:12:21 2019
New Revision: 1855728
URL: http://svn.apache.org/viewvc?rev=1855728&view=rev
Log:
Further updates to clutch2. Produces Asciidoctor clutch pages with includes. content/clutch/index.ad is a nearly complete replacement for index.xml. clutch2.sh is a bash shell script that includes error checking. $? can be chacked after completion
Added:
incubator/public/trunk/clutch2.sh (with props)
incubator/public/trunk/content/clutch/_includes/
incubator/public/trunk/content/clutch/_includes/clutchm.ad
incubator/public/trunk/content/clutch/_includes/clutchmy.ad
incubator/public/trunk/content/clutch/_includes/clutcho1.ad
incubator/public/trunk/content/clutch/_includes/clutcho2.ad
incubator/public/trunk/content/clutch/_includes/clutchr.ad
incubator/public/trunk/content/clutch/_includes/clutcht.ad
incubator/public/trunk/content/clutch/index.ad
Modified:
incubator/public/trunk/clutch2.py
incubator/public/trunk/clutch2status.py
incubator/public/trunk/content/clutch/report_due_1.txt
incubator/public/trunk/content/clutch/report_due_2.txt
incubator/public/trunk/content/clutch/report_due_3.txt
Modified: incubator/public/trunk/clutch2.py
URL: http://svn.apache.org/viewvc/incubator/public/trunk/clutch2.py?rev=1855728&r1=1855727&r2=1855728&view=diff
==============================================================================
--- incubator/public/trunk/clutch2.py (original)
+++ incubator/public/trunk/clutch2.py Mon Mar 18 03:12:21 2019
@@ -302,22 +302,43 @@ inputFile = open('clutch.pkl', 'rb')
state = pickle.load(inputFile)
inputFile.close()
+print("START: Incubator Podlings: {0}{1}".format(SITE_CONTENT_DIR,"podlings.xml"))
+print("START: See https://whimsy.apache.org/incubator/podlings/by-age")
+print("START: Whimsy Project LDAP: {0}".format(PROJECT_LDAP))
+print("START: See https://whimsy.apache.org/public/")
+print("START: Whimsy Podling Website Scan: {0}".format(PODLING_SITE))
+print("START: See https://whimsy.apache.org/pods/")
+print("START: Gitbox Repository Directory: {0}".format(GITBOX_DIR))
+print("START: See https://gitbox.apache.org/repos/asf")
+
# read from directory of Apache Gitbox repositories
s = urllib.request.urlopen(GITBOX_DIR).read().decode('utf-8')
gitboxRepos = json.loads(s)
gitbox = {}
+if not gitboxRepos or len(gitboxRepos["projects"]) < 100:
+ print("ABORT: Gitbox Repository Directory is not available - {0}".format(GITBOX_DIR))
+ sys.exit(1)
gitbox["incubator"] = gitboxRepos["projects"]["incubator"]["repositories"]
# read from project ldap
s = urllib.request.urlopen(PROJECT_LDAP).read().decode('utf-8')
projectLDAP = json.loads(s)["projects"]
+if len(projectLDAP) < 100:
+ print("ABORT: Whimsy project LDAP is not available - {0}".format(PROJECT_LDAP))
+ sys.exit(2)
# read from podling site scan
s = urllib.request.urlopen(PODLING_SITE).read().decode('utf-8')
podlingSiteScan = json.loads(s)
+if len(projectLDAP) < 100:
+ print("ABORT: Whimsy podling website scan is not available - {0}".format(PODLING_SITE))
+ sys.exit(3)
# Parse the podlings data file ---
dom = xml.dom.minidom.parse(SITE_CONTENT_DIR + "podlings.xml")
+if not dom:
+ print("ABORT: Incubator content/podlings.xml is not parsable - {0}{1}".format(SITE_CONTENT_DIR,"podlings.xml"))
+ sys.exit(4)
graduatedProjects = {}
graduatingOrRetiring = []
@@ -343,7 +364,7 @@ for row in dom.getElementsByTagName("pod
print("Name: {0} - {1}".format(name,resource.lower()))
if id in projects:
- print("ERROR: {0}: row exists".format(id))
+ print("ERROR: {0}: row exists".format(id))
errorMsg = ["00","Duplicate entry in podlings.xml"]
projects[id]['fixMeList'].append(errorMsg)
else:
@@ -379,6 +400,7 @@ for row in dom.getElementsByTagName("pod
projects[id]['urlTracker'] = ""
projects[id]['urlWiki'] = ""
projects[id]['urlWww'] = ""
+ projects[id]['urlDistSVN'] = ""
projects[id]['urlDist'] = ""
projects[id]['urlKeys'] = ""
projects[id]['releases'] = []
@@ -431,8 +453,8 @@ for row in dom.getElementsByTagName("pod
needMetadata = True
if needMetadata:
errorMsg = "{0}: Need to add incubation metadata.".format(id)
- print('ERROR:', errorMsg)
- errorMsg += " Please maintain your records in the content/podlings.xml file. See <a href=\"#h-hasStatusEntry\">help</a>."
+ print('ERROR: ', errorMsg)
+ errorMsg += " Please maintain your records in the content/podlings.xml file. See link:#h-hasStatusEntry[help]"
otherIssues.append(errorMsg)
errorMsg = ["02","Podling metadata missing in content/podlings.xml file. This is ground truth."]
projects[id]['fixMeList'].append(errorMsg)
@@ -456,8 +478,8 @@ for row in dom.getElementsByTagName("pod
graduatingOrRetiring.append(id)
if not row.getAttribute("endDate"):
errorMsg = "{0}: Has graduated, but still needs to follow the graduation steps.".format(id)
- print('ERROR:', errorMsg)
- errorMsg += " See <a href=\"#h-Graduate\">help</a>."
+ print('ERROR: ', errorMsg)
+ errorMsg += " See link:#h-Graduate[help]."
otherIssues.append(errorMsg)
errorMsg = ["03","Graduated, but some graduation steps are incomplete"]
projects[id]['fixMeList'].append(errorMsg)
@@ -467,8 +489,8 @@ for row in dom.getElementsByTagName("pod
graduatingOrRetiring.append(id)
if not row.getAttribute("endDate"):
errorMsg = "{0}: Has retired, but still needs to follow the retirement steps.".format(id)
- print('ERROR:', errorMsg)
- errorMsg += " See <a href=\"#h-Retire\">help</a>."
+ print('ERROR: ', errorMsg)
+ errorMsg += " See link:#h-Retire[help]."
otherIssues.append(errorMsg)
errorMsg = ["04","Retired, but some retirement steps are incomplete"]
projects[id]['fixMeList'].append(errorMsg)
@@ -491,7 +513,7 @@ for row in dom.getElementsByTagName("pod
group = reporting[0].getAttribute("group")
if group == None:
projects[id]['hasReportingGroup'] = False
- errorMsg ="SEVERE: {0}: missing group attribute".format(id)
+ errorMsg = "SEVERE: {0}: missing group attribute".format(id)
print(errorMsg)
otherIssues.append(errorMsg)
errorMsg = ["06","Reporting group is missing"]
@@ -581,6 +603,8 @@ for k in sorted(projectNames, key=str.lo
if cell.getAttribute('id') == "svn" and hasUrl:
if value[-4:] == ".git":
value = ""
+ elif value[-1] == '/':
+ value = value[0:-1]
projects[k]['urlSvn'] = value
continue
if cell.getAttribute('id') == "git" and hasUrl:
@@ -770,7 +794,7 @@ with osPopen(['svn', 'ls', '-Rv', 'https
releasesBadName[podling] = True
if podling in projects and podling != "netbeans":
# netbeans has over 600 release parts and had legacy naming requirements
- errorMsg = "INFO: {0}: Release is missing incubator/incubating in file name {1}".format(podling,file)
+ errorMsg = "WARN: {0}: Release is missing incubator/incubating in file name {1}".format(podling,file)
print(errorMsg)
errorMsg = ["42","Distribution is missing incubator/incubating in file name {0}".format(file)]
projects[podling]['fixMeList'].append(errorMsg)
@@ -800,18 +824,20 @@ for k in releases:
if k in graduatedProjects:
errorMsg = "{0}: Has graduated, but still has remains on Incubator distribution mirrors".format(
k)
- print('ERROR:', errorMsg)
- errorMsg += ". See <a href=\"#h-Graduate\">help</a>."
+ print("ERROR: ", errorMsg)
+ errorMsg += ". See link:#h-Graduate[help]."
otherIssues.append(errorMsg)
continue
if k in retiredProjects:
- print("INFO: {0}: retired project has remains on Incubator mirrors".format(k))
+ errorMsg = "{0}: retired project has remains on Incubator mirrors".format(k)
+ print("WARN: ", errorMsg)
+ errorMsg += ". See link:#h-Retired[help]."
otherIssues.append(errorMsg)
for k in releasesBadName:
errorMsg = '{0}: Has a distribution filename missing the word "incubating/incubator"'.format(k)
- print('ERROR:', errorMsg)
- errorMsg += ". See <a href=\"#h-hasRelease\">help</a>."
+ print('WARN:', errorMsg)
+ errorMsg += ". See link:#h-hasRelease[help]."
otherIssues.append(errorMsg)
# Processing the gathered sata ---
@@ -827,8 +853,8 @@ for k in sorted(projectNames, key=str.lo
"projects/{0}.xml".format(projects[k]['statusFileName'])
if not os.path.exists(statusFile):
errorMsg = "{0}: Missing status file".format(k)
- print('ERROR:', errorMsg)
- errorMsg += ". See <a href=\"#h-hasStatusEntry\">help</a>."
+ print('ERROR: ', errorMsg)
+ errorMsg += ". See link:#h-hasStatusEntry[help]."
otherIssues.append(errorMsg)
projects[k]['hasStatusEntry'] = False
errorMsg = ["07","Status file is missing"]
@@ -846,7 +872,7 @@ for k in sorted(projectNames, key=str.lo
entryDate = datetime.datetime(
int(match.group(1)), int(match.group(2)), entryDateDay)
except ValueError:
- errorMsg = "ERROR: {0}: ValueError with date".format(k)
+ errorMsg = "ERROR: {0}: ValueError with date".format(k)
print(errorMsg)
errorMsg = ["08","Start date is not a valid date"]
projects[k]['fixMeList'].append(errorMsg)
@@ -864,6 +890,7 @@ for k in sorted(projectNames, key=str.lo
count1 = 0
count2 = 0
count3 = 0
+ lastDate = entryDate
for row in dom.getElementsByTagName("logentry"):
# Skip counting various commits which were to standardise the status
# files.
@@ -876,6 +903,8 @@ for k in sorted(projectNames, key=str.lo
matchSvn = re.search(statusLogRE, date)
thisDate = datetime.datetime(
int(matchSvn.group(1)), int(matchSvn.group(2)), int(matchSvn.group(3)))
+ if thisDate > lastDate:
+ lastDate = thisDate
if rowCounter == 1:
projects[k]['statusLastUpdated'] = "{0:4d}-{1:02d}-{2:02d}".format(
int(matchSvn.group(1)), int(matchSvn.group(2)), int(matchSvn.group(3)))
@@ -891,6 +920,7 @@ for k in sorted(projectNames, key=str.lo
count3 = "-"
projects[k]['statusUpdateCounts'] = "{0},{1},{2}".format(
count1, count2, count3)
+ projects[k]['statusAge'] = (gatherDate-lastDate).days
dom.unlink()
@@ -963,15 +993,17 @@ for k in sorted(projectNames, key=str.lo
if optionVerbose:
print("DEBUG: Trying Tracker URL: " + url)
try:
+ if url[-1] == '/':
+ url = url[0:-1]
getUrl(url)
projects[k]['urlTracker'] = url
break
except IOError:
projects[k]['urlTracker'] = ""
if not projects[k]['urlTracker']:
- errorMsg = "INFO: {0}: Does not yet have a valid Issue Tracker".format(k)
+ errorMsg = "INFO: {0}: Has not yet provided an Issue Tracker link".format(k)
print(errorMsg)
- errorMsg = ["10","Has no valid issue tracker link"]
+ errorMsg = ["10","Has not provided an issue tracker link"]
projects[k]['fixMeList'].append(errorMsg)
# Detect if they have Wiki yet.
@@ -984,15 +1016,17 @@ for k in sorted(projectNames, key=str.lo
if optionVerbose:
print("DEBUG: Trying Wiki URL: " + url)
try:
+ if url[-1] == '/':
+ url = url[0:-1]
getUrl(url)
projects[k]['urlWiki'] = url
break
except IOError:
projects[k]['urlWiki'] = ""
if not projects[k]['urlWiki']:
- errorMsg = "INFO: {0}: Does not yet have a Wiki".format(k)
+ errorMsg = "INFO: {0}: Has not yet provided a Wiki link".format(k)
print(errorMsg)
- errorMsg = ["18","Has no valid wiki link"]
+ errorMsg = ["18","Has not provided a wiki link"]
projects[k]['fixMeList'].append(errorMsg)
# Detect if they have a website yet.
@@ -1010,6 +1044,8 @@ for k in sorted(projectNames, key=str.lo
if url == "":
continue
try:
+ if url[-1] == '/':
+ url = url[0:-1]
getUrl(url)
projects[k]['urlWww'] = url
break
@@ -1032,44 +1068,44 @@ for k in sorted(projectNames, key=str.lo
try:
if podlingSiteScan[j]:
if not podlingSiteScan[j]['foundation']:
- errorMsg = "INFO: {0}: Does not yet have foundation link".format(k)
+ errorMsg = "INFO: {0}: Does not yet have website foundation link".format(k)
print(errorMsg)
- errorMsg = ["31","ASF Foundation link is missing"]
+ errorMsg = ["31","ASF Foundation link is missing form website"]
projects[k]['fixMeList'].append(errorMsg)
if not podlingSiteScan[j]['events']:
- errorMsg = "INFO: {0}: Does not yet have events link".format(k)
+ errorMsg = "INFO: {0}: Does not yet have website events link".format(k)
print(errorMsg)
- errorMsg = ["32","ASF Events link is missing"]
+ errorMsg = ["32","ASF Events link is missing from website"]
projects[k]['fixMeList'].append(errorMsg)
if not podlingSiteScan[j]['license']:
- errorMsg = "INFO: {0}: Does not yet have license link".format(k)
+ errorMsg = "INFO: {0}: Does not yet have website license link".format(k)
print(errorMsg)
- errorMsg = ["33","Apache License link is missing"]
+ errorMsg = ["33","Apache License link is missing from website"]
projects[k]['fixMeList'].append(errorMsg)
if not podlingSiteScan[j]['thanks']:
- errorMsg = "INFO: {0}: Does not yet have thanks link".format(k)
+ errorMsg = "INFO: {0}: Does not yet have website thanks link".format(k)
print(errorMsg)
- errorMsg = ["34","Apache Thanks link is missing"]
+ errorMsg = ["34","Apache Thanks link is missing from website"]
projects[k]['fixMeList'].append(errorMsg)
if not podlingSiteScan[j]['security']:
- errorMsg = "INFO: {0}: Does not yet have security link".format(k)
+ errorMsg = "INFO: {0}: Does not yet have website security link".format(k)
print(errorMsg)
- errorMsg = ["35","Apache Security link is missing"]
+ errorMsg = ["35","Apache Security link is missing from website"]
projects[k]['fixMeList'].append(errorMsg)
if not podlingSiteScan[j]['sponsorship']:
- errorMsg = "INFO: {0}: Does not yet have sponsorship link".format(k)
+ errorMsg = "INFO: {0}: Does not yet have website sponsorship link".format(k)
print(errorMsg)
- errorMsg = ["36","Apache Sponsorship link is missing"]
+ errorMsg = ["36","Apache Sponsorship link is missing from website"]
projects[k]['fixMeList'].append(errorMsg)
if not podlingSiteScan[j]['trademarks']:
- errorMsg = "INFO: {0}: Does not yet have trademarks".format(k)
+ errorMsg = "INFO: {0}: Does not yet have website trademarks".format(k)
print(errorMsg)
- errorMsg = ["37","Trademarks are missing"]
+ errorMsg = ["37","Trademarks are missing from website"]
projects[k]['fixMeList'].append(errorMsg)
if not podlingSiteScan[j]['copyright']:
- errorMsg = "INFO: {0}: Does not yet have copyright".format(k)
+ errorMsg = "INFO: {0}: Does not yet have website copyright".format(k)
print(errorMsg)
- errorMsg = ["38","Copyright is missing"]
+ errorMsg = ["38","Copyright is missing from website"]
projects[k]['fixMeList'].append(errorMsg)
flag = False
try:
@@ -1078,9 +1114,9 @@ for k in sorted(projectNames, key=str.lo
except (Exception) as e:
flag = True
if flag:
- errorMsg = "INFO: {0}: Does not yet have disclaimer".format(k)
+ errorMsg = "INFO: {0}: Does not yet have website disclaimer".format(k)
print(errorMsg)
- errorMsg = ["39","Disclaimer is missing"]
+ errorMsg = ["39","Disclaimer is missing from website"]
projects[k]['fixMeList'].append(errorMsg)
else:
print('missing from site scan')
@@ -1090,12 +1126,15 @@ for k in sorted(projectNames, key=str.lo
# See if they have a distribution area yet.
if optionUseClutchState and projects[k]['hasClutchState'] and state[k]['urlDist']:
projects[k]['urlDist'] = state[k]['urlDist']
+ projects[k]['urlDistSVN'] = state[k]['urlDistSVN']
else:
for nameDist in projects[k]['resourceNames']:
urlDist = "https://www.apache.org/dist/incubator/{0}/".format(nameDist)
urlMirror = "https://www.apache.org/dyn/closer.lua?filename=incubator/{0}/".format(nameDist)
+ urlDistSVN = "https://dist.apache.org/repos/dist/release/incubator/{0}".format(nameDist)
if nameDist in distareas:
projects[k]['urlDist'] = urlMirror
+ projects[k]['urlDistSVN'] = urlDistSVN
break
if not projects[k]['urlDist']:
errorMsg = "INFO: {0}: Does not yet have a distribution area".format(k)
@@ -1129,22 +1168,22 @@ for k in sorted(projectNames, key=str.lo
l2 = len(projects[k]['distribHash'])
ld = l1-l2
if l1 > 8:
- errorMsg = "INFO: {0}: Has {1} distributions. Non-current distributions must be removed".format(k,l1)
+ errorMsg = "WARN: {0}: Has {1} release distributions. Non-current releases should be removed".format(k,l1)
print(errorMsg)
- errorMsg = ["45","{0} is a large number of releases. Non-current release must be removed".format(l1)]
+ errorMsg = ["45","{0} is a large number of release distributions. Non-current releases should be removed".format(l1)]
projects[k]['fixMeList'].append(errorMsg)
if ld > 0:
- errorMsg = "INFO: {0}: Has {1} signed distribution without a hash".format(k,ld)
+ errorMsg = "WARN: {0}: Has {1} signed release distributions without a hash".format(k,ld)
print(errorMsg)
- errorMsg = ["43","Signed distribution without a hash = {0}".format(ld)]
+ errorMsg = ["43","Signed release distributions without a hash = {0}".format(ld)]
projects[k]['fixMeList'].append(errorMsg)
pprint.pprint(projects[k]['distributions'])
pprint.pprint(projects[k]['distribHash'])
elif ld < 0:
ld = l2-l1
- errorMsg = "INFO: {0}: Has {1} unsigned distributions".format(k,ld)
+ errorMsg = "WARN: {0}: Has {1} unsigned release distributions".format(k,ld)
print(errorMsg)
- errorMsg = ["44","Unsigned distributions = {0}".format(ld)]
+ errorMsg = ["44","Unsigned release distributions = {0}".format(ld)]
projects[k]['fixMeList'].append(errorMsg)
pprint.pprint(projects[k]['distributions'])
pprint.pprint(projects[k]['distribHash'])
@@ -1180,10 +1219,10 @@ for k in sorted(projectNames, key=str.lo
projects[k]['fixMeList'].append(errorMsg)
try:
if len(distributions[nameDistArea]) > 0 or len(distribHash[nameDistArea]) > 0:
- errorMsg = "{0}: Apache Releases cannot be validated without a KEYS file. Add required KEYS!".format(k)
+ errorMsg = "{0}: Apache Releases cannot be validated without a KEYS file. Please add required KEYS!".format(k)
print("SEVERE: ",errorMsg)
otherIssues.append(errorMsg)
- errorMsg = ["46","Apache Releases cannot be validated without a KEYS file. Add required KEYS!"]
+ errorMsg = ["46","Apache Releases cannot be validated without a KEYS file. Please add required KEYS!"]
projects[k]['fixMeList'].append(errorMsg)
except:
dontcare = True
@@ -1236,22 +1275,22 @@ for k in sorted(projectNames, key=str.lo
if listType in projectMailLists[projectName]:
leader = 'incubator'
projects[k][mailListKey] = MAIL_LIST_URL + \
- "{0}-{1}/".format(projectName,listType)
+ "{0}-{1}".format(projectName,listType)
if optionVerbose:
print("DEBUG: Successful Incubator mail url: " +
projects[k][mailListKey])
foundMailLists = True
break
- else:
- errorMsg = "INFO: {0}: Does not yet have hinted incubator mail list '{1}-{2}'".format(k, projectName, listType)
- print(errorMsg)
- errorMsg = ["14","Expected mailing list (incubator-{0}-{1}) is missing".format(projectName, listType)]
- projects[k]['fixMeList'].append(errorMsg)
- projects[k][mailListKey] = ""
+# else:
+# errorMsg = "INFO: {0}: Does not yet have hinted incubator mail list '{1}-{2}'".format(k, projectName, listType)
+# print(errorMsg)
+# errorMsg = ["14","Expected mailing list (incubator-{0}-{1}) is missing".format(projectName, listType)]
+# projects[k]['fixMeList'].append(errorMsg)
+# projects[k][mailListKey] = ""
# End of processing incubator group mail list.
else:
listName = projects[k][mailListHintKey]
- url = "http://mail-archives.apache.org/mod_mbox/{0}/".format(
+ url = "http://mail-archives.apache.org/mod_mbox/{0}".format(
listName)
if optionVerbose:
print("DEBUG: Trying mail url: " + url)
@@ -1268,7 +1307,7 @@ for k in sorted(projectNames, key=str.lo
break
# End of processing project mail lists.
if not projects[k]['hasMailListDev']:
- errorMsg = "INFO: {0}: Does not yet have 'dev' mail list".format(k)
+ errorMsg = "ERROR: {0}: Does not yet have 'dev' mail list".format(k)
print(errorMsg)
errorMsg = ["15","Project does not have 'dev' mailing list"]
projects[k]['fixMeList'].append(errorMsg)
@@ -1288,47 +1327,46 @@ for entry in sorted(incubatorSvnDirs):
print("Output the data ...")
reportingGroups = {'month': 'Monthly',
- 'group-1': 'January,April,July,October',
- 'group-2': 'February,May,August,November',
- 'group-3': 'March,June,September,December'}
+ 'group-1': 'January, April, July, October',
+ 'group-2': 'February, May, August, November',
+ 'group-3': 'March, June, September, December'}
monthsLong = 'January February March April May June July August September October November December'.split()
nameCurrentReport = "{0}{1}".format(
monthsLong[gatherDate.month - 1], gatherDate.year)
urlCurrentReport = "".join(
["http://wiki.apache.org/incubator/", nameCurrentReport])
-fileXmlMY = open(CLUTCH_CONTENT_DIR + 'clutchmy.ent', encoding='utf-8', mode='w')
+fileXmlMY = open(CLUTCH_CONTENT_DIR + '_includes/clutchmy.ad', encoding='utf-8', mode='w')
fileXmlMY.write(
- '<a href="{0}">{1}</a>\n'.format(urlCurrentReport, nameCurrentReport))
+ '{0}[{1}]\n'.format(urlCurrentReport, nameCurrentReport))
fileXmlMY.close()
fileList = open(CLUTCH_CONTENT_DIR + 'clutch.txt', 'w')
-fileXmlo1 = open(CLUTCH_CONTENT_DIR + 'clutcho1.ent', encoding='utf-8', mode='w')
-fileXmlo1.write("<!-- generated by clutch; do not edit -->\n")
+fileXmlo1 = open(CLUTCH_CONTENT_DIR + '_includes/clutcho1.ad', encoding='utf-8', mode='w')
if len(otherIssues):
- otherXml = """<li>other issues <a href="#other">listed</a> below for: """
+ otherXml = """* other issues link:#other[listed] below for: """
otherIssuesRE = re.compile("^([^:]+):.*$")
- otherIssues.sort()
deduplicateOthers = {}
for issue in otherIssues:
+ print("issue="+issue)
matchOtherIssues = re.search(otherIssuesRE, issue)
try:
if deduplicateOthers[matchOtherIssues.group(1)]:
continue
except:
deduplicateOthers[matchOtherIssues.group(1)] = True
- otherXml += '\n <span class="care">{0}</span> '.format(
+ otherXml += '\n** [.care]#{0}# '.format(
matchOtherIssues.group(1))
- otherXml += "\n</li>\n"
+ otherXml += "\n"
fileXmlo1.write(otherXml)
fileXmlo1.close()
-fileXmlt = open(CLUTCH_CONTENT_DIR + 'clutcht.ent', encoding='utf-8', mode='w')
-fileXmlt.write("<!-- generated by clutch; do not edit -->\n")
+fileXmlt = open(CLUTCH_CONTENT_DIR + '_includes/clutcht.ad', encoding='utf-8', mode='w')
tableTopXml = """
- Clutch last gathered: {0} UTC.<br />
- Number of podlings in incubation: {1}
+Clutch last gathered: {0} UTC.
+
+Number of podlings in incubation: {1}
""".format(gatherDateString, len(projects))
fileXmlt.write(tableTopXml)
fileXmlt.close()
@@ -1338,21 +1376,13 @@ reportList1 = ""
reportList2 = ""
reportList3 = ""
tableRowCount = 0
-tableRowCountMid = int(len(projects) / 2)
-fileXml = open(CLUTCH_CONTENT_DIR + 'clutchr1.ent', encoding='utf-8', mode='w')
-fileXml.write("<!-- generated by clutch; do not edit -->\n")
+fileXml = open(CLUTCH_CONTENT_DIR + '_includes/clutchr.ad', encoding='utf-8', mode='w')
for k in sorted(projectNames, key=str.lower):
tableRowCount += 1
- if tableRowCount == tableRowCountMid:
- fileXml.close()
- fileXml = open(CLUTCH_CONTENT_DIR + 'clutchr2.ent',
- encoding='utf-8', mode='w')
- fileXml.write("<!-- generated by clutch; do not edit -->\n")
- fileXml.write(' <tr id="{0}">\n'.format(k))
- fileXml.write(' <td')
- if k in graduatingOrRetiring:
- fileXml.write(' class="grad"')
- fileXml.write('>{0}</td>\n'.format(projects[k]['fullName']))
+ fileXml.write('\n|')
+# if k in graduatingOrRetiring:
+# fileXml.write('[="grad"')
+ fileXml.write('link:{0}.html[{1}]\n'.format(k,projects[k]['fullName']))
persist[k] = {}
persist[k]['podlingName'] = projects[k]['name']
persist[k]['resource'] = projects[k]['resource']
@@ -1360,31 +1390,48 @@ for k in sorted(projectNames, key=str.lo
if '?' in projects[k]['sponsor']:
fileXml.write(
- ' <td class="issue">{0}</td>\n'.format(projects[k]['sponsor']))
+ '|[.issue]#{0}#\n'.format(projects[k]['sponsor']))
else:
fileXml.write(
- ' <td>{0}</td>\n'.format(projects[k]['sponsor']))
+ '|{0}\n'.format(projects[k]['sponsor']))
persist[k]['sponsor'] = projects[k]['sponsor']
persist[k]['description'] = projects[k]['description']
persist[k]['mentors'] = projects[k]['mentors']
persist[k]['mentorsApacheId'] = projects[k]['mentorsApacheId']
- fileXml.write(' <td>{0}</td>\n'.format(projects[k]['startDate']))
+ fileXml.write('|{0}\n'.format(projects[k]['startDate']))
persist[k]['startDate'] = projects[k]['startDate']
+ startDate = datetime.datetime.strptime(projects[k]['startDate'],"%Y-%m-%d")
+ daysIncubating = (gatherDate-startDate).days
# elapsedDays column
- fileXml.write(' <td></td>\n')
+ if daysIncubating < 92:
+ fileXml.write('|link:/projects/{0}.html">[[.cool3]#{1}#]\n'.format(
+ projects[k]['statusFileName'], daysIncubating))
+ elif daysIncubating < 365:
+ fileXml.write('|link:/projects/{0}.html">[[.cool2]#{1}#]\n'.format(
+ projects[k]['statusFileName'], daysIncubating))
+ elif daysIncubating < 552:
+ fileXml.write('|link:/projects/{0}.html">[[.cool1]#{1}#]\n'.format(
+ projects[k]['statusFileName'], daysIncubating))
+ elif daysIncubating < 730:
+ fileXml.write('|link:/projects/{0}.html">[[.cool3]#{1}#]\n'.format(
+ projects[k]['statusFileName'], daysIncubating))
+ else:
+ fileXml.write('|link:/projects/{0}.html">[[.cool4]#{1}#]\n'.format(
+ projects[k]['statusFileName'], daysIncubating))
+ persist[k]['statusAge'] = projects[k]['statusAge']
if not projects[k]['reportingMonthly']:
fileXml.write(
- ' <td>{0}</td>\n'.format(projects[k]['reportingMonthly']))
+ '|{0}\n'.format(projects[k]['reportingMonthly']))
else:
fileXml.write(
- ' <td class="care">{0}</td>\n'.format(projects[k]['reportingMonthly']))
+ '|[.care]#{0}#\n'.format(projects[k]['reportingMonthly']))
persist[k]['reportingMonthly'] = projects[k]['reportingMonthly']
fileXml.write(
- ' <td>{0}</td>\n'.format(projects[k]['reportingGroup']))
+ '|{0}\n'.format(projects[k]['reportingGroup'][-1]))
# save the simple group number for programs that have their own ideas.
persist[k]['rawReportingGroup'] = projects[k]['reportingGroup']
persist[k]['reportingGroup'] = reportingGroups[
@@ -1423,50 +1470,55 @@ for k in sorted(projectNames, key=str.lo
elif (projects[k]['reportingGroup'] == "group-3"):
reportList3 += reportDevList
- if projects[k]['hasReportingGroup']:
- fileXml.write(
- ' <td class="cool1">{0}</td>\n'.format(projects[k]['hasReportingGroup']))
- else:
- fileXml.write(
- ' <td class="issue">{0}</td>\n'.format(projects[k]['hasReportingGroup']))
-
if projects[k]['hasStatusEntry']:
- fileXml.write(' <td class="cool1"><a href="projects/{0}.html">{1}</a></td>\n'.format(
+ fileXml.write('|link:/projects/{0}.html">[[.cool1]#{1}#]\n'.format(
projects[k]['statusFileName'], projects[k]['hasStatusEntry']))
else:
fileXml.write(
- ' <td class="issue">{0}</td>\n'.format(projects[k]['hasStatusEntry']))
+ '|[.issue]#{0}#\n'.format(projects[k]['hasStatusEntry']))
fileXml.write(
- ' <td>{0}</td>\n'.format(projects[k]['statusLastUpdated']))
+ '|{0}\n'.format(projects[k]['statusLastUpdated']))
persist[k]['statusLastUpdated'] = projects[k]['statusLastUpdated']
# statusAge column
- fileXml.write(' <td></td>\n')
+ if projects[k]['statusAge'] < 61:
+ fileXml.write('|link:/projects/{0}.html">[[.cool1]#{1}#]\n'.format(
+ projects[k]['statusFileName'], projects[k]['statusAge']))
+ elif projects[k]['statusAge'] < 122:
+ fileXml.write('|link:/projects/{0}.html">[[.cool2]#{1}#]\n'.format(
+ projects[k]['statusFileName'], projects[k]['statusAge']))
+ elif projects[k]['statusAge'] < 175:
+ fileXml.write('|link:/projects/{0}.html">[[.cool3]#{1}#]\n'.format(
+ projects[k]['statusFileName'], projects[k]['statusAge']))
+ else:
+ fileXml.write('|link:/projects/{0}.html">[[.cool4]#{1}#]\n'.format(
+ projects[k]['statusFileName'], projects[k]['statusAge']))
+ persist[k]['statusAge'] = projects[k]['statusAge']
fileXml.write(
- ' <td>{0}</td>\n'.format(projects[k]['statusUpdateCounts']))
+ '|{0}\n'.format(projects[k]['statusUpdateCounts']))
if projects[k]['numberCommitters'] > 0:
if projects[k]['numberCommitters'] > 2:
- fileXml.write(' <td class="cool1 number"><a href="https://people.apache.org/phonebook.html?podling={0}">{1}</a></td>\n'.format(
+ fileXml.write('|https://people.apache.org/phonebook.html?podling={0}[[.cool1]#{1}#]\n'.format(
projects[k]['resource'], projects[k]['numberCommitters']))
else:
- fileXml.write(' <td class="care number"><a href="https://people.apache.org/phonebook.html?podling={0}">{1}</a></td>\n'.format(
+ fileXml.write('|https://people.apache.org/phonebook.html?podling={0}[[.care]#{1}#]\n'.format(
projects[k]['resource'], projects[k]['numberCommitters']))
else:
- fileXml.write(' <td class="care">-</td>\n')
+ fileXml.write('|[.care]#-#\n')
persist[k]['numberCommitters'] = projects[k]['numberCommitters']
if projects[k]['numberCommittersNew'] > 0:
if projects[k]['numberCommittersNew'] > 1:
fileXml.write(
- ' <td class="cool1 number">{0}</td>\n'.format(projects[k]['numberCommittersNew']))
+ '|[.cool1]#{0}#\n'.format(projects[k]['numberCommittersNew']))
else:
fileXml.write(
- ' <td class="cool2 number">{0}</td>\n'.format(projects[k]['numberCommittersNew']))
+ '|[.cool2]#{0}#\n'.format(projects[k]['numberCommittersNew']))
else:
- fileXml.write(' <td class="care number">0</td>\n')
+ fileXml.write('|[.care]#0#\n')
persist[k]['numberCommittersNew'] = projects[k]['numberCommittersNew']
# individual podling analysis pages will use these as opposed to old style clutch page using announced new committers (flawed...)
@@ -1475,16 +1527,16 @@ for k in sorted(projectNames, key=str.lo
if projects[k]['urlSvn']:
fileXml.write(
- ' <td class="cool1"><a href="{0}">True</a></td>\n'.format(projects[k]['urlSvn']))
+ '|{0}[[.cool1]#True#]\n'.format(projects[k]['urlSvn']))
else:
if projects[k]['gitbox']:
# we have the dictionary of gitbox repositories and we can extract the first git repos from the sorted list.
projects[k]['urlGit'] = None
projects[k]['urlGit'] = 'https://gitbox.apache.org/repos/asf?p={0}.git;a=tree;hb=HEAD'.format(projects[k]['gitbox'][0][0])
fileXml.write(
- ' <td class="cool1"><a href="{0}">True</a></td>\n'.format(projects[k]['urlGit']))
+ '|{0}[[.cool1]#True#]\n'.format(projects[k]['urlGit']))
else:
- fileXml.write(' <td class="care">False</td>\n')
+ fileXml.write('|[.care]#False#\n')
persist[k]['urlSvn'] = projects[k]['urlSvn']
persist[k]['urlGit'] = projects[k]['urlGit']
persist[k]['gitbox'] = projects[k]['gitbox']
@@ -1501,63 +1553,59 @@ for k in sorted(projectNames, key=str.lo
if projects[k]['urlTracker']:
fileXml.write(
- ' <td class="cool1"><a href="{0}">True</a></td>\n'.format(projects[k]['urlTracker']))
+ '|{0}[[.cool1]#True#]\n'.format(projects[k]['urlTracker']))
else:
- fileXml.write(' <td class="care">False</td>\n')
+ fileXml.write('|[.care]#False#\n')
persist[k]['urlTracker'] = projects[k]['urlTracker']
persist[k]['urlWiki'] = projects[k]['urlWiki']
hasUrl = re.search(urlHttpRE, projects[k]['hasMailListDev'])
if hasUrl:
fileXml.write(
- ' <td class="cool1"><a href="{0}">True</a></td>\n'.format(projects[k]['hasMailListDev']))
+ '|{0}[[.cool1]#True#]\n'.format(projects[k]['hasMailListDev']))
else:
- fileXml.write(' <td class="care">False</td>\n')
+ fileXml.write('|[.care]#False#\n')
persist[k]['hasMailListDev'] = projects[k]['hasMailListDev']
hasUrl = re.search(urlHttpRE, projects[k]['hasMailListCommits'])
if hasUrl:
- fileXml.write(' <td class="cool1"><a href="{0}">True</a></td>\n'.format(
+ fileXml.write('|{0}[[.cool1]#True#]\n'.format(
projects[k]['hasMailListCommits']))
else:
- fileXml.write(' <td class="care">False</td>\n')
+ fileXml.write('|[.care]#False#\n')
persist[k]['hasMailListCommits'] = projects[k]['hasMailListCommits']
if projects[k]['urlWww']:
fileXml.write(
- ' <td class="cool1"><a href="{0}">True</a></td>\n'.format(projects[k]['urlWww']))
+ '|{0}[[.cool1]#True#]\n'.format(projects[k]['urlWww']))
else:
- fileXml.write(' <td class="care">False</td>\n')
+ fileXml.write('|[.care]#False#\n')
persist[k]['urlWww'] = projects[k]['urlWww']
- if projects[k]['urlDist']:
+ if projects[k]['urlDistSVN']:
fileXml.write(
- ' <td class="cool1"><a href="{0}">True</a></td>\n'.format(projects[k]['urlDist']))
+ '|{0}[[.cool1]#True#]\n'.format(projects[k]['urlDistSVN']))
else:
- fileXml.write(' <td class="care">False</td>\n')
+ fileXml.write('|[.care]#False#\n')
persist[k]['urlDist'] = projects[k]['urlDist']
+ persist[k]['urlDistSVN'] = projects[k]['urlDistSVN']
if projects[k]['urlKeys']:
fileXml.write(
- ' <td class="cool1"><a href="{0}">True</a></td>\n'.format(projects[k]['urlKeys']))
+ '|{0}[[.cool1]#True#]\n'.format(projects[k]['urlKeys']))
else:
- fileXml.write(' <td class="care">False</td>\n')
+ fileXml.write('|[.care]#False#\n')
persist[k]['urlKeys'] = projects[k]['urlKeys']
persist[k]['releases'] = projects[k]['releases']
persist[k]['fixMeList'] = projects[k]['fixMeList']
persist[k]['news'] = projects[k]['news']
- match = re.search(distMirrorRE, projects[k]['urlDist'])
- if match:
- if match.group(1) in releases:
- fileXml.write(
- ' <td class="cool1"><a href="{0}">True</a></td>\n'.format(projects[k]['urlDist']))
- else:
- fileXml.write(' <td class="care">False</td>\n')
+ if len(projects[k]['releases']) > 0:
+ fileXml.write('|link:{0}.html#releases[[.cool1]#True#]\n'.format(k))
else:
- fileXml.write(' <td class="care">False</td>\n')
+ fileXml.write('|[.care]#False#\n')
- fileXml.write(' </tr>\n')
+ fileXml.write('\n')
fileList.write('{0},"{1}","{2}"\n'.format(
k, projects[k]['name'], projects[k]['sponsor']))
@@ -1566,14 +1614,13 @@ fileXml.close()
# End of rows
# Other issues
-fileXmlo2 = open(CLUTCH_CONTENT_DIR + 'clutcho2.ent', encoding='utf-8', mode='w')
-fileXmlo2.write("<!-- generated by clutch; do not edit -->\n")
+fileXmlo2 = open(CLUTCH_CONTENT_DIR + '_includes/clutcho2.ad', encoding='utf-8', mode='w')
if len(otherIssues):
otherIssues.sort()
for issue in otherIssues:
- fileXmlo2.write(" <li>{0}</li>\n".format(issue))
+ fileXmlo2.write("* {0}\n".format(issue))
else:
- fileXmlo2.write(" <li>No known issues.</li>\n")
+ fileXmlo2.write("* No known issues.\n")
fileXmlo2.close()
mentorsList = {}
@@ -1582,11 +1629,9 @@ for mentor in mentorsName:
mentors = list(mentorsList.keys())
mentors.sort()
-fileXmlm = open(CLUTCH_CONTENT_DIR + 'clutchm.txt', encoding='utf-8', mode='w')
-fileXmlm.write("=== Mentor Roster\n")
-fileXmlm.write("\n")
+fileXmlm = open(CLUTCH_CONTENT_DIR + '_includes/clutchm.ad', encoding='utf-8', mode='w')
for mentor in mentors:
- fileXmlm.write("# {1}: {0}: {2}\n".format(
+ fileXmlm.write(". {0}({1}): {2}\n".format(
mentor, mentorsList[mentor][1], ', '.join(mentorsList[mentor][2])))
fileXmlm.close()
@@ -1620,3 +1665,6 @@ outputFile.close()
print("Done. Generated clutch*.ent files.")
print("Now you need to re-build the site, as usual.")
+print("FINAL: current: {0}".format(len(projects)))
+print("FINAL: date: {0}".format(gatherDateString))
+
Added: incubator/public/trunk/clutch2.sh
URL: http://svn.apache.org/viewvc/incubator/public/trunk/clutch2.sh?rev=1855728&view=auto
==============================================================================
--- incubator/public/trunk/clutch2.sh (added)
+++ incubator/public/trunk/clutch2.sh Mon Mar 18 03:12:21 2019
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+rm clutch2.out
+rm clutch2pages.out
+
+echo "Begin Clutch Analysis"
+python3 clutch2.py > clutch2.out
+grep START clutch2.out
+grep ABORT clutch2.out
+
+echo "Issues with the Clutch"
+grep SEVERE clutch2.out | sort
+grep ERROR clutch2.out | sort
+grep WARN clutch2.out | sort
+
+echo "Status of the Clutch"
+grep INFO clutch2.out | sort
+grep FINAL clutch2.out | sort
+CLUTCH_COUNT_1=`grep FINAL..current clutch2.out | sed -e's/FINAL: current: //'`
+echo "STATUS: podlings: "$CLUTCH_COUNT_1
+
+echo "Build Clutch Status Pages"
+python3 clutch2status.py > clutch2pages.out
+CLUTCH_COUNT_2=`cat clutch2pages.out | wc -l | sed -e's/ *//'`
+echo "STATUS: pages: "$CLUTCH_COUNT_2
+
+if [ "$CLUTCH_COUNT_1" = "$CLUTCH_COUNT_2" ]; then
+ if [ $CLUTCH_COUNT_2 -lt 45 ]; then
+ exit 5
+ fi
+ exit 0
+else
+ exit 4
+fi
Propchange: incubator/public/trunk/clutch2.sh
------------------------------------------------------------------------------
svn:executable = *
Modified: incubator/public/trunk/clutch2status.py
URL: http://svn.apache.org/viewvc/incubator/public/trunk/clutch2status.py?rev=1855728&r1=1855727&r2=1855728&view=diff
==============================================================================
--- incubator/public/trunk/clutch2status.py (original)
+++ incubator/public/trunk/clutch2status.py Mon Mar 18 03:12:21 2019
@@ -17,7 +17,7 @@ messages = {
'06':('/helper/bootstrap','reporting','Reporting group is missing',True),
'07':('/helper/bootstrap','statusfile','Status file is missing',True),
'08':('/helper/bootstrap','startdate','Start date is not a valid date',True),
- '14':('/helper/bootstrap','email', 'Expected mailing list (incubator-{0}-{1}) is missing',False),
+ #'14':('/helper/bootstrap','email', 'Expected mailing list (incubator-{0}-{1}) is missing',False),
'15':('/helper/bootstrap','devlist',"Project does not have 'dev' mailing list",True),
'16':('/helper/bootstrap','commitslist',"Project does not have 'commits' mailing list",False),
'17':('/helper/resources','coderepository','No source code repository',False),
@@ -73,7 +73,6 @@ inputFile.close()
for k in projects:
status = "content/clutch/{}.ad".format(k)
f = open(status,'w')
- print("{0} - {1}".format(k,status))
print("= Apache "+projects[k]['fullName']+" (Incubating)",file=f)
print("Apache Incubator PMC",file=f)
print(":jbake-type: simplepage",file=f)
@@ -86,18 +85,18 @@ for k in projects:
print("",file=f)
print(" ".join(projects[k]['description'].split()),file=f)
print("",file=f)
- print("- Resources: "+projects[k]['resource'],file=f)
- print("- Started: "+projects[k]['startDate']+"; Last Status Update: "+projects[k]['statusLastUpdated'],file=f)
+ print("* Resources: "+projects[k]['resource'],file=f)
+ print("* Started: "+projects[k]['startDate']+"; Last Status Update: "+projects[k]['statusLastUpdated'],file=f)
if projects[k]['reportingMonthly']:
- print("- Reporting: Monthly",file=f)
+ print("* Reporting: Monthly",file=f)
else:
- print("- Reporting: "+projects[k]['reportingGroup'],file=f)
- print("- Committers: "+str(projects[k]['numberCommitters']),file=f)
+ print("* Reporting: "+projects[k]['reportingGroup'],file=f)
+ print("* Committers: "+str(projects[k]['numberCommitters']),file=f)
if projects[k]['numberPMCEquals']:
- print("- All Committers are PPMC members",file=f)
+ print("* All Committers are PPMC members",file=f)
else:
- print("- PPMC members: "+str(projects[k]['numberPMCMembers']),file=f)
- mentors = "- Mentors: "
+ print("* PPMC members: "+str(projects[k]['numberPMCMembers']),file=f)
+ mentors = "* Mentors: "
for m in projects[k]['mentorsApacheId']:
mentors += "{0} ({1}), ".format(m[0],m[1])
print(mentors[:-2],file=f)
@@ -107,40 +106,42 @@ for k in projects:
print("== News",file=f)
print("",file=f)
for news in projects[k]['news']:
- print("- {0}".format(news),file=f)
+ print("* {0}".format(news),file=f)
print("",file=f)
+ print("== Resources",file=f)
+
if len(projects[k]['urlWww']) > 0:
- print("== Project Website",file=f)
+ print("=== Project Website",file=f)
print("",file=f)
print("{0}".format(projects[k]['urlWww']),file=f)
print("",file=f)
- print("== Mailing Lists",file=f)
+ print("=== Mailing Lists",file=f)
print("",file=f)
if len(projects[k]['hasMailListDev']) > 0:
- print("- Developer mailing list: {0}".format(projects[k]['hasMailListDev']),file=f)
+ print("* Developer mailing list: {0}".format(projects[k]['hasMailListDev']),file=f)
else:
- print("- No developer mailing list",file=f)
+ print("* No developer mailing list",file=f)
if len(projects[k]['hasMailListCommits']) > 0:
- print("- Commits mailing list: {0}".format(projects[k]['hasMailListCommits']),file=f)
+ print("* Commits mailing list: {0}".format(projects[k]['hasMailListCommits']),file=f)
else:
- print("- No commits mailing list",file=f)
+ print("* No commits mailing list",file=f)
print("",file=f)
if len(projects[k]['urlTracker']) > 0:
- print("== Issue Tracker",file=f)
+ print("=== Issue Tracker",file=f)
print("",file=f)
print("{0}".format(projects[k]['urlTracker']),file=f)
print("",file=f)
if len(projects[k]['urlWiki']) > 0:
- print("== Wiki",file=f)
+ print("=== Wiki",file=f)
print("",file=f)
print("{0}".format(projects[k]['urlWiki']),file=f)
print("",file=f)
- print("== Repositories",file=f)
+ print("=== Repositories",file=f)
print("",file=f)
lsvn = len(projects[k]['urlSvn'])
if lsvn > 0:
@@ -162,23 +163,27 @@ for k in projects:
last_update = str(l[1]['last_update_txt'])
gitdate = datetime.datetime.fromtimestamp(l[1]['last_update_int']).strftime('%m/%d/%Y')
repos = l[0]
- print("=== {0}: {1}".format(jj,repos),file=f)
+ print("==== {0}: {1}".format(jj,repos),file=f)
print("",file=f)
- print("{0}{1}{2}[Gitbox] {3}{4}/[Github] {5}".format(
+ print("| *{0}{1}{2}[Gitbox]* | *{3}{4}/[Github]* | {5}".format(
"https://gitbox.apache.org/repos/asf?p=",repos,".git;a=tree;hb=HEAD",
"https://github.com/apache/",repos,desc),file=f)
- print("- Commits: {0}".format(commits),file=f)
- print("- Updated: {0}".format(gitdate),file=f)
+ print("-- Commits: {0}".format(commits),file=f)
+ print("-- Updated: {0}".format(gitdate),file=f)
print("",file=f)
- print("== Current Releases",file=f)
+ print("== Releases",file=f)
+ print("",file=f)
+ print("=== Current",file=f)
print("",file=f)
hasKeys = False
url1 = projects[k]['urlKeys']
if len(url1) > 0:
hasKeys = True
- print("{0}[Signing Keys]".format(url1),file=f)
+ print("*{0}[Signing Keys]*".format(url1),file=f)
url1 = "/".join(url1.split("/")[:-1])+"/"
+ print("",file=f)
+ print("It is essential that you verify the integrity of release downloads. See https://www.apache.org/dyn/closer.cgi#verify[instructions here]",file=f)
else:
print("*No PGP Signing Keys*",file=f)
url2 = projects[k]['urlDist']
@@ -188,14 +193,14 @@ for k in projects:
j = 1
for r in projects[k]['releases']:
print("",file=f)
- print("=== {0}: {1}".format(j,r),file=f)
+ print("==== {0}: {1}".format(j,r),file=f)
print("",file=f)
- print("{0}[Download] {1}[Signature] {2}[Hash] {3}".format(
+ print("| *{0}[Download]* | *{1}[Signature]* | *{2}[Hash]* | {3}".format(
projects[k]['releases'][r]['download'],
projects[k]['releases'][r]['signature'],
projects[k]['releases'][r]['hash'],r),file=f)
- print("- Filesize: {0}".format(humanbytes(float(projects[k]['releases'][r]['size']))),file=f)
- print("- Released: {0} by {1} in {2}".format(
+ print("-- Filesize: {0}".format(humanbytes(float(projects[k]['releases'][r]['size']))),file=f)
+ print("-- Released: {0} by {1} in {2}".format(
projects[k]['releases'][r]['dtm'],
projects[k]['releases'][r]['user'],
projects[k]['releases'][r]['revision']),file=f)
@@ -215,8 +220,10 @@ for k in projects:
for l in projects[k]['fixMeList']:
msg = messages[l[0]]
if msg[3]:
- print("- link:"+msg[0]+".html#"+msg[1]+"[*"+l[1]+"*]",file=f)
+ print("* link:"+msg[0]+".html#"+msg[1]+"[*"+l[1]+"*]",file=f)
else:
- print("- link:"+msg[0]+".html#"+msg[1]+"["+l[1]+"]",file=f)
+ print("* link:"+msg[0]+".html#"+msg[1]+"["+l[1]+"]",file=f)
print("",file=f)
f.close();
+ # we count lines in stdout to compare for proper completion.
+ print("{0} - {1}".format(k,status))
Added: incubator/public/trunk/content/clutch/_includes/clutchm.ad
URL: http://svn.apache.org/viewvc/incubator/public/trunk/content/clutch/_includes/clutchm.ad?rev=1855728&view=auto
==============================================================================
--- incubator/public/trunk/content/clutch/_includes/clutchm.ad (added)
+++ incubator/public/trunk/content/clutch/_includes/clutchm.ad Mon Mar 18 03:12:21 2019
@@ -0,0 +1,93 @@
+. Alan Gates(gates): Omid, SAMOA, SINGA, Superset, Tephra
+. Andriy Redko(reta): Zipkin
+. Ashutosh Chauhan(hashutosh): SAMOA, Superset
+. Ate Douma(ate): NetBeans
+. Atri Sharma(atri): SensSoft
+. Benjamin Hindman(benh): Myriad, ShardingSphere
+. Bertrand Delacretaz(bdelacretaz): NetBeans, OpenWhisk
+. Bikas Saha(bikas): Livy
+. Billie Rinaldi(billie): Rya
+. Bob Paulin(bob): MXNet
+. Brock Noland(brock): Livy
+. Byung-Gon Chun(bgchun): Nemo, TVM
+. Carl Steinbach(cws): Iceberg
+. Chris Lambertus(cml): Warble
+. Christofer Dutz(cdutz): Daffodil, Edgent, IoTDB, Training
+. Craig Russell(clr): ShardingSphere, Training
+. Daniel Dai(daijy): Hivemall
+. Daniel Gruno(humbedooh): NetBeans
+. Daniel Takamori(pono): Warble
+. David Blevins(dblevins): Tamaya
+. David Fisher(wave): Daffodil, Doris, Dubbo, ECharts, Heron
+. David Meikle(dmeikle): SensSoft
+. Davor Bonaci(davor): Amaterasu, Nemo
+. Devaraj Das(ddas): Ratis
+. Felix Cheung(felixcheung): Pinot
+. Furkan Kamaci(kamaci): TVM
+. Greg Trasuk(gtrasuk): PLC4X
+. Henri Yandell(bayard): MXNet
+. Henry Saputra(hsaputra): DLab, TVM
+. Hyunsik Choi(hyunsik): Nemo
+. Ignasi Barrera(nacx): SkyWalking
+. Jake Farrell(jfarrell): Heron
+. Jakob Homan(jghoman): Ratis
+. James Taylor(jamestaylor): Iceberg, Omid, Tephra
+. Jan Piotrowski(janpio): Weex
+. Jason Dai(jasondai): MXNet
+. Jean-Baptiste Onofre(jbonofre): Amaterasu, BatchEE, BRPC, Gobblin, Livy, Nemo, Unomi
+. Jim Jagielski(jim): Gobblin, Marvin-AI, MXNet, Pinot
+. John D. Ament(johndament): ECharts, Pony Mail, Tamaya, Zipkin
+. Josh Elser(elserj): Rya
+. Jukka Zitting(jukka): PageSpeed
+. Julian Hyde(jhyde): Crail, Druid
+. Julien Le Dem(julien): Heron, Iceberg, Toree
+. Jun Rao(junrao): Druid
+. Justin Mclean(jmclean): Dubbo, Edgent, IoTDB, PLC4X, Training
+. Jörn Rottmann(joern): SDAP
+. Kanchana Pradeepika Welagedara(kanchana): Tamaya
+. Kevin A. McGrail(kmcgrail): BRPC, ECharts, IoTDB
+. Kishore Gopalakrishna(kishoreg): Hudi, Pinot
+. Koji Sekiguchi(koji): Hivemall
+. Konstantin I Boudnik(cos): DLab
+. Krzysztof Sobkowiak(ksobkowiak): OpenWhisk
+. Lars Francke(larsfrancke): Training
+. Leif Hedstrom(zwoop): PageSpeed
+. Lewis John McGibbney(lewismc): SensSoft
+. Luciano Resende(lresende): Crail, Edgent, Hudi, Livy, Marvin-AI, Toree
+. Mark Struberg(struberg): BatchEE, NetBeans
+. Mark Thomas(markt): Dubbo
+. Markus Weimer(weimer): MXNet, Nemo
+. Marlon Pierce(mpierce): Taverna
+. Matt Sicker(mattsicker): OpenWhisk
+. Michael Semb Wever(mck): SkyWalking, Zipkin
+. Michael Wall(mjwall): MXNet
+. Myrle Krantz(myrle): Weex
+. Nick Kew(niq): Annotator, Milagro, PageSpeed
+. Olivier Lamy(olamy): Amaterasu, BatchEE, Gobblin, Pinot
+. Owen O'Malley(omalley): Iceberg
+. P. Taylor Goetz(ptgoetz): DLab, Druid, Heron
+. Phil Sorber(sorber): PageSpeed
+. Roman Shaposhnik(rvs): Pinot
+. Ryan Blue(blue): Iceberg, Toree
+. Sebastian Schelter(ssc): MXNet, TVM
+. Sergio Fernández(wikier): S2Graph
+. Shao Feng Shi(shaofengshi): Doris
+. Sharan Foga(sharan): Pony Mail
+. Sheng Wu(wusheng): Zipkin
+. Stefan Bodewig(bodewig): PLC4X
+. Steve Blackmon(sblackmon): Annotator
+. Stian Soiland-Reyes(stain): Taverna
+. Suneel Marthi(smarthi): Hudi, SDAP
+. Suresh Srinivas(suresh): Taverna
+. Ted Dunning(tdunning): Myriad, SINGA
+. Ted Liu(tedliu): ECharts
+. Thejas Nair(thejas): SINGA
+. Thomas Weise(thw): Hudi
+. Timothy Chen(tnachen): TVM
+. Tommaso Teofili(tommaso): Annotator
+. Uma Maheswara Rao G(umamahesh): Ratis, Spot
+. Von Gosling(vongosling): BRPC, ShardingSphere
+. Willem Ning Jiang(ningjiang): Doris, IoTDB, ShardingSphere, SkyWalking, Weex, Zipkin
+. William Colen(colen): Marvin-AI
+. Woonsan Ko(woonsan): S2Graph
+. Xiangrui Meng(meng): Hivemall
Added: incubator/public/trunk/content/clutch/_includes/clutchmy.ad
URL: http://svn.apache.org/viewvc/incubator/public/trunk/content/clutch/_includes/clutchmy.ad?rev=1855728&view=auto
==============================================================================
--- incubator/public/trunk/content/clutch/_includes/clutchmy.ad (added)
+++ incubator/public/trunk/content/clutch/_includes/clutchmy.ad Mon Mar 18 03:12:21 2019
@@ -0,0 +1 @@
+http://wiki.apache.org/incubator/March2019[March2019]
Added: incubator/public/trunk/content/clutch/_includes/clutcho1.ad
URL: http://svn.apache.org/viewvc/incubator/public/trunk/content/clutch/_includes/clutcho1.ad?rev=1855728&view=auto
==============================================================================
--- incubator/public/trunk/content/clutch/_includes/clutcho1.ad (added)
+++ incubator/public/trunk/content/clutch/_includes/clutcho1.ad Mon Mar 18 03:12:21 2019
@@ -0,0 +1,9 @@
+* other issues link:#other[listed] below for:
+** [.care]#gearpump#
+** [.care]#griffin#
+** [.care]#joshua#
+** [.care]#netbeans#
+** [.care]#senssoft#
+** [.care]#toree#
+** [.care]#unomi#
+** [.care]#samoa#
Added: incubator/public/trunk/content/clutch/_includes/clutcho2.ad
URL: http://svn.apache.org/viewvc/incubator/public/trunk/content/clutch/_includes/clutcho2.ad?rev=1855728&view=auto
==============================================================================
--- incubator/public/trunk/content/clutch/_includes/clutcho2.ad (added)
+++ incubator/public/trunk/content/clutch/_includes/clutcho2.ad Mon Mar 18 03:12:21 2019
@@ -0,0 +1,8 @@
+* gearpump: retired project has remains on Incubator mirrors. See link:#h-Retired[help].
+* griffin: Has graduated, but still has remains on Incubator distribution mirrors. See link:#h-Graduate[help].
+* joshua: Has graduated, but still has remains on Incubator distribution mirrors. See link:#h-Graduate[help].
+* netbeans: Has a distribution filename missing the word "incubating/incubator". See link:#h-hasRelease[help].
+* samoa: Apache Releases cannot be validated without a KEYS file. Please add required KEYS!
+* senssoft: Has a distribution filename missing the word "incubating/incubator". See link:#h-hasRelease[help].
+* toree: Has a distribution filename missing the word "incubating/incubator". See link:#h-hasRelease[help].
+* unomi: Has a distribution filename missing the word "incubating/incubator". See link:#h-hasRelease[help].
---------------------------------------------------------------------
To unsubscribe, e-mail: cvs-unsubscribe@incubator.apache.org
For additional commands, e-mail: cvs-help@incubator.apache.org