summaryrefslogtreecommitdiffstats
path: root/subcmds/upload.py
diff options
context:
space:
mode:
Diffstat (limited to 'subcmds/upload.py')
-rw-r--r--subcmds/upload.py59
1 files changed, 58 insertions, 1 deletions
diff --git a/subcmds/upload.py b/subcmds/upload.py
index 9018455f..11f035d7 100644
--- a/subcmds/upload.py
+++ b/subcmds/upload.py
@@ -29,7 +29,7 @@ class Upload(InteractiveCommand):
29 common = True 29 common = True
30 helpSummary = "Upload changes for code review" 30 helpSummary = "Upload changes for code review"
31 helpUsage=""" 31 helpUsage="""
32%prog [<project>]... 32%prog {[<project>]... | --replace <project>}
33""" 33"""
34 helpDescription = """ 34 helpDescription = """
35The '%prog' command is used to send changes to the Gerrit code 35The '%prog' command is used to send changes to the Gerrit code
@@ -46,6 +46,11 @@ no projects are specified, '%prog' will search for uploadable
46changes in all projects listed in the manifest. 46changes in all projects listed in the manifest.
47""" 47"""
48 48
49 def _Options(self, p):
50 p.add_option('--replace',
51 dest='replace', action='store_true',
52 help='Upload replacement patchesets from this branch')
53
49 def _SingleBranch(self, branch): 54 def _SingleBranch(self, branch):
50 project = branch.project 55 project = branch.project
51 name = branch.name 56 name = branch.name
@@ -129,6 +134,50 @@ changes in all projects listed in the manifest.
129 _die("nothing uncommented for upload") 134 _die("nothing uncommented for upload")
130 self._UploadAndReport(todo) 135 self._UploadAndReport(todo)
131 136
137 def _ReplaceBranch(self, project):
138 branch = project.CurrentBranch
139 if not branch:
140 print >>sys.stdout, "no branches ready for upload"
141 return
142 branch = project.GetUploadableBranch(branch)
143 if not branch:
144 print >>sys.stdout, "no branches ready for upload"
145 return
146
147 script = []
148 script.append('# Replacing from branch %s' % branch.name)
149 for commit in branch.commits:
150 script.append('[ ] %s' % commit)
151 script.append('')
152 script.append('# Insert change numbers in the brackets to add a new patch set.')
153 script.append('# To create a new change record, leave the brackets empty.')
154
155 script = Editor.EditString("\n".join(script)).split("\n")
156
157 change_re = re.compile(r'^\[\s*(\d{1,})\s*\]\s*([0-9a-f]{1,}) .*$')
158 to_replace = dict()
159 full_hashes = branch.unabbrev_commits
160
161 for line in script:
162 m = change_re.match(line)
163 if m:
164 f = m.group(2)
165 try:
166 f = full_hashes[f]
167 except KeyError:
168 print 'fh = %s' % full_hashes
169 print >>sys.stderr, "error: commit %s not found" % f
170 sys.exit(1)
171 to_replace[m.group(1)] = f
172
173 if not to_replace:
174 print >>sys.stderr, "error: no replacements specified"
175 print >>sys.stderr, " use 'repo upload' without --replace"
176 sys.exit(1)
177
178 branch.replace_changes = to_replace
179 self._UploadAndReport([branch])
180
132 def _UploadAndReport(self, todo): 181 def _UploadAndReport(self, todo):
133 have_errors = False 182 have_errors = False
134 for branch in todo: 183 for branch in todo:
@@ -168,6 +217,14 @@ changes in all projects listed in the manifest.
168 project_list = self.GetProjects(args) 217 project_list = self.GetProjects(args)
169 pending = [] 218 pending = []
170 219
220 if opt.replace:
221 if len(project_list) != 1:
222 print >>sys.stderr, \
223 'error: --replace requires exactly one project'
224 sys.exit(1)
225 self._ReplaceBranch(project_list[0])
226 return
227
171 for project in project_list: 228 for project in project_list:
172 avail = project.GetUploadableBranches() 229 avail = project.GetUploadableBranches()
173 if avail: 230 if avail: