pull-requests: allow having repo targets all forks and parent forks of target.

- this is common workflow supported by github etc.
This commit is contained in:
Marcin Kuzminski 2018-12-27 11:25:15 +01:00
parent 48d67fee3a
commit 03c420a9fc
5 changed files with 35 additions and 22 deletions

View file

@ -271,8 +271,8 @@ def includeme(config):
repo_route=True)
config.add_route(
name='pullrequest_repo_destinations',
pattern='/{repo_name:.*?[^/]}/pull-request/repo-destinations',
name='pullrequest_repo_targets',
pattern='/{repo_name:.*?[^/]}/pull-request/repo-targets',
repo_route=True)
config.add_route(

View file

@ -45,7 +45,7 @@ def route_path(name, params=None, **kwargs):
'pullrequest_show_all': '/{repo_name}/pull-request',
'pullrequest_show_all_data': '/{repo_name}/pull-request-data',
'pullrequest_repo_refs': '/{repo_name}/pull-request/refs/{target_repo_name:.*?[^/]}',
'pullrequest_repo_destinations': '/{repo_name}/pull-request/repo-destinations',
'pullrequest_repo_targets': '/{repo_name}/pull-request/repo-destinations',
'pullrequest_new': '/{repo_name}/pull-request/new',
'pullrequest_create': '/{repo_name}/pull-request/create',
'pullrequest_update': '/{repo_name}/pull-request/{pull_request_id}/update',

View file

@ -812,37 +812,50 @@ class RepoPullRequestsView(RepoAppView, DataGridAppView):
@HasRepoPermissionAnyDecorator(
'repository.read', 'repository.write', 'repository.admin')
@view_config(
route_name='pullrequest_repo_destinations', request_method='GET',
route_name='pullrequest_repo_targets', request_method='GET',
renderer='json_ext', xhr=True)
def pull_request_repo_destinations(self):
def pullrequest_repo_targets(self):
_ = self.request.translate
filter_query = self.request.GET.get('query')
# get the parents
parent_target_repos = []
if self.db_repo.parent:
parents_query = Repository.query() \
.order_by(func.length(Repository.repo_name)) \
.filter(Repository.fork_id == self.db_repo.parent.repo_id)
if filter_query:
ilike_expression = u'%{}%'.format(safe_unicode(filter_query))
parents_query = parents_query.filter(
Repository.repo_name.ilike(ilike_expression))
parents = parents_query.limit(20).all()
for parent in parents:
parent_vcs_obj = parent.scm_instance()
if parent_vcs_obj and not parent_vcs_obj.is_empty():
parent_target_repos.append(parent)
# get other forks, and repo itself
query = Repository.query() \
.order_by(func.length(Repository.repo_name)) \
.filter(
or_(Repository.repo_name == self.db_repo.repo_name,
Repository.fork_id == self.db_repo.repo_id))
or_(Repository.repo_id == self.db_repo.repo_id, # repo itself
Repository.fork_id == self.db_repo.repo_id) # forks of this repo
) \
.filter(~Repository.repo_id.in_([x.repo_id for x in parent_target_repos]))
if filter_query:
ilike_expression = u'%{}%'.format(safe_unicode(filter_query))
query = query.filter(
Repository.repo_name.ilike(ilike_expression))
query = query.filter(Repository.repo_name.ilike(ilike_expression))
add_parent = False
if self.db_repo.parent:
if filter_query in self.db_repo.parent.repo_name:
parent_vcs_obj = self.db_repo.parent.scm_instance()
if parent_vcs_obj and not parent_vcs_obj.is_empty():
add_parent = True
limit = max(20 - len(parent_target_repos), 5) # not less then 5
target_repos = query.limit(limit).all()
limit = 20 - 1 if add_parent else 20
all_repos = query.limit(limit).all()
if add_parent:
all_repos += [self.db_repo.parent]
all_target_repos = target_repos + parent_target_repos
repos = []
for obj in ScmModel().get_repos(all_repos):
for obj in ScmModel().get_repos(all_target_repos):
repos.append({
'id': obj['name'],
'text': obj['name'],

View file

@ -218,7 +218,7 @@ function registerRCRoutes() {
pyroutes.register('pullrequest_show_all', '/%(repo_name)s/pull-request', ['repo_name']);
pyroutes.register('pullrequest_show_all_data', '/%(repo_name)s/pull-request-data', ['repo_name']);
pyroutes.register('pullrequest_repo_refs', '/%(repo_name)s/pull-request/refs/%(target_repo_name)s', ['repo_name', 'target_repo_name']);
pyroutes.register('pullrequest_repo_destinations', '/%(repo_name)s/pull-request/repo-destinations', ['repo_name']);
pyroutes.register('pullrequest_repo_targets', '/%(repo_name)s/pull-request/repo-targets', ['repo_name']);
pyroutes.register('pullrequest_new', '/%(repo_name)s/pull-request/new', ['repo_name']);
pyroutes.register('pullrequest_create', '/%(repo_name)s/pull-request/create', ['repo_name']);
pyroutes.register('pullrequest_update', '/%(repo_name)s/pull-request/%(pull_request_id)s/update', ['repo_name', 'pull_request_id']);

View file

@ -257,7 +257,7 @@
query.callback({results: cachedData.results});
} else {
$.ajax({
url: pyroutes.url('pullrequest_repo_destinations', {'repo_name': templateContext.repo_name}),
url: pyroutes.url('pullrequest_repo_targets', {'repo_name': templateContext.repo_name}),
data: {query: query.term},
dataType: 'json',
type: 'GET',