Show More
@@ -149,6 +149,13 b' configuration file::' | |||
|
149 | 149 | |
|
150 | 150 | [histedit] |
|
151 | 151 | linelen = 120 # truncate rule lines at 120 characters |
|
152 | ||
|
153 | ``hg histedit`` attempts to automatically choose an appropriate base | |
|
154 | revision to use. To change which base revision is used, define a | |
|
155 | revset in your configuration file:: | |
|
156 | ||
|
157 | [histedit] | |
|
158 | defaultrev = only(.) & draft() | |
|
152 | 159 | """ |
|
153 | 160 | |
|
154 | 161 | try: |
@@ -166,6 +173,7 b' from mercurial import discovery' | |||
|
166 | 173 | from mercurial import error |
|
167 | 174 | from mercurial import copies |
|
168 | 175 | from mercurial import context |
|
176 | from mercurial import destutil | |
|
169 | 177 | from mercurial import exchange |
|
170 | 178 | from mercurial import extensions |
|
171 | 179 | from mercurial import hg |
@@ -786,13 +794,19 b' def findoutgoing(ui, repo, remote=None, ' | |||
|
786 | 794 | ('f', 'force', False, |
|
787 | 795 | _('force outgoing even for unrelated repositories')), |
|
788 | 796 | ('r', 'rev', [], _('first revision to be edited'), _('REV'))], |
|
789 | _("ANCESTOR | --outgoing [URL]")) | |
|
797 | _("[ANCESTOR] | --outgoing [URL]")) | |
|
790 | 798 | def histedit(ui, repo, *freeargs, **opts): |
|
791 | 799 | """interactively edit changeset history |
|
792 | 800 | |
|
793 | This command edits changesets between ANCESTOR and the parent of | |
|
801 | This command edits changesets between an ANCESTOR and the parent of | |
|
794 | 802 | the working directory. |
|
795 | 803 | |
|
804 | The value from the "histedit.defaultrev" config option is used as a | |
|
805 | revset to select the base revision when ANCESTOR is not specified. | |
|
806 | The first revision returned by the revset is used. By default, this | |
|
807 | selects the editable history that is unique to the ancestry of the | |
|
808 | working directory. | |
|
809 | ||
|
796 | 810 | With --outgoing, this edits changesets not found in the |
|
797 | 811 | destination repository. If URL of the destination is omitted, the |
|
798 | 812 | 'default-push' (or 'default') path will be used. |
@@ -917,10 +931,10 b' def _histedit(ui, repo, state, *freeargs' | |||
|
917 | 931 | else: |
|
918 | 932 | revs.extend(freeargs) |
|
919 | 933 | if len(revs) == 0: |
|
920 | # experimental config: histedit.defaultrev | |
|
921 | histeditdefault = ui.config('histedit', 'defaultrev') | |
|
922 |
|
|
|
923 | revs.append(histeditdefault) | |
|
934 | defaultrev = destutil.desthistedit(ui, repo) | |
|
935 | if defaultrev is not None: | |
|
936 | revs.append(defaultrev) | |
|
937 | ||
|
924 | 938 | if len(revs) != 1: |
|
925 | 939 | raise error.Abort( |
|
926 | 940 | _('histedit requires exactly one ancestor revision')) |
@@ -198,3 +198,18 b' def destmerge(repo):' | |||
|
198 | 198 | else: |
|
199 | 199 | node = _destmergebranch(repo) |
|
200 | 200 | return repo[node].rev() |
|
201 | ||
|
202 | histeditdefaultrevset = 'reverse(only(.) and not public() and not ::merge())' | |
|
203 | ||
|
204 | def desthistedit(ui, repo): | |
|
205 | """Default base revision to edit for `hg histedit`.""" | |
|
206 | default = ui.config('histedit', 'defaultrev', histeditdefaultrevset) | |
|
207 | if default: | |
|
208 | revs = repo.revs(default) | |
|
209 | if revs: | |
|
210 | # The revset supplied by the user may not be in ascending order nor | |
|
211 | # take the first revision. So do this manually. | |
|
212 | revs.sort() | |
|
213 | return revs.first() | |
|
214 | ||
|
215 | return None |
@@ -347,3 +347,101 b' Histedit state has been exited' | |||
|
347 | 347 | commit: 1 added, 1 unknown (new branch head) |
|
348 | 348 | update: 4 new changesets (update) |
|
349 | 349 | |
|
350 | $ cd .. | |
|
351 | ||
|
352 | Set up default base revision tests | |
|
353 | ||
|
354 | $ hg init defaultbase | |
|
355 | $ cd defaultbase | |
|
356 | $ touch foo | |
|
357 | $ hg -q commit -A -m root | |
|
358 | $ echo 1 > foo | |
|
359 | $ hg commit -m 'public 1' | |
|
360 | $ hg phase --force --public -r . | |
|
361 | $ echo 2 > foo | |
|
362 | $ hg commit -m 'draft after public' | |
|
363 | $ hg -q up -r 1 | |
|
364 | $ echo 3 > foo | |
|
365 | $ hg commit -m 'head 1 public' | |
|
366 | created new head | |
|
367 | $ hg phase --force --public -r . | |
|
368 | $ echo 4 > foo | |
|
369 | $ hg commit -m 'head 1 draft 1' | |
|
370 | $ echo 5 > foo | |
|
371 | $ hg commit -m 'head 1 draft 2' | |
|
372 | $ hg -q up -r 2 | |
|
373 | $ echo 6 > foo | |
|
374 | $ hg commit -m 'head 2 commit 1' | |
|
375 | $ echo 7 > foo | |
|
376 | $ hg commit -m 'head 2 commit 2' | |
|
377 | $ hg -q up -r 2 | |
|
378 | $ echo 8 > foo | |
|
379 | $ hg commit -m 'head 3' | |
|
380 | created new head | |
|
381 | $ hg -q up -r 2 | |
|
382 | $ echo 9 > foo | |
|
383 | $ hg commit -m 'head 4' | |
|
384 | created new head | |
|
385 | $ hg merge --tool :local -r 8 | |
|
386 | 0 files updated, 1 files merged, 0 files removed, 0 files unresolved | |
|
387 | (branch merge, don't forget to commit) | |
|
388 | $ hg commit -m 'merge head 3 into head 4' | |
|
389 | $ echo 11 > foo | |
|
390 | $ hg commit -m 'commit 1 after merge' | |
|
391 | $ echo 12 > foo | |
|
392 | $ hg commit -m 'commit 2 after merge' | |
|
393 | ||
|
394 | $ hg log -G -T '{rev}:{node|short} {phase} {desc}\n' | |
|
395 | @ 12:8cde254db839 draft commit 2 after merge | |
|
396 | | | |
|
397 | o 11:6f2f0241f119 draft commit 1 after merge | |
|
398 | | | |
|
399 | o 10:90506cc76b00 draft merge head 3 into head 4 | |
|
400 | |\ | |
|
401 | | o 9:f8607a373a97 draft head 4 | |
|
402 | | | | |
|
403 | o | 8:0da92be05148 draft head 3 | |
|
404 | |/ | |
|
405 | | o 7:4c35cdf97d5e draft head 2 commit 2 | |
|
406 | | | | |
|
407 | | o 6:931820154288 draft head 2 commit 1 | |
|
408 | |/ | |
|
409 | | o 5:8cdc02b9bc63 draft head 1 draft 2 | |
|
410 | | | | |
|
411 | | o 4:463b8c0d2973 draft head 1 draft 1 | |
|
412 | | | | |
|
413 | | o 3:23a0c4eefcbf public head 1 public | |
|
414 | | | | |
|
415 | o | 2:4117331c3abb draft draft after public | |
|
416 | |/ | |
|
417 | o 1:4426d359ea59 public public 1 | |
|
418 | | | |
|
419 | o 0:54136a8ddf32 public root | |
|
420 | ||
|
421 | ||
|
422 | Default base revision should stop at public changesets | |
|
423 | ||
|
424 | $ hg -q up 8cdc02b9bc63 | |
|
425 | $ hg histedit --commands - <<EOF | |
|
426 | > pick 463b8c0d2973 | |
|
427 | > pick 8cdc02b9bc63 | |
|
428 | > EOF | |
|
429 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
|
430 | ||
|
431 | Default base revision should stop at branchpoint | |
|
432 | ||
|
433 | $ hg -q up 4c35cdf97d5e | |
|
434 | $ hg histedit --commands - <<EOF | |
|
435 | > pick 931820154288 | |
|
436 | > pick 4c35cdf97d5e | |
|
437 | > EOF | |
|
438 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
|
439 | ||
|
440 | Default base revision should stop at merge commit | |
|
441 | ||
|
442 | $ hg -q up 8cde254db839 | |
|
443 | $ hg histedit --commands - <<EOF | |
|
444 | > pick 6f2f0241f119 | |
|
445 | > pick 8cde254db839 | |
|
446 | > EOF | |
|
447 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved |
General Comments 0
You need to be logged in to leave comments.
Login now