def _link_local_copy(self, server_instance: ServerInstance) -> None: """Actually link the local copy.""" mod_folder = join(server_instance.get_server_instance_path(), server_instance.S.linked_mod_folder_name, "@" + self.name) mod_fix_settings = server_instance.S.fix_settings.mod_fix_settings local_folder = abspath(mod_fix_settings["odkai_local_path"]) symlink(local_folder, mod_folder)
def test_should_create_a_symlink(self, reset_folder_structure): """Symlink function should create a symlink.""" test_path = test_folder_structure_path() src = join(test_path, "TestFolder1") dest = join(test_path, "__server__TestServer0", "TestFolder1") symlink(src, dest) assert islink(dest) assert isfile(join(dest, "testFile1.txt"))
def test_on_update_should_force_the_local_copy(self): """A mod fix odkai local on update should force the local copy.""" unlink(self.mod_folder) symlink(join(self.test_path, "!Workshop", "@ODKAI"), self.mod_folder) assert not isfile(join(self.mod_folder, "local_mod")) self.instance._start_op_on_mods("update", ["ODKAI"]) assert islink(self.mod_folder) assert isfile(join(self.mod_folder, "local_mod"))
def _do_op(self, mod_name, arma_folder, target_mod_folder) -> None: """Actually create the folder, symlink everything and symlink the keys folder.""" mod_folder = join(arma_folder, "!Workshop", "@{}".format(mod_name)) mkdir(target_mod_folder) symlink_everything_from_folder(mod_folder, target_mod_folder) unusual_keys_folder = join(target_mod_folder, self.keys_folder_name) correct_keys_folder = join(target_mod_folder, "Keys") symlink(unusual_keys_folder, correct_keys_folder)
def _symlink_mod(self, mod_name) -> None: """Symlink a single mod in the linked mod folder.""" server_folder = self.get_server_instance_path() workshop_folder = join(self.S.arma_folder, "!Workshop") mod_folder = "@" + mod_name target_folder = join(server_folder, self.S.linked_mod_folder_name) if not islink(join(target_folder, mod_folder)): symlink(join(workshop_folder, mod_folder), join(target_folder, mod_folder))
def _symlink_warning_folder(self) -> None: """Symlink the warning folder inside the linked mod folder if needed.""" server_folder = self.get_server_instance_path() workshop_folder = join(self.S.arma_folder, "!Workshop") linked_mod_folder = join(server_folder, self.S.linked_mod_folder_name) warning_folder_name = "!DO_NOT_CHANGE_FILES_IN_THESE_FOLDERS" warning_folder = join(linked_mod_folder, warning_folder_name) if not islink(warning_folder): symlink(join(workshop_folder, warning_folder_name), warning_folder)
def test_should_work_on_old_win(self, reset_folder_structure, mocker, monkeypatch): """Symlink function should work on old win.""" mocker.patch("os.symlink", "") # disable modern symlink test_path = test_folder_structure_path() src = join(test_path, "TestFolder1") dest = join(test_path, "__server__TestServer0", "TestFolder1") symlink(src, dest) assert islink(dest) assert isfile(join(dest, "testFile1.txt")) with pytest.raises(OSError): symlink(src, dest) # check that errors correctly
def _link_keys_in_folder(self, mods_root_folder: str) -> None: """Link all keys from the mods in the given folder to the instance keys folder.""" for mod_folder_name in filter(lambda x: self._should_link_mod_key(x[1:]), listdir(mods_root_folder)): mod_folder = abspath(join(mods_root_folder, mod_folder_name)) # look for the key folder there key_folder = list(filter(lambda name: name.lower() == "keys" or name.lower() == "key", listdir(mod_folder))) if len(key_folder) > 0: # if there's one, the key inside needs to be linked over the main key folder mod_key_folder = join(mod_folder, key_folder[0]) key_files = list(filter(lambda x: self._is_keyfile(join(mod_key_folder, x)), listdir(mod_key_folder))) for key_file in key_files: src = join(mod_key_folder, key_file) dest = join(self.get_server_instance_path(), self.keys_folder_name, key_file) # check if the key is already there if not islink(dest): symlink(src, dest)
def _prepare_server_core(self) -> None: """Symlink or create all needed files and dir for a new server instance.""" # make all needed symlink server_folder = self.get_server_instance_path() arma_folder_list = listdir(self.S.arma_folder) to_be_linked = list(filter(lambda x: self._filter_symlinks(x), arma_folder_list)) for el in to_be_linked: src = join(self.S.arma_folder, el) dest = join(server_folder, el) symlink(src, dest) # Create the needed folder to_be_created = [self.keys_folder_name, self.S.linked_mod_folder_name, self.S.copied_mod_folder_name, "userconfig"] for folder in to_be_created: folder = join(server_folder, folder) mkdir(folder) # Copy the arma keyfiles for key in self.arma_keys: arma_key_folder = join(self.S.arma_folder, self.keys_folder_name) instance_key_folder = join(server_folder, self.keys_folder_name) if isfile(join(arma_key_folder, key)): symlink(join(arma_key_folder, key), join(instance_key_folder, key))
def _link_cba(self, server_instance: ServerInstance) -> None: """Symlink the cba_settings.sqf specified in the cba_settings field.""" cba_settings_target = self._get_cba_path(server_instance) if not islink(cba_settings_target): symlink(self._get_default_cba_path(server_instance), cba_settings_target)