Bump github.com/go-git/go-git/v5 from 5.17.0 to 5.17.1 (#91)

Bumps [github.com/go-git/go-git/v5](https://github.com/go-git/go-git) from 5.17.0 to 5.17.1.
- [Release notes](https://github.com/go-git/go-git/releases)
- [Commits](https://github.com/go-git/go-git/compare/v5.17.0...v5.17.1)

---
updated-dependencies:
- dependency-name: github.com/go-git/go-git/v5
  dependency-version: 5.17.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This commit is contained in:
dependabot[bot] authored and GitHub committed 2026-03-30 20:22:15 +08:00
1 parent 5084956c5f
commit c2ef65abe3
8 files changed
+120 -67

No files matched your search

+2 -2
View File
@@ -5,7 +5,7 @@ go 1.25.0
require (
github.com/adrg/xdg v0.5.3
github.com/fatih/color v1.19.0
github.com/go-git/go-git/v5 v5.17.0
github.com/go-git/go-git/v5 v5.17.1
github.com/hashicorp/go-version v1.8.0
github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf
github.com/stretchr/testify v1.11.1
@@ -17,7 +17,7 @@ require (
dario.cat/mergo v1.0.1 // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/ProtonMail/go-crypto v1.1.6 // indirect
github.com/cloudflare/circl v1.6.1 // indirect
github.com/cloudflare/circl v1.6.3 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect
github.com/cyphar/filepath-securejoin v0.4.1 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
+4 -4
View File
@@ -11,8 +11,8 @@ github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFI
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
github.com/cloudflare/circl v1.6.3 h1:9GPOhQGF9MCYUeXyMYlqTR6a5gTrgR/fBLXvUgtVcg8=
github.com/cloudflare/circl v1.6.3/go.mod h1:2eXP6Qfat4O/Yhh8BznvKnJ+uzEoTQ6jVKJRn81BiS4=
github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo=
github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s=
@@ -34,8 +34,8 @@ github.com/go-git/go-billy/v5 v5.8.0 h1:I8hjc3LbBlXTtVuFNJuwYuMiHvQJDq1AT6u4DwDz
github.com/go-git/go-billy/v5 v5.8.0/go.mod h1:RpvI/rw4Vr5QA+Z60c6d6LXH0rYJo0uD5SqfmrrheCY=
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4=
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII=
github.com/go-git/go-git/v5 v5.17.0 h1:AbyI4xf+7DsjINHMu35quAh4wJygKBKBuXVjV/pxesM=
github.com/go-git/go-git/v5 v5.17.0/go.mod h1:f82C4YiLx+Lhi8eHxltLeGC5uBTXSFa6PC5WW9o4SjI=
github.com/go-git/go-git/v5 v5.17.1 h1:WnljyxIzSj9BRRUlnmAU35ohDsjRK0EKmL0evDqi5Jk=
github.com/go-git/go-git/v5 v5.17.1/go.mod h1:pW/VmeqkanRFqR6AljLcs7EA7FbZaN5MQqO7oZADXpo=
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
+3 -3
View File
@@ -14,14 +14,14 @@ import "unsafe"
type storageBuf [maxRate / 8]uint64
func (b *storageBuf) asBytes() *[maxRate]byte {
return (*[maxRate]byte)(unsafe.Pointer(b))
return (*[maxRate]byte)(unsafe.Pointer(b)) //nolint:gosec
}
// xorInuses unaligned reads and writes to update d.a to contain d.a
// XOR buf.
func xorIn(d *State, buf []byte) {
n := len(buf)
bw := (*[maxRate / 8]uint64)(unsafe.Pointer(&buf[0]))[: n/8 : n/8]
bw := (*[maxRate / 8]uint64)(unsafe.Pointer(&buf[0]))[: n/8 : n/8] //nolint:gosec
if n >= 72 {
d.a[0] ^= bw[0]
d.a[1] ^= bw[1]
@@ -56,6 +56,6 @@ func xorIn(d *State, buf []byte) {
}
func copyOut(d *State, buf []byte) {
ab := (*[maxRate]uint8)(unsafe.Pointer(&d.a[0]))
ab := (*[maxRate]uint8)(unsafe.Pointer(&d.a[0])) //nolint:gosec
copy(buf, ab[:])
}
+6
View File
@@ -38,6 +38,12 @@ type PrivateKey interface {
encoding.BinaryMarshaler
}
// A private key that retains the seed with which it was generated.
type Seeded interface {
// returns the seed if retained, otherwise nil
Seed() []byte
}
// A Scheme represents a specific instance of a signature scheme.
type Scheme interface {
// Name of the scheme.
+7 -3
View File
@@ -91,8 +91,8 @@ func readVersion(idx *MemoryIndex, r io.Reader) error {
return err
}
if v > VersionSupported {
return ErrUnsupportedVersion
if v != VersionSupported {
return fmt.Errorf("%w: v%d", ErrUnsupportedVersion, v)
}
idx.Version = v
@@ -106,6 +106,10 @@ func readFanout(idx *MemoryIndex, r io.Reader) error {
return err
}
if k > 0 && n < idx.Fanout[k-1] {
return fmt.Errorf("%w: fanout table is not monotonically non-decreasing at entry %d", ErrMalformedIdxFile, k)
}
idx.Fanout[k] = n
idx.FanoutMapping[k] = noMapping
}
@@ -155,7 +159,7 @@ func readCRC32(idx *MemoryIndex, r io.Reader) error {
}
func readOffsets(idx *MemoryIndex, r io.Reader) error {
var o64cnt int
var o64cnt int64
for k := 0; k < fanout; k++ {
if pos := idx.FanoutMapping[k]; pos != noMapping {
if _, err := io.ReadFull(r, idx.Offset32[pos]); err != nil {
+71 -39
View File
@@ -4,8 +4,8 @@ import (
"bufio"
"bytes"
"errors"
"fmt"
"io"
"strconv"
"time"
@@ -26,12 +26,14 @@ var (
ErrInvalidChecksum = errors.New("invalid checksum")
// ErrUnknownExtension is returned when an index extension is encountered that is considered mandatory
ErrUnknownExtension = errors.New("unknown extension")
// ErrMalformedIndexFile is returned when the index file contents are
// structurally invalid.
ErrMalformedIndexFile = errors.New("index decoder: malformed index file")
)
const (
entryHeaderLength = 62
entryExtended = 0x4000
entryValid = 0x8000
nameMask = 0xfff
intentToAddMask = 1 << 13
skipWorkTreeMask = 1 << 14
@@ -140,33 +142,55 @@ func (d *Decoder) readEntry(idx *Index) (*Entry, error) {
e.SkipWorktree = extended&skipWorkTreeMask != 0
}
if err := d.readEntryName(idx, e, flags); err != nil {
nameConsumed, err := d.readEntryName(idx, e, flags)
if err != nil {
return nil, err
}
return e, d.padEntry(idx, e, read)
return e, d.padEntry(idx, e, read, nameConsumed)
}
func (d *Decoder) readEntryName(idx *Index, e *Entry, flags uint16) error {
var name string
var err error
// readEntryName reads the entry path and sets e.Name. It returns the
// number of bytes consumed from the stream for the name portion.
func (d *Decoder) readEntryName(idx *Index, e *Entry, flags uint16) (int, error) {
switch idx.Version {
case 2, 3:
len := flags & nameMask
name, err = d.doReadEntryName(len)
nameLen := flags & nameMask
name, consumed, err := d.doReadEntryName(nameLen)
if err != nil {
return 0, err
}
e.Name = name
return consumed, nil
case 4:
name, err = d.doReadEntryNameV4()
name, err := d.doReadEntryNameV4()
if err != nil {
return 0, err
}
e.Name = name
return 0, nil // V4 has no padding; consumed count unused
default:
return ErrUnsupportedVersion
return 0, ErrUnsupportedVersion
}
}
// doReadEntryName reads the entry path for V2/V3 indexes. It returns the
// name, the number of bytes consumed from the stream, and any error.
// When nameLen equals nameMask (0xFFF), the name was too long to fit in
// the 12-bit field and the real length is found by scanning for the NUL
// terminator — matching C Git's strlen(name) fallback in create_from_disk.
func (d *Decoder) doReadEntryName(nameLen uint16) (string, int, error) {
if nameLen == nameMask {
name, err := binary.ReadUntil(d.r, '\x00')
if err != nil {
return "", 0, err
}
return string(name), len(name) + 1, nil // +1 for the consumed NUL delimiter
}
if err != nil {
return err
}
e.Name = name
return nil
name := make([]byte, nameLen)
_, err := io.ReadFull(d.r, name)
return string(name), int(nameLen), err
}
func (d *Decoder) doReadEntryNameV4() (string, error) {
@@ -177,7 +201,14 @@ func (d *Decoder) doReadEntryNameV4() (string, error) {
var base string
if d.lastEntry != nil {
if l < 0 || int(l) > len(d.lastEntry.Name) {
return "", fmt.Errorf("%w: invalid V4 entry name strip length %d (previous name length: %d)",
ErrMalformedIndexFile, l, len(d.lastEntry.Name))
}
base = d.lastEntry.Name[:len(d.lastEntry.Name)-int(l)]
} else if l > 0 {
return "", fmt.Errorf("%w: non-zero strip length %d on first V4 entry",
ErrMalformedIndexFile, l)
}
name, err := binary.ReadUntil(d.r, '\x00')
@@ -188,24 +219,23 @@ func (d *Decoder) doReadEntryNameV4() (string, error) {
return base + string(name), nil
}
func (d *Decoder) doReadEntryName(len uint16) (string, error) {
name := make([]byte, len)
_, err := io.ReadFull(d.r, name)
return string(name), err
}
// Index entries are padded out to the next 8 byte alignment
// for historical reasons related to how C Git read the files.
func (d *Decoder) padEntry(idx *Index, e *Entry, read int) error {
// padEntry discards NUL padding bytes that follow each V2/V3 entry on
// disk. nameConsumed is the number of stream bytes consumed while reading
// the entry name (which may exceed len(e.Name) when a NUL terminator was
// consumed for long names where the 12-bit length field overflowed).
func (d *Decoder) padEntry(idx *Index, e *Entry, read, nameConsumed int) error {
if idx.Version == 4 {
return nil
}
entrySize := read + len(e.Name)
padLen := 8 - entrySize%8
_, err := io.CopyN(io.Discard, d.r, int64(padLen))
return err
padLen -= nameConsumed - len(e.Name)
if padLen > 0 {
_, err := io.CopyN(io.Discard, d.r, int64(padLen))
return err
}
return nil
}
func (d *Decoder) readExtensions(idx *Index) error {
@@ -312,7 +342,7 @@ func (d *Decoder) readChecksum(expected []byte) error {
}
func validateHeader(r io.Reader) (version uint32, err error) {
var s = make([]byte, 4)
s := make([]byte, 4)
if _, err := io.ReadFull(r, s); err != nil {
return 0, err
}
@@ -376,24 +406,26 @@ func (d *treeExtensionDecoder) readEntry() (*TreeEntry, error) {
return nil, err
}
// An entry can be in an invalidated state and is represented by having a
// negative number in the entry_count field.
if i == -1 {
return nil, nil
}
e.Entries = i
trees, err := binary.ReadUntil(d.r, '\n')
if err != nil {
return nil, err
}
i, err = strconv.Atoi(string(trees))
subtrees, err := strconv.Atoi(string(trees))
if err != nil {
return nil, err
}
e.Trees = i
e.Trees = subtrees
// An entry can be in an invalidated state and is represented by having a
// negative number in the entry_count field. In this case, there is no
// object name and the next entry starts immediately after the newline.
if i < 0 {
return nil, nil
}
_, err = io.ReadFull(d.r, e.Hash[:])
if err != nil {
return nil, err
+25 -14
View File
@@ -5,9 +5,7 @@ import (
"errors"
"fmt"
"io"
"path"
"sort"
"strings"
"time"
"github.com/go-git/go-git/v5/plumbing/hash"
@@ -160,26 +158,39 @@ func (e *Encoder) encodeEntryName(entry *Entry) error {
}
func (e *Encoder) encodeEntryNameV4(entry *Entry) error {
name := entry.Name
l := 0
// V4 prefix compression: find the longest common prefix between the
// previous entry's name and the current one. The strip length tells
// the decoder how many bytes to remove from the end of the previous
// name, and the suffix is the remainder of the current name.
prefix := 0
if e.lastEntry != nil {
dir := path.Dir(e.lastEntry.Name) + "/"
if strings.HasPrefix(entry.Name, dir) {
l = len(e.lastEntry.Name) - len(dir)
name = strings.TrimPrefix(entry.Name, dir)
} else {
l = len(e.lastEntry.Name)
}
prefix = commonPrefixLen(e.lastEntry.Name, entry.Name)
}
stripLen := 0
if e.lastEntry != nil {
stripLen = len(e.lastEntry.Name) - prefix
}
e.lastEntry = entry
err := binary.WriteVariableWidthInt(e.w, int64(l))
if err != nil {
if err := binary.WriteVariableWidthInt(e.w, int64(stripLen)); err != nil {
return err
}
return binary.Write(e.w, []byte(name+string('\x00')))
suffix := entry.Name[prefix:]
return binary.Write(e.w, append([]byte(suffix), '\x00'))
}
// commonPrefixLen returns the length of the longest common byte prefix
// between a and b.
func commonPrefixLen(a, b string) int {
n := min(len(b), len(a))
for i := range n {
if a[i] != b[i] {
return i
}
}
return n
}
func (e *Encoder) encodeRawExtension(signature string, data []byte) error {
+2 -2
View File
@@ -37,7 +37,7 @@ github.com/ProtonMail/go-crypto/openpgp/x448
github.com/adrg/xdg
github.com/adrg/xdg/internal/pathutil
github.com/adrg/xdg/internal/userdirs
# github.com/cloudflare/circl v1.6.1
# github.com/cloudflare/circl v1.6.3
## explicit; go 1.22.0
github.com/cloudflare/circl/dh/x25519
github.com/cloudflare/circl/dh/x448
@@ -85,7 +85,7 @@ github.com/go-git/go-billy/v5/helper/polyfill
github.com/go-git/go-billy/v5/memfs
github.com/go-git/go-billy/v5/osfs
github.com/go-git/go-billy/v5/util
# github.com/go-git/go-git/v5 v5.17.0
# github.com/go-git/go-git/v5 v5.17.1
## explicit; go 1.24.0
github.com/go-git/go-git/v5
github.com/go-git/go-git/v5/config