From ae82be38cbab0b4521ac188403384b140b1e15f5 Mon Sep 17 00:00:00 2001 From: Santos Gallegos Date: Thu, 17 Apr 2025 14:48:59 -0500 Subject: [PATCH] Versions: always keep latest in sync with default branch/tag --- readthedocs/projects/models.py | 14 +---- .../projects/tests/test_build_tasks.py | 1 + .../rtd_tests/tests/test_project_forms.py | 58 ++++++++++++++++++- 3 files changed, 58 insertions(+), 15 deletions(-) diff --git a/readthedocs/projects/models.py b/readthedocs/projects/models.py index 3fcad60270a..0a568d376cf 100644 --- a/readthedocs/projects/models.py +++ b/readthedocs/projects/models.py @@ -643,19 +643,7 @@ def save(self, *args, **kwargs): self.repo = self.remote_repository.clone_url super().save(*args, **kwargs) - - try: - if not self.versions.filter(slug=LATEST).exists(): - self.versions.create_latest() - except Exception: - log.exception("Error creating default branches") - - # Update `Version.identifier` for `latest` with the default branch the user has selected, - # even if it's `None` (meaning to match the `default_branch` of the repository) - # NOTE: this code is required to be *after* ``create_latest()``. - # It has to be updated after creating LATEST originally. - log.debug("Updating default branch.", slug=LATEST, identifier=self.default_branch) - self.versions.filter(slug=LATEST, machine=True).update(identifier=self.default_branch) + self.update_latest_version() def delete(self, *args, **kwargs): from readthedocs.projects.tasks.utils import clean_project_resources diff --git a/readthedocs/projects/tests/test_build_tasks.py b/readthedocs/projects/tests/test_build_tasks.py index b9380048fc6..eed6949eac2 100644 --- a/readthedocs/projects/tests/test_build_tasks.py +++ b/readthedocs/projects/tests/test_build_tasks.py @@ -840,6 +840,7 @@ def test_build_commands_executed( "--prune-tags", "--depth", "50", + "refs/heads/master:refs/remotes/origin/master", ), mock.call( "git", diff --git a/readthedocs/rtd_tests/tests/test_project_forms.py b/readthedocs/rtd_tests/tests/test_project_forms.py index 9b2fff1872d..59d3a1a6466 100644 --- a/readthedocs/rtd_tests/tests/test_project_forms.py +++ b/readthedocs/rtd_tests/tests/test_project_forms.py @@ -8,7 +8,7 @@ from django.test.utils import override_settings from django_dynamic_fixture import get -from readthedocs.builds.constants import EXTERNAL, LATEST, STABLE +from readthedocs.builds.constants import EXTERNAL, LATEST, LATEST_VERBOSE_NAME, STABLE, TAG, BRANCH from readthedocs.builds.models import Version from readthedocs.core.forms import RichValidationError from readthedocs.oauth.models import RemoteRepository, RemoteRepositoryRelation @@ -419,7 +419,10 @@ def test_set_remote_repository(self): class TestProjectAdvancedFormDefaultBranch(TestCase): def setUp(self): - self.project = get(Project) + self.project = get( + Project, + repo="https://github.com/readthedocs/readthedocs.org/", + ) user_created_stable_version = get( Version, project=self.project, @@ -530,6 +533,57 @@ def test_external_version_not_in_default_branch_choices(self): ], ) + @mock.patch("readthedocs.projects.forms.trigger_build") + def test_change_default_branch_from_tag_to_branch_and_vice_versa(self, trigger_build): + branch = get( + Version, + project=self.project, + slug="branch", + type=BRANCH, + verbose_name="branch", + identifier="branch", + ) + tag = get( + Version, + project=self.project, + slug="tag", + type=TAG, + verbose_name="tag", + identifier="1234abcd", + ) + + data = { + "name": self.project.name, + "repo": self.project.repo, + "repo_type": self.project.repo_type, + "default_version": LATEST, + "versioning_scheme": self.project.versioning_scheme, + "language": self.project.language, + "default_branch": branch.verbose_name, + } + form = UpdateProjectForm(data, instance=self.project) + assert form.is_valid() + form.save() + + self.project.refresh_from_db() + latest = self.project.get_latest_version() + assert latest.slug == LATEST + assert latest.verbose_name == LATEST_VERBOSE_NAME + assert latest.identifier == branch.verbose_name + assert latest.type == BRANCH + + data["default_branch"] = tag.verbose_name + form = UpdateProjectForm(data, instance=self.project) + assert form.is_valid() + form.save() + + self.project.refresh_from_db() + latest = self.project.get_latest_version() + assert latest.slug == LATEST + assert latest.verbose_name == LATEST_VERBOSE_NAME + assert latest.identifier == tag.verbose_name + assert latest.type == TAG + @override_settings(RTD_ALLOW_ORGANIZATIONS=False) class TestProjectPrevalidationForms(TestCase):