diff options
author | Patrick Steinhardt <psteinhardt@gitlab.com> | 2022-02-04 12:36:24 +0300 |
---|---|---|
committer | Patrick Steinhardt <psteinhardt@gitlab.com> | 2022-02-09 10:30:08 +0300 |
commit | 306761f0d4feccfcf5f62bcc69d09194159b37cb (patch) | |
tree | c6a2b653c8ed00302457a973325f046ee137c2e5 | |
parent | 85dad6b3dcd4baf263b9f4d35b05259ee52916df (diff) |
repository: Make repacking of repositories self-contained
While we do have a `repack()` function which handles repacking of
repositories, this function is not self-contained: callers need to pass
additional Git options to request a full repack. This makes it hard to
reuse the logic in other locations where we potentially want to do a
full repakc, as well.
Refactor the code to move all repacking logic into `repack()` itself.
Callers can decide whether they want to do a full or partial repack by
setting the respective parameters in a new config structure.
-rw-r--r-- | internal/gitaly/service/repository/repack.go | 43 |
1 files changed, 32 insertions, 11 deletions
diff --git a/internal/gitaly/service/repository/repack.go b/internal/gitaly/service/repository/repack.go index 280fb6186..a3f428650 100644 --- a/internal/gitaly/service/repository/repack.go +++ b/internal/gitaly/service/repository/repack.go @@ -36,31 +36,52 @@ func log2Threads(numCPUs int) git.ValueFlag { func (s *server) RepackFull(ctx context.Context, in *gitalypb.RepackFullRequest) (*gitalypb.RepackFullResponse, error) { repo := s.localrepo(in.GetRepository()) - options := []git.Option{ - git.Flag{Name: "-A"}, - git.Flag{Name: "--pack-kept-objects"}, - git.Flag{Name: "-l"}, - log2Threads(runtime.NumCPU()), + cfg := repackCommandConfig{ + fullRepack: true, + writeBitmap: in.GetCreateBitmap(), } - if err := repack(ctx, repo, in.GetCreateBitmap(), options...); err != nil { + + if err := repack(ctx, repo, cfg); err != nil { return nil, helper.ErrInternal(err) } + return &gitalypb.RepackFullResponse{}, nil } func (s *server) RepackIncremental(ctx context.Context, in *gitalypb.RepackIncrementalRequest) (*gitalypb.RepackIncrementalResponse, error) { repo := s.localrepo(in.GetRepository()) - if err := repack(ctx, repo, false); err != nil { - return nil, helper.ErrInternal(err) + cfg := repackCommandConfig{ + fullRepack: false, + writeBitmap: false, + } + + if err := repack(ctx, repo, cfg); err != nil { + return nil, err } + return &gitalypb.RepackIncrementalResponse{}, nil } -func repack(ctx context.Context, repo *localrepo.Repo, bitmap bool, args ...git.Option) error { +type repackCommandConfig struct { + fullRepack bool + writeBitmap bool +} + +func repack(ctx context.Context, repo *localrepo.Repo, cfg repackCommandConfig) error { + var options []git.Option + if cfg.fullRepack { + options = append(options, + git.Flag{Name: "-A"}, + git.Flag{Name: "--pack-kept-objects"}, + git.Flag{Name: "-l"}, + log2Threads(runtime.NumCPU()), + ) + } + if err := repo.ExecAndWait(ctx, git.SubCmd{ Name: "repack", - Flags: append([]git.Option{git.Flag{Name: "-d"}}, args...), - }, git.WithConfig(repackConfig(ctx, bitmap)...)); err != nil { + Flags: append([]git.Option{git.Flag{Name: "-d"}}, options...), + }, git.WithConfig(repackConfig(ctx, cfg.writeBitmap)...)); err != nil { return err } |