From ea064d24f2771f10d9d1d22c10139a7ac73b4154 Mon Sep 17 00:00:00 2001 From: Christian Pointner <equinox@helsinki.at> Date: Wed, 15 Aug 2018 13:13:00 +0200 Subject: [PATCH] also return source file hash on api call --- importer/fetch.go | 42 ++++++++++++++++++++++++++++-------------- importer/types.go | 5 +++-- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/importer/fetch.go b/importer/fetch.go index 0e8bbf0..7592403 100644 --- a/importer/fetch.go +++ b/importer/fetch.go @@ -25,12 +25,13 @@ package importer import ( - "crypto/sha256" - "encoding/hex" + "encoding/base64" "io" "sync/atomic" "time" "unsafe" + + "golang.org/x/crypto/blake2b" ) type devNull uint64 @@ -81,6 +82,11 @@ func (pw *progressWriter) Write(p []byte) (n int, err error) { return } +type copyResult struct { + err error + hash string +} + func (job *Job) fetch() error { job.Progress.set(StepFetching, 0) @@ -100,31 +106,39 @@ func (job *Job) fetch() error { return err } - done := make(chan error) + done := make(chan copyResult) go func() { - hash := sha256.New() + hash, err := blake2b.New256(nil) + if err != nil { + panic("created hash function failed: " + err.Error()) + } src := io.TeeReader(job.source.r, hash) written, err := io.Copy(&progressWriter{job, 0, conv}, src) - hashHex := hex.EncodeToString(hash.Sum(nil)) - job.im.dbgLog.Printf("fetch(): done copying %d bytes from source (SHA256: %s)", written, hashHex) - job.im.store.UpdateFileSourceHash(job.Group, job.ID, "sha256:"+hashHex) - done <- err + if err != nil { + done <- copyResult{err, ""} + return + } + hashStr := "blake2b_256:" + base64.URLEncoding.EncodeToString(hash.Sum(nil)) + job.im.dbgLog.Printf("fetch(): done copying %d bytes from source (%s)", written, hashStr) + _, err = job.im.store.UpdateFileSourceHash(job.Group, job.ID, hashStr) + done <- copyResult{err, hashStr} }() + var res copyResult select { case <-job.ctx.Done(): return job.ctx.Err() - case err = <-done: + case res = <-done: } conv.Close() - corr, convLog, convErr := conv.Wait() - job.im.dbgLog.Printf("fetch(): converter returned: %f db, %v", corr, convErr) - if convErr != nil { - err = convErr + corr, convLog, err := conv.Wait() + job.im.dbgLog.Printf("fetch(): converter returned: %f db, %v", corr, err) + if err == nil { + err = res.err } job.Progress.set(StepFetching, 1) - job.source.done <- &JobSourceResult{err, convLog} + job.source.done <- &JobSourceResult{err, res.hash, convLog} return err } diff --git a/importer/types.go b/importer/types.go index fff5700..b8c674d 100644 --- a/importer/types.go +++ b/importer/types.go @@ -75,8 +75,9 @@ func (s *SourceURL) UnmarshalText(data []byte) (err error) { //******* Source type JobSourceResult struct { - Err error `json:"error,omitempty"` - Log []string `json:"log"` + Err error `json:"error,omitempty"` + Hash string `json:"hash,omitempty"` + Log []string `json:"log"` } func (r *JobSourceResult) Error() string { -- GitLab