diff options
author | Adam Majer <amajer@suse.de> | 2023-12-13 21:02:00 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-13 21:02:00 +0000 |
commit | cbf923e87bca0f50c2c01a60ccf544b63c365e98 (patch) | |
tree | 9e2e66c688bdc0f740e1ae333847dfb33677c730 /modules/git/repo_object.go | |
parent | 064f05204c0539d1f92895776dee7f626a628e3b (diff) | |
download | gitea-cbf923e87bca0f50c2c01a60ccf544b63c365e98.tar.gz gitea-cbf923e87bca0f50c2c01a60ccf544b63c365e98.zip |
Abstract hash function usage (#28138)
Refactor Hash interfaces and centralize hash function. This will allow
easier introduction of different hash function later on.
This forms the "no-op" part of the SHA256 enablement patch.
Diffstat (limited to 'modules/git/repo_object.go')
-rw-r--r-- | modules/git/repo_object.go | 44 |
1 files changed, 37 insertions, 7 deletions
diff --git a/modules/git/repo_object.go b/modules/git/repo_object.go index 9edc201fea..220fdb3807 100644 --- a/modules/git/repo_object.go +++ b/modules/git/repo_object.go @@ -31,17 +31,47 @@ func (o ObjectType) Bytes() []byte { return []byte(o) } -// HashObject takes a reader and returns SHA1 hash for that reader -func (repo *Repository) HashObject(reader io.Reader) (SHA1, error) { - idStr, err := repo.hashObject(reader) +type EmptyReader struct{} + +func (EmptyReader) Read(p []byte) (int, error) { + return 0, io.EOF +} + +func (repo *Repository) GetObjectFormat() (ObjectFormat, error) { + if repo != nil && repo.objectFormat != nil { + return repo.objectFormat, nil + } + + str, err := repo.hashObject(EmptyReader{}, false) + if err != nil { + return nil, err + } + hash, err := IDFromString(str) if err != nil { - return SHA1{}, err + return nil, err } - return NewIDFromString(idStr) + + repo.objectFormat = hash.Type() + + return repo.objectFormat, nil } -func (repo *Repository) hashObject(reader io.Reader) (string, error) { - cmd := NewCommand(repo.Ctx, "hash-object", "-w", "--stdin") +// HashObject takes a reader and returns hash for that reader +func (repo *Repository) HashObject(reader io.Reader) (ObjectID, error) { + idStr, err := repo.hashObject(reader, true) + if err != nil { + return nil, err + } + return repo.objectFormat.NewIDFromString(idStr) +} + +func (repo *Repository) hashObject(reader io.Reader, save bool) (string, error) { + var cmd *Command + if save { + cmd = NewCommand(repo.Ctx, "hash-object", "-w", "--stdin") + } else { + cmd = NewCommand(repo.Ctx, "hash-object", "--stdin") + } stdout := new(bytes.Buffer) stderr := new(bytes.Buffer) err := cmd.Run(&RunOpts{ |