2023-12-14 00:02:00 +03:00
// Copyright 2023 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package git
import (
"bytes"
"encoding/hex"
"fmt"
)
type ObjectID interface {
String ( ) string
IsZero ( ) bool
RawValue ( ) [ ] byte
Type ( ) ObjectFormat
}
type Sha1Hash [ 20 ] byte
func ( h * Sha1Hash ) String ( ) string {
return hex . EncodeToString ( h [ : ] )
}
func ( h * Sha1Hash ) IsZero ( ) bool {
empty := Sha1Hash { }
return bytes . Equal ( empty [ : ] , h [ : ] )
}
func ( h * Sha1Hash ) RawValue ( ) [ ] byte { return h [ : ] }
2023-12-17 14:56:08 +03:00
func ( * Sha1Hash ) Type ( ) ObjectFormat { return Sha1ObjectFormat }
2023-12-14 00:02:00 +03:00
2023-12-17 14:56:08 +03:00
var _ ObjectID = & Sha1Hash { }
2023-12-14 00:02:00 +03:00
2023-12-19 10:20:47 +03:00
func MustIDFromString ( hexHash string ) ObjectID {
id , err := NewIDFromString ( hexHash )
if err != nil {
panic ( err )
2023-12-14 00:02:00 +03:00
}
2023-12-19 10:20:47 +03:00
return id
2023-12-14 00:02:00 +03:00
}
2024-01-19 19:05:02 +03:00
type Sha256Hash [ 32 ] byte
func ( h * Sha256Hash ) String ( ) string {
return hex . EncodeToString ( h [ : ] )
}
func ( h * Sha256Hash ) IsZero ( ) bool {
empty := Sha256Hash { }
return bytes . Equal ( empty [ : ] , h [ : ] )
}
func ( h * Sha256Hash ) RawValue ( ) [ ] byte { return h [ : ] }
func ( * Sha256Hash ) Type ( ) ObjectFormat { return Sha256ObjectFormat }
2023-12-19 10:20:47 +03:00
func NewIDFromString ( hexHash string ) ( ObjectID , error ) {
var theObjectFormat ObjectFormat
2024-05-06 19:34:16 +03:00
for _ , objectFormat := range DefaultFeatures ( ) . SupportedObjectFormats {
2023-12-19 10:20:47 +03:00
if len ( hexHash ) == objectFormat . FullLength ( ) {
theObjectFormat = objectFormat
break
}
2023-12-14 00:02:00 +03:00
}
2023-12-19 10:20:47 +03:00
if theObjectFormat == nil {
return nil , fmt . Errorf ( "length %d has no matched object format: %s" , len ( hexHash ) , hexHash )
2023-12-14 00:02:00 +03:00
}
2023-12-19 10:20:47 +03:00
b , err := hex . DecodeString ( hexHash )
2023-12-14 00:02:00 +03:00
if err != nil {
2023-12-19 10:20:47 +03:00
return nil , err
2023-12-14 00:02:00 +03:00
}
2023-12-19 10:20:47 +03:00
if len ( b ) != theObjectFormat . FullLength ( ) / 2 {
return theObjectFormat . EmptyObjectID ( ) , fmt . Errorf ( "length must be %d: %v" , theObjectFormat . FullLength ( ) , b )
2023-12-14 00:02:00 +03:00
}
2023-12-19 10:20:47 +03:00
return theObjectFormat . MustID ( b ) , nil
2023-12-14 00:02:00 +03:00
}
func IsEmptyCommitID ( commitID string ) bool {
if commitID == "" {
return true
}
2023-12-19 10:20:47 +03:00
id , err := NewIDFromString ( commitID )
2023-12-14 00:02:00 +03:00
if err != nil {
return false
}
return id . IsZero ( )
}
// ComputeBlobHash compute the hash for a given blob content
func ComputeBlobHash ( hashType ObjectFormat , content [ ] byte ) ObjectID {
2023-12-19 10:20:47 +03:00
return hashType . ComputeHash ( ObjectBlob , content )
2023-12-14 00:02:00 +03:00
}
type ErrInvalidSHA struct {
SHA string
}
func ( err ErrInvalidSHA ) Error ( ) string {
return fmt . Sprintf ( "invalid sha: %s" , err . SHA )
}