func listRun()

in commands/mr/list/mr_list.go [166:302]


func listRun(opts *ListOptions) error {
	var mergeRequests []*gitlab.BasicMergeRequest

	apiClient, err := opts.HTTPClient()
	if err != nil {
		return err
	}

	repo, err := opts.BaseRepo()
	if err != nil {
		return err
	}

	l := &gitlab.ListProjectMergeRequestsOptions{
		State: gitlab.Ptr(opts.State),
		ListOptions: gitlab.ListOptions{
			Page:    1,
			PerPage: 30,
		},
	}
	jsonOutput := opts.OutputFormat == "json"
	if jsonOutput {
		l.Page = 0
		l.PerPage = 0
	}

	if opts.Author != "" {
		u, err := api.UserByName(apiClient, opts.Author)
		if err != nil {
			return err
		}
		l.AuthorID = gitlab.Ptr(u.ID)
		opts.ListType = "search"
	}
	if opts.SourceBranch != "" {
		l.SourceBranch = gitlab.Ptr(opts.SourceBranch)
		opts.ListType = "search"
	}
	if opts.TargetBranch != "" {
		l.TargetBranch = gitlab.Ptr(opts.TargetBranch)
		opts.ListType = "search"
	}
	if opts.Search != "" {
		l.Search = gitlab.Ptr(opts.Search)
		opts.ListType = "search"
	}
	if len(opts.Labels) > 0 {
		l.Labels = (*gitlab.LabelOptions)(&opts.Labels)
		opts.ListType = "search"
	}
	if len(opts.NotLabels) > 0 {
		l.NotLabels = (*gitlab.LabelOptions)(&opts.NotLabels)
		opts.ListType = "search"
	}
	if opts.Milestone != "" {
		l.Milestone = gitlab.Ptr(opts.Milestone)
		opts.ListType = "search"
	}
	if opts.Page != 0 {
		l.Page = opts.Page
	}
	if opts.PerPage != 0 {
		l.PerPage = opts.PerPage
	}
	if opts.Draft {
		l.WIP = gitlab.Ptr("yes")
		opts.ListType = "search"
	}
	if opts.NotDraft {
		l.WIP = gitlab.Ptr("no")
		opts.ListType = "search"
	}

	if opts.Mine {
		l.Scope = gitlab.Ptr("assigned_to_me")
		opts.ListType = "search"
	}

	if opts.OrderBy != "" {
		l.OrderBy = gitlab.Ptr(opts.OrderBy)
		opts.ListType = "search"
	}

	if opts.Sort != "" {
		l.Sort = gitlab.Ptr(opts.Sort)
	}

	assigneeIds := make([]int, 0)
	if len(opts.Assignee) > 0 {
		users, err := api.UsersByNames(apiClient, opts.Assignee)
		if err != nil {
			return err
		}
		for _, user := range users {
			assigneeIds = append(assigneeIds, user.ID)
		}
	}

	reviewerIds := make([]int, 0)
	if len(opts.Reviewer) > 0 {
		users, err := api.UsersByNames(apiClient, opts.Reviewer)
		if err != nil {
			return err
		}
		for _, user := range users {
			reviewerIds = append(reviewerIds, user.ID)
		}
	}
	title := utils.NewListTitle(opts.TitleQualifier + " merge request")
	title.RepoName = repo.FullName()

	if opts.Group != "" {
		mergeRequests, err = api.ListGroupMRs(apiClient, opts.Group, api.ProjectListMROptionsToGroup(l), api.WithMRAssignees(assigneeIds), api.WithMRReviewers(reviewerIds))
		title.RepoName = opts.Group
	} else {
		mergeRequests, err = api.ListMRs(apiClient, repo.FullName(), l, api.WithMRAssignees(assigneeIds), api.WithMRReviewers(reviewerIds))
	}
	if err != nil {
		return err
	}

	title.Page = l.Page
	title.ListActionType = opts.ListType
	title.CurrentPageTotal = len(mergeRequests)

	if jsonOutput {
		mrListJSON, _ := json.Marshal(mergeRequests)
		fmt.Fprintln(opts.IO.StdOut, string(mrListJSON))
	} else {
		if err = opts.IO.StartPager(); err != nil {
			return err
		}
		defer opts.IO.StopPager()
		fmt.Fprintf(opts.IO.StdOut, "%s\n%s\n", title.Describe(), mrutils.DisplayAllMRs(opts.IO, mergeRequests))
	}
	return nil
}