* Add require signed commit for protected branch * Fix fmt * Make editor show if they will be signed * bugfix * Add basic merge check and better information for CRUD * linting comment * Add descriptors to merge signing * Slight refactor * Slight improvement to appearances * Handle Merge API * manage CRUD API * Move error to error.go * Remove fix to delete.go * prep for merge * need to tolerate \r\n in message * check protected branch before trying to load it * Apply suggestions from code review Co-Authored-By: guillep2k <18600385+guillep2k@users.noreply.github.com> * fix commit-reader
Showing the changes to modules/git/commit_reader.go (1 of 29 files). Show all
Unified · Split
| @@ -0,0 +1,108 @@ | |||
| 1 | // Copyright 2020 The Gitea Authors. All rights reserved. | ||
| 2 | // Use of this source code is governed by a MIT-style | ||
| 3 | // license that can be found in the LICENSE file. | ||
| 4 | |||
| 5 | package git | ||
| 6 | |||
| 7 | import ( | ||
| 8 | "bufio" | ||
| 9 | "bytes" | ||
| 10 | "io" | ||
| 11 | "strings" | ||
| 12 | |||
| 13 | "gopkg.in/src-d/go-git.v4/plumbing" | ||
| 14 | ) | ||
| 15 | |||
| 16 | // CommitFromReader will generate a Commit from a provided reader | ||
| 17 | // We will need this to interpret commits from cat-file | ||
| 18 | func CommitFromReader(gitRepo *Repository, sha plumbing.Hash, reader io.Reader) (*Commit, error) { | ||
| 19 | commit := &Commit{ | ||
| 20 | ID: sha, | ||
| 21 | } | ||
| 22 | |||
| 23 | payloadSB := new(strings.Builder) | ||
| 24 | signatureSB := new(strings.Builder) | ||
| 25 | messageSB := new(strings.Builder) | ||
| 26 | message := false | ||
| 27 | pgpsig := false | ||
| 28 | |||
| 29 | scanner := bufio.NewScanner(reader) | ||
| 30 | // Split by '\n' but include the '\n' | ||
| 31 | scanner.Split(func(data []byte, atEOF bool) (advance int, token []byte, err error) { | ||
| 32 | if atEOF && len(data) == 0 { | ||
| 33 | return 0, nil, nil | ||
| 34 | } | ||
| 35 | if i := bytes.IndexByte(data, '\n'); i >= 0 { | ||
| 36 | // We have a full newline-terminated line. | ||
| 37 | return i + 1, data[0 : i+1], nil | ||
| 38 | } | ||
| 39 | // If we're at EOF, we have a final, non-terminated line. Return it. | ||
| 40 | if atEOF { | ||
| 41 | return len(data), data, nil | ||
| 42 | } | ||
| 43 | // Request more data. | ||
| 44 | return 0, nil, nil | ||
| 45 | }) | ||
| 46 | |||
| 47 | for scanner.Scan() { | ||
| 48 | line := scanner.Bytes() | ||
| 49 | if pgpsig { | ||
| 50 | if len(line) > 0 && line[0] == ' ' { | ||
| 51 | _, _ = signatureSB.Write(line[1:]) | ||
| 52 | continue | ||
| 53 | } else { | ||
| 54 | pgpsig = false | ||
| 55 | } | ||
| 56 | } | ||
| 57 | |||
| 58 | if !message { | ||
| 59 | // This is probably not correct but is copied from go-gits interpretation... | ||
| 60 | trimmed := bytes.TrimSpace(line) | ||
| 61 | if len(trimmed) == 0 { | ||
| 62 | message = true | ||
| 63 | _, _ = payloadSB.Write(line) | ||
| 64 | continue | ||
| 65 | } | ||
| 66 | |||
| 67 | split := bytes.SplitN(trimmed, []byte{' '}, 2) | ||
| 68 | var data []byte | ||
| 69 | if len(split) > 1 { | ||
| 70 | data = split[1] | ||
| 71 | } | ||
| 72 | |||
| 73 | switch string(split[0]) { | ||
| 74 | case "tree": | ||
| 75 | commit.Tree = *NewTree(gitRepo, plumbing.NewHash(string(data))) | ||
| 76 | _, _ = payloadSB.Write(line) | ||
| 77 | case "parent": | ||
| 78 | commit.Parents = append(commit.Parents, plumbing.NewHash(string(data))) | ||
| 79 | _, _ = payloadSB.Write(line) | ||
| 80 | case "author": | ||
| 81 | commit.Author = &Signature{} | ||
| 82 | commit.Author.Decode(data) | ||
| 83 | _, _ = payloadSB.Write(line) | ||
| 84 | case "committer": | ||
| 85 | commit.Committer = &Signature{} | ||
| 86 | commit.Committer.Decode(data) | ||
| 87 | _, _ = payloadSB.Write(line) | ||
| 88 | case "gpgsig": | ||
| 89 | _, _ = signatureSB.Write(data) | ||
| 90 | _ = signatureSB.WriteByte('\n') | ||
| 91 | pgpsig = true | ||
| 92 | } | ||
| 93 | } else { | ||
| 94 | _, _ = messageSB.Write(line) | ||
| 95 | } | ||
| 96 | } | ||
| 97 | commit.CommitMessage = messageSB.String() | ||
| 98 | _, _ = payloadSB.WriteString(commit.CommitMessage) | ||
| 99 | commit.Signature = &CommitGPGSignature{ | ||
| 100 | Signature: signatureSB.String(), | ||
| 101 | Payload: payloadSB.String(), | ||
| 102 | } | ||
| 103 | if len(commit.Signature.Signature) == 0 { | ||
| 104 | commit.Signature = nil | ||
| 105 | } | ||
| 106 | |||
| 107 | return commit, scanner.Err() | ||
| 108 | } | ||