func GetCodeReviewTool() (common.CodeReviewTool, error) { // Load configuration. config, err := common.LoadConfig() if err != nil && config == nil { return nil, err } // Choose the code review tool based on the configuration. var task = "Instantiate the selected code review plugin" id := config.CodeReviewToolId() factory, ok := codeReviewToolFactories[id] if !ok { // Collect the available code review tool ids. ids := make([]string, 0, len(codeReviewToolFactories)) for id := range codeReviewToolFactories { ids = append(ids, id) } hint := fmt.Sprintf("\nAvailable code review tools: %v\n\n", ids) return nil, errs.NewErrorWithHint( task, fmt.Errorf("unknown code review tool: '%v'", id), hint) } // Try to instantiate the code review tool. tool, err := factory() if err != nil { return nil, errs.NewError(task, err) } return tool, nil }
func GetIssueTracker() (common.IssueTracker, error) { // Load configuration. config, err := common.LoadConfig() if err != nil && config == nil { return nil, err } // Choose the issue tracker based on the configuration. var task = "Instantiate the selected issue tracker plugin" id := config.IssueTrackerId() factory, ok := issueTrackerFactories[id] if !ok { // Collect the available tracker ids. ids := make([]string, 0, len(issueTrackerFactories)) for id := range issueTrackerFactories { ids = append(ids, id) } hint := fmt.Sprintf("\nAvailable issue trackers: %v\n\n", ids) return nil, errs.NewErrorWithHint( task, fmt.Errorf("unknown issue tracker: '%v'", id), hint) } // Try to instantiate the issue tracker. tracker, err := factory() if err != nil { return nil, errs.NewError(task, err) } return tracker, nil }
func ensureRbtVersion() error { hint := ` You need to install RBTools version 0.7. Please run $ pip install rbtools==0.7 --allow-external rbtools --allow-unverified rbtools to install the correct version. ` // Load configuration and check the RBTools version only if Review Board is being used. config, err := common.LoadConfig() if err != nil { return err } if config.CodeReviewToolId() != Id { return nil } // Check the RBTools version being used. task := "Check the RBTools version being used" log.Run(task) // rbt 0.5.x prints the version string to stdout, // rbt 0.6.x prints the version string to stderr. stdout, stderr, err := shell.Run("rbt", "--version") if err != nil { // Return the hint instead of stderr. // Failing to run rbt --version probably means that it's not installed. return errs.NewErrorWithHint(task, err, hint) } var outputBuffer *bytes.Buffer if stdout.Len() != 0 { outputBuffer = stdout } else { outputBuffer = stderr } output := outputBuffer.String() pattern := regexp.MustCompile("^RBTools (([0-9]+)[.]([0-9]+).*)") parts := pattern.FindStringSubmatch(output) if len(parts) != 4 { err := fmt.Errorf("failed to parse 'rbt --version' output: %v", output) return errs.NewError(task, err) } rbtVersion := parts[1] // No need to check errors, we know the format is correct. major, _ := strconv.Atoi(parts[2]) minor, _ := strconv.Atoi(parts[3]) if !(major == 0 && minor == 7) { return errs.NewErrorWithHint( task, errors.New("unsupported rbt version detected: "+rbtVersion), hint) } return nil }
func init() { // Load common configuration. config, err := common.LoadConfig() if err != nil { // Just do nothing on error. return } // Register repo init hook in case we are using RB. if config.CodeReviewToolId() == Id { repo.AddInitHook(ensureRbtVersion) } }
func GetReleaseNotesManager() (common.ReleaseNotesManager, error) { // Load configuration. config, err := common.LoadConfig() if err != nil && config == nil { return nil, err } // Choose the release notes manager based on the configuration. var task = "Instantiate the selected release notes manager plugin" id := config.ReleaseNotesManagerId() // In case the id is not set, we simply return nil. // This means that this module is disabled. if id == "" { return nil, nil } factory, ok := notesManagerFactories[id] if !ok { // Collect the available tracker ids. ids := make([]string, 0, len(notesManagerFactories)) for id := range notesManagerFactories { ids = append(ids, id) } hint := fmt.Sprintf("\nAvailable release notes managers: %v\n\n", ids) return nil, errs.NewErrorWithHint( task, fmt.Errorf("unknown release notes manager: '%v'", id), hint) } // Try to instantiate the release notes manager. rnm, err := factory() if err != nil { return nil, errs.NewError(task, err) } return rnm, nil }