Beispiel #1
0
// Save stores file from disk at the given path and returns its metadata.
func saveFile(path string) (entry *Entry, err error) {
	fi, err := os.Stat(path)
	if err != nil {
		return
	}
	f, err := os.Open(path)
	if err != nil {
		return
	}
	defer f.Close()

	w := block.NewWriter()
	_, err = io.Copy(w, f)
	if err != nil {
		return
	}
	ref, err := w.Finish()
	if err != nil {
		return
	}
	entry = &Entry{
		Name:    fi.Name(),
		Size:    fi.Size(),
		ModTime: fi.ModTime(),
		Mode:    fi.Mode(),
		Ref:     ref,
	}
	log.Printf("[%d] stored file %s", w.BlockCount(), path)
	return
}
Beispiel #2
0
func SaveDirectory(dirpath string) (entry *Entry, err error) {
	fi, err := os.Stat(dirpath)
	if err != nil {
		return
	}
	dir, err := os.Open(dirpath)
	if err != nil {
		return
	}
	defer dir.Close()
	fis, err := dir.Readdir(0)
	if err != nil {
		return
	}
	entries := make([]*Entry, 0)
	// Save files and subdirectories.
	for _, fi := range fis {
		fullpath := filepath.Join(dirpath, fi.Name())
		var e *Entry
		if fi.IsDir() {
			e, err = SaveDirectory(fullpath)
		} else {
			e, err = saveFile(fullpath)
		}
		if err != nil {
			return
		}
		entries = append(entries, e)
	}
	// Save directory index.
	w := block.NewWriter()
	enc := json.NewEncoder(w)
	err = enc.Encode(entries)
	if err != nil {
		return
	}
	ref, err := w.Finish()
	if err != nil {
		return
	}
	log.Printf("[%d] stored directory %s at %s", w.BlockCount(), dirpath, ref)
	entry = &Entry{
		Name:    fi.Name(),
		Size:    fi.Size(),
		ModTime: fi.ModTime(),
		Mode:    fi.Mode(),
		Ref:     ref,
	}
	return
}