Skip to content

Commit e1fcad9

Browse files
committed
Also preserve '/Scripts' when upgrading an install.
Fixes #170
1 parent 4e89c24 commit e1fcad9

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

src/manage/install_command.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,14 @@ def _download_one(cmd, source, install, download_dir, *, must_copy=False):
458458
return package
459459

460460

461+
def _should_preserve_on_upgrade(cmd, root, path):
462+
if path.match("site-packages"):
463+
return True
464+
if path.parent == root and path.match("Scripts"):
465+
return True
466+
return False
467+
468+
461469
def _preserve_site(cmd, root):
462470
if not root.is_dir():
463471
return None
@@ -473,12 +481,12 @@ def _preserve_site(cmd, root):
473481
state = []
474482
i = 0
475483
dirs = [root]
476-
root = root.with_name(f"_{root.name}")
477-
root.mkdir(parents=True, exist_ok=True)
484+
target_root = root.with_name(f"_{root.name}")
485+
target_root.mkdir(parents=True, exist_ok=True)
478486
while dirs:
479-
if dirs[0].match("site-packages"):
487+
if _should_preserve_on_upgrade(cmd, root, dirs[0]):
480488
while True:
481-
target = root / str(i)
489+
target = target_root / str(i)
482490
i += 1
483491
try:
484492
unlink(target)
@@ -487,7 +495,8 @@ def _preserve_site(cmd, root):
487495
break
488496
except OSError:
489497
LOGGER.verbose("Failed to remove %s.", target)
490-
LOGGER.info("Preserving %s during update as %s.", dirs[0], target)
498+
LOGGER.info("Preserving %s during update.", dirs[0].relative_to(root))
499+
LOGGER.verbose("Moving %s to %s", dirs[0], target)
491500
try:
492501
dirs[0].rename(target)
493502
except OSError:
@@ -498,8 +507,8 @@ def _preserve_site(cmd, root):
498507
else:
499508
dirs.extend(d for d in dirs[0].iterdir() if d.is_dir())
500509
dirs.pop(0)
501-
# Append None, root last so that root gets cleaned up after restore is done
502-
state.append((None, root))
510+
# Append None, target_root last to clean up after restore is done
511+
state.append((None, target_root))
503512
return state
504513

505514

@@ -520,7 +529,7 @@ def _restore_site(cmd, state):
520529
except KeyboardInterrupt:
521530
break
522531
continue
523-
LOGGER.info("Restoring %s from %s after update.", dest, src)
532+
LOGGER.verbose("Restoring %s from %s after update.", dest, src)
524533
try:
525534
for i in src.iterdir():
526535
if not i.is_dir() and not i.is_file():
@@ -534,6 +543,7 @@ def _restore_site(cmd, state):
534543
LOGGER.verbose("Restoring %s to %s", i, d)
535544
d.parent.mkdir(parents=True, exist_ok=True)
536545
i.rename(d)
546+
LOGGER.info("Restored %s", dest.name)
537547
except OSError:
538548
LOGGER.warn("Failed to restore %s during update.", dest)
539549
LOGGER.verbose("TRACEBACK", exc_info=True)

0 commit comments

Comments
 (0)