func()

in eng/tools/generator/cmd/v2/release/releaseCmd.go [238:399]


func (c *commandContext) generateFromRequest(sdkRepo repo.SDKRepository, specRepoParam, specCommitHash string) error {
	var generateErr []error
	var pullRequestUrls = make(map[string]string)
	var pushBranch = make(map[string]struct {
		requestLink      string
		pullRequestLabel string
	})
	forkRemote, err := repo.GetForkRemote(sdkRepo)
	if err != nil {
		return err
	}

	log.Printf("track2 parsing the config...")
	cfg, err := config.ParseConfig(c.rpName)
	if err != nil {
		return fmt.Errorf("parse config err: %v", err)
	}
	log.Printf("Configuration: %s", cfg.String())
	armServices, err := config.ParseTrack2(cfg, specRepoParam)
	if err != nil {
		generateErr = append(generateErr, err)
	}
	for arm, packageInfos := range armServices {
		for _, info := range packageInfos {
			originalHead, err := sdkRepo.Head()
			if err != nil {
				return err
			}

			// run generator
			c.rpName = arm
			c.namespaceName = info.Name
			c.flags.SpecRPName = info.SpecName
			c.flags.PackageConfig = info.Tag
			if info.ReleaseDate != nil {
				c.flags.ReleaseDate = info.ReleaseDate.Format("2006-01-02")
			}
			err = c.generate(sdkRepo, specCommitHash)
			if err != nil {
				generateErr = append(generateErr, err)
				continue
			}

			// get current branch name
			generateHead, err := sdkRepo.Head()
			if err != nil {
				return err
			}
			pushBranch[generateHead.Name().Short()] = struct {
				requestLink      string
				pullRequestLabel string
			}{requestLink: info.RequestLink, pullRequestLabel: c.pullRequestLabels}

			log.Printf("git checkout %v", originalHead.Name().Short())
			if err := sdkRepo.Checkout(&repo.CheckoutOptions{
				Branch: plumbing.ReferenceName(originalHead.Name().Short()),
				Force:  true,
			}); err != nil {
				return err
			}
		}
	}

	tspProjects, err := config.GetTypeSpecProjectsFromConfig(cfg, specRepoParam)
	if err != nil {
		generateErr = append(generateErr, err)
	}
	for rpName, packageInfos := range tspProjects {
		for _, packageInfo := range packageInfos {
			originalHead, err := sdkRepo.Head()
			if err != nil {
				return err
			}

			// run tsp generator
			c.rpName = rpName
			c.namespaceName = packageInfo.Name
			c.flags.TypeSpecConfig = packageInfo.TspConfigPath
			if packageInfo.ReleaseDate != nil {
				c.flags.ReleaseDate = packageInfo.ReleaseDate.Format("2006-01-02")
			}
			err = c.generate(sdkRepo, specCommitHash)
			if err != nil {
				generateErr = append(generateErr, err)
				continue
			}

			// get current branch name
			generateHead, err := sdkRepo.Head()
			if err != nil {
				return err
			}
			pushBranch[generateHead.Name().Short()] = struct {
				requestLink      string
				pullRequestLabel string
			}{requestLink: packageInfo.RequestLink, pullRequestLabel: c.pullRequestLabels}

			log.Printf("git checkout %v", originalHead.Name().Short())
			if err := sdkRepo.Checkout(&repo.CheckoutOptions{
				Branch: plumbing.ReferenceName(originalHead.Name().Short()),
				Force:  true,
			}); err != nil {
				return err
			}
		}
	}

	for branch := range pushBranch {
		log.Printf("Fixes: %s\n", branch)
	}

	if c.flags.Token != "" {
		for branchName, issue := range pushBranch {
			log.Printf("git push fork %s\n", branchName)
			msg, err := common.ExecuteGitPush(sdkRepo.Root(), forkRemote.Config().Name, branchName)
			if err != nil {
				return fmt.Errorf("git push fork error:%v,msg:%s", err, msg)
			}

			githubUserName := repo.GetRemoteUserName(forkRemote)
			if githubUserName == "" {
				return errors.New("github user name not exist")
			}

			log.Printf("%s: create pull request...\n", branchName)
			pullRequestUrl, err := common.ExecuteCreatePullRequest(sdkRepo.Root(), link.SpecOwner, link.SDKRepo, githubUserName, branchName, repo.ReleaseTitle(branchName), issue.requestLink, c.flags.Token, issue.pullRequestLabel)
			if err != nil {
				return err
			}
			pullRequestUrls[branchName] = pullRequestUrl

			log.Printf("Leave a comment in %s...\n", issue)
			issueNumber := strings.Split(issue.requestLink, "/")
			err = common.ExecuteAddIssueComment(sdkRepo.Root(), link.SpecOwner, link.ReleaseIssueRepo, issueNumber[len(issueNumber)-1], fmt.Sprintf(confirmComment, pullRequestUrl), c.flags.Token)
			if err != nil {
				return err
			}

			log.Printf("Add Labels...\n")
			err = common.ExecuteAddIssueLabels(sdkRepo.Root(), link.SpecOwner, link.ReleaseIssueRepo, issueNumber[len(issueNumber)-1], c.flags.Token, []string{"PRready", issue.pullRequestLabel})
			if err != nil {
				return err
			}
		}
	}

	if len(pullRequestUrls) != 0 {
		log.Println("Fixes:")
		for branch, url := range pullRequestUrls {
			log.Printf("%s : %s", branch, url)
		}
	}

	if len(generateErr) != 0 {
		fmt.Println("generator error:")
		for _, e := range generateErr {
			fmt.Println(e)
		}
	}

	return nil
}