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:
parent
48d67fee3a
commit
03c420a9fc
5 changed files with 35 additions and 22 deletions
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -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'],
|
||||
|
|
|
|||
|
|
@ -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']);
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue