#8 fix checkout. #18

Merged
vtolstov merged 1 commits from kgorbunov/pkgdash:work_tree into master 2024-04-21 17:19:45 +03:00

View File

@ -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()))