Show More
@@ -673,8 +673,7 class rebaseruntime(object): | |||||
673 | ('a', 'abort', False, _('abort an interrupted rebase')), |
|
673 | ('a', 'abort', False, _('abort an interrupted rebase')), | |
674 | ('', 'auto-orphans', '', _('automatically rebase orphan revisions ' |
|
674 | ('', 'auto-orphans', '', _('automatically rebase orphan revisions ' | |
675 | 'in the specified revset (EXPERIMENTAL)')), |
|
675 | 'in the specified revset (EXPERIMENTAL)')), | |
676 | ] + |
|
676 | ] + cmdutil.dryrunopts + cmdutil.formatteropts, | |
677 | cmdutil.formatteropts, |
|
|||
678 | _('[-s REV | -b REV] [-d REV] [OPTION]')) |
|
677 | _('[-s REV | -b REV] [-d REV] [OPTION]')) | |
679 | def rebase(ui, repo, **opts): |
|
678 | def rebase(ui, repo, **opts): | |
680 | """move changeset (and descendants) to a different branch |
|
679 | """move changeset (and descendants) to a different branch | |
@@ -798,6 +797,13 def rebase(ui, repo, **opts): | |||||
798 |
|
797 | |||
799 | """ |
|
798 | """ | |
800 | inmemory = ui.configbool('rebase', 'experimental.inmemory') |
|
799 | inmemory = ui.configbool('rebase', 'experimental.inmemory') | |
|
800 | dryrun = opts.get(r'dry_run') | |||
|
801 | if dryrun: | |||
|
802 | if opts.get(r'abort'): | |||
|
803 | raise error.Abort(_('cannot specify both --dry-run and --abort')) | |||
|
804 | if opts.get(r'continue'): | |||
|
805 | raise error.Abort(_('cannot specify both --dry-run and --continue')) | |||
|
806 | ||||
801 | if (opts.get(r'continue') or opts.get(r'abort') or |
|
807 | if (opts.get(r'continue') or opts.get(r'abort') or | |
802 | repo.currenttransaction() is not None): |
|
808 | repo.currenttransaction() is not None): | |
803 | # in-memory rebase is not compatible with resuming rebases. |
|
809 | # in-memory rebase is not compatible with resuming rebases. | |
@@ -814,7 +820,19 def rebase(ui, repo, **opts): | |||||
814 | opts[r'rev'] = [revsetlang.formatspec('%ld and orphan()', userrevs)] |
|
820 | opts[r'rev'] = [revsetlang.formatspec('%ld and orphan()', userrevs)] | |
815 | opts[r'dest'] = '_destautoorphanrebase(SRC)' |
|
821 | opts[r'dest'] = '_destautoorphanrebase(SRC)' | |
816 |
|
822 | |||
817 |
if |
|
823 | if dryrun: | |
|
824 | try: | |||
|
825 | overrides = {('rebase', 'singletransaction'): True} | |||
|
826 | with ui.configoverride(overrides, 'rebase'): | |||
|
827 | _origrebase(ui, repo, inmemory=True, leaveunfinished=True, | |||
|
828 | **opts) | |||
|
829 | except error.InMemoryMergeConflictsError: | |||
|
830 | ui.status(_('hit a merge conflict\n')) | |||
|
831 | else: | |||
|
832 | ui.status(_('there will be no conflict, you can rebase\n')) | |||
|
833 | finally: | |||
|
834 | _origrebase(ui, repo, abort=True) | |||
|
835 | elif inmemory: | |||
818 | try: |
|
836 | try: | |
819 | # in-memory merge doesn't support conflicts, so if we hit any, abort |
|
837 | # in-memory merge doesn't support conflicts, so if we hit any, abort | |
820 | # and re-run as an on-disk merge. |
|
838 | # and re-run as an on-disk merge. | |
@@ -824,12 +842,12 def rebase(ui, repo, **opts): | |||||
824 | except error.InMemoryMergeConflictsError: |
|
842 | except error.InMemoryMergeConflictsError: | |
825 | ui.warn(_('hit merge conflicts; re-running rebase without in-memory' |
|
843 | ui.warn(_('hit merge conflicts; re-running rebase without in-memory' | |
826 | ' merge\n')) |
|
844 | ' merge\n')) | |
827 |
_origrebase(ui, repo, |
|
845 | _origrebase(ui, repo, abort=True) | |
828 | return _origrebase(ui, repo, inmemory=False, **opts) |
|
846 | return _origrebase(ui, repo, inmemory=False, **opts) | |
829 | else: |
|
847 | else: | |
830 | return _origrebase(ui, repo, **opts) |
|
848 | return _origrebase(ui, repo, **opts) | |
831 |
|
849 | |||
832 | def _origrebase(ui, repo, inmemory=False, **opts): |
|
850 | def _origrebase(ui, repo, inmemory=False, leaveunfinished=False, **opts): | |
833 | opts = pycompat.byteskwargs(opts) |
|
851 | opts = pycompat.byteskwargs(opts) | |
834 | rbsrt = rebaseruntime(repo, ui, inmemory, opts) |
|
852 | rbsrt = rebaseruntime(repo, ui, inmemory, opts) | |
835 |
|
853 | |||
@@ -902,6 +920,7 def _origrebase(ui, repo, inmemory=False | |||||
902 | dsguard = dirstateguard.dirstateguard(repo, 'rebase') |
|
920 | dsguard = dirstateguard.dirstateguard(repo, 'rebase') | |
903 | with util.acceptintervention(dsguard): |
|
921 | with util.acceptintervention(dsguard): | |
904 | rbsrt._performrebase(tr) |
|
922 | rbsrt._performrebase(tr) | |
|
923 | if not leaveunfinished: | |||
905 | rbsrt._finishrebase() |
|
924 | rbsrt._finishrebase() | |
906 |
|
925 | |||
907 | def _definedestmap(ui, repo, inmemory, destf=None, srcf=None, basef=None, |
|
926 | def _definedestmap(ui, repo, inmemory, destf=None, srcf=None, basef=None, |
@@ -155,4 +155,170 Rebase the working copy parent | |||||
155 | |/ |
|
155 | |/ | |
156 | o 0: b173517d0057 'a' |
|
156 | o 0: b173517d0057 'a' | |
157 |
|
157 | |||
|
158 | Test dry-run rebasing | |||
|
159 | $ hg init skrepo | |||
|
160 | $ cd skrepo | |||
|
161 | $ echo a>a | |||
|
162 | $ hg ci -Aqma | |||
|
163 | $ echo b>b | |||
|
164 | $ hg ci -Aqmb | |||
|
165 | $ echo c>c | |||
|
166 | $ hg ci -Aqmc | |||
|
167 | $ echo d>d | |||
|
168 | $ hg ci -Aqmd | |||
|
169 | $ echo e>e | |||
|
170 | $ hg ci -Aqme | |||
158 |
|
171 | |||
|
172 | $ hg up 1 -q | |||
|
173 | $ echo f>f | |||
|
174 | $ hg ci -Amf | |||
|
175 | adding f | |||
|
176 | created new head | |||
|
177 | $ echo g>g | |||
|
178 | $ hg ci -Aqmg | |||
|
179 | $ hg log -G --template "{rev}:{short(node)} {person(author)}\n{firstline(desc)} {topic}\n\n" | |||
|
180 | @ 6:baf10c5166d4 test | |||
|
181 | | g | |||
|
182 | | | |||
|
183 | o 5:6343ca3eff20 test | |||
|
184 | | f | |||
|
185 | | | |||
|
186 | | o 4:e860deea161a test | |||
|
187 | | | e | |||
|
188 | | | | |||
|
189 | | o 3:055a42cdd887 test | |||
|
190 | | | d | |||
|
191 | | | | |||
|
192 | | o 2:177f92b77385 test | |||
|
193 | |/ c | |||
|
194 | | | |||
|
195 | o 1:d2ae7f538514 test | |||
|
196 | | b | |||
|
197 | | | |||
|
198 | o 0:cb9a9f314b8b test | |||
|
199 | a | |||
|
200 | ||||
|
201 | Make sure it throws error while passing --continue or --abort with --dry-run | |||
|
202 | $ hg rebase -s 2 -d 6 -n --continue | |||
|
203 | abort: cannot specify both --dry-run and --continue | |||
|
204 | [255] | |||
|
205 | $ hg rebase -s 2 -d 6 -n --abort | |||
|
206 | abort: cannot specify both --dry-run and --abort | |||
|
207 | [255] | |||
|
208 | ||||
|
209 | Check dryrun gives correct results when there is no conflict in rebasing | |||
|
210 | $ hg rebase -s 2 -d 6 -n | |||
|
211 | rebasing 2:177f92b77385 "c" | |||
|
212 | rebasing 3:055a42cdd887 "d" | |||
|
213 | rebasing 4:e860deea161a "e" | |||
|
214 | there will be no conflict, you can rebase | |||
|
215 | saved backup bundle to $TESTTMP/repo1/repo2/skrepo/.hg/strip-backup/c83b1da5b1ae-f1e0beb9-backup.hg | |||
|
216 | rebase aborted | |||
|
217 | ||||
|
218 | $ hg diff | |||
|
219 | $ hg status | |||
|
220 | ||||
|
221 | $ hg log -G --template "{rev}:{short(node)} {person(author)}\n{firstline(desc)} {topic}\n\n" | |||
|
222 | @ 6:baf10c5166d4 test | |||
|
223 | | g | |||
|
224 | | | |||
|
225 | o 5:6343ca3eff20 test | |||
|
226 | | f | |||
|
227 | | | |||
|
228 | | o 4:e860deea161a test | |||
|
229 | | | e | |||
|
230 | | | | |||
|
231 | | o 3:055a42cdd887 test | |||
|
232 | | | d | |||
|
233 | | | | |||
|
234 | | o 2:177f92b77385 test | |||
|
235 | |/ c | |||
|
236 | | | |||
|
237 | o 1:d2ae7f538514 test | |||
|
238 | | b | |||
|
239 | | | |||
|
240 | o 0:cb9a9f314b8b test | |||
|
241 | a | |||
|
242 | ||||
|
243 | Check dryrun working with --collapse when there is no conflict | |||
|
244 | $ hg rebase -s 2 -d 6 -n --collapse | |||
|
245 | rebasing 2:177f92b77385 "c" | |||
|
246 | rebasing 3:055a42cdd887 "d" | |||
|
247 | rebasing 4:e860deea161a "e" | |||
|
248 | there will be no conflict, you can rebase | |||
|
249 | rebase aborted | |||
|
250 | ||||
|
251 | Check dryrun gives correct results when there is conflict in rebasing | |||
|
252 | Make a conflict: | |||
|
253 | $ hg up 6 -q | |||
|
254 | $ echo conflict>e | |||
|
255 | $ hg ci -Aqm "conflict with e" | |||
|
256 | $ hg log -G --template "{rev}:{short(node)} {person(author)}\n{firstline(desc)} {topic}\n\n" | |||
|
257 | @ 7:d2c195b28050 test | |||
|
258 | | conflict with e | |||
|
259 | | | |||
|
260 | o 6:baf10c5166d4 test | |||
|
261 | | g | |||
|
262 | | | |||
|
263 | o 5:6343ca3eff20 test | |||
|
264 | | f | |||
|
265 | | | |||
|
266 | | o 4:e860deea161a test | |||
|
267 | | | e | |||
|
268 | | | | |||
|
269 | | o 3:055a42cdd887 test | |||
|
270 | | | d | |||
|
271 | | | | |||
|
272 | | o 2:177f92b77385 test | |||
|
273 | |/ c | |||
|
274 | | | |||
|
275 | o 1:d2ae7f538514 test | |||
|
276 | | b | |||
|
277 | | | |||
|
278 | o 0:cb9a9f314b8b test | |||
|
279 | a | |||
|
280 | ||||
|
281 | $ hg rebase -s 2 -d 7 -n | |||
|
282 | rebasing 2:177f92b77385 "c" | |||
|
283 | rebasing 3:055a42cdd887 "d" | |||
|
284 | rebasing 4:e860deea161a "e" | |||
|
285 | merging e | |||
|
286 | transaction abort! | |||
|
287 | rollback completed | |||
|
288 | hit a merge conflict | |||
|
289 | rebase aborted | |||
|
290 | $ hg diff | |||
|
291 | $ hg status | |||
|
292 | $ hg log -G --template "{rev}:{short(node)} {person(author)}\n{firstline(desc)} {topic}\n\n" | |||
|
293 | @ 7:d2c195b28050 test | |||
|
294 | | conflict with e | |||
|
295 | | | |||
|
296 | o 6:baf10c5166d4 test | |||
|
297 | | g | |||
|
298 | | | |||
|
299 | o 5:6343ca3eff20 test | |||
|
300 | | f | |||
|
301 | | | |||
|
302 | | o 4:e860deea161a test | |||
|
303 | | | e | |||
|
304 | | | | |||
|
305 | | o 3:055a42cdd887 test | |||
|
306 | | | d | |||
|
307 | | | | |||
|
308 | | o 2:177f92b77385 test | |||
|
309 | |/ c | |||
|
310 | | | |||
|
311 | o 1:d2ae7f538514 test | |||
|
312 | | b | |||
|
313 | | | |||
|
314 | o 0:cb9a9f314b8b test | |||
|
315 | a | |||
|
316 | ||||
|
317 | Check dryrun working with --collapse when there is conflicts | |||
|
318 | $ hg rebase -s 2 -d 7 -n --collapse | |||
|
319 | rebasing 2:177f92b77385 "c" | |||
|
320 | rebasing 3:055a42cdd887 "d" | |||
|
321 | rebasing 4:e860deea161a "e" | |||
|
322 | merging e | |||
|
323 | hit a merge conflict | |||
|
324 | rebase aborted |
General Comments 0
You need to be logged in to leave comments.
Login now