Example #1
0
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
Example #2
0
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