tools/version-tracker/pkg/commands/listprojects/listprojects.go (71 lines of code) (raw):

package listprojects import ( "fmt" "os" "path/filepath" "strings" "github.com/rodaine/table" "gopkg.in/yaml.v3" "github.com/aws/eks-anywhere-build-tooling/tools/version-tracker/pkg/constants" "github.com/aws/eks-anywhere-build-tooling/tools/version-tracker/pkg/git" "github.com/aws/eks-anywhere-build-tooling/tools/version-tracker/pkg/types" ) // Run contains the business logic to execute the `list-projects“ subcommand. func Run() error { cwd, err := os.Getwd() if err != nil { return fmt.Errorf("retrieving current working directory: %v", err) } // Check if branch name environment variable has been set. branchName, ok := os.LookupEnv(constants.BranchNameEnvVar) if !ok { branchName = constants.MainBranchName } // Get base repository owner environment variable if set. baseRepoOwner := os.Getenv(constants.BaseRepoOwnerEnvvar) if baseRepoOwner == "" { baseRepoOwner = constants.AWSOrgName } // Clone the eks-anywhere-build-tooling repository. buildToolingRepoPath := filepath.Join(cwd, constants.BuildToolingRepoName) _, _, err = git.CloneRepo(fmt.Sprintf(constants.BuildToolingRepoURL, baseRepoOwner), buildToolingRepoPath, "", branchName) if err != nil { return fmt.Errorf("cloning build-tooling repo: %v", err) } // Load upstream projects tracker file. upstreamProjectsTrackerFilePath := filepath.Join(buildToolingRepoPath, constants.UpstreamProjectsTrackerFile) contents, err := os.ReadFile(upstreamProjectsTrackerFilePath) if err != nil { return fmt.Errorf("reading upstream projects tracker file: %v", err) } // Unmarshal upstream projects tracker file var projectsList types.ProjectsList err = yaml.Unmarshal(contents, &projectsList) if err != nil { return fmt.Errorf("unmarshalling upstream projects tracker file: %v", err) } var projectVersionInfoList []types.ProjectVersionInfo var maxOrgNameLength, maxRepoNameLength int for _, project := range projectsList.Projects { org := project.Org // Keep track of the longest org name to align the organization column in the table. if len(org) > maxOrgNameLength { maxOrgNameLength = len(org) } var repoList []string for _, repo := range project.Repos { // Keep track of the longest repository name to align the repository column in the table. if len(repo.Name) > maxRepoNameLength { maxRepoNameLength = len(repo.Name) } repoList = append(repoList, repo.Name) } // Apply newline padding to vertically align the organization name in the table. if len(repoList) > 2 { padding := strings.Repeat("\n", len(repoList)/2) org = fmt.Sprintf("%s%s%s", padding, org, padding) } projectVersionInfoList = append(projectVersionInfoList, types.ProjectVersionInfo{Org: org, Repo: strings.Join(repoList, "\n")}) } // Create a new table with the required column names in uppercase. tbl := table.New("Organization", "Repository").WithHeaderFormatter(func(format string, vals ...interface{}) string { return strings.ToUpper(fmt.Sprintf(format, vals...)) }) // Add rows to the table for each project in the list, grouped by owner or organization. tbl.AddRow(strings.Repeat("-", maxOrgNameLength), strings.Repeat("-", maxRepoNameLength)) for _, versionInfo := range projectVersionInfoList { tbl.AddRow(versionInfo.Org, versionInfo.Repo) tbl.AddRow(strings.Repeat("-", maxOrgNameLength), strings.Repeat("-", maxRepoNameLength)) } // Print the table contents to standard output. tbl.Print() return nil }