def test_mark_config_as_used_readonly(tmpdir): cfg = tmpdir.join('f').ensure() store_dir = tmpdir.join('store') # make a store, then we'll convert its directory to be readonly assert not Store(str(store_dir)).readonly # directory didn't exist assert not Store(str(store_dir)).readonly # directory did exist def _chmod_minus_w(p): st = os.stat(p) os.chmod(p, st.st_mode & ~(stat.S_IWUSR | stat.S_IWOTH | stat.S_IWGRP)) _chmod_minus_w(store_dir) for fname in os.listdir(store_dir): assert not os.path.isdir(fname) _chmod_minus_w(os.path.join(store_dir, fname)) store = Store(str(store_dir)) assert store.readonly # should be skipped due to readonly store.mark_config_used(str(cfg)) assert store.select_all_configs() == []
def _gc_repos(store: Store) -> int: configs = store.select_all_configs() repos = store.select_all_repos() # delete config paths which do not exist dead_configs = [p for p in configs if not os.path.exists(p)] live_configs = [p for p in configs if os.path.exists(p)] all_repos = {(repo, ref): path for repo, ref, path in repos} unused_repos = set(all_repos) for config_path in live_configs: try: config = load_config(config_path) except InvalidConfigError: dead_configs.append(config_path) continue else: for repo in config['repos']: _mark_used_repos(store, all_repos, unused_repos, repo) store.delete_configs(dead_configs) for db_repo_name, ref in unused_repos: store.delete_repo(db_repo_name, ref, all_repos[(db_repo_name, ref)]) return len(unused_repos)