dirsTo opens all the directories above the given filename, and returns the node for element at given path (can be a file or directory itself -- not opened -- just returned)
(path string)
| 502 | // dirsTo opens all the directories above the given filename, and returns the node |
| 503 | // for element at given path (can be a file or directory itself -- not opened -- just returned) |
| 504 | func (fn *Node) dirsTo(path string) (*Node, error) { |
| 505 | pth, err := filepath.Abs(path) |
| 506 | if err != nil { |
| 507 | log.Printf("filetree.Node DirsTo path %v could not be turned into an absolute path: %v\n", path, err) |
| 508 | return nil, err |
| 509 | } |
| 510 | rpath := fn.RelativePathFrom(core.Filename(pth)) |
| 511 | if rpath == "." { |
| 512 | return fn, nil |
| 513 | } |
| 514 | dirs := strings.Split(rpath, string(filepath.Separator)) |
| 515 | cfn := fn |
| 516 | sz := len(dirs) |
| 517 | for i := 0; i < sz; i++ { |
| 518 | dr := dirs[i] |
| 519 | sfni := cfn.ChildByName(dr, 0) |
| 520 | if sfni == nil { |
| 521 | if i == sz-1 { // ok for terminal -- might not exist yet |
| 522 | return cfn, nil |
| 523 | } else { |
| 524 | err = fmt.Errorf("filetree.Node could not find node %v in: %v, orig: %v, rel: %v", dr, cfn.Filepath, pth, rpath) |
| 525 | // slog.Error(err.Error()) // note: this is expected sometimes |
| 526 | return nil, err |
| 527 | } |
| 528 | } |
| 529 | sfn := AsNode(sfni) |
| 530 | if sfn.IsDir() || i == sz-1 { |
| 531 | if i < sz-1 && !sfn.isOpen() { |
| 532 | sfn.openDir() |
| 533 | } else { |
| 534 | cfn = sfn |
| 535 | } |
| 536 | } else { |
| 537 | err := fmt.Errorf("filetree.Node non-terminal node %v is not a directory in: %v", dr, cfn.Filepath) |
| 538 | slog.Error(err.Error()) |
| 539 | return nil, err |
| 540 | } |
| 541 | cfn = sfn |
| 542 | } |
| 543 | return cfn, nil |
| 544 | } |