feature(repo): added ability to bootstrap repositories on creation

This commit is contained in:
RhodeCode Admin 2025-12-22 14:08:02 +01:00
parent 6f780dccb1
commit ee52770fff
4 changed files with 176 additions and 30 deletions

View file

@ -297,6 +297,9 @@ def RepoForm(localizer, edit=False, old_data=None, repo_groups=None, allow_disab
repo_enable_downloads = v.StringBoolean(if_missing=False)
repo_enable_locking = v.StringBoolean(if_missing=False)
repo_bootstrap_readme = v.StringBoolean(if_missing=False)
repo_bootstrap_svn_branch_struct = v.StringBoolean(if_missing=False)
if edit:
# this is repo owner
user = All(v.UnicodeString(not_empty=True), v.ValidRepoUser(localizer, allow_disabled))

View file

@ -27,7 +27,6 @@ from dataclasses import dataclass, field
from enum import StrEnum, auto
from sqlalchemy.orm import aliased
from zope.cachedescriptors.property import Lazy as LazyProperty
from rhodecode import events
from rhodecode.lib.auth import HasUserGroupPermissionAny
@ -47,6 +46,7 @@ from rhodecode.lib.utils2 import (
action_logger_generic,
)
from rhodecode.lib.vcs.backends import get_backend
from rhodecode.lib.vcs.backends.base import EmptyCommit
from rhodecode.lib.vcs.nodes import NodeKind
from rhodecode.model import BaseModel
from rhodecode.model.db import (
@ -677,6 +677,48 @@ class RepoModel(BaseModel):
return run_task(tasks.create_repo, form_data, cur_user)
def bootstrap(self, db_repo, db_user, readme=None, svn_struct=None):
"""
Bootstrap new created repo with some files/structure
"""
from rhodecode.model.scm import ScmModel
from rhodecode.model.settings import SettingsModel
_branch_name, _sha_commit_id, is_head = db_repo.landing_ref_name, "", True
author = db_user.full_contact
repo_name = db_repo.repo_name
message = "Bootstrap: created initial project files"
commit = EmptyCommit(alias=db_repo.repo_type, branch=_branch_name)
rc_config = SettingsModel().get_all_settings(cache=True, from_request=False)
default_renderer = rc_config.get("rhodecode_markup_renderer", "rst")
nodes = {}
if readme:
if default_renderer == "markdown":
ext = "md"
readme_content = f"# {repo_name}\n"
elif default_renderer == "rst":
ext = "rst"
readme_content = f"{repo_name}\n" + "-" * len(repo_name) + "\n"
else:
ext = ".txt"
readme_content = f"{repo_name}\n"
nodes[safe_bytes(f"readme.{ext}")] = {"content": safe_bytes(readme_content)}
if nodes:
commit = ScmModel().create_nodes(
user=db_user.user_id,
repo=db_repo,
message=message,
nodes=nodes,
parent_commit=commit,
author=author,
)
return commit
return None
def update_permissions(
self, repo, perm_additions=None, perm_updates=None, perm_deletions=None, check_perms=True, cur_user=None
):