Repository: mesos Updated Branches: refs/heads/master 68c298e64 -> 8909bb889
Renamed verify-reviews.py to verify_reviews.py. Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/8909bb88 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/8909bb88 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/8909bb88 Branch: refs/heads/master Commit: 8909bb8899ede925fa109989de5e8293a06f7ccc Parents: 68c298e Author: Vinod Kone <[email protected]> Authored: Thu Oct 16 18:37:25 2014 -0700 Committer: Vinod Kone <[email protected]> Committed: Thu Oct 16 18:37:25 2014 -0700 ---------------------------------------------------------------------- support/verify-reviews.py | 195 ----------------------------------------- support/verify_reviews.py | 195 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 195 insertions(+), 195 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/8909bb88/support/verify-reviews.py ---------------------------------------------------------------------- diff --git a/support/verify-reviews.py b/support/verify-reviews.py deleted file mode 100755 index 13f879c..0000000 --- a/support/verify-reviews.py +++ /dev/null @@ -1,195 +0,0 @@ -#!/usr/bin/env python2.7 - -# Provides a tool to verify Mesos reviews that are submitted to -# Review Board. - -import atexit -import json -import subprocess -import sys -import urllib -import urllib2 - -from datetime import datetime, timedelta - -REVIEWBOARD_URL = "https://reviews.apache.org" - -# TODO(vinod): Use 'argparse' module. -# Get the user and password from command line. -if len(sys.argv) < 3: - print "Usage: ./verify-reviews.py <user> <password> [num-reviews] [query-params]" - sys.exit(1) - -USER = sys.argv[1] -PASSWORD = sys.argv[2] - -# Number of reviews to verify. -NUM_REVIEWS = -1 # All possible reviews. -if len(sys.argv) >= 4: - NUM_REVIEWS = int(sys.argv[3]) - -# Unless otherwise specified consider pending review requests to Mesos updated -# since 03/01/2014. -GROUP = "mesos" -LAST_UPDATED = "2014-03-01T00:00:00" -QUERY_PARAMS = "?to-groups=%s&status=pending&last-updated-from=%s" \ - % (GROUP, LAST_UPDATED) -if len(sys.argv) >= 5: - QUERY_PARAMS = sys.argv[4] - - -def shell(command): - print command - return subprocess.check_output( - command, stderr=subprocess.STDOUT, shell=True) - - -HEAD = shell("git rev-parse HEAD") - - -def api(url, data=None): - auth_handler = urllib2.HTTPBasicAuthHandler() - auth_handler.add_password( - realm="Web API", - uri="reviews.apache.org", - user=USER, - passwd=PASSWORD) - - opener = urllib2.build_opener(auth_handler) - urllib2.install_opener(opener) - - return json.loads(urllib2.urlopen(url, data=data).read()) - - -def apply_review(review_id): - print "Applying review %s" % review_id - shell("./support/apply-review.sh -n -r %s" % review_id) - - -def apply_reviews(review_request, applied): - # Skip this review if it's already applied. - if review_request["id"] in applied: - print "Skipping already applied review %s" % review_request["id"] - - # First recursively apply the dependent reviews. - for review in review_request["depends_on"]: - review_url = review["href"] - print "Dependent review: %s " % review_url - apply_reviews(api(review_url)["review_request"], applied) - - # Now apply this review if not yet submitted. - applied.append(review_request["id"]) - if review_request["status"] != "submitted": - apply_review(review_request["id"]) - - -def post_review(review_request, message): - print "Posting review: %s" % message - - review_url = review_request["links"]["reviews"]["href"] - data = urllib.urlencode({'body_top' : message, 'public' : 'true'}) - api(review_url, data) - - [email protected] -def cleanup(): - try: - shell("git clean -fd") - shell("git reset --hard %s" % HEAD) - except subprocess.CalledProcessError as e: - print "Failed command: %s\n\nError: %s" % (e.cmd, e.output) - - -def verify_review(review_request): - print "Verifying review %s" % review_request["id"] - try: - # Recursively apply the review and its dependents. - applied = [] - apply_reviews(review_request, applied) - - # Make sure build succeeds. - shell("./bootstrap") - shell("./configure") - - # Make sure tests pass. - shell("make -j3 distcheck") - - # Success! - post_review( - review_request, - "Patch looks great!\n\n" \ - "Reviews applied: %s\n\n" \ - "All tests passed." % applied) - except subprocess.CalledProcessError as e: - post_review( - review_request, - "Bad patch!\n\n" \ - "Reviews applied: %s\n\n" \ - "Failed command: %s\n\n" \ - "Error:\n %s" % (applied, e.cmd, e.output)) - - # Clean up. - cleanup() - - -# Returns true if this review request needs to be verified. -def needs_verification(review_request): - print "Checking if review: %s needs verification" % review_request["id"] - - # Skip if the review blocks another review. - if review_request["blocks"]: - print "Skipping blocking review %s" % review_request["id"] - return False - - diffs_url = review_request["links"]["diffs"]["href"] - diffs = api(diffs_url) - - if len(diffs["diffs"]) == 0: # No diffs attached! - print "Skipping review %s as it has no diffs" % review_request["id"] - return False - - RB_DATE_FORMAT = "%Y-%m-%dT%H:%M:%SZ" - - # Get the timestamp of the latest diff. - timestamp = diffs["diffs"][-1]["timestamp"] - diff_time = datetime.strptime(timestamp, RB_DATE_FORMAT) - print "Latest diff timestamp: %s" % diff_time - - # Get the timestamp of the latest review from this script. - reviews_url = review_request["links"]["reviews"]["href"] - reviews = api(reviews_url) - review_time = None - for review in reversed(reviews["reviews"]): - if review["links"]["user"]["title"] == USER: - timestamp = review["timestamp"] - review_time = datetime.strptime(timestamp, RB_DATE_FORMAT) - print "Latest review timestamp: %s" % review_time - break - - # TODO: Apply this check recursively up the dependency chain. - changes_url = review_request["links"]["changes"]["href"] - changes = api(changes_url) - dependency_time = None - for change in changes["changes"]: - if "depends_on" in change["fields_changed"]: - timestamp = change["timestamp"] - dependency_time = datetime.strptime(timestamp, RB_DATE_FORMAT) - print "Latest dependency change timestamp: %s" % dependency_time - break - - # Needs verification if there is a new diff, or if the dependencies changed, - # after the last time it was verified. - return not review_time or review_time < diff_time or \ - (dependency_time and review_time < dependency_time) - - -if __name__=="__main__": - review_requests_url = "%s/api/review-requests/%s" % (REVIEWBOARD_URL, QUERY_PARAMS) - - review_requests = api(review_requests_url) - num_reviews = 0 - for review_request in reversed(review_requests["review_requests"]): - if (NUM_REVIEWS == -1 or num_reviews < NUM_REVIEWS) and \ - needs_verification(review_request): - verify_review(review_request) - num_reviews += 1 http://git-wip-us.apache.org/repos/asf/mesos/blob/8909bb88/support/verify_reviews.py ---------------------------------------------------------------------- diff --git a/support/verify_reviews.py b/support/verify_reviews.py new file mode 100755 index 0000000..13f879c --- /dev/null +++ b/support/verify_reviews.py @@ -0,0 +1,195 @@ +#!/usr/bin/env python2.7 + +# Provides a tool to verify Mesos reviews that are submitted to +# Review Board. + +import atexit +import json +import subprocess +import sys +import urllib +import urllib2 + +from datetime import datetime, timedelta + +REVIEWBOARD_URL = "https://reviews.apache.org" + +# TODO(vinod): Use 'argparse' module. +# Get the user and password from command line. +if len(sys.argv) < 3: + print "Usage: ./verify-reviews.py <user> <password> [num-reviews] [query-params]" + sys.exit(1) + +USER = sys.argv[1] +PASSWORD = sys.argv[2] + +# Number of reviews to verify. +NUM_REVIEWS = -1 # All possible reviews. +if len(sys.argv) >= 4: + NUM_REVIEWS = int(sys.argv[3]) + +# Unless otherwise specified consider pending review requests to Mesos updated +# since 03/01/2014. +GROUP = "mesos" +LAST_UPDATED = "2014-03-01T00:00:00" +QUERY_PARAMS = "?to-groups=%s&status=pending&last-updated-from=%s" \ + % (GROUP, LAST_UPDATED) +if len(sys.argv) >= 5: + QUERY_PARAMS = sys.argv[4] + + +def shell(command): + print command + return subprocess.check_output( + command, stderr=subprocess.STDOUT, shell=True) + + +HEAD = shell("git rev-parse HEAD") + + +def api(url, data=None): + auth_handler = urllib2.HTTPBasicAuthHandler() + auth_handler.add_password( + realm="Web API", + uri="reviews.apache.org", + user=USER, + passwd=PASSWORD) + + opener = urllib2.build_opener(auth_handler) + urllib2.install_opener(opener) + + return json.loads(urllib2.urlopen(url, data=data).read()) + + +def apply_review(review_id): + print "Applying review %s" % review_id + shell("./support/apply-review.sh -n -r %s" % review_id) + + +def apply_reviews(review_request, applied): + # Skip this review if it's already applied. + if review_request["id"] in applied: + print "Skipping already applied review %s" % review_request["id"] + + # First recursively apply the dependent reviews. + for review in review_request["depends_on"]: + review_url = review["href"] + print "Dependent review: %s " % review_url + apply_reviews(api(review_url)["review_request"], applied) + + # Now apply this review if not yet submitted. + applied.append(review_request["id"]) + if review_request["status"] != "submitted": + apply_review(review_request["id"]) + + +def post_review(review_request, message): + print "Posting review: %s" % message + + review_url = review_request["links"]["reviews"]["href"] + data = urllib.urlencode({'body_top' : message, 'public' : 'true'}) + api(review_url, data) + + [email protected] +def cleanup(): + try: + shell("git clean -fd") + shell("git reset --hard %s" % HEAD) + except subprocess.CalledProcessError as e: + print "Failed command: %s\n\nError: %s" % (e.cmd, e.output) + + +def verify_review(review_request): + print "Verifying review %s" % review_request["id"] + try: + # Recursively apply the review and its dependents. + applied = [] + apply_reviews(review_request, applied) + + # Make sure build succeeds. + shell("./bootstrap") + shell("./configure") + + # Make sure tests pass. + shell("make -j3 distcheck") + + # Success! + post_review( + review_request, + "Patch looks great!\n\n" \ + "Reviews applied: %s\n\n" \ + "All tests passed." % applied) + except subprocess.CalledProcessError as e: + post_review( + review_request, + "Bad patch!\n\n" \ + "Reviews applied: %s\n\n" \ + "Failed command: %s\n\n" \ + "Error:\n %s" % (applied, e.cmd, e.output)) + + # Clean up. + cleanup() + + +# Returns true if this review request needs to be verified. +def needs_verification(review_request): + print "Checking if review: %s needs verification" % review_request["id"] + + # Skip if the review blocks another review. + if review_request["blocks"]: + print "Skipping blocking review %s" % review_request["id"] + return False + + diffs_url = review_request["links"]["diffs"]["href"] + diffs = api(diffs_url) + + if len(diffs["diffs"]) == 0: # No diffs attached! + print "Skipping review %s as it has no diffs" % review_request["id"] + return False + + RB_DATE_FORMAT = "%Y-%m-%dT%H:%M:%SZ" + + # Get the timestamp of the latest diff. + timestamp = diffs["diffs"][-1]["timestamp"] + diff_time = datetime.strptime(timestamp, RB_DATE_FORMAT) + print "Latest diff timestamp: %s" % diff_time + + # Get the timestamp of the latest review from this script. + reviews_url = review_request["links"]["reviews"]["href"] + reviews = api(reviews_url) + review_time = None + for review in reversed(reviews["reviews"]): + if review["links"]["user"]["title"] == USER: + timestamp = review["timestamp"] + review_time = datetime.strptime(timestamp, RB_DATE_FORMAT) + print "Latest review timestamp: %s" % review_time + break + + # TODO: Apply this check recursively up the dependency chain. + changes_url = review_request["links"]["changes"]["href"] + changes = api(changes_url) + dependency_time = None + for change in changes["changes"]: + if "depends_on" in change["fields_changed"]: + timestamp = change["timestamp"] + dependency_time = datetime.strptime(timestamp, RB_DATE_FORMAT) + print "Latest dependency change timestamp: %s" % dependency_time + break + + # Needs verification if there is a new diff, or if the dependencies changed, + # after the last time it was verified. + return not review_time or review_time < diff_time or \ + (dependency_time and review_time < dependency_time) + + +if __name__=="__main__": + review_requests_url = "%s/api/review-requests/%s" % (REVIEWBOARD_URL, QUERY_PARAMS) + + review_requests = api(review_requests_url) + num_reviews = 0 + for review_request in reversed(review_requests["review_requests"]): + if (NUM_REVIEWS == -1 or num_reviews < NUM_REVIEWS) and \ + needs_verification(review_request): + verify_review(review_request) + num_reviews += 1
