#8 Checkout, auth. #16

Closed
kgorbunov wants to merge 104 commits from kgorbunov:dev into master
2 changed files with 96 additions and 28 deletions
Showing only changes of commit f559bc86b8 - Show all commits

View File

@ -10,12 +10,14 @@ import (
"net/http" "net/http"
"os" "os"
"os/exec" "os/exec"
"regexp"
"strings" "strings"
"text/template" "text/template"
"time" "time"
"git.unistack.org/unistack-org/pkgdash/internal/configcli" "git.unistack.org/unistack-org/pkgdash/internal/configcli"
"git.unistack.org/unistack-org/pkgdash/internal/modules" "git.unistack.org/unistack-org/pkgdash/internal/modules"
"git.unistack.org/unistack-org/pkgdash/internal/source"
"github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5"
gitconfig "github.com/go-git/go-git/v5/config" gitconfig "github.com/go-git/go-git/v5/config"
"github.com/go-git/go-git/v5/plumbing" "github.com/go-git/go-git/v5/plumbing"
@ -82,7 +84,7 @@ func (g *Gitea) RequestOpen(ctx context.Context, cfg *configcli.Config, branch s
Force: true, Force: true,
}); err != nil && err != git.NoErrAlreadyUpToDate { }); err != nil && err != git.NoErrAlreadyUpToDate {
logger.Fatalf(ctx, "failed to fetch repo: %v", err) logger.Fatalf(ctx, "failed to fetch repo: %v", err)
} } //обновляем репозиторий
var headRef *plumbing.Reference // вроде ссылка на гит var headRef *plumbing.Reference // вроде ссылка на гит
refIter, err := repo.Branches() //получение веток refIter, err := repo.Branches() //получение веток
@ -94,7 +96,7 @@ func (g *Gitea) RequestOpen(ctx context.Context, cfg *configcli.Config, branch s
if err != nil { if err != nil {
break break
} }
if ref.Name().String() == branch { if ref.Name().String() == branch { //todo вот тут возможно нужно переделать
headRef = ref headRef = ref
break break
} }
@ -107,7 +109,7 @@ func (g *Gitea) RequestOpen(ctx context.Context, cfg *configcli.Config, branch s
logger.Infof(ctx, "repo head %s", headRef) logger.Infof(ctx, "repo head %s", headRef)
wtree, err := repo.Worktree() wtree, err := repo.Worktree() //todo вроде рабочее дерево не нужно
if err != nil { if err != nil {
logger.Fatalf(ctx, "failed to get worktree: %v", err) logger.Fatalf(ctx, "failed to get worktree: %v", err)
} }
@ -116,7 +118,7 @@ func (g *Gitea) RequestOpen(ctx context.Context, cfg *configcli.Config, branch s
req, err := http.NewRequestWithContext(ctx, http.MethodGet, cfg.Source.APIURL+"/repos/"+cfg.Source.Repository+"/pulls?state=open&token="+cfg.Source.Token, nil) req, err := http.NewRequestWithContext(ctx, http.MethodGet, cfg.Source.APIURL+"/repos/"+cfg.Source.Repository+"/pulls?state=open&token="+cfg.Source.Token, nil)
if err != nil { if err != nil {
return err return err
} //вроде запроса к репозиторию } //Получаем список пулл реквестов
req.Header.Add("Accept", "application/json") req.Header.Add("Accept", "application/json")
req.Header.Add("Content-Type", "application/json") req.Header.Add("Content-Type", "application/json")
@ -138,19 +140,16 @@ func (g *Gitea) RequestOpen(ctx context.Context, cfg *configcli.Config, branch s
for _, pull := range pulls { for _, pull := range pulls {
if strings.Contains(pull.Title, path) && pull.Base.Ref == branch { if strings.Contains(pull.Title, path) && pull.Base.Ref == branch {
logger.Infof(ctx, "skip %s as pr already exists %s", path, pull.URL) logger.Infof(ctx, "skip %s as pr already exists %s", path, pull.URL)
return nil return source.ErrPRExist
} } // хотим проверить есть ли пулл реквест для этой ветки, если есть то выходим
} }
wTitle.Reset()
wBody.Reset()
logger.Infof(ctx, "update %s from %s to %s", path, mod.Module.Version, mod.Version) logger.Infof(ctx, "update %s from %s to %s", path, mod.Module.Version, mod.Version)
logger.Infof(ctx, "reset worktree") logger.Infof(ctx, "reset worktree")
if err = wtree.Reset(&git.ResetOptions{Mode: git.HardReset}); err != nil { if err = wtree.Reset(&git.ResetOptions{Mode: git.HardReset}); err != nil {
logger.Fatalf(ctx, "failed to reset repo branch: %v", err) logger.Fatalf(ctx, "failed to reset repo branch: %v", err)
} //вроде меняем ветку } //вроде меняем ветку todo вроде можно удалить
if err = wtree.PullContext(ctx, &git.PullOptions{ if err = wtree.PullContext(ctx, &git.PullOptions{
Auth: &httpauth.BasicAuth{Username: cfg.Source.Token, Password: cfg.Source.Token}, Auth: &httpauth.BasicAuth{Username: cfg.Source.Token, Password: cfg.Source.Token},
@ -159,18 +158,18 @@ func (g *Gitea) RequestOpen(ctx context.Context, cfg *configcli.Config, branch s
Force: true, Force: true,
RemoteName: "origin", RemoteName: "origin",
}); err != nil && err != git.NoErrAlreadyUpToDate { }); err != nil && err != git.NoErrAlreadyUpToDate {
logger.Fatalf(ctx, "failed to pull repo: %v", err) logger.Fatalf(ctx, "failed to pull repo: %v", err) //подтягиваем изменения с удаленого репозитория
} }
logger.Infof(ctx, "checkout ref %s", headRef) logger.Infof(ctx, "checkout ref %s", headRef)
if err = wtree.Checkout(&git.CheckoutOptions{ if err = wtree.Checkout(&git.CheckoutOptions{
Hash: headRef.Hash(), Hash: headRef.Hash(),
Branch: plumbing.NewBranchReferenceName(fmt.Sprintf("pkgdash-1/go_modules/%s-%s", path, mod.Version)), Branch: plumbing.NewBranchReferenceName(fmt.Sprintf("pkgdash/go_modules/%s-%s", path, mod.Version)),
Create: true, Create: true,
Force: true, Force: true,
}); err != nil { }); err != nil {
logger.Fatalf(ctx, "failed to checkout tree: %v", err) logger.Fatalf(ctx, "failed to checkout tree: %v", err)
} //вроде как переходим на другую ветку } //создаем новую ветку
epath, err := exec.LookPath("go") epath, err := exec.LookPath("go")
if errors.Is(err, exec.ErrDot) { if errors.Is(err, exec.ErrDot) {
@ -224,7 +223,7 @@ func (g *Gitea) RequestOpen(ctx context.Context, cfg *configcli.Config, branch s
} }
*/ */
refspec := gitconfig.RefSpec(fmt.Sprintf("+refs/heads/pkgdash-1/go_modules/%s-%s:refs/heads/pkgdash-1/go_modules/%s-%s", path, mod.Version, path, mod.Version)) refspec := gitconfig.RefSpec(fmt.Sprintf("+refs/heads/pkgdash/go_modules/%s-%s:refs/heads/pkgdash/go_modules/%s-%s", path, mod.Version, path, mod.Module.Version)) //todo как будто нужно переделать
logger.Infof(ctx, "try to push refspec %s", refspec) logger.Infof(ctx, "try to push refspec %s", refspec)
@ -356,19 +355,30 @@ func (g *Gitea) RequestClose(ctx context.Context, cfg *configcli.Config, branch
} // записываем ответ от гита по пулл реквестам, видимо существующим } // записываем ответ от гита по пулл реквестам, видимо существующим
// перебираем наши модификации и если они уже есть в гите удаляем их из mods // перебираем наши модификации и если они уже есть в гите удаляем их из mods
prExist := false
for _, pull := range pulls { for _, pull := range pulls {
if !strings.Contains(pull.Title, path) && pull.Base.Ref != branch { if strings.Contains(pull.Title, path) && pull.Base.Ref == branch {
logger.Infof(ctx, "skip %s since pr does not exist %s", path, pull.URL) logger.Infof(ctx, "skip %s since pr does not exist %s", path, pull.URL)
return nil prExist = true
} }
} }
if !prExist {
logger.Errorf(ctx, " skip %s since pr does not exist", path)
return source.ErrPRNotExist
}
if err = repo.DeleteBranch(path); err != nil { req, err = DeleteBranch(ctx, cfg, branch)
logger.Errorf(ctx, "failed to delete the branch: %s", path) if err != nil {
logger.Errorf(ctx, "failed to create request for delete the branch: %s, err: %s", branch, err)
return err
}
rsp, err = http.DefaultClient.Do(req)
if err != nil {
logger.Errorf(ctx, "failed to do request for delete the branch: %s, err: %s, code: %s", branch, err, rsp.StatusCode)
return err return err
} }
logger.Infof(ctx, "Delete branch %s successful", path) logger.Infof(ctx, "Delete branch %s successful", branch)
return nil return nil
} }
@ -465,15 +475,30 @@ func (g *Gitea) RequestUpdate(ctx context.Context, cfg *configcli.Config, branch
} // записываем ответ от гита по пулл реквестам, видимо существующим } // записываем ответ от гита по пулл реквестам, видимо существующим
// перебираем наши модификации и если они уже есть в гите удаляем их из mods // перебираем наши модификации и если они уже есть в гите удаляем их из mods
prExist := false
for _, pull := range pulls { for _, pull := range pulls {
if !strings.Contains(pull.Title, path) && pull.Base.Ref != branch { if strings.Contains(pull.Title, path) && pull.Base.Ref != branch {
logger.Infof(ctx, "skip %s since pr does not exist %s", path, pull.URL) logger.Infof(ctx, "skip %s since pr does not exist %s", path, pull.URL) //todo
return nil titleVersions := getVersions(pull.Title)
if modules.IsNewerVersion(titleVersions.NewV, mod.Version, false) {
reqDel, err := DeleteBranch(ctx, cfg, branch)
if err != nil {
logger.Errorf(ctx, "Error with create request for branch: %s, err: %s", branch, err)
continue
}
rsp, err := http.DefaultClient.Do(reqDel)
if err != nil {
logger.Errorf(ctx, "Error with do request for branch: %s, err: %s, code: %v", branch, err, rsp.StatusCode)
continue //думаю что если не можем удалить ветку не стоит заканчивать работу, а перейти к следующей итерации
}
}
prExist = true
} }
} }
if !prExist {
wTitle.Reset() logger.Errorf(ctx, " skip %s since pr does not exist", path)
wBody.Reset() return source.ErrPRNotExist
}
logger.Infof(ctx, "update %s from %s to %s", path, mod.Module.Version, mod.Version) logger.Infof(ctx, "update %s from %s to %s", path, mod.Module.Version, mod.Version)
@ -612,3 +637,36 @@ func (g *Gitea) RequestUpdate(ctx context.Context, cfg *configcli.Config, branch
return nil return nil
} }
func getVersions(s string) *Tmod {
rsp := new(Tmod)
re := regexp.MustCompile("[0-9]+\\.[0-9]+\\.[0-9]+")
versions := re.FindAllString(s, -1)
if len(versions) < 2 {
return nil
}
if modules.IsNewerVersion(versions[0], versions[1], false) {
rsp.OldV = versions[0]
rsp.NewV = versions[1]
return rsp
}
rsp.OldV = versions[1]
rsp.NewV = versions[0]
return rsp
}
type Tmod struct {
OldV string
NewV string
}
func DeleteBranch(ctx context.Context, cfg *configcli.Config, branch string) (*http.Request, error) {
var buf []byte
req, err := http.NewRequestWithContext(ctx, http.MethodDelete, cfg.Source.APIURL+"/repos/"+cfg.Source.Repository+"/branches/"+branch+"?token="+cfg.Source.Token, bytes.NewReader(buf))
if err != nil {
return nil, err
}
req.Header.Add("Accept", "application/json")
req.Header.Add("Content-Type", "application/json")
return req, err
}

View File

@ -1,16 +1,26 @@
package source package source
import ( import (
"context"
"errors"
"git.unistack.org/unistack-org/pkgdash/internal/configcli"
"git.unistack.org/unistack-org/pkgdash/internal/modules"
"git.unistack.org/unistack-org/pkgdash/internal/source/gitea" "git.unistack.org/unistack-org/pkgdash/internal/source/gitea"
"git.unistack.org/unistack-org/pkgdash/internal/source/github" "git.unistack.org/unistack-org/pkgdash/internal/source/github"
"git.unistack.org/unistack-org/pkgdash/internal/source/gitlab" "git.unistack.org/unistack-org/pkgdash/internal/source/gitlab"
"git.unistack.org/unistack-org/pkgdash/internal/source/gogs" "git.unistack.org/unistack-org/pkgdash/internal/source/gogs"
) )
var (
ErrPRExist = errors.New("Pull request exists")
ErrPRNotExist = errors.New("Pull request does not exist")
)
type SourceControl interface { type SourceControl interface {
RequestOpen() RequestOpen(ctx context.Context, cfg *configcli.Config, branch string, path string, mod modules.Update) error
RequestClose() RequestClose(ctx context.Context, cfg *configcli.Config, branch string, path string) error
RequestUpdate() RequestUpdate(ctx context.Context, cfg *configcli.Config, branch string, path string, mod modules.Update) error
} }
func NewSourceControl(system, token string) SourceControl { func NewSourceControl(system, token string) SourceControl {