@@ -86,6 +86,40 @@ def scan_cache(cache_dir: Path | None = None) -> CacheInfo:
8686 local_path = str (repo_dir ),
8787 ))
8888
89+ # Scan flat layout (compat): {root}/{owner}/{name}/
90+ # and legacy layout: {root}/hub/{owner}/{name}/
91+ _scanned_paths = {r .local_path for r in repos } # avoid double-counting
92+
93+ for prefix , prefix_path in [("" , root ), ("hub" , root / "hub" )]:
94+ if not prefix_path .is_dir ():
95+ continue
96+ for owner_dir in prefix_path .iterdir ():
97+ if not owner_dir .is_dir ():
98+ continue
99+ # Skip known non-repo directories
100+ if owner_dir .name in ("hub" , "models" , "datasets" , "studios" , "mcps" , "skills" ):
101+ continue
102+ for name_dir in owner_dir .iterdir ():
103+ if not name_dir .is_dir ():
104+ continue
105+ if str (name_dir ) in _scanned_paths :
106+ continue
107+
108+ size = _dir_size (name_dir )
109+ total_size += size
110+ nb_files = sum (1 for f in name_dir .rglob ("*" ) if f .is_file ())
111+ repo_id = f"{ owner_dir .name } /{ name_dir .name } "
112+
113+ repos .append (CachedRepoInfo (
114+ repo_id = repo_id ,
115+ repo_type = RepoType .MODEL , # assume model for flat layout
116+ revision = None ,
117+ size_on_disk = size ,
118+ nb_files = nb_files ,
119+ last_accessed = None ,
120+ local_path = str (name_dir ),
121+ ))
122+
89123 return CacheInfo (
90124 repos = repos ,
91125 total_size = total_size ,
@@ -135,30 +169,42 @@ def clear_cache(
135169 freed = 0
136170
137171 if repo_id and repo_type :
138- # Clear specific repo
139- segment = f"{ repo_type } s" if not repo_type .endswith ("s" ) else repo_type
140- safe_id = repo_id .replace ("/" , "--" )
141- target = root / segment / safe_id
142- if target .is_dir ():
143- freed = _dir_size (target )
172+ # Clear specific repo — check all possible layout locations
173+ targets = _resolve_cache_targets (root , repo_id , repo_type )
174+ for target in targets :
175+ size = _dir_size (target )
176+ freed += size
144177 _safe_rmtree (target )
145- logger .info ("Cleared cache for %s/%s (%d bytes)" , repo_type , repo_id , freed )
178+ logger .info ("Cleared cache at %s (%d bytes)" , target , size )
146179 elif repo_type :
147- # Clear all repos of this type
180+ # Clear all repos of this type (standard layout)
148181 segment = f"{ repo_type } s" if not repo_type .endswith ("s" ) else repo_type
149182 type_dir = root / segment
150183 if type_dir .is_dir ():
151- freed = _dir_size (type_dir )
184+ size = _dir_size (type_dir )
185+ freed += size
152186 _safe_rmtree (type_dir )
153- logger .info ("Cleared all %s caches (%d bytes)" , repo_type , freed )
187+ logger .info ("Cleared %s standard cache (%d bytes)" , repo_type , size )
188+ # Also clear legacy hub layout
189+ hub_dir = root / "hub"
190+ if hub_dir .is_dir ():
191+ size = _dir_size (hub_dir )
192+ freed += size
193+ _safe_rmtree (hub_dir )
194+ logger .info ("Cleared legacy hub cache (%d bytes)" , size )
154195 else :
155- # Clear everything
196+ # Clear everything (standard + legacy layouts)
156197 for repo_t in _DEFAULT_SCAN_TYPES :
157198 segment = f"{ repo_t } s"
158199 type_dir = root / segment
159200 if type_dir .is_dir ():
160201 freed += _dir_size (type_dir )
161202 _safe_rmtree (type_dir )
203+ # Legacy hub directory
204+ hub_dir = root / "hub"
205+ if hub_dir .is_dir ():
206+ freed += _dir_size (hub_dir )
207+ _safe_rmtree (hub_dir )
162208 logger .info ("Cleared all caches (%d bytes)" , freed )
163209
164210 return freed
@@ -167,6 +213,25 @@ def clear_cache(
167213# ---------------------------------------------------------------------------
168214# Helpers
169215# ---------------------------------------------------------------------------
216+ def _resolve_cache_targets (root : Path , repo_id : str , repo_type : str ) -> list [Path ]:
217+ """Resolve all possible cache locations for a repo across layout formats.
218+
219+ Checks three path layouts:
220+ - Standard: {root}/{type}s/{owner}--{name}/
221+ - Flat: {root}/{owner}/{name}/
222+ - Legacy: {root}/hub/{owner}/{name}/
223+ """
224+ safe_id = repo_id .replace ("/" , "--" )
225+ segment = f"{ repo_type } s" if not repo_type .endswith ("s" ) else repo_type
226+
227+ candidates = [
228+ root / segment / safe_id , # standard: {cache}/models/owner--name/
229+ root / repo_id , # flat (compat): {cache}/owner/name/
230+ root / "hub" / repo_id , # legacy: {cache}/hub/owner/name/
231+ ]
232+ return [p for p in candidates if p .is_dir ()]
233+
234+
170235def _dir_size (path : Path ) -> int :
171236 """Compute total size of all files under ``path`` recursively."""
172237 total = 0
0 commit comments