docs: def snapshot(opts):
      """snapshot a seqrepo data directory by hardlinking sequence files,
      copying sqlite databases, and remove write permissions from directories
  
      """
      seqrepo_dir = os.path.join(opts.root_directory, opts.instance_name)
  
      dst_dir = opts.destination_name
      if not dst_dir.startswith("/"):
          # interpret dst_dir as relative to parent dir of seqrepo_dir
          dst_dir = os.path.join(opts.root_directory, dst_dir)
  
      src_dir = os.path.realpath(seqrepo_dir)
      dst_dir = os.path.realpath(dst_dir)
  
      if commonpath([src_dir, dst_dir]).startswith(src_dir):
          raise RuntimeError("Cannot nest seqrepo directories " "({} is within {})".format(dst_dir, src_dir))
  
      if os.path.exists(dst_dir):
          raise IOError(dst_dir + ": File exists")
  
      tmp_dir = tempfile.mkdtemp(prefix=dst_dir + ".")
  
      _logger.debug("src_dir = " + src_dir)
      _logger.debug("dst_dir = " + dst_dir)
      _logger.debug("tmp_dir = " + tmp_dir)
  
      # TODO: cleanup of tmpdir on failure
      makedirs(tmp_dir, exist_ok=True)
      wd = os.getcwd()
      os.chdir(src_dir)
  
      # make destination directories (walk is top-down)
      for rp in (os.path.join(dirpath, dirname) for dirpath, dirnames, _ in os.walk(".") for dirname in dirnames):
          dp = os.path.join(tmp_dir, rp)
          os.mkdir(dp)
  
      # hard link sequence files
      for rp in (os.path.join(dirpath, filename) for dirpath, _, filenames in os.walk(".") for filename in filenames
                 if ".bgz" in filename):
          dp = os.path.join(tmp_dir, rp)
          os.link(rp, dp)
  
      # copy sqlite databases
      for rp in ["aliases.sqlite3", "sequences/db.sqlite3"]:
          dp = os.path.join(tmp_dir, rp)
          shutil.copyfile(rp, dp)
  
      # recursively drop write perms on snapshot
      mode_aw = stat.S_IWUSR | stat.S_IWGRP | stat.S_IWOTH
  
      def _drop_write(p):
          mode = os.lstat(p).st_mode
          new_mode = mode & ~mode_aw
          os.chmod(p, new_mode)
  
      for dp in (os.path.join(dirpath, dirent)
                 for dirpath, dirnames, filenames in os.walk(tmp_dir) for dirent in dirnames + filenames):
          _drop_write(dp)
      _drop_write(tmp_dir)
      os.rename(tmp_dir, dst_dir)
  
      _logger.info("snapshot created in " + dst_dir)
      os.chdir(wd)