diff options
author | Tiago Botelho <tiagonbotelho@hotmail.com> | 2018-09-11 15:26:53 +0300 |
---|---|---|
committer | Tiago Botelho <tiagonbotelho@hotmail.com> | 2018-09-24 17:29:21 +0300 |
commit | aad4516ff2db3d61447635b31c5982e70c63ad55 (patch) | |
tree | 53fdfb1d432fe49c4adb5067da8760867b1cffdd | |
parent | 0772a2be216304c412a7b136817df83396ebfcf3 (diff) |
Adds ListLastCommitsForTree
-rw-r--r-- | internal/git/ls_tree/last_commits.go | 39 | ||||
-rw-r--r-- | internal/service/commit/list_last_commits_for_tree.go | 38 |
2 files changed, 77 insertions, 0 deletions
diff --git a/internal/git/ls_tree/last_commits.go b/internal/git/ls_tree/last_commits.go new file mode 100644 index 000000000..914c9d945 --- /dev/null +++ b/internal/git/ls_tree/last_commits.go @@ -0,0 +1,39 @@ +package ls_tree + +import ( + "context" + "io/ioutil" + "regexp" + "strings" + + "gitlab.com/gitlab-org/gitaly/internal/command" + "gitlab.com/gitlab-org/gitaly/internal/git" + + pb "gitlab.com/gitlab-org/gitaly-proto/go" + + "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" + log "github.com/sirupsen/logrus" +) + +func LastCommitsForTree(ctx context.Context, repo *pb.Repository, revision string, path string) (*pb.GitCommit, error) { + var commits []*pb.GitCommit + + cmd, err := git.Command(ctx, repo, "ls-tree", "-z", "--full-name", revision, "--", path) + if err != nil { + return nil, err + } + + contents, err := ioutil.ReadAll(cmd) + if err != nil { + return nil, err + } + + re := regex.MustCompile("[0-9a-f]{40}") + commitIDs := re.FindAllString(contents, -1) + + for _, commitID := range commitIDs { + append(commits, GetCommit(ctx, repo, strings.TrimSpace(string(commitID)))) + } + + return commits, nil +} diff --git a/internal/service/commit/list_last_commits_for_tree.go b/internal/service/commit/list_last_commits_for_tree.go new file mode 100644 index 000000000..bede08bfb --- /dev/null +++ b/internal/service/commit/list_last_commits_for_tree.go @@ -0,0 +1,38 @@ +package commit + +import ( + "fmt" + + "gitlab.com/gitlab-org/gitaly/internal/git/ls_tree" + + pb "gitlab.com/gitlab-org/gitaly-proto/go" + + "golang.org/x/net/context" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (s *server) ListLastCommitsForTree(ctx context.Context, in *pb.ListLastCommitsForTreeRequest) (*pb.ListLastCommitsForTreeResponse, error) { + if err := validateListLastCommitsForTreeRequest(in); err != nil { + return nil, status.Errorf(codes.InvalidArgument, "ListLastCommitsForTree: %v", err) + } + + path := string(in.GetPath()) + if len(path) == 0 || path == "/" { + path = "." + } + + commits, err := ls_tree.LastCommitsForTree(ctx, in.GetRepository(), string(in.GetRevision()), path) + if err != nil { + return nil, err + } + + return &pb.ListLastCommitsForTreeResponse{Commits: commits}, nil +} + +func validateListLastCommitsForTreeRequest(in *pb.ListLastCommitsForTreeRequest) error { + if len(in.Revision) == 0 { + return fmt.Errorf("empty Revision") + } + return nil +} |