diff --git a/dev-support/releasedocmaker.py b/dev-support/releasedocmaker.py index 2ccc1c0b84a..8e68b3cb9e0 100755 --- a/dev-support/releasedocmaker.py +++ b/dev-support/releasedocmaker.py @@ -87,8 +87,15 @@ def notableclean(str): str=str.rstrip() return str +# clean output dir +def cleanOutputDir(dir): + files = os.listdir(dir) + for name in files: + os.remove(os.path.join(dir,name)) + os.rmdir(dir) + def mstr(obj): - if (obj == None): + if (obj is None): return "" return unicode(obj) @@ -148,7 +155,7 @@ class Jira: return mstr(self.fields['description']) def getReleaseNote(self): - if (self.notes == None): + if (self.notes is None): field = self.parent.fieldIdMap['Release Note'] if (self.fields.has_key(field)): self.notes=mstr(self.fields[field]) @@ -159,14 +166,14 @@ class Jira: def getPriority(self): ret = "" pri = self.fields['priority'] - if(pri != None): + if(pri is not None): ret = pri['name'] return mstr(ret) def getAssignee(self): ret = "" mid = self.fields['assignee'] - if(mid != None): + if(mid is not None): ret = mid['displayName'] return mstr(ret) @@ -182,21 +189,21 @@ class Jira: def getType(self): ret = "" mid = self.fields['issuetype'] - if(mid != None): + if(mid is not None): ret = mid['name'] return mstr(ret) def getReporter(self): ret = "" mid = self.fields['reporter'] - if(mid != None): + if(mid is not None): ret = mid['displayName'] return mstr(ret) def getProject(self): ret = "" mid = self.fields['project'] - if(mid != None): + if(mid is not None): ret = mid['key'] return mstr(ret) @@ -214,7 +221,7 @@ class Jira: return False def getIncompatibleChange(self): - if (self.incompat == None): + if (self.incompat is None): field = self.parent.fieldIdMap['Hadoop Flags'] self.reviewed=False self.incompat=False @@ -227,6 +234,24 @@ class Jira: self.reviewed=True return self.incompat + def checkMissingComponent(self): + if (len(self.fields['components'])>0): + return False + return True + + def checkMissingAssignee(self): + if (self.fields['assignee'] is not None): + return False + return True + + def checkVersionString(self): + field = self.parent.fieldIdMap['Fix Version/s'] + for h in self.fields[field]: + found = re.match('^((\d+)(\.\d+)*).*$|^(\w+\-\d+)$', h['name']) + if not found: + return True + return False + def getReleaseDate(self,version): for j in range(len(self.fields['fixVersions'])): if self.fields['fixVersions'][j]==version: @@ -339,9 +364,11 @@ def main(): help="build an index file") parser.add_option("-u","--usetoday", dest="usetoday", action="store_true", help="use current date for unreleased versions") + parser.add_option("-n","--lint", dest="lint", action="store_true", + help="use lint flag to exit on failures") (options, args) = parser.parse_args() - if (options.versions == None): + if (options.versions is None): options.versions = [] if (len(args) > 2): @@ -396,6 +423,9 @@ def main(): reloutputs.writeAll(relhead) choutputs.writeAll(chhead) + errorCount=0 + warningCount=0 + lintMessage="" incompatlist=[] buglist=[] improvementlist=[] @@ -408,6 +438,14 @@ def main(): for jira in sorted(jlist): if jira.getIncompatibleChange(): incompatlist.append(jira) + if (len(jira.getReleaseNote())==0): + warningCount+=1 + + if jira.checkVersionString(): + warningCount+=1 + + if jira.checkMissingComponent() or jira.checkMissingAssignee(): + errorCount+=1 elif jira.getType() == "Bug": buglist.append(jira) elif jira.getType() == "Improvement": @@ -431,15 +469,33 @@ def main(): reloutputs.writeKeyRaw(jira.getProject(),"\n---\n\n") reloutputs.writeKeyRaw(jira.getProject(), line) line ='\n**WARNING: No release note provided for this incompatible change.**\n\n' - print 'WARNING: incompatible change %s lacks release notes.' % (notableclean(jira.getId())) + lintMessage += "\nWARNING: incompatible change %s lacks release notes." % (notableclean(jira.getId())) reloutputs.writeKeyRaw(jira.getProject(), line) + if jira.checkVersionString(): + lintMessage += "\nWARNING: Version string problem for %s " % jira.getId() + + if (jira.checkMissingComponent() or jira.checkMissingAssignee()): + errorMessage=[] + jira.checkMissingComponent() and errorMessage.append("component") + jira.checkMissingAssignee() and errorMessage.append("assignee") + lintMessage += "\nERROR: missing %s for %s " % (" and ".join(errorMessage) , jira.getId()) + if (len(jira.getReleaseNote())>0): reloutputs.writeKeyRaw(jira.getProject(),"\n---\n\n") reloutputs.writeKeyRaw(jira.getProject(), line) line ='\n%s\n\n' % (tableclean(jira.getReleaseNote())) reloutputs.writeKeyRaw(jira.getProject(), line) + if (options.lint is True): + print lintMessage + print "=======================================" + print "Error:%d, Warning:%d \n" % (errorCount, warningCount) + + if (errorCount>0): + cleanOutputDir(version) + sys.exit(1) + reloutputs.writeAll("\n\n") reloutputs.close() diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index 92e1bfaff87..18c73c0a7ec 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -230,6 +230,8 @@ Trunk (Unreleased) HADOOP-11142. Remove hdfs dfs reference from file system shell documentation (Kengo Seki via aw) + HADOOP-11807. add a lint mode to releasedocmaker (ramtin via aw) + BUG FIXES HADOOP-11473. test-patch says "-1 overall" even when all checks are +1