in internal/gitaly/service/commit/find_commits.go [240:312]
func getLogCommandSubCmd(req *gitalypb.FindCommitsRequest) gitcmd.Command {
logFormatOption := "--format=%H"
// To split the commits by '\x01' instead of '\n'
if req.GetIncludeShortstat() {
logFormatOption = "--format=%x01%H"
}
if req.GetTrailers() {
logFormatOption += "%x00%(trailers:unfold,separator=%x00)"
}
if len(req.GetIncludeReferencedBy()) > 0 {
// Delimit ref names with '\x02' to avoid confusing with trailers
logFormatOption += "%x02%D"
}
subCmd := gitcmd.Command{Name: "log", Flags: []gitcmd.Option{gitcmd.Flag{Name: logFormatOption}}}
// We will perform the offset in Go because --follow doesn't play well with --skip.
// See: https://gitlab.com/gitlab-org/gitlab-ce/issues/3574#note_3040520
if req.GetOffset() > 0 && !calculateOffsetManually(req) {
subCmd.Flags = append(subCmd.Flags, gitcmd.Flag{Name: fmt.Sprintf("--skip=%d", req.GetOffset())})
}
limit := req.GetLimit()
if calculateOffsetManually(req) {
limit += req.GetOffset()
}
subCmd.Flags = append(subCmd.Flags, gitcmd.Flag{Name: fmt.Sprintf("--max-count=%d", limit)})
if req.GetFollow() && len(req.GetPaths()) > 0 {
subCmd.Flags = append(subCmd.Flags, gitcmd.Flag{Name: "--follow"})
}
if req.GetAuthor() != nil {
subCmd.Flags = append(subCmd.Flags, gitcmd.Flag{Name: fmt.Sprintf("--author=%s", string(req.GetAuthor()))})
}
if req.GetSkipMerges() {
subCmd.Flags = append(subCmd.Flags, gitcmd.Flag{Name: "--no-merges"})
}
if req.GetBefore() != nil {
subCmd.Flags = append(subCmd.Flags, gitcmd.Flag{Name: fmt.Sprintf("--before=%s", req.GetBefore().String())})
}
if req.GetAfter() != nil {
subCmd.Flags = append(subCmd.Flags, gitcmd.Flag{Name: fmt.Sprintf("--after=%s", req.GetAfter().String())})
}
if req.GetAll() {
subCmd.Flags = append(subCmd.Flags, gitcmd.Flag{Name: "--all"}, gitcmd.Flag{Name: "--reverse"})
}
if req.GetRevision() != nil {
subCmd.Args = []string{string(req.GetRevision())}
}
if req.GetFirstParent() {
subCmd.Flags = append(subCmd.Flags, gitcmd.Flag{Name: "--first-parent"})
}
if len(req.GetPaths()) > 0 {
for _, path := range req.GetPaths() {
subCmd.PostSepArgs = append(subCmd.PostSepArgs, string(path))
}
}
if req.GetOrder() == gitalypb.FindCommitsRequest_TOPO {
subCmd.Flags = append(subCmd.Flags, gitcmd.Flag{Name: "--topo-order"})
}
if req.GetIncludeShortstat() {
subCmd.Flags = append(subCmd.Flags, gitcmd.Flag{Name: "--shortstat"})
}
if len(req.GetIncludeReferencedBy()) > 0 {
subCmd.Flags = append(subCmd.Flags, gitcmd.Flag{Name: "--decorate=full"})
for _, pattern := range req.GetIncludeReferencedBy() {
subCmd.Flags = append(subCmd.Flags, gitcmd.Flag{Name: fmt.Sprintf("--decorate-refs=%s", pattern)})
}
}
return subCmd
}