1package git2go
2
3import (
4	"bytes"
5	"context"
6	"encoding/gob"
7	"fmt"
8
9	"gitlab.com/gitlab-org/gitaly/v14/internal/git/conflict"
10	"gitlab.com/gitlab-org/gitaly/v14/internal/git/repository"
11)
12
13// ResolveCommand contains arguments to perform a merge commit and resolve any
14// conflicts produced from that merge commit
15type ResolveCommand struct {
16	MergeCommand
17	Resolutions []conflict.Resolution
18}
19
20// ResolveResult returns information about the successful merge and resolution
21type ResolveResult struct {
22	MergeResult
23}
24
25// Resolve will attempt merging and resolving conflicts for the provided request
26func (b Executor) Resolve(ctx context.Context, repo repository.GitRepo, r ResolveCommand) (ResolveResult, error) {
27	if err := r.verify(); err != nil {
28		return ResolveResult{}, fmt.Errorf("resolve: %w: %s", ErrInvalidArgument, err.Error())
29	}
30
31	input := &bytes.Buffer{}
32	if err := gob.NewEncoder(input).Encode(r); err != nil {
33		return ResolveResult{}, fmt.Errorf("resolve: %w", err)
34	}
35
36	stdout, err := b.run(ctx, repo, input, "resolve")
37	if err != nil {
38		return ResolveResult{}, err
39	}
40
41	var response ResolveResult
42	if err := gob.NewDecoder(stdout).Decode(&response); err != nil {
43		return ResolveResult{}, fmt.Errorf("resolve: %w", err)
44	}
45
46	return response, nil
47}
48