Show More
@@ -163,6 +163,17 b' def submerge(repo, wctx, mctx, actx, ove' | |||||
163 | # record merged .hgsubstate |
|
163 | # record merged .hgsubstate | |
164 | writestate(repo, sm) |
|
164 | writestate(repo, sm) | |
165 |
|
165 | |||
|
166 | def _updateprompt(ui, sub, dirty, local, remote): | |||
|
167 | if dirty: | |||
|
168 | msg = (_(' subrepository sources for %s differ\n' | |||
|
169 | 'use (l)ocal source (%s) or (r)emote source (%s)?\n') | |||
|
170 | % (subrelpath(sub), local, remote)) | |||
|
171 | else: | |||
|
172 | msg = (_(' subrepository sources for %s differ (in checked out version)\n' | |||
|
173 | 'use (l)ocal source (%s) or (r)emote source (%s)?\n') | |||
|
174 | % (subrelpath(sub), local, remote)) | |||
|
175 | return ui.promptchoice(msg, (_('&Local'), _('&Remote')), 0) | |||
|
176 | ||||
166 | def reporelpath(repo): |
|
177 | def reporelpath(repo): | |
167 | """return path to this (sub)repo as seen from outermost repo""" |
|
178 | """return path to this (sub)repo as seen from outermost repo""" | |
168 | parent = repo |
|
179 | parent = repo | |
@@ -442,14 +453,26 b' class hgsubrepo(abstractsubrepo):' | |||||
442 | cur = self._repo['.'] |
|
453 | cur = self._repo['.'] | |
443 | dst = self._repo[state[1]] |
|
454 | dst = self._repo[state[1]] | |
444 | anc = dst.ancestor(cur) |
|
455 | anc = dst.ancestor(cur) | |
445 | if anc == cur: |
|
456 | ||
446 | self._repo.ui.debug("updating subrepo %s\n" % subrelpath(self)) |
|
457 | def mergefunc(): | |
447 | hg.update(self._repo, state[1]) |
|
458 | if anc == cur: | |
448 | elif anc == dst: |
|
459 | self._repo.ui.debug("updating subrepo %s\n" % subrelpath(self)) | |
449 | self._repo.ui.debug("skipping subrepo %s\n" % subrelpath(self)) |
|
460 | hg.update(self._repo, state[1]) | |
|
461 | elif anc == dst: | |||
|
462 | self._repo.ui.debug("skipping subrepo %s\n" % subrelpath(self)) | |||
|
463 | else: | |||
|
464 | self._repo.ui.debug("merging subrepo %s\n" % subrelpath(self)) | |||
|
465 | hg.merge(self._repo, state[1], remind=False) | |||
|
466 | ||||
|
467 | wctx = self._repo[None] | |||
|
468 | if self.dirty(): | |||
|
469 | if anc != dst: | |||
|
470 | if _updateprompt(self._repo.ui, self, wctx.dirty(), cur, dst): | |||
|
471 | mergefunc() | |||
|
472 | else: | |||
|
473 | mergefunc() | |||
450 | else: |
|
474 | else: | |
451 | self._repo.ui.debug("merging subrepo %s\n" % subrelpath(self)) |
|
475 | mergefunc() | |
452 | hg.merge(self._repo, state[1], remind=False) |
|
|||
453 |
|
476 | |||
454 | def push(self, force): |
|
477 | def push(self, force): | |
455 | # push subrepos depth-first for coherent ordering |
|
478 | # push subrepos depth-first for coherent ordering | |
@@ -608,10 +631,12 b' class svnsubrepo(abstractsubrepo):' | |||||
608 | self._ui.status(status) |
|
631 | self._ui.status(status) | |
609 |
|
632 | |||
610 | def merge(self, state): |
|
633 | def merge(self, state): | |
611 |
old = |
|
634 | old = self._state[1] | |
612 |
new = |
|
635 | new = state[1] | |
613 |
if new |
|
636 | if new != self._wcrev(): | |
614 | self.get(state) |
|
637 | dirty = old == self._wcrev() or self._wcchanged()[0] | |
|
638 | if _updateprompt(self._ui, self, dirty, self._wcrev(), new): | |||
|
639 | self.get(state, False) | |||
615 |
|
640 | |||
616 | def push(self, force): |
|
641 | def push(self, force): | |
617 | # push is a no-op for SVN |
|
642 | # push is a no-op for SVN | |
@@ -850,10 +875,21 b' class gitsubrepo(abstractsubrepo):' | |||||
850 | source, revision, kind = state |
|
875 | source, revision, kind = state | |
851 | self._fetch(source, revision) |
|
876 | self._fetch(source, revision) | |
852 | base = self._gitcommand(['merge-base', revision, self._state[1]]) |
|
877 | base = self._gitcommand(['merge-base', revision, self._state[1]]) | |
853 | if base == revision: |
|
878 | out, code = self._gitdir(['diff-index', '--quiet', 'HEAD']) | |
854 | self.get(state) # fast forward merge |
|
879 | ||
855 | elif base != self._state[1]: |
|
880 | def mergefunc(): | |
856 | self._gitcommand(['merge', '--no-commit', revision]) |
|
881 | if base == revision: | |
|
882 | self.get(state) # fast forward merge | |||
|
883 | elif base != self._state[1]: | |||
|
884 | self._gitcommand(['merge', '--no-commit', revision]) | |||
|
885 | ||||
|
886 | if self.dirty(): | |||
|
887 | if self._gitstate() != revision: | |||
|
888 | dirty = self._gitstate() == self._state[1] or code != 0 | |||
|
889 | if _updateprompt(self._ui, self, dirty, self._state[1], revision): | |||
|
890 | mergefunc() | |||
|
891 | else: | |||
|
892 | mergefunc() | |||
857 |
|
893 | |||
858 | def push(self, force): |
|
894 | def push(self, force): | |
859 | # if a branch in origin contains the revision, nothing to do |
|
895 | # if a branch in origin contains the revision, nothing to do |
@@ -329,3 +329,117 b' Check hg update --clean' | |||||
329 | f1 |
|
329 | f1 | |
330 | f2 |
|
330 | f2 | |
331 | g |
|
331 | g | |
|
332 | ||||
|
333 | Sticky subrepositories, no changes | |||
|
334 | $ cd $TESTTMP/ta | |||
|
335 | $ hg id -n | |||
|
336 | 7 | |||
|
337 | $ cd s | |||
|
338 | $ git rev-parse HEAD | |||
|
339 | 32a343883b74769118bb1d3b4b1fbf9156f4dddc | |||
|
340 | $ cd .. | |||
|
341 | $ hg update 1 > /dev/null 2>&1 | |||
|
342 | $ hg id -n | |||
|
343 | 1 | |||
|
344 | $ cd s | |||
|
345 | $ git rev-parse HEAD | |||
|
346 | da5f5b1d8ffcf62fb8327bcd3c89a4367a6018e7 | |||
|
347 | $ cd .. | |||
|
348 | ||||
|
349 | Sticky subrepositorys, file changes | |||
|
350 | $ touch s/f1 | |||
|
351 | $ cd s | |||
|
352 | $ git add f1 | |||
|
353 | $ cd .. | |||
|
354 | $ hg id -n | |||
|
355 | 1 | |||
|
356 | $ cd s | |||
|
357 | $ git rev-parse HEAD | |||
|
358 | da5f5b1d8ffcf62fb8327bcd3c89a4367a6018e7 | |||
|
359 | $ cd .. | |||
|
360 | $ hg update 4 | |||
|
361 | subrepository sources for s differ | |||
|
362 | use (l)ocal source (da5f5b1d8ffcf62fb8327bcd3c89a4367a6018e7) or (r)emote source (aa84837ccfbdfedcdcdeeedc309d73e6eb069edc)? | |||
|
363 | l | |||
|
364 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
365 | $ hg id -n | |||
|
366 | 4+ | |||
|
367 | $ cd s | |||
|
368 | $ git rev-parse HEAD | |||
|
369 | da5f5b1d8ffcf62fb8327bcd3c89a4367a6018e7 | |||
|
370 | $ cd .. | |||
|
371 | $ hg update --clean tip > /dev/null 2>&1 | |||
|
372 | ||||
|
373 | Sticky subrepository, revision updates | |||
|
374 | $ hg id -n | |||
|
375 | 7 | |||
|
376 | $ cd s | |||
|
377 | $ git rev-parse HEAD | |||
|
378 | 32a343883b74769118bb1d3b4b1fbf9156f4dddc | |||
|
379 | $ cd .. | |||
|
380 | $ cd s | |||
|
381 | $ git checkout aa84837ccfbdfedcdcdeeedc309d73e6eb069edc | |||
|
382 | Previous HEAD position was 32a3438... fff | |||
|
383 | HEAD is now at aa84837... f | |||
|
384 | $ cd .. | |||
|
385 | $ hg update 1 | |||
|
386 | subrepository sources for s differ (in checked out version) | |||
|
387 | use (l)ocal source (32a343883b74769118bb1d3b4b1fbf9156f4dddc) or (r)emote source (da5f5b1d8ffcf62fb8327bcd3c89a4367a6018e7)? | |||
|
388 | l | |||
|
389 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
390 | $ hg id -n | |||
|
391 | 1+ | |||
|
392 | $ cd s | |||
|
393 | $ git rev-parse HEAD | |||
|
394 | aa84837ccfbdfedcdcdeeedc309d73e6eb069edc | |||
|
395 | $ cd .. | |||
|
396 | ||||
|
397 | Sticky subrepository, file changes and revision updates | |||
|
398 | $ touch s/f1 | |||
|
399 | $ cd s | |||
|
400 | $ git add f1 | |||
|
401 | $ git rev-parse HEAD | |||
|
402 | aa84837ccfbdfedcdcdeeedc309d73e6eb069edc | |||
|
403 | $ cd .. | |||
|
404 | $ hg id -n | |||
|
405 | 1+ | |||
|
406 | $ hg update 7 | |||
|
407 | subrepository sources for s differ | |||
|
408 | use (l)ocal source (32a343883b74769118bb1d3b4b1fbf9156f4dddc) or (r)emote source (32a343883b74769118bb1d3b4b1fbf9156f4dddc)? | |||
|
409 | l | |||
|
410 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
411 | $ hg id -n | |||
|
412 | 7 | |||
|
413 | $ cd s | |||
|
414 | $ git rev-parse HEAD | |||
|
415 | aa84837ccfbdfedcdcdeeedc309d73e6eb069edc | |||
|
416 | $ cd .. | |||
|
417 | ||||
|
418 | Sticky repository, update --clean | |||
|
419 | $ hg update --clean tip | |||
|
420 | Previous HEAD position was aa84837... f | |||
|
421 | HEAD is now at 32a3438... fff | |||
|
422 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
423 | $ hg id -n | |||
|
424 | 7 | |||
|
425 | $ cd s | |||
|
426 | $ git rev-parse HEAD | |||
|
427 | 32a343883b74769118bb1d3b4b1fbf9156f4dddc | |||
|
428 | $ cd .. | |||
|
429 | ||||
|
430 | Test subrepo already at intended revision: | |||
|
431 | $ cd s | |||
|
432 | $ git checkout 32a343883b74769118bb1d3b4b1fbf9156f4dddc | |||
|
433 | HEAD is now at 32a3438... fff | |||
|
434 | $ cd .. | |||
|
435 | $ hg update 1 | |||
|
436 | Previous HEAD position was 32a3438... fff | |||
|
437 | HEAD is now at da5f5b1... g | |||
|
438 | 2 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
439 | $ hg id -n | |||
|
440 | 1 | |||
|
441 | $ cd s | |||
|
442 | $ git rev-parse HEAD | |||
|
443 | da5f5b1d8ffcf62fb8327bcd3c89a4367a6018e7 | |||
|
444 | $ cd .. | |||
|
445 |
@@ -296,3 +296,145 b' Check hg update --clean' | |||||
296 | ? * f2 (glob) |
|
296 | ? * f2 (glob) | |
297 |
|
297 | |||
298 | Performing status on external item at 'externals' |
|
298 | Performing status on external item at 'externals' | |
|
299 | ||||
|
300 | Sticky subrepositories, no changes | |||
|
301 | $ cd $TESTTMP/sub/t | |||
|
302 | $ hg id -n | |||
|
303 | 2 | |||
|
304 | $ cd s | |||
|
305 | $ svnversion | |||
|
306 | 3 | |||
|
307 | $ cd .. | |||
|
308 | $ hg update 1 | |||
|
309 | U $TESTTMP/sub/t/s/alpha | |||
|
310 | ||||
|
311 | Fetching external item into '$TESTTMP/sub/t/s/externals' | |||
|
312 | Checked out external at revision 1. | |||
|
313 | ||||
|
314 | Checked out revision 2. | |||
|
315 | 2 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
316 | $ hg id -n | |||
|
317 | 1 | |||
|
318 | $ cd s | |||
|
319 | $ svnversion | |||
|
320 | 2 | |||
|
321 | $ cd .. | |||
|
322 | ||||
|
323 | Sticky subrepositorys, file changes | |||
|
324 | $ touch s/f1 | |||
|
325 | $ cd s | |||
|
326 | $ svn add f1 | |||
|
327 | A f1 | |||
|
328 | $ cd .. | |||
|
329 | $ hg id -n | |||
|
330 | 1 | |||
|
331 | $ cd s | |||
|
332 | $ svnversion | |||
|
333 | 2M | |||
|
334 | $ cd .. | |||
|
335 | $ hg update tip | |||
|
336 | subrepository sources for s differ | |||
|
337 | use (l)ocal source (2) or (r)emote source (3)? | |||
|
338 | l | |||
|
339 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
340 | $ hg id -n | |||
|
341 | 2+ | |||
|
342 | $ cd s | |||
|
343 | $ svnversion | |||
|
344 | 2M | |||
|
345 | $ cd .. | |||
|
346 | $ hg update --clean tip | |||
|
347 | U $TESTTMP/sub/t/s/alpha | |||
|
348 | ||||
|
349 | Fetching external item into '$TESTTMP/sub/t/s/externals' | |||
|
350 | Checked out external at revision 1. | |||
|
351 | ||||
|
352 | Checked out revision 3. | |||
|
353 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
354 | ||||
|
355 | Sticky subrepository, revision updates | |||
|
356 | $ hg id -n | |||
|
357 | 2 | |||
|
358 | $ cd s | |||
|
359 | $ svnversion | |||
|
360 | 3 | |||
|
361 | $ cd .. | |||
|
362 | $ cd s | |||
|
363 | $ svn update -r 1 | |||
|
364 | U alpha | |||
|
365 | U . | |||
|
366 | ||||
|
367 | Fetching external item into 'externals' | |||
|
368 | Updated external to revision 1. | |||
|
369 | ||||
|
370 | Updated to revision 1. | |||
|
371 | $ cd .. | |||
|
372 | $ hg update 1 | |||
|
373 | subrepository sources for s differ (in checked out version) | |||
|
374 | use (l)ocal source (1) or (r)emote source (2)? | |||
|
375 | l | |||
|
376 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
377 | $ hg id -n | |||
|
378 | 1+ | |||
|
379 | $ cd s | |||
|
380 | $ svnversion | |||
|
381 | 1 | |||
|
382 | $ cd .. | |||
|
383 | ||||
|
384 | Sticky subrepository, file changes and revision updates | |||
|
385 | $ touch s/f1 | |||
|
386 | $ cd s | |||
|
387 | $ svn add f1 | |||
|
388 | A f1 | |||
|
389 | $ svnversion | |||
|
390 | 1M | |||
|
391 | $ cd .. | |||
|
392 | $ hg id -n | |||
|
393 | 1+ | |||
|
394 | $ hg update tip | |||
|
395 | subrepository sources for s differ | |||
|
396 | use (l)ocal source (1) or (r)emote source (3)? | |||
|
397 | l | |||
|
398 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
399 | $ hg id -n | |||
|
400 | 2 | |||
|
401 | $ cd s | |||
|
402 | $ svnversion | |||
|
403 | 1M | |||
|
404 | $ cd .. | |||
|
405 | ||||
|
406 | Sticky repository, update --clean | |||
|
407 | $ hg update --clean tip | |||
|
408 | U $TESTTMP/sub/t/s/alpha | |||
|
409 | U $TESTTMP/sub/t/s | |||
|
410 | ||||
|
411 | Fetching external item into '$TESTTMP/sub/t/s/externals' | |||
|
412 | Checked out external at revision 1. | |||
|
413 | ||||
|
414 | Checked out revision 3. | |||
|
415 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
416 | $ hg id -n | |||
|
417 | 2 | |||
|
418 | $ cd s | |||
|
419 | $ svnversion | |||
|
420 | 3 | |||
|
421 | $ cd .. | |||
|
422 | ||||
|
423 | Test subrepo already at intended revision: | |||
|
424 | $ cd s | |||
|
425 | $ svn update -r 2 | |||
|
426 | U alpha | |||
|
427 | ||||
|
428 | Fetching external item into 'externals' | |||
|
429 | Updated external to revision 1. | |||
|
430 | ||||
|
431 | Updated to revision 2. | |||
|
432 | $ cd .. | |||
|
433 | $ hg update 1 | |||
|
434 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
435 | $ hg id -n | |||
|
436 | 1+ | |||
|
437 | $ cd s | |||
|
438 | $ svnversion | |||
|
439 | 2 | |||
|
440 | $ cd .. |
@@ -706,3 +706,125 b' Check hg update --clean' | |||||
706 | $ hg status -S |
|
706 | $ hg status -S | |
707 | ? s/b |
|
707 | ? s/b | |
708 | ? s/c |
|
708 | ? s/c | |
|
709 | ||||
|
710 | Sticky subrepositories, no changes | |||
|
711 | $ cd $TESTTMP/sub/t | |||
|
712 | $ hg id | |||
|
713 | 925c17564ef8 tip | |||
|
714 | $ hg -R s id | |||
|
715 | 12a213df6fa9 tip | |||
|
716 | $ hg -R t id | |||
|
717 | 52c0adc0515a tip | |||
|
718 | $ hg update 11 | |||
|
719 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
720 | $ hg id | |||
|
721 | 365661e5936a | |||
|
722 | $ hg -R s id | |||
|
723 | fc627a69481f | |||
|
724 | $ hg -R t id | |||
|
725 | e95bcfa18a35 | |||
|
726 | ||||
|
727 | Sticky subrepositorys, file changes | |||
|
728 | $ touch s/f1 | |||
|
729 | $ touch t/f1 | |||
|
730 | $ hg add -S s/f1 | |||
|
731 | $ hg add -S t/f1 | |||
|
732 | $ hg id | |||
|
733 | 365661e5936a | |||
|
734 | $ hg -R s id | |||
|
735 | fc627a69481f+ | |||
|
736 | $ hg -R t id | |||
|
737 | e95bcfa18a35+ | |||
|
738 | $ hg update tip | |||
|
739 | subrepository sources for s differ | |||
|
740 | use (l)ocal source (fc627a69481f) or (r)emote source (12a213df6fa9)? | |||
|
741 | l | |||
|
742 | subrepository sources for t differ | |||
|
743 | use (l)ocal source (e95bcfa18a35) or (r)emote source (52c0adc0515a)? | |||
|
744 | l | |||
|
745 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
746 | $ hg id | |||
|
747 | 925c17564ef8+ tip | |||
|
748 | $ hg -R s id | |||
|
749 | fc627a69481f+ | |||
|
750 | $ hg -R t id | |||
|
751 | e95bcfa18a35+ | |||
|
752 | $ hg update --clean tip | |||
|
753 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
754 | ||||
|
755 | Sticky subrepository, revision updates | |||
|
756 | $ hg id | |||
|
757 | 925c17564ef8 tip | |||
|
758 | $ hg -R s id | |||
|
759 | 12a213df6fa9 tip | |||
|
760 | $ hg -R t id | |||
|
761 | 52c0adc0515a tip | |||
|
762 | $ cd s | |||
|
763 | $ hg update -r -2 | |||
|
764 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
765 | $ cd ../t | |||
|
766 | $ hg update -r 2 | |||
|
767 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
768 | $ cd .. | |||
|
769 | $ hg update 10 | |||
|
770 | subrepository sources for t differ (in checked out version) | |||
|
771 | use (l)ocal source (7af322bc1198) or (r)emote source (20a0db6fbf6c)? | |||
|
772 | l | |||
|
773 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
774 | $ hg id | |||
|
775 | e45c8b14af55+ | |||
|
776 | $ hg -R s id | |||
|
777 | 1c833a7a9e3a | |||
|
778 | $ hg -R t id | |||
|
779 | 7af322bc1198 | |||
|
780 | ||||
|
781 | Sticky subrepository, file changes and revision updates | |||
|
782 | $ touch s/f1 | |||
|
783 | $ touch t/f1 | |||
|
784 | $ hg add -S s/f1 | |||
|
785 | $ hg add -S t/f1 | |||
|
786 | $ hg id | |||
|
787 | e45c8b14af55+ | |||
|
788 | $ hg -R s id | |||
|
789 | 1c833a7a9e3a+ | |||
|
790 | $ hg -R t id | |||
|
791 | 7af322bc1198+ | |||
|
792 | $ hg update tip | |||
|
793 | subrepository sources for s differ | |||
|
794 | use (l)ocal source (1c833a7a9e3a) or (r)emote source (12a213df6fa9)? | |||
|
795 | l | |||
|
796 | subrepository sources for t differ | |||
|
797 | use (l)ocal source (7af322bc1198) or (r)emote source (52c0adc0515a)? | |||
|
798 | l | |||
|
799 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
800 | $ hg id | |||
|
801 | 925c17564ef8 tip | |||
|
802 | $ hg -R s id | |||
|
803 | 1c833a7a9e3a+ | |||
|
804 | $ hg -R t id | |||
|
805 | 7af322bc1198+ | |||
|
806 | ||||
|
807 | Sticky repository, update --clean | |||
|
808 | $ hg update --clean tip | |||
|
809 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
810 | $ hg id | |||
|
811 | 925c17564ef8 tip | |||
|
812 | $ hg -R s id | |||
|
813 | 12a213df6fa9 tip | |||
|
814 | $ hg -R t id | |||
|
815 | 52c0adc0515a tip | |||
|
816 | ||||
|
817 | Test subrepo already at intended revision: | |||
|
818 | $ cd s | |||
|
819 | $ hg update fc627a69481f | |||
|
820 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
821 | $ cd .. | |||
|
822 | $ hg update 11 | |||
|
823 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
824 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
825 | $ hg id -n | |||
|
826 | 11+ | |||
|
827 | $ hg -R s id | |||
|
828 | fc627a69481f | |||
|
829 | $ hg -R t id | |||
|
830 | e95bcfa18a35 |
General Comments 0
You need to be logged in to leave comments.
Login now