summaryrefslogtreecommitdiffstats
path: root/subcmds
diff options
context:
space:
mode:
Diffstat (limited to 'subcmds')
-rw-r--r--subcmds/cherry_pick.py1
-rw-r--r--subcmds/forall.py40
-rw-r--r--subcmds/init.py4
-rw-r--r--subcmds/sync.py34
4 files changed, 63 insertions, 16 deletions
diff --git a/subcmds/cherry_pick.py b/subcmds/cherry_pick.py
index 520e4c32..1f7dffdc 100644
--- a/subcmds/cherry_pick.py
+++ b/subcmds/cherry_pick.py
@@ -76,6 +76,7 @@ change id will be added.
76 capture_stdout = True, 76 capture_stdout = True,
77 capture_stderr = True) 77 capture_stderr = True)
78 p.stdin.write(new_msg) 78 p.stdin.write(new_msg)
79 p.stdin.close()
79 if p.Wait() != 0: 80 if p.Wait() != 0:
80 print("error: Failed to update commit message", file=sys.stderr) 81 print("error: Failed to update commit message", file=sys.stderr)
81 sys.exit(1) 82 sys.exit(1)
diff --git a/subcmds/forall.py b/subcmds/forall.py
index 88b23fbd..b93cd6d0 100644
--- a/subcmds/forall.py
+++ b/subcmds/forall.py
@@ -20,6 +20,7 @@ import multiprocessing
20import re 20import re
21import os 21import os
22import select 22import select
23import signal
23import sys 24import sys
24import subprocess 25import subprocess
25 26
@@ -150,11 +151,15 @@ without iterating through the remaining projects.
150 attributes that we need. 151 attributes that we need.
151 152
152 """ 153 """
154 if not self.manifest.IsMirror:
155 lrev = project.GetRevisionId()
156 else:
157 lrev = None
153 return { 158 return {
154 'name': project.name, 159 'name': project.name,
155 'relpath': project.relpath, 160 'relpath': project.relpath,
156 'remote_name': project.remote.name, 161 'remote_name': project.remote.name,
157 'lrev': project.GetRevisionId(), 162 'lrev': lrev,
158 'rrev': project.revisionExpr, 163 'rrev': project.revisionExpr,
159 'annotations': dict((a.name, a.value) for a in project.annotations), 164 'annotations': dict((a.name, a.value) for a in project.annotations),
160 'gitdir': project.gitdir, 165 'gitdir': project.gitdir,
@@ -200,6 +205,13 @@ without iterating through the remaining projects.
200 mirror = self.manifest.IsMirror 205 mirror = self.manifest.IsMirror
201 rc = 0 206 rc = 0
202 207
208 smart_sync_manifest_name = "smart_sync_override.xml"
209 smart_sync_manifest_path = os.path.join(
210 self.manifest.manifestProject.worktree, smart_sync_manifest_name)
211
212 if os.path.isfile(smart_sync_manifest_path):
213 self.manifest.Override(smart_sync_manifest_path)
214
203 if not opt.regex: 215 if not opt.regex:
204 projects = self.GetProjects(args) 216 projects = self.GetProjects(args)
205 else: 217 else:
@@ -207,14 +219,12 @@ without iterating through the remaining projects.
207 219
208 os.environ['REPO_COUNT'] = str(len(projects)) 220 os.environ['REPO_COUNT'] = str(len(projects))
209 221
210 pool = multiprocessing.Pool(opt.jobs) 222 pool = multiprocessing.Pool(opt.jobs, InitWorker)
211 try: 223 try:
212 config = self.manifest.manifestProject.config 224 config = self.manifest.manifestProject.config
213 results_it = pool.imap( 225 results_it = pool.imap(
214 DoWorkWrapper, 226 DoWorkWrapper,
215 ([mirror, opt, cmd, shell, cnt, config, self._SerializeProject(p)] 227 self.ProjectArgs(projects, mirror, opt, cmd, shell, config))
216 for cnt, p in enumerate(projects))
217 )
218 pool.close() 228 pool.close()
219 for r in results_it: 229 for r in results_it:
220 rc = rc or r 230 rc = rc or r
@@ -236,12 +246,28 @@ without iterating through the remaining projects.
236 if rc != 0: 246 if rc != 0:
237 sys.exit(rc) 247 sys.exit(rc)
238 248
249 def ProjectArgs(self, projects, mirror, opt, cmd, shell, config):
250 for cnt, p in enumerate(projects):
251 try:
252 project = self._SerializeProject(p)
253 except Exception as e:
254 print('Project list error: %r' % e,
255 file=sys.stderr)
256 return
257 except KeyboardInterrupt:
258 print('Project list interrupted',
259 file=sys.stderr)
260 return
261 yield [mirror, opt, cmd, shell, cnt, config, project]
239 262
240class WorkerKeyboardInterrupt(Exception): 263class WorkerKeyboardInterrupt(Exception):
241 """ Keyboard interrupt exception for worker processes. """ 264 """ Keyboard interrupt exception for worker processes. """
242 pass 265 pass
243 266
244 267
268def InitWorker():
269 signal.signal(signal.SIGINT, signal.SIG_IGN)
270
245def DoWorkWrapper(args): 271def DoWorkWrapper(args):
246 """ A wrapper around the DoWork() method. 272 """ A wrapper around the DoWork() method.
247 273
@@ -263,7 +289,9 @@ def DoWork(project, mirror, opt, cmd, shell, cnt, config):
263 def setenv(name, val): 289 def setenv(name, val):
264 if val is None: 290 if val is None:
265 val = '' 291 val = ''
266 env[name] = val.encode() 292 if hasattr(val, 'encode'):
293 val = val.encode()
294 env[name] = val
267 295
268 setenv('REPO_PROJECT', project['name']) 296 setenv('REPO_PROJECT', project['name'])
269 setenv('REPO_PATH', project['relpath']) 297 setenv('REPO_PATH', project['relpath'])
diff --git a/subcmds/init.py b/subcmds/init.py
index b73de71c..dbb6ddda 100644
--- a/subcmds/init.py
+++ b/subcmds/init.py
@@ -27,7 +27,7 @@ else:
27 import imp 27 import imp
28 import urlparse 28 import urlparse
29 urllib = imp.new_module('urllib') 29 urllib = imp.new_module('urllib')
30 urllib.parse = urlparse.urlparse 30 urllib.parse = urlparse
31 31
32from color import Coloring 32from color import Coloring
33from command import InteractiveCommand, MirrorSafeCommand 33from command import InteractiveCommand, MirrorSafeCommand
@@ -153,7 +153,7 @@ to update the working directory files.
153 # server where this git is located, so let's save that here. 153 # server where this git is located, so let's save that here.
154 mirrored_manifest_git = None 154 mirrored_manifest_git = None
155 if opt.reference: 155 if opt.reference:
156 manifest_git_path = urllib.parse(opt.manifest_url).path[1:] 156 manifest_git_path = urllib.parse.urlparse(opt.manifest_url).path[1:]
157 mirrored_manifest_git = os.path.join(opt.reference, manifest_git_path) 157 mirrored_manifest_git = os.path.join(opt.reference, manifest_git_path)
158 if not mirrored_manifest_git.endswith(".git"): 158 if not mirrored_manifest_git.endswith(".git"):
159 mirrored_manifest_git += ".git" 159 mirrored_manifest_git += ".git"
diff --git a/subcmds/sync.py b/subcmds/sync.py
index 2bdab3a6..ec333ae7 100644
--- a/subcmds/sync.py
+++ b/subcmds/sync.py
@@ -131,6 +131,10 @@ of a project from server.
131The -c/--current-branch option can be used to only fetch objects that 131The -c/--current-branch option can be used to only fetch objects that
132are on the branch specified by a project's revision. 132are on the branch specified by a project's revision.
133 133
134The --optimized-fetch option can be used to only fetch projects that
135are fixed to a sha1 revision if the sha1 revision does not already
136exist locally.
137
134SSH Connections 138SSH Connections
135--------------- 139---------------
136 140
@@ -206,6 +210,9 @@ later is required to fix a server side protocol bug.
206 p.add_option('--no-tags', 210 p.add_option('--no-tags',
207 dest='no_tags', action='store_true', 211 dest='no_tags', action='store_true',
208 help="don't fetch tags") 212 help="don't fetch tags")
213 p.add_option('--optimized-fetch',
214 dest='optimized_fetch', action='store_true',
215 help='only fetch projects fixed to sha1 if revision does not exist locally')
209 if show_smart: 216 if show_smart:
210 p.add_option('-s', '--smart-sync', 217 p.add_option('-s', '--smart-sync',
211 dest='smart_sync', action='store_true', 218 dest='smart_sync', action='store_true',
@@ -275,7 +282,8 @@ later is required to fix a server side protocol bug.
275 quiet=opt.quiet, 282 quiet=opt.quiet,
276 current_branch_only=opt.current_branch_only, 283 current_branch_only=opt.current_branch_only,
277 clone_bundle=not opt.no_clone_bundle, 284 clone_bundle=not opt.no_clone_bundle,
278 no_tags=opt.no_tags, archive=self.manifest.IsArchive) 285 no_tags=opt.no_tags, archive=self.manifest.IsArchive,
286 optimized_fetch=opt.optimized_fetch)
279 self._fetch_times.Set(project, time.time() - start) 287 self._fetch_times.Set(project, time.time() - start)
280 288
281 # Lock around all the rest of the code, since printing, updating a set 289 # Lock around all the rest of the code, since printing, updating a set
@@ -509,6 +517,9 @@ later is required to fix a server side protocol bug.
509 self.manifest.Override(opt.manifest_name) 517 self.manifest.Override(opt.manifest_name)
510 518
511 manifest_name = opt.manifest_name 519 manifest_name = opt.manifest_name
520 smart_sync_manifest_name = "smart_sync_override.xml"
521 smart_sync_manifest_path = os.path.join(
522 self.manifest.manifestProject.worktree, smart_sync_manifest_name)
512 523
513 if opt.smart_sync or opt.smart_tag: 524 if opt.smart_sync or opt.smart_tag:
514 if not self.manifest.manifest_server: 525 if not self.manifest.manifest_server:
@@ -575,17 +586,16 @@ later is required to fix a server side protocol bug.
575 [success, manifest_str] = server.GetManifest(opt.smart_tag) 586 [success, manifest_str] = server.GetManifest(opt.smart_tag)
576 587
577 if success: 588 if success:
578 manifest_name = "smart_sync_override.xml" 589 manifest_name = smart_sync_manifest_name
579 manifest_path = os.path.join(self.manifest.manifestProject.worktree,
580 manifest_name)
581 try: 590 try:
582 f = open(manifest_path, 'w') 591 f = open(smart_sync_manifest_path, 'w')
583 try: 592 try:
584 f.write(manifest_str) 593 f.write(manifest_str)
585 finally: 594 finally:
586 f.close() 595 f.close()
587 except IOError: 596 except IOError as e:
588 print('error: cannot write manifest to %s' % manifest_path, 597 print('error: cannot write manifest to %s:\n%s'
598 % (smart_sync_manifest_path, e),
589 file=sys.stderr) 599 file=sys.stderr)
590 sys.exit(1) 600 sys.exit(1)
591 self._ReloadManifest(manifest_name) 601 self._ReloadManifest(manifest_name)
@@ -602,6 +612,13 @@ later is required to fix a server side protocol bug.
602 % (self.manifest.manifest_server, e.errcode, e.errmsg), 612 % (self.manifest.manifest_server, e.errcode, e.errmsg),
603 file=sys.stderr) 613 file=sys.stderr)
604 sys.exit(1) 614 sys.exit(1)
615 else: # Not smart sync or smart tag mode
616 if os.path.isfile(smart_sync_manifest_path):
617 try:
618 os.remove(smart_sync_manifest_path)
619 except OSError as e:
620 print('error: failed to remove existing smart sync override manifest: %s' %
621 e, file=sys.stderr)
605 622
606 rp = self.manifest.repoProject 623 rp = self.manifest.repoProject
607 rp.PreSync() 624 rp.PreSync()
@@ -615,7 +632,8 @@ later is required to fix a server side protocol bug.
615 if not opt.local_only: 632 if not opt.local_only:
616 mp.Sync_NetworkHalf(quiet=opt.quiet, 633 mp.Sync_NetworkHalf(quiet=opt.quiet,
617 current_branch_only=opt.current_branch_only, 634 current_branch_only=opt.current_branch_only,
618 no_tags=opt.no_tags) 635 no_tags=opt.no_tags,
636 optimized_fetch=opt.optimized_fetch)
619 637
620 if mp.HasChanges: 638 if mp.HasChanges:
621 syncbuf = SyncBuffer(mp.config) 639 syncbuf = SyncBuffer(mp.config)