Skip to content

Versions: always keep latest in sync with default branch/tag #12121

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 22, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 1 addition & 13 deletions readthedocs/projects/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions readthedocs/projects/tests/test_build_tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -840,6 +840,7 @@ def test_build_commands_executed(
"--prune-tags",
"--depth",
"50",
"refs/heads/master:refs/remotes/origin/master",
),
mock.call(
"git",
Expand Down
58 changes: 56 additions & 2 deletions readthedocs/rtd_tests/tests/test_project_forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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):
Expand Down