diff --git a/.golangci.yml b/.golangci.yml index 0d2e4a966..8bf3c8a34 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -112,17 +112,6 @@ linters-settings: # Default: 30 max-func-lines: 30 - nolintlint: - # Exclude following linters from requiring an explanation. - # Default: [] - allow-no-explanation: [ funlen, gocognit, lll ] - # Enable to require an explanation of nonzero length after each nolint directive. - # Default: false - require-explanation: true - # Enable to require nolint directives to mention the specific linter being suppressed. - # Default: false - require-specific: true - rowserrcheck: # database/sql is always checked # Default: [] @@ -217,7 +206,7 @@ linters: - exhaustive # checks exhaustiveness of enum switch statements - exportloopref # checks for pointers to enclosing loop variables - forbidigo # forbids identifiers - - funlen # tool for detection of long functions + #- funlen # tool for detection of long functions #- gochecknoglobals # checks that no global variables exist #- gochecknoinits # checks that no init functions are present in Go code - gocognit # computes and checks the cognitive complexity of functions @@ -238,7 +227,7 @@ linters: - nilerr # finds the code that returns nil even if it checks that the error is not nil - nilnil # checks that there is no simultaneous return of nil error and an invalid value - noctx # finds sending http request without context.Context - - nolintlint # reports ill-formed or insufficient nolint directives + # - nolintlint # reports ill-formed or insufficient nolint directives # - nonamedreturns # reports all named returns - nosprintfhostport # checks for misuse of Sprintf to construct a host with port in a URL - predeclared # finds code that shadows one of Go's predeclared identifiers @@ -283,7 +272,7 @@ linters: #- importas # enforces consistent import aliases #- logrlint # [owner archived repository] checks logr arguments #- maintidx # measures the maintainability index of each function - #- misspell # [useless] finds commonly misspelled English words in comments + - misspell # [useless] finds commonly misspelled English words in comments #- nlreturn # [too strict and mostly code is not more readable] checks for a new line before return and branch statements to increase code clarity #- paralleltest # [too many false positives] detects missing usage of t.Parallel() method in your Go test #- thelper # detects golang test helpers without t.Helper() call and checks the consistency of test helpers diff --git a/cli/cli.go b/cli/cli.go index 858bfe2de..14dae1320 100644 --- a/cli/cli.go +++ b/cli/cli.go @@ -53,7 +53,7 @@ func getArguments() []string { command := os.Args[0] args := os.Args[1:] - // in case of githooks, translate the arguments comming from git to work with gitness. + // in case of githooks, translate the arguments coming from git to work with gitness. if gitArgs, fromGit := githook.SanitizeArgsForGit(command, args); fromGit { return append([]string{hooks.ParamHooks}, gitArgs...) } diff --git a/cli/server/harness.wire_gen.go b/cli/server/harness.wire_gen.go index 99649644c..a19c9460c 100644 --- a/cli/server/harness.wire_gen.go +++ b/cli/server/harness.wire_gen.go @@ -7,6 +7,7 @@ package server import ( "context" + "github.com/harness/gitness/events" "github.com/harness/gitness/gitrpc" server2 "github.com/harness/gitness/gitrpc/server" @@ -176,7 +177,7 @@ func initSystem(ctx context.Context, config *types.Config) (*system, error) { if err != nil { return nil, err } - cronManager := cron.ProvideCronManager(serverConfig) + manager := cron.ProvideManager(serverConfig) repoGitInfoView := database.ProvideRepoGitInfoView(db) repoGitInfoCache := cache.ProvideRepoGitInfoCache(repoGitInfoView) pubsubConfig := pubsub.ProvideConfig(config) @@ -186,6 +187,6 @@ func initSystem(ctx context.Context, config *types.Config) (*system, error) { return nil, err } servicesServices := services.ProvideServices(webhookService, pullreqService) - serverSystem := newSystem(bootstrapBootstrap, serverServer, server3, cronManager, servicesServices) + serverSystem := newSystem(bootstrapBootstrap, serverServer, server3, manager, servicesServices) return serverSystem, nil } diff --git a/cli/server/standalone.wire_gen.go b/cli/server/standalone.wire_gen.go index d9b5dedb8..08d6e0c9b 100644 --- a/cli/server/standalone.wire_gen.go +++ b/cli/server/standalone.wire_gen.go @@ -7,6 +7,7 @@ package server import ( "context" + "github.com/harness/gitness/events" "github.com/harness/gitness/gitrpc" server2 "github.com/harness/gitness/gitrpc/server" @@ -143,7 +144,7 @@ func initSystem(ctx context.Context, config *types.Config) (*system, error) { if err != nil { return nil, err } - cronManager := cron.ProvideCronManager(serverConfig) + manager := cron.ProvideManager(serverConfig) repoGitInfoView := database.ProvideRepoGitInfoView(db) repoGitInfoCache := cache.ProvideRepoGitInfoCache(repoGitInfoView) pubsubConfig := pubsub.ProvideConfig(config) @@ -153,6 +154,6 @@ func initSystem(ctx context.Context, config *types.Config) (*system, error) { return nil, err } servicesServices := services.ProvideServices(webhookService, pullreqService) - serverSystem := newSystem(bootstrapBootstrap, serverServer, server3, cronManager, servicesServices) + serverSystem := newSystem(bootstrapBootstrap, serverServer, server3, manager, servicesServices) return serverSystem, nil } diff --git a/cli/server/system.go b/cli/server/system.go index 2cfb41bf4..680975568 100644 --- a/cli/server/system.go +++ b/cli/server/system.go @@ -18,12 +18,12 @@ type system struct { server *server.Server gitRPCServer *gitrpcserver.Server services services.Services - gitRPCCronMngr *gitrpccron.CronManager + gitRPCCronMngr *gitrpccron.Manager } // newSystem returns a new system structure. func newSystem(bootstrap bootstrap.Bootstrap, server *server.Server, gitRPCServer *gitrpcserver.Server, - gitrpccron *gitrpccron.CronManager, services services.Services) *system { + gitrpccron *gitrpccron.Manager, services services.Services) *system { return &system{ bootstrap: bootstrap, server: server, diff --git a/events/reader.go b/events/reader.go index 1d5ace254..c625c82bb 100644 --- a/events/reader.go +++ b/events/reader.go @@ -60,7 +60,7 @@ func (f *ReaderFactory[R]) Launch(ctx context.Context, category: f.category, } - // create new reader (could return the innerReader itself, but also allows to launch costumized readers) + // create new reader (could return the innerReader itself, but also allows to launch customized readers) reader, err := f.readerFactoryFn(innerReader) if err != nil { //nolint:gocritic // only way to achieve this AFAIK - lint proposal is not building @@ -165,7 +165,7 @@ func ReaderRegisterEvent[T interface{}](reader *GenericReader, } // retrieve bytes from raw event - // NOTE: Redis returns []byte as string - to avoid unnecessary convertion we handle both types here. + // NOTE: Redis returns []byte as string - to avoid unnecessary conversion we handle both types here. var eventBytes []byte switch v := eventRaw.(type) { case string: diff --git a/gitrpc/commit.go b/gitrpc/commit.go index c556043ac..ee97a0149 100644 --- a/gitrpc/commit.go +++ b/gitrpc/commit.go @@ -76,6 +76,8 @@ type ListCommitsParams struct { Page int32 Limit int32 Path string + Since int64 + Until int64 } type RenameDetails struct { @@ -100,6 +102,8 @@ func (c *Client) ListCommits(ctx context.Context, params *ListCommitsParams) (*L Page: params.Page, Limit: params.Limit, Path: params.Path, + Since: params.Since, + Until: params.Until, }) if err != nil { return nil, fmt.Errorf("failed to start stream for commits: %w", err) diff --git a/gitrpc/enum/merge.go b/gitrpc/enum/merge.go index 98a2aaaa7..06edd664f 100644 --- a/gitrpc/enum/merge.go +++ b/gitrpc/enum/merge.go @@ -1,3 +1,7 @@ +// Copyright 2022 Harness Inc. All rights reserved. +// Use of this source code is governed by the Polyform Free Trial License +// that can be found in the LICENSE.md file for this repository. + package enum import "github.com/harness/gitness/gitrpc/rpc" diff --git a/gitrpc/internal/gitea/commit.go b/gitrpc/internal/gitea/commit.go index f086b9964..2e6c57dfa 100644 --- a/gitrpc/internal/gitea/commit.go +++ b/gitrpc/internal/gitea/commit.go @@ -81,23 +81,26 @@ func getGiteaCommits(giteaRepo *gitea.Repository, commitIDs []string) ([]*gitea. return giteaCommits, nil } -func (g Adapter) listCommitSHAs(giteaRepo *gitea.Repository, - ref string, afterRef string, - page int, limit int, path string, +func (g Adapter) listCommitSHAs( + giteaRepo *gitea.Repository, + ref string, + page int, + limit int, + filter types.CommitFilter, ) ([]string, error) { - args := make([]string, 0, 8) + args := make([]string, 0, 16) args = append(args, "rev-list") // return commits only up to a certain reference if requested - if afterRef != "" { + if filter.AfterRef != "" { // ^REF tells the rev-list command to return only commits that aren't reachable by SHA - args = append(args, fmt.Sprintf("^%s", afterRef)) + args = append(args, fmt.Sprintf("^%s", filter.AfterRef)) } // add refCommitSHA as starting point args = append(args, ref) - if len(path) != 0 { - args = append(args, "--", path) + if len(filter.Path) != 0 { + args = append(args, "--", filter.Path) } // add pagination if requested @@ -110,6 +113,16 @@ func (g Adapter) listCommitSHAs(giteaRepo *gitea.Repository, } } + if filter.Since > 0 || filter.Until > 0 { + args = append(args, "--date", "unix") + } + if filter.Since > 0 { + args = append(args, "--since", strconv.FormatInt(filter.Since, 10)) + } + if filter.Until > 0 { + args = append(args, "--until", strconv.FormatInt(filter.Until, 10)) + } + stdout, _, runErr := gitea.NewCommand(giteaRepo.Ctx, args...).RunStdBytes(&gitea.RunOpts{Dir: giteaRepo.Path}) if runErr != nil { // TODO: handle error in case they don't have a common merge base! @@ -122,10 +135,13 @@ func (g Adapter) listCommitSHAs(giteaRepo *gitea.Repository, // ListCommitSHAs lists the commits reachable from ref. // Note: ref & afterRef can be Branch / Tag / CommitSHA. // Note: commits returned are [ref->...->afterRef). -func (g Adapter) ListCommitSHAs(ctx context.Context, +func (g Adapter) ListCommitSHAs( + ctx context.Context, repoPath string, - ref string, afterRef string, - page int, limit int, path string, + ref string, + page int, + limit int, + filter types.CommitFilter, ) ([]string, error) { giteaRepo, err := gitea.OpenRepository(ctx, repoPath) if err != nil { @@ -133,7 +149,7 @@ func (g Adapter) ListCommitSHAs(ctx context.Context, } defer giteaRepo.Close() - return g.listCommitSHAs(giteaRepo, ref, afterRef, page, limit, path) + return g.listCommitSHAs(giteaRepo, ref, page, limit, filter) } // ListCommits lists the commits reachable from ref. @@ -141,8 +157,8 @@ func (g Adapter) ListCommitSHAs(ctx context.Context, // Note: commits returned are [ref->...->afterRef). func (g Adapter) ListCommits(ctx context.Context, repoPath string, - ref string, afterRef string, - page int, limit int, path string, + ref string, + page int, limit int, filter types.CommitFilter, ) ([]types.Commit, *types.PathRenameDetails, error) { giteaRepo, err := gitea.OpenRepository(ctx, repoPath) if err != nil { @@ -150,7 +166,7 @@ func (g Adapter) ListCommits(ctx context.Context, } defer giteaRepo.Close() - commitSHAs, err := g.listCommitSHAs(giteaRepo, ref, afterRef, page, limit, path) + commitSHAs, err := g.listCommitSHAs(giteaRepo, ref, page, limit, filter) if err != nil { return nil, nil, err } @@ -170,8 +186,8 @@ func (g Adapter) ListCommits(ctx context.Context, commits[i] = *commit } - if len(path) != 0 { - renameDetails, err := giteaGetRenameDetails(giteaRepo, commits[0].SHA, path) + if len(filter.Path) != 0 { + renameDetails, err := giteaGetRenameDetails(giteaRepo, commits[0].SHA, filter.Path) if err != nil { return nil, nil, err } diff --git a/gitrpc/internal/gitea/merge.go b/gitrpc/internal/gitea/merge.go index e37aa5b94..4f8bb4a3a 100644 --- a/gitrpc/internal/gitea/merge.go +++ b/gitrpc/internal/gitea/merge.go @@ -18,9 +18,9 @@ import ( "github.com/harness/gitness/gitrpc/enum" "github.com/harness/gitness/gitrpc/internal/tempdir" "github.com/harness/gitness/gitrpc/internal/types" - "github.com/rs/zerolog/log" "code.gitea.io/gitea/modules/git" + "github.com/rs/zerolog/log" ) // CreateTemporaryRepo creates a temporary repo with "base" for pr.BaseBranch and "tracking" for pr.HeadBranch @@ -251,6 +251,9 @@ func commitAndSignNoAuthor( return nil } +// Merge merges changes between 2 refs (branch, commits or tags). +// +//nolint:gocognit,nestif func (g Adapter) Merge( ctx context.Context, pr *types.PullRequest, @@ -288,7 +291,7 @@ func (g Adapter) Merge( // Merge with squash cmd := git.NewCommand(ctx, "merge", "--squash", trackingBranch) if err := runMergeCommand(ctx, pr, mergeMethod, cmd, tmpBasePath, env); err != nil { - return fmt.Errorf("unable to merge --squash tracking into base: %v", err) + return fmt.Errorf("unable to merge --squash tracking into base: %w", err) } if signArg == "" { @@ -322,7 +325,10 @@ func (g Adapter) Merge( Stdout: &outbuf, Stderr: &errbuf, }); err != nil { - return fmt.Errorf("git checkout base prior to merge post staging rebase [%s -> %s]: %v\n%s\n%s", pr.HeadBranch, pr.BaseBranch, err, outbuf.String(), errbuf.String()) + return fmt.Errorf( + "git checkout base prior to merge post staging rebase [%s -> %s]: %w\n%s\n%s", + pr.HeadBranch, pr.BaseBranch, err, outbuf.String(), errbuf.String(), + ) } outbuf.Reset() errbuf.Reset() @@ -337,25 +343,35 @@ func (g Adapter) Merge( // Rebase will leave a REBASE_HEAD file in .git if there is a conflict if _, statErr := os.Stat(filepath.Join(tmpBasePath, ".git", "REBASE_HEAD")); statErr == nil { var commitSha string + // TBD git version we will support // failingCommitPath := filepath.Join(tmpBasePath, ".git", "rebase-apply", "original-commit") // Git < 2.26 - // if _, statErr := os.Stat(failingCommitPath); statErr != nil { - // return fmt.Errorf("git rebase staging on to base [%s -> %s]: %v\n%s\n%s", pr.HeadBranch, pr.BaseBranch, err, outbuf.String(), errbuf.String()) + // if _, cpErr := os.Stat(failingCommitPath); statErr != nil { + // return fmt.Errorf("git rebase staging on to base [%s -> %s]: %v\n%s\n%s", + // pr.HeadBranch, pr.BaseBranch, cpErr, outbuf.String(), errbuf.String()) // } failingCommitPath := filepath.Join(tmpBasePath, ".git", "rebase-merge", "stopped-sha") // Git >= 2.26 - if _, statErr := os.Stat(failingCommitPath); statErr != nil { - return fmt.Errorf("git rebase staging on to base [%s -> %s]: %v\n%s\n%s", pr.HeadBranch, pr.BaseBranch, err, outbuf.String(), errbuf.String()) + if _, cpErr := os.Stat(failingCommitPath); cpErr != nil { + return fmt.Errorf( + "git rebase staging on to base [%s -> %s]: %w\n%s\n%s", + pr.HeadBranch, pr.BaseBranch, cpErr, outbuf.String(), errbuf.String(), + ) } commitShaBytes, readErr := os.ReadFile(failingCommitPath) if readErr != nil { // Abandon this attempt to handle the error - return fmt.Errorf("git rebase staging on to base [%s -> %s]: %v\n%s\n%s", pr.HeadBranch, pr.BaseBranch, err, outbuf.String(), errbuf.String()) + return fmt.Errorf( + "git rebase staging on to base [%s -> %s]: %w\n%s\n%s", + pr.HeadBranch, pr.BaseBranch, readErr, outbuf.String(), errbuf.String(), + ) } commitSha = strings.TrimSpace(string(commitShaBytes)) - log.Debug().Msgf("RebaseConflict at %s [%s -> %s]: %v\n%s\n%s", commitSha, pr.HeadBranch, pr.BaseBranch, err, outbuf.String(), errbuf.String()) + log.Debug().Msgf("RebaseConflict at %s [%s -> %s]: %v\n%s\n%s", + commitSha, pr.HeadBranch, pr.BaseBranch, err, outbuf.String(), errbuf.String(), + ) return &types.MergeConflictsError{ Method: mergeMethod, CommitSHA: commitSha, @@ -364,7 +380,10 @@ func (g Adapter) Merge( Err: err, } } - return fmt.Errorf("git rebase staging on to base [%s -> %s]: %v\n%s\n%s", pr.HeadBranch, pr.BaseBranch, err, outbuf.String(), errbuf.String()) + return fmt.Errorf( + "git rebase staging on to base [%s -> %s]: %w\n%s\n%s", + pr.HeadBranch, pr.BaseBranch, err, outbuf.String(), errbuf.String(), + ) } outbuf.Reset() errbuf.Reset() @@ -376,7 +395,10 @@ func (g Adapter) Merge( Stdout: &outbuf, Stderr: &errbuf, }); err != nil { - return fmt.Errorf("git checkout base prior to merge post staging rebase [%s -> %s]: %v\n%s\n%s", pr.HeadBranch, pr.BaseBranch, err, outbuf.String(), errbuf.String()) + return fmt.Errorf( + "git checkout base prior to merge post staging rebase [%s -> %s]: %w\n%s\n%s", + pr.HeadBranch, pr.BaseBranch, err, outbuf.String(), errbuf.String(), + ) } outbuf.Reset() errbuf.Reset() diff --git a/gitrpc/internal/gitea/tag.go b/gitrpc/internal/gitea/tag.go index 775490068..f5eed3f82 100644 --- a/gitrpc/internal/gitea/tag.go +++ b/gitrpc/internal/gitea/tag.go @@ -9,13 +9,13 @@ import ( "context" "errors" "fmt" - "github.com/harness/gitness/gitrpc/rpc" "io" "strconv" "strings" "time" "github.com/harness/gitness/gitrpc/internal/types" + "github.com/harness/gitness/gitrpc/rpc" gitea "code.gitea.io/gitea/modules/git" ) @@ -62,7 +62,12 @@ func (g Adapter) GetAnnotatedTags(ctx context.Context, repoPath string, shas []s return tags, nil } -func (g Adapter) CreateAnnotatedTag(ctx context.Context, repoPath string, request *rpc.CreateTagRequest, env []string) error { +func (g Adapter) CreateAnnotatedTag( + ctx context.Context, + repoPath string, + request *rpc.CreateTagRequest, + env []string, +) error { cmd := gitea.NewCommand(ctx, "tag", "-a", "-m", request.GetMessage(), "--", request.GetTagName(), request.GetSha()) _, _, err := cmd.RunStdString(&gitea.RunOpts{Dir: repoPath, Env: env}) if err != nil { @@ -75,7 +80,7 @@ func (g Adapter) DeleteTag(ctx context.Context, repoPath string, ref string, env cmd := gitea.NewCommand(ctx, "tag", "-d", ref) _, stdErr, err := cmd.RunStdString(&gitea.RunOpts{Dir: repoPath, Env: env}) if err != nil { - return processGiteaErrorf(err, "Service failed to delete tag with error", stdErr) + return processGiteaErrorf(err, "Service failed to delete tag with error: %v", stdErr) } return nil } @@ -200,7 +205,7 @@ func giteaParseCatFileLine(data []byte, start int, header string) (string, int, return "", 0, fmt.Errorf("expected '%s' but started with '%s'", header, string(data[:lenHeader])) } - // get end of line and start of next line (used externaly, transpose with provided start index) + // get end of line and start of next line (used externally, transpose with provided start index) lineEnd := bytes.IndexByte(data, '\n') externalNextLine := start + lineEnd + 1 if lineEnd == -1 { diff --git a/gitrpc/internal/gitea/tree.go b/gitrpc/internal/gitea/tree.go index a361b8590..2962b2b56 100644 --- a/gitrpc/internal/gitea/tree.go +++ b/gitrpc/internal/gitea/tree.go @@ -70,7 +70,7 @@ func (g Adapter) GetTreeNode(ctx context.Context, repoPath string, func (g Adapter) ListTreeNodes(ctx context.Context, repoPath string, ref string, treePath string, recursive bool, includeLatestCommit bool) ([]types.TreeNodeWithCommit, error) { if recursive && includeLatestCommit { - // To avoid potential performance catastrophies, block recursive with includeLatestCommit + // To avoid potential performance catastrophe, block recursive with includeLatestCommit // TODO: this should return bad error to caller if needed? // TODO: should this be refactored in two methods? return nil, fmt.Errorf("latest commit with recursive query is not supported") diff --git a/gitrpc/internal/service/branch.go b/gitrpc/internal/service/branch.go index 26817ee19..53fccd8e8 100644 --- a/gitrpc/internal/service/branch.go +++ b/gitrpc/internal/service/branch.go @@ -175,7 +175,7 @@ func (s ReferenceService) ListBranches(request *rpc.ListBranchesRequest, ctx := stream.Context() repoPath := getFullPathForRepo(s.reposRoot, base.GetRepoUid()) - // get all required information from git refrences + // get all required information from git references branches, err := s.listBranchesLoadReferenceData(ctx, repoPath, request) if err != nil { return err diff --git a/gitrpc/internal/service/commit.go b/gitrpc/internal/service/commit.go index 2232e4125..cb1660976 100644 --- a/gitrpc/internal/service/commit.go +++ b/gitrpc/internal/service/commit.go @@ -56,7 +56,10 @@ func (s RepositoryService) ListCommits(request *rpc.ListCommitsRequest, repoPath := getFullPathForRepo(s.reposRoot, base.GetRepoUid()) gitCommits, renameDetails, err := s.adapter.ListCommits(ctx, repoPath, request.GetGitRef(), - request.GetAfter(), int(request.GetPage()), int(request.GetLimit()), request.GetPath()) + int(request.GetPage()), int(request.GetLimit()), types.CommitFilter{AfterRef: request.After, + Path: request.Path, + Since: request.Since, + Until: request.Until}) if err != nil { return processGitErrorf(err, "failed to get list of commits") } diff --git a/gitrpc/internal/service/diff.go b/gitrpc/internal/service/diff.go index 25fada48c..5bcdbfea5 100644 --- a/gitrpc/internal/service/diff.go +++ b/gitrpc/internal/service/diff.go @@ -124,7 +124,8 @@ func (s DiffService) DiffCut( return nil, processGitErrorf(err, "failed to find merge base") } - sourceCommits, err := s.adapter.ListCommitSHAs(ctx, repoPath, r.SourceBranch, r.TargetBranch, 0, 1, "") + sourceCommits, err := s.adapter.ListCommitSHAs(ctx, repoPath, r.SourceBranch, 0, 1, + types.CommitFilter{AfterRef: r.TargetBranch}) if err != nil || len(sourceCommits) == 0 { return nil, processGitErrorf(err, "failed to get list of source branch commits") } diff --git a/gitrpc/internal/service/interface.go b/gitrpc/internal/service/interface.go index 5ecf52fca..8ac4ab900 100644 --- a/gitrpc/internal/service/interface.go +++ b/gitrpc/internal/service/interface.go @@ -6,11 +6,11 @@ package service import ( "context" - "github.com/harness/gitness/gitrpc/rpc" "io" "github.com/harness/gitness/gitrpc/enum" "github.com/harness/gitness/gitrpc/internal/types" + "github.com/harness/gitness/gitrpc/rpc" ) // GitAdapter for accessing git commands from gitea. @@ -33,9 +33,9 @@ type GitAdapter interface { GetCommit(ctx context.Context, repoPath string, ref string) (*types.Commit, error) GetCommits(ctx context.Context, repoPath string, refs []string) ([]types.Commit, error) ListCommits(ctx context.Context, repoPath string, - ref string, afterRef string, page int, limit int, path string) ([]types.Commit, *types.PathRenameDetails, error) + ref string, page int, limit int, filter types.CommitFilter) ([]types.Commit, *types.PathRenameDetails, error) ListCommitSHAs(ctx context.Context, repoPath string, - ref string, afterRef string, page int, limit int, path string) ([]string, error) + ref string, page int, limit int, filter types.CommitFilter) ([]string, error) GetLatestCommit(ctx context.Context, repoPath string, ref string, treePath string) (*types.Commit, error) GetFullCommitID(ctx context.Context, repoPath, shortID string) (string, error) GetAnnotatedTag(ctx context.Context, repoPath string, sha string) (*types.Tag, error) diff --git a/gitrpc/internal/service/merge.go b/gitrpc/internal/service/merge.go index be470c830..ead1fa8a9 100644 --- a/gitrpc/internal/service/merge.go +++ b/gitrpc/internal/service/merge.go @@ -66,7 +66,7 @@ func (s MergeService) Merge( defer func() { rmErr := tempdir.RemoveTemporaryPath(tmpBasePath) if rmErr != nil { - log.Ctx(ctx).Warn().Msgf("Removing temporary location %s for merge operation was not successfull", tmpBasePath) + log.Ctx(ctx).Warn().Msgf("Removing temporary location %s for merge operation was not successful", tmpBasePath) } }() diff --git a/gitrpc/internal/service/operations.go b/gitrpc/internal/service/operations.go index 51fa19cd4..f571d5930 100644 --- a/gitrpc/internal/service/operations.go +++ b/gitrpc/internal/service/operations.go @@ -87,7 +87,7 @@ func (s *CommitFilesService) CommitFiles(stream rpc.CommitFilesService_CommitFil // check if repo is empty // IMPORTANT: we don't use gitea's repo.IsEmpty() as that only checks whether the default branch exists (in HEAD). // This can be an issue in case someone created a branch already in the repo (just default branch is missing). - // In that case the user can accidentaly create separate git histories (which most likely is unintended). + // In that case the user can accidentally create separate git histories (which most likely is unintended). // If the user wants to actually build a disconnected commit graph they can use the cli. isEmpty, err := repoHasBranches(ctx, repo) if err != nil { @@ -225,7 +225,7 @@ func (s *CommitFilesService) validateAndPrepareHeader(repo *git.Repository, isEm header.BranchName = strings.TrimPrefix(strings.TrimSpace(header.GetBranchName()), gitReferenceNamePrefixBranch) header.NewBranchName = strings.TrimPrefix(strings.TrimSpace(header.GetNewBranchName()), gitReferenceNamePrefixBranch) - // if the repo is empty then we can skip branch existance checks + // if the repo is empty then we can skip branch existence checks if isEmpty { return nil } diff --git a/gitrpc/internal/service/path.go b/gitrpc/internal/service/path.go index 40d5b8428..d9be9de0d 100644 --- a/gitrpc/internal/service/path.go +++ b/gitrpc/internal/service/path.go @@ -10,7 +10,7 @@ import ( ) // getFullPathForRepo returns the full path of a repo given the root dir of repos and the uid of the repo. -// NOTE: Split repos into subfolders using their prefix to distribute repos accross a set of folders. +// NOTE: Split repos into subfolders using their prefix to distribute repos across a set of folders. func getFullPathForRepo(reposRoot, uid string) string { // ASSUMPTION: repoUID is of lenth at least 4 - otherwise we have trouble either way. return filepath.Join( diff --git a/gitrpc/internal/service/ref.go b/gitrpc/internal/service/ref.go index 9a354edda..cf8515be3 100644 --- a/gitrpc/internal/service/ref.go +++ b/gitrpc/internal/service/ref.go @@ -78,7 +78,7 @@ func createReferenceWalkPatternsFromQuery(basePath string, query string) []strin return []string{} } - // ensure non-empty basepath ends with "/" for proper matching and concatination. + // ensure non-empty basepath ends with "/" for proper matching and concatenation. if basePath != "" && basePath[len(basePath)-1] != '/' { basePath += "/" } diff --git a/gitrpc/internal/service/tag.go b/gitrpc/internal/service/tag.go index dc05ce34c..97e4a2793 100644 --- a/gitrpc/internal/service/tag.go +++ b/gitrpc/internal/service/tag.go @@ -5,11 +5,13 @@ package service import ( - "code.gitea.io/gitea/modules/git" "context" "fmt" + "github.com/harness/gitness/gitrpc/internal/types" "github.com/harness/gitness/gitrpc/rpc" + + "code.gitea.io/gitea/modules/git" "github.com/rs/zerolog/log" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -183,7 +185,10 @@ func listCommitTagsWalkReferencesHandler(tags *[]*rpc.CommitTag) types.WalkRefer return nil } } -func (s ReferenceService) CreateTag(ctx context.Context, request *rpc.CreateTagRequest) (*rpc.CreateTagResponse, error) { +func (s ReferenceService) CreateTag( + ctx context.Context, + request *rpc.CreateTagRequest, +) (*rpc.CreateTagResponse, error) { base := request.GetBase() if base == nil { return nil, types.ErrBaseCannotBeEmpty @@ -233,7 +238,10 @@ func (s ReferenceService) CreateTag(ctx context.Context, request *rpc.CreateTagR return &rpc.CreateTagResponse{Tag: commitTag}, nil } -func (s ReferenceService) DeleteTag(ctx context.Context, request *rpc.DeleteTagRequest) (*rpc.UpdateRefResponse, error) { +func (s ReferenceService) DeleteTag( + ctx context.Context, + request *rpc.DeleteTagRequest, +) (*rpc.UpdateRefResponse, error) { base := request.GetBase() if base == nil { return nil, types.ErrBaseCannotBeEmpty @@ -263,6 +271,7 @@ func (s ReferenceService) DeleteTag(ctx context.Context, request *rpc.DeleteTagR "GIT_COMMITTER_NAME="+actor.GetName(), "GIT_COMMITTER_EMAIL="+actor.GetEmail(), ) + err = s.adapter.DeleteTag(ctx, repoPath, request.TagName, env) if err != nil { return nil, processGitErrorf(err, "Failed to delete tag '%s' from remote repo", request.GetTagName()) diff --git a/gitrpc/internal/types/types.go b/gitrpc/internal/types/types.go index 02aa03dac..bb0e571ed 100644 --- a/gitrpc/internal/types/types.go +++ b/gitrpc/internal/types/types.go @@ -296,3 +296,10 @@ type PathRenameDetails struct { OldPath string NewPath string } + +type CommitFilter struct { + Path string + AfterRef string + Since int64 + Until int64 +} diff --git a/gitrpc/mapping.go b/gitrpc/mapping.go index 2a5cf6fc1..f616148d2 100644 --- a/gitrpc/mapping.go +++ b/gitrpc/mapping.go @@ -208,7 +208,7 @@ func mapRPCTreeNodeType(t rpc.TreeNodeType) (TreeNodeType, error) { case rpc.TreeNodeType_TreeNodeTypeTree: return TreeNodeTypeTree, nil default: - return TreeNodeTypeBlob, fmt.Errorf("unkown rpc tree node type: %d", t) + return TreeNodeTypeBlob, fmt.Errorf("unknown rpc tree node type: %d", t) } } @@ -225,7 +225,7 @@ func mapRPCTreeNodeMode(m rpc.TreeNodeMode) (TreeNodeMode, error) { case rpc.TreeNodeMode_TreeNodeModeTree: return TreeNodeModeTree, nil default: - return TreeNodeModeFile, fmt.Errorf("unkown rpc tree node mode: %d", m) + return TreeNodeModeFile, fmt.Errorf("unknown rpc tree node mode: %d", m) } } diff --git a/gitrpc/proto/repo.proto b/gitrpc/proto/repo.proto index 2a9698152..eb4b755ad 100644 --- a/gitrpc/proto/repo.proto +++ b/gitrpc/proto/repo.proto @@ -98,6 +98,8 @@ message ListCommitsRequest { int32 page = 4; int32 limit = 5; string path = 6; + int64 since = 7; + int64 until = 8; } message ListCommitsResponse { diff --git a/gitrpc/rpc/repo.pb.go b/gitrpc/rpc/repo.pb.go index cfa8f901e..e8ead5274 100644 --- a/gitrpc/rpc/repo.pb.go +++ b/gitrpc/rpc/repo.pb.go @@ -766,6 +766,8 @@ type ListCommitsRequest struct { Page int32 `protobuf:"varint,4,opt,name=page,proto3" json:"page,omitempty"` Limit int32 `protobuf:"varint,5,opt,name=limit,proto3" json:"limit,omitempty"` Path string `protobuf:"bytes,6,opt,name=path,proto3" json:"path,omitempty"` + Since int64 `protobuf:"varint,7,opt,name=since,proto3" json:"since,omitempty"` + Until int64 `protobuf:"varint,8,opt,name=until,proto3" json:"until,omitempty"` } func (x *ListCommitsRequest) Reset() { @@ -842,6 +844,20 @@ func (x *ListCommitsRequest) GetPath() string { return "" } +func (x *ListCommitsRequest) GetSince() int64 { + if x != nil { + return x.Since + } + return 0 +} + +func (x *ListCommitsRequest) GetUntil() int64 { + if x != nil { + return x.Until + } + return 0 +} + type ListCommitsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1826,7 +1842,7 @@ var file_repo_proto_rawDesc = []byte{ 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x22, - 0xa7, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, + 0xd3, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x07, @@ -1836,156 +1852,159 @@ var file_repo_proto_rawDesc = []byte{ 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x75, 0x0a, 0x13, 0x4c, 0x69, 0x73, - 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x23, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0b, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x06, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x39, 0x0a, 0x0e, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x5f, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x52, 0x0d, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x22, 0x64, 0x0a, 0x0d, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, - 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x74, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x6e, - 0x65, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, - 0x65, 0x77, 0x50, 0x61, 0x74, 0x68, 0x22, 0x67, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, - 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x61, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x10, - 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, - 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x69, 0x7a, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, - 0x6b, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x62, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x00, - 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x60, 0x0a, 0x15, - 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x68, - 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x67, - 0x69, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x69, - 0x74, 0x52, 0x65, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x44, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x53, - 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x2c, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x52, 0x09, 0x73, 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x31, - 0x0a, 0x09, 0x53, 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, - 0x6c, 0x22, 0x9a, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x44, - 0x69, 0x76, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x69, 0x6e, + 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, + 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x22, 0x75, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x06, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x72, + 0x70, 0x63, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x12, 0x39, 0x0a, 0x0e, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x72, 0x70, 0x63, 0x2e, + 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x0d, 0x72, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x64, 0x0a, 0x0d, + 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1d, 0x0a, + 0x0a, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x69, 0x73, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, + 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x74, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x50, 0x61, + 0x74, 0x68, 0x22, 0x67, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, + 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, 0x1d, 0x0a, 0x0a, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x73, 0x69, 0x7a, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x6b, 0x0a, 0x0f, 0x47, + 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, + 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x00, 0x52, 0x06, 0x68, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x60, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x42, + 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x73, 0x68, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x68, 0x0a, 0x13, 0x47, 0x65, + 0x74, 0x53, 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x44, 0x69, 0x76, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x22, 0x3d, - 0x0a, 0x17, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x44, 0x69, 0x76, 0x65, 0x72, 0x67, 0x65, 0x6e, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, - 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x0e, 0x0a, - 0x02, 0x74, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x74, 0x6f, 0x22, 0x57, 0x0a, - 0x1c, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x44, 0x69, 0x76, 0x65, 0x72, 0x67, - 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, - 0x0b, 0x64, 0x69, 0x76, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x44, - 0x69, 0x76, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0b, 0x64, 0x69, 0x76, 0x65, 0x72, - 0x67, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x40, 0x0a, 0x10, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x44, 0x69, 0x76, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x68, - 0x65, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x61, 0x68, 0x65, 0x61, 0x64, - 0x12, 0x16, 0x0a, 0x06, 0x62, 0x65, 0x68, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x06, 0x62, 0x65, 0x68, 0x69, 0x6e, 0x64, 0x22, 0x40, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x60, 0x0a, 0x10, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x42, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x62, 0x61, - 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, - 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x66, 0x31, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x72, 0x65, 0x66, 0x31, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x66, 0x32, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x66, 0x32, 0x22, 0x39, 0x0a, 0x11, 0x4d, 0x65, 0x72, 0x67, - 0x65, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, - 0x0e, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, - 0x53, 0x68, 0x61, 0x2a, 0x52, 0x0a, 0x0c, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x54, 0x72, 0x65, 0x65, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x72, 0x65, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x10, 0x01, 0x12, - 0x16, 0x0a, 0x12, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x10, 0x02, 0x2a, 0x81, 0x01, 0x0a, 0x0c, 0x54, 0x72, 0x65, 0x65, - 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x72, 0x65, 0x65, - 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x10, 0x00, 0x12, 0x17, - 0x0a, 0x13, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x53, 0x79, - 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x72, 0x65, 0x65, 0x4e, - 0x6f, 0x64, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x65, 0x63, 0x10, 0x02, 0x12, 0x14, 0x0a, - 0x10, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x54, 0x72, 0x65, - 0x65, 0x10, 0x03, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x4d, - 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x10, 0x04, 0x32, 0xd9, 0x05, 0x0a, 0x11, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x51, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x74, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x67, 0x69, 0x74, 0x5f, 0x72, + 0x65, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x69, 0x74, 0x52, 0x65, 0x66, + 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x44, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x6d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x09, + 0x73, 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0e, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, + 0x09, 0x73, 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x31, 0x0a, 0x09, 0x53, 0x75, + 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, + 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x9a, 0x01, + 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x44, 0x69, 0x76, 0x65, 0x72, + 0x67, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, + 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x70, + 0x63, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x04, 0x62, + 0x61, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x38, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x44, + 0x69, 0x76, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x22, 0x3d, 0x0a, 0x17, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x44, 0x69, 0x76, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x74, 0x6f, 0x22, 0x57, 0x0a, 0x1c, 0x47, 0x65, 0x74, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x44, 0x69, 0x76, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x69, 0x76, + 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x44, 0x69, 0x76, 0x65, 0x72, + 0x67, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0b, 0x64, 0x69, 0x76, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, + 0x65, 0x73, 0x22, 0x40, 0x0a, 0x10, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x44, 0x69, 0x76, 0x65, + 0x72, 0x67, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x68, 0x65, 0x61, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x61, 0x68, 0x65, 0x61, 0x64, 0x12, 0x16, 0x0a, 0x06, + 0x62, 0x65, 0x68, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x62, 0x65, + 0x68, 0x69, 0x6e, 0x64, 0x22, 0x40, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x25, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x72, 0x70, 0x63, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x28, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x4e, - 0x6f, 0x64, 0x65, 0x12, 0x17, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, - 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, - 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x19, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x65, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, - 0x12, 0x43, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x12, 0x18, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x70, 0x63, - 0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x62, - 0x12, 0x13, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x42, - 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x42, 0x0a, - 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x17, 0x2e, 0x72, - 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, - 0x01, 0x12, 0x3a, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x15, - 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, - 0x14, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x44, 0x69, 0x76, 0x65, 0x72, 0x67, - 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x44, 0x69, 0x76, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, - 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x44, 0x69, 0x76, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x10, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, - 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, - 0x70, 0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x09, 0x4d, - 0x65, 0x72, 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, 0x12, 0x15, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4d, - 0x65, 0x72, 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x27, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x72, 0x6e, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x69, - 0x74, 0x6e, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x69, 0x74, 0x72, 0x70, 0x63, 0x2f, 0x72, 0x70, 0x63, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x65, 0x22, 0x60, 0x0a, 0x10, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x72, 0x65, 0x66, 0x31, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x66, 0x31, + 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x66, 0x32, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x72, 0x65, 0x66, 0x32, 0x22, 0x39, 0x0a, 0x11, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x42, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x65, 0x72, + 0x67, 0x65, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, 0x53, 0x68, 0x61, 0x2a, + 0x52, 0x0a, 0x0c, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x14, 0x0a, 0x10, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x54, + 0x72, 0x65, 0x65, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x54, + 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x10, 0x02, 0x2a, 0x81, 0x01, 0x0a, 0x0c, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x4d, 0x6f, 0x64, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x72, + 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x53, 0x79, 0x6d, 0x6c, 0x69, 0x6e, + 0x6b, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x4d, + 0x6f, 0x64, 0x65, 0x45, 0x78, 0x65, 0x63, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x72, 0x65, + 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x54, 0x72, 0x65, 0x65, 0x10, 0x03, 0x12, + 0x16, 0x0a, 0x12, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x10, 0x04, 0x32, 0xd9, 0x05, 0x0a, 0x11, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x51, 0x0a, + 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x12, 0x1c, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, + 0x12, 0x40, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, + 0x17, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x47, + 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, + 0x64, 0x65, 0x73, 0x12, 0x19, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, + 0x65, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, + 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x64, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x43, 0x0a, 0x0c, + 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x72, + 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, + 0x53, 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x36, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x13, 0x2e, 0x72, + 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0b, 0x4c, 0x69, 0x73, + 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x17, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x3a, 0x0a, + 0x09, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x15, 0x2e, 0x72, 0x70, 0x63, + 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x14, 0x47, 0x65, 0x74, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x44, 0x69, 0x76, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x65, + 0x73, 0x12, 0x20, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x44, 0x69, 0x76, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x44, 0x69, 0x76, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x72, 0x70, 0x63, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x09, 0x4d, 0x65, 0x72, 0x67, 0x65, + 0x42, 0x61, 0x73, 0x65, 0x12, 0x15, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x65, 0x72, 0x67, 0x65, + 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x70, + 0x63, 0x2e, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x42, 0x27, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x68, 0x61, 0x72, 0x6e, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x69, 0x74, 0x6e, 0x65, 0x73, + 0x73, 0x2f, 0x67, 0x69, 0x74, 0x72, 0x70, 0x63, 0x2f, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/gitrpc/server/cron/clean_slate_data.go b/gitrpc/server/cron/clean_slate_data.go index c1dd787bd..652cfce18 100644 --- a/gitrpc/server/cron/clean_slate_data.go +++ b/gitrpc/server/cron/clean_slate_data.go @@ -1,3 +1,7 @@ +// Copyright 2022 Harness Inc. All rights reserved. +// Use of this source code is governed by the Polyform Free Trial License +// that can be found in the LICENSE.md file for this repository. + package cron import ( @@ -7,10 +11,11 @@ import ( "path/filepath" "github.com/harness/gitness/gitrpc/server" + "github.com/rs/zerolog/log" ) -// cleanup repository graveyard +// cleanupRepoGraveyard cleanups repository graveyard. func cleanupRepoGraveyard(ctx context.Context, graveyardpath string) error { logger := log.Ctx(ctx) repolist, err := os.ReadDir(graveyardpath) @@ -32,7 +37,7 @@ func cleanupRepoGraveyard(ctx context.Context, graveyardpath string) error { return nil } -func AddAllGitRPCCronJobs(cm *CronManager, gitrpcconfig server.Config) error { +func AddAllGitRPCCronJobs(cm *Manager, gitrpcconfig server.Config) error { // periodic repository graveyard cleanup graveyardpath := filepath.Join(gitrpcconfig.GitRoot, server.ReposGraveyardSubdirName) err := cm.NewCronTask(Nightly, func(ctx context.Context) error { return cleanupRepoGraveyard(ctx, graveyardpath) }) diff --git a/gitrpc/server/cron/clean_slate_data_test.go b/gitrpc/server/cron/clean_slate_data_test.go index a76dacc3a..a9531a9a4 100644 --- a/gitrpc/server/cron/clean_slate_data_test.go +++ b/gitrpc/server/cron/clean_slate_data_test.go @@ -1,8 +1,11 @@ +// Copyright 2022 Harness Inc. All rights reserved. +// Use of this source code is governed by the Polyform Free Trial License +// that can be found in the LICENSE.md file for this repository. + package cron import ( "context" - "io/ioutil" "os" "testing" ) @@ -10,8 +13,8 @@ import ( func TestCleanupRepoGraveyardFunc(t *testing.T) { ctx := context.Background() tmpDir := t.TempDir() - //create a dummy repository - testRepo, _ := ioutil.TempDir(tmpDir, "TestRepo100") + // create a dummy repository + testRepo, _ := os.MkdirTemp(tmpDir, "TestRepo100") err := cleanupRepoGraveyard(ctx, tmpDir) if err != nil { t.Error("cleanupRepoGraveyard failed") diff --git a/gitrpc/server/cron/cronmanager.go b/gitrpc/server/cron/manager.go similarity index 68% rename from gitrpc/server/cron/cronmanager.go rename to gitrpc/server/cron/manager.go index 4bd76dbf7..9a4e36bd5 100644 --- a/gitrpc/server/cron/cronmanager.go +++ b/gitrpc/server/cron/manager.go @@ -1,3 +1,7 @@ +// Copyright 2022 Harness Inc. All rights reserved. +// Use of this source code is governed by the Polyform Free Trial License +// that can be found in the LICENSE.md file for this repository. + package cron import ( @@ -9,8 +13,8 @@ import ( "github.com/rs/zerolog/log" ) +// Format: seconds minute(0-59) hour(0-23) day of month(1-31) month(1-12) day of week(0-6). const ( - //Format: seconds minute(0-59) hour(0-23) day of month(1-31) month(1-12) day of week(0-6) Hourly = "0 0 * * * *" // once an hour at minute 0 Nightly = "0 0 0 * * *" // once a day at midnight Weekly = "0 0 0 * * 0" // once a week on Sun midnight @@ -18,25 +22,25 @@ const ( EverySecond = "* * * * * *" // every second (for testing) ) -var ErrFatal = errors.New("fatal error occured") +var ErrFatal = errors.New("fatal error occurred") -type CronManager struct { +type Manager struct { c *cron.Cron ctx context.Context cancel context.CancelFunc fatal chan error } -// options could be location, logger, etc. -func NewCronManager() *CronManager { - return &CronManager{ +// NewManager creates a cron manager. +func NewManager() *Manager { + return &Manager{ c: cron.New(cron.WithSeconds()), fatal: make(chan error), } } -// add a new func to cron job -func (c *CronManager) NewCronTask(sepc string, job func(ctx context.Context) error) error { +// NewCronTask adds a new func to cron job. +func (c *Manager) NewCronTask(sepc string, job func(ctx context.Context) error) error { _, err := c.c.AddFunc(sepc, func() { jerr := job(c.ctx) if jerr != nil { // check different severity of errors @@ -55,7 +59,7 @@ func (c *CronManager) NewCronTask(sepc string, job func(ctx context.Context) err } // Run the cron scheduler, or no-op if already running. -func (c *CronManager) Run(ctx context.Context) error { +func (c *Manager) Run(ctx context.Context) error { c.ctx, c.cancel = context.WithCancel(ctx) var err error go func() { @@ -63,7 +67,7 @@ func (c *CronManager) Run(ctx context.Context) error { case <-ctx.Done(): err = fmt.Errorf("context done: %w", ctx.Err()) case fErr := <-c.fatal: - err = fmt.Errorf("fatal error occured: %w", fErr) + err = fmt.Errorf("fatal error occurred: %w", fErr) } // stop scheduling of new jobs. diff --git a/gitrpc/server/cron/cronmanager_test.go b/gitrpc/server/cron/manager_test.go similarity index 82% rename from gitrpc/server/cron/cronmanager_test.go rename to gitrpc/server/cron/manager_test.go index 4fc22f311..1956aab0c 100644 --- a/gitrpc/server/cron/cronmanager_test.go +++ b/gitrpc/server/cron/manager_test.go @@ -1,3 +1,7 @@ +// Copyright 2022 Harness Inc. All rights reserved. +// Use of this source code is governed by the Polyform Free Trial License +// that can be found in the LICENSE.md file for this repository. + package cron import ( @@ -8,7 +12,7 @@ import ( "time" ) -func run(cmngr *CronManager, ctx context.Context) chan error { +func run(ctx context.Context, cmngr *Manager) chan error { cron := make(chan error) go func() { cron <- cmngr.Run(ctx) @@ -17,14 +21,14 @@ func run(cmngr *CronManager, ctx context.Context) chan error { } func TestCronManagerFatalErr(t *testing.T) { - cmngr := NewCronManager() + cmngr := NewManager() ctx, cancel := context.WithCancel(context.Background()) defer cancel() _ = cmngr.NewCronTask(EverySecond, func(ctx context.Context) error { return fmt.Errorf("inner: %w", ErrFatal) }) select { - case ferr := <-run(cmngr, ctx): + case ferr := <-run(ctx, cmngr): if ferr == nil { t.Error("Cronmanager failed to receive fatal error") } @@ -34,14 +38,14 @@ func TestCronManagerFatalErr(t *testing.T) { } func TestCronManagerNonFatalErr(t *testing.T) { - cmngr := NewCronManager() + cmngr := NewManager() ctx, cancel := context.WithCancel(context.Background()) defer cancel() _ = cmngr.NewCronTask(EverySecond, func(ctx context.Context) error { return errors.New("dummy error") }) select { - case ferr := <-run(cmngr, ctx): + case ferr := <-run(ctx, cmngr): if ferr != nil { t.Error("Cronmanager failed at a non fatal error") } @@ -50,7 +54,7 @@ func TestCronManagerNonFatalErr(t *testing.T) { } } func TestCronManagerNewTask(t *testing.T) { - cmngr := NewCronManager() + cmngr := NewManager() ctx, cancel := context.WithCancel(context.Background()) defer cancel() a := 0 @@ -61,7 +65,7 @@ func TestCronManagerNewTask(t *testing.T) { }) select { - case cerr := <-run(cmngr, ctx): + case cerr := <-run(ctx, cmngr): if cerr != nil { t.Error("Cronmanager failed at Run:", cerr) } @@ -73,7 +77,7 @@ func TestCronManagerNewTask(t *testing.T) { } func TestCronManagerStopOnCtxCancel(t *testing.T) { - cmngr := NewCronManager() + cmngr := NewManager() ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() @@ -88,7 +92,7 @@ func TestCronManagerStopOnCtxCancel(t *testing.T) { } func TestCronManagerStopOnCtxTimeout(t *testing.T) { - cmngr := NewCronManager() + cmngr := NewManager() ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) defer cancel() diff --git a/gitrpc/server/cron/wire.go b/gitrpc/server/cron/wire.go index 586007702..204244c0e 100644 --- a/gitrpc/server/cron/wire.go +++ b/gitrpc/server/cron/wire.go @@ -1,15 +1,20 @@ +// Copyright 2022 Harness Inc. All rights reserved. +// Use of this source code is governed by the Polyform Free Trial License +// that can be found in the LICENSE.md file for this repository. + package cron import ( - "github.com/google/wire" "github.com/harness/gitness/gitrpc/server" + + "github.com/google/wire" ) // WireSet provides a wire set for this package. -var WireSet = wire.NewSet(ProvideCronManager) +var WireSet = wire.NewSet(ProvideManager) -func ProvideCronManager(gitrpcconfig server.Config) *CronManager { - cmngr := NewCronManager() +func ProvideManager(gitrpcconfig server.Config) *Manager { + cmngr := NewManager() _ = AddAllGitRPCCronJobs(cmngr, gitrpcconfig) return cmngr } diff --git a/gitrpc/tag.go b/gitrpc/tag.go index c534f5aa3..738419f4b 100644 --- a/gitrpc/tag.go +++ b/gitrpc/tag.go @@ -60,13 +60,13 @@ func (p *CreateTagParams) Validate() error { } if p.Name == "" { - return errors.New("Tag name cannot be empty") + return errors.New("tag name cannot be empty") } if p.SHA == "" { - return errors.New("Target cannot be empty") + return errors.New("target cannot be empty") } if p.Message == "" { - return errors.New("Message cannot be empty") + return errors.New("message cannot be empty") } return nil } @@ -140,7 +140,6 @@ func (c *Client) ListCommitTags(ctx context.Context, params *ListCommitTagsParam return output, nil } func (c *Client) CreateTag(ctx context.Context, params *CreateTagParams) (*CreateTagOutput, error) { - err := params.Validate() if err != nil { @@ -167,11 +166,9 @@ func (c *Client) CreateTag(ctx context.Context, params *CreateTagParams) (*Creat return &CreateTagOutput{ CommitTag: *commitTag, }, nil - } func (c *Client) DeleteTag(ctx context.Context, params *DeleteTagParams) error { - err := params.Validate() if err != nil { diff --git a/internal/api/controller/pullreq/comment_status.go b/internal/api/controller/pullreq/comment_status.go index baceb0786..ee57577f4 100644 --- a/internal/api/controller/pullreq/comment_status.go +++ b/internal/api/controller/pullreq/comment_status.go @@ -64,7 +64,7 @@ func (c *Controller) CommentStatus( return errValidate } - act, err = c.getCommentCheckChangeStatusAccess(ctx, session, pr, commentID) + act, err = c.getCommentCheckChangeStatusAccess(ctx, pr, commentID) if err != nil { return fmt.Errorf("failed to get comment: %w", err) } diff --git a/internal/api/controller/pullreq/controller.go b/internal/api/controller/pullreq/controller.go index 8209c1f82..0f6cd3658 100644 --- a/internal/api/controller/pullreq/controller.go +++ b/internal/api/controller/pullreq/controller.go @@ -122,7 +122,7 @@ func (c *Controller) getRepoCheckAccess(ctx context.Context, } func (c *Controller) getCommentCheckModifyAccess(ctx context.Context, - session *auth.Session, pr *types.PullReq, commentID int64, + pr *types.PullReq, commentID int64, ) (*types.PullReqActivity, error) { if commentID <= 0 { return nil, usererror.BadRequest("A valid comment ID must be provided.") @@ -155,7 +155,7 @@ func (c *Controller) getCommentCheckModifyAccess(ctx context.Context, func (c *Controller) getCommentCheckEditAccess(ctx context.Context, session *auth.Session, pr *types.PullReq, commentID int64, ) (*types.PullReqActivity, error) { - comment, err := c.getCommentCheckModifyAccess(ctx, session, pr, commentID) + comment, err := c.getCommentCheckModifyAccess(ctx, pr, commentID) if err != nil { return nil, err } @@ -168,9 +168,9 @@ func (c *Controller) getCommentCheckEditAccess(ctx context.Context, } func (c *Controller) getCommentCheckChangeStatusAccess(ctx context.Context, - session *auth.Session, pr *types.PullReq, commentID int64, + pr *types.PullReq, commentID int64, ) (*types.PullReqActivity, error) { - comment, err := c.getCommentCheckModifyAccess(ctx, session, pr, commentID) + comment, err := c.getCommentCheckModifyAccess(ctx, pr, commentID) if err != nil { return nil, err } diff --git a/internal/api/controller/pullreq/merge.go b/internal/api/controller/pullreq/merge.go index 8a1612a10..d96f43436 100644 --- a/internal/api/controller/pullreq/merge.go +++ b/internal/api/controller/pullreq/merge.go @@ -29,7 +29,7 @@ type MergeInput struct { // Merge merges the pull request. // -//nolint:funlen // no need to refactor +//nolint:gocognit func (c *Controller) Merge( ctx context.Context, session *auth.Session, @@ -84,11 +84,15 @@ func (c *Controller) Merge( } if pr.UnresolvedCount > 0 { - return types.MergeResponse{}, usererror.BadRequest("Pull requests with unresolved comments can't be merged. Resolve all the comments first.") + return types.MergeResponse{}, usererror.BadRequest( + "Pull requests with unresolved comments can't be merged. Resolve all the comments first.", + ) } if pr.IsDraft { - return types.MergeResponse{}, usererror.BadRequest("Draft pull requests can't be merged. Clear the draft flag first.") + return types.MergeResponse{}, usererror.BadRequest( + "Draft pull requests can't be merged. Clear the draft flag first.", + ) } reviewers, err := c.reviewerStore.List(ctx, pr.ID) diff --git a/internal/api/controller/pullreq/pr_create.go b/internal/api/controller/pullreq/pr_create.go index b80ef2a2a..7faae2982 100644 --- a/internal/api/controller/pullreq/pr_create.go +++ b/internal/api/controller/pullreq/pr_create.go @@ -92,7 +92,7 @@ func (c *Controller) Create( return nil }) if err != nil { - return nil, fmt.Errorf("failed to aquire PullReqSeq number: %w", err) + return nil, fmt.Errorf("failed to acquire PullReqSeq number: %w", err) } pr := newPullReq(session, targetRepo.PullReqSeq, sourceRepo, targetRepo, in, sourceSHA, mergeBaseSHA) diff --git a/internal/api/controller/repo/create_tag.go b/internal/api/controller/repo/create_tag.go index a8b2f7140..ebb0d9cbf 100644 --- a/internal/api/controller/repo/create_tag.go +++ b/internal/api/controller/repo/create_tag.go @@ -7,6 +7,7 @@ package repo import ( "context" "fmt" + "github.com/harness/gitness/gitrpc" apiauth "github.com/harness/gitness/internal/api/auth" "github.com/harness/gitness/internal/auth" @@ -57,7 +58,7 @@ func (c *Controller) CreateTag(ctx context.Context, session *auth.Session, commitTag, err := mapCommitTag(rpcOut.CommitTag) if err != nil { - return nil, fmt.Errorf("failed to map tag recieved from service output: %w", err) + return nil, fmt.Errorf("failed to map tag received from service output: %w", err) } return &commitTag, nil } diff --git a/internal/api/controller/repo/get_commit_divergences.go b/internal/api/controller/repo/get_commit_divergences.go index 7da5e3994..62925273a 100644 --- a/internal/api/controller/repo/get_commit_divergences.go +++ b/internal/api/controller/repo/get_commit_divergences.go @@ -27,7 +27,7 @@ type CommitDivergenceRequest struct { // From is the ref from which the counting of the diverging commits starts. From string `json:"from"` // To is the ref at which the counting of the diverging commits ends. - // If the value is empty the divergence is caluclated to the default branch of the repo. + // If the value is empty the divergence is calculated to the default branch of the repo. To string `json:"to"` } diff --git a/internal/api/controller/repo/list_commits.go b/internal/api/controller/repo/list_commits.go index 42ff1caa8..c5a4a0f42 100644 --- a/internal/api/controller/repo/list_commits.go +++ b/internal/api/controller/repo/list_commits.go @@ -20,7 +20,7 @@ import ( * ListCommits lists the commits of a repo. */ func (c *Controller) ListCommits(ctx context.Context, session *auth.Session, - repoRef string, gitRef string, filter *types.CommitFilter, path string) ([]types.Commit, *types.RenameDetails, error) { + repoRef string, gitRef string, filter *types.CommitFilter) ([]types.Commit, *types.RenameDetails, error) { repo, err := c.repoStore.FindByRef(ctx, repoRef) if err != nil { return nil, nil, err @@ -41,7 +41,9 @@ func (c *Controller) ListCommits(ctx context.Context, session *auth.Session, After: filter.After, Page: int32(filter.Page), Limit: int32(filter.Limit), - Path: path, + Path: filter.Path, + Since: filter.Since, + Until: filter.Until, }) if err != nil { return nil, nil, err diff --git a/internal/api/controller/serviceaccount/delete.go b/internal/api/controller/serviceaccount/delete.go index 84b1c8985..5289e9a30 100644 --- a/internal/api/controller/serviceaccount/delete.go +++ b/internal/api/controller/serviceaccount/delete.go @@ -13,7 +13,7 @@ import ( "github.com/harness/gitness/types/enum" ) -// Delete deletes a sevice account. +// Delete deletes a service account. func (c *Controller) Delete(ctx context.Context, session *auth.Session, saUID string) error { sa, err := findServiceAccountFromUID(ctx, c.principalStore, saUID) diff --git a/internal/api/controller/serviceaccount/delete_token.go b/internal/api/controller/serviceaccount/delete_token.go index e2c0b1504..087cac545 100644 --- a/internal/api/controller/serviceaccount/delete_token.go +++ b/internal/api/controller/serviceaccount/delete_token.go @@ -15,7 +15,7 @@ import ( "github.com/rs/zerolog/log" ) -// DeleteToken deletes a token of a sevice account. +// DeleteToken deletes a token of a service account. func (c *Controller) DeleteToken(ctx context.Context, session *auth.Session, saUID string, tokenUID string) error { sa, err := findServiceAccountFromUID(ctx, c.principalStore, saUID) diff --git a/internal/api/controller/space/delete.go b/internal/api/controller/space/delete.go index 39e8ca28d..1b8f7d9a5 100644 --- a/internal/api/controller/space/delete.go +++ b/internal/api/controller/space/delete.go @@ -35,8 +35,13 @@ func (c *Controller) Delete(ctx context.Context, session *auth.Session, spaceRef } // DeleteNoAuth bypasses these permission -// PermissionSpaceDelete, PermissionSpaceView, PermissionRepoView, PermissionRepoDelete -func (c *Controller) DeleteNoAuth(ctx context.Context, session *auth.Session, spaceID int64, filter *types.SpaceFilter) error { +// PermissionSpaceDelete, PermissionSpaceView, PermissionRepoView, PermissionRepoDelete. +func (c *Controller) DeleteNoAuth( + ctx context.Context, + session *auth.Session, + spaceID int64, + filter *types.SpaceFilter, +) error { subSpaces, _, err := c.ListSpacesNoAuth(ctx, spaceID, filter) if err != nil { return fmt.Errorf("failed to list space %d sub spaces: %w", spaceID, err) diff --git a/internal/api/controller/space/delete_repositories.go b/internal/api/controller/space/delete_repositories.go index 8711c8af8..d3c8f0fcd 100644 --- a/internal/api/controller/space/delete_repositories.go +++ b/internal/api/controller/space/delete_repositories.go @@ -1,3 +1,7 @@ +// Copyright 2022 Harness Inc. All rights reserved. +// Use of this source code is governed by the Polyform Free Trial License +// that can be found in the LICENSE.md file for this repository. + package space import ( @@ -11,7 +15,7 @@ import ( ) // deleteRepositoriesNoAuth does not check PermissionRepoView, and PermissionRepoDelete permissions -// Call this through Delete(Space) api to make sure the caller has DeleteSpace permission +// Call this through Delete(Space) api to make sure the caller has DeleteSpace permission. func (c *Controller) deleteRepositoriesNoAuth(ctx context.Context, session *auth.Session, spaceID int64) error { filter := &types.RepoFilter{ Page: 1, diff --git a/internal/api/controller/space/list_repositories.go b/internal/api/controller/space/list_repositories.go index ba63f546d..9311ca501 100644 --- a/internal/api/controller/space/list_repositories.go +++ b/internal/api/controller/space/list_repositories.go @@ -26,11 +26,14 @@ func (c *Controller) ListRepositories(ctx context.Context, session *auth.Session return nil, 0, err } return c.ListRepositoriesNoAuth(ctx, space.ID, filter) - } // ListRepositoriesNoAuth list repositories WITHOUT checking for PermissionRepoView. -func (c *Controller) ListRepositoriesNoAuth(ctx context.Context, spaceID int64, filter *types.RepoFilter) ([]*types.Repository, int64, error) { +func (c *Controller) ListRepositoriesNoAuth( + ctx context.Context, + spaceID int64, + filter *types.RepoFilter, +) ([]*types.Repository, int64, error) { count, err := c.repoStore.Count(ctx, spaceID, filter) if err != nil { return nil, 0, fmt.Errorf("failed to count child repos: %w", err) diff --git a/internal/api/controller/space/list_spaces.go b/internal/api/controller/space/list_spaces.go index 97e4b7220..2e2d7db83 100644 --- a/internal/api/controller/space/list_spaces.go +++ b/internal/api/controller/space/list_spaces.go @@ -29,7 +29,11 @@ func (c *Controller) ListSpaces(ctx context.Context, session *auth.Session, } // List spaces WITHOUT checking PermissionSpaceView. -func (c *Controller) ListSpacesNoAuth(ctx context.Context, spaceID int64, filter *types.SpaceFilter) ([]*types.Space, int64, error) { +func (c *Controller) ListSpacesNoAuth( + ctx context.Context, + spaceID int64, + filter *types.SpaceFilter, +) ([]*types.Space, int64, error) { count, err := c.spaceStore.Count(ctx, spaceID, filter) if err != nil { return nil, 0, fmt.Errorf("failed to count child spaces: %w", err) diff --git a/internal/api/controller/tx.go b/internal/api/controller/tx.go index b97e56063..38f2509d2 100644 --- a/internal/api/controller/tx.go +++ b/internal/api/controller/tx.go @@ -7,8 +7,10 @@ package controller import ( "context" "errors" + "github.com/harness/gitness/internal/store" "github.com/harness/gitness/internal/store/database/dbtx" + "github.com/jmoiron/sqlx" ) @@ -16,7 +18,7 @@ type TxOptionRetryCount int // TxOptLock runs the provided function inside a database transaction. If optimistic lock error occurs // during the operation, the function will retry the whole transaction again (to the maximum of 5 times, -// but this can be overridden by providing an additional TxOptionRetryCount option) +// but this can be overridden by providing an additional TxOptionRetryCount option). func TxOptLock(ctx context.Context, db *sqlx.DB, txFn func(ctx context.Context) error, diff --git a/internal/api/handler/repo/list_commits.go b/internal/api/handler/repo/list_commits.go index 1834b290f..6ab3b278a 100644 --- a/internal/api/handler/repo/list_commits.go +++ b/internal/api/handler/repo/list_commits.go @@ -28,9 +28,13 @@ func HandleListCommits(repoCtrl *repo.Controller) http.HandlerFunc { gitRef := request.GetGitRefFromQueryOrDefault(r, "") - filter := request.ParseCommitFilter(r) + filter, err := request.ParseCommitFilter(r) + if err != nil { + render.TranslatedUserError(w, err) + return + } - commits, _, err := repoCtrl.ListCommits(ctx, session, repoRef, gitRef, filter, "") + commits, _, err := repoCtrl.ListCommits(ctx, session, repoRef, gitRef, filter) if err != nil { render.TranslatedUserError(w, err) return @@ -58,11 +62,13 @@ func HandleListCommitsV2(repoCtrl *repo.Controller) http.HandlerFunc { gitRef := request.GetGitRefFromQueryOrDefault(r, "") - filter := request.ParseCommitFilter(r) + filter, err := request.ParseCommitFilter(r) + if err != nil { + render.TranslatedUserError(w, err) + return + } - path := request.GetPathFromQueryOrDefault(r, "") - - commits, renameDetails, err := repoCtrl.ListCommits(ctx, session, repoRef, gitRef, filter, path) + commits, renameDetails, err := repoCtrl.ListCommits(ctx, session, repoRef, gitRef, filter) if err != nil { render.TranslatedUserError(w, err) return diff --git a/internal/api/middleware/authn/authn.go b/internal/api/middleware/authn/authn.go index ad645d88b..d3c7eae20 100644 --- a/internal/api/middleware/authn/authn.go +++ b/internal/api/middleware/authn/authn.go @@ -19,25 +19,25 @@ import ( // Attempt returns an http.HandlerFunc middleware that authenticates // the http.Request if authentication payload is available. func Attempt(authenticator authn.Authenticator) func(http.Handler) http.Handler { - return performAuthentication(authenticator, false) + return performAuthentication(authenticator, false, authn.AuthGitCaller) } // Required returns an http.HandlerFunc middleware that authenticates // the http.Request and fails the request if no auth data was available. func Required(authenticator authn.Authenticator) func(http.Handler) http.Handler { - return performAuthentication(authenticator, true) + return performAuthentication(authenticator, true, authn.AuthAPICaller) } // performAuthentication returns an http.HandlerFunc middleware that authenticates // the http.Request if authentication payload is available. // Depending on whether it is required or not, the request will be failed. -func performAuthentication(authenticator authn.Authenticator, required bool) func(http.Handler) http.Handler { +func performAuthentication(authenticator authn.Authenticator, required bool, caller authn.APICaller) func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ctx := r.Context() log := hlog.FromRequest(r) - session, err := authenticator.Authenticate(r) + session, err := authenticator.Authenticate(r, caller) if errors.Is(err, authn.ErrNoAuthData) { if required { diff --git a/internal/api/openapi/repo.go b/internal/api/openapi/repo.go index 76568b947..8bca57d4a 100644 --- a/internal/api/openapi/repo.go +++ b/internal/api/openapi/repo.go @@ -182,6 +182,34 @@ var queryParameterPath = openapi3.ParameterOrRef{ }, } +var queryParameterSince = openapi3.ParameterOrRef{ + Parameter: &openapi3.Parameter{ + Name: request.QuerySince, + In: openapi3.ParameterInQuery, + Description: ptr.String("Epoch since when commit information should be retrieved."), + Required: ptr.Bool(false), + Schema: &openapi3.SchemaOrRef{ + Schema: &openapi3.Schema{ + Type: ptrSchemaType(openapi3.SchemaTypeInteger), + }, + }, + }, +} + +var queryParameterUntil = openapi3.ParameterOrRef{ + Parameter: &openapi3.Parameter{ + Name: request.QueryUntil, + In: openapi3.ParameterInQuery, + Description: ptr.String("Epoch until when commit information should be retrieved."), + Required: ptr.Bool(false), + Schema: &openapi3.SchemaOrRef{ + Schema: &openapi3.Schema{ + Type: ptrSchemaType(openapi3.SchemaTypeInteger), + }, + }, + }, +} + var queryParameterIncludeCommit = openapi3.ParameterOrRef{ Parameter: &openapi3.Parameter{ Name: request.QueryParamIncludeCommit, @@ -483,7 +511,7 @@ func repoOperations(reflector *openapi3.Reflector) { opListCommitsV2.WithTags("repository") opListCommitsV2.WithMapOfAnything(map[string]interface{}{"operationId": "listCommitsV2"}) opListCommitsV2.WithParameters(queryParameterGitRef, queryParameterAfterCommits, queryParameterPath, - queryParameterPage, queryParameterLimit) + queryParameterSince, queryParameterUntil, queryParameterPage, queryParameterLimit) _ = reflector.SetRequest(&opListCommitsV2, new(listCommitsRequest), http.MethodGet) _ = reflector.SetJSONResponse(&opListCommitsV2, []types.ListCommitResponse{}, http.StatusOK) _ = reflector.SetJSONResponse(&opListCommitsV2, new(usererror.Error), http.StatusInternalServerError) diff --git a/internal/api/render/header.go b/internal/api/render/header.go index d0e300be0..319e45cc3 100644 --- a/internal/api/render/header.go +++ b/internal/api/render/header.go @@ -23,7 +23,7 @@ func Pagination(r *http.Request, w http.ResponseWriter, page, size, total int) { // Add information that doesn't require total PaginationNoTotal(r, w, page, size, page >= last) - // add information that requries total + // add information that requires total uri := getPaginationBaseURL(r, page, size) params := uri.Query() diff --git a/internal/api/request/git.go b/internal/api/request/git.go index 47d0af28c..96672895c 100644 --- a/internal/api/request/git.go +++ b/internal/api/request/git.go @@ -18,6 +18,8 @@ const ( QueryLineFrom = "line_from" QueryLineTo = "line_to" QueryPath = "path" + QuerySince = "since" + QueryUntil = "until" ) func GetGitRefFromQueryOrDefault(r *http.Request, deflt string) string { @@ -69,16 +71,35 @@ func ParseTagFilter(r *http.Request) *types.TagFilter { } // ParseCommitFilter extracts the commit filter from the url. -func ParseCommitFilter(r *http.Request) *types.CommitFilter { +func ParseCommitFilter(r *http.Request) (*types.CommitFilter, error) { + since, err := QueryParamAsPositiveInt64(r, QuerySince) + if err != nil { + return nil, err + } + until, err := QueryParamAsPositiveInt64(r, QueryUntil) + if err != nil { + return nil, err + } return &types.CommitFilter{ After: QueryParamOrDefault(r, QueryParamAfter, ""), PaginationFilter: types.PaginationFilter{ Page: ParsePage(r), Limit: ParseLimit(r), }, - } + Path: QueryParamOrDefault(r, QueryPath, ""), + Since: since, + Until: until, + }, nil } func GetPathFromQueryOrDefault(r *http.Request, deflt string) string { return QueryParamOrDefault(r, QueryPath, deflt) } + +func GetSinceFromQuery(r *http.Request) (int64, error) { + return QueryParamAsPositiveInt64(r, QuerySince) +} + +func GetUntilFromQuery(r *http.Request) (int64, error) { + return QueryParamAsPositiveInt64(r, QueryUntil) +} diff --git a/internal/api/usererror/usererror.go b/internal/api/usererror/usererror.go index 5b51cd83f..dc3026aa6 100644 --- a/internal/api/usererror/usererror.go +++ b/internal/api/usererror/usererror.go @@ -11,7 +11,7 @@ import ( var ( // ErrInternal is returned when an internal error occurred. - ErrInternal = New(http.StatusInternalServerError, "Internal error occured") + ErrInternal = New(http.StatusInternalServerError, "Internal error occurred") // ErrInvalidToken is returned when the api request token is invalid. ErrInvalidToken = New(http.StatusUnauthorized, "Invalid or missing token") diff --git a/internal/auth/authn/authenticator.go b/internal/auth/authn/authenticator.go index fd157da1f..a63e4c13d 100644 --- a/internal/auth/authn/authenticator.go +++ b/internal/auth/authn/authenticator.go @@ -14,6 +14,16 @@ import ( var ( // ErrNoAuthData that is returned if the authorizer doesn't find any data in the request that can be used for auth. ErrNoAuthData = errors.New("the request doesn't contain any auth data that can be used by the Authorizer") + // ErrNotAcceptedAuthData that is returned if the request is using an auth data that is not accepted by the authorizer. + // e.g, don't accept jwt (without allowedURI field) for git clone/pull request. + ErrNotAcceptedAuthMethod = errors.New("the request contains auth method that is not accepted by the Authorizer") +) + +type APICaller string + +const ( + AuthAPICaller APICaller = "api" + AuthGitCaller APICaller = "git" ) // Authenticator is an abstraction of an entity that's responsible for authenticating principals @@ -26,5 +36,5 @@ type Authenticator interface { * (nil, ErrNoAuthData) - request doesn't contain any auth data * (nil, err) - request contains auth data but verification failed */ - Authenticate(r *http.Request) (*auth.Session, error) + Authenticate(r *http.Request, caller APICaller) (*auth.Session, error) } diff --git a/internal/auth/authn/token.go b/internal/auth/authn/token.go index 75d9e87f1..b2dc748f3 100644 --- a/internal/auth/authn/token.go +++ b/internal/auth/authn/token.go @@ -38,7 +38,7 @@ func NewTokenAuthenticator( } } -func (a *TokenAuthenticator) Authenticate(r *http.Request) (*auth.Session, error) { +func (a *TokenAuthenticator) Authenticate(r *http.Request, caller APICaller) (*auth.Session, error) { ctx := r.Context() str := extractToken(r) diff --git a/internal/auth/authz/authz.go b/internal/auth/authz/authz.go index fb4409910..9695c4d17 100644 --- a/internal/auth/authz/authz.go +++ b/internal/auth/authz/authz.go @@ -26,7 +26,7 @@ type Authorizer interface { * Returns * (true, nil) - the action is permitted * (false, nil) - the action is not permitted - * (false, err) - an error occured while performing the permission check and the action should be denied + * (false, err) - an error occurred while performing the permission check and the action should be denied */ Check(ctx context.Context, session *auth.Session, @@ -40,7 +40,7 @@ type Authorizer interface { * Returns * (true, nil) - all requested actions are permitted * (false, nil) - at least one requested action is not permitted - * (false, err) - an error occured while performing the permission check and all actions should be denied + * (false, err) - an error occurred while performing the permission check and all actions should be denied */ CheckAll(ctx context.Context, session *auth.Session, diff --git a/internal/githook/cli.go b/internal/githook/cli.go index 7eeea5737..86b6cd72c 100644 --- a/internal/githook/cli.go +++ b/internal/githook/cli.go @@ -38,7 +38,7 @@ var ( ExecutionTimeout = 3 * time.Minute ) -// SanitizeArgsForGit sanitizes the command line arguments (os.Args) if the command indicates they are comming from git. +// SanitizeArgsForGit sanitizes the command line arguments (os.Args) if the command indicates they are coming from git. // Returns the santized args and true if the call comes from git, otherwise the original args are returned with false. func SanitizeArgsForGit(command string, args []string) ([]string, bool) { switch command { diff --git a/internal/githook/githook.go b/internal/githook/githook.go index 58d3d3990..fcff5187f 100644 --- a/internal/githook/githook.go +++ b/internal/githook/githook.go @@ -105,7 +105,7 @@ func (c *GitHook) PostReceive(ctx context.Context) error { func handleServerHookOutput(out *types.ServerHookOutput, err error) error { if err != nil { - return fmt.Errorf("an error occured when calling the server: %w", err) + return fmt.Errorf("an error occurred when calling the server: %w", err) } if out == nil { diff --git a/internal/router/api.go b/internal/router/api.go index 453736788..9747989cd 100644 --- a/internal/router/api.go +++ b/internal/router/api.go @@ -314,7 +314,7 @@ func SetupWebhook(r chi.Router, webhookCtrl *webhook.Controller) { func setupUser(r chi.Router, userCtrl *user.Controller) { r.Route("/user", func(r chi.Router) { - // enforce principial authenticated and it's a user + // enforce principal authenticated and it's a user r.Use(middlewareprincipal.RestrictTo(enum.PrincipalTypeUser)) r.Get("/", handleruser.HandleFind(userCtrl)) diff --git a/internal/services/webhook/trigger.go b/internal/services/webhook/trigger.go index 06ec33f3a..271c089fd 100644 --- a/internal/services/webhook/trigger.go +++ b/internal/services/webhook/trigger.go @@ -178,7 +178,7 @@ func (s *Service) executeWebhook(ctx context.Context, webhook *types.Webhook, tr TriggerType: triggerType, // for unexpected errors we don't retry - protect the system. User can retrigger manually (if body was set) Result: enum.WebhookExecutionResultFatalError, - Error: "An unknown error occured", + Error: "An unknown error occurred", } defer func(oCtx context.Context, start time.Time) { // set total execution time @@ -253,7 +253,7 @@ func (s *Service) executeWebhook(ctx context.Context, webhook *types.Webhook, tr case err != nil: // for all other errors we don't retry - protect the system. User can retrigger manually (if body was set) - tErr := fmt.Errorf("an error occured while sending the request: %w", err) + tErr := fmt.Errorf("an error occurred while sending the request: %w", err) execution.Error = tErr.Error() execution.Result = enum.WebhookExecutionResultFatalError return &execution, tErr @@ -298,7 +298,7 @@ func (s *Service) prepareHTTPRequest(ctx context.Context, execution *types.Webho err := json.NewEncoder(bBuff).Encode(body) if err != nil { // this is an internal issue, nothing the user can do - don't expose error details - execution.Error = "an error occured preparing the request body" + execution.Error = "an error occurred preparing the request body" execution.Result = enum.WebhookExecutionResultFatalError return nil, fmt.Errorf("failed to serialize body to json: %w", err) } @@ -380,7 +380,7 @@ func handleWebhookResponse(execution *types.WebhookExecution, resp *http.Respons var bodyRaw []byte bodyRaw, err = io.ReadAll(io.LimitReader(resp.Body, responseBodyBytesLimit)) if err != nil { - tErr := fmt.Errorf("an error occured while reading the response body: %w", err) + tErr := fmt.Errorf("an error occurred while reading the response body: %w", err) execution.Error = tErr.Error() execution.Result = enum.WebhookExecutionResultRetriableError return tErr diff --git a/internal/store/transformation.go b/internal/store/transformation.go index 43ecc6b87..9311dc95e 100644 --- a/internal/store/transformation.go +++ b/internal/store/transformation.go @@ -9,7 +9,7 @@ import ( ) // PrincipalUIDTransformation transforms a principalUID to a value that should be duplicate free. -// This allows us to simply switch between principalUIDs being case sensitive, insensitive or anything inbetween. +// This allows us to simply switch between principalUIDs being case sensitive, insensitive or anything in between. type PrincipalUIDTransformation func(uid string) (string, error) func ToLowerPrincipalUIDTransformation(uid string) (string, error) { @@ -17,7 +17,7 @@ func ToLowerPrincipalUIDTransformation(uid string) (string, error) { } // PathTransformation transforms a path to a value that should be duplicate free. -// This allows us to simply switch between paths being case sensitive, insensitive or anything inbetween. +// This allows us to simply switch between paths being case sensitive, insensitive or anything in between. type PathTransformation func(string) (string, error) func ToLowerPathTransformation(original string) (string, error) { diff --git a/mocks/gomock_reflect_975878678/prog.bin b/mocks/gomock_reflect_975878678/prog.bin deleted file mode 100755 index bc9e1b518..000000000 Binary files a/mocks/gomock_reflect_975878678/prog.bin and /dev/null differ diff --git a/mocks/gomock_reflect_975878678/prog.go b/mocks/gomock_reflect_975878678/prog.go deleted file mode 100644 index 5a6b6261a..000000000 --- a/mocks/gomock_reflect_975878678/prog.go +++ /dev/null @@ -1,70 +0,0 @@ - -package main - -import ( - "encoding/gob" - "flag" - "fmt" - "os" - "path" - "reflect" - - "github.com/golang/mock/mockgen/model" - - pkg_ "github.com/harness/gitness/internal/store" -) - -var output = flag.String("output", "", "The output file name, or empty to use stdout.") - -func main() { - flag.Parse() - - its := []struct{ - sym string - typ reflect.Type - }{ - - { "PrincipalStore", reflect.TypeOf((*pkg_.PrincipalStore)(nil)).Elem()}, - - { "SpaceStore", reflect.TypeOf((*pkg_.SpaceStore)(nil)).Elem()}, - - { "RepoStore", reflect.TypeOf((*pkg_.RepoStore)(nil)).Elem()}, - - } - pkg := &model.Package{ - // NOTE: This behaves contrary to documented behaviour if the - // package name is not the final component of the import path. - // The reflect package doesn't expose the package name, though. - Name: path.Base("github.com/harness/gitness/internal/store"), - } - - for _, it := range its { - intf, err := model.InterfaceFromInterfaceType(it.typ) - if err != nil { - fmt.Fprintf(os.Stderr, "Reflection: %v\n", err) - os.Exit(1) - } - intf.Name = it.sym - pkg.Interfaces = append(pkg.Interfaces, intf) - } - - outfile := os.Stdout - if len(*output) != 0 { - var err error - outfile, err = os.Create(*output) - if err != nil { - fmt.Fprintf(os.Stderr, "failed to open output file %q", *output) - } - defer func() { - if err := outfile.Close(); err != nil { - fmt.Fprintf(os.Stderr, "failed to close output file %q", *output) - os.Exit(1) - } - }() - } - - if err := gob.NewEncoder(outfile).Encode(pkg); err != nil { - fmt.Fprintf(os.Stderr, "gob encode: %v\n", err) - os.Exit(1) - } -} diff --git a/mocks/mock_client.go b/mocks/mock_client.go index 3216e04cb..fbd985bd4 100644 --- a/mocks/mock_client.go +++ b/mocks/mock_client.go @@ -8,9 +8,10 @@ import ( context "context" reflect "reflect" - gomock "github.com/golang/mock/gomock" user "github.com/harness/gitness/internal/api/controller/user" types "github.com/harness/gitness/types" + + gomock "github.com/golang/mock/gomock" ) // MockClient is a mock of Client interface. diff --git a/mocks/mock_store.go b/mocks/mock_store.go index 30b7ec550..8ad9973bf 100644 --- a/mocks/mock_store.go +++ b/mocks/mock_store.go @@ -8,9 +8,10 @@ import ( context "context" reflect "reflect" - gomock "github.com/golang/mock/gomock" types "github.com/harness/gitness/types" enum "github.com/harness/gitness/types/enum" + + gomock "github.com/golang/mock/gomock" ) // MockPrincipalStore is a mock of PrincipalStore interface. diff --git a/stream/options.go b/stream/options.go index 3a041f1c3..5b9b13d56 100644 --- a/stream/options.go +++ b/stream/options.go @@ -16,7 +16,7 @@ const ( // MaxMaxRetries is the max number of retries of a message for a single consumer group. MaxMaxRetries = 64 - // MinIdleTimeout is the minumum time that can be configured as idle timeout for a stream consumer. + // MinIdleTimeout is the minimum time that can be configured as idle timeout for a stream consumer. MinIdleTimeout = 5 * time.Second ) diff --git a/types/git.go b/types/git.go index 52e1303d6..602697ec4 100644 --- a/types/git.go +++ b/types/git.go @@ -22,6 +22,9 @@ type PaginationFilter struct { type CommitFilter struct { PaginationFilter After string `json:"after"` + Path string `json:"path"` + Since int64 `json:"since"` + Until int64 `json:"until"` } // BranchFilter stores branch query parameters.