diff options
| author | Anthony King <anthonydking@slimroms.net> | 2014-05-06 15:57:48 +0100 |
|---|---|---|
| committer | Anthony King <anthonydking@slimroms.net> | 2014-05-07 10:46:24 +0100 |
| commit | 85b24acd6a11af3d84cc71fc35ebdb6d3c78065f (patch) | |
| tree | ec326002ea5e985a4f1f5cd5e9f8f002dcd75236 | |
| parent | 2cd1f0452eb746ae727218f5dbda0fd1ae0b2e34 (diff) | |
| download | git-repo-85b24acd6a11af3d84cc71fc35ebdb6d3c78065f.tar.gz | |
Use JSON instead of pickle
Use JSON as it is shown to be much faster than pickle.
Also clean up the loading and saving functions.
Change-Id: I45b3dee7b4d59a1c0e0d38d4a83b543ac5839390
| -rw-r--r-- | git_config.py | 54 | ||||
| -rw-r--r-- | subcmds/sync.py | 47 |
2 files changed, 43 insertions, 58 deletions
diff --git a/git_config.py b/git_config.py index 32879ec7..380bdd24 100644 --- a/git_config.py +++ b/git_config.py | |||
| @@ -15,8 +15,8 @@ | |||
| 15 | 15 | ||
| 16 | from __future__ import print_function | 16 | from __future__ import print_function |
| 17 | 17 | ||
| 18 | import json | ||
| 18 | import os | 19 | import os |
| 19 | import pickle | ||
| 20 | import re | 20 | import re |
| 21 | import subprocess | 21 | import subprocess |
| 22 | import sys | 22 | import sys |
| @@ -80,7 +80,7 @@ class GitConfig(object): | |||
| 80 | return cls(configfile = os.path.join(gitdir, 'config'), | 80 | return cls(configfile = os.path.join(gitdir, 'config'), |
| 81 | defaults = defaults) | 81 | defaults = defaults) |
| 82 | 82 | ||
| 83 | def __init__(self, configfile, defaults=None, pickleFile=None): | 83 | def __init__(self, configfile, defaults=None, jsonFile=None): |
| 84 | self.file = configfile | 84 | self.file = configfile |
| 85 | self.defaults = defaults | 85 | self.defaults = defaults |
| 86 | self._cache_dict = None | 86 | self._cache_dict = None |
| @@ -88,12 +88,11 @@ class GitConfig(object): | |||
| 88 | self._remotes = {} | 88 | self._remotes = {} |
| 89 | self._branches = {} | 89 | self._branches = {} |
| 90 | 90 | ||
| 91 | if pickleFile is None: | 91 | self._json = jsonFile |
| 92 | self._pickle = os.path.join( | 92 | if self._json is None: |
| 93 | self._json = os.path.join( | ||
| 93 | os.path.dirname(self.file), | 94 | os.path.dirname(self.file), |
| 94 | '.repopickle_' + os.path.basename(self.file)) | 95 | '.repo_' + os.path.basename(self.file) + '.json') |
| 95 | else: | ||
| 96 | self._pickle = pickleFile | ||
| 97 | 96 | ||
| 98 | def Has(self, name, include_defaults = True): | 97 | def Has(self, name, include_defaults = True): |
| 99 | """Return true if this configuration file has the key. | 98 | """Return true if this configuration file has the key. |
| @@ -248,50 +247,41 @@ class GitConfig(object): | |||
| 248 | return self._cache_dict | 247 | return self._cache_dict |
| 249 | 248 | ||
| 250 | def _Read(self): | 249 | def _Read(self): |
| 251 | d = self._ReadPickle() | 250 | d = self._ReadJson() |
| 252 | if d is None: | 251 | if d is None: |
| 253 | d = self._ReadGit() | 252 | d = self._ReadGit() |
| 254 | self._SavePickle(d) | 253 | self._SaveJson(d) |
| 255 | return d | 254 | return d |
| 256 | 255 | ||
| 257 | def _ReadPickle(self): | 256 | def _ReadJson(self): |
| 258 | try: | 257 | try: |
| 259 | if os.path.getmtime(self._pickle) \ | 258 | if os.path.getmtime(self._json) \ |
| 260 | <= os.path.getmtime(self.file): | 259 | <= os.path.getmtime(self.file): |
| 261 | os.remove(self._pickle) | 260 | os.remove(self._json) |
| 262 | return None | 261 | return None |
| 263 | except OSError: | 262 | except OSError: |
| 264 | return None | 263 | return None |
| 265 | try: | 264 | try: |
| 266 | Trace(': unpickle %s', self.file) | 265 | Trace(': parsing %s', self.file) |
| 267 | fd = open(self._pickle, 'rb') | 266 | fd = open(self._json) |
| 268 | try: | 267 | try: |
| 269 | return pickle.load(fd) | 268 | return json.load(fd) |
| 270 | finally: | 269 | finally: |
| 271 | fd.close() | 270 | fd.close() |
| 272 | except EOFError: | 271 | except (IOError, ValueError): |
| 273 | os.remove(self._pickle) | 272 | os.remove(self._json) |
| 274 | return None | ||
| 275 | except IOError: | ||
| 276 | os.remove(self._pickle) | ||
| 277 | return None | ||
| 278 | except pickle.PickleError: | ||
| 279 | os.remove(self._pickle) | ||
| 280 | return None | 273 | return None |
| 281 | 274 | ||
| 282 | def _SavePickle(self, cache): | 275 | def _SaveJson(self, cache): |
| 283 | try: | 276 | try: |
| 284 | fd = open(self._pickle, 'wb') | 277 | fd = open(self._json, 'w') |
| 285 | try: | 278 | try: |
| 286 | pickle.dump(cache, fd, pickle.HIGHEST_PROTOCOL) | 279 | json.dump(cache, fd, indent=2) |
| 287 | finally: | 280 | finally: |
| 288 | fd.close() | 281 | fd.close() |
| 289 | except IOError: | 282 | except (IOError, TypeError): |
| 290 | if os.path.exists(self._pickle): | 283 | if os.path.exists(self.json): |
| 291 | os.remove(self._pickle) | 284 | os.remove(self._json) |
| 292 | except pickle.PickleError: | ||
| 293 | if os.path.exists(self._pickle): | ||
| 294 | os.remove(self._pickle) | ||
| 295 | 285 | ||
| 296 | def _ReadGit(self): | 286 | def _ReadGit(self): |
| 297 | """ | 287 | """ |
diff --git a/subcmds/sync.py b/subcmds/sync.py index a0a68960..6f77310f 100644 --- a/subcmds/sync.py +++ b/subcmds/sync.py | |||
| @@ -14,10 +14,10 @@ | |||
| 14 | # limitations under the License. | 14 | # limitations under the License. |
| 15 | 15 | ||
| 16 | from __future__ import print_function | 16 | from __future__ import print_function |
| 17 | import json | ||
| 17 | import netrc | 18 | import netrc |
| 18 | from optparse import SUPPRESS_HELP | 19 | from optparse import SUPPRESS_HELP |
| 19 | import os | 20 | import os |
| 20 | import pickle | ||
| 21 | import re | 21 | import re |
| 22 | import shutil | 22 | import shutil |
| 23 | import socket | 23 | import socket |
| @@ -760,7 +760,7 @@ class _FetchTimes(object): | |||
| 760 | _ALPHA = 0.5 | 760 | _ALPHA = 0.5 |
| 761 | 761 | ||
| 762 | def __init__(self, manifest): | 762 | def __init__(self, manifest): |
| 763 | self._path = os.path.join(manifest.repodir, '.repopickle_fetchtimes') | 763 | self._path = os.path.join(manifest.repodir, '.repo_fetchtimes.json') |
| 764 | self._times = None | 764 | self._times = None |
| 765 | self._seen = set() | 765 | self._seen = set() |
| 766 | 766 | ||
| @@ -779,22 +779,17 @@ class _FetchTimes(object): | |||
| 779 | def _Load(self): | 779 | def _Load(self): |
| 780 | if self._times is None: | 780 | if self._times is None: |
| 781 | try: | 781 | try: |
| 782 | f = open(self._path, 'rb') | 782 | f = open(self._path) |
| 783 | except IOError: | ||
| 784 | self._times = {} | ||
| 785 | return self._times | ||
| 786 | try: | ||
| 787 | try: | 783 | try: |
| 788 | self._times = pickle.load(f) | 784 | self._times = json.load(f) |
| 789 | except IOError: | 785 | finally: |
| 790 | try: | 786 | f.close() |
| 791 | os.remove(self._path) | 787 | except (IOError, ValueError): |
| 792 | except OSError: | 788 | try: |
| 793 | pass | 789 | os.remove(self._path) |
| 794 | self._times = {} | 790 | except OSError: |
| 795 | finally: | 791 | pass |
| 796 | f.close() | 792 | self._times = {} |
| 797 | return self._times | ||
| 798 | 793 | ||
| 799 | def Save(self): | 794 | def Save(self): |
| 800 | if self._times is None: | 795 | if self._times is None: |
| @@ -808,13 +803,13 @@ class _FetchTimes(object): | |||
| 808 | del self._times[name] | 803 | del self._times[name] |
| 809 | 804 | ||
| 810 | try: | 805 | try: |
| 811 | f = open(self._path, 'wb') | 806 | f = open(self._path, 'w') |
| 812 | try: | 807 | try: |
| 813 | pickle.dump(self._times, f) | 808 | json.dump(self._times, f, indent=2) |
| 814 | except (IOError, OSError, pickle.PickleError): | 809 | finally: |
| 815 | try: | 810 | f.close() |
| 816 | os.remove(self._path) | 811 | except (IOError, TypeError): |
| 817 | except OSError: | 812 | try: |
| 818 | pass | 813 | os.remove(self._path) |
| 819 | finally: | 814 | except OSError: |
| 820 | f.close() | 815 | pass |
