diff options
| -rw-r--r-- | subcmds/sync.py | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/subcmds/sync.py b/subcmds/sync.py index de4ac3a7..caa55880 100644 --- a/subcmds/sync.py +++ b/subcmds/sync.py | |||
| @@ -21,6 +21,7 @@ import multiprocessing | |||
| 21 | import netrc | 21 | import netrc |
| 22 | from optparse import SUPPRESS_HELP | 22 | from optparse import SUPPRESS_HELP |
| 23 | import os | 23 | import os |
| 24 | import shutil | ||
| 24 | import socket | 25 | import socket |
| 25 | import sys | 26 | import sys |
| 26 | import tempfile | 27 | import tempfile |
| @@ -58,11 +59,16 @@ from error import RepoChangedException, GitError, ManifestParseError | |||
| 58 | import platform_utils | 59 | import platform_utils |
| 59 | from project import SyncBuffer | 60 | from project import SyncBuffer |
| 60 | from progress import Progress | 61 | from progress import Progress |
| 62 | from repo_trace import IsTrace, Trace | ||
| 61 | import ssh | 63 | import ssh |
| 62 | from wrapper import Wrapper | 64 | from wrapper import Wrapper |
| 63 | from manifest_xml import GitcManifest | 65 | from manifest_xml import GitcManifest |
| 64 | 66 | ||
| 65 | _ONE_DAY_S = 24 * 60 * 60 | 67 | _ONE_DAY_S = 24 * 60 * 60 |
| 68 | # Env var to implicitly turn off object backups. | ||
| 69 | REPO_BACKUP_OBJECTS = 'REPO_BACKUP_OBJECTS' | ||
| 70 | |||
| 71 | _BACKUP_OBJECTS = os.environ.get(REPO_BACKUP_OBJECTS) != '0' | ||
| 66 | 72 | ||
| 67 | 73 | ||
| 68 | class Sync(Command, MirrorSafeCommand): | 74 | class Sync(Command, MirrorSafeCommand): |
| @@ -694,13 +700,46 @@ later is required to fix a server side protocol bug. | |||
| 694 | 700 | ||
| 695 | jobs = opt.jobs | 701 | jobs = opt.jobs |
| 696 | 702 | ||
| 703 | def _backup_cruft(bare_git): | ||
| 704 | # Find any cruft packs in the current gitdir, and save them. | ||
| 705 | # b/221065125 (repo sync complains that objects are missing). This does | ||
| 706 | # not prevent that state, but makes it so that the missing objects are | ||
| 707 | # available. | ||
| 708 | if not _BACKUP_OBJECTS: | ||
| 709 | return | ||
| 710 | saved = [] | ||
| 711 | objdir = bare_git.GetDotgitPath('objects') | ||
| 712 | pack_dir = os.path.join(objdir, 'pack') | ||
| 713 | bak_dir = os.path.join(objdir, '.repo','pack.bak') | ||
| 714 | files = set(platform_utils.listdir(pack_dir)) | ||
| 715 | to_backup = [] | ||
| 716 | for f in files: | ||
| 717 | base, ext = os.path.splitext(f) | ||
| 718 | if base + ".mtimes" in files: | ||
| 719 | to_backup.append(f) | ||
| 720 | if to_backup and not platform_utils.isdir(bak_dir): | ||
| 721 | os.makedirs(bak_dir) | ||
| 722 | for fname in to_backup: | ||
| 723 | bak_fname = os.path.join(bak_dir, fname) | ||
| 724 | if not os.path.exists(bak_fname): | ||
| 725 | saved.append(fname) | ||
| 726 | # Use a tmp file so that we are sure of a complete copy. | ||
| 727 | shutil.copy(os.path.join(pack_dir, fname), bak_fname + '.tmp') | ||
| 728 | shutil.move(bak_fname + '.tmp', bak_fname) | ||
| 729 | if saved and IsTrace(): | ||
| 730 | Trace('%s saved %s', bare_git._project.name, ' '.join(saved)) | ||
| 731 | |||
| 732 | gc_args = ('--auto', '--cruft') | ||
| 733 | pack_refs_args = () | ||
| 697 | if jobs < 2: | 734 | if jobs < 2: |
| 698 | for (run_gc, bare_git) in tidy_dirs.values(): | 735 | for (run_gc, bare_git) in tidy_dirs.values(): |
| 699 | pm.update(msg=bare_git._project.name) | 736 | pm.update(msg=bare_git._project.name) |
| 737 | |||
| 700 | if run_gc: | 738 | if run_gc: |
| 701 | bare_git.gc('--auto') | 739 | bare_git.gc(*gc_args) |
| 702 | else: | 740 | else: |
| 703 | bare_git.pack_refs() | 741 | bare_git.pack_refs(*pack_refs_args) |
| 742 | _backup_cruft(bare_git) | ||
| 704 | pm.end() | 743 | pm.end() |
| 705 | return | 744 | return |
| 706 | 745 | ||
| @@ -715,15 +754,16 @@ later is required to fix a server side protocol bug. | |||
| 715 | try: | 754 | try: |
| 716 | try: | 755 | try: |
| 717 | if run_gc: | 756 | if run_gc: |
| 718 | bare_git.gc('--auto', config=config) | 757 | bare_git.gc(*gc_args, config=config) |
| 719 | else: | 758 | else: |
| 720 | bare_git.pack_refs(config=config) | 759 | bare_git.pack_refs(*pack_refs_args, config=config) |
| 721 | except GitError: | 760 | except GitError: |
| 722 | err_event.set() | 761 | err_event.set() |
| 723 | except Exception: | 762 | except Exception: |
| 724 | err_event.set() | 763 | err_event.set() |
| 725 | raise | 764 | raise |
| 726 | finally: | 765 | finally: |
| 766 | _backup_cruft(bare_git) | ||
| 727 | pm.finish(bare_git._project.name) | 767 | pm.finish(bare_git._project.name) |
| 728 | sem.release() | 768 | sem.release() |
| 729 | 769 | ||
