def getReviewersAndWatchers(db, repository, commits=None, changesets=None, reviewfilters=None, applyfilters=True, applyparentfilters=False, parentfiltersonly=False): """getReviewersAndWatchers(db, commits=None, changesets=None) -> tuple Returns a tuple containing two dictionaries, each mapping file IDs to dictionaries mapping user IDs to sets of changeset IDs. The first dictionary defines the reviwers of each file, the second dictionary defines the watchers of each file. For any changes in a file for which no reviewer is identified, None is used as a key in the dictionary instead of a real user ID.""" if changesets is None: changesets = [] changeset_utils.createChangesets(db, repository, commits) for commit in commits: changesets.extend(changeset_utils.createChangeset(db, None, repository, commit, do_highlight=False)) cursor = db.cursor() filters = Filters() if applyfilters: if parentfiltersonly: filters.load(db, repository=repository.parent, recursive=True) else: filters.load(db, repository=repository, recursive=applyparentfilters) if reviewfilters: filters.addFilters(db, reviewfilters, sort=True) reviewers = {} watchers = {} for changeset in changesets: author_user_id = changeset.child.author.getUserId(db) if changeset.child else None cursor.execute("SELECT DISTINCT file FROM fileversions WHERE changeset=%s", (changeset.id,)) for (file_id,) in cursor: reviewers_found = False for user_id, (filter_type, delegate) in filters.listUsers(db, file_id).items(): try: assert isinstance(user_id, int) except: raise Exception, repr(filters.listUsers(db, file_id)) if filter_type == 'reviewer': if author_user_id != user_id: reviewer_user_ids = [user_id] elif delegate: reviewer_user_ids = [] for delegate_user_name in delegate.split(","): delegate_user = dbutils.User.fromName(db, delegate_user_name) if delegate_user: reviewer_user_ids.append(delegate_user.id) else: raise Exception, repr((user_id, delegate_user_name, file_id)) else: reviewer_user_ids = [] for reviewer_user_id in reviewer_user_ids: reviewers.setdefault(file_id, {}).setdefault(reviewer_user_id, set()).add(changeset.id) reviewers_found = True else: watchers.setdefault(file_id, {}).setdefault(user_id, set()).add(changeset.id) if not reviewers_found: reviewers.setdefault(file_id, {}).setdefault(None, set()).add(changeset.id) return reviewers, watchers
def getReviewersAndWatchers(db, repository, commits=None, changesets=None, reviewfilters=None, applyfilters=True, applyparentfilters=False, parentfiltersonly=False): """getReviewersAndWatchers(db, commits=None, changesets=None) -> tuple Returns a tuple containing two dictionaries, each mapping file IDs to dictionaries mapping user IDs to sets of changeset IDs. The first dictionary defines the reviwers of each file, the second dictionary defines the watchers of each file. For any changes in a file for which no reviewer is identified, None is used as a key in the dictionary instead of a real user ID.""" if changesets is None: changesets = [] changeset_utils.createChangesets(db, repository, commits) for commit in commits: changesets.extend( changeset_utils.createChangeset(db, None, repository, commit, do_highlight=False)) cursor = db.cursor() filters = Filters() if applyfilters: if parentfiltersonly: filters.load(db, repository=repository.parent, recursive=True) else: filters.load(db, repository=repository, recursive=applyparentfilters) if reviewfilters: filters.addFilters(db, reviewfilters, sort=True) reviewers = {} watchers = {} for changeset in changesets: author_user_id = changeset.child.author.getUserId( db) if changeset.child else None cursor.execute( "SELECT DISTINCT file FROM fileversions WHERE changeset=%s", (changeset.id, )) for (file_id, ) in cursor: reviewers_found = False for user_id, (filter_type, delegate) in filters.listUsers(db, file_id).items(): try: assert isinstance(user_id, int) except: raise Exception, repr(filters.listUsers(db, file_id)) if filter_type == 'reviewer': if author_user_id != user_id: reviewer_user_ids = [user_id] elif delegate: reviewer_user_ids = [] for delegate_user_name in delegate.split(","): delegate_user = dbutils.User.fromName( db, delegate_user_name) if delegate_user: reviewer_user_ids.append(delegate_user.id) else: raise Exception, repr( (user_id, delegate_user_name, file_id)) else: reviewer_user_ids = [] for reviewer_user_id in reviewer_user_ids: reviewers.setdefault(file_id, {}).setdefault( reviewer_user_id, set()).add(changeset.id) reviewers_found = True else: watchers.setdefault(file_id, {}).setdefault(user_id, set()).add(changeset.id) if not reviewers_found: reviewers.setdefault(file_id, {}).setdefault(None, set()).add(changeset.id) return reviewers, watchers