diff options
| author | 2023-04-28 01:36:44 +0800 | |
|---|---|---|
| committer | 2023-04-28 01:36:44 +0800 | |
| commit | dd84b9d64fb98746a230cd24233ff50a562c39c9 (patch) | |
| tree | b583261ef00b3afe72ec4d6dacb31e57779a6faf /cli/internal/fs/hash.go | |
| parent | 0b46fcd72ac34382387b2bcf9095233efbcc52f4 (diff) | |
| download | HydroRoll-dd84b9d64fb98746a230cd24233ff50a562c39c9.tar.gz HydroRoll-dd84b9d64fb98746a230cd24233ff50a562c39c9.zip | |
Diffstat (limited to 'cli/internal/fs/hash.go')
| -rw-r--r-- | cli/internal/fs/hash.go | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/cli/internal/fs/hash.go b/cli/internal/fs/hash.go new file mode 100644 index 0000000..fed7d87 --- /dev/null +++ b/cli/internal/fs/hash.go @@ -0,0 +1,61 @@ +package fs + +import ( + "crypto/sha1" + "encoding/hex" + "fmt" + "io" + "os" + "strconv" + + "github.com/vercel/turbo/cli/internal/xxhash" +) + +func HashObject(i interface{}) (string, error) { + hash := xxhash.New() + + _, err := hash.Write([]byte(fmt.Sprintf("%v", i))) + + return hex.EncodeToString(hash.Sum(nil)), err +} + +func HashFile(filePath string) (string, error) { + file, err := os.Open(filePath) + if err != nil { + return "", err + } + defer file.Close() + + hash := xxhash.New() + if _, err := io.Copy(hash, file); err != nil { + return "", err + } + + return hex.EncodeToString(hash.Sum(nil)), nil +} + +// GitLikeHashFile is a function that mimics how Git +// calculates the SHA1 for a file (or, in Git terms, a "blob") (without git) +func GitLikeHashFile(filePath string) (string, error) { + file, err := os.Open(filePath) + if err != nil { + return "", err + } + defer file.Close() + + stat, err := file.Stat() + if err != nil { + return "", err + } + hash := sha1.New() + hash.Write([]byte("blob")) + hash.Write([]byte(" ")) + hash.Write([]byte(strconv.FormatInt(stat.Size(), 10))) + hash.Write([]byte{0}) + + if _, err := io.Copy(hash, file); err != nil { + return "", err + } + + return hex.EncodeToString(hash.Sum(nil)), nil +} |
