From 0212ce9df4ee8dae2afe2363effe443510001ffa Mon Sep 17 00:00:00 2001 From: kjuulh Date: Mon, 12 Sep 2022 12:35:10 +0200 Subject: [PATCH] with commit --- internal/commands/process_repos.go | 40 ++++++++++++++++++++--- internal/services/providers/git.go | 51 ++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 4 deletions(-) diff --git a/internal/commands/process_repos.go b/internal/commands/process_repos.go index ff868fb..0e02efc 100644 --- a/internal/commands/process_repos.go +++ b/internal/commands/process_repos.go @@ -2,6 +2,11 @@ package commands import ( "context" + "fmt" + "io/fs" + "os" + "path" + "path/filepath" "sync" "time" @@ -66,7 +71,7 @@ func (pr *ProcessRepos) Process(ctx context.Context, repositoryUrls []string) er pr.logger.Debug("Cloning repo", zap.String("path", area.Path), zap.String("repoUrl", repoUrl)) cloneCtx, _ := context.WithTimeout(ctx, time.Second*5) - _, err = pr.git.Clone(cloneCtx, area, repoUrl) + repo, err := pr.git.Clone(cloneCtx, area, repoUrl) if err != nil { pr.logger.Error("could not clone repo", zap.Error(err)) errChan <- err @@ -76,12 +81,39 @@ func (pr *ProcessRepos) Process(ctx context.Context, repositoryUrls []string) er err = pr.action.Run( ctx, area, - func(ctx context.Context, area *storage.Area) (bool, error) { + func(_ context.Context, area *storage.Area) (bool, error) { pr.logger.Debug("checking predicate", zap.String("area", area.Path)) - return true, nil + contains := false + filepath.WalkDir(area.Path, func(path string, d fs.DirEntry, err error) error { + if d.Name() == "roadmap.md" { + contains = true + } + return nil + }) + return contains, nil }, - func(ctx context.Context, area *storage.Area) error { + func(_ context.Context, area *storage.Area) error { pr.logger.Debug("running action", zap.String("area", area.Path)) + readme := path.Join(area.Path, "README.md") + file, err := os.Create(readme) + if err != nil { + return fmt.Errorf("could not create readme: %w", err) + } + _, err = file.WriteString("# Readme") + if err != nil { + return fmt.Errorf("could not write readme: %w", err) + } + + _, err = pr.git.Add(ctx, area, repo) + if err != nil { + return fmt.Errorf("could not add file: %w", err) + } + + _, err = pr.git.Commit(ctx, repo) + if err != nil { + return fmt.Errorf("could not get diff: %w", err) + } + return nil }, false) diff --git a/internal/services/providers/git.go b/internal/services/providers/git.go index 02706dc..48539ca 100644 --- a/internal/services/providers/git.go +++ b/internal/services/providers/git.go @@ -2,9 +2,11 @@ package providers import ( "context" + "time" "git.front.kjuulh.io/kjuulh/kraken/internal/services/storage" "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing/object" "github.com/go-git/go-git/v5/plumbing/transport" "github.com/go-git/go-git/v5/plumbing/transport/http" "github.com/go-git/go-git/v5/plumbing/transport/ssh" @@ -86,6 +88,55 @@ func (g *Git) Clone(ctx context.Context, storageArea *storage.Area, repoUrl stri return &GitRepo{repo: repo}, nil } +func (g *Git) Add(ctx context.Context, storageArea *storage.Area, gitRepo *GitRepo) (*git.Worktree, error) { + worktree, err := gitRepo.repo.Worktree() + if err != nil { + return nil, err + } + + err = worktree.AddWithOptions(&git.AddOptions{ + All: true, + }) + if err != nil { + return nil, err + } + + status, err := worktree.Status() + if err != nil { + return nil, err + } + + g.logger.Info("git status", zap.String("status", status.String())) + + return worktree, nil +} + +func (g *Git) Commit(ctx context.Context, gitRepo *GitRepo) error { + worktree, err := gitRepo.repo.Worktree() + if err != nil { + return err + } + + _, err = worktree.Commit("some-commit", &git.CommitOptions{ + All: true, + Author: &object.Signature{ + Name: "kraken", + Email: "kraken@kasperhermansen.com", + When: time.Now(), + }, + Committer: &object.Signature{ + Name: "kraken", + Email: "kraken@kasperhermansen.com", + When: time.Now(), + }, + }) + if err != nil { + return err + } + + return nil +} + func (g *Git) GetAuth() (transport.AuthMethod, error) { switch g.gitConfig.AuthOption { case GIT_AUTH_SSH: