)]}'
{"tools/check_review_status.py":[{"author":{"_account_id":17068,"name":"Jean-Philippe Evrard","email":"openstack@a.spamming.party","username":"evrardjp"},"change_message_id":"7e61360e5adf115c6e02283ea8cb6fe3ee194c4a","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        parts.append(\u0027last change on {}\u0027.format(latest_created.date()))"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        # At least 7 days old."},{"line_number":227,"context_line":"        if age \u003c datetime.timedelta(7):"},{"line_number":228,"context_line":"            time_to_approve \u003d False"},{"line_number":229,"context_line":"            parts.append(\u0027has not been open 7 days\u0027)"},{"line_number":230,"context_line":"            earliest \u003d str(latest_created.date() + datetime.timedelta(7))"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_38806a46","line":227,"range":{"start_line":227,"start_character":15,"end_line":227,"end_character":16},"updated":"2019-09-25 15:54:45.000000000","message":"Isn\u0027t it \u003c\u003d to 7? Assuming one second more than a day, and you would be good to merge.","commit_id":"ffd9b88ecee3c204015e1b4607006773d306cd55"},{"author":{"_account_id":17068,"name":"Jean-Philippe Evrard","email":"openstack@a.spamming.party","username":"evrardjp"},"change_message_id":"23340395edec8eedb6f3653f6bc3bcbf67106d35","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        parts.append(\u0027last change on {}\u0027.format(latest_created.date()))"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        # At least 7 days old."},{"line_number":227,"context_line":"        if age \u003c datetime.timedelta(7):"},{"line_number":228,"context_line":"            time_to_approve \u003d False"},{"line_number":229,"context_line":"            parts.append(\u0027has not been open 7 days\u0027)"},{"line_number":230,"context_line":"            earliest \u003d str(latest_created.date() + datetime.timedelta(7))"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_f50f0d85","line":227,"in_reply_to":"","updated":"2019-09-27 14:36:13.000000000","message":"Hahaha. Yes.","commit_id":"ffd9b88ecee3c204015e1b4607006773d306cd55"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"65bc201d3ade1207dc3e11d823c8b1eadcbc7f38","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        parts.append(\u0027last change on {}\u0027.format(latest_created.date()))"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        # At least 7 days old."},{"line_number":227,"context_line":"        if age \u003c datetime.timedelta(7):"},{"line_number":228,"context_line":"            time_to_approve \u003d False"},{"line_number":229,"context_line":"            parts.append(\u0027has not been open 7 days\u0027)"},{"line_number":230,"context_line":"            earliest \u003d str(latest_created.date() + datetime.timedelta(7))"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_58bf6660","line":227,"range":{"start_line":227,"start_character":15,"end_line":227,"end_character":16},"in_reply_to":"3fa7e38b_38806a46","updated":"2019-09-25 16:25:11.000000000","message":"timedelta is in microseconds so let\u0027s just agree that nobody cares.","commit_id":"ffd9b88ecee3c204015e1b4607006773d306cd55"},{"author":{"_account_id":17068,"name":"Jean-Philippe Evrard","email":"openstack@a.spamming.party","username":"evrardjp"},"change_message_id":"7e61360e5adf115c6e02283ea8cb6fe3ee194c4a","unresolved":false,"context_lines":[{"line_number":342,"context_line":"        # https://governance.openstack.org/tc/reference/house-rules.html#other-project-team-updates"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        # At least 7 days old."},{"line_number":345,"context_line":"        earliest \u003d str(latest_created.date() + datetime.timedelta(8))"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        if votes[-1] or code_reviews[-1]:"},{"line_number":348,"context_line":"            can_approve \u003d \u0027dissenting votes\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_b88bfa65","line":345,"range":{"start_line":345,"start_character":66,"end_line":345,"end_character":67},"updated":"2019-09-25 15:54:45.000000000","message":"shouldn\u0027t this be also updated?","commit_id":"ffd9b88ecee3c204015e1b4607006773d306cd55"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"65bc201d3ade1207dc3e11d823c8b1eadcbc7f38","unresolved":false,"context_lines":[{"line_number":342,"context_line":"        # https://governance.openstack.org/tc/reference/house-rules.html#other-project-team-updates"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        # At least 7 days old."},{"line_number":345,"context_line":"        earliest \u003d str(latest_created.date() + datetime.timedelta(8))"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        if votes[-1] or code_reviews[-1]:"},{"line_number":348,"context_line":"            can_approve \u003d \u0027dissenting votes\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_78c4a2f5","line":345,"range":{"start_line":345,"start_character":66,"end_line":345,"end_character":67},"in_reply_to":"3fa7e38b_b88bfa65","updated":"2019-09-25 16:25:11.000000000","message":"+1","commit_id":"ffd9b88ecee3c204015e1b4607006773d306cd55"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"65bc201d3ade1207dc3e11d823c8b1eadcbc7f38","unresolved":false,"context_lines":[{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        if votes[-1] or code_reviews[-1]:"},{"line_number":348,"context_line":"            can_approve \u003d \u0027dissenting votes\u0027"},{"line_number":349,"context_line":"        elif age \u003c\u003d datetime.timedelta(7):"},{"line_number":350,"context_line":"            can_approve \u003d \u0027too soon\u0027"},{"line_number":351,"context_line":"        else:"},{"line_number":352,"context_line":"            can_approve \u003d \u0027YES\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_18b56e7e","line":349,"updated":"2019-09-25 16:25:11.000000000","message":"it even says 7 here","commit_id":"ffd9b88ecee3c204015e1b4607006773d306cd55"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"ace2f73fd507a8326dc9e559d427c4a3609c9eb9","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        parts.append(\u0027last change on {}\u0027.format(latest_created.date()))"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        # At least 7 days old."},{"line_number":227,"context_line":"        if age \u003c datetime.timedelta(7):"},{"line_number":228,"context_line":"            time_to_approve \u003d False"},{"line_number":229,"context_line":"            parts.append(\u0027has not been open 7 days\u0027)"},{"line_number":230,"context_line":"            earliest \u003d str(latest_created.date() + datetime.timedelta(7))"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_43319da2","line":227,"range":{"start_line":227,"start_character":36,"end_line":227,"end_character":37},"updated":"2019-09-26 20:34:28.000000000","message":"I think it would make sense to create a variable to hold the age threshold, so there would be one place to tweak rather than peppering it across the file.","commit_id":"fa588106712ec4471704b3341193660ad923ff9d"},{"author":{"_account_id":1004,"name":"Mohammed Naser","email":"mnaser@vexxhost.com","username":"mnaser"},"change_message_id":"2cbda71a1aecf0e5248a22118e12e837175505b4","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        parts.append(\u0027last change on {}\u0027.format(latest_created.date()))"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        # At least 7 days old."},{"line_number":227,"context_line":"        if age \u003c datetime.timedelta(7):"},{"line_number":228,"context_line":"            time_to_approve \u003d False"},{"line_number":229,"context_line":"            parts.append(\u0027has not been open 7 days\u0027)"},{"line_number":230,"context_line":"            earliest \u003d str(latest_created.date() + datetime.timedelta(7))"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_75679db8","line":227,"range":{"start_line":227,"start_character":36,"end_line":227,"end_character":37},"in_reply_to":"3fa7e38b_43319da2","updated":"2019-09-27 14:15:35.000000000","message":"Personally I don\u0027t have time to drive this anymore because the age threshold is different depending on topic.","commit_id":"fa588106712ec4471704b3341193660ad923ff9d"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"79b3433bbded6624a10fa4e813889a5ffdebb803","unresolved":false,"context_lines":[{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    latest \u003d find_latest_revision(change)"},{"line_number":199,"context_line":"    latest_created \u003d to_datetime(latest[\u0027created\u0027])"},{"line_number":200,"context_line":"    now \u003d datetime.datetime.now()"},{"line_number":201,"context_line":"    age \u003d now.date() - latest_created.date()"},{"line_number":202,"context_line":"    earliest \u003d \u0027\u0027"},{"line_number":203,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_a4716578","line":200,"range":{"start_line":200,"start_character":28,"end_line":200,"end_character":31},"updated":"2019-09-27 18:07:15.000000000","message":"Should this be utcnow()? It\u0027d be very surprising if Gerrit were returning times in the local time zone.","commit_id":"d73a53d75e1ffaf313ddcccf81fb0f1f5ba7961c"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"95eb8fc48d270f11d80a68478cb264ed2c2f30fb","unresolved":false,"context_lines":[{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    latest \u003d find_latest_revision(change)"},{"line_number":199,"context_line":"    latest_created \u003d to_datetime(latest[\u0027created\u0027])"},{"line_number":200,"context_line":"    now \u003d datetime.datetime.now()"},{"line_number":201,"context_line":"    age \u003d now.date() - latest_created.date()"},{"line_number":202,"context_line":"    earliest \u003d \u0027\u0027"},{"line_number":203,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_5f5dda12","line":200,"range":{"start_line":200,"start_character":28,"end_line":200,"end_character":31},"in_reply_to":"3fa7e38b_a4716578","updated":"2019-09-27 19:02:04.000000000","message":"Done","commit_id":"d73a53d75e1ffaf313ddcccf81fb0f1f5ba7961c"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"79b3433bbded6624a10fa4e813889a5ffdebb803","unresolved":false,"context_lines":[{"line_number":198,"context_line":"    latest \u003d find_latest_revision(change)"},{"line_number":199,"context_line":"    latest_created \u003d to_datetime(latest[\u0027created\u0027])"},{"line_number":200,"context_line":"    now \u003d datetime.datetime.now()"},{"line_number":201,"context_line":"    age \u003d now.date() - latest_created.date()"},{"line_number":202,"context_line":"    earliest \u003d \u0027\u0027"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    code_reviews \u003d count_votes(change, \u0027Code-Review\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_648b6d67","line":201,"updated":"2019-09-27 18:07:15.000000000","message":"I think this is the actual issue here. We\u0027re comparing the age only in whole numbers of days, so we had to use 8 as the threshold to ensure nothing got merged too early. I think we need to do:\n\n  age \u003d now - latest_created\n\nand use 7 as the threshold.\n\nThis was probably covering up the time zone problem above.","commit_id":"d73a53d75e1ffaf313ddcccf81fb0f1f5ba7961c"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"95eb8fc48d270f11d80a68478cb264ed2c2f30fb","unresolved":false,"context_lines":[{"line_number":198,"context_line":"    latest \u003d find_latest_revision(change)"},{"line_number":199,"context_line":"    latest_created \u003d to_datetime(latest[\u0027created\u0027])"},{"line_number":200,"context_line":"    now \u003d datetime.datetime.now()"},{"line_number":201,"context_line":"    age \u003d now.date() - latest_created.date()"},{"line_number":202,"context_line":"    earliest \u003d \u0027\u0027"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    code_reviews \u003d count_votes(change, \u0027Code-Review\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_bfcace9d","line":201,"in_reply_to":"3fa7e38b_648b6d67","updated":"2019-09-27 19:02:04.000000000","message":"Done, except since age is now a datetime.timedelta object I am using a timedelta(days\u003d7) to compare it against.","commit_id":"d73a53d75e1ffaf313ddcccf81fb0f1f5ba7961c"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"79b3433bbded6624a10fa4e813889a5ffdebb803","unresolved":false,"context_lines":[{"line_number":236,"context_line":"            time_to_approve \u003d False"},{"line_number":237,"context_line":"            parts.append(\"has not been open %d days\" % creation_age_threshold)"},{"line_number":238,"context_line":"            earliest \u003d str(latest_created.date() +"},{"line_number":239,"context_line":"                           datetime.timedelta(creation_age_threshold))"},{"line_number":240,"context_line":"        elif reached_majority:"},{"line_number":241,"context_line":"            # Wait at least majority_age_threshold days after reaching majority."},{"line_number":242,"context_line":"            earliest \u003d str(reached_majority.date() +"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_a4f645d6","line":239,"updated":"2019-09-27 18:07:15.000000000","message":"Likewise this should probably be:\n\n  (latest_created + datetime.timedelta(creation_age_timeout)).date()\n\nIt\u0027d pay to make a function for this since it occurs multiple times.","commit_id":"d73a53d75e1ffaf313ddcccf81fb0f1f5ba7961c"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"95eb8fc48d270f11d80a68478cb264ed2c2f30fb","unresolved":false,"context_lines":[{"line_number":236,"context_line":"            time_to_approve \u003d False"},{"line_number":237,"context_line":"            parts.append(\"has not been open %d days\" % creation_age_threshold)"},{"line_number":238,"context_line":"            earliest \u003d str(latest_created.date() +"},{"line_number":239,"context_line":"                           datetime.timedelta(creation_age_threshold))"},{"line_number":240,"context_line":"        elif reached_majority:"},{"line_number":241,"context_line":"            # Wait at least majority_age_threshold days after reaching majority."},{"line_number":242,"context_line":"            earliest \u003d str(reached_majority.date() +"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_3f6c9e9a","line":239,"in_reply_to":"3fa7e38b_a4f645d6","updated":"2019-09-27 19:02:04.000000000","message":"Done","commit_id":"d73a53d75e1ffaf313ddcccf81fb0f1f5ba7961c"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"79b3433bbded6624a10fa4e813889a5ffdebb803","unresolved":false,"context_lines":[{"line_number":241,"context_line":"            # Wait at least majority_age_threshold days after reaching majority."},{"line_number":242,"context_line":"            earliest \u003d str(reached_majority.date() +"},{"line_number":243,"context_line":"                           datetime.timedelta(majority_age_threshold))"},{"line_number":244,"context_line":"            since_majority \u003d now.date() - reached_majority.date()"},{"line_number":245,"context_line":"            time_to_approve \u003d since_majority \u003e datetime.timedelta("},{"line_number":246,"context_line":"                majority_age_threshold)"},{"line_number":247,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_e4b75df4","line":244,"updated":"2019-09-27 18:07:15.000000000","message":"Same thing.","commit_id":"d73a53d75e1ffaf313ddcccf81fb0f1f5ba7961c"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"95eb8fc48d270f11d80a68478cb264ed2c2f30fb","unresolved":false,"context_lines":[{"line_number":241,"context_line":"            # Wait at least majority_age_threshold days after reaching majority."},{"line_number":242,"context_line":"            earliest \u003d str(reached_majority.date() +"},{"line_number":243,"context_line":"                           datetime.timedelta(majority_age_threshold))"},{"line_number":244,"context_line":"            since_majority \u003d now.date() - reached_majority.date()"},{"line_number":245,"context_line":"            time_to_approve \u003d since_majority \u003e datetime.timedelta("},{"line_number":246,"context_line":"                majority_age_threshold)"},{"line_number":247,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_9f711279","line":244,"in_reply_to":"3fa7e38b_e4b75df4","updated":"2019-09-27 19:02:04.000000000","message":"Done","commit_id":"d73a53d75e1ffaf313ddcccf81fb0f1f5ba7961c"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"79b3433bbded6624a10fa4e813889a5ffdebb803","unresolved":false,"context_lines":[{"line_number":368,"context_line":"        # https://governance.openstack.org/tc/reference/house-rules.html#goal-updates-from-ptls"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"        # At least 7 days old."},{"line_number":371,"context_line":"        earliest \u003d str(latest_created.date() + datetime.timedelta(7))"},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"        if votes[-1]:"},{"line_number":374,"context_line":"            can_approve \u003d \u0027dissenting votes\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_64ea8dd8","line":371,"range":{"start_line":371,"start_character":66,"end_line":371,"end_character":67},"updated":"2019-09-27 18:07:15.000000000","message":"Could use the constant here.","commit_id":"d73a53d75e1ffaf313ddcccf81fb0f1f5ba7961c"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"95eb8fc48d270f11d80a68478cb264ed2c2f30fb","unresolved":false,"context_lines":[{"line_number":368,"context_line":"        # https://governance.openstack.org/tc/reference/house-rules.html#goal-updates-from-ptls"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"        # At least 7 days old."},{"line_number":371,"context_line":"        earliest \u003d str(latest_created.date() + datetime.timedelta(7))"},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"        if votes[-1]:"},{"line_number":374,"context_line":"            can_approve \u003d \u0027dissenting votes\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_7f769672","line":371,"range":{"start_line":371,"start_character":66,"end_line":371,"end_character":67},"in_reply_to":"3fa7e38b_64ea8dd8","updated":"2019-09-27 19:02:04.000000000","message":"Done","commit_id":"d73a53d75e1ffaf313ddcccf81fb0f1f5ba7961c"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"814f7803a1a052bc61db7c65198ccf39b769f78a","unresolved":false,"context_lines":[{"line_number":236,"context_line":"            time_to_approve \u003d False"},{"line_number":237,"context_line":"            parts.append(\"has not been open %d days\" %"},{"line_number":238,"context_line":"                         creation_age_threshold.days)"},{"line_number":239,"context_line":"            earliest \u003d str(latest_created.date() + creation_age_threshold)"},{"line_number":240,"context_line":"        elif reached_majority:"},{"line_number":241,"context_line":"            # Wait at least majority_age_threshold days after reaching majority."},{"line_number":242,"context_line":"            earliest \u003d str(reached_majority.date() + majority_age_threshold)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_c6749000","line":239,"updated":"2019-09-30 16:36:39.000000000","message":"This now reports the date+time instead of just the date. This is probably less confusing when the it\u0027ll be time to approve later the same day, but also takes up more space and will be harder to read. I\u0027ll leave it up to people who actually use this script to decide if that\u0027s what they want.","commit_id":"38fff60b24c6652c645a199cf0d02de03a7abb43"},{"author":{"_account_id":17068,"name":"Jean-Philippe Evrard","email":"openstack@a.spamming.party","username":"evrardjp"},"change_message_id":"97da75c6b8434a476df902416c7c198be1f6fcbf","unresolved":false,"context_lines":[{"line_number":236,"context_line":"            time_to_approve \u003d False"},{"line_number":237,"context_line":"            parts.append(\"has not been open %d days\" %"},{"line_number":238,"context_line":"                         creation_age_threshold.days)"},{"line_number":239,"context_line":"            earliest \u003d str(latest_created.date() + creation_age_threshold)"},{"line_number":240,"context_line":"        elif reached_majority:"},{"line_number":241,"context_line":"            # Wait at least majority_age_threshold days after reaching majority."},{"line_number":242,"context_line":"            earliest \u003d str(reached_majority.date() + majority_age_threshold)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_ea5aa34e","line":239,"in_reply_to":"3fa7e38b_c6749000","updated":"2019-10-01 12:19:53.000000000","message":"I have rebased and updated this appropriately.\nThis should now reflect the latest changes in master, while keep the ideas of this patch.","commit_id":"38fff60b24c6652c645a199cf0d02de03a7abb43"}]}
