Skip to content

Commit c2d0aa5

Browse files
committed
wip
1 parent 732c8c1 commit c2d0aa5

File tree

3 files changed

+294
-33
lines changed

3 files changed

+294
-33
lines changed

src/release_tool/commands/publish.py

Lines changed: 59 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -870,32 +870,66 @@ def publish(ctx, version: Optional[str], list_drafts: bool, delete_drafts: bool,
870870
if debug:
871871
console.print(f"[dim]Tag push skipped (already up to date or would fail): {e}[/dim]")
872872

873-
console.print(f"[blue]Creating {status}GitHub release for {version}...[/blue]")
874-
875-
release_name = f"Release {version}"
876-
release_url = github_client.create_release(
877-
repo_name,
878-
version,
879-
release_name,
880-
release_notes,
881-
prerelease=prerelease_flag,
882-
draft=is_draft,
883-
target_commitish=target_branch
884-
)
885-
886-
if release_url:
887-
console.print(f"[green]✓ GitHub release created successfully[/green]")
888-
console.print(f"[blue]→ {release_url}[/blue]")
889-
890-
# Verify the release URL doesn't contain "untagged"
891-
if "untagged" in release_url:
892-
console.print(f"[yellow]⚠ Warning: Release created but appears to be untagged. This may indicate the git tag was not properly created.[/yellow]")
893-
console.print(f"[yellow] Expected tag: {tag_name}[/yellow]")
894-
console.print(f"[yellow] Please verify the tag exists: git tag -l {tag_name}[/yellow]")
873+
# Check if release already exists on GitHub
874+
existing_gh_release = github_client.get_release_by_tag(repo_name, tag_name)
875+
876+
if existing_gh_release:
877+
if force == 'none':
878+
console.print(f"[red]Error: GitHub release {tag_name} already exists.[/red]")
879+
console.print(f"[yellow]Use --force [draft|published] to update the existing release.[/yellow]")
880+
console.print(f"[dim] URL: {existing_gh_release.html_url}[/dim]")
881+
sys.exit(1)
882+
else:
883+
# Update existing release
884+
console.print(f"[blue]Updating existing {status}GitHub release for {version}...[/blue]")
885+
if debug:
886+
console.print(f"[dim]Existing release URL: {existing_gh_release.html_url}[/dim]")
887+
888+
release_name = f"Release {version}"
889+
release_url = github_client.update_release(
890+
repo_name,
891+
tag_name,
892+
name=release_name,
893+
body=release_notes,
894+
prerelease=prerelease_flag,
895+
draft=is_draft,
896+
target_commitish=target_branch
897+
)
898+
899+
if release_url:
900+
console.print(f"[green]✓ GitHub release updated successfully[/green]")
901+
console.print(f"[blue]→ {release_url}[/blue]")
902+
else:
903+
console.print(f"[red]✗ Failed to update GitHub release[/red]")
904+
sys.exit(1)
895905
else:
896-
console.print(f"[red]✗ Failed to create GitHub release[/red]")
897-
console.print(f"[red]Error: Release creation failed. See error message above for details.[/red]")
898-
sys.exit(1)
906+
# Create new release
907+
console.print(f"[blue]Creating {status}GitHub release for {version}...[/blue]")
908+
909+
release_name = f"Release {version}"
910+
release_url = github_client.create_release(
911+
repo_name,
912+
version,
913+
release_name,
914+
release_notes,
915+
prerelease=prerelease_flag,
916+
draft=is_draft,
917+
target_commitish=target_branch
918+
)
919+
920+
if release_url:
921+
console.print(f"[green]✓ GitHub release created successfully[/green]")
922+
console.print(f"[blue]→ {release_url}[/blue]")
923+
924+
# Verify the release URL doesn't contain "untagged"
925+
if "untagged" in release_url:
926+
console.print(f"[yellow]⚠ Warning: Release created but appears to be untagged. This may indicate the git tag was not properly created.[/yellow]")
927+
console.print(f"[yellow] Expected tag: {tag_name}[/yellow]")
928+
console.print(f"[yellow] Please verify the tag exists: git tag -l {tag_name}[/yellow]")
929+
else:
930+
console.print(f"[red]✗ Failed to create GitHub release[/red]")
931+
console.print(f"[red]Error: Release creation failed. See error message above for details.[/red]")
932+
sys.exit(1)
899933
elif dry_run:
900934
console.print(f"[yellow]Would NOT create GitHub release (--no-release or config setting)[/yellow]\n")
901935

src/release_tool/github_utils.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -924,6 +924,79 @@ def process_release(gh_release):
924924
console.print(f"[yellow]Warning: Could not fetch releases: {e}[/yellow]")
925925
return []
926926

927+
def get_release_by_tag(
928+
self,
929+
repo_full_name: str,
930+
tag_name: str
931+
) -> Optional[Any]:
932+
"""Get a GitHub release by tag name.
933+
934+
Args:
935+
repo_full_name: Repository in "owner/repo" format
936+
tag_name: Tag name (e.g., "v1.0.0")
937+
938+
Returns:
939+
GitHub release object if found, None otherwise
940+
"""
941+
try:
942+
repo = self.gh.get_repo(repo_full_name)
943+
release = repo.get_release(tag_name)
944+
return release
945+
except GithubException:
946+
# Release not found
947+
return None
948+
949+
def update_release(
950+
self,
951+
repo_full_name: str,
952+
tag_name: str,
953+
name: Optional[str] = None,
954+
body: Optional[str] = None,
955+
draft: Optional[bool] = None,
956+
prerelease: Optional[bool] = None,
957+
target_commitish: Optional[str] = None
958+
) -> Optional[str]:
959+
"""Update an existing GitHub release.
960+
961+
Args:
962+
repo_full_name: Repository in "owner/repo" format
963+
tag_name: Tag name of the release to update
964+
name: New release name (optional)
965+
body: New release body (optional)
966+
draft: New draft status (optional)
967+
prerelease: New prerelease status (optional)
968+
target_commitish: New target commitish (optional)
969+
970+
Returns:
971+
Release URL if successful, None otherwise
972+
"""
973+
try:
974+
release = self.get_release_by_tag(repo_full_name, tag_name)
975+
if not release:
976+
console.print(f"[red]Error: Release with tag {tag_name} not found[/red]")
977+
return None
978+
979+
# Update only provided fields
980+
if name is not None:
981+
release.update_release(name=name, message=body or release.body,
982+
draft=draft if draft is not None else release.draft,
983+
prerelease=prerelease if prerelease is not None else release.prerelease,
984+
tag_name=tag_name,
985+
target_commitish=target_commitish or release.target_commitish)
986+
elif body is not None or draft is not None or prerelease is not None or target_commitish is not None:
987+
release.update_release(name=release.title,
988+
message=body if body is not None else release.body,
989+
draft=draft if draft is not None else release.draft,
990+
prerelease=prerelease if prerelease is not None else release.prerelease,
991+
tag_name=tag_name,
992+
target_commitish=target_commitish or release.target_commitish)
993+
994+
console.print(f"[green]Updated release: {release.html_url}[/green]")
995+
return release.html_url
996+
except GithubException as e:
997+
console.print(f"[red]Error updating release: {e}[/red]")
998+
return None
999+
9271000
def create_release(
9281001
self,
9291002
repo_full_name: str,

0 commit comments

Comments
 (0)