* 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 | +} | |