diff --git a/modules/git/fastimport.go b/modules/git/fastimport.go index 048bd4a3e56..6bf0c5e32e9 100644 --- a/modules/git/fastimport.go +++ b/modules/git/fastimport.go @@ -29,6 +29,8 @@ type FastImportCommit struct { Ref string Message string Files []FastImportFile + + Author, Committer *Signature } // ForceFastImportWithInit is for mainly for testing purpose @@ -48,15 +50,32 @@ func ForceFastImportWithInit(ctx context.Context, repoLocalPath string, commits // ForceFastImport is for mainly for testing purpose func ForceFastImport(ctx context.Context, repo RepositoryFacade, commits []FastImportCommit) error { - var buf bytes.Buffer + buf := &bytes.Buffer{} for i, c := range commits { - msg := util.IfZero(c.Message, fmt.Sprintf("commit %d", i+1)) - _, _ = fmt.Fprintf(&buf, "reset %s\n", c.Ref) - _, _ = fmt.Fprintf(&buf, "commit %s\nmark :%d\ncommitter Gitea 1500000000 +0000\n", c.Ref, i+1) - _, _ = fmt.Fprintf(&buf, "data %d\n%s\n", len(msg), msg) + _, _ = fmt.Fprintf(buf, "reset %s\n", c.Ref) + _, _ = fmt.Fprintf(buf, "commit %s\n", c.Ref) + _, _ = fmt.Fprintf(buf, "mark :%d\n", i+1) + + if c.Author != nil { + buf.WriteString("author ") + _ = c.Author.Encode(buf) + buf.WriteByte('\n') + } + if c.Committer != nil { + buf.WriteString("committer ") + _ = c.Committer.Encode(buf) + buf.WriteByte('\n') + } else { + // "committer" is required, so we use a default one if not provided + buf.WriteString("committer Gitea 1500000000 +0000\n") + } + + msg := util.IfZero(c.Message, fmt.Sprintf("test commit %d", i+1)) + _, _ = fmt.Fprintf(buf, "data %d\n%s\n", len(msg), msg) + for _, f := range c.Files { mode := util.IfZero(f.Mode, EntryModeBlob) - _, _ = fmt.Fprintf(&buf, "M %s inline %s\ndata %d\n%s\n", mode.String(), f.Path, len(f.Content), f.Content) + _, _ = fmt.Fprintf(buf, "M %s inline %s\ndata %d\n%s\n", mode.String(), f.Path, len(f.Content), f.Content) } } buf.WriteString("done\n") diff --git a/modules/git/signature_nogogit.go b/modules/git/signature_nogogit.go index d4ddfb23ce8..7a61d8d7eb0 100644 --- a/modules/git/signature_nogogit.go +++ b/modules/git/signature_nogogit.go @@ -8,6 +8,7 @@ package git import ( "fmt" + "io" "time" "gitea.dev/modules/util" @@ -24,7 +25,13 @@ func (s *Signature) String() string { return fmt.Sprintf("%s <%s>", s.Name, s.Email) } -// Decode decodes a byte array representing a signature to signature +// Encode writes the signature for git commit object (same as gogit's object.Signature Encode method) +func (s *Signature) Encode(w io.Writer) error { + _, err := fmt.Fprintf(w, "%s <%s> %d %s", s.Name, s.Email, max(0, s.When.Unix()), s.When.Format("-0700")) + return err +} + +// Decode parses the signature for git commit object (same as gogit's object.Signature Decode method) func (s *Signature) Decode(b []byte) { *s = *parseSignatureFromCommitLine(util.UnsafeBytesToString(b)) } diff --git a/modules/test/utils.go b/modules/test/utils.go index 514a9a1141b..fc1211c1e97 100644 --- a/modules/test/utils.go +++ b/modules/test/utils.go @@ -64,7 +64,7 @@ func ParseJSONRedirect(buf []byte) (ret struct { } func IsNormalPageCompleted(s string) bool { - return strings.Contains(s, `