##// END OF EJS Templates
rebase: add dry-run functionality...
Sushil khanchi -
r38391:f4f1fb1c default
parent child Browse files
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 inmemory:
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, **{r'abort': True})
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