Example #1
0
    def process(self, db, user, repository_id=None, filter_id=None):
        if user.isAnonymous():
            return OperationFailureMustLogin()

        cursor = db.cursor()

        if filter_id is not None:
            cursor.execute(
                """SELECT repository, path, type, delegate
                                FROM filters
                               WHERE id=%s""",
                (filter_id,),
            )
            repository_id, filter_path, filter_type, filter_delegate = cursor.fetchone()

        if repository_id is None:
            cursor.execute(
                """SELECT reviews.id, applyfilters, applyparentfilters, branches.repository
                                FROM reviews
                                JOIN branches ON (reviews.branch=branches.id)
                               WHERE reviews.state!='closed'"""
            )
        else:
            cursor.execute(
                """SELECT reviews.id, applyfilters, applyparentfilters, branches.repository
                                FROM reviews
                                JOIN branches ON (reviews.branch=branches.id)
                               WHERE reviews.state!='closed'
                                 AND branches.repository=%s""",
                (repository_id,),
            )

        repositories = {}

        # list(review_file_id)
        assign_changes = []

        # set(review_id)
        assigned_reviews = set()

        # set(review_id)
        watched_reviews = set()

        for review_id, applyfilters, applyparentfilters, repository_id in cursor.fetchall():
            if repository_id in repositories:
                repository = repositories[repository_id]
            else:
                repository = gitutils.Repository.fromId(db, repository_id)
                repositories[repository_id] = repository

            review = reviewing.filters.Filters.Review(review_id, applyfilters, applyparentfilters, repository)
            filters = reviewing.filters.Filters()

            filters.setFiles(db, review=review)

            if filter_id is not None:
                filters.addFilter(user.id, filter_path, filter_type, filter_delegate)
            else:
                filters.load(db, review=review, user=user)

            cursor.execute(
                """SELECT commits.id, usergitemails.uid, reviewfiles.file, reviewfiles.id
                                FROM commits
                                JOIN gitusers ON (gitusers.id=commits.author_gituser)
                     LEFT OUTER JOIN usergitemails ON (usergitemails.email=gitusers.email)
                                JOIN changesets ON (changesets.child=commits.id)
                                JOIN reviewfiles ON (reviewfiles.changeset=changesets.id)
                     LEFT OUTER JOIN reviewuserfiles ON (reviewuserfiles.file=reviewfiles.id
                                                     AND reviewuserfiles.uid=%s)
                               WHERE reviewfiles.review=%s
                                 AND reviewuserfiles.uid IS NULL""",
                (user.id, review_id),
            )

            for commit_id, author_id, file_id, review_file_id in cursor.fetchall():
                if author_id != user.id:
                    association = filters.getUserFileAssociation(user.id, file_id)

                    if association == "reviewer":
                        assign_changes.append(review_file_id)
                        assigned_reviews.add(review_id)
                    elif association == "watcher":
                        watched_reviews.add(review_id)

        cursor.execute(
            """SELECT reviews.id
                            FROM reviews
                 LEFT OUTER JOIN reviewusers ON (reviewusers.review=reviews.id
                                             AND reviewusers.uid=%s)
                           WHERE reviews.id=ANY (%s)
                             AND reviewusers.uid IS NULL""",
            (user.id, list(assigned_reviews) + list(watched_reviews)),
        )

        new_reviews = set(review_id for (review_id,) in cursor)

        cursor.executemany(
            """INSERT INTO reviewusers (review, uid)
                                   VALUES (%s, %s)""",
            [(review_id, user.id) for review_id in new_reviews],
        )

        cursor.executemany(
            """INSERT INTO reviewuserfiles (file, uid)
                                   VALUES (%s, %s)""",
            [(review_file_id, user.id) for review_file_id in assign_changes],
        )

        db.commit()

        watched_reviews &= new_reviews
        watched_reviews -= assigned_reviews

        cursor.execute(
            """SELECT id, summary
                            FROM reviews
                           WHERE id=ANY (%s)""",
            (list(assigned_reviews | watched_reviews),),
        )

        return OperationResult(
            assigned_reviews=sorted(assigned_reviews), watched_reviews=sorted(watched_reviews), summaries=dict(cursor)
        )
Example #2
0
def assignChanges(db, user, review, commits=None, changesets=None, update=False):
    cursor = db.cursor()

    if changesets is None:
        assert commits is not None

        changesets = []

        for commit in commits:
            changesets.extend(changeset_utils.createChangeset(db, user, review.repository, commit))

    applyfilters = review.applyfilters
    applyparentfilters = review.applyparentfilters

    reviewers, watchers = getReviewersAndWatchers(db, review.repository, changesets=changesets, reviewfilters=review.getReviewFilters(db),
                                                  applyfilters=applyfilters, applyparentfilters=applyparentfilters)

    cursor.execute("SELECT uid FROM reviewusers WHERE review=%s", (review.id,))

    reviewusers = set([user_id for (user_id,) in cursor])
    reviewusers_values = set()
    reviewuserfiles_values = set()

    reviewuserfiles_existing = {}

    if update:
        cursor.execute("""SELECT reviewuserfiles.uid, reviewfiles.changeset, reviewfiles.file
                            FROM reviewfiles
                            JOIN reviewuserfiles ON (reviewuserfiles.file=reviewfiles.id)
                           WHERE reviewfiles.review=%s""", (review.id,))
        for user_id, changeset_id, file_id in cursor:
            reviewuserfiles_existing[(user_id, changeset_id, file_id)] = True

    new_reviewers = set()
    new_watchers = set()

    cursor.execute("""SELECT DISTINCT uid
                        FROM reviewfiles
                        JOIN reviewuserfiles ON (reviewuserfiles.file=reviewfiles.id)
                       WHERE review=%s""", (review.id,))
    old_reviewers = set([user_id for (user_id,) in cursor])

    for file_id, file_users in reviewers.items():
        for user_id, user_changesets in file_users.items():
            if user_id:
                new_reviewers.add(user_id)

                if user_id not in reviewusers:
                    reviewusers.add(user_id)
                    reviewusers_values.add((review.id, user_id))
                for changeset_id in user_changesets:
                    if (user_id, changeset_id, file_id) not in reviewuserfiles_existing:
                        reviewuserfiles_values.add((user_id, review.id, changeset_id, file_id))

    for file_id, file_users in watchers.items():
        for user_id, user_changesets in file_users.items():
            if user_id:
                if user_id not in reviewusers:
                    new_watchers.add(user_id)
                    reviewusers.add(user_id)
                    reviewusers_values.add((review.id, user_id))

    new_reviewers -= old_reviewers
    new_watchers -= old_reviewers | new_reviewers

    cursor.executemany("INSERT INTO reviewusers (review, uid) VALUES (%s, %s)", reviewusers_values)
    cursor.executemany("INSERT INTO reviewuserfiles (file, uid) SELECT id, %s FROM reviewfiles WHERE review=%s AND changeset=%s AND file=%s", reviewuserfiles_values)

    if configuration.extensions.ENABLED:
        cursor.execute("""SELECT id, uid, extension, path
                            FROM extensionhookfilters
                           WHERE repository=%s""",
                       (review.repository.id,))

        rows = cursor.fetchall()

        if rows:
            if commits is None:
                commits = set()
                for changeset in changesets:
                    commits.add(changeset.child)
                commits = list(commits)

            filters = Filters()
            filters.setFiles(db, list(getFileIdsFromChangesets(changesets)))

            for filter_id, user_id, extension_id, path in rows:
                filters.addFilter(user_id, path, None, None, filter_id)

            for filter_id, file_ids in filters.matched_files.items():
                extensions.role.filterhook.queueFilterHookEvent(
                    db, filter_id, review, user, commits, file_ids)

    return new_reviewers, new_watchers
Example #3
0
def assignChanges(db,
                  user,
                  review,
                  commits=None,
                  changesets=None,
                  update=False):
    cursor = db.cursor()

    if changesets is None:
        assert commits is not None

        changesets = []

        for commit in commits:
            changesets.extend(
                changeset_utils.createChangeset(db, user, review.repository,
                                                commit))

    applyfilters = review.applyfilters
    applyparentfilters = review.applyparentfilters

    reviewers, watchers = getReviewersAndWatchers(
        db,
        review.repository,
        changesets=changesets,
        reviewfilters=review.getReviewFilters(db),
        applyfilters=applyfilters,
        applyparentfilters=applyparentfilters)

    cursor.execute("SELECT uid FROM reviewusers WHERE review=%s",
                   (review.id, ))

    reviewusers = set([user_id for (user_id, ) in cursor])
    reviewusers_values = set()
    reviewuserfiles_values = set()

    reviewuserfiles_existing = {}

    if update:
        cursor.execute(
            """SELECT reviewuserfiles.uid, reviewfiles.changeset, reviewfiles.file
                            FROM reviewfiles
                            JOIN reviewuserfiles ON (reviewuserfiles.file=reviewfiles.id)
                           WHERE reviewfiles.review=%s""", (review.id, ))
        for user_id, changeset_id, file_id in cursor:
            reviewuserfiles_existing[(user_id, changeset_id, file_id)] = True

    new_reviewers = set()
    new_watchers = set()

    cursor.execute(
        """SELECT DISTINCT uid
                        FROM reviewfiles
                        JOIN reviewuserfiles ON (reviewuserfiles.file=reviewfiles.id)
                       WHERE review=%s""", (review.id, ))
    old_reviewers = set([user_id for (user_id, ) in cursor])

    for file_id, file_users in reviewers.items():
        for user_id, user_changesets in file_users.items():
            if user_id:
                new_reviewers.add(user_id)

                if user_id not in reviewusers:
                    reviewusers.add(user_id)
                    reviewusers_values.add((review.id, user_id))
                for changeset_id in user_changesets:
                    if (user_id, changeset_id,
                            file_id) not in reviewuserfiles_existing:
                        reviewuserfiles_values.add(
                            (user_id, review.id, changeset_id, file_id))

    for file_id, file_users in watchers.items():
        for user_id, user_changesets in file_users.items():
            if user_id:
                if user_id not in reviewusers:
                    new_watchers.add(user_id)
                    reviewusers.add(user_id)
                    reviewusers_values.add((review.id, user_id))

    new_reviewers -= old_reviewers
    new_watchers -= old_reviewers | new_reviewers

    cursor.executemany("INSERT INTO reviewusers (review, uid) VALUES (%s, %s)",
                       reviewusers_values)
    cursor.executemany(
        "INSERT INTO reviewuserfiles (file, uid) SELECT id, %s FROM reviewfiles WHERE review=%s AND changeset=%s AND file=%s",
        reviewuserfiles_values)

    if configuration.extensions.ENABLED:
        cursor.execute(
            """SELECT id, uid, extension, path
                            FROM extensionhookfilters
                           WHERE repository=%s""", (review.repository.id, ))

        rows = cursor.fetchall()

        if rows:
            if commits is None:
                commits = set()
                for changeset in changesets:
                    commits.add(changeset.child)
                commits = list(commits)

            filters = Filters()
            filters.setFiles(db, list(getFileIdsFromChangesets(changesets)))

            for filter_id, user_id, extension_id, path in rows:
                filters.addFilter(user_id, path, None, None, filter_id)

            for filter_id, file_ids in filters.matched_files.items():
                extensions.role.filterhook.queueFilterHookEvent(
                    db, filter_id, review, user, commits, file_ids)

    return new_reviewers, new_watchers
Example #4
0
    def process(self, db, user, repository_id=None, filter_id=None):
        if user.isAnonymous():
            return OperationFailureMustLogin()

        cursor = db.cursor()

        if filter_id is not None:
            cursor.execute(
                """SELECT repository, path, type, delegate
                                FROM filters
                               WHERE id=%s""", (filter_id, ))
            repository_id, filter_path, filter_type, filter_delegate = cursor.fetchone(
            )

        if repository_id is None:
            cursor.execute(
                """SELECT reviews.id, applyfilters, applyparentfilters, branches.repository
                                FROM reviews
                                JOIN branches ON (reviews.branch=branches.id)
                               WHERE reviews.state!='closed'""")
        else:
            cursor.execute(
                """SELECT reviews.id, applyfilters, applyparentfilters, branches.repository
                                FROM reviews
                                JOIN branches ON (reviews.branch=branches.id)
                               WHERE reviews.state!='closed'
                                 AND branches.repository=%s""",
                (repository_id, ))

        repositories = {}

        # list(review_file_id)
        assign_changes = []

        # set(review_id)
        assigned_reviews = set()

        # set(review_id)
        watched_reviews = set()

        for review_id, applyfilters, applyparentfilters, repository_id in cursor.fetchall(
        ):
            if repository_id in repositories:
                repository = repositories[repository_id]
            else:
                repository = gitutils.Repository.fromId(db, repository_id)
                repositories[repository_id] = repository

            review = reviewing.filters.Filters.Review(review_id, applyfilters,
                                                      applyparentfilters,
                                                      repository)
            filters = reviewing.filters.Filters()

            filters.setFiles(db, review=review)

            if filter_id is not None:
                filters.addFilter(user.id, filter_path, filter_type,
                                  filter_delegate, filter_id)
            else:
                filters.load(db, review=review, user=user)

            cursor.execute(
                """SELECT commits.id, reviewfiles.file, reviewfiles.id
                                FROM commits
                                JOIN gitusers ON (gitusers.id=commits.author_gituser)
                     LEFT OUTER JOIN usergitemails ON (usergitemails.email=gitusers.email
                                                   AND usergitemails.uid=%s)
                                JOIN changesets ON (changesets.child=commits.id)
                                JOIN reviewfiles ON (reviewfiles.changeset=changesets.id)
                     LEFT OUTER JOIN reviewuserfiles ON (reviewuserfiles.file=reviewfiles.id
                                                     AND reviewuserfiles.uid=%s)
                               WHERE reviewfiles.review=%s
                                 AND usergitemails.uid IS NULL
                                 AND reviewuserfiles.uid IS NULL""",
                (user.id, user.id, review_id))

            for commit_id, file_id, review_file_id in cursor.fetchall():
                association = filters.getUserFileAssociation(user.id, file_id)

                if association == 'reviewer':
                    assign_changes.append(review_file_id)
                    assigned_reviews.add(review_id)
                elif association == 'watcher':
                    watched_reviews.add(review_id)

        cursor.execute(
            """SELECT reviews.id
                            FROM reviews
                 LEFT OUTER JOIN reviewusers ON (reviewusers.review=reviews.id
                                             AND reviewusers.uid=%s)
                           WHERE reviews.id=ANY (%s)
                             AND reviewusers.uid IS NULL""",
            (user.id, list(assigned_reviews) + list(watched_reviews)))

        new_reviews = set(review_id for (review_id, ) in cursor)

        cursor.executemany(
            """INSERT INTO reviewusers (review, uid)
                                   VALUES (%s, %s)""",
            [(review_id, user.id) for review_id in new_reviews])

        cursor.executemany(
            """INSERT INTO reviewuserfiles (file, uid)
                                   VALUES (%s, %s)""",
            [(review_file_id, user.id) for review_file_id in assign_changes])

        db.commit()

        watched_reviews &= new_reviews
        watched_reviews -= assigned_reviews

        cursor.execute(
            """SELECT id, summary
                            FROM reviews
                           WHERE id=ANY (%s)""",
            (list(assigned_reviews | watched_reviews), ))

        return OperationResult(assigned_reviews=sorted(assigned_reviews),
                               watched_reviews=sorted(watched_reviews),
                               summaries=dict(cursor))