Files
gvc/common/engine/filehashing.go

44 lines
1.1 KiB
Go

package engine
import (
"crypto/sha256"
"encoding/hex"
"fmt"
"io/ioutil"
"time"
"github.com/deranjer/gvc/common/database"
)
// UniqueFileHash uses SHA256 to create a hash of the file
func UniqueFileHash(src string) ([]byte, error) {
file, err := ioutil.ReadFile(src)
if err != nil {
return []byte{}, err
}
hasher := sha256.New()
hasher.Write(file)
hash := hasher.Sum(nil)
return hash, nil
}
// CreateCommitHash creates a hash of all the files and time and commit message
func CreateCommitHash(fileList []database.File, commitMessage string) (hash []byte, err error) {
hasher := sha256.New()
for _, file := range fileList {
var err error
err = file.CalculateHash()
if err != nil {
return nil, fmt.Errorf("unable to calculate hash for file: %s with error: %s", file.Path, err)
}
hasher.Write(file.Hash[:])
}
time := time.Now() // Adding the metadata to the hash
hasher.Write([]byte(commitMessage + time.String()))
hashBytes := hasher.Sum(nil) // Getting the hash bytes
fullHash := hex.EncodeToString(hashBytes)
fmt.Println("Commit hash: ", fullHash)
return hashBytes, nil
}