feat(upgrade): added feature to bulk upgrade hooks from 4.X -> 5.X fixes RCCE-34

This commit is contained in:
RhodeCode Admin 2024-01-29 12:15:15 +01:00
parent 174ccfff79
commit 719ae001e0
7 changed files with 14 additions and 10 deletions

View file

@ -145,7 +145,7 @@ dev-srv:
.PHONY: dev-srv-g .PHONY: dev-srv-g
## run gunicorn multi process workers ## run gunicorn multi process workers
dev-srv-g: dev-srv-g:
gunicorn --paste .dev/dev.ini --bind=0.0.0.0:10020 --config=.dev/gunicorn_config.py --timeout=120 gunicorn --paste .dev/dev.ini --bind=0.0.0.0:10020 --config=.dev/gunicorn_config.py --timeout=120 --reload
# Default command on calling make # Default command on calling make

View file

@ -206,7 +206,7 @@ def rescan_repos(request, apiuser, remove_obsolete=Optional(False)):
try: try:
rm_obsolete = Optional.extract(remove_obsolete) rm_obsolete = Optional.extract(remove_obsolete)
added, removed = repo2db_mapper(ScmModel().repo_scan(), added, removed = repo2db_mapper(ScmModel().repo_scan(),
remove_obsolete=rm_obsolete) remove_obsolete=rm_obsolete, force_hooks_rebuild=True)
return {'added': added, 'removed': removed} return {'added': added, 'removed': removed}
except Exception: except Exception:
log.exception('Failed to run repo rescann') log.exception('Failed to run repo rescann')

View file

@ -217,7 +217,7 @@ class AdminSettingsView(BaseAppView):
def settings_mapping(self): def settings_mapping(self):
c = self.load_default_context() c = self.load_default_context()
c.active = 'mapping' c.active = 'mapping'
c.storage_path = VcsSettingsModel().get_repos_location()
data = render('rhodecode:templates/admin/settings/settings.mako', data = render('rhodecode:templates/admin/settings/settings.mako',
self._get_template_context(c), self.request) self._get_template_context(c), self.request)
html = formencode.htmlfill.render( html = formencode.htmlfill.render(
@ -245,7 +245,7 @@ class AdminSettingsView(BaseAppView):
ScmModel().mark_for_invalidation(repo.repo_name, delete=True) ScmModel().mark_for_invalidation(repo.repo_name, delete=True)
filesystem_repos = ScmModel().repo_scan() filesystem_repos = ScmModel().repo_scan()
added, removed = repo2db_mapper(filesystem_repos, rm_obsolete) added, removed = repo2db_mapper(filesystem_repos, rm_obsolete, force_hooks_rebuild=True)
PermissionModel().trigger_permission_flush() PermissionModel().trigger_permission_flush()
def _repr(rm_repo): def _repr(rm_repo):

View file

@ -508,7 +508,7 @@ def map_groups(path):
return group return group
def repo2db_mapper(initial_repo_list, remove_obsolete=False): def repo2db_mapper(initial_repo_list, remove_obsolete=False, force_hooks_rebuild=False):
""" """
maps all repos given in initial_repo_list, non existing repositories maps all repos given in initial_repo_list, non existing repositories
are created, if remove_obsolete is True it also checks for db entries are created, if remove_obsolete is True it also checks for db entries
@ -537,9 +537,10 @@ def repo2db_mapper(initial_repo_list, remove_obsolete=False):
group = map_groups(name) group = map_groups(name)
str_name = safe_str(name) str_name = safe_str(name)
db_repo = repo_model.get_by_repo_name(str_name) db_repo = repo_model.get_by_repo_name(str_name)
# found repo that is on filesystem not in RhodeCode database # found repo that is on filesystem not in RhodeCode database
if not db_repo: if not db_repo:
log.info('repository %s not found, creating now', name) log.info('repository `%s` not found in the database, creating now', name)
added.append(name) added.append(name)
desc = (repo.description desc = (repo.description
if repo.description != 'unknown' if repo.description != 'unknown'
@ -570,7 +571,7 @@ def repo2db_mapper(initial_repo_list, remove_obsolete=False):
config = db_repo._config config = db_repo._config
config.set('extensions', 'largefiles', '') config.set('extensions', 'largefiles', '')
repo = db_repo.scm_instance(config=config) repo = db_repo.scm_instance(config=config)
repo.install_hooks() repo.install_hooks(force=force_hooks_rebuild)
removed = [] removed = []
if remove_obsolete: if remove_obsolete:

View file

@ -5,6 +5,11 @@ ${h.secure_form(h.route_path('admin_settings_mapping_update'), request=request)}
<h3 class="panel-title">${_('Import New Groups or Repositories')}</h3> <h3 class="panel-title">${_('Import New Groups or Repositories')}</h3>
</div> </div>
<div class="panel-body"> <div class="panel-body">
<p>
${_('This function will scann all data under the current storage path location at')} <code>${c.storage_path}</code>
</p>
<div class="checkbox"> <div class="checkbox">
${h.checkbox('destroy',True)} ${h.checkbox('destroy',True)}
<label for="destroy">${_('Destroy old data')}</label> <label for="destroy">${_('Destroy old data')}</label>

View file

@ -358,7 +358,7 @@ class TestRepoContainer(object):
return Repository.get(self._repos[key]) return Repository.get(self._repos[key])
def _create_repo(self, dump_name, backend_alias, config): def _create_repo(self, dump_name, backend_alias, config):
repo_name = '%s-%s' % (backend_alias, dump_name) repo_name = f'{backend_alias}-{dump_name}'
backend = get_backend(backend_alias) backend = get_backend(backend_alias)
dump_extractor = self.dump_extractors[backend_alias] dump_extractor = self.dump_extractors[backend_alias]
repo_path = dump_extractor(dump_name, repo_name) repo_path = dump_extractor(dump_name, repo_name)

View file

@ -231,8 +231,6 @@ def platform_encodes_filenames():
return path_with_latin1 != read_path return path_with_latin1 != read_path
def test_repo2db_mapper_groups(repo_groups): def test_repo2db_mapper_groups(repo_groups):
session = meta.Session() session = meta.Session()
zombie_group, parent_group, child_group = repo_groups zombie_group, parent_group, child_group = repo_groups