Skip to content

Commit f99f050

Browse files
takemi-ohamaclaude
andcommitted
refactor(snapshot): last_snapshot_time をファイル mtime ベースに変更
差分更新は既存ディレクトリ名を再利用するため、ディレクトリ名の日付や メタデータの created_at では「世代作成時刻」しか分からず、直近の差分更新を 取りこぼす。各スナップショットディレクトリ内アーカイブの mtime 実測に変更し、 差分更新の時刻も正確に反映 + メタデータ整合性への依存を排除した。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 5ddd498 commit f99f050

1 file changed

Lines changed: 20 additions & 13 deletions

File tree

lib/devbase/snapshot/manager.py

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -98,21 +98,28 @@ def list(self) -> list[dict]:
9898
def last_snapshot_time(self) -> Optional[datetime]:
9999
"""直近のスナップショット取得 (フル/差分) 日時を返す。
100100
101-
スナップショットが存在しない、または日時が解釈できない場合は None。
101+
各スナップショットディレクトリ内のアーカイブファイルの mtime のうち
102+
最新のものを採用する。差分更新は既存ディレクトリ名を再利用するため
103+
(ディレクトリ名の日付は世代作成時のまま) ファイルの mtime を実測する方が
104+
正確で、メタデータの整合性にも依存しない。
105+
106+
スナップショットが存在しない場合は None。
102107
"""
103-
meta = self._load_metadata()
104-
latest: Optional[datetime] = None
105-
for snap in meta.get('snapshots', []):
106-
ts = snap.get('updated_at') or snap.get('created_at')
107-
if not ts:
108+
if not self.backups_dir.exists():
109+
return None
110+
latest: Optional[float] = None
111+
for snap_dir in self.backups_dir.iterdir():
112+
if not snap_dir.is_dir():
108113
continue
109-
try:
110-
dt = datetime.fromisoformat(ts)
111-
except (ValueError, TypeError):
112-
continue
113-
if latest is None or dt > latest:
114-
latest = dt
115-
return latest
114+
for f in snap_dir.iterdir():
115+
if not f.is_file():
116+
continue
117+
mtime = f.stat().st_mtime
118+
if latest is None or mtime > latest:
119+
latest = mtime
120+
if latest is None:
121+
return None
122+
return datetime.fromtimestamp(latest)
116123

117124
def restore(self, name: str, point: int | None = None) -> None:
118125
"""スナップショットから復元する。

0 commit comments

Comments
 (0)