src/server/pkg/hashtree/db.go
func visit(tx *bolt.Tx, path string, update updateFn) error {
	for path != "" {
		parent, child := split(path)
		pnode, err := get(tx, parent)
		if err != nil && Code(err) != PathNotFound {
			return err
		}
		if pnode != nil && pnode.nodetype() != directory {
			return errorf(PathConflict, "attempted to visit \"%s\", but it's not a "+
				"directory", path)
		}
		if pnode == nil {
			pnode = &NodeProto{}
		}
		if err := update(pnode, parent, child); err != nil {
			return err
		}
		if err := put(tx, parent, pnode); err != nil {
			return err
		}
		path = parent
	}
	return nil
}
func visit(tx *bolt.Tx, path string, update updateFn) error {
	for path != "" {
		parent, child := split(path)
		pnode, err := get(tx, parent)
		if err != nil && Code(err) != PathNotFound {
			return err
		}
		if pnode != nil && pnode.nodetype() != directory {
			return errorf(PathConflict, "attempted to visit \"%s\", but it's not a "+
				"directory", path)
		}
		if pnode == nil {
			pnode = &NodeProto{}
		}
		if err := update(pnode, parent, child); err != nil {
			return err
		}
		if err := put(tx, parent, pnode); err != nil {
			return err
		}
		path = parent
	}
	return nil
}
func visit ( tx * bolt . Tx , path string , update updateFn ) error { for path != " " { parent , child := split ( path ) pnode , err := get ( tx , parent ) if err != nil && Code ( err ) != PathNotFound { return err } if pnode != nil && pnode . nodetype ( ) != directory { return errorf ( PathConflict , " \" \" " + " " , path ) } if pnode == nil { pnode = & NodeProto { } } if err := update ( pnode , parent , child ) ; err != nil { return err } if err := put ( tx , parent , pnode ) ; err != nil { return err } path = parent } return nil }
// visit visits every ancestor of 'path' (excluding 'path' itself), leaf to
// root (i.e.  end of 'path' to beginning), and calls 'update' on each node
// along the way. For example, if 'visit' is called with 'path'="/path/to/file",
// then updateFn is called as follows:
//
// 1. update(node at "/path/to" or nil, "/path/to", "file")
// 2. update(node at "/path"    or nil, "/path",    "to")
// 3. update(node at "/"        or nil, "",         "path")
//
// This is useful for propagating changes to size upwards.
visit visits every ancestor of path ( excluding path itself ) leaf to root ( i . e . end of path to beginning ) and calls update on each node along the way . For example if visit is called with path = / path / to / file then updateFn is called as follows : 1 . update ( node at / path / to or nil / path / to file ) 2 . update ( node at / path or nil / path to ) 3 . update ( node at / or nil path ) This is useful for propagating changes to size upwards .