diff options
author | KN4CK3R <admin@oldschoolhack.me> | 2023-12-01 02:26:52 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-01 01:26:52 +0000 |
commit | 14354e4f8edb35b6ff46ea066098fc1d9fe93d5a (patch) | |
tree | ef2495e132a6a1c1e3c0cfe6247fa081bb84937c /modules/git/blame.go | |
parent | 3618715fab1e5e3a26d1184398bf4134eb45e6e6 (diff) | |
download | gitea-14354e4f8edb35b6ff46ea066098fc1d9fe93d5a.tar.gz gitea-14354e4f8edb35b6ff46ea066098fc1d9fe93d5a.zip |
Read `previous` info from git blame (#28306)
Fixes #28280
Reads the `previous` info from the `git blame` output instead of
calculating it afterwards.
Diffstat (limited to 'modules/git/blame.go')
-rw-r--r-- | modules/git/blame.go | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/modules/git/blame.go b/modules/git/blame.go index 6728a6bed8..93c7f184fa 100644 --- a/modules/git/blame.go +++ b/modules/git/blame.go @@ -11,6 +11,7 @@ import ( "io" "os" "regexp" + "strings" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/util" @@ -18,8 +19,10 @@ import ( // BlamePart represents block of blame - continuous lines with one sha type BlamePart struct { - Sha string - Lines []string + Sha string + Lines []string + PreviousSha string + PreviousPath string } // BlameReader returns part of file blame one by one @@ -43,30 +46,38 @@ func (r *BlameReader) NextPart() (*BlamePart, error) { var blamePart *BlamePart if r.lastSha != nil { - blamePart = &BlamePart{*r.lastSha, make([]string, 0)} + blamePart = &BlamePart{ + Sha: *r.lastSha, + Lines: make([]string, 0), + } } - var line []byte + var lineBytes []byte var isPrefix bool var err error for err != io.EOF { - line, isPrefix, err = r.bufferedReader.ReadLine() + lineBytes, isPrefix, err = r.bufferedReader.ReadLine() if err != nil && err != io.EOF { return blamePart, err } - if len(line) == 0 { + if len(lineBytes) == 0 { // isPrefix will be false continue } - lines := shaLineRegex.FindSubmatch(line) + line := string(lineBytes) + + lines := shaLineRegex.FindStringSubmatch(line) if lines != nil { - sha1 := string(lines[1]) + sha1 := lines[1] if blamePart == nil { - blamePart = &BlamePart{sha1, make([]string, 0)} + blamePart = &BlamePart{ + Sha: sha1, + Lines: make([]string, 0), + } } if blamePart.Sha != sha1 { @@ -81,9 +92,11 @@ func (r *BlameReader) NextPart() (*BlamePart, error) { return blamePart, nil } } else if line[0] == '\t' { - code := line[1:] - - blamePart.Lines = append(blamePart.Lines, string(code)) + blamePart.Lines = append(blamePart.Lines, line[1:]) + } else if strings.HasPrefix(line, "previous ") { + parts := strings.SplitN(line[len("previous "):], " ", 2) + blamePart.PreviousSha = parts[0] + blamePart.PreviousPath = parts[1] } // need to munch to end of line... |