510 |
510 |
511 if not self.keepf: |
511 if not self.keepf: |
512 collapsedas = None |
512 collapsedas = None |
513 if self.collapsef: |
513 if self.collapsef: |
514 collapsedas = newnode |
514 collapsedas = newnode |
515 clearrebased(ui, repo, self.state, self.skipped, collapsedas) |
515 clearrebased(ui, repo, self.dest, self.state, self.skipped, |
|
516 collapsedas) |
516 |
517 |
517 clearstatus(repo) |
518 clearstatus(repo) |
518 clearcollapsemsg(repo) |
519 clearcollapsemsg(repo) |
519 |
520 |
520 ui.note(_("rebase completed\n")) |
521 ui.note(_("rebase completed\n")) |
894 # duplicate any copies that have already been |
895 # duplicate any copies that have already been |
895 # performed in the destination. |
896 # performed in the destination. |
896 p1rev = repo[rev].p1().rev() |
897 p1rev = repo[rev].p1().rev() |
897 copies.duplicatecopies(repo, rev, p1rev, skiprev=dest) |
898 copies.duplicatecopies(repo, rev, p1rev, skiprev=dest) |
898 return stats |
899 return stats |
|
900 |
|
901 def adjustdest(repo, rev, dest, state): |
|
902 """adjust rebase destination given the current rebase state |
|
903 |
|
904 rev is what is being rebased. Return a list of two revs, which are the |
|
905 adjusted destinations for rev's p1 and p2, respectively. If a parent is |
|
906 nullrev, return dest without adjustment for it. |
|
907 |
|
908 For example, when doing rebase -r B+E -d F, rebase will first move B to B1, |
|
909 and E's destination will be adjusted from F to B1. |
|
910 |
|
911 B1 <- written during rebasing B |
|
912 | |
|
913 F <- original destination of B, E |
|
914 | |
|
915 | E <- rev, which is being rebased |
|
916 | | |
|
917 | D <- prev, one parent of rev being checked |
|
918 | | |
|
919 | x <- skipped, ex. no successor or successor in (::dest) |
|
920 | | |
|
921 | C |
|
922 | | |
|
923 | B <- rebased as B1 |
|
924 |/ |
|
925 A |
|
926 |
|
927 Another example about merge changeset, rebase -r C+G+H -d K, rebase will |
|
928 first move C to C1, G to G1, and when it's checking H, the adjusted |
|
929 destinations will be [C1, G1]. |
|
930 |
|
931 H C1 G1 |
|
932 /| | / |
|
933 F G |/ |
|
934 K | | -> K |
|
935 | C D | |
|
936 | |/ | |
|
937 | B | ... |
|
938 |/ |/ |
|
939 A A |
|
940 """ |
|
941 result = [] |
|
942 for prev in repo.changelog.parentrevs(rev): |
|
943 adjusted = dest |
|
944 if prev != nullrev: |
|
945 # pick already rebased revs from state |
|
946 source = [s for s, d in state.items() if d > 0] |
|
947 candidate = repo.revs('max(%ld and (::%d))', source, prev).first() |
|
948 if candidate is not None: |
|
949 adjusted = state[candidate] |
|
950 result.append(adjusted) |
|
951 return result |
899 |
952 |
900 def nearestrebased(repo, rev, state): |
953 def nearestrebased(repo, rev, state): |
901 """return the nearest ancestors of rev in the rebase result""" |
954 """return the nearest ancestors of rev in the rebase result""" |
902 rebased = [r for r in state if state[r] > nullmerge] |
955 rebased = [r for r in state if state[r] > nullmerge] |
903 candidates = repo.revs('max(%ld and (::%d))', rebased, rev) |
956 candidates = repo.revs('max(%ld and (::%d))', rebased, rev) |
1299 state[r] = revpruned |
1352 state[r] = revpruned |
1300 else: |
1353 else: |
1301 state[r] = revprecursor |
1354 state[r] = revprecursor |
1302 return originalwd, dest.rev(), state |
1355 return originalwd, dest.rev(), state |
1303 |
1356 |
1304 def clearrebased(ui, repo, state, skipped, collapsedas=None): |
1357 def clearrebased(ui, repo, dest, state, skipped, collapsedas=None): |
1305 """dispose of rebased revision at the end of the rebase |
1358 """dispose of rebased revision at the end of the rebase |
1306 |
1359 |
1307 If `collapsedas` is not None, the rebase was a collapse whose result if the |
1360 If `collapsedas` is not None, the rebase was a collapse whose result if the |
1308 `collapsedas` node.""" |
1361 `collapsedas` node.""" |
1309 tonode = repo.changelog.node |
1362 tonode = repo.changelog.node |
|
1363 # Move bookmark of skipped nodes to destination. This cannot be handled |
|
1364 # by scmutil.cleanupnodes since it will treat rev as removed (no successor) |
|
1365 # and move bookmark backwards. |
|
1366 bmchanges = [(name, tonode(max(adjustdest(repo, rev, dest, state)))) |
|
1367 for rev in skipped |
|
1368 for name in repo.nodebookmarks(tonode(rev))] |
|
1369 if bmchanges: |
|
1370 with repo.transaction('rebase') as tr: |
|
1371 repo._bookmarks.applychanges(repo, tr, bmchanges) |
1310 mapping = {} |
1372 mapping = {} |
1311 for rev, newrev in sorted(state.items()): |
1373 for rev, newrev in sorted(state.items()): |
1312 if newrev >= 0 and newrev != rev: |
1374 if newrev >= 0 and newrev != rev: |
1313 if rev in skipped: |
1375 if rev in skipped: |
1314 succs = () |
1376 succs = () |