import (
"bytes"
"crypto/sha256"
+ "path"
"path/filepath"
//"errors"
}
if target.UpToDate {
log.Debugf("%s : up-to-date, not updated", target.Name)
- return target, nil
+ // We still have to check if data files are present
}
}
req, err := http.NewRequest("GET", fmt.Sprintf(RawFileURLTemplate, HubBranch, target.RemotePath), nil)
target.Tainted = false
target.UpToDate = true
- dec := yaml.NewDecoder(bytes.NewReader(body))
+ if err = downloadData(dataFolder, overwrite, bytes.NewReader(body)); err != nil {
+ return target, errors.Wrapf(err, "while downloading data for %s", target.FileName)
+ }
+
+ hubIdx[target.Type][target.Name] = target
+ return target, nil
+}
+
+func DownloadDataIfNeeded(dataFolder string, hubdir string, target Item, force bool) error {
+ var (
+ itemFile *os.File
+ err error
+ )
+ itemFilePath := fmt.Sprintf("%s/%s", hubdir, target.RemotePath)
+
+ if itemFile, err = os.Open(itemFilePath); err != nil {
+ return errors.Wrapf(err, "while opening %s", itemFilePath)
+ }
+ if err = downloadData(dataFolder, force, itemFile); err != nil {
+ return errors.Wrapf(err, "while downloading data for %s", itemFilePath)
+ }
+ return nil
+}
+
+func downloadData(dataFolder string, force bool, reader io.Reader) error {
+ var err error
+ dec := yaml.NewDecoder(reader)
+
for {
data := &types.DataSet{}
err = dec.Decode(data)
if err == io.EOF {
break
} else {
- return target, errors.Wrap(err, "while reading file")
+ return errors.Wrap(err, "while reading file")
}
}
- err = types.GetData(data.Data, dataFolder)
- if err != nil {
- return target, errors.Wrap(err, "while getting data")
+
+ download := false
+ if !force {
+ for _, dataS := range data.Data {
+ if _, err := os.Stat(path.Join(dataFolder, dataS.DestPath)); os.IsNotExist(err) {
+ download = true
+ }
+ }
+ }
+ if download || force {
+ err = types.GetData(data.Data, dataFolder)
+ if err != nil {
+ return errors.Wrap(err, "while getting data")
+ }
}
}
- hubIdx[target.Type][target.Name] = target
- return target, nil
+ return nil
}