code: func SymbolicWalk(fs afero.Fs, root string, walker filepath.WalkFunc) error {
  
  	// Sanity check
  	if root != "" && len(root) < 4 {
  		return errors.New("path is too short")
  	}
  
  	// Handle the root first
  	fileInfo, realPath, err := getRealFileInfo(fs, root)
  
  	if err != nil {
  		return walker(root, nil, err)
  	}
  
  	if !fileInfo.IsDir() {
  		return fmt.Errorf("cannot walk regular file %s", root)
  	}
  
  	if err := walker(realPath, fileInfo, err); err != nil && err != filepath.SkipDir {
  		return err
  	}
  
  	// Some of Hugo's filesystems represents an ordered root folder, i.e. project first, then theme folders.
  	// Make sure that order is preserved. afero.Walk will sort the directories down in the file tree,
  	// but we don't care about that.
  	rootContent, err := readDir(fs, root, false)
  
  	if err != nil {
  		return walker(root, nil, err)
  	}
  
  	for _, fi := range rootContent {
  		if err := afero.Walk(fs, filepath.Join(root, fi.Name()), walker); err != nil {
  			return err
  		}
  	}
  
  	return nil
  
  }
docs: // SymbolicWalk is like filepath.Walk, but it supports the root being a
  // symbolic link. It will still not follow symbolic links deeper down in
  // the file structure.