示例#1
0
文件: tree.go 项目: e8vm/shanhu
func loadTree(s store.Store, hash string) (*Tree, error) {
	bs, err := s.Get(hash)
	if err != nil {
		return nil, err
	}
	return unmarshalTree(bs)
}
示例#2
0
文件: tree.go 项目: e8vm/shanhu
func makeTree(s store.Store, v *view) (string, error) {
	var dirs []string
	trees := make(map[string]*Tree)
	for name, d := range v.Dirs {
		dirs = append(dirs, name)
		trees[name] = newTree(d)
		if !path.IsAbs(name) {
			return "", fmt.Errorf("invalid dir in view: %q", name)
		}
	}
	sort.Strings(dirs)

	ndir := len(dirs)
	for i := ndir - 1; i >= 0; i-- {
		name := dirs[i]
		t := trees[name]
		bs, err := json.Marshal(t)
		if err != nil {
			return "", err
		}
		hash, err := s.Put(bs)
		if err != nil {
			return "", err
		}
		if name == "/" {
			return hash, nil
		}

		parent, base := path.Split(name)
		if parent != "/" {
			parent = strings.TrimSuffix(parent, "/")
		}

		parentTree := trees[parent]
		if parentTree == nil {
			return "", fmt.Errorf("dangling dir: %q", name)
		}
		if _, found := parentTree.Nodes[base]; found {
			return "", fmt.Errorf("duplicate entry: %q", name)
		}

		parentTree.Nodes[base] = &TreeNode{IsTree: true, Hash: hash}
	}

	return "", fmt.Errorf("root dir missing")
}