diff options
| author | Xe Iaso <me@xeiaso.net> | 2023-10-28 10:36:34 -0400 |
|---|---|---|
| committer | Xe Iaso <me@xeiaso.net> | 2023-10-28 10:36:34 -0400 |
| commit | 8b0cabaecd20a2d09faa968bd1a9bc3635977f68 (patch) | |
| tree | 0f139eaa03d1aceeea95b53edb90bd5fb07f54d4 /internal | |
| parent | 3eb6b6b9cb7e5991d7abfd0e6ad2ce65b5d6a644 (diff) | |
| download | xesite-8b0cabaecd20a2d09faa968bd1a9bc3635977f68.tar.xz xesite-8b0cabaecd20a2d09faa968bd1a9bc3635977f68.zip | |
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 <me@xeiaso.net>
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/lume/lume.go | 45 |
1 files 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()) |
