#8 fix checkout. #18
| @@ -10,6 +10,7 @@ import ( | |||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"os/exec" | 	"os/exec" | ||||||
| 	"regexp" | 	"regexp" | ||||||
|  | 	"strconv" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"text/template" | 	"text/template" | ||||||
| 	"time" | 	"time" | ||||||
| @@ -59,6 +60,11 @@ type gitlabPull struct { | |||||||
| 	ID     int64  `json:"id"` | 	ID     int64  `json:"id"` | ||||||
| } | } | ||||||
|  |  | ||||||
|  | type gitlabProject struct { | ||||||
|  | 	Id   int64  `json:"id"` | ||||||
|  | 	Name string `json:"name"` | ||||||
|  | } | ||||||
|  |  | ||||||
| func (g *Gitlab) Name() string { | func (g *Gitlab) Name() string { | ||||||
| 	return "gitlab" | 	return "gitlab" | ||||||
| } | } | ||||||
| @@ -147,7 +153,7 @@ func (g *Gitlab) RequestOpen(ctx context.Context, branch string, path string, mo | |||||||
| 	} | 	} | ||||||
| 	defer checkout(*wtree, *g.baseRef) | 	defer checkout(*wtree, *g.baseRef) | ||||||
|  |  | ||||||
| 	g.pulls, err = GetPulls(ctx, g.URL, g.Owner, g.Repository, g.Password) | 	g.pulls, err = GetPulls(ctx, g.URL, g.RepositoryId, branch, g.Password) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		logger.Error(ctx, fmt.Sprintf("GetPulls error: %s", err)) | 		logger.Error(ctx, fmt.Sprintf("GetPulls error: %s", err)) | ||||||
| 		return err | 		return err | ||||||
| @@ -298,7 +304,7 @@ func (g *Gitlab) RequestClose(ctx context.Context, branch string, path string) e | |||||||
| 	logger.Debug(ctx, fmt.Sprintf("RequestClose start, mod title: %s", path)) | 	logger.Debug(ctx, fmt.Sprintf("RequestClose start, mod title: %s", path)) | ||||||
| 	var err error | 	var err error | ||||||
|  |  | ||||||
| 	g.pulls, err = GetPulls(ctx, g.URL, g.Owner, g.Repository, g.Password) | 	g.pulls, err = GetPulls(ctx, g.URL, g.RepositoryId, branch, g.Password) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		logger.Error(ctx, fmt.Sprintf("GetPulls error: %s", err)) | 		logger.Error(ctx, fmt.Sprintf("GetPulls error: %s", err)) | ||||||
| 		return err | 		return err | ||||||
| @@ -337,7 +343,12 @@ func (g *Gitlab) RequestUpdate(ctx context.Context, branch string, path string, | |||||||
| 	logger.Debug(ctx, fmt.Sprintf("RequestUpdate start, mod title: %s", path)) | 	logger.Debug(ctx, fmt.Sprintf("RequestUpdate start, mod title: %s", path)) | ||||||
| 	var err error | 	var err error | ||||||
|  |  | ||||||
| 	g.pulls, err = GetPulls(ctx, g.URL, g.Owner, g.Repository, g.Password) | 	g.RepositoryId, err = GetRepoID(ctx, g.URL, g.Owner, g.Repository, g.Password) | ||||||
|  | 	if err != nil || g.RepositoryId == "" { | ||||||
|  | 		return fmt.Errorf("project id is empty") | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	g.pulls, err = GetPulls(ctx, g.URL, g.RepositoryId, branch, g.Password) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		logger.Error(ctx, fmt.Sprintf("GetPulls error: %s", err)) | 		logger.Error(ctx, fmt.Sprintf("GetPulls error: %s", err)) | ||||||
| 		return err | 		return err | ||||||
| @@ -379,7 +390,12 @@ func (g *Gitlab) RequestList(ctx context.Context, branch string) (map[string]str | |||||||
| 	logger.Debug(ctx, fmt.Sprintf("RequestList for %s", branch)) | 	logger.Debug(ctx, fmt.Sprintf("RequestList for %s", branch)) | ||||||
| 	var err error | 	var err error | ||||||
|  |  | ||||||
| 	g.pulls, err = GetPulls(ctx, g.URL, g.Owner, g.Repository, g.Password) | 	g.RepositoryId, err = GetRepoID(ctx, g.URL, g.Owner, g.Repository, g.Password) | ||||||
|  | 	if err != nil || g.RepositoryId == "" { | ||||||
|  | 		return nil, fmt.Errorf("project id is empty") | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	g.pulls, err = GetPulls(ctx, g.URL, g.RepositoryId, branch, g.Password) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		logger.Error(ctx, fmt.Sprintf("GetPulls error: %s", err)) | 		logger.Error(ctx, fmt.Sprintf("GetPulls error: %s", err)) | ||||||
| 		return nil, err | 		return nil, err | ||||||
| @@ -455,6 +471,40 @@ func GetPulls(ctx context.Context, url, projectId, branch, password string) ([]* | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func GetRepoID(ctx context.Context, url, owner, repo, password string) (rId string, err error) { | ||||||
|  | 	var buf []byte | ||||||
|  | 	projects := make([]*gitlabProject, 0, 10) | ||||||
|  | 	req, err := http.NewRequestWithContext(ctx, http.MethodGet, fmt.Sprintf("https://%s/api/v4/users/%s/projects?owned=true", url, owner), nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	req.Header.Add("Accept", "application/json") | ||||||
|  | 	req.Header.Add("Content-Type", "application/json") | ||||||
|  | 	req.Header.Add("Authorization", password) | ||||||
|  |  | ||||||
|  | 	rsp, err := http.DefaultClient.Do(req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	buf, _ = io.ReadAll(rsp.Body) | ||||||
|  |  | ||||||
|  | 	switch rsp.StatusCode { | ||||||
|  | 	case http.StatusOK: | ||||||
|  | 		if err = json.Unmarshal(buf, &projects); err != nil { | ||||||
|  | 			logger.Error(ctx, fmt.Sprintf("failed to decode response %s err: %v", buf, err)) | ||||||
|  | 		} | ||||||
|  | 		for _, p := range projects { | ||||||
|  | 			if p.Name == repo { | ||||||
|  | 				rId = strconv.Itoa(int(p.Id)) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return | ||||||
|  | 	default: | ||||||
|  | 		return rId, fmt.Errorf("unknown error: %s", buf) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| func checkout(w git.Worktree, ref plumbing.Reference) { | func checkout(w git.Worktree, ref plumbing.Reference) { | ||||||
| 	ctx := context.Background() | 	ctx := context.Background() | ||||||
| 	logger.Debug(ctx, fmt.Sprintf("Checkout: %s", ref.Name().Short())) | 	logger.Debug(ctx, fmt.Sprintf("Checkout: %s", ref.Name().Short())) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user