def test_update_commit_title_previews(self, m_build_commit_title): m_build_commit_title.side_effect = lambda x: x["title"] + " preview" commits = [dict(title="a"), dict(title="b")] helpers.update_commit_title_previews(commits) self.assertEqual( [ {"title": "a", "title-preview": "a preview"}, {"title": "b", "title-preview": "b preview"}, ], commits, )
def update_commits_from_args(commits, args): """Modify commit description based on args and configuration. Args: commits: list of dicts representing the commits in commit stack args: argparse.ArgumentParser object. In this function we're using following attributes: * reviewer - list of strings representing reviewers * blocker - list of string representing blocking reviewers * bug - an integer representing bug id in Bugzilla Command args always overwrite commit desc. Overwriting reviewers rules (The "-r" are loaded into args.reviewer and "-R" into args.blocker): a) Recognize `r=` and `r?` from commit message title. b) Modify reviewers only if `-r` or `-R` is used in call arguments. c) Add new reviewers using `r=`. d) Do not modify reviewers already provided in the title (`r?` or `r=`). e) Delete reviewer if `-r` or `-R` is used and the reviewer is not mentioned. If no reviewers are provided by args and an `always_blocking` flag is set change all reviewers in title to blocking. """ # Build list of reviewers from args. reviewers = list(set(args.reviewer)) if args.reviewer else [] # Order might be changed here `list(set(["one", "two"])) == ['two', 'one']` reviewers.sort() blockers = [r.rstrip("!") for r in args.blocker] if args.blocker else [] # User might use "-r <nick>!" to provide a blocking reviewer. # Add all such blocking reviewers to blockers list. blockers += [r.rstrip("!") for r in reviewers if r.endswith("!")] blockers = list(set(blockers)) blockers.sort() # Remove blocking reviewers from reviewers list reviewers_no_flag = [r.strip("!") for r in reviewers] reviewers = [r for r in reviewers_no_flag if r.lower() not in blockers] # Add all blockers to reviewers list. Reviewers list will contain a list # of all reviewers where blocking ones are marked with the "!" suffix. reviewers += make_blocking(blockers) reviewers = remove_duplicates(reviewers) lowercase_reviewers = [r.lower() for r in reviewers] lowercase_blockers = [r.lower() for r in blockers] for commit in commits: if reviewers: # Only the reviewers mentioned in command line args will remain. # New reviewers will be marked as "granted" (r=). granted = reviewers.copy() requested = [] # commit["reviewers"]["request|"] is a list containing reviewers # provided in commit's title with an r? mark. for reviewer in commit["reviewers"]["request"]: r = reviewer.strip("!") # check which request reviewers are provided also via -r if r.lower() in lowercase_reviewers: requested.append(r) granted.remove(r) # check which request reviewers are provided also via -R elif r.lower() in lowercase_blockers: requested.append("%s!" % r) granted.remove("%s!" % r) else: granted = commit["reviewers"].get("granted", []) requested = commit["reviewers"].get("request", []) commit["reviewers"] = dict(granted=granted, request=requested) if args.bug: # Bug ID command arg used. commit["bug-id"] = args.bug # Otherwise honour config setting to always use blockers if not reviewers and config.always_blocking: for commit in commits: commit["reviewers"] = dict( request=make_blocking(commit["reviewers"]["request"]), granted=make_blocking(commit["reviewers"]["granted"]), ) update_commit_title_previews(commits)