11package command
22
33import (
4- "errors"
54 "fmt"
65 "io"
76 "net/url"
8- "regexp"
97 "strconv"
108 "strings"
119 "time"
@@ -259,12 +257,7 @@ func issueView(cmd *cobra.Command, args []string) error {
259257 return err
260258 }
261259
262- baseRepo , err := determineBaseRepo (apiClient , cmd , ctx )
263- if err != nil {
264- return err
265- }
266-
267- issue , err := issueFromArg (apiClient , baseRepo , args [0 ])
260+ issue , _ , err := issueFromArg (ctx , apiClient , cmd , args [0 ])
268261 if err != nil {
269262 return err
270263 }
@@ -380,21 +373,6 @@ func printHumanIssuePreview(out io.Writer, issue *api.Issue) error {
380373 return nil
381374}
382375
383- var issueURLRE = regexp .MustCompile (`^https://github\.com/([^/]+)/([^/]+)/issues/(\d+)` )
384-
385- func issueFromArg (apiClient * api.Client , baseRepo ghrepo.Interface , arg string ) (* api.Issue , error ) {
386- if issueNumber , err := strconv .Atoi (strings .TrimPrefix (arg , "#" )); err == nil {
387- return api .IssueByNumber (apiClient , baseRepo , issueNumber )
388- }
389-
390- if m := issueURLRE .FindStringSubmatch (arg ); m != nil {
391- issueNumber , _ := strconv .Atoi (m [3 ])
392- return api .IssueByNumber (apiClient , baseRepo , issueNumber )
393- }
394-
395- return nil , fmt .Errorf ("invalid issue format: %q" , arg )
396- }
397-
398376func issueCreate (cmd * cobra.Command , args []string ) error {
399377 ctx := contextForCommand (cmd )
400378 apiClient , err := apiClientForContext (ctx )
@@ -450,8 +428,7 @@ func issueCreate(cmd *cobra.Command, args []string) error {
450428 }
451429
452430 if isWeb , err := cmd .Flags ().GetBool ("web" ); err == nil && isWeb {
453- // TODO: move URL generation into GitHubRepository
454- openURL := fmt .Sprintf ("https://github.com/%s/issues/new" , ghrepo .FullName (baseRepo ))
431+ openURL := generateRepoURL (baseRepo , "issues/new" )
455432 if title != "" || body != "" {
456433 milestone := ""
457434 if len (milestoneTitles ) > 0 {
@@ -527,7 +504,7 @@ func issueCreate(cmd *cobra.Command, args []string) error {
527504 }
528505
529506 if action == PreviewAction {
530- openURL := fmt . Sprintf ( "https://github.com/%s/ issues/new/" , ghrepo . FullName ( baseRepo ) )
507+ openURL := generateRepoURL ( baseRepo , " issues/new" )
531508 milestone := ""
532509 if len (milestoneTitles ) > 0 {
533510 milestone = milestoneTitles [0 ]
@@ -563,6 +540,14 @@ func issueCreate(cmd *cobra.Command, args []string) error {
563540 return nil
564541}
565542
543+ func generateRepoURL (repo ghrepo.Interface , p string , args ... interface {}) string {
544+ baseURL := fmt .Sprintf ("https://%s/%s/%s" , repo .RepoHost (), repo .RepoOwner (), repo .RepoName ())
545+ if p != "" {
546+ return baseURL + "/" + fmt .Sprintf (p , args ... )
547+ }
548+ return baseURL
549+ }
550+
566551func addMetadataToIssueParams (client * api.Client , baseRepo ghrepo.Interface , params map [string ]interface {}, tb * issueMetadataState ) error {
567552 if ! tb .HasMetadata () {
568553 return nil
@@ -735,27 +720,19 @@ func issueClose(cmd *cobra.Command, args []string) error {
735720 return err
736721 }
737722
738- baseRepo , err := determineBaseRepo ( apiClient , cmd , ctx )
723+ issue , baseRepo , err := issueFromArg ( ctx , apiClient , cmd , args [ 0 ] )
739724 if err != nil {
740725 return err
741726 }
742727
743- issue , err := issueFromArg (apiClient , baseRepo , args [0 ])
744- var idErr * api.IssuesDisabledError
745- if errors .As (err , & idErr ) {
746- return fmt .Errorf ("issues disabled for %s" , ghrepo .FullName (baseRepo ))
747- } else if err != nil {
748- return err
749- }
750-
751728 if issue .Closed {
752729 fmt .Fprintf (colorableErr (cmd ), "%s Issue #%d (%s) is already closed\n " , utils .Yellow ("!" ), issue .Number , issue .Title )
753730 return nil
754731 }
755732
756733 err = api .IssueClose (apiClient , baseRepo , * issue )
757734 if err != nil {
758- return fmt . Errorf ( "API call failed:%w" , err )
735+ return err
759736 }
760737
761738 fmt .Fprintf (colorableErr (cmd ), "%s Closed issue #%d (%s)\n " , utils .Red ("✔" ), issue .Number , issue .Title )
@@ -770,27 +747,19 @@ func issueReopen(cmd *cobra.Command, args []string) error {
770747 return err
771748 }
772749
773- baseRepo , err := determineBaseRepo ( apiClient , cmd , ctx )
750+ issue , baseRepo , err := issueFromArg ( ctx , apiClient , cmd , args [ 0 ] )
774751 if err != nil {
775752 return err
776753 }
777754
778- issue , err := issueFromArg (apiClient , baseRepo , args [0 ])
779- var idErr * api.IssuesDisabledError
780- if errors .As (err , & idErr ) {
781- return fmt .Errorf ("issues disabled for %s" , ghrepo .FullName (baseRepo ))
782- } else if err != nil {
783- return err
784- }
785-
786755 if ! issue .Closed {
787756 fmt .Fprintf (colorableErr (cmd ), "%s Issue #%d (%s) is already open\n " , utils .Yellow ("!" ), issue .Number , issue .Title )
788757 return nil
789758 }
790759
791760 err = api .IssueReopen (apiClient , baseRepo , * issue )
792761 if err != nil {
793- return fmt . Errorf ( "API call failed:%w" , err )
762+ return err
794763 }
795764
796765 fmt .Fprintf (colorableErr (cmd ), "%s Reopened issue #%d (%s)\n " , utils .Green ("✔" ), issue .Number , issue .Title )
0 commit comments