From 8b0cabaecd20a2d09faa968bd1a9bc3635977f68 Mon Sep 17 00:00:00 2001 From: Xe Iaso Date: Sat, 28 Oct 2023 10:36:34 -0400 Subject: internal/lume: maintain an existing checkout of xesite Okay so one of the main problems with this existing setup is that it ended up recloning the GitHub repo every time the app booted. This made startup slow by however long it takes for GitHub to serve the repo to the client. This change intelligently reuses the existing local clone of the git repo so that it doesn't have to reclone every time. There is a caveat for this though, it still makes you have an extra clone of the repo in development mode. I'm going to accept this for now. Signed-off-by: Xe Iaso --- internal/lume/lume.go | 45 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/internal/lume/lume.go b/internal/lume/lume.go index f40450f..c605279 100644 --- a/internal/lume/lume.go +++ b/internal/lume/lume.go @@ -106,20 +106,24 @@ type Options struct { func New(ctx context.Context, o *Options) (*FS, error) { repoDir := filepath.Join(o.DataDir, "repo") - os.RemoveAll(repoDir) - err := os.MkdirAll(filepath.Join(o.DataDir, "repo"), 0o755) - if err != nil { - return nil, err - } + os.MkdirAll(filepath.Join(o.DataDir, "repo"), 0o755) t0 := time.Now() repo, err := git.PlainCloneContext(ctx, repoDir, false, &git.CloneOptions{ URL: o.Repo, ReferenceName: plumbing.NewBranchReferenceName(o.Branch), }) - if err != nil { + if err != nil && err != git.ErrRepositoryAlreadyExists { return nil, err } + + if err == git.ErrRepositoryAlreadyExists { + repo, err = git.PlainOpen(repoDir) + if err != nil { + return nil, err + } + } + dur := time.Since(t0) slog.Debug("repo cloned", "in", dur.String()) @@ -137,9 +141,36 @@ func New(ctx context.Context, o *Options) (*FS, error) { return nil, err } } else { + wt, err := repo.Worktree() + if err != nil { + return nil, fmt.Errorf("lume: can't get worktree: %w", err) + } + + err = wt.PullContext(ctx, &git.PullOptions{ + ReferenceName: plumbing.NewBranchReferenceName(o.Branch), + }) + if err != nil && err != git.NoErrAlreadyUpToDate { + return nil, fmt.Errorf("lume: can't pull: %w", err) + } + + err = wt.Checkout(&git.CheckoutOptions{ + Branch: plumbing.NewBranchReferenceName(o.Branch), + }) + if err != nil { + return nil, fmt.Errorf("lume: can't checkout branch %s: %w", o.Branch, err) + } + + err = wt.Reset(&git.ResetOptions{ + Mode: git.HardReset, + Commit: plumbing.NewHash("HEAD"), + }) + if err != nil { + return nil, fmt.Errorf("lume: can't reset: %w", err) + } + ref, err := repo.Head() if err != nil { - return nil, err + return nil, fmt.Errorf("lume: can't get head: %w", err) } slog.Debug("cloned commit", "hash", ref.Hash().String()) -- cgit v1.2.3