diff --git a/rhodecode/apps/repository/__init__.py b/rhodecode/apps/repository/__init__.py --- a/rhodecode/apps/repository/__init__.py +++ b/rhodecode/apps/repository/__init__.py @@ -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( diff --git a/rhodecode/apps/repository/tests/test_repo_pullrequests.py b/rhodecode/apps/repository/tests/test_repo_pullrequests.py --- a/rhodecode/apps/repository/tests/test_repo_pullrequests.py +++ b/rhodecode/apps/repository/tests/test_repo_pullrequests.py @@ -45,7 +45,7 @@ def route_path(name, params=None, **kwar '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', diff --git a/rhodecode/apps/repository/views/repo_pull_requests.py b/rhodecode/apps/repository/views/repo_pull_requests.py --- a/rhodecode/apps/repository/views/repo_pull_requests.py +++ b/rhodecode/apps/repository/views/repo_pull_requests.py @@ -812,37 +812,50 @@ class RepoPullRequestsView(RepoAppView, @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'], diff --git a/rhodecode/public/js/rhodecode/routes.js b/rhodecode/public/js/rhodecode/routes.js --- a/rhodecode/public/js/rhodecode/routes.js +++ b/rhodecode/public/js/rhodecode/routes.js @@ -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']); diff --git a/rhodecode/templates/pullrequests/pullrequest.mako b/rhodecode/templates/pullrequests/pullrequest.mako --- a/rhodecode/templates/pullrequests/pullrequest.mako +++ b/rhodecode/templates/pullrequests/pullrequest.mako @@ -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',