mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Adjust object format interface (#28469)
- Remove `ObjectFormatID` - Remove function `ObjectFormatFromID`. - Use `Sha1ObjectFormat` directly but not a pointer because it's an empty struct. - Store `ObjectFormatName` in `repository` struct
This commit is contained in:
		@@ -20,6 +20,7 @@ import (
 | 
				
			|||||||
func TestAddDeletedBranch(t *testing.T) {
 | 
					func TestAddDeletedBranch(t *testing.T) {
 | 
				
			||||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
						assert.NoError(t, unittest.PrepareTestDatabase())
 | 
				
			||||||
	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
 | 
						repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
 | 
				
			||||||
 | 
						assert.EqualValues(t, git.Sha1ObjectFormat.Name(), repo.ObjectFormatName)
 | 
				
			||||||
	firstBranch := unittest.AssertExistsAndLoadBean(t, &git_model.Branch{ID: 1})
 | 
						firstBranch := unittest.AssertExistsAndLoadBean(t, &git_model.Branch{ID: 1})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert.True(t, firstBranch.IsDeleted)
 | 
						assert.True(t, firstBranch.IsDeleted)
 | 
				
			||||||
@@ -29,8 +30,9 @@ func TestAddDeletedBranch(t *testing.T) {
 | 
				
			|||||||
	secondBranch := unittest.AssertExistsAndLoadBean(t, &git_model.Branch{RepoID: repo.ID, Name: "branch2"})
 | 
						secondBranch := unittest.AssertExistsAndLoadBean(t, &git_model.Branch{RepoID: repo.ID, Name: "branch2"})
 | 
				
			||||||
	assert.True(t, secondBranch.IsDeleted)
 | 
						assert.True(t, secondBranch.IsDeleted)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						objectFormat := git.ObjectFormatFromName(repo.ObjectFormatName)
 | 
				
			||||||
	commit := &git.Commit{
 | 
						commit := &git.Commit{
 | 
				
			||||||
		ID:            repo.ObjectFormat.MustIDFromString(secondBranch.CommitID),
 | 
							ID:            objectFormat.MustIDFromString(secondBranch.CommitID),
 | 
				
			||||||
		CommitMessage: secondBranch.CommitMessage,
 | 
							CommitMessage: secondBranch.CommitMessage,
 | 
				
			||||||
		Committer: &git.Signature{
 | 
							Committer: &git.Signature{
 | 
				
			||||||
			When: secondBranch.CommitTime.AsLocalTime(),
 | 
								When: secondBranch.CommitTime.AsLocalTime(),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -180,7 +180,7 @@ type Repository struct {
 | 
				
			|||||||
	IsFsckEnabled                   bool               `xorm:"NOT NULL DEFAULT true"`
 | 
						IsFsckEnabled                   bool               `xorm:"NOT NULL DEFAULT true"`
 | 
				
			||||||
	CloseIssuesViaCommitInAnyBranch bool               `xorm:"NOT NULL DEFAULT false"`
 | 
						CloseIssuesViaCommitInAnyBranch bool               `xorm:"NOT NULL DEFAULT false"`
 | 
				
			||||||
	Topics                          []string           `xorm:"TEXT JSON"`
 | 
						Topics                          []string           `xorm:"TEXT JSON"`
 | 
				
			||||||
	ObjectFormat                    git.ObjectFormat   `xorm:"-"`
 | 
						ObjectFormatName                string             `xorm:"-"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TrustModel TrustModelType
 | 
						TrustModel TrustModelType
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -277,7 +277,9 @@ func (repo *Repository) AfterLoad() {
 | 
				
			|||||||
	repo.NumOpenProjects = repo.NumProjects - repo.NumClosedProjects
 | 
						repo.NumOpenProjects = repo.NumProjects - repo.NumClosedProjects
 | 
				
			||||||
	repo.NumOpenActionRuns = repo.NumActionRuns - repo.NumClosedActionRuns
 | 
						repo.NumOpenActionRuns = repo.NumActionRuns - repo.NumClosedActionRuns
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	repo.ObjectFormat = git.ObjectFormatFromID(git.Sha1)
 | 
						// this is a temporary behaviour to support old repos, next step is to store the object format in the database
 | 
				
			||||||
 | 
						// and read from database so this line could be removed. To not depend on git module, we use a constant variable here
 | 
				
			||||||
 | 
						repo.ObjectFormatName = "sha1"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// LoadAttributes loads attributes of the repository.
 | 
					// LoadAttributes loads attributes of the repository.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -39,7 +39,7 @@ func TestReadingBlameOutput(t *testing.T) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for _, bypass := range []bool{false, true} {
 | 
							for _, bypass := range []bool{false, true} {
 | 
				
			||||||
			blameReader, err := CreateBlameReader(ctx, &Sha1ObjectFormat{}, "./tests/repos/repo5_pulls", commit, "README.md", bypass)
 | 
								blameReader, err := CreateBlameReader(ctx, Sha1ObjectFormat, "./tests/repos/repo5_pulls", commit, "README.md", bypass)
 | 
				
			||||||
			assert.NoError(t, err)
 | 
								assert.NoError(t, err)
 | 
				
			||||||
			assert.NotNil(t, blameReader)
 | 
								assert.NotNil(t, blameReader)
 | 
				
			||||||
			defer blameReader.Close()
 | 
								defer blameReader.Close()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -236,7 +236,7 @@ func (c *Commit) IsForcePush(oldCommitID string) (bool, error) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return false, err
 | 
							return false, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if oldCommitID == objectFormat.Empty().String() {
 | 
						if oldCommitID == objectFormat.EmptyObjectID().String() {
 | 
				
			||||||
		return false, nil
 | 
							return false, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,26 +5,17 @@ package git
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"crypto/sha1"
 | 
						"crypto/sha1"
 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"regexp"
 | 
						"regexp"
 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type ObjectFormatID int
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const (
 | 
					 | 
				
			||||||
	Sha1 ObjectFormatID = iota
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// sha1Pattern can be used to determine if a string is an valid sha
 | 
					// sha1Pattern can be used to determine if a string is an valid sha
 | 
				
			||||||
var sha1Pattern = regexp.MustCompile(`^[0-9a-f]{4,40}$`)
 | 
					var sha1Pattern = regexp.MustCompile(`^[0-9a-f]{4,40}$`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type ObjectFormat interface {
 | 
					type ObjectFormat interface {
 | 
				
			||||||
	ID() ObjectFormatID
 | 
						// Name returns the name of the object format
 | 
				
			||||||
	String() string
 | 
						Name() string
 | 
				
			||||||
 | 
						// EmptyObjectID creates a new empty ObjectID from an object format hash name
 | 
				
			||||||
	// Empty is the hash of empty git
 | 
						EmptyObjectID() ObjectID
 | 
				
			||||||
	Empty() ObjectID
 | 
					 | 
				
			||||||
	// EmptyTree is the hash of an empty tree
 | 
						// EmptyTree is the hash of an empty tree
 | 
				
			||||||
	EmptyTree() ObjectID
 | 
						EmptyTree() ObjectID
 | 
				
			||||||
	// FullLength is the length of the hash's hex string
 | 
						// FullLength is the length of the hash's hex string
 | 
				
			||||||
@@ -35,67 +26,71 @@ type ObjectFormat interface {
 | 
				
			|||||||
	MustIDFromString(s string) ObjectID
 | 
						MustIDFromString(s string) ObjectID
 | 
				
			||||||
	NewID(b []byte) (ObjectID, error)
 | 
						NewID(b []byte) (ObjectID, error)
 | 
				
			||||||
	NewIDFromString(s string) (ObjectID, error)
 | 
						NewIDFromString(s string) (ObjectID, error)
 | 
				
			||||||
	NewEmptyID() ObjectID
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	NewHasher() HasherInterface
 | 
						NewHasher() HasherInterface
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Sha1ObjectFormat struct{}
 | 
					type Sha1ObjectFormatImpl struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (*Sha1ObjectFormat) ID() ObjectFormatID { return Sha1 }
 | 
					var (
 | 
				
			||||||
func (*Sha1ObjectFormat) String() string     { return "sha1" }
 | 
						emptyObjectID = &Sha1Hash{}
 | 
				
			||||||
func (*Sha1ObjectFormat) Empty() ObjectID    { return &Sha1Hash{} }
 | 
						emptyTree     = &Sha1Hash{
 | 
				
			||||||
func (*Sha1ObjectFormat) EmptyTree() ObjectID {
 | 
					 | 
				
			||||||
	return &Sha1Hash{
 | 
					 | 
				
			||||||
		0x4b, 0x82, 0x5d, 0xc6, 0x42, 0xcb, 0x6e, 0xb9, 0xa0, 0x60,
 | 
							0x4b, 0x82, 0x5d, 0xc6, 0x42, 0xcb, 0x6e, 0xb9, 0xa0, 0x60,
 | 
				
			||||||
		0xe5, 0x4b, 0xf8, 0xd6, 0x92, 0x88, 0xfb, 0xee, 0x49, 0x04,
 | 
							0xe5, 0x4b, 0xf8, 0xd6, 0x92, 0x88, 0xfb, 0xee, 0x49, 0x04,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (Sha1ObjectFormatImpl) Name() string { return "sha1" }
 | 
				
			||||||
 | 
					func (Sha1ObjectFormatImpl) EmptyObjectID() ObjectID {
 | 
				
			||||||
 | 
						return emptyObjectID
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func (*Sha1ObjectFormat) FullLength() int { return 40 }
 | 
					
 | 
				
			||||||
func (*Sha1ObjectFormat) IsValid(input string) bool {
 | 
					func (Sha1ObjectFormatImpl) EmptyTree() ObjectID {
 | 
				
			||||||
 | 
						return emptyTree
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (Sha1ObjectFormatImpl) FullLength() int { return 40 }
 | 
				
			||||||
 | 
					func (Sha1ObjectFormatImpl) IsValid(input string) bool {
 | 
				
			||||||
	return sha1Pattern.MatchString(input)
 | 
						return sha1Pattern.MatchString(input)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (*Sha1ObjectFormat) MustID(b []byte) ObjectID {
 | 
					func (Sha1ObjectFormatImpl) MustID(b []byte) ObjectID {
 | 
				
			||||||
	var id Sha1Hash
 | 
						var id Sha1Hash
 | 
				
			||||||
	copy(id[0:20], b)
 | 
						copy(id[0:20], b)
 | 
				
			||||||
	return &id
 | 
						return &id
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (h *Sha1ObjectFormat) MustIDFromString(s string) ObjectID {
 | 
					func (h Sha1ObjectFormatImpl) MustIDFromString(s string) ObjectID {
 | 
				
			||||||
	return MustIDFromString(h, s)
 | 
						return MustIDFromString(h, s)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (h *Sha1ObjectFormat) NewID(b []byte) (ObjectID, error) {
 | 
					func (h Sha1ObjectFormatImpl) NewID(b []byte) (ObjectID, error) {
 | 
				
			||||||
	return IDFromRaw(h, b)
 | 
						return IDFromRaw(h, b)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (h *Sha1ObjectFormat) NewIDFromString(s string) (ObjectID, error) {
 | 
					func (h Sha1ObjectFormatImpl) NewIDFromString(s string) (ObjectID, error) {
 | 
				
			||||||
	return genericIDFromString(h, s)
 | 
						return genericIDFromString(h, s)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (*Sha1ObjectFormat) NewEmptyID() ObjectID {
 | 
					func (h Sha1ObjectFormatImpl) NewHasher() HasherInterface {
 | 
				
			||||||
	return NewSha1()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (h *Sha1ObjectFormat) NewHasher() HasherInterface {
 | 
					 | 
				
			||||||
	return &Sha1Hasher{sha1.New()}
 | 
						return &Sha1Hasher{sha1.New()}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func ObjectFormatFromID(id ObjectFormatID) ObjectFormat {
 | 
					var Sha1ObjectFormat ObjectFormat = Sha1ObjectFormatImpl{}
 | 
				
			||||||
	switch id {
 | 
					
 | 
				
			||||||
	case Sha1:
 | 
					var SupportedObjectFormats = []ObjectFormat{
 | 
				
			||||||
		return &Sha1ObjectFormat{}
 | 
						Sha1ObjectFormat,
 | 
				
			||||||
 | 
						// TODO: add sha256
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func ObjectFormatFromName(name string) ObjectFormat {
 | 
				
			||||||
 | 
						for _, objectFormat := range SupportedObjectFormats {
 | 
				
			||||||
 | 
							if name == objectFormat.Name() {
 | 
				
			||||||
 | 
								return objectFormat
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func ObjectFormatFromString(hash string) (ObjectFormat, error) {
 | 
					func IsValidObjectFormat(name string) bool {
 | 
				
			||||||
	switch strings.ToLower(hash) {
 | 
						return ObjectFormatFromName(name) != nil
 | 
				
			||||||
	case "sha1":
 | 
					 | 
				
			||||||
		return &Sha1ObjectFormat{}, nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return nil, fmt.Errorf("unknown hash type: %s", hash)
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,18 +31,15 @@ func (h *Sha1Hash) IsZero() bool {
 | 
				
			|||||||
	return bytes.Equal(empty[:], h[:])
 | 
						return bytes.Equal(empty[:], h[:])
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func (h *Sha1Hash) RawValue() []byte { return h[:] }
 | 
					func (h *Sha1Hash) RawValue() []byte { return h[:] }
 | 
				
			||||||
func (*Sha1Hash) Type() ObjectFormat { return &Sha1ObjectFormat{} }
 | 
					func (*Sha1Hash) Type() ObjectFormat { return Sha1ObjectFormat }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewSha1() *Sha1Hash {
 | 
					var _ ObjectID = &Sha1Hash{}
 | 
				
			||||||
	return &Sha1Hash{}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewHash is for generic implementations
 | 
					// EmptyObjectID creates a new ObjectID from an object format hash name
 | 
				
			||||||
func NewHash(hash string) (ObjectID, error) {
 | 
					func EmptyObjectID(objectFormatName string) (ObjectID, error) {
 | 
				
			||||||
	hash = strings.ToLower(hash)
 | 
						objectFormat := ObjectFormatFromName(objectFormatName)
 | 
				
			||||||
	switch hash {
 | 
						if objectFormat != nil {
 | 
				
			||||||
	case "sha1":
 | 
							return objectFormat.EmptyObjectID(), nil
 | 
				
			||||||
		return &Sha1Hash{}, nil
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nil, errors.New("unsupported hash type")
 | 
						return nil, errors.New("unsupported hash type")
 | 
				
			||||||
@@ -50,7 +47,7 @@ func NewHash(hash string) (ObjectID, error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func IDFromRaw(h ObjectFormat, b []byte) (ObjectID, error) {
 | 
					func IDFromRaw(h ObjectFormat, b []byte) (ObjectID, error) {
 | 
				
			||||||
	if len(b) != h.FullLength()/2 {
 | 
						if len(b) != h.FullLength()/2 {
 | 
				
			||||||
		return h.Empty(), fmt.Errorf("length must be %d: %v", h.FullLength(), b)
 | 
							return h.EmptyObjectID(), fmt.Errorf("length must be %d: %v", h.FullLength(), b)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return h.MustID(b), nil
 | 
						return h.MustID(b), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -63,24 +60,20 @@ func MustIDFromString(h ObjectFormat, s string) ObjectID {
 | 
				
			|||||||
func genericIDFromString(h ObjectFormat, s string) (ObjectID, error) {
 | 
					func genericIDFromString(h ObjectFormat, s string) (ObjectID, error) {
 | 
				
			||||||
	s = strings.TrimSpace(s)
 | 
						s = strings.TrimSpace(s)
 | 
				
			||||||
	if len(s) != h.FullLength() {
 | 
						if len(s) != h.FullLength() {
 | 
				
			||||||
		return h.Empty(), fmt.Errorf("length must be %d: %s", h.FullLength(), s)
 | 
							return h.EmptyObjectID(), fmt.Errorf("length must be %d: %s", h.FullLength(), s)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	b, err := hex.DecodeString(s)
 | 
						b, err := hex.DecodeString(s)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return h.Empty(), err
 | 
							return h.EmptyObjectID(), err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return h.NewID(b)
 | 
						return h.NewID(b)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func IDFromString(hexHash string) (ObjectID, error) {
 | 
					func IDFromString(hexHash string) (ObjectID, error) {
 | 
				
			||||||
	switch len(hexHash) {
 | 
						for _, objectFormat := range SupportedObjectFormats {
 | 
				
			||||||
	case 40:
 | 
							if len(hexHash) == objectFormat.FullLength() {
 | 
				
			||||||
		hashType := Sha1ObjectFormat{}
 | 
								return objectFormat.NewIDFromString(hexHash)
 | 
				
			||||||
		h, err := hashType.NewIDFromString(hexHash)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return h, nil
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nil, fmt.Errorf("invalid hash hex string: '%s' len: %d", hexHash, len(hexHash))
 | 
						return nil, fmt.Errorf("invalid hash hex string: '%s' len: %d", hexHash, len(hexHash))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,7 +12,7 @@ import (
 | 
				
			|||||||
func ParseGogitHash(h plumbing.Hash) ObjectID {
 | 
					func ParseGogitHash(h plumbing.Hash) ObjectID {
 | 
				
			||||||
	switch hash.Size {
 | 
						switch hash.Size {
 | 
				
			||||||
	case 20:
 | 
						case 20:
 | 
				
			||||||
		return ObjectFormatFromID(Sha1).MustID(h[:])
 | 
							return Sha1ObjectFormat.MustID(h[:])
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,7 +10,7 @@ import (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestIsValidSHAPattern(t *testing.T) {
 | 
					func TestIsValidSHAPattern(t *testing.T) {
 | 
				
			||||||
	h := NewSha1().Type()
 | 
						h := Sha1ObjectFormat
 | 
				
			||||||
	assert.True(t, h.IsValid("fee1"))
 | 
						assert.True(t, h.IsValid("fee1"))
 | 
				
			||||||
	assert.True(t, h.IsValid("abc000"))
 | 
						assert.True(t, h.IsValid("abc000"))
 | 
				
			||||||
	assert.True(t, h.IsValid("9023902390239023902390239023902390239023"))
 | 
						assert.True(t, h.IsValid("9023902390239023902390239023902390239023"))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,9 +28,9 @@ func TestParseTreeEntries(t *testing.T) {
 | 
				
			|||||||
			Input: "100644 blob 61ab7345a1a3bbc590068ccae37b8515cfc5843c    1022\texample/file2.txt\n",
 | 
								Input: "100644 blob 61ab7345a1a3bbc590068ccae37b8515cfc5843c    1022\texample/file2.txt\n",
 | 
				
			||||||
			Expected: []*TreeEntry{
 | 
								Expected: []*TreeEntry{
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					ID: ObjectFormatFromID(Sha1).MustIDFromString("61ab7345a1a3bbc590068ccae37b8515cfc5843c"),
 | 
										ID: Sha1ObjectFormat.MustIDFromString("61ab7345a1a3bbc590068ccae37b8515cfc5843c"),
 | 
				
			||||||
					gogitTreeEntry: &object.TreeEntry{
 | 
										gogitTreeEntry: &object.TreeEntry{
 | 
				
			||||||
						Hash: plumbing.Hash(ObjectFormatFromID(Sha1).MustIDFromString("61ab7345a1a3bbc590068ccae37b8515cfc5843c").RawValue()),
 | 
											Hash: plumbing.Hash(Sha1ObjectFormat.MustIDFromString("61ab7345a1a3bbc590068ccae37b8515cfc5843c").RawValue()),
 | 
				
			||||||
						Name: "example/file2.txt",
 | 
											Name: "example/file2.txt",
 | 
				
			||||||
						Mode: filemode.Regular,
 | 
											Mode: filemode.Regular,
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
@@ -44,9 +44,9 @@ func TestParseTreeEntries(t *testing.T) {
 | 
				
			|||||||
				"040000 tree 1d01fb729fb0db5881daaa6030f9f2d3cd3d5ae8       -\texample\n",
 | 
									"040000 tree 1d01fb729fb0db5881daaa6030f9f2d3cd3d5ae8       -\texample\n",
 | 
				
			||||||
			Expected: []*TreeEntry{
 | 
								Expected: []*TreeEntry{
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					ID: ObjectFormatFromID(Sha1).MustIDFromString("61ab7345a1a3bbc590068ccae37b8515cfc5843c"),
 | 
										ID: Sha1ObjectFormat.MustIDFromString("61ab7345a1a3bbc590068ccae37b8515cfc5843c"),
 | 
				
			||||||
					gogitTreeEntry: &object.TreeEntry{
 | 
										gogitTreeEntry: &object.TreeEntry{
 | 
				
			||||||
						Hash: plumbing.Hash(ObjectFormatFromID(Sha1).MustIDFromString("61ab7345a1a3bbc590068ccae37b8515cfc5843c").RawValue()),
 | 
											Hash: plumbing.Hash(Sha1ObjectFormat.MustIDFromString("61ab7345a1a3bbc590068ccae37b8515cfc5843c").RawValue()),
 | 
				
			||||||
						Name: "example/\n.txt",
 | 
											Name: "example/\n.txt",
 | 
				
			||||||
						Mode: filemode.Symlink,
 | 
											Mode: filemode.Symlink,
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
@@ -54,10 +54,10 @@ func TestParseTreeEntries(t *testing.T) {
 | 
				
			|||||||
					sized: true,
 | 
										sized: true,
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					ID:    ObjectFormatFromID(Sha1).MustIDFromString("1d01fb729fb0db5881daaa6030f9f2d3cd3d5ae8"),
 | 
										ID:    Sha1ObjectFormat.MustIDFromString("1d01fb729fb0db5881daaa6030f9f2d3cd3d5ae8"),
 | 
				
			||||||
					sized: true,
 | 
										sized: true,
 | 
				
			||||||
					gogitTreeEntry: &object.TreeEntry{
 | 
										gogitTreeEntry: &object.TreeEntry{
 | 
				
			||||||
						Hash: plumbing.Hash(ObjectFormatFromID(Sha1).MustIDFromString("1d01fb729fb0db5881daaa6030f9f2d3cd3d5ae8").RawValue()),
 | 
											Hash: plumbing.Hash(Sha1ObjectFormat.MustIDFromString("1d01fb729fb0db5881daaa6030f9f2d3cd3d5ae8").RawValue()),
 | 
				
			||||||
						Name: "example",
 | 
											Name: "example",
 | 
				
			||||||
						Mode: filemode.Dir,
 | 
											Mode: filemode.Dir,
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
@@ -67,7 +67,7 @@ func TestParseTreeEntries(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, testCase := range testCases {
 | 
						for _, testCase := range testCases {
 | 
				
			||||||
		entries, err := ParseTreeEntries(ObjectFormatFromID(Sha1), []byte(testCase.Input))
 | 
							entries, err := ParseTreeEntries(Sha1ObjectFormat, []byte(testCase.Input))
 | 
				
			||||||
		assert.NoError(t, err)
 | 
							assert.NoError(t, err)
 | 
				
			||||||
		if len(entries) > 1 {
 | 
							if len(entries) > 1 {
 | 
				
			||||||
			fmt.Println(testCase.Expected[0].ID)
 | 
								fmt.Println(testCase.Expected[0].ID)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,7 +12,7 @@ import (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestParseTreeEntriesLong(t *testing.T) {
 | 
					func TestParseTreeEntriesLong(t *testing.T) {
 | 
				
			||||||
	objectFormat := ObjectFormatFromID(Sha1)
 | 
						objectFormat := Sha1ObjectFormat
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	testCases := []struct {
 | 
						testCases := []struct {
 | 
				
			||||||
		Input    string
 | 
							Input    string
 | 
				
			||||||
@@ -66,7 +66,7 @@ func TestParseTreeEntriesLong(t *testing.T) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestParseTreeEntriesShort(t *testing.T) {
 | 
					func TestParseTreeEntriesShort(t *testing.T) {
 | 
				
			||||||
	objectFormat := ObjectFormatFromID(Sha1)
 | 
						objectFormat := Sha1ObjectFormat
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	testCases := []struct {
 | 
						testCases := []struct {
 | 
				
			||||||
		Input    string
 | 
							Input    string
 | 
				
			||||||
@@ -102,7 +102,7 @@ func TestParseTreeEntriesShort(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func TestParseTreeEntriesInvalid(t *testing.T) {
 | 
					func TestParseTreeEntriesInvalid(t *testing.T) {
 | 
				
			||||||
	// there was a panic: "runtime error: slice bounds out of range" when the input was invalid: #20315
 | 
						// there was a panic: "runtime error: slice bounds out of range" when the input was invalid: #20315
 | 
				
			||||||
	entries, err := ParseTreeEntries(ObjectFormatFromID(Sha1), []byte("100644 blob ea0d83c9081af9500ac9f804101b3fd0a5c293af"))
 | 
						entries, err := ParseTreeEntries(Sha1ObjectFormat, []byte("100644 blob ea0d83c9081af9500ac9f804101b3fd0a5c293af"))
 | 
				
			||||||
	assert.Error(t, err)
 | 
						assert.Error(t, err)
 | 
				
			||||||
	assert.Len(t, entries, 0)
 | 
						assert.Len(t, entries, 0)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -205,7 +205,7 @@ func RefURL(repoURL, ref string) string {
 | 
				
			|||||||
		return repoURL + "/src/branch/" + refName
 | 
							return repoURL + "/src/branch/" + refName
 | 
				
			||||||
	case refFullName.IsTag():
 | 
						case refFullName.IsTag():
 | 
				
			||||||
		return repoURL + "/src/tag/" + refName
 | 
							return repoURL + "/src/tag/" + refName
 | 
				
			||||||
	case !ObjectFormatFromID(Sha1).IsValid(ref):
 | 
						case !Sha1ObjectFormat.IsValid(ref):
 | 
				
			||||||
		// assume they mean a branch
 | 
							// assume they mean a branch
 | 
				
			||||||
		return repoURL + "/src/branch/" + refName
 | 
							return repoURL + "/src/branch/" + refName
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -90,7 +90,7 @@ func GetObjectFormatOfRepo(ctx context.Context, repoPath string) (ObjectFormat,
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// InitRepository initializes a new Git repository.
 | 
					// InitRepository initializes a new Git repository.
 | 
				
			||||||
func InitRepository(ctx context.Context, repoPath string, bare bool, objectFormat ObjectFormat) error {
 | 
					func InitRepository(ctx context.Context, repoPath string, bare bool, objectFormatName string) error {
 | 
				
			||||||
	err := os.MkdirAll(repoPath, os.ModePerm)
 | 
						err := os.MkdirAll(repoPath, os.ModePerm)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
@@ -98,7 +98,13 @@ func InitRepository(ctx context.Context, repoPath string, bare bool, objectForma
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	cmd := NewCommand(ctx, "init")
 | 
						cmd := NewCommand(ctx, "init")
 | 
				
			||||||
	if SupportHashSha256 {
 | 
						if SupportHashSha256 {
 | 
				
			||||||
		cmd.AddOptionValues("--object-format", objectFormat.String())
 | 
							if objectFormatName == "" {
 | 
				
			||||||
 | 
								objectFormatName = Sha1ObjectFormat.Name()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if !IsValidObjectFormat(objectFormatName) {
 | 
				
			||||||
 | 
								return fmt.Errorf("invalid object format: %s", objectFormatName)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							cmd.AddOptionValues("--object-format", objectFormatName)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if bare {
 | 
						if bare {
 | 
				
			||||||
		cmd.AddArguments("--bare")
 | 
							cmd.AddArguments("--bare")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -54,9 +54,9 @@ func (repo *Repository) ConvertToGitID(commitID string) (ObjectID, error) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		if strings.Contains(err.Error(), "unknown revision or path") ||
 | 
							if strings.Contains(err.Error(), "unknown revision or path") ||
 | 
				
			||||||
			strings.Contains(err.Error(), "fatal: Needed a single revision") {
 | 
								strings.Contains(err.Error(), "fatal: Needed a single revision") {
 | 
				
			||||||
			return objectFormat.Empty(), ErrNotExist{commitID, ""}
 | 
								return objectFormat.EmptyObjectID(), ErrNotExist{commitID, ""}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return objectFormat.Empty(), err
 | 
							return objectFormat.EmptyObjectID(), err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return objectFormat.NewIDFromString(actualCommitID)
 | 
						return objectFormat.NewIDFromString(actualCommitID)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -284,7 +284,7 @@ func (repo *Repository) GetPatch(base, head string, w io.Writer) error {
 | 
				
			|||||||
// If base is the SHA of an empty tree (EmptyTreeSHA), it returns the files changes from the initial commit to the head commit
 | 
					// If base is the SHA of an empty tree (EmptyTreeSHA), it returns the files changes from the initial commit to the head commit
 | 
				
			||||||
func (repo *Repository) GetFilesChangedBetween(base, head string) ([]string, error) {
 | 
					func (repo *Repository) GetFilesChangedBetween(base, head string) ([]string, error) {
 | 
				
			||||||
	cmd := NewCommand(repo.Ctx, "diff-tree", "--name-only", "--root", "--no-commit-id", "-r", "-z")
 | 
						cmd := NewCommand(repo.Ctx, "diff-tree", "--name-only", "--root", "--no-commit-id", "-r", "-z")
 | 
				
			||||||
	if base == repo.objectFormat.Empty().String() {
 | 
						if base == repo.objectFormat.EmptyObjectID().String() {
 | 
				
			||||||
		cmd.AddDynamicArguments(head)
 | 
							cmd.AddDynamicArguments(head)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		cmd.AddDynamicArguments(base, head)
 | 
							cmd.AddDynamicArguments(base, head)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -131,12 +131,12 @@ func TestGetCommitFilesChanged(t *testing.T) {
 | 
				
			|||||||
		files      []string
 | 
							files      []string
 | 
				
			||||||
	}{
 | 
						}{
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			repo.objectFormat.Empty().String(),
 | 
								repo.objectFormat.EmptyObjectID().String(),
 | 
				
			||||||
			"95bb4d39648ee7e325106df01a621c530863a653",
 | 
								"95bb4d39648ee7e325106df01a621c530863a653",
 | 
				
			||||||
			[]string{"file1.txt"},
 | 
								[]string{"file1.txt"},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			repo.objectFormat.Empty().String(),
 | 
								repo.objectFormat.EmptyObjectID().String(),
 | 
				
			||||||
			"8d92fc957a4d7cfd98bc375f0b7bb189a0d6c9f2",
 | 
								"8d92fc957a4d7cfd98bc375f0b7bb189a0d6c9f2",
 | 
				
			||||||
			[]string{"file2.txt"},
 | 
								[]string{"file2.txt"},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -101,7 +101,7 @@ func (repo *Repository) RemoveFilesFromIndex(filenames ...string) error {
 | 
				
			|||||||
	for _, file := range filenames {
 | 
						for _, file := range filenames {
 | 
				
			||||||
		if file != "" {
 | 
							if file != "" {
 | 
				
			||||||
			buffer.WriteString("0 ")
 | 
								buffer.WriteString("0 ")
 | 
				
			||||||
			buffer.WriteString(repo.objectFormat.Empty().String())
 | 
								buffer.WriteString(repo.objectFormat.EmptyObjectID().String())
 | 
				
			||||||
			buffer.WriteByte('\t')
 | 
								buffer.WriteByte('\t')
 | 
				
			||||||
			buffer.WriteString(file)
 | 
								buffer.WriteString(file)
 | 
				
			||||||
			buffer.WriteByte('\000')
 | 
								buffer.WriteByte('\000')
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -194,7 +194,7 @@ func TestRepository_GetAnnotatedTag(t *testing.T) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestRepository_parseTagRef(t *testing.T) {
 | 
					func TestRepository_parseTagRef(t *testing.T) {
 | 
				
			||||||
	sha1 := ObjectFormatFromID(Sha1)
 | 
						sha1 := Sha1ObjectFormat
 | 
				
			||||||
	tests := []struct {
 | 
						tests := []struct {
 | 
				
			||||||
		name string
 | 
							name string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,8 +35,8 @@ func (tag *Tag) Commit(gitRepo *Repository) (*Commit, error) {
 | 
				
			|||||||
// \n\n separate headers from message
 | 
					// \n\n separate headers from message
 | 
				
			||||||
func parseTagData(objectFormat ObjectFormat, data []byte) (*Tag, error) {
 | 
					func parseTagData(objectFormat ObjectFormat, data []byte) (*Tag, error) {
 | 
				
			||||||
	tag := new(Tag)
 | 
						tag := new(Tag)
 | 
				
			||||||
	tag.ID = objectFormat.NewEmptyID()
 | 
						tag.ID = objectFormat.EmptyObjectID()
 | 
				
			||||||
	tag.Object = objectFormat.NewEmptyID()
 | 
						tag.Object = objectFormat.EmptyObjectID()
 | 
				
			||||||
	tag.Tagger = &Signature{}
 | 
						tag.Tagger = &Signature{}
 | 
				
			||||||
	// we now have the contents of the commit object. Let's investigate...
 | 
						// we now have the contents of the commit object. Let's investigate...
 | 
				
			||||||
	nextline := 0
 | 
						nextline := 0
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,7 @@ tagger Lucas Michot <lucas@semalead.com> 1484491741 +0100
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
`), tag: Tag{
 | 
					`), tag: Tag{
 | 
				
			||||||
			Name:      "",
 | 
								Name:      "",
 | 
				
			||||||
			ID:        NewSha1(),
 | 
								ID:        Sha1ObjectFormat.EmptyObjectID(),
 | 
				
			||||||
			Object:    &Sha1Hash{0x3b, 0x11, 0x4a, 0xb8, 0x0, 0xc6, 0x43, 0x2a, 0xd4, 0x23, 0x87, 0xcc, 0xf6, 0xbc, 0x8d, 0x43, 0x88, 0xa2, 0x88, 0x5a},
 | 
								Object:    &Sha1Hash{0x3b, 0x11, 0x4a, 0xb8, 0x0, 0xc6, 0x43, 0x2a, 0xd4, 0x23, 0x87, 0xcc, 0xf6, 0xbc, 0x8d, 0x43, 0x88, 0xa2, 0x88, 0x5a},
 | 
				
			||||||
			Type:      "commit",
 | 
								Type:      "commit",
 | 
				
			||||||
			Tagger:    &Signature{Name: "Lucas Michot", Email: "lucas@semalead.com", When: time.Unix(1484491741, 0)},
 | 
								Tagger:    &Signature{Name: "Lucas Michot", Email: "lucas@semalead.com", When: time.Unix(1484491741, 0)},
 | 
				
			||||||
@@ -39,7 +39,7 @@ o
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
ono`), tag: Tag{
 | 
					ono`), tag: Tag{
 | 
				
			||||||
			Name:      "",
 | 
								Name:      "",
 | 
				
			||||||
			ID:        NewSha1(),
 | 
								ID:        Sha1ObjectFormat.EmptyObjectID(),
 | 
				
			||||||
			Object:    &Sha1Hash{0x7c, 0xdf, 0x42, 0xc0, 0xb1, 0xcc, 0x76, 0x3a, 0xb7, 0xe4, 0xc3, 0x3c, 0x47, 0xa2, 0x4e, 0x27, 0xc6, 0x6b, 0xfc, 0xcc},
 | 
								Object:    &Sha1Hash{0x7c, 0xdf, 0x42, 0xc0, 0xb1, 0xcc, 0x76, 0x3a, 0xb7, 0xe4, 0xc3, 0x3c, 0x47, 0xa2, 0x4e, 0x27, 0xc6, 0x6b, 0xfc, 0xcc},
 | 
				
			||||||
			Type:      "commit",
 | 
								Type:      "commit",
 | 
				
			||||||
			Tagger:    &Signature{Name: "Lucas Michot", Email: "lucas@semalead.com", When: time.Unix(1484553735, 0)},
 | 
								Tagger:    &Signature{Name: "Lucas Michot", Email: "lucas@semalead.com", When: time.Unix(1484553735, 0)},
 | 
				
			||||||
@@ -49,7 +49,7 @@ ono`), tag: Tag{
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, test := range testData {
 | 
						for _, test := range testData {
 | 
				
			||||||
		tag, err := parseTagData(ObjectFormatFromID(Sha1), test.data)
 | 
							tag, err := parseTagData(Sha1ObjectFormat, test.data)
 | 
				
			||||||
		assert.NoError(t, err)
 | 
							assert.NoError(t, err)
 | 
				
			||||||
		assert.EqualValues(t, test.tag.ID, tag.ID)
 | 
							assert.EqualValues(t, test.tag.ID, tag.ID)
 | 
				
			||||||
		assert.EqualValues(t, test.tag.Object, tag.Object)
 | 
							assert.EqualValues(t, test.tag.Object, tag.Object)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -169,7 +169,7 @@ func TestListToPushCommits(t *testing.T) {
 | 
				
			|||||||
		When:  now,
 | 
							When:  now,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	hashType := git.ObjectFormatFromID(git.Sha1)
 | 
						hashType := git.Sha1ObjectFormat
 | 
				
			||||||
	const hexString1 = "0123456789abcdef0123456789abcdef01234567"
 | 
						const hexString1 = "0123456789abcdef0123456789abcdef01234567"
 | 
				
			||||||
	hash1, err := hashType.NewIDFromString(hexString1)
 | 
						hash1, err := hashType.NewIDFromString(hexString1)
 | 
				
			||||||
	assert.NoError(t, err)
 | 
						assert.NoError(t, err)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -224,7 +224,7 @@ func generateRepoCommit(ctx context.Context, repo, templateRepo, generateRepo *r
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// FIXME: fix the hash
 | 
						// FIXME: fix the hash
 | 
				
			||||||
	if err := git.InitRepository(ctx, tmpDir, false, git.ObjectFormatFromID(git.Sha1)); err != nil {
 | 
						if err := git.InitRepository(ctx, tmpDir, false, git.Sha1ObjectFormat.Name()); err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -358,7 +358,7 @@ func GenerateRepository(ctx context.Context, doer, owner *user_model.User, templ
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// FIXME - fix the hash
 | 
						// FIXME - fix the hash
 | 
				
			||||||
	if err = CheckInitRepository(ctx, owner.Name, generateRepo.Name, git.ObjectFormatFromID(git.Sha1)); err != nil {
 | 
						if err = CheckInitRepository(ctx, owner.Name, generateRepo.Name, git.Sha1ObjectFormat.Name()); err != nil {
 | 
				
			||||||
		return generateRepo, err
 | 
							return generateRepo, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -188,7 +188,7 @@ func InitRepoCommit(ctx context.Context, tmpPath string, repo *repo_model.Reposi
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func CheckInitRepository(ctx context.Context, owner, name string, objectFormat git.ObjectFormat) (err error) {
 | 
					func CheckInitRepository(ctx context.Context, owner, name, objectFormatName string) (err error) {
 | 
				
			||||||
	// Somehow the directory could exist.
 | 
						// Somehow the directory could exist.
 | 
				
			||||||
	repoPath := repo_model.RepoPath(owner, name)
 | 
						repoPath := repo_model.RepoPath(owner, name)
 | 
				
			||||||
	isExist, err := util.IsExist(repoPath)
 | 
						isExist, err := util.IsExist(repoPath)
 | 
				
			||||||
@@ -204,7 +204,7 @@ func CheckInitRepository(ctx context.Context, owner, name string, objectFormat g
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Init git bare new repository.
 | 
						// Init git bare new repository.
 | 
				
			||||||
	if err = git.InitRepository(ctx, repoPath, true, objectFormat); err != nil {
 | 
						if err = git.InitRepository(ctx, repoPath, true, objectFormatName); err != nil {
 | 
				
			||||||
		return fmt.Errorf("git.InitRepository: %w", err)
 | 
							return fmt.Errorf("git.InitRepository: %w", err)
 | 
				
			||||||
	} else if err = CreateDelegateHooks(repoPath); err != nil {
 | 
						} else if err = CreateDelegateHooks(repoPath); err != nil {
 | 
				
			||||||
		return fmt.Errorf("createDelegateHooks: %w", err)
 | 
							return fmt.Errorf("createDelegateHooks: %w", err)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -253,7 +253,7 @@ func CreateUserRepo(ctx *context.APIContext, owner *user_model.User, opt api.Cre
 | 
				
			|||||||
		DefaultBranch:    opt.DefaultBranch,
 | 
							DefaultBranch:    opt.DefaultBranch,
 | 
				
			||||||
		TrustModel:       repo_model.ToTrustModel(opt.TrustModel),
 | 
							TrustModel:       repo_model.ToTrustModel(opt.TrustModel),
 | 
				
			||||||
		IsTemplate:       opt.Template,
 | 
							IsTemplate:       opt.Template,
 | 
				
			||||||
		ObjectFormat:  git.ObjectFormatFromID(git.Sha1),
 | 
							ObjectFormatName: git.Sha1ObjectFormat.Name(),
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		if repo_model.IsErrRepoAlreadyExist(err) {
 | 
							if repo_model.IsErrRepoAlreadyExist(err) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -81,7 +81,7 @@ func ConvertToObjectID(ctx gocontext.Context, repo *context.Repository, commitID
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, repo.Repository.RepoPath())
 | 
						gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, repo.Repository.RepoPath())
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return objectFormat.Empty(), fmt.Errorf("RepositoryFromContextOrOpen: %w", err)
 | 
							return objectFormat.EmptyObjectID(), fmt.Errorf("RepositoryFromContextOrOpen: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	defer closer.Close()
 | 
						defer closer.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -147,7 +147,7 @@ func preReceiveBranch(ctx *preReceiveContext, oldCommitID, newCommitID string, r
 | 
				
			|||||||
	gitRepo := ctx.Repo.GitRepo
 | 
						gitRepo := ctx.Repo.GitRepo
 | 
				
			||||||
	objectFormat, _ := gitRepo.GetObjectFormat()
 | 
						objectFormat, _ := gitRepo.GetObjectFormat()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if branchName == repo.DefaultBranch && newCommitID == objectFormat.Empty().String() {
 | 
						if branchName == repo.DefaultBranch && newCommitID == objectFormat.EmptyObjectID().String() {
 | 
				
			||||||
		log.Warn("Forbidden: Branch: %s is the default branch in %-v and cannot be deleted", branchName, repo)
 | 
							log.Warn("Forbidden: Branch: %s is the default branch in %-v and cannot be deleted", branchName, repo)
 | 
				
			||||||
		ctx.JSON(http.StatusForbidden, private.Response{
 | 
							ctx.JSON(http.StatusForbidden, private.Response{
 | 
				
			||||||
			UserMsg: fmt.Sprintf("branch %s is the default branch and cannot be deleted", branchName),
 | 
								UserMsg: fmt.Sprintf("branch %s is the default branch and cannot be deleted", branchName),
 | 
				
			||||||
@@ -175,7 +175,7 @@ func preReceiveBranch(ctx *preReceiveContext, oldCommitID, newCommitID string, r
 | 
				
			|||||||
	// First of all we need to enforce absolutely:
 | 
						// First of all we need to enforce absolutely:
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	// 1. Detect and prevent deletion of the branch
 | 
						// 1. Detect and prevent deletion of the branch
 | 
				
			||||||
	if newCommitID == objectFormat.Empty().String() {
 | 
						if newCommitID == objectFormat.EmptyObjectID().String() {
 | 
				
			||||||
		log.Warn("Forbidden: Branch: %s in %-v is protected from deletion", branchName, repo)
 | 
							log.Warn("Forbidden: Branch: %s in %-v is protected from deletion", branchName, repo)
 | 
				
			||||||
		ctx.JSON(http.StatusForbidden, private.Response{
 | 
							ctx.JSON(http.StatusForbidden, private.Response{
 | 
				
			||||||
			UserMsg: fmt.Sprintf("branch %s is protected from deletion", branchName),
 | 
								UserMsg: fmt.Sprintf("branch %s is protected from deletion", branchName),
 | 
				
			||||||
@@ -184,7 +184,7 @@ func preReceiveBranch(ctx *preReceiveContext, oldCommitID, newCommitID string, r
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 2. Disallow force pushes to protected branches
 | 
						// 2. Disallow force pushes to protected branches
 | 
				
			||||||
	if oldCommitID != objectFormat.Empty().String() {
 | 
						if oldCommitID != objectFormat.EmptyObjectID().String() {
 | 
				
			||||||
		output, _, err := git.NewCommand(ctx, "rev-list", "--max-count=1").AddDynamicArguments(oldCommitID, "^"+newCommitID).RunStdString(&git.RunOpts{Dir: repo.RepoPath(), Env: ctx.env})
 | 
							output, _, err := git.NewCommand(ctx, "rev-list", "--max-count=1").AddDynamicArguments(oldCommitID, "^"+newCommitID).RunStdString(&git.RunOpts{Dir: repo.RepoPath(), Env: ctx.env})
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			log.Error("Unable to detect force push between: %s and %s in %-v Error: %v", oldCommitID, newCommitID, repo, err)
 | 
								log.Error("Unable to detect force push between: %s and %s in %-v Error: %v", oldCommitID, newCommitID, repo, err)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,7 +30,7 @@ func verifyCommits(oldCommitID, newCommitID string, repo *git.Repository, env []
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	var command *git.Command
 | 
						var command *git.Command
 | 
				
			||||||
	objectFormat, _ := repo.GetObjectFormat()
 | 
						objectFormat, _ := repo.GetObjectFormat()
 | 
				
			||||||
	if oldCommitID == objectFormat.Empty().String() {
 | 
						if oldCommitID == objectFormat.EmptyObjectID().String() {
 | 
				
			||||||
		// When creating a new branch, the oldCommitID is empty, by using "newCommitID --not --all":
 | 
							// When creating a new branch, the oldCommitID is empty, by using "newCommitID --not --all":
 | 
				
			||||||
		// List commits that are reachable by following the newCommitID, exclude "all" existing heads/tags commits
 | 
							// List commits that are reachable by following the newCommitID, exclude "all" existing heads/tags commits
 | 
				
			||||||
		// So, it only lists the new commits received, doesn't list the commits already present in the receiving repository
 | 
							// So, it only lists the new commits received, doesn't list the commits already present in the receiving repository
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,9 +30,9 @@ func TestVerifyCommits(t *testing.T) {
 | 
				
			|||||||
		verified   bool
 | 
							verified   bool
 | 
				
			||||||
	}{
 | 
						}{
 | 
				
			||||||
		{"72920278f2f999e3005801e5d5b8ab8139d3641c", "d766f2917716d45be24bfa968b8409544941be32", true},
 | 
							{"72920278f2f999e3005801e5d5b8ab8139d3641c", "d766f2917716d45be24bfa968b8409544941be32", true},
 | 
				
			||||||
		{objectFormat.Empty().String(), "93eac826f6188f34646cea81bf426aa5ba7d3bfe", true}, // New branch with verified commit
 | 
							{objectFormat.EmptyObjectID().String(), "93eac826f6188f34646cea81bf426aa5ba7d3bfe", true}, // New branch with verified commit
 | 
				
			||||||
		{"9779d17a04f1e2640583d35703c62460b2d86e0a", "72920278f2f999e3005801e5d5b8ab8139d3641c", false},
 | 
							{"9779d17a04f1e2640583d35703c62460b2d86e0a", "72920278f2f999e3005801e5d5b8ab8139d3641c", false},
 | 
				
			||||||
		{objectFormat.Empty().String(), "9ce3f779ae33f31fce17fac3c512047b75d7498b", false}, // New branch with unverified commit
 | 
							{objectFormat.EmptyObjectID().String(), "9ce3f779ae33f31fce17fac3c512047b75d7498b", false}, // New branch with unverified commit
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, tc := range testCases {
 | 
						for _, tc := range testCases {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -158,7 +158,7 @@ func RestoreBranchPost(ctx *context.Context) {
 | 
				
			|||||||
	if err := repo_service.PushUpdate(
 | 
						if err := repo_service.PushUpdate(
 | 
				
			||||||
		&repo_module.PushUpdateOptions{
 | 
							&repo_module.PushUpdateOptions{
 | 
				
			||||||
			RefFullName:  git.RefNameFromBranch(deletedBranch.Name),
 | 
								RefFullName:  git.RefNameFromBranch(deletedBranch.Name),
 | 
				
			||||||
			OldCommitID:  objectFormat.Empty().String(),
 | 
								OldCommitID:  objectFormat.EmptyObjectID().String(),
 | 
				
			||||||
			NewCommitID:  deletedBranch.CommitID,
 | 
								NewCommitID:  deletedBranch.CommitID,
 | 
				
			||||||
			PusherID:     ctx.Doer.ID,
 | 
								PusherID:     ctx.Doer.ID,
 | 
				
			||||||
			PusherName:   ctx.Doer.Name,
 | 
								PusherName:   ctx.Doer.Name,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -317,7 +317,7 @@ func ParseCompareInfo(ctx *context.Context) *CompareInfo {
 | 
				
			|||||||
			ci.BaseBranch = baseCommit.ID.String()
 | 
								ci.BaseBranch = baseCommit.ID.String()
 | 
				
			||||||
			ctx.Data["BaseBranch"] = ci.BaseBranch
 | 
								ctx.Data["BaseBranch"] = ci.BaseBranch
 | 
				
			||||||
			baseIsCommit = true
 | 
								baseIsCommit = true
 | 
				
			||||||
		} else if ci.BaseBranch == objectFormat.Empty().String() {
 | 
							} else if ci.BaseBranch == objectFormat.EmptyObjectID().String() {
 | 
				
			||||||
			if isSameRepo {
 | 
								if isSameRepo {
 | 
				
			||||||
				ctx.Redirect(ctx.Repo.RepoLink + "/compare/" + util.PathEscapeSegments(ci.HeadBranch))
 | 
									ctx.Redirect(ctx.Repo.RepoLink + "/compare/" + util.PathEscapeSegments(ci.HeadBranch))
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -329,7 +329,7 @@ func dummyInfoRefs(ctx *context.Context) {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
		}()
 | 
							}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if err := git.InitRepository(ctx, tmpDir, true, git.ObjectFormatFromID(git.Sha1)); err != nil {
 | 
							if err := git.InitRepository(ctx, tmpDir, true, git.Sha1ObjectFormat.Name()); err != nil {
 | 
				
			||||||
			log.Error("Failed to init bare repo for git-receive-pack cache: %v", err)
 | 
								log.Error("Failed to init bare repo for git-receive-pack cache: %v", err)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -289,7 +289,7 @@ func CreatePost(ctx *context.Context) {
 | 
				
			|||||||
			AutoInit:         form.AutoInit,
 | 
								AutoInit:         form.AutoInit,
 | 
				
			||||||
			IsTemplate:       form.Template,
 | 
								IsTemplate:       form.Template,
 | 
				
			||||||
			TrustModel:       repo_model.ToTrustModel(form.TrustModel),
 | 
								TrustModel:       repo_model.ToTrustModel(form.TrustModel),
 | 
				
			||||||
			ObjectFormat:  form.ObjectFormat,
 | 
								ObjectFormatName: form.ObjectFormatName,
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
		if err == nil {
 | 
							if err == nil {
 | 
				
			||||||
			log.Trace("Repository created [%d]: %s/%s", repo.ID, ctxUser.Name, repo.Name)
 | 
								log.Trace("Repository created [%d]: %s/%s", repo.ID, ctxUser.Name, repo.Name)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -662,7 +662,7 @@ func TestWebhook(ctx *context.Context) {
 | 
				
			|||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		commit = &git.Commit{
 | 
							commit = &git.Commit{
 | 
				
			||||||
			ID:            objectFormat.NewEmptyID(),
 | 
								ID:            objectFormat.EmptyObjectID(),
 | 
				
			||||||
			Author:        ghost.NewGitSig(),
 | 
								Author:        ghost.NewGitSig(),
 | 
				
			||||||
			Committer:     ghost.NewGitSig(),
 | 
								Committer:     ghost.NewGitSig(),
 | 
				
			||||||
			CommitMessage: "This is a fake commit",
 | 
								CommitMessage: "This is a fake commit",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -39,7 +39,7 @@ func ProcReceive(ctx context.Context, repo *repo_model.Repository, gitRepo *git.
 | 
				
			|||||||
	objectFormat, _ := gitRepo.GetObjectFormat()
 | 
						objectFormat, _ := gitRepo.GetObjectFormat()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for i := range opts.OldCommitIDs {
 | 
						for i := range opts.OldCommitIDs {
 | 
				
			||||||
		if opts.NewCommitIDs[i] == objectFormat.Empty().String() {
 | 
							if opts.NewCommitIDs[i] == objectFormat.EmptyObjectID().String() {
 | 
				
			||||||
			results = append(results, private.HookProcReceiveRefResult{
 | 
								results = append(results, private.HookProcReceiveRefResult{
 | 
				
			||||||
				OriginalRef: opts.RefFullNames[i],
 | 
									OriginalRef: opts.RefFullNames[i],
 | 
				
			||||||
				OldOID:      opts.OldCommitIDs[i],
 | 
									OldOID:      opts.OldCommitIDs[i],
 | 
				
			||||||
@@ -153,7 +153,7 @@ func ProcReceive(ctx context.Context, repo *repo_model.Repository, gitRepo *git.
 | 
				
			|||||||
			results = append(results, private.HookProcReceiveRefResult{
 | 
								results = append(results, private.HookProcReceiveRefResult{
 | 
				
			||||||
				Ref:         pr.GetGitRefName(),
 | 
									Ref:         pr.GetGitRefName(),
 | 
				
			||||||
				OriginalRef: opts.RefFullNames[i],
 | 
									OriginalRef: opts.RefFullNames[i],
 | 
				
			||||||
				OldOID:      objectFormat.Empty().String(),
 | 
									OldOID:      objectFormat.EmptyObjectID().String(),
 | 
				
			||||||
				NewOID:      opts.NewCommitIDs[i],
 | 
									NewOID:      opts.NewCommitIDs[i],
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,12 +19,12 @@ import (
 | 
				
			|||||||
func TestToCommitMeta(t *testing.T) {
 | 
					func TestToCommitMeta(t *testing.T) {
 | 
				
			||||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
						assert.NoError(t, unittest.PrepareTestDatabase())
 | 
				
			||||||
	headRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
 | 
						headRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
 | 
				
			||||||
	sha1 := git.ObjectFormatFromID(git.Sha1)
 | 
						sha1 := git.Sha1ObjectFormat
 | 
				
			||||||
	signature := &git.Signature{Name: "Test Signature", Email: "test@email.com", When: time.Unix(0, 0)}
 | 
						signature := &git.Signature{Name: "Test Signature", Email: "test@email.com", When: time.Unix(0, 0)}
 | 
				
			||||||
	tag := &git.Tag{
 | 
						tag := &git.Tag{
 | 
				
			||||||
		Name:    "Test Tag",
 | 
							Name:    "Test Tag",
 | 
				
			||||||
		ID:      sha1.Empty(),
 | 
							ID:      sha1.EmptyObjectID(),
 | 
				
			||||||
		Object:  sha1.Empty(),
 | 
							Object:  sha1.EmptyObjectID(),
 | 
				
			||||||
		Type:    "Test Type",
 | 
							Type:    "Test Type",
 | 
				
			||||||
		Tagger:  signature,
 | 
							Tagger:  signature,
 | 
				
			||||||
		Message: "Test Message",
 | 
							Message: "Test Message",
 | 
				
			||||||
@@ -34,8 +34,8 @@ func TestToCommitMeta(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	assert.NotNil(t, commitMeta)
 | 
						assert.NotNil(t, commitMeta)
 | 
				
			||||||
	assert.EqualValues(t, &api.CommitMeta{
 | 
						assert.EqualValues(t, &api.CommitMeta{
 | 
				
			||||||
		SHA:     sha1.Empty().String(),
 | 
							SHA:     sha1.EmptyObjectID().String(),
 | 
				
			||||||
		URL:     util.URLJoin(headRepo.APIURL(), "git/commits", sha1.Empty().String()),
 | 
							URL:     util.URLJoin(headRepo.APIURL(), "git/commits", sha1.EmptyObjectID().String()),
 | 
				
			||||||
		Created: time.Unix(0, 0),
 | 
							Created: time.Unix(0, 0),
 | 
				
			||||||
	}, commitMeta)
 | 
						}, commitMeta)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,7 +13,6 @@ import (
 | 
				
			|||||||
	issues_model "code.gitea.io/gitea/models/issues"
 | 
						issues_model "code.gitea.io/gitea/models/issues"
 | 
				
			||||||
	project_model "code.gitea.io/gitea/models/project"
 | 
						project_model "code.gitea.io/gitea/models/project"
 | 
				
			||||||
	"code.gitea.io/gitea/modules/context"
 | 
						"code.gitea.io/gitea/modules/context"
 | 
				
			||||||
	"code.gitea.io/gitea/modules/git"
 | 
					 | 
				
			||||||
	"code.gitea.io/gitea/modules/setting"
 | 
						"code.gitea.io/gitea/modules/setting"
 | 
				
			||||||
	"code.gitea.io/gitea/modules/structs"
 | 
						"code.gitea.io/gitea/modules/structs"
 | 
				
			||||||
	"code.gitea.io/gitea/modules/web/middleware"
 | 
						"code.gitea.io/gitea/modules/web/middleware"
 | 
				
			||||||
@@ -54,7 +53,7 @@ type CreateRepoForm struct {
 | 
				
			|||||||
	TrustModel      string
 | 
						TrustModel      string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ForkSingleBranch string
 | 
						ForkSingleBranch string
 | 
				
			||||||
	ObjectFormat     git.ObjectFormat
 | 
						ObjectFormatName string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Validate validates the fields
 | 
					// Validate validates the fields
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1120,7 +1120,7 @@ func GetDiff(ctx context.Context, gitRepo *git.Repository, opts *DiffOptions, fi
 | 
				
			|||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (len(opts.BeforeCommitID) == 0 || opts.BeforeCommitID == objectFormat.Empty().String()) && commit.ParentCount() == 0 {
 | 
						if (len(opts.BeforeCommitID) == 0 || opts.BeforeCommitID == objectFormat.EmptyObjectID().String()) && commit.ParentCount() == 0 {
 | 
				
			||||||
		cmdDiff.AddArguments("diff", "--src-prefix=\\a/", "--dst-prefix=\\b/", "-M").
 | 
							cmdDiff.AddArguments("diff", "--src-prefix=\\a/", "--dst-prefix=\\b/", "-M").
 | 
				
			||||||
			AddArguments(opts.WhitespaceBehavior...).
 | 
								AddArguments(opts.WhitespaceBehavior...).
 | 
				
			||||||
			AddDynamicArguments(objectFormat.EmptyTree().String()).
 | 
								AddDynamicArguments(objectFormat.EmptyTree().String()).
 | 
				
			||||||
@@ -1229,7 +1229,7 @@ func GetDiff(ctx context.Context, gitRepo *git.Repository, opts *DiffOptions, fi
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	diffPaths := []string{opts.BeforeCommitID + separator + opts.AfterCommitID}
 | 
						diffPaths := []string{opts.BeforeCommitID + separator + opts.AfterCommitID}
 | 
				
			||||||
	if len(opts.BeforeCommitID) == 0 || opts.BeforeCommitID == objectFormat.Empty().String() {
 | 
						if len(opts.BeforeCommitID) == 0 || opts.BeforeCommitID == objectFormat.EmptyObjectID().String() {
 | 
				
			||||||
		diffPaths = []string{objectFormat.EmptyTree().String(), opts.AfterCommitID}
 | 
							diffPaths = []string{objectFormat.EmptyTree().String(), opts.AfterCommitID}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	diff.NumFiles, diff.TotalAddition, diff.TotalDeletion, err = git.GetDiffShortStat(gitRepo.Ctx, repoPath, nil, diffPaths...)
 | 
						diff.NumFiles, diff.TotalAddition, diff.TotalDeletion, err = git.GetDiffShortStat(gitRepo.Ctx, repoPath, nil, diffPaths...)
 | 
				
			||||||
@@ -1267,7 +1267,7 @@ func GetPullDiffStats(gitRepo *git.Repository, opts *DiffOptions) (*PullDiffStat
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	diffPaths := []string{opts.BeforeCommitID + separator + opts.AfterCommitID}
 | 
						diffPaths := []string{opts.BeforeCommitID + separator + opts.AfterCommitID}
 | 
				
			||||||
	if len(opts.BeforeCommitID) == 0 || opts.BeforeCommitID == objectFormat.Empty().String() {
 | 
						if len(opts.BeforeCommitID) == 0 || opts.BeforeCommitID == objectFormat.EmptyObjectID().String() {
 | 
				
			||||||
		diffPaths = []string{objectFormat.EmptyTree().String(), opts.AfterCommitID}
 | 
							diffPaths = []string{objectFormat.EmptyTree().String(), opts.AfterCommitID}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -49,7 +49,7 @@ func CheckAndEnsureSafePR(pr *base.PullRequest, commonCloneBaseURL string, g bas
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// SECURITY: SHAs Must be a SHA
 | 
						// SECURITY: SHAs Must be a SHA
 | 
				
			||||||
	// FIXME: hash only a SHA1
 | 
						// FIXME: hash only a SHA1
 | 
				
			||||||
	CommitType := git.ObjectFormatFromID(git.Sha1)
 | 
						CommitType := git.Sha1ObjectFormat
 | 
				
			||||||
	if pr.MergeCommitSHA != "" && !CommitType.IsValid(pr.MergeCommitSHA) {
 | 
						if pr.MergeCommitSHA != "" && !CommitType.IsValid(pr.MergeCommitSHA) {
 | 
				
			||||||
		WarnAndNotice("PR #%d in %s has invalid MergeCommitSHA: %s", pr.Number, g, pr.MergeCommitSHA)
 | 
							WarnAndNotice("PR #%d in %s has invalid MergeCommitSHA: %s", pr.Number, g, pr.MergeCommitSHA)
 | 
				
			||||||
		pr.MergeCommitSHA = ""
 | 
							pr.MergeCommitSHA = ""
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -232,7 +232,7 @@ func TestGiteaUploadUpdateGitForPullRequest(t *testing.T) {
 | 
				
			|||||||
	//
 | 
						//
 | 
				
			||||||
	fromRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
 | 
						fromRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
 | 
				
			||||||
	baseRef := "master"
 | 
						baseRef := "master"
 | 
				
			||||||
	assert.NoError(t, git.InitRepository(git.DefaultContext, fromRepo.RepoPath(), false, fromRepo.ObjectFormat))
 | 
						assert.NoError(t, git.InitRepository(git.DefaultContext, fromRepo.RepoPath(), false, fromRepo.ObjectFormatName))
 | 
				
			||||||
	err := git.NewCommand(git.DefaultContext, "symbolic-ref").AddDynamicArguments("HEAD", git.BranchPrefix+baseRef).Run(&git.RunOpts{Dir: fromRepo.RepoPath()})
 | 
						err := git.NewCommand(git.DefaultContext, "symbolic-ref").AddDynamicArguments("HEAD", git.BranchPrefix+baseRef).Run(&git.RunOpts{Dir: fromRepo.RepoPath()})
 | 
				
			||||||
	assert.NoError(t, err)
 | 
						assert.NoError(t, err)
 | 
				
			||||||
	assert.NoError(t, os.WriteFile(filepath.Join(fromRepo.RepoPath(), "README.md"), []byte(fmt.Sprintf("# Testing Repository\n\nOriginally created in: %s", fromRepo.RepoPath())), 0o644))
 | 
						assert.NoError(t, os.WriteFile(filepath.Join(fromRepo.RepoPath(), "README.md"), []byte(fmt.Sprintf("# Testing Repository\n\nOriginally created in: %s", fromRepo.RepoPath())), 0o644))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -484,7 +484,7 @@ func SyncPullMirror(ctx context.Context, repoID int64) bool {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
			notify_service.SyncPushCommits(ctx, m.Repo.MustOwner(ctx), m.Repo, &repo_module.PushUpdateOptions{
 | 
								notify_service.SyncPushCommits(ctx, m.Repo.MustOwner(ctx), m.Repo, &repo_module.PushUpdateOptions{
 | 
				
			||||||
				RefFullName: result.refName,
 | 
									RefFullName: result.refName,
 | 
				
			||||||
				OldCommitID: objectFormat.Empty().String(),
 | 
									OldCommitID: objectFormat.EmptyObjectID().String(),
 | 
				
			||||||
				NewCommitID: commitID,
 | 
									NewCommitID: commitID,
 | 
				
			||||||
			}, repo_module.NewPushCommits())
 | 
								}, repo_module.NewPushCommits())
 | 
				
			||||||
			notify_service.SyncCreateRef(ctx, m.Repo.MustOwner(ctx), m.Repo, result.refName, commitID)
 | 
								notify_service.SyncCreateRef(ctx, m.Repo.MustOwner(ctx), m.Repo, result.refName, commitID)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -271,7 +271,7 @@ func alterRepositoryContent(ctx context.Context, doer *user_model.User, repo *re
 | 
				
			|||||||
		if !git.IsErrBranchNotExist(err) || !repo.IsEmpty {
 | 
							if !git.IsErrBranchNotExist(err) || !repo.IsEmpty {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if err := t.Init(repo.ObjectFormat); err != nil {
 | 
							if err := t.Init(repo.ObjectFormatName); err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -328,7 +328,7 @@ func AddTestPullRequestTask(doer *user_model.User, repoID int64, branch string,
 | 
				
			|||||||
			if err == nil {
 | 
								if err == nil {
 | 
				
			||||||
				for _, pr := range prs {
 | 
									for _, pr := range prs {
 | 
				
			||||||
					objectFormat, _ := git.GetObjectFormatOfRepo(ctx, pr.BaseRepo.RepoPath())
 | 
										objectFormat, _ := git.GetObjectFormatOfRepo(ctx, pr.BaseRepo.RepoPath())
 | 
				
			||||||
					if newCommitID != "" && newCommitID != objectFormat.Empty().String() {
 | 
										if newCommitID != "" && newCommitID != objectFormat.EmptyObjectID().String() {
 | 
				
			||||||
						changed, err := checkIfPRContentChanged(ctx, pr, oldCommitID, newCommitID)
 | 
											changed, err := checkIfPRContentChanged(ctx, pr, oldCommitID, newCommitID)
 | 
				
			||||||
						if err != nil {
 | 
											if err != nil {
 | 
				
			||||||
							log.Error("checkIfPRContentChanged: %v", err)
 | 
												log.Error("checkIfPRContentChanged: %v", err)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -93,14 +93,8 @@ func createTemporaryRepoForPR(ctx context.Context, pr *issues_model.PullRequest)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	baseRepoPath := pr.BaseRepo.RepoPath()
 | 
						baseRepoPath := pr.BaseRepo.RepoPath()
 | 
				
			||||||
	headRepoPath := pr.HeadRepo.RepoPath()
 | 
						headRepoPath := pr.HeadRepo.RepoPath()
 | 
				
			||||||
	objectFormat, err := git.GetObjectFormatOfRepo(ctx, baseRepoPath)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		log.Error("Unable to fetch ObjectFormat of repository %s: %v", baseRepoPath, err)
 | 
					 | 
				
			||||||
		cancel()
 | 
					 | 
				
			||||||
		return nil, nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err := git.InitRepository(ctx, tmpBasePath, false, objectFormat); err != nil {
 | 
						if err := git.InitRepository(ctx, tmpBasePath, false, pr.BaseRepo.ObjectFormatName); err != nil {
 | 
				
			||||||
		log.Error("Unable to init tmpBasePath for %-v: %v", pr, err)
 | 
							log.Error("Unable to init tmpBasePath for %-v: %v", pr, err)
 | 
				
			||||||
		cancel()
 | 
							cancel()
 | 
				
			||||||
		return nil, nil, err
 | 
							return nil, nil, err
 | 
				
			||||||
@@ -174,6 +168,7 @@ func createTemporaryRepoForPR(ctx context.Context, pr *issues_model.PullRequest)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	trackingBranch := "tracking"
 | 
						trackingBranch := "tracking"
 | 
				
			||||||
 | 
						objectFormat := git.ObjectFormatFromName(pr.BaseRepo.ObjectFormatName)
 | 
				
			||||||
	// Fetch head branch
 | 
						// Fetch head branch
 | 
				
			||||||
	var headBranch string
 | 
						var headBranch string
 | 
				
			||||||
	if pr.Flow == issues_model.PullRequestFlowGithub {
 | 
						if pr.Flow == issues_model.PullRequestFlowGithub {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -89,14 +89,14 @@ func createTag(ctx context.Context, gitRepo *git.Repository, rel *repo_model.Rel
 | 
				
			|||||||
			objectFormat, _ := gitRepo.GetObjectFormat()
 | 
								objectFormat, _ := gitRepo.GetObjectFormat()
 | 
				
			||||||
			commits := repository.NewPushCommits()
 | 
								commits := repository.NewPushCommits()
 | 
				
			||||||
			commits.HeadCommit = repository.CommitToPushCommit(commit)
 | 
								commits.HeadCommit = repository.CommitToPushCommit(commit)
 | 
				
			||||||
			commits.CompareURL = rel.Repo.ComposeCompareURL(objectFormat.Empty().String(), commit.ID.String())
 | 
								commits.CompareURL = rel.Repo.ComposeCompareURL(objectFormat.EmptyObjectID().String(), commit.ID.String())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			refFullName := git.RefNameFromTag(rel.TagName)
 | 
								refFullName := git.RefNameFromTag(rel.TagName)
 | 
				
			||||||
			notify_service.PushCommits(
 | 
								notify_service.PushCommits(
 | 
				
			||||||
				ctx, rel.Publisher, rel.Repo,
 | 
									ctx, rel.Publisher, rel.Repo,
 | 
				
			||||||
				&repository.PushUpdateOptions{
 | 
									&repository.PushUpdateOptions{
 | 
				
			||||||
					RefFullName: refFullName,
 | 
										RefFullName: refFullName,
 | 
				
			||||||
					OldCommitID: objectFormat.Empty().String(),
 | 
										OldCommitID: objectFormat.EmptyObjectID().String(),
 | 
				
			||||||
					NewCommitID: commit.ID.String(),
 | 
										NewCommitID: commit.ID.String(),
 | 
				
			||||||
				}, commits)
 | 
									}, commits)
 | 
				
			||||||
			notify_service.CreateRef(ctx, rel.Publisher, rel.Repo, refFullName, commit.ID.String())
 | 
								notify_service.CreateRef(ctx, rel.Publisher, rel.Repo, refFullName, commit.ID.String())
 | 
				
			||||||
@@ -335,7 +335,7 @@ func DeleteReleaseByID(ctx context.Context, repo *repo_model.Repository, rel *re
 | 
				
			|||||||
			&repository.PushUpdateOptions{
 | 
								&repository.PushUpdateOptions{
 | 
				
			||||||
				RefFullName: refName,
 | 
									RefFullName: refName,
 | 
				
			||||||
				OldCommitID: rel.Sha1,
 | 
									OldCommitID: rel.Sha1,
 | 
				
			||||||
				NewCommitID: objectFormat.Empty().String(),
 | 
									NewCommitID: objectFormat.EmptyObjectID().String(),
 | 
				
			||||||
			}, repository.NewPushCommits())
 | 
								}, repository.NewPushCommits())
 | 
				
			||||||
		notify_service.DeleteRef(ctx, doer, repo, refName)
 | 
							notify_service.DeleteRef(ctx, doer, repo, refName)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -408,7 +408,7 @@ func DeleteBranch(ctx context.Context, doer *user_model.User, repo *repo_model.R
 | 
				
			|||||||
		&repo_module.PushUpdateOptions{
 | 
							&repo_module.PushUpdateOptions{
 | 
				
			||||||
			RefFullName:  git.RefNameFromBranch(branchName),
 | 
								RefFullName:  git.RefNameFromBranch(branchName),
 | 
				
			||||||
			OldCommitID:  commit.ID.String(),
 | 
								OldCommitID:  commit.ID.String(),
 | 
				
			||||||
			NewCommitID:  objectFormat.Empty().String(),
 | 
								NewCommitID:  objectFormat.EmptyObjectID().String(),
 | 
				
			||||||
			PusherID:     doer.ID,
 | 
								PusherID:     doer.ID,
 | 
				
			||||||
			PusherName:   doer.Name,
 | 
								PusherName:   doer.Name,
 | 
				
			||||||
			RepoUserName: repo.OwnerName,
 | 
								RepoUserName: repo.OwnerName,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -192,7 +192,7 @@ func ReinitMissingRepositories(ctx context.Context) error {
 | 
				
			|||||||
		default:
 | 
							default:
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		log.Trace("Initializing %d/%d...", repo.OwnerID, repo.ID)
 | 
							log.Trace("Initializing %d/%d...", repo.OwnerID, repo.ID)
 | 
				
			||||||
		if err := git.InitRepository(ctx, repo.RepoPath(), true, repo.ObjectFormat); err != nil {
 | 
							if err := git.InitRepository(ctx, repo.RepoPath(), true, repo.ObjectFormatName); err != nil {
 | 
				
			||||||
			log.Error("Unable (re)initialize repository %d at %s. Error: %v", repo.ID, repo.RepoPath(), err)
 | 
								log.Error("Unable (re)initialize repository %d at %s. Error: %v", repo.ID, repo.RepoPath(), err)
 | 
				
			||||||
			if err2 := system_model.CreateRepositoryNotice("InitRepository [%d]: %v", repo.ID, err); err2 != nil {
 | 
								if err2 := system_model.CreateRepositoryNotice("InitRepository [%d]: %v", repo.ID, err); err2 != nil {
 | 
				
			||||||
				log.Error("CreateRepositoryNotice: %v", err2)
 | 
									log.Error("CreateRepositoryNotice: %v", err2)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,7 +43,7 @@ type CreateRepoOptions struct {
 | 
				
			|||||||
	Status           repo_model.RepositoryStatus
 | 
						Status           repo_model.RepositoryStatus
 | 
				
			||||||
	TrustModel       repo_model.TrustModelType
 | 
						TrustModel       repo_model.TrustModelType
 | 
				
			||||||
	MirrorInterval   string
 | 
						MirrorInterval   string
 | 
				
			||||||
	ObjectFormat   git.ObjectFormat
 | 
						ObjectFormatName string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func prepareRepoCommit(ctx context.Context, repo *repo_model.Repository, tmpDir, repoPath string, opts CreateRepoOptions) error {
 | 
					func prepareRepoCommit(ctx context.Context, repo *repo_model.Repository, tmpDir, repoPath string, opts CreateRepoOptions) error {
 | 
				
			||||||
@@ -135,7 +135,7 @@ func prepareRepoCommit(ctx context.Context, repo *repo_model.Repository, tmpDir,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// InitRepository initializes README and .gitignore if needed.
 | 
					// InitRepository initializes README and .gitignore if needed.
 | 
				
			||||||
func initRepository(ctx context.Context, repoPath string, u *user_model.User, repo *repo_model.Repository, opts CreateRepoOptions) (err error) {
 | 
					func initRepository(ctx context.Context, repoPath string, u *user_model.User, repo *repo_model.Repository, opts CreateRepoOptions) (err error) {
 | 
				
			||||||
	if err = repo_module.CheckInitRepository(ctx, repo.OwnerName, repo.Name, opts.ObjectFormat); err != nil {
 | 
						if err = repo_module.CheckInitRepository(ctx, repo.OwnerName, repo.Name, opts.ObjectFormatName); err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -210,10 +210,6 @@ func CreateRepositoryDirectly(ctx context.Context, doer, u *user_model.User, opt
 | 
				
			|||||||
		opts.DefaultBranch = setting.Repository.DefaultBranch
 | 
							opts.DefaultBranch = setting.Repository.DefaultBranch
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if opts.ObjectFormat == nil {
 | 
					 | 
				
			||||||
		opts.ObjectFormat = git.ObjectFormatFromID(git.Sha1)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Check if label template exist
 | 
						// Check if label template exist
 | 
				
			||||||
	if len(opts.IssueLabels) > 0 {
 | 
						if len(opts.IssueLabels) > 0 {
 | 
				
			||||||
		if _, err := repo_module.LoadTemplateLabelsByDisplayName(opts.IssueLabels); err != nil {
 | 
							if _, err := repo_module.LoadTemplateLabelsByDisplayName(opts.IssueLabels); err != nil {
 | 
				
			||||||
@@ -239,7 +235,7 @@ func CreateRepositoryDirectly(ctx context.Context, doer, u *user_model.User, opt
 | 
				
			|||||||
		TrustModel:                      opts.TrustModel,
 | 
							TrustModel:                      opts.TrustModel,
 | 
				
			||||||
		IsMirror:                        opts.IsMirror,
 | 
							IsMirror:                        opts.IsMirror,
 | 
				
			||||||
		DefaultBranch:                   opts.DefaultBranch,
 | 
							DefaultBranch:                   opts.DefaultBranch,
 | 
				
			||||||
		ObjectFormat:                    opts.ObjectFormat,
 | 
							ObjectFormatName:                opts.ObjectFormatName,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var rollbackRepo *repo_model.Repository
 | 
						var rollbackRepo *repo_model.Repository
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,6 +11,7 @@ import (
 | 
				
			|||||||
	"code.gitea.io/gitea/models"
 | 
						"code.gitea.io/gitea/models"
 | 
				
			||||||
	repo_model "code.gitea.io/gitea/models/repo"
 | 
						repo_model "code.gitea.io/gitea/models/repo"
 | 
				
			||||||
	user_model "code.gitea.io/gitea/models/user"
 | 
						user_model "code.gitea.io/gitea/models/user"
 | 
				
			||||||
 | 
						"code.gitea.io/gitea/modules/git"
 | 
				
			||||||
	"code.gitea.io/gitea/modules/log"
 | 
						"code.gitea.io/gitea/modules/log"
 | 
				
			||||||
	"code.gitea.io/gitea/modules/structs"
 | 
						"code.gitea.io/gitea/modules/structs"
 | 
				
			||||||
	"code.gitea.io/gitea/services/pull"
 | 
						"code.gitea.io/gitea/services/pull"
 | 
				
			||||||
@@ -66,7 +67,7 @@ func CherryPick(ctx context.Context, repo *repo_model.Repository, doer *user_mod
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	parent, err := commit.ParentID(0)
 | 
						parent, err := commit.ParentID(0)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		parent = repo.ObjectFormat.EmptyTree()
 | 
							parent = git.ObjectFormatFromName(repo.ObjectFormatName).EmptyTree()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	base, right := parent.String(), commit.ID.String()
 | 
						base, right := parent.String(), commit.ID.String()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -77,8 +77,8 @@ func (t *TemporaryUploadRepository) Clone(branch string) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Init the repository
 | 
					// Init the repository
 | 
				
			||||||
func (t *TemporaryUploadRepository) Init(objectFormat git.ObjectFormat) error {
 | 
					func (t *TemporaryUploadRepository) Init(objectFormatName string) error {
 | 
				
			||||||
	if err := git.InitRepository(t.ctx, t.basePath, false, objectFormat); err != nil {
 | 
						if err := git.InitRepository(t.ctx, t.basePath, false, objectFormatName); err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	gitRepo, err := git.OpenRepository(t.ctx, t.basePath)
 | 
						gitRepo, err := git.OpenRepository(t.ctx, t.basePath)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -155,8 +155,7 @@ func ChangeRepoFiles(ctx context.Context, repo *repo_model.Repository, doer *use
 | 
				
			|||||||
		if !git.IsErrBranchNotExist(err) || !repo.IsEmpty {
 | 
							if !git.IsErrBranchNotExist(err) || !repo.IsEmpty {
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		objectFormat, _ := gitRepo.GetObjectFormat()
 | 
							if err := t.Init(repo.ObjectFormatName); err != nil {
 | 
				
			||||||
		if err := t.Init(objectFormat); err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		hasOldBranch = false
 | 
							hasOldBranch = false
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -91,7 +91,7 @@ func UploadRepoFiles(ctx context.Context, repo *repo_model.Repository, doer *use
 | 
				
			|||||||
		if !git.IsErrBranchNotExist(err) || !repo.IsEmpty {
 | 
							if !git.IsErrBranchNotExist(err) || !repo.IsEmpty {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if err = t.Init(repo.ObjectFormat); err != nil {
 | 
							if err = t.Init(repo.ObjectFormatName); err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		hasOldBranch = false
 | 
							hasOldBranch = false
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -111,7 +111,7 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error {
 | 
				
			|||||||
		log.Trace("pushUpdates: %-v %s %s %s", repo, opts.OldCommitID, opts.NewCommitID, opts.RefFullName)
 | 
							log.Trace("pushUpdates: %-v %s %s %s", repo, opts.OldCommitID, opts.NewCommitID, opts.RefFullName)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if opts.IsNewRef() && opts.IsDelRef() {
 | 
							if opts.IsNewRef() && opts.IsDelRef() {
 | 
				
			||||||
			return fmt.Errorf("old and new revisions are both %s", objectFormat.Empty())
 | 
								return fmt.Errorf("old and new revisions are both %s", objectFormat.EmptyObjectID())
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if opts.RefFullName.IsTag() {
 | 
							if opts.RefFullName.IsTag() {
 | 
				
			||||||
			if pusher == nil || pusher.ID != opts.PusherID {
 | 
								if pusher == nil || pusher.ID != opts.PusherID {
 | 
				
			||||||
@@ -131,7 +131,7 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error {
 | 
				
			|||||||
					&repo_module.PushUpdateOptions{
 | 
										&repo_module.PushUpdateOptions{
 | 
				
			||||||
						RefFullName: git.RefNameFromTag(tagName),
 | 
											RefFullName: git.RefNameFromTag(tagName),
 | 
				
			||||||
						OldCommitID: opts.OldCommitID,
 | 
											OldCommitID: opts.OldCommitID,
 | 
				
			||||||
						NewCommitID: objectFormat.Empty().String(),
 | 
											NewCommitID: objectFormat.EmptyObjectID().String(),
 | 
				
			||||||
					}, repo_module.NewPushCommits())
 | 
										}, repo_module.NewPushCommits())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				delTags = append(delTags, tagName)
 | 
									delTags = append(delTags, tagName)
 | 
				
			||||||
@@ -144,13 +144,13 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
				commits := repo_module.NewPushCommits()
 | 
									commits := repo_module.NewPushCommits()
 | 
				
			||||||
				commits.HeadCommit = repo_module.CommitToPushCommit(newCommit)
 | 
									commits.HeadCommit = repo_module.CommitToPushCommit(newCommit)
 | 
				
			||||||
				commits.CompareURL = repo.ComposeCompareURL(objectFormat.Empty().String(), opts.NewCommitID)
 | 
									commits.CompareURL = repo.ComposeCompareURL(objectFormat.EmptyObjectID().String(), opts.NewCommitID)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				notify_service.PushCommits(
 | 
									notify_service.PushCommits(
 | 
				
			||||||
					ctx, pusher, repo,
 | 
										ctx, pusher, repo,
 | 
				
			||||||
					&repo_module.PushUpdateOptions{
 | 
										&repo_module.PushUpdateOptions{
 | 
				
			||||||
						RefFullName: opts.RefFullName,
 | 
											RefFullName: opts.RefFullName,
 | 
				
			||||||
						OldCommitID: objectFormat.Empty().String(),
 | 
											OldCommitID: objectFormat.EmptyObjectID().String(),
 | 
				
			||||||
						NewCommitID: opts.NewCommitID,
 | 
											NewCommitID: opts.NewCommitID,
 | 
				
			||||||
					}, commits)
 | 
										}, commits)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -234,7 +234,7 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error {
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				oldCommitID := opts.OldCommitID
 | 
									oldCommitID := opts.OldCommitID
 | 
				
			||||||
				if oldCommitID == objectFormat.Empty().String() && len(commits.Commits) > 0 {
 | 
									if oldCommitID == objectFormat.EmptyObjectID().String() && len(commits.Commits) > 0 {
 | 
				
			||||||
					oldCommit, err := gitRepo.GetCommit(commits.Commits[len(commits.Commits)-1].Sha1)
 | 
										oldCommit, err := gitRepo.GetCommit(commits.Commits[len(commits.Commits)-1].Sha1)
 | 
				
			||||||
					if err != nil && !git.IsErrNotExist(err) {
 | 
										if err != nil && !git.IsErrNotExist(err) {
 | 
				
			||||||
						log.Error("unable to GetCommit %s from %-v: %v", oldCommitID, repo, err)
 | 
											log.Error("unable to GetCommit %s from %-v: %v", oldCommitID, repo, err)
 | 
				
			||||||
@@ -250,11 +250,11 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error {
 | 
				
			|||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if oldCommitID == objectFormat.Empty().String() && repo.DefaultBranch != branch {
 | 
									if oldCommitID == objectFormat.EmptyObjectID().String() && repo.DefaultBranch != branch {
 | 
				
			||||||
					oldCommitID = repo.DefaultBranch
 | 
										oldCommitID = repo.DefaultBranch
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if oldCommitID != objectFormat.Empty().String() {
 | 
									if oldCommitID != objectFormat.EmptyObjectID().String() {
 | 
				
			||||||
					commits.CompareURL = repo.ComposeCompareURL(oldCommitID, opts.NewCommitID)
 | 
										commits.CompareURL = repo.ComposeCompareURL(oldCommitID, opts.NewCommitID)
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					commits.CompareURL = ""
 | 
										commits.CompareURL = ""
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,7 +36,7 @@ func InitWiki(ctx context.Context, repo *repo_model.Repository) error {
 | 
				
			|||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err := git.InitRepository(ctx, repo.WikiPath(), true, git.ObjectFormatFromID(git.Sha1)); err != nil {
 | 
						if err := git.InitRepository(ctx, repo.WikiPath(), true, repo.ObjectFormatName); err != nil {
 | 
				
			||||||
		return fmt.Errorf("InitRepository: %w", err)
 | 
							return fmt.Errorf("InitRepository: %w", err)
 | 
				
			||||||
	} else if err = repo_module.CreateDelegateHooks(repo.WikiPath()); err != nil {
 | 
						} else if err = repo_module.CreateDelegateHooks(repo.WikiPath()); err != nil {
 | 
				
			||||||
		return fmt.Errorf("createDelegateHooks: %w", err)
 | 
							return fmt.Errorf("createDelegateHooks: %w", err)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -302,7 +302,7 @@ func TestPrepareWikiFileName_FirstPage(t *testing.T) {
 | 
				
			|||||||
	// Now create a temporaryDirectory
 | 
						// Now create a temporaryDirectory
 | 
				
			||||||
	tmpDir := t.TempDir()
 | 
						tmpDir := t.TempDir()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err := git.InitRepository(git.DefaultContext, tmpDir, true, git.ObjectFormatFromID(git.Sha1))
 | 
						err := git.InitRepository(git.DefaultContext, tmpDir, true, git.Sha1ObjectFormat.Name())
 | 
				
			||||||
	assert.NoError(t, err)
 | 
						assert.NoError(t, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	gitRepo, err := git.OpenRepository(git.DefaultContext, tmpDir)
 | 
						gitRepo, err := git.OpenRepository(git.DefaultContext, tmpDir)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -120,7 +120,7 @@ func doGitCloneFail(u *url.URL) func(*testing.T) {
 | 
				
			|||||||
func doGitInitTestRepository(dstPath string) func(*testing.T) {
 | 
					func doGitInitTestRepository(dstPath string) func(*testing.T) {
 | 
				
			||||||
	return func(t *testing.T) {
 | 
						return func(t *testing.T) {
 | 
				
			||||||
		// Init repository in dstPath
 | 
							// Init repository in dstPath
 | 
				
			||||||
		assert.NoError(t, git.InitRepository(git.DefaultContext, dstPath, false, git.ObjectFormatFromID(git.Sha1)))
 | 
							assert.NoError(t, git.InitRepository(git.DefaultContext, dstPath, false, git.Sha1ObjectFormat.Name()))
 | 
				
			||||||
		// forcibly set default branch to master
 | 
							// forcibly set default branch to master
 | 
				
			||||||
		_, _, err := git.NewCommand(git.DefaultContext, "symbolic-ref", "HEAD", git.BranchPrefix+"master").RunStdString(&git.RunOpts{Dir: dstPath})
 | 
							_, _, err := git.NewCommand(git.DefaultContext, "symbolic-ref", "HEAD", git.BranchPrefix+"master").RunStdString(&git.RunOpts{Dir: dstPath})
 | 
				
			||||||
		assert.NoError(t, err)
 | 
							assert.NoError(t, err)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user