Skip to content

Commit bd8bf8f

Browse files
committed
feat(issues): agrega comando para vincular PRs a issues
1 parent aeac1da commit bd8bf8f

3 files changed

Lines changed: 96 additions & 0 deletions

File tree

internal/cli/command/issues/issues.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ func (f *IssuesCommandFactory) CreateCommand(t *i18n.Translations, cfg *config.C
4242
Usage: t.GetMessage("issue.command_usage", 0, nil),
4343
Commands: []*cli.Command{
4444
f.newGenerateCommand(t, cfg),
45+
f.newLinkCommand(t, cfg),
4546
f.newTemplateCommand(t, cfg),
4647
},
4748
}
@@ -346,3 +347,74 @@ func (f *IssuesCommandFactory) checkoutBranch(branchName string) error {
346347
}
347348
return nil
348349
}
350+
351+
// newLinkCommand crea el subcomando 'link'.
352+
func (f *IssuesCommandFactory) newLinkCommand(t *i18n.Translations, cfg *config.Config) *cli.Command {
353+
return &cli.Command{
354+
Name: "link",
355+
Aliases: []string{"l"},
356+
Usage: t.GetMessage("issue.link_usage", 0, nil),
357+
Flags: []cli.Flag{
358+
&cli.IntFlag{
359+
Name: "pr",
360+
Aliases: []string{"p"},
361+
Usage: t.GetMessage("issue.flag_pr_number", 0, nil),
362+
Required: true,
363+
},
364+
&cli.IntFlag{
365+
Name: "issue",
366+
Aliases: []string{"i"},
367+
Usage: t.GetMessage("issue.flag_issue_number", 0, nil),
368+
Required: true,
369+
},
370+
},
371+
Action: f.createLinkAction(t, cfg),
372+
}
373+
}
374+
375+
// createLinkAction crea la acción para linkear un PR a una issue.
376+
func (f *IssuesCommandFactory) createLinkAction(t *i18n.Translations, cfg *config.Config) cli.ActionFunc {
377+
return func(ctx context.Context, command *cli.Command) error {
378+
prNumber := command.Int("pr")
379+
issueNumber := command.Int("issue")
380+
381+
if prNumber <= 0 {
382+
ui.PrintError(t.GetMessage("issue.error_invalid_pr", 0, nil))
383+
return fmt.Errorf("invalid PR number")
384+
}
385+
386+
if issueNumber <= 0 {
387+
ui.PrintError(t.GetMessage("issue.error_invalid_issue", 0, nil))
388+
return fmt.Errorf("invalid issue number")
389+
}
390+
391+
ui.PrintSectionBanner(t.GetMessage("issue.link_banner", 0, nil))
392+
393+
issueService, err := f.issueServiceProvider(ctx)
394+
if err != nil {
395+
ui.PrintError(fmt.Sprintf("%s: %v", t.GetMessage("issue.error_linking", 0, nil), err))
396+
return err
397+
}
398+
399+
spinner := ui.NewSmartSpinner(t.GetMessage("issue.linking", 0, map[string]interface{}{
400+
"PR": prNumber,
401+
"Issue": issueNumber,
402+
}))
403+
spinner.Start()
404+
405+
err = issueService.LinkIssueToPR(ctx, prNumber, issueNumber)
406+
spinner.Stop()
407+
408+
if err != nil {
409+
ui.PrintError(fmt.Sprintf("%s: %v", t.GetMessage("issue.error_linking", 0, nil), err))
410+
return err
411+
}
412+
413+
ui.PrintSuccess(t.GetMessage("issue.link_success", 0, map[string]interface{}{
414+
"PR": prNumber,
415+
"Issue": issueNumber,
416+
}))
417+
418+
return nil
419+
}
420+
}

internal/i18n/locales/active.en.toml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -796,6 +796,18 @@ analyzing_pr = "Analyzing Pull Request #{{.Number}}..."
796796
error_multiple_sources = "You can only specify one of: --from-diff, --from-pr, or --description"
797797
link_success = "✅ Link successful: PR #{{.PR}} updated to close #{{.Issue}}"
798798
link_error = "Could not link issue to PR #{{.PR}} automatically: {{.Error}}"
799+
# Link Command
800+
link_usage = "Link a PR to an existing issue"
801+
link_banner = "Issue Linker"
802+
flag_pr_number = "Pull Request number"
803+
flag_issue_number = "Issue number"
804+
error_pr_required = "You must specify the PR number with --pr"
805+
error_issue_required = "You must specify the issue number with --issue"
806+
error_invalid_pr = "Invalid PR number"
807+
error_invalid_issue = "Invalid issue number"
808+
error_linking = "Error linking PR to issue"
809+
linking = "Linking PR #{{.PR}} with issue #{{.Issue}}..."
810+
link_updated = "✅ PR #{{.PR}} updated successfully. Now closes #{{.Issue}}"
799811
# Template Management
800812
flag_template = "Use a specific issue template"
801813
template_usage = "Manage issue templates"

internal/i18n/locales/active.es.toml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -827,6 +827,18 @@ analyzing_pr = "Analizando Pull Request #{{.Number}}..."
827827
error_multiple_sources = "Solo podés especificar una opción: --from-diff, --from-pr, o --description"
828828
link_success = "Vinculación exitosa: PR #{{.PR}} actualizado para cerrar #{{.Issue}}"
829829
link_error = "No se pudo vincular la issue al PR #{{.PR}} automáticamente: {{.Error}}"
830+
# Link Command
831+
link_usage = "Vincular un PR con una issue existente"
832+
link_banner = "Vinculador de Issues"
833+
flag_pr_number = "Número del Pull Request"
834+
flag_issue_number = "Número de la issue"
835+
error_pr_required = "Debés especificar el número del PR con --pr"
836+
error_issue_required = "Debés especificar el número de la issue con --issue"
837+
error_invalid_pr = "El número de PR es inválido"
838+
error_invalid_issue = "El número de issue es inválido"
839+
error_linking = "Error vinculando PR con issue"
840+
linking = "Vinculando PR #{{.PR}} con issue #{{.Issue}}..."
841+
link_updated = "✅ PR #{{.PR}} actualizado exitosamente. Ahora cierra #{{.Issue}}"
830842
# Gestión de Templates
831843
flag_template = "Usar un template específico de issue"
832844
template_usage = "Gestionar templates de issues"

0 commit comments

Comments
 (0)