summaryrefslogtreecommitdiffstats
path: root/subcmds
diff options
context:
space:
mode:
authorShawn O. Pearce <sop@google.com>2009-04-16 11:21:18 -0700
committerShawn O. Pearce <sop@google.com>2009-04-16 11:21:18 -0700
commit350cde4c4bec5e7b5776cf52d61da600af3efc31 (patch)
tree45c09f4113cf5d7c0d5430360344c5d97d93304e /subcmds
parent48244781c2cad1565b4b32b4524ff9931a39f848 (diff)
downloadgit-repo-350cde4c4bec5e7b5776cf52d61da600af3efc31.tar.gz
Change repo sync to be more friendly when updating the treev1.6.6
We now try to sync all projects that can be done safely first, before we start rebasing user commits over the upstream. This has the nice effect of making the local tree as close to the upstream as possible before the user has to start resolving merge conflicts, as that extra information in other projects may aid in the conflict resolution. Informational output is buffered and delayed until calculation for all projects has been done, so that the user gets one concise list of notice messages, rather than it interrupting the progress meter. Fast-forward output is now prefixed with the project header, so the user can see which project that update is taking place in, and make some relation of the diffstat back to the project name. Rebase output is now prefixed with the project header, so that if the rebase fails, the user can see which project we were operating on and can try to address the failure themselves. Since rebase sits on a detached HEAD, we now look for an in-progress rebase during sync, so we can alert the user that the given project is in a state we cannot handle. Signed-off-by: Shawn O. Pearce <sop@google.com>
Diffstat (limited to 'subcmds')
-rw-r--r--subcmds/init.py6
-rw-r--r--subcmds/sync.py18
2 files changed, 18 insertions, 6 deletions
diff --git a/subcmds/init.py b/subcmds/init.py
index a32eaae0..103a78d6 100644
--- a/subcmds/init.py
+++ b/subcmds/init.py
@@ -20,6 +20,7 @@ from color import Coloring
20from command import InteractiveCommand, MirrorSafeCommand 20from command import InteractiveCommand, MirrorSafeCommand
21from error import ManifestParseError 21from error import ManifestParseError
22from remote import Remote 22from remote import Remote
23from project import SyncBuffer
23from git_command import git, MIN_GIT_VERSION 24from git_command import git, MIN_GIT_VERSION
24 25
25class Init(InteractiveCommand, MirrorSafeCommand): 26class Init(InteractiveCommand, MirrorSafeCommand):
@@ -129,7 +130,10 @@ default.xml will be used.
129 print >>sys.stderr, 'fatal: cannot obtain manifest %s' % r.url 130 print >>sys.stderr, 'fatal: cannot obtain manifest %s' % r.url
130 sys.exit(1) 131 sys.exit(1)
131 132
132 m.Sync_LocalHalf() 133 syncbuf = SyncBuffer(m.config)
134 m.Sync_LocalHalf(syncbuf)
135 syncbuf.Finish()
136
133 if is_new or m.CurrentBranch is None: 137 if is_new or m.CurrentBranch is None:
134 if not m.StartBranch('default'): 138 if not m.StartBranch('default'):
135 print >>sys.stderr, 'fatal: cannot create default in manifest' 139 print >>sys.stderr, 'fatal: cannot create default in manifest'
diff --git a/subcmds/sync.py b/subcmds/sync.py
index f6eb2a08..ec5ada21 100644
--- a/subcmds/sync.py
+++ b/subcmds/sync.py
@@ -24,6 +24,7 @@ from project import HEAD
24from command import Command, MirrorSafeCommand 24from command import Command, MirrorSafeCommand
25from error import RepoChangedException, GitError 25from error import RepoChangedException, GitError
26from project import R_HEADS 26from project import R_HEADS
27from project import SyncBuffer
27from progress import Progress 28from progress import Progress
28 29
29class Sync(Command, MirrorSafeCommand): 30class Sync(Command, MirrorSafeCommand):
@@ -112,7 +113,9 @@ revision is temporarily needed.
112 return 113 return
113 114
114 if mp.HasChanges: 115 if mp.HasChanges:
115 if not mp.Sync_LocalHalf(): 116 syncbuf = SyncBuffer(mp.config)
117 mp.Sync_LocalHalf(syncbuf)
118 if not syncbuf.Finish():
116 sys.exit(1) 119 sys.exit(1)
117 120
118 self.manifest._Unload() 121 self.manifest._Unload()
@@ -123,14 +126,17 @@ revision is temporarily needed.
123 missing.append(project) 126 missing.append(project)
124 self._Fetch(*missing) 127 self._Fetch(*missing)
125 128
129 syncbuf = SyncBuffer(mp.config,
130 detach_head = opt.detach_head)
126 pm = Progress('Syncing work tree', len(all)) 131 pm = Progress('Syncing work tree', len(all))
127 for project in all: 132 for project in all:
128 pm.update() 133 pm.update()
129 if project.worktree: 134 if project.worktree:
130 if not project.Sync_LocalHalf( 135 project.Sync_LocalHalf(syncbuf)
131 detach_head=opt.detach_head):
132 sys.exit(1)
133 pm.end() 136 pm.end()
137 print >>sys.stderr
138 if not syncbuf.Finish():
139 sys.exit(1)
134 140
135 141
136def _PostRepoUpgrade(manifest): 142def _PostRepoUpgrade(manifest):
@@ -143,7 +149,9 @@ def _PostRepoFetch(rp, no_repo_verify=False, verbose=False):
143 print >>sys.stderr, 'info: A new version of repo is available' 149 print >>sys.stderr, 'info: A new version of repo is available'
144 print >>sys.stderr, '' 150 print >>sys.stderr, ''
145 if no_repo_verify or _VerifyTag(rp): 151 if no_repo_verify or _VerifyTag(rp):
146 if not rp.Sync_LocalHalf(): 152 syncbuf = SyncBuffer(rp.config)
153 rp.Sync_LocalHalf(syncbuf)
154 if not syncbuf.Finish():
147 sys.exit(1) 155 sys.exit(1)
148 print >>sys.stderr, 'info: Restarting repo with latest version' 156 print >>sys.stderr, 'info: Restarting repo with latest version'
149 raise RepoChangedException(['--repo-upgraded']) 157 raise RepoChangedException(['--repo-upgraded'])