github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/scripts/create-version-pr/main.go (about)

     1  package main
     2  
     3  import (
     4  	"os"
     5  
     6  	"github.com/ActiveState/cli/internal/errs"
     7  	wc "github.com/ActiveState/cli/scripts/internal/workflow-controllers"
     8  	wh "github.com/ActiveState/cli/scripts/internal/workflow-helpers"
     9  	"github.com/andygrunwald/go-jira"
    10  	"github.com/blang/semver"
    11  	"github.com/google/go-github/v45/github"
    12  )
    13  
    14  func main() {
    15  	if err := run(); err != nil {
    16  		wc.Print("Error: %s\n", errs.JoinMessage(err))
    17  	}
    18  }
    19  
    20  type Meta struct {
    21  	Version           semver.Version
    22  	JiraVersion       string
    23  	VersionPRName     string
    24  	VersionBranchName string
    25  }
    26  
    27  func (m Meta) GetVersion() semver.Version {
    28  	return m.Version
    29  }
    30  
    31  func (m Meta) GetJiraVersion() string {
    32  	return m.JiraVersion
    33  }
    34  
    35  func (m Meta) GetVersionBranchName() string {
    36  	return m.VersionBranchName
    37  }
    38  
    39  func (m Meta) GetVersionPRName() string {
    40  	return m.VersionPRName
    41  }
    42  
    43  func run() error {
    44  	finish := wc.PrintStart("Initializing clients")
    45  	// Initialize Clients
    46  	ghClient := wh.InitGHClient()
    47  	jiraClient, err := wh.InitJiraClient()
    48  	if err != nil {
    49  		return errs.Wrap(err, "failed to initialize Jira client")
    50  	}
    51  	finish()
    52  
    53  	// Grab input
    54  	if len(os.Args) != 2 {
    55  		return errs.New("Usage: create-version-branch <version>")
    56  	}
    57  	versionName := os.Args[1]
    58  
    59  	finish = wc.PrintStart("Fetching meta for version %s", versionName)
    60  	// Collect meta information about the PR and all it's related resources
    61  	meta, err := fetchMeta(ghClient, jiraClient, versionName)
    62  	if err != nil {
    63  		return errs.Wrap(err, "failed to fetch meta")
    64  	}
    65  	finish()
    66  
    67  	finish = wc.PrintStart("Creating version PR for version %s", meta.Version)
    68  	if err := wc.CreateVersionPR(ghClient, jiraClient, meta); err != nil {
    69  		return errs.Wrap(err, "failed to create version PR")
    70  	}
    71  	finish()
    72  
    73  	wc.Print("All Done")
    74  
    75  	return nil
    76  }
    77  
    78  func fetchMeta(ghClient *github.Client, jiraClient *jira.Client, versionName string) (Meta, error) {
    79  	version, err := wh.ParseJiraVersion(versionName)
    80  	if err != nil {
    81  		return Meta{}, errs.Wrap(err, "failed to parse version")
    82  	}
    83  
    84  	finish := wc.PrintStart("Fetching Jira Project info")
    85  	project, _, err := jiraClient.Project.Get("DX")
    86  	if err != nil {
    87  		return Meta{}, errs.Wrap(err, "failed to fetch Jira project")
    88  	}
    89  	finish()
    90  
    91  	versionPRName := wh.VersionedPRTitle(version)
    92  
    93  	// Retrieve Relevant Fixversion Pr
    94  	finish = wc.PrintStart("Checking if Version PR with title '%s' exists", versionPRName)
    95  	versionPR, err := wh.FetchPRByTitle(ghClient, versionPRName)
    96  	if err != nil {
    97  		return Meta{}, errs.Wrap(err, "failed to get target PR")
    98  	}
    99  	if versionPR != nil {
   100  		return Meta{}, errs.New("Version PR already exists: %s", versionPR.GetLinks().GetHTML().GetHRef())
   101  	}
   102  	finish()
   103  
   104  	finish = wc.PrintStart("Fetching Jira version info")
   105  	for _, v := range project.Versions {
   106  		if v.Name == versionName {
   107  			finish()
   108  			return Meta{
   109  				Version:           version,
   110  				JiraVersion:       v.Name,
   111  				VersionPRName:     versionPRName,
   112  				VersionBranchName: wh.VersionedBranchName(version),
   113  			}, nil
   114  		}
   115  	}
   116  
   117  	return Meta{}, errs.New("failed to find Jira version matching: %s", versionName)
   118  }