docs: def grow(self, path):
          """
          Grow the metadata tree for the given directory path
  
          Note: For each path, grow() should be run only once. Growing the tree
          from the same path multiple times with attribute adding using the "+"
          sign leads to adding the value more than once!
          """
          if path is None:
              return
          path = path.rstrip("/")
          log.info("Walking through directory {0}".format(
              os.path.abspath(path)))
          dirpath, dirnames, filenames = next(os.walk(path))
          # Investigate main.fmf as the first file (for correct inheritance)
          filenames = sorted(
              [filename for filename in filenames if filename.endswith(SUFFIX)])
          try:
              filenames.insert(0, filenames.pop(filenames.index(MAIN)))
          except ValueError:
              pass
          # Check every metadata file and load data (ignore hidden)
          for filename in filenames:
              if filename.startswith("."):
                  continue
              fullpath = os.path.abspath(os.path.join(dirpath, filename))
              log.info("Checking file {0}".format(fullpath))
              try:
                  with open(fullpath) as datafile:
                      data = yaml.load(datafile, Loader=FullLoader)
              except yaml.scanner.ScannerError as error:
                      raise(utils.FileError("Failed to parse '{0}'\n{1}".format(
                              fullpath, error)))
              log.data(pretty(data))
              # Handle main.fmf as data for self
              if filename == MAIN:
                  self.sources.append(fullpath)
                  self.update(data)
              # Handle other *.fmf files as children
              else:
                  self.child(os.path.splitext(filename)[0], data, fullpath)
          # Explore every child directory (ignore hidden dirs and subtrees)
          for dirname in sorted(dirnames):
              if dirname.startswith("."):
                  continue
              # Ignore metadata subtrees
              if os.path.isdir(os.path.join(path, dirname, SUFFIX)):
                  log.debug("Ignoring metadata tree '{0}'.".format(dirname))
                  continue
              self.child(dirname, os.path.join(path, dirname))
          # Remove empty children (ignore directories without metadata)
          for name in list(self.children.keys()):
              child = self.children[name]
              if not child.data and not child.children:
                  del(self.children[name])
                  log.debug("Empty tree '{0}' removed.".format(child.name))
          # Apply inheritance when all scattered data are gathered.
          # This is done only once, from the top parent object.
          if self.parent is None:
              self.inherit()