def add_mount( self, path: str, uid: Optional[int] = None, dev: Optional[int] = None, mode: Optional[int] = None, device: str = EDENFS_DEVTYPE, vfstype: str = "fuse", ) -> None: if uid is None: uid = os.getuid() if dev is None: dev = self._next_dev self._next_dev += 1 if mode is None: mode = 16877 self._add_mount_info(path, device=device, vfstype=vfstype) self.stats[path] = mtab.MTStat(st_uid=uid, st_dev=dev, st_mode=mode) if device == EDENFS_DEVTYPE: self.stats[os.path.join(path, ".eden")] = mtab.MTStat(st_uid=uid, st_dev=dev, st_mode=mode)
def create_test_mount( self, path: str, snapshot: Optional[str] = None, client_name: Optional[str] = None, scm_type: str = "hg", active: bool = True, setup_path: bool = True, dirstate_parent: Union[str, Tuple[str, str], None] = None, backing_repo: Optional[Path] = None, ) -> EdenCheckout: """ Define a configured mount. If active is True and status was set to ALIVE when creating the FakeClient then the mount will appear as a normal active mount. It will be reported in the thrift results and the mount table, and the mount directory will be populated with a .hg/ or .git/ subdirectory. The setup_path argument can be set to False to prevent creating the fake mount directory on disk. Returns the absolute path to the mount directory. """ full_path = os.path.join(self._tmp_dir, path) if full_path in self._checkouts_by_path: raise Exception(f"duplicate mount definition: {full_path}") if snapshot is None: snapshot = self.default_commit_hash if client_name is None: client_name = path.replace("/", "_") backing_repo_path = (backing_repo if backing_repo is not None else self.default_backing_repo) state_dir = self.clients_path / client_name assert full_path not in self._checkouts_by_path config = CheckoutConfig( backing_repo=backing_repo_path, scm_type=scm_type, guid=uuid.uuid4(), mount_protocol="prjfs" if sys.platform == "win32" else "fuse", default_revision=snapshot, redirections={}, active_prefetch_profiles=[], ) checkout = FakeCheckout(state_dir=state_dir, config=config, snapshot=snapshot) self._checkouts_by_path[full_path] = checkout # Write out the config file and snapshot file state_dir.mkdir() eden_checkout = EdenCheckout(typing.cast(EdenInstance, self), Path(full_path), state_dir) eden_checkout.save_config(config) eden_checkout.save_snapshot(snapshot) if active and self._status == fb303_status.ALIVE: # Report the mount in /proc/mounts dev_id = self._next_dev_id self._next_dev_id += 1 self.mount_table.stats[full_path] = mtab.MTStat( st_uid=os.getuid(), st_dev=dev_id, st_mode=(stat.S_IFDIR | 0o755)) # Tell the thrift client to report the mount as active self._fake_client._mounts.append( eden_ttypes.MountInfo( mountPoint=os.fsencode(full_path), edenClientPath=os.fsencode(state_dir), state=eden_ttypes.MountState.RUNNING, )) # Set up directories on disk that look like the mounted checkout if setup_path: os.makedirs(full_path) if scm_type == "hg": self._setup_hg_path(full_path, checkout, dirstate_parent) elif scm_type == "git": os.mkdir(os.path.join(full_path, ".git")) return EdenCheckout(typing.cast(EdenInstance, self), Path(full_path), Path(state_dir))