//hashFilesInDir computes h=hash(h,file bytes) for each file in a directory //Directory entries are traversed recursively. In the end a single //hash value is returned for the entire directory structure func hashFilesInDir(rootDir string, dir string, hash []byte, tw *tar.Writer) ([]byte, error) { currentDir := filepath.Join(rootDir, dir) logger.Debug("hashFiles %s", currentDir) //ReadDir returns sorted list of files in dir fis, err := ioutil.ReadDir(currentDir) if err != nil { return hash, fmt.Errorf("ReadDir failed %s\n", err) } for _, fi := range fis { name := filepath.Join(dir, fi.Name()) if fi.IsDir() { var err error hash, err = hashFilesInDir(rootDir, name, hash, tw) if err != nil { return hash, err } continue } fqp := filepath.Join(rootDir, name) buf, err := ioutil.ReadFile(fqp) if err != nil { fmt.Printf("Error reading %s\n", err) return hash, err } newSlice := make([]byte, len(hash)+len(buf)) copy(newSlice[len(buf):], hash[:]) //hash = md5.Sum(newSlice) hash = util.ComputeCryptoHash(newSlice) if tw != nil { is := bytes.NewReader(buf) if err = cutil.WriteStreamToPackage(is, fqp, filepath.Join("src", name), tw); err != nil { return hash, fmt.Errorf("Error adding file to tar %s", err) } } } return hash, nil }
//hashFilesInDir computes h=hash(h,file bytes) for each file in a directory //Directory entries are traversed recursively. In the end a single //hash value is returned for the entire directory structure func hashFilesInDir(rootDir string, dir string, hash []byte, tw *tar.Writer) ([]byte, error) { currentDir := filepath.Join(rootDir, dir) logger.Debugf("hashFiles %s", currentDir) //ReadDir returns sorted list of files in dir fis, err := ioutil.ReadDir(currentDir) if err != nil { return hash, fmt.Errorf("ReadDir failed %s\n", err) } for _, fi := range fis { name := filepath.Join(dir, fi.Name()) if fi.IsDir() { var err error hash, err = hashFilesInDir(rootDir, name, hash, tw) if err != nil { return hash, err } continue } fqp := filepath.Join(rootDir, name) buf, err := ioutil.ReadFile(fqp) if err != nil { fmt.Printf("Error reading %s\n", err) return hash, err } //get the new hash from file contents hash = computeHash(buf, hash) if tw != nil { is := bytes.NewReader(buf) if err = cutil.WriteStreamToPackage(is, fqp, filepath.Join("src", name), tw); err != nil { return hash, fmt.Errorf("Error adding file to tar %s", err) } } } return hash, nil }
//hashFilesInDir computes h=hash(h,file bytes) for each file in a directory //Directory entries are traversed recursively. In the end a single //hash value is returned for the entire directory structure func hashFilesInDir(cutoff string, dir string, hash []byte, tw *tar.Writer) ([]byte, error) { //ReadDir returns sorted list of files in dir fis, err := ioutil.ReadDir(dir) if err != nil { return hash, fmt.Errorf("ReadDir failed %s\n", err) } for _, fi := range fis { name := fmt.Sprintf("%s/%s", dir, fi.Name()) if fi.IsDir() { var err error hash, err = hashFilesInDir(cutoff, name, hash, tw) if err != nil { return hash, err } continue } buf, err := ioutil.ReadFile(name) if err != nil { fmt.Printf("Error reading %s\n", err) return hash, err } newSlice := make([]byte, len(hash)+len(buf)) copy(newSlice[len(buf):], hash[:]) //hash = md5.Sum(newSlice) hash = util.ComputeCryptoHash(newSlice) if tw != nil { is := bytes.NewReader(buf) if err = cutil.WriteStreamToPackage(is, name, name[len(cutoff):], tw); err != nil { return hash, fmt.Errorf("Error adding file to tar %s", err) } } } return hash, nil }