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) )
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
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
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))