@@ -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
0 commit comments