incubator-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From w...@apache.org
Subject svn commit: r1855728 [1/2] - in /incubator/public/trunk: ./ content/clutch/ content/clutch/_includes/
Date Mon, 18 Mar 2019 03:12:22 GMT
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


Mime
View raw message