Skip to content

Commit 20fdb52

Browse files
authored
Versions: always keep latest in sync with default branch/tag (#12121)
We had two ways of keeping latest in sync with the default branch chosen by the user, one on project save and another one when syncing versions, they are slightly different leading to some inconsistencies. We now always use update_latest_version. Closes #12029
1 parent 01c8b60 commit 20fdb52

File tree

3 files changed

+58
-15
lines changed

3 files changed

+58
-15
lines changed

readthedocs/projects/models.py

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -643,19 +643,7 @@ def save(self, *args, **kwargs):
643643
self.repo = self.remote_repository.clone_url
644644

645645
super().save(*args, **kwargs)
646-
647-
try:
648-
if not self.versions.filter(slug=LATEST).exists():
649-
self.versions.create_latest()
650-
except Exception:
651-
log.exception("Error creating default branches")
652-
653-
# Update `Version.identifier` for `latest` with the default branch the user has selected,
654-
# even if it's `None` (meaning to match the `default_branch` of the repository)
655-
# NOTE: this code is required to be *after* ``create_latest()``.
656-
# It has to be updated after creating LATEST originally.
657-
log.debug("Updating default branch.", slug=LATEST, identifier=self.default_branch)
658-
self.versions.filter(slug=LATEST, machine=True).update(identifier=self.default_branch)
646+
self.update_latest_version()
659647

660648
def delete(self, *args, **kwargs):
661649
from readthedocs.projects.tasks.utils import clean_project_resources

readthedocs/projects/tests/test_build_tasks.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -840,6 +840,7 @@ def test_build_commands_executed(
840840
"--prune-tags",
841841
"--depth",
842842
"50",
843+
"refs/heads/master:refs/remotes/origin/master",
843844
),
844845
mock.call(
845846
"git",

readthedocs/rtd_tests/tests/test_project_forms.py

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from django.test.utils import override_settings
99
from django_dynamic_fixture import get
1010

11-
from readthedocs.builds.constants import EXTERNAL, LATEST, STABLE
11+
from readthedocs.builds.constants import EXTERNAL, LATEST, LATEST_VERBOSE_NAME, STABLE, TAG, BRANCH
1212
from readthedocs.builds.models import Version
1313
from readthedocs.core.forms import RichValidationError
1414
from readthedocs.oauth.models import RemoteRepository, RemoteRepositoryRelation
@@ -419,7 +419,10 @@ def test_set_remote_repository(self):
419419

420420
class TestProjectAdvancedFormDefaultBranch(TestCase):
421421
def setUp(self):
422-
self.project = get(Project)
422+
self.project = get(
423+
Project,
424+
repo="https://github.com/readthedocs/readthedocs.org/",
425+
)
423426
user_created_stable_version = get(
424427
Version,
425428
project=self.project,
@@ -530,6 +533,57 @@ def test_external_version_not_in_default_branch_choices(self):
530533
],
531534
)
532535

536+
@mock.patch("readthedocs.projects.forms.trigger_build")
537+
def test_change_default_branch_from_tag_to_branch_and_vice_versa(self, trigger_build):
538+
branch = get(
539+
Version,
540+
project=self.project,
541+
slug="branch",
542+
type=BRANCH,
543+
verbose_name="branch",
544+
identifier="branch",
545+
)
546+
tag = get(
547+
Version,
548+
project=self.project,
549+
slug="tag",
550+
type=TAG,
551+
verbose_name="tag",
552+
identifier="1234abcd",
553+
)
554+
555+
data = {
556+
"name": self.project.name,
557+
"repo": self.project.repo,
558+
"repo_type": self.project.repo_type,
559+
"default_version": LATEST,
560+
"versioning_scheme": self.project.versioning_scheme,
561+
"language": self.project.language,
562+
"default_branch": branch.verbose_name,
563+
}
564+
form = UpdateProjectForm(data, instance=self.project)
565+
assert form.is_valid()
566+
form.save()
567+
568+
self.project.refresh_from_db()
569+
latest = self.project.get_latest_version()
570+
assert latest.slug == LATEST
571+
assert latest.verbose_name == LATEST_VERBOSE_NAME
572+
assert latest.identifier == branch.verbose_name
573+
assert latest.type == BRANCH
574+
575+
data["default_branch"] = tag.verbose_name
576+
form = UpdateProjectForm(data, instance=self.project)
577+
assert form.is_valid()
578+
form.save()
579+
580+
self.project.refresh_from_db()
581+
latest = self.project.get_latest_version()
582+
assert latest.slug == LATEST
583+
assert latest.verbose_name == LATEST_VERBOSE_NAME
584+
assert latest.identifier == tag.verbose_name
585+
assert latest.type == TAG
586+
533587

534588
@override_settings(RTD_ALLOW_ORGANIZATIONS=False)
535589
class TestProjectPrevalidationForms(TestCase):

0 commit comments

Comments
 (0)