#8 skip path if branch exists #12

Merged
vtolstov merged 90 commits from kgorbunov/pkgdash:master into master 2024-04-03 08:28:17 +03:00
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"
"os"
"os/exec"
"regexp"
"strings"
"text/template"
"time"
"git.unistack.org/unistack-org/pkgdash/internal/configcli"
"git.unistack.org/unistack-org/pkgdash/internal/modules"
"git.unistack.org/unistack-org/pkgdash/internal/source"
"github.com/go-git/go-git/v5"
gitconfig "github.com/go-git/go-git/v5/config"
"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,
}); err != nil && err != git.NoErrAlreadyUpToDate {
logger.Fatalf(ctx, "failed to fetch repo: %v", err)
}
} //обновляем репозиторий
var headRef *plumbing.Reference // вроде ссылка на гит
refIter, err := repo.Branches() //получение веток
@ -94,7 +96,7 @@ func (g *Gitea) RequestOpen(ctx context.Context, cfg *configcli.Config, branch s
if err != nil {
break
}
if ref.Name().String() == branch {
if ref.Name().String() == branch { //todo вот тут возможно нужно переделать
headRef = ref
break
}
@ -107,7 +109,7 @@ func (g *Gitea) RequestOpen(ctx context.Context, cfg *configcli.Config, branch s
logger.Infof(ctx, "repo head %s", headRef)
wtree, err := repo.Worktree()
wtree, err := repo.Worktree() //todo вроде рабочее дерево не нужно
if err != nil {
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)
if err != nil {
return err
} //вроде запроса к репозиторию
} //Получаем список пулл реквестов
req.Header.Add("Accept", "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 {
if strings.Contains(pull.Title, path) && pull.Base.Ref == branch {
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, "reset worktree")
if err = wtree.Reset(&git.ResetOptions{Mode: git.HardReset}); err != nil {
logger.Fatalf(ctx, "failed to reset repo branch: %v", err)
} //вроде меняем ветку
} //вроде меняем ветку todo вроде можно удалить
if err = wtree.PullContext(ctx, &git.PullOptions{
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,
RemoteName: "origin",
}); 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)
if err = wtree.Checkout(&git.CheckoutOptions{
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,
Force: true,
}); err != nil {
logger.Fatalf(ctx, "failed to checkout tree: %v", err)
} //вроде как переходим на другую ветку
} //создаем новую ветку
epath, err := exec.LookPath("go")
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)
@ -356,19 +355,30 @@ func (g *Gitea) RequestClose(ctx context.Context, cfg *configcli.Config, branch
} // записываем ответ от гита по пулл реквестам, видимо существующим
// перебираем наши модификации и если они уже есть в гите удаляем их из mods
prExist := false
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)
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 {
logger.Errorf(ctx, "failed to delete the branch: %s", path)
req, err = DeleteBranch(ctx, cfg, branch)
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
}
logger.Infof(ctx, "Delete branch %s successful", path)
logger.Infof(ctx, "Delete branch %s successful", branch)
return nil
}
@ -465,15 +475,30 @@ func (g *Gitea) RequestUpdate(ctx context.Context, cfg *configcli.Config, branch
} // записываем ответ от гита по пулл реквестам, видимо существующим
// перебираем наши модификации и если они уже есть в гите удаляем их из mods
prExist := false
for _, pull := range pulls {
if !strings.Contains(pull.Title, path) && pull.Base.Ref != branch {
logger.Infof(ctx, "skip %s since pr does not exist %s", path, pull.URL)
return nil
if strings.Contains(pull.Title, path) && pull.Base.Ref != branch {
logger.Infof(ctx, "skip %s since pr does not exist %s", path, pull.URL) //todo
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 //думаю что если не можем удалить ветку не стоит заканчивать работу, а перейти к следующей итерации
}
}
wTitle.Reset()
wBody.Reset()
prExist = true
}
}
if !prExist {
logger.Errorf(ctx, " skip %s since pr does not exist", path)
return source.ErrPRNotExist
}
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
}
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
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/github"
"git.unistack.org/unistack-org/pkgdash/internal/source/gitlab"
"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 {
RequestOpen()
RequestClose()
RequestUpdate()
RequestOpen(ctx context.Context, cfg *configcli.Config, branch string, path string, mod modules.Update) error
RequestClose(ctx context.Context, cfg *configcli.Config, branch string, path string) error
RequestUpdate(ctx context.Context, cfg *configcli.Config, branch string, path string, mod modules.Update) error
}
func NewSourceControl(system, token string) SourceControl {