def install_certificate(repo, args): """Asks user to enter the Phabricator API Token. Named for parity with arc's corresponding command. The response is saved in the ~/.arcrc file; moz-phab itself doesn't do any verification/parsing of the provided string (verification happens by passing it to the Phabricator server).""" logger.info( "LOGIN TO PHABRICATOR\nOpen this page in your browser and login " "to Phabricator if necessary:\n\n%s/conduit/login/\n", conduit.repo.phab_url, ) token = prompt("Paste API Token from that page: ") # Call a method that requires authentication to both verify the token and clear # the default one-hour expiration of newly created tokens. with wait_message("Verifying token"): who = conduit.whoami(api_token=token) conduit.save_api_token(token) logger.info("Configured moz-phab for %s", who["realName"])
def show_commit_stack( commits, wip=None, validate=True, ignore_reviewers=False, show_rev_urls=False, show_updated_only=False, ): """Log the commit stack in a human readable form.""" # keep output in columns by sizing the action column to the longest rev + 1 ("D") max_len = (max(len(c.get("rev-id", "") or "") for c in commits) + 1 if commits else "") action_template = "(%" + str(max_len) + "s)" if validate: # preload all revisions ids = [int(c["rev-id"]) for c in commits if c.get("rev-id")] if ids: with wait_message("Loading existing revisions..."): revisions = conduit.get_revisions(ids=ids) # preload diffs with wait_message("Loading diffs..."): diffs = conduit.get_diffs( [r["fields"]["diffPHID"] for r in revisions]) for commit in reversed(commits): if show_updated_only and not commit["submit"]: continue closed = False change_bug_id = False is_author = True revision = None wip_removed = False wip_set = False reviewers_added = False if commit.get("rev-id"): action = action_template % ("D" + commit["rev-id"]) if validate: revisions = conduit.get_revisions(ids=[int(commit["rev-id"])]) if len(revisions) > 0: revision = revisions[0] # Check if target bug ID is the same as in the Phabricator revision change_bug_id = ("bugzilla.bug-id" in revision["fields"] and revision["fields"]["bugzilla.bug-id"] and (commit["bug-id"] != revision["fields"]["bugzilla.bug-id"])) # Check if revision is closed closed = revision["fields"]["status"]["closed"] # Check if comandeering is required whoami = conduit.whoami() if "authorPHID" in revision["fields"] and ( revision["fields"]["authorPHID"] != whoami["phid"]): is_author = False # Do we remove "Changes Planned" status? wip_removed = (not wip and revision["fields"]["status"]["value"] == "changes-planned") # Do we set "Changes Planned" status? wip_set = (wip and revision["fields"]["status"]["value"] != "changes-planned") # Any reviewers added to a revision without them? reviewers_added = bool( not revision["attachments"]["reviewers"]["reviewers"] and commit["reviewers"]["granted"]) # if SHA1 hasn't changed # and we're not changing the WIP status # and we're not adding reviewers to a revision without reviewers # and we're not changing the bug-id sha1_changed = ( commit["node"] != diffs[revision["fields"]["diffPHID"]] ["attachments"]["commits"]["commits"][0]["identifier"]) if (not sha1_changed and not wip_removed and not wip_set and not reviewers_added and not change_bug_id and not closed): commit["submit"] = False else: action = action_template % "New" logger.info("%s %s %s", action, commit["name"], commit["title-preview"]) if validate: if not commit["submit"]: logger.info( " * This revision is not changed and will not be submitted." ) else: if wip_removed: logger.warning( '!! "Changes Planned" status will change to "Request Review"' ) if change_bug_id: logger.warning( "!! Bug ID in Phabricator revision will change from %s to %s", revision["fields"]["bugzilla.bug-id"], commit["bug-id"], ) if not is_author: logger.warning( "!! You don't own this revision. Normally, you should only\n" ' update revisions you own. You can "Commandeer" this\n' " revision from the web interface if you want to become\n" " the owner.") if closed: logger.warning( "!! This revision is closed!\n" " It will be reopened if submission proceeds.\n" " You can stop now and refine the stack range.") if not commit["bug-id"]: logger.warning("!! Missing Bug ID") if commit["bug-id-orig"] and commit["bug-id"] != commit[ "bug-id-orig"]: logger.warning( "!! Bug ID changed from %s to %s", commit["bug-id-orig"], commit["bug-id"], ) if (not ignore_reviewers and not commit["reviewers"]["granted"] + commit["reviewers"]["request"]): logger.warning("!! Missing reviewers") if show_rev_urls and commit["rev-id"]: logger.warning("-> %s/D%s", conduit.repo.phab_url, commit["rev-id"])
def show_commit_stack( commits, validate=True, show_rev_urls=False, show_updated_only=False, ): """Log the commit stack in a human readable form.""" # keep output in columns by sizing the action column to the longest rev + 1 ("D") max_len = (max(len(c.get("rev-id", "") or "") for c in commits) + 1 if commits else "") action_template = "(%" + str(max_len) + "s)" if validate: # preload all revisions ids = [int(c["rev-id"]) for c in commits if c.get("rev-id")] if ids: with wait_message("Loading existing revisions..."): revisions = conduit.get_revisions(ids=ids) # preload diffs with wait_message("Loading diffs..."): diffs = conduit.get_diffs( [r["fields"]["diffPHID"] for r in revisions]) for commit in reversed(commits): if show_updated_only and not commit["submit"]: continue revision_is_closed = False revision_is_wip = False bug_id_changed = False is_author = True revision = None if commit.get("rev-id"): action = action_template % ("D" + commit["rev-id"]) if validate: revisions = conduit.get_revisions(ids=[int(commit["rev-id"])]) if revisions: revision = revisions[0] fields = revision["fields"] # WIP if either in changes-planned state, or if the revision has the # `draft` flag set. revision_is_wip = (fields["status"]["value"] == "changes-planned" or fields["isDraft"]) # Check if target bug ID is the same as in the Phabricator revision bug_id_changed = fields.get("bugzilla.bug-id") and ( commit["bug-id"] != fields["bugzilla.bug-id"]) # Check if revision is closed revision_is_closed = fields["status"]["closed"] # Check if comandeering is required with wait_message("Figuring out who you are..."): whoami = conduit.whoami() if "authorPHID" in fields and (fields["authorPHID"] != whoami["phid"]): is_author = False # Any reviewers added to a revision without them? reviewers_added = bool( not revision["attachments"]["reviewers"]["reviewers"] and commit["reviewers"]["granted"]) # if SHA1 hasn't changed # and we're not changing the WIP or draft status # and we're not adding reviewers to a revision without reviewers # and we're not changing the bug-id diff_phid = fields["diffPHID"] diff_commits = diffs[diff_phid]["attachments"]["commits"][ "commits"] sha1_changed = ( not diff_commits or commit["node"] != diff_commits[0]["identifier"]) if (not sha1_changed and commit["wip"] == revision_is_wip and not reviewers_added and not bug_id_changed and not revision_is_closed): commit["submit"] = False else: action = action_template % "New" logger.info("%s %s %s", action, commit["name"], commit["title-preview"]) if validate: if not commit["submit"]: logger.info( " * This revision has not changed and will not be submitted." ) continue if revision: if not commit["wip"] and revision_is_wip: logger.warning( '!! "Changes Planned" status will change to "Request Review"' ) if commit["wip"] and not revision_is_wip: logger.warning( '!! "Request Review" status will change to "Changes Planned"' ) if bug_id_changed: logger.warning( "!! Bug ID in Phabricator revision will change from %s to %s", revision["fields"]["bugzilla.bug-id"], commit["bug-id"], ) if not is_author: logger.warning( "!! You don't own this revision. Normally, you should only\n" ' update revisions you own. You can "Commandeer" this\n' " revision from the web interface if you want to become\n" " the owner.") if revision_is_closed: logger.warning( "!! This revision is closed!\n" " It will be reopened if submission proceeds.\n" " You can stop now and refine the stack range.") if not commit["bug-id"]: logger.warning("!! Missing Bug ID") if commit["bug-id-orig"] and commit["bug-id"] != commit[ "bug-id-orig"]: logger.warning( "!! Bug ID changed from %s to %s", commit["bug-id-orig"], commit["bug-id"], ) if not commit["has-reviewers"]: logger.warning("!! Missing reviewers") if commit["wip"]: logger.warning( ' It will be submitted as "Changes Planned".\n' " Run submit again with --no-wip to prevent this.") if show_rev_urls and commit["rev-id"]: logger.warning("-> %s/D%s", conduit.repo.phab_url, commit["rev-id"])
def show_commit_stack(commits, validate=True, ignore_reviewers=False, show_rev_urls=False): """Log the commit stack in a human readable form.""" # keep output in columns by sizing the action column to the longest rev + 1 ("D") max_len = (max(len(c.get("rev-id", "") or "") for c in commits) + 1 if commits else "") action_template = "(%" + str(max_len) + "s)" if validate: # preload all revisions ids = [int(c["rev-id"]) for c in commits if c.get("rev-id")] if ids: with wait_message("Loading existing revisions..."): conduit.get_revisions(ids=ids) for commit in reversed(commits): closed = False change_bug_id = False is_author = True revision = None if commit.get("rev-id"): action = action_template % ("D" + commit["rev-id"]) if validate: revisions = conduit.get_revisions(ids=[int(commit["rev-id"])]) if len(revisions) > 0: revision = revisions[0] # Check if target bug ID is the same as in the Phabricator revision change_bug_id = ("bugzilla.bug-id" in revision["fields"] and revision["fields"]["bugzilla.bug-id"] and (commit["bug-id"] != revision["fields"]["bugzilla.bug-id"])) # Check if revision is closed closed = revision["fields"]["status"]["closed"] # Check if comandeering is required whoami = conduit.whoami() if "authorPHID" in revision["fields"] and ( revision["fields"]["authorPHID"] != whoami["phid"]): is_author = False else: action = action_template % "New" logger.info("%s %s %s", action, commit["name"], commit["title-preview"]) if validate: if change_bug_id: logger.warning( "!! Bug ID in Phabricator revision will be changed from %s to %s", revision["fields"]["bugzilla.bug-id"], commit["bug-id"], ) if not is_author: logger.warning( "!! You don't own this revision. Normally, you should only\n" ' update revisions you own. You can "Commandeer" this\n' " revision from the web interface if you want to become\n" " the owner.") if closed: logger.warning( "!! This revision is closed!\n" " It will be reopened if submission proceeds.\n" " You can stop now and refine the stack range.") if not commit["bug-id"]: logger.warning("!! Missing Bug ID") if commit["bug-id-orig"] and commit["bug-id"] != commit[ "bug-id-orig"]: logger.warning( "!! Bug ID changed from %s to %s", commit["bug-id-orig"], commit["bug-id"], ) if (not ignore_reviewers and not commit["reviewers"]["granted"] + commit["reviewers"]["request"]): logger.warning("!! Missing reviewers") if show_rev_urls and commit["rev-id"]: logger.warning("-> %s/D%s", conduit.repo.phab_url, commit["rev-id"])