|
@@ -69,12 +69,16 @@ def do_off() -> int:
|
|
|
man = []
|
|
man = []
|
|
|
# 随包基线备份藏在 windscada 里面: 先摘出来, 它不是产物 (rebuild_from_raw.py --verify 要用)
|
|
# 随包基线备份藏在 windscada 里面: 先摘出来, 它不是产物 (rebuild_from_raw.py --verify 要用)
|
|
|
baseline = P.store() / KEEP[0]
|
|
baseline = P.store() / KEEP[0]
|
|
|
|
|
+ baseline_kept = False
|
|
|
|
|
+ kept_at = OFF / '_baseline_kept' / KEEP[0]
|
|
|
if baseline.exists():
|
|
if baseline.exists():
|
|
|
- dst = OFF / '_baseline_kept' / KEEP[0]
|
|
|
|
|
- dst.parent.mkdir(parents=True, exist_ok=True)
|
|
|
|
|
- n, mb = count(baseline)
|
|
|
|
|
- shutil.move(str(baseline), str(dst))
|
|
|
|
|
- print(f' 保留 {P.rel(baseline):34s} {n:5d} 件 {mb:8.1f} MB (随包基线, 不算产物)')
|
|
|
|
|
|
|
+ if not kept_at.exists():
|
|
|
|
|
+ kept_at.parent.mkdir(parents=True, exist_ok=True)
|
|
|
|
|
+ n, mb = count(baseline)
|
|
|
|
|
+ shutil.move(str(baseline), str(kept_at))
|
|
|
|
|
+ print(f' 保留 {P.rel(baseline):34s} {n:5d} 件 {mb:8.1f} MB (随包基线, 不算产物)')
|
|
|
|
|
+ kept_at = OFF / '_baseline_kept' / KEEP[0]
|
|
|
|
|
+ baseline_kept = kept_at.exists() # ★必须在 move **之后**判 (2026-09-11 曾写成之前 → 恒 False, --on 就不还原基线)
|
|
|
for src, dst in items:
|
|
for src, dst in items:
|
|
|
if not src.exists():
|
|
if not src.exists():
|
|
|
continue
|
|
continue
|
|
@@ -84,7 +88,7 @@ def do_off() -> int:
|
|
|
man.append(dict(rel=P.rel(src), to=P.rel(dst), files=n, mb=round(mb, 1)))
|
|
man.append(dict(rel=P.rel(src), to=P.rel(dst), files=n, mb=round(mb, 1)))
|
|
|
print(f' 挪走 {P.rel(src):34s} {n:5d} 件 {mb:8.1f} MB')
|
|
print(f' 挪走 {P.rel(src):34s} {n:5d} 件 {mb:8.1f} MB')
|
|
|
MANIFEST.write_text(json.dumps(dict(at=time.strftime('%Y-%m-%d %H:%M:%S'),
|
|
MANIFEST.write_text(json.dumps(dict(at=time.strftime('%Y-%m-%d %H:%M:%S'),
|
|
|
- baseline_kept=bool(baseline.exists()), items=man),
|
|
|
|
|
|
|
+ baseline_kept=baseline_kept, items=man),
|
|
|
ensure_ascii=False, indent=1), encoding='utf-8')
|
|
ensure_ascii=False, indent=1), encoding='utf-8')
|
|
|
print(f'\n共 {len(man)} 项已挪到 {P.rel(OFF)} (清单: {P.rel(MANIFEST)})')
|
|
print(f'\n共 {len(man)} 项已挪到 {P.rel(OFF)} (清单: {P.rel(MANIFEST)})')
|
|
|
print(f'还原: python scripts/products_state.py --on')
|
|
print(f'还原: python scripts/products_state.py --on')
|
|
@@ -108,11 +112,13 @@ def do_on() -> int:
|
|
|
shutil.move(str(src), str(dst))
|
|
shutil.move(str(src), str(dst))
|
|
|
n += 1
|
|
n += 1
|
|
|
print(f' 还原 {it["rel"]:34s} {it["files"]:5d} 件')
|
|
print(f' 还原 {it["rel"]:34s} {it["files"]:5d} 件')
|
|
|
- if man.get('baseline_kept'):
|
|
|
|
|
- b = OFF / '_baseline_kept' / KEEP[0]
|
|
|
|
|
|
|
+ if man.get('baseline_kept') or (OFF / '_baseline_kept' / KEEP[0]).exists():
|
|
|
|
|
+ b = OFF / '_baseline_kept' / KEEP[0] # 不看清单标记, 直接看备份在不在 (更稳)
|
|
|
if b.exists():
|
|
if b.exists():
|
|
|
target = P.store() / KEEP[0]
|
|
target = P.store() / KEEP[0]
|
|
|
target.parent.mkdir(parents=True, exist_ok=True)
|
|
target.parent.mkdir(parents=True, exist_ok=True)
|
|
|
|
|
+ if target.exists():
|
|
|
|
|
+ shutil.rmtree(target)
|
|
|
shutil.move(str(b), str(target))
|
|
shutil.move(str(b), str(target))
|
|
|
print(f' 还原 {P.rel(target):34s} (随包基线)')
|
|
print(f' 还原 {P.rel(target):34s} (随包基线)')
|
|
|
if OFF.exists() and not any(OFF.rglob('*')):
|
|
if OFF.exists() and not any(OFF.rglob('*')):
|