예제 #1
0
파일: file.go 프로젝트: dchest/hesfic
func LoadDirectory(ref *block.Ref) (entries []*Entry, err error) {
	r, err := block.NewReader(ref)
	if err != nil {
		return
	}
	err = json.NewDecoder(r).Decode(&entries)
	return
}
예제 #2
0
파일: file.go 프로젝트: dchest/hesfic
func verifyFile(entry *Entry) error {
	r, err := block.NewReader(entry.Ref)
	if err != nil {
		return err
	}
	if _, err := io.Copy(ioutil.Discard, r); err != nil {
		return err
	}
	return nil
}
예제 #3
0
파일: main.go 프로젝트: dchest/hesfic
func showRef() error {
	if flag.NArg() < 2 || flag.Arg(1) == "" {
		return fmt.Errorf("expecting block ref")
	}
	ref := block.RefFromHex([]byte(flag.Arg(1)))
	if ref == nil {
		return fmt.Errorf("bad ref %s", flag.Arg(1))
	}
	r, err := block.NewReader(ref)
	if err != nil {
		return err
	}
	if _, err := io.Copy(os.Stdout, r); err != nil {
		return err
	}
	return nil
}
예제 #4
0
파일: file.go 프로젝트: dchest/hesfic
func restoreFile(entry *Entry, outdir string) error {
	var path = filepath.Join(outdir, entry.Name)
	if entry.Mode.IsDir() {
		if err := os.MkdirAll(path, entry.Mode); err != nil {
			return err
		}
	} else {
		r, err := block.NewReader(entry.Ref)
		if err != nil {
			return err
		}
		f, err := os.OpenFile(path, os.O_CREATE|os.O_EXCL|os.O_WRONLY, entry.Mode)
		if err != nil {
			return err
		}
		if _, err := io.Copy(f, r); err != nil {
			f.Close()
			os.Remove(path)
			return err
		}
		if config.FileSync {
			if err := f.Sync(); err != nil {
				f.Close()
				os.Remove(path)
				return err
			}
		}
		if err := f.Close(); err != nil {
			os.Remove(path)
			return err
		}
	}
	if err := os.Chtimes(path, time.Now(), entry.ModTime); err != nil {
		return err
	}
	log.Printf("restored %s", path)
	return nil
}