Index: git_cache.py |
diff --git a/git_cache.py b/git_cache.py |
index 59bd48cbc0c22a03552e510c77df2fed00ae7195..1fa7e4556871a82e9de7090146ccf7035523a140 100755 |
--- a/git_cache.py |
+++ b/git_cache.py |
@@ -564,6 +564,54 @@ def CMDpopulate(parser, args): |
mirror.populate(**kwargs) |
+@subcommand.usage('Fetch new commits into cache and current checkout') |
+def CMDfetch(parser, args): |
+ """Update mirror, and fetch in cwd.""" |
+ parser.add_option('--all', action='store_true', help='Fetch all remotes') |
+ options, args = parser.parse_args(args) |
+ |
+ # Figure out which remotes to fetch. This mimics the behavior of regular |
+ # 'git fetch'. Note that in the case of "stacked" or "pipelined" branches, |
+ # this will NOT try to traverse up the branching structure to find the |
+ # ultimate remote to update. |
+ remotes = [] |
+ if options.all: |
+ assert not args, 'fatal: fetch --all does not take a repository argument' |
+ remotes = subprocess.check_output([Mirror.git_exe, 'remote']).splitlines() |
+ elif args: |
+ remotes = args |
+ else: |
+ current_branch = subprocess.check_output( |
+ [Mirror.git_exe, 'rev-parse', '--abbrev-ref', 'HEAD']).strip() |
+ if current_branch != 'HEAD': |
+ upstream = subprocess.check_output( |
+ [Mirror.git_exe, 'config', 'branch.%s.remote' % current_branch] |
+ ).strip() |
+ if upstream and upstream != '.': |
+ remotes = [upstream] |
+ if not remotes: |
+ remotes = ['origin'] |
+ |
+ cachepath = Mirror.GetCachePath() |
+ git_dir = os.path.abspath(subprocess.check_output( |
+ [Mirror.git_exe, 'rev-parse', '--git-dir'])) |
+ git_dir = os.path.abspath(git_dir) |
+ if git_dir.startswith(cachepath): |
+ mirror = Mirror.FromPath(git_dir) |
+ mirror.populate() |
+ return 0 |
+ for remote in remotes: |
+ remote_url = subprocess.check_output( |
+ [Mirror.git_exe, 'config', 'remote.%s.url' % remote]).strip() |
+ if remote_url.startswith(cachepath): |
+ mirror = Mirror.FromPath(remote_url) |
+ mirror.print = lambda *args: None |
+ print('Updating git cache...') |
+ mirror.populate() |
+ subprocess.check_call([Mirror.git_exe, 'fetch', remote]) |
+ return 0 |
+ |
+ |
@subcommand.usage('[url of repo to unlock, or -a|--all]') |
def CMDunlock(parser, args): |
"""Unlock one or all repos if their lock files are still around.""" |