class FsModel(AnnexModel): __slots__ = AnnexModel.__slots__ def __init__(self, path, *args, **kwargs): super(FsModel, self).__init__(*args, **kwargs) self._path = Path(path) @property def path(self): return str(self._path) @property def symlink(self): """if symlink returns path the symlink points to else returns None""" if self._path.is_symlink(): # if symlink target_path = self._path.resolve() # find link target # convert to absolute path if not return str(target_path) if target_path.exists() else None return None @property def date(self): """Date of last modification""" if self.type_ is not ['git', 'annex']: return self._path.lstat().st_mtime else: return super(self.__class__, self).date @property def size(self): """Size of the node computed based on its type""" type_ = self.type_ sizes = {'total': 0.0, 'ondisk': 0.0, 'git': 0.0, 'annex': 0.0, 'annex_worktree': 0.0} if type_ in ['file', 'link', 'link-broken']: # if node is under annex, ask annex for node size, ondisk_size if isinstance(self.repo, AnnexRepo) and self.repo.is_under_annex(str(self._path)): size = self.repo.info(str(self._path), batch=True)['size'] ondisk_size = size \ if self.repo.file_has_content(str(self._path)) \ else 0 # else ask fs for node size (= ondisk_size) else: size = ondisk_size = 0 \ if type_ == 'link-broken' \ else lstat(self.symlink or str(self._path)).st_size sizes.update({'total': size, 'ondisk': ondisk_size}) if self.repo.pathobj == self._path: sizes.update({'git': self.git_local_size, 'annex': self.annex_local_size, 'annex_worktree': self.annex_worktree_size}) return sizes @property def type_(self): """outputs the node type Types: link, link-broken, file, dir, annex-repo, git-repo""" if islink(self.path): return 'link' if self.symlink else 'link-broken' elif isfile(self.path): return 'file' elif exists(opj(self.path, ".git", "annex")): return 'annex' elif exists(opj(self.path, ".git")): return 'git' elif isdir(self.path): return 'dir' else: return None