comparison tests/test-topic-tutorial.t @ 3003:ddf28837f5af mercurial-4.0

compat-test: merge future 6.7.0 into 4.0 compat branch (merging through 4.1 compat branch)
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Wed, 27 Sep 2017 01:18:39 +0200
parents 00e4d31b8cdb
children 50be10c63825
comparison
equal deleted inserted replaced
2810:604ddf1e1a8e 3003:ddf28837f5af
1 ============== 1 ==============
2 Topic Tutorial 2 Topic Tutorial
3 ============== 3 ==============
4 4
5 .. This test file is also supposed to be able to compile as a rest file. 5 This Mercurial configuration example is used for testing.
6 6
7 7 .. Various setup
8 .. Some Setup::
9 8
10 $ . "$TESTDIR/testlib/topic_setup.sh" 9 $ . "$TESTDIR/testlib/topic_setup.sh"
10 $ cat >> $HGRCPATH << EOF
11 > [experimental]
12 > evolution=all
13 > [extensions]
14 > evolve=
15 > EOF
16
11 $ hg init server 17 $ hg init server
18
12 $ cd server 19 $ cd server
20
13 $ cat >> .hg/hgrc << EOF 21 $ cat >> .hg/hgrc << EOF
14 > [ui] 22 > [ui]
15 > user= Shopping Master 23 > user= Shopping Master
16 > EOF 24 > EOF
25
17 $ cat >> shopping << EOF 26 $ cat >> shopping << EOF
18 > Spam 27 > Spam
19 > Whizzo butter 28 > Whizzo butter
20 > Albatross 29 > Albatross
21 > Rat (rather a lot) 30 > Rat (rather a lot)
22 > Jugged fish 31 > Jugged fish
23 > Blancmange 32 > Blancmange
24 > Salmon mousse 33 > Salmon mousse
25 > EOF 34 > EOF
35
26 $ hg commit -A -m "Shopping list" 36 $ hg commit -A -m "Shopping list"
27 adding shopping 37 adding shopping
38
28 $ cd .. 39 $ cd ..
29 $ hg clone server client 40 $ hg clone server client
30 updating to branch default 41 updating to branch default
31 1 files updated, 0 files merged, 0 files removed, 0 files unresolved 42 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
32 $ cd client 43 $ cd client
33 $ cat >> .hg/hgrc << EOF 44 $ cat >> .hg/hgrc << EOF
34 > [ui] 45 > [ui]
35 > user= Tutorial User 46 > user= Tutorial User
36 > EOF 47 > EOF
48 #if docgraph-ext
49 $ . "$TESTDIR/testlib/docgraph_setup.sh" #rest-ignore
50 #endif
37 51
38 Topic branches are lightweight branches which disappear when changes are 52 Topic branches are lightweight branches which disappear when changes are
39 finalized (move to the public phase). They can help users to organise and share 53 finalized (moved to the public phase). They can help users to organize and share
40 their unfinished work. 54 their unfinished work.
55
56 In this tutorial, we explain how to use topics for local development. In the first part,
57 there is a central *publishing* server. Anything pushed to the central server will become public and immutable This means no unfinished work should escapes the local repository.
58
41 59
42 Topic Basics 60 Topic Basics
43 ============ 61 ============
44 62
45 Let's say we use Mercurial to manage our shopping list:: 63 Let's say we use Mercurial to manage our shopping list:
46 64
47 $ hg log --graph 65 $ hg log --graph
48 @ changeset: 0:38da43f0a2ea 66 @ changeset: 0:38da43f0a2ea
49 tag: tip 67 tag: tip
50 user: test 68 user: test
51 date: Thu Jan 01 00:00:00 1970 +0000 69 date: Thu Jan 01 00:00:00 1970 +0000
52 summary: Shopping list 70 summary: Shopping list
53 71
72 #if docgraph-ext
73 $ hg docgraph -r "all()" --sphinx-directive --rankdir LR #rest-ignore
74 .. graphviz::
75
76 strict digraph {
77 graph [rankdir=LR,
78 splines=polyline
79 ];
80 node [label="\N"];
81 0 [fillcolor="#9999FF",
82 fixedsize=true,
83 group=default,
84 height=0.5,
85 label=0,
86 pin=true,
87 pos="1,0!",
88 shape=circle,
89 style=filled,
90 width=0.5];
91 }
92 #endif
54 93
55 We are about to make some additions to this list and would like to do them 94 We are about to make some additions to this list and would like to do them
56 within a topic. Creating a new topic is done using the ``topic`` command:: 95 within a topic. Creating a new topic is done using the ``topic`` command:
57 96
58 $ hg topic food 97 $ hg topics food
98 marked working directory as topic: food
59 99
60 Much like a named branch, our topic is active but it does not contain any 100 Much like a named branch, our topic is active but it does not contain any
61 changesets yet:: 101 changeset yet:
62 102
63 $ hg topic 103 $ hg topics
64 * food 104 * food
105
65 $ hg summary 106 $ hg summary
66 parent: 0:38da43f0a2ea tip 107 parent: 0:38da43f0a2ea tip
67 Shopping list 108 Shopping list
68 branch: default 109 branch: default
69 commit: (clean) 110 commit: (clean)
70 update: (current) 111 update: (current)
71 topic: food 112 topic: food
113
72 $ hg log --graph 114 $ hg log --graph
73 @ changeset: 0:38da43f0a2ea 115 @ changeset: 0:38da43f0a2ea
74 tag: tip 116 tag: tip
75 user: test 117 user: test
76 date: Thu Jan 01 00:00:00 1970 +0000 118 date: Thu Jan 01 00:00:00 1970 +0000
77 summary: Shopping list 119 summary: Shopping list
78 120
79 121
80 Our next commit will be part of the active topic:: 122 #if docgraph-ext
123 $ hg docgraph -r "all()" --sphinx-directive --rankdir LR #rest-ignore
124 .. graphviz::
125
126 strict digraph {
127 graph [rankdir=LR,
128 splines=polyline
129 ];
130 node [label="\N"];
131 0 [fillcolor="#9999FF",
132 fixedsize=true,
133 group=default,
134 height=0.5,
135 label=0,
136 pin=true,
137 pos="1,0!",
138 shape=circle,
139 style=filled,
140 width=0.5];
141 }
142 #endif
143
144 Our next commit will be part of the active topic:
81 145
82 $ cat >> shopping << EOF 146 $ cat >> shopping << EOF
83 > Egg 147 > Egg
84 > Suggar 148 > Suggar
85 > Vinegar 149 > Vinegar
86 > Oil 150 > Oil
87 > EOF 151 > EOF
152
88 $ hg commit -m "adding condiments" 153 $ hg commit -m "adding condiments"
154 active topic 'food' grew its first changeset
155
89 $ hg log --graph --rev 'topic("food")' 156 $ hg log --graph --rev 'topic("food")'
90 @ changeset: 1:13900241408b 157 @ changeset: 1:13900241408b
91 | tag: tip 158 | tag: tip
92 ~ topic: food 159 ~ topic: food
93 user: test 160 user: test
94 date: Thu Jan 01 00:00:00 1970 +0000 161 date: Thu Jan 01 00:00:00 1970 +0000
95 summary: adding condiments 162 summary: adding condiments
96 163
97 164
98 And future commits will be part of that topic too:: 165 #if docgraph-ext
166 $ hg docgraph -r "topic("food")" --sphinx-directive --rankdir LR #rest-ignore
167 .. graphviz::
168
169 strict digraph {
170 graph [rankdir=LR,
171 splines=polyline
172 ];
173 node [label="\N"];
174 1 [fillcolor="#9999FF",
175 fixedsize=true,
176 group=default,
177 height=0.5,
178 label=1,
179 pin=true,
180 pos="1,1!",
181 shape=pentagon,
182 style=filled,
183 width=0.5];
184 }
185 #endif
186
187 And future commits will be part of that topic too:
99 188
100 $ cat >> shopping << EOF 189 $ cat >> shopping << EOF
101 > Bananas 190 > Bananas
102 > Pear 191 > Pear
103 > Apple 192 > Apple
104 > EOF 193 > EOF
194
105 $ hg commit -m "adding fruits" 195 $ hg commit -m "adding fruits"
196
106 $ hg log --graph --rev 'topic("food")' 197 $ hg log --graph --rev 'topic("food")'
107 @ changeset: 2:287de11b401f 198 @ changeset: 2:287de11b401f
108 | tag: tip 199 | tag: tip
109 | topic: food 200 | topic: food
110 | user: test 201 | user: test
116 ~ user: test 207 ~ user: test
117 date: Thu Jan 01 00:00:00 1970 +0000 208 date: Thu Jan 01 00:00:00 1970 +0000
118 summary: adding condiments 209 summary: adding condiments
119 210
120 211
212 #if docgraph-ext
213 $ hg docgraph -r "topic("food")" --sphinx-directive --rankdir LR #rest-ignore
214 .. graphviz::
215
216 strict digraph {
217 graph [rankdir=LR,
218 splines=polyline
219 ];
220 node [label="\N"];
221 1 [fillcolor="#9999FF",
222 fixedsize=true,
223 group=default,
224 height=0.5,
225 label=1,
226 pin=true,
227 pos="1,1!",
228 shape=pentagon,
229 style=filled,
230 width=0.5];
231 2 [fillcolor="#9999FF",
232 fixedsize=true,
233 group=default,
234 height=0.5,
235 label=2,
236 pin=true,
237 pos="1,2!",
238 shape=pentagon,
239 style=filled,
240 width=0.5];
241 1 -> 2 [arrowhead=none,
242 penwidth=2.0];
243 }
244 #endif
245
121 We can get a compact view of the content of our topic using the ``stack`` 246 We can get a compact view of the content of our topic using the ``stack``
122 command:: 247 command:
123 248
124 $ hg stack 249 $ hg stack
125 ### topic: food 250 ### topic: food
126 ### branch: default 251 ### target: default (branch)
127 t2@ adding fruits (current) 252 t2@ adding fruits (current)
128 t1: adding condiments 253 t1: adding condiments
129 t0^ Shopping list (base) 254 t0^ Shopping list (base)
130 255
131 The topic deactivates when we update away from it:: 256 The topic deactivates when we update away from it:
132 257
133 $ hg up default 258 $ hg update default
134 1 files updated, 0 files merged, 0 files removed, 0 files unresolved 259 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
135 $ hg topic 260
261 $ hg topics
136 food 262 food
137 263
138 Note that ``default`` (name of the branch) now refers to the tipmost 264 Note that ``default`` (name of the branch) now refers to the tipmost
139 changeset of default without a topic:: 265 changeset of default without a topic:
140 266
141 $ hg log --graph 267 $ hg log --graph
142 o changeset: 2:287de11b401f 268 o changeset: 2:287de11b401f
143 | tag: tip 269 | tag: tip
144 | topic: food 270 | topic: food
156 user: test 282 user: test
157 date: Thu Jan 01 00:00:00 1970 +0000 283 date: Thu Jan 01 00:00:00 1970 +0000
158 summary: Shopping list 284 summary: Shopping list
159 285
160 286
161 And updating back to the topic reactivates it:: 287 #if docgraph-ext
162 288 $ hg docgraph -r "all()" --sphinx-directive --rankdir LR #rest-ignore
163 $ hg up food 289 .. graphviz::
290
291 strict digraph {
292 graph [rankdir=LR,
293 splines=polyline
294 ];
295 node [label="\N"];
296 0 [fillcolor="#9999FF",
297 fixedsize=true,
298 group=default,
299 height=0.5,
300 label=0,
301 pin=true,
302 pos="1,0!",
303 shape=circle,
304 style=filled,
305 width=0.5];
306 1 [fillcolor="#9999FF",
307 fixedsize=true,
308 group=default,
309 height=0.5,
310 label=1,
311 pin=true,
312 pos="1,1!",
313 shape=pentagon,
314 style=filled,
315 width=0.5];
316 0 -> 1 [arrowhead=none,
317 penwidth=2.0];
318 2 [fillcolor="#9999FF",
319 fixedsize=true,
320 group=default,
321 height=0.5,
322 label=2,
323 pin=true,
324 pos="1,2!",
325 shape=pentagon,
326 style=filled,
327 width=0.5];
328 1 -> 2 [arrowhead=none,
329 penwidth=2.0];
330 }
331 #endif
332 And updating back to the topic reactivates it:
333
334 $ hg update food
164 switching to topic food 335 switching to topic food
165 1 files updated, 0 files merged, 0 files removed, 0 files unresolved 336 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
166 $ hg topic 337
338 $ hg topics
167 * food 339 * food
168 340
169 Updating to any changeset that is part of a topic activates the topic 341 Updating to any changeset that is part of a topic activates the topic
170 regardless of how the revision was specified:: 342 regardless of how the revision was specified:
171 343
172 $ hg up default 344 $ hg update default
173 1 files updated, 0 files merged, 0 files removed, 0 files unresolved 345 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
174 $ hg up --rev 'desc("condiments")' 346
347 $ hg update --rev 'desc("condiments")'
175 switching to topic food 348 switching to topic food
176 1 files updated, 0 files merged, 0 files removed, 0 files unresolved 349 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
177 $ hg topic 350
351 $ hg topics
178 * food 352 * food
179 353
180 .. server side activity:: 354 .. Server side activity:
181 355
182 $ cd ../server/ 356 $ cd ../server/
183 $ cat > shopping << EOF 357 $ cat > shopping << EOF
184 > T-Shirt 358 > T-Shirt
185 > Trousers 359 > Trousers
189 > Rat (rather a lot) 363 > Rat (rather a lot)
190 > Jugged fish 364 > Jugged fish
191 > Blancmange 365 > Blancmange
192 > Salmon mousse 366 > Salmon mousse
193 > EOF 367 > EOF
368
194 $ hg commit -A -m "Adding clothes" 369 $ hg commit -A -m "Adding clothes"
370
195 $ cd ../client 371 $ cd ../client
196 372
197 The topic will also affect the rebase and the merge destinations. Let's pull 373 The topic will also affect the rebase and the merge destinations. Let's pull
198 the latest update from the main server:: 374 the latest update from the main server:
199 375
200 $ hg pull 376 $ hg pull
201 pulling from $TESTTMP/server (glob) 377 pulling from $TESTTMP/server (glob)
202 searching for changes 378 searching for changes
203 adding changesets 379 adding changesets
204 adding manifests 380 adding manifests
205 adding file changes 381 adding file changes
206 added 1 changesets with 1 changes to 1 files (+1 heads) 382 added 1 changesets with 1 changes to 1 files (+1 heads)
207 (run 'hg heads' to see heads) 383 (run 'hg heads' to see heads)
384
208 $ hg log -G 385 $ hg log -G
209 o changeset: 3:6104862e8b84 386 o changeset: 3:6104862e8b84
210 | tag: tip 387 | tag: tip
211 | parent: 0:38da43f0a2ea 388 | parent: 0:38da43f0a2ea
212 | user: test 389 | user: test
228 o changeset: 0:38da43f0a2ea 405 o changeset: 0:38da43f0a2ea
229 user: test 406 user: test
230 date: Thu Jan 01 00:00:00 1970 +0000 407 date: Thu Jan 01 00:00:00 1970 +0000
231 summary: Shopping list 408 summary: Shopping list
232 409
410 #if docgraph-ext
411 $ hg docgraph -r "all()" --sphinx-directive --rankdir LR #rest-ignore
412 .. graphviz::
413
414 strict digraph {
415 graph [rankdir=LR,
416 splines=polyline
417 ];
418 node [label="\N"];
419 0 [fillcolor="#9999FF",
420 fixedsize=true,
421 group=default,
422 height=0.5,
423 label=0,
424 pin=true,
425 pos="1,0!",
426 shape=circle,
427 style=filled,
428 width=0.5];
429 1 [fillcolor="#9999FF",
430 fixedsize=true,
431 group=default,
432 height=0.5,
433 label=1,
434 pin=true,
435 pos="1,1!",
436 shape=pentagon,
437 style=filled,
438 width=0.5];
439 0 -> 1 [arrowhead=none,
440 penwidth=2.0];
441 3 [fillcolor="#9999FF",
442 fixedsize=true,
443 group=default,
444 height=0.5,
445 label=3,
446 pin=true,
447 pos="1,3!",
448 shape=circle,
449 style=filled,
450 width=0.5];
451 0 -> 3 [arrowhead=none,
452 penwidth=2.0];
453 2 [fillcolor="#9999FF",
454 fixedsize=true,
455 group=default,
456 height=0.5,
457 label=2,
458 pin=true,
459 pos="1,2!",
460 shape=pentagon,
461 style=filled,
462 width=0.5];
463 1 -> 2 [arrowhead=none,
464 penwidth=2.0];
465 }
466 #endif
233 467
234 The topic head will not be considered when merging from the new head of the 468 The topic head will not be considered when merging from the new head of the
235 branch:: 469 branch:
236 470
237 $ hg up default 471 $ hg update default
238 1 files updated, 0 files merged, 0 files removed, 0 files unresolved 472 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
473
239 $ hg merge 474 $ hg merge
240 abort: branch 'default' has one head - please merge with an explicit rev 475 abort: branch 'default' has one head - please merge with an explicit rev
241 (run 'hg heads' to see all heads) 476 (run 'hg heads' to see all heads)
242 [255] 477 [255]
243 478
244 But the topic will see that branch head as a valid destination:: 479 But the topic will see that branch head as a valid destination:
245 480
246 $ hg up food 481 $ hg update food
247 switching to topic food 482 switching to topic food
248 1 files updated, 0 files merged, 0 files removed, 0 files unresolved 483 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
484
249 $ hg rebase 485 $ hg rebase
250 rebasing 1:13900241408b "adding condiments" 486 rebasing 1:13900241408b "adding condiments"
251 merging shopping 487 merging shopping
252 switching to topic food 488 switching to topic food
253 rebasing 2:287de11b401f "adding fruits" 489 rebasing 2:287de11b401f "adding fruits"
254 merging shopping 490 merging shopping
491
255 $ hg log --graph 492 $ hg log --graph
256 @ changeset: 5:2d50db8b5b4c 493 @ changeset: 5:2d50db8b5b4c
257 | tag: tip 494 | tag: tip
258 | topic: food 495 | topic: food
259 | user: test 496 | user: test
275 o changeset: 0:38da43f0a2ea 512 o changeset: 0:38da43f0a2ea
276 user: test 513 user: test
277 date: Thu Jan 01 00:00:00 1970 +0000 514 date: Thu Jan 01 00:00:00 1970 +0000
278 summary: Shopping list 515 summary: Shopping list
279 516
280 517 #if docgraph-ext
281 The topic information will disappear when we publish the changesets:: 518 $ hg docgraph -r "all()" --sphinx-directive --rankdir LR #rest-ignore
282 519 .. graphviz::
283 $ hg topic 520
521 strict digraph {
522 graph [rankdir=LR,
523 splines=polyline
524 ];
525 node [label="\N"];
526 0 [fillcolor="#9999FF",
527 fixedsize=true,
528 group=default,
529 height=0.5,
530 label=0,
531 pin=true,
532 pos="1,0!",
533 shape=circle,
534 style=filled,
535 width=0.5];
536 3 [fillcolor="#9999FF",
537 fixedsize=true,
538 group=default,
539 height=0.5,
540 label=3,
541 pin=true,
542 pos="1,3!",
543 shape=circle,
544 style=filled,
545 width=0.5];
546 0 -> 3 [arrowhead=none,
547 penwidth=2.0];
548 4 [fillcolor="#9999FF",
549 fixedsize=true,
550 group=default,
551 height=0.5,
552 label=4,
553 pin=true,
554 pos="1,4!",
555 shape=pentagon,
556 style=filled,
557 width=0.5];
558 3 -> 4 [arrowhead=none,
559 penwidth=2.0];
560 5 [fillcolor="#9999FF",
561 fixedsize=true,
562 group=default,
563 height=0.5,
564 label=5,
565 pin=true,
566 pos="1,5!",
567 shape=pentagon,
568 style=filled,
569 width=0.5];
570 4 -> 5 [arrowhead=none,
571 penwidth=2.0];
572 }
573 #endif
574
575 The topic information will disappear when we publish the changesets:
576
577 $ hg topics
284 * food 578 * food
579
285 $ hg push 580 $ hg push
286 pushing to $TESTTMP/server (glob) 581 pushing to $TESTTMP/server (glob)
287 searching for changes 582 searching for changes
288 adding changesets 583 adding changesets
289 adding manifests 584 adding manifests
290 adding file changes 585 adding file changes
291 added 2 changesets with 2 changes to 1 files 586 added 2 changesets with 2 changes to 1 files
292 2 new obsolescence markers 587 2 new obsolescence markers
293 $ hg topic 588 active topic 'food' is now empty
589
590 $ hg topics
294 * food 591 * food
592
593 The topic still exists, and any new commit will be in the topic. But
594 note that it is now devoid of any commit.
595
596 $ hg topics --list
597 ### topic: food
598 ### target: default (branch)
599 (stack is empty)
600 t0^ adding fruits (base)
601
295 $ hg log --graph 602 $ hg log --graph
296 @ changeset: 5:2d50db8b5b4c 603 @ changeset: 5:2d50db8b5b4c
297 | tag: tip 604 | tag: tip
298 | user: test 605 | user: test
299 | date: Thu Jan 01 00:00:00 1970 +0000 606 | date: Thu Jan 01 00:00:00 1970 +0000
313 o changeset: 0:38da43f0a2ea 620 o changeset: 0:38da43f0a2ea
314 user: test 621 user: test
315 date: Thu Jan 01 00:00:00 1970 +0000 622 date: Thu Jan 01 00:00:00 1970 +0000
316 summary: Shopping list 623 summary: Shopping list
317 624
318 $ hg up default 625 #if docgraph-ext
626 $ hg docgraph -r "all()" --sphinx-directive --rankdir LR #rest-ignore
627 .. graphviz::
628
629 strict digraph {
630 graph [rankdir=LR,
631 splines=polyline
632 ];
633 node [label="\N"];
634 0 [fillcolor="#9999FF",
635 fixedsize=true,
636 group=default,
637 height=0.5,
638 label=0,
639 pin=true,
640 pos="1,0!",
641 shape=circle,
642 style=filled,
643 width=0.5];
644 3 [fillcolor="#9999FF",
645 fixedsize=true,
646 group=default,
647 height=0.5,
648 label=3,
649 pin=true,
650 pos="1,3!",
651 shape=circle,
652 style=filled,
653 width=0.5];
654 0 -> 3 [arrowhead=none,
655 penwidth=2.0];
656 4 [fillcolor="#9999FF",
657 fixedsize=true,
658 group=default,
659 height=0.5,
660 label=4,
661 pin=true,
662 pos="1,4!",
663 shape=circle,
664 style=filled,
665 width=0.5];
666 3 -> 4 [arrowhead=none,
667 penwidth=2.0];
668 5 [fillcolor="#9999FF",
669 fixedsize=true,
670 group=default,
671 height=0.5,
672 label=5,
673 pin=true,
674 pos="1,5!",
675 shape=circle,
676 style=filled,
677 width=0.5];
678 4 -> 5 [arrowhead=none,
679 penwidth=2.0];
680 }
681 #endif
682
683 If we update to the *default* head, we will leave the topic behind,
684 and since it is commit-less, it will vanish.
685
686 $ hg update default
687 clearing empty topic "food"
319 0 files updated, 0 files merged, 0 files removed, 0 files unresolved 688 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
689
690 From there, the topic has been completely forgotten.
691
692 $ hg topics
693
694
695 Keep working within topics
696 ==========================
697
698 Making sure all your new local commit are made within a topic will help your
699 organise your work. It is possible to ensure this through the Mercurial
700 configuration.
701
702 For this tutorial, we'll add the config at the repository level:
703
704 $ cat << EOF >> .hg/hgrc
705 > [experimental]
706 > enforce-topic = yes
707 > EOF
708
709 You can also use `hg config --edit` to update your mercurial configuration.
710
711
712 Once enforcement is turned on. New local commit will be denied if no topic is active.
713
714 $ echo sickle >> shopping
715 $ hg commit -m 'Adding sickle'
716 abort: no active topic
717 (set a current topic or use '--config experimental.enforce-topic=no' to commit without a topic)
718 [255]
719
720 Ok, let's clean this up and delve into multiple topics.
721
722 $ hg revert .
723 reverting shopping
724
320 725
321 Working with Multiple Topics 726 Working with Multiple Topics
322 ============================ 727 ============================
323 728
324 In the above example, topics do not bring much benefit since you only have one 729 In the above example, topics do not bring much benefits since you only have one
325 line of development. Topics start to be more useful when you have to work on 730 line of development. Topics start to be more useful when you have to work on
326 multiple features at the same time. 731 multiple features at the same time.
327 732
328 We might go shopping in a hardware store in the same go, so let's add some 733 We might go shopping in a hardware store in the same go, so let's add some
329 tools to the shopping list within a new topic:: 734 tools to the shopping list within a new topic:
330 735
331 $ hg topic tools 736 $ hg topics tools
737 marked working directory as topic: tools
332 $ echo hammer >> shopping 738 $ echo hammer >> shopping
333 $ hg ci -m 'Adding hammer' 739 $ hg commit -m 'Adding hammer'
740 active topic 'tools' grew its first changeset
741
334 $ echo saw >> shopping 742 $ echo saw >> shopping
335 $ hg ci -m 'Adding saw' 743 $ hg commit -m 'Adding saw'
744
336 $ echo drill >> shopping 745 $ echo drill >> shopping
337 $ hg ci -m 'Adding drill' 746 $ hg commit -m 'Adding drill'
338 747
339 But we are not sure we will actually go to the hardware store, so in the 748 But we are not sure we will actually go to the hardware store, so in the
340 meantime, we want to extend the list with drinks. We go back to the official 749 meantime, we want to extend the list with drinks. We go back to the official
341 default branch and start a new topic:: 750 default branch and start a new topic:
342 751
343 $ hg up default 752 $ hg update default
344 1 files updated, 0 files merged, 0 files removed, 0 files unresolved 753 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
345 $ hg topic drinks 754
755 $ hg topics drinks
756 marked working directory as topic: drinks
346 $ echo 'apple juice' >> shopping 757 $ echo 'apple juice' >> shopping
347 $ hg ci -m 'Adding apple juice' 758 $ hg commit -m 'Adding apple juice'
759 active topic 'drinks' grew its first changeset
760
348 $ echo 'orange juice' >> shopping 761 $ echo 'orange juice' >> shopping
349 $ hg ci -m 'Adding orange juice' 762 $ hg commit -m 'Adding orange juice'
350 763
351 We now have two topics:: 764 We now have two topics:
352 765
353 $ hg topic 766 $ hg topics
354 * drinks 767 * drinks
355 tools 768 tools
356 769
357 The information displayed by ``hg stack`` adapts to the active topic:: 770 The information displayed by ``hg stack`` adapts to the active topic:
358 771
359 $ hg stack 772 $ hg stack
360 ### topic: drinks 773 ### topic: drinks
361 ### branch: default 774 ### target: default (branch)
362 t2@ Adding orange juice (current) 775 t2@ Adding orange juice (current)
363 t1: Adding apple juice 776 t1: Adding apple juice
364 t0^ adding fruits (base) 777 t0^ adding fruits (base)
365 $ hg up tools 778
779 $ hg update tools
366 switching to topic tools 780 switching to topic tools
367 1 files updated, 0 files merged, 0 files removed, 0 files unresolved 781 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
782
368 $ hg stack 783 $ hg stack
369 ### topic: tools 784 ### topic: tools
370 ### branch: default 785 ### target: default (branch)
371 t3@ Adding drill (current) 786 t3@ Adding drill (current)
372 t2: Adding saw 787 t2: Adding saw
373 t1: Adding hammer 788 t1: Adding hammer
374 t0^ adding fruits (base) 789 t0^ adding fruits (base)
375 790
376 They are seen as independent branches by Mercurial. No rebase or merge 791 They are seen as independent branches by Mercurial. No rebase or merge
377 between them will be attempted by default:: 792 between them will be attempted by default:
378 793
379 $ hg rebase 794 $ hg rebase
380 nothing to rebase 795 nothing to rebase
381 [1] 796 [1]
382 797
383 .. server activity:: 798 We simulate independant contributions to the repo with this
799 activity:
384 800
385 $ cd ../server 801 $ cd ../server
386 $ hg up 802 $ hg update
387 1 files updated, 0 files merged, 0 files removed, 0 files unresolved 803 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
388 $ mv shopping foo 804 $ mv shopping foo
389 $ echo 'Coat' > shopping 805 $ echo 'Coat' > shopping
390 $ cat foo >> shopping 806 $ cat foo >> shopping
391 $ hg ci -m 'add a coat' 807 $ hg commit -m 'add a coat'
392 $ echo 'Coat' > shopping 808 $ echo 'Coat' > shopping
393 $ echo 'Shoes' >> shopping 809 $ echo 'Shoes' >> shopping
394 $ cat foo >> shopping 810 $ cat foo >> shopping
395 $ rm foo 811 $ rm foo
396 $ hg ci -m 'add a pair of shoes' 812 $ hg commit -m 'add a pair of shoes'
397 $ cd ../client 813 $ cd ../client
398 814
399 Let's see what other people did in the meantime:: 815 Let's discover what other people did contribute:
400 816
401 $ hg pull 817 $ hg pull
402 pulling from $TESTTMP/server (glob) 818 pulling from $TESTTMP/server (glob)
403 searching for changes 819 searching for changes
404 adding changesets 820 adding changesets
406 adding file changes 822 adding file changes
407 added 2 changesets with 2 changes to 1 files (+1 heads) 823 added 2 changesets with 2 changes to 1 files (+1 heads)
408 (run 'hg heads' to see heads) 824 (run 'hg heads' to see heads)
409 825
410 There are new changes! We can simply use ``hg rebase`` to update our 826 There are new changes! We can simply use ``hg rebase`` to update our
411 changeset on top of the latest:: 827 changeset on top of the latest:
828
829 $ hg log -G
830 o changeset: 12:fbff9bc37a43
831 | tag: tip
832 | user: test
833 | date: Thu Jan 01 00:00:00 1970 +0000
834 | summary: add a pair of shoes
835 |
836 o changeset: 11:f2d6cacc6115
837 | parent: 5:2d50db8b5b4c
838 | user: test
839 | date: Thu Jan 01 00:00:00 1970 +0000
840 | summary: add a coat
841 |
842 | o changeset: 10:70dfa201ed73
843 | | topic: drinks
844 | | user: test
845 | | date: Thu Jan 01 00:00:00 1970 +0000
846 | | summary: Adding orange juice
847 | |
848 | o changeset: 9:8dfa45bd5e0c
849 |/ topic: drinks
850 | parent: 5:2d50db8b5b4c
851 | user: test
852 | date: Thu Jan 01 00:00:00 1970 +0000
853 | summary: Adding apple juice
854 |
855 | @ changeset: 8:34255b455dac
856 | | topic: tools
857 | | user: test
858 | | date: Thu Jan 01 00:00:00 1970 +0000
859 | | summary: Adding drill
860 | |
861 | o changeset: 7:cffff85af537
862 | | topic: tools
863 | | user: test
864 | | date: Thu Jan 01 00:00:00 1970 +0000
865 | | summary: Adding saw
866 | |
867 | o changeset: 6:183984ef46d1
868 |/ topic: tools
869 | user: test
870 | date: Thu Jan 01 00:00:00 1970 +0000
871 | summary: Adding hammer
872 |
873 o changeset: 5:2d50db8b5b4c
874 | user: test
875 | date: Thu Jan 01 00:00:00 1970 +0000
876 | summary: adding fruits
877 |
878 o changeset: 4:4011b46eeb33
879 | user: test
880 | date: Thu Jan 01 00:00:00 1970 +0000
881 | summary: adding condiments
882 |
883 o changeset: 3:6104862e8b84
884 | parent: 0:38da43f0a2ea
885 | user: test
886 | date: Thu Jan 01 00:00:00 1970 +0000
887 | summary: Adding clothes
888 |
889 o changeset: 0:38da43f0a2ea
890 user: test
891 date: Thu Jan 01 00:00:00 1970 +0000
892 summary: Shopping list
893
894 #if docgraph-ext
895 $ hg docgraph -r "all()" --sphinx-directive --rankdir LR #rest-ignore
896 .. graphviz::
897
898 strict digraph {
899 graph [rankdir=LR,
900 splines=polyline
901 ];
902 node [label="\N"];
903 0 [fillcolor="#9999FF",
904 fixedsize=true,
905 group=default,
906 height=0.5,
907 label=0,
908 pin=true,
909 pos="1,0!",
910 shape=circle,
911 style=filled,
912 width=0.5];
913 3 [fillcolor="#9999FF",
914 fixedsize=true,
915 group=default,
916 height=0.5,
917 label=3,
918 pin=true,
919 pos="1,3!",
920 shape=circle,
921 style=filled,
922 width=0.5];
923 0 -> 3 [arrowhead=none,
924 penwidth=2.0];
925 4 [fillcolor="#9999FF",
926 fixedsize=true,
927 group=default,
928 height=0.5,
929 label=4,
930 pin=true,
931 pos="1,4!",
932 shape=circle,
933 style=filled,
934 width=0.5];
935 3 -> 4 [arrowhead=none,
936 penwidth=2.0];
937 5 [fillcolor="#9999FF",
938 fixedsize=true,
939 group=default,
940 height=0.5,
941 label=5,
942 pin=true,
943 pos="1,5!",
944 shape=circle,
945 style=filled,
946 width=0.5];
947 4 -> 5 [arrowhead=none,
948 penwidth=2.0];
949 6 [fillcolor="#9999FF",
950 fixedsize=true,
951 group=default,
952 height=0.5,
953 label=6,
954 pin=true,
955 pos="1,6!",
956 shape=pentagon,
957 style=filled,
958 width=0.5];
959 5 -> 6 [arrowhead=none,
960 penwidth=2.0];
961 9 [fillcolor="#9999FF",
962 fixedsize=true,
963 group=default,
964 height=0.5,
965 label=9,
966 pin=true,
967 pos="1,9!",
968 shape=pentagon,
969 style=filled,
970 width=0.5];
971 5 -> 9 [arrowhead=none,
972 penwidth=2.0];
973 11 [fillcolor="#9999FF",
974 fixedsize=true,
975 group=default,
976 height=0.5,
977 label=11,
978 pin=true,
979 pos="1,11!",
980 shape=circle,
981 style=filled,
982 width=0.5];
983 5 -> 11 [arrowhead=none,
984 penwidth=2.0];
985 7 [fillcolor="#9999FF",
986 fixedsize=true,
987 group=default,
988 height=0.5,
989 label=7,
990 pin=true,
991 pos="1,7!",
992 shape=pentagon,
993 style=filled,
994 width=0.5];
995 6 -> 7 [arrowhead=none,
996 penwidth=2.0];
997 8 [fillcolor="#9999FF",
998 fixedsize=true,
999 group=default,
1000 height=0.5,
1001 label=8,
1002 pin=true,
1003 pos="1,8!",
1004 shape=pentagon,
1005 style=filled,
1006 width=0.5];
1007 7 -> 8 [arrowhead=none,
1008 penwidth=2.0];
1009 10 [fillcolor="#9999FF",
1010 fixedsize=true,
1011 group=default,
1012 height=0.5,
1013 label=10,
1014 pin=true,
1015 pos="1,10!",
1016 shape=pentagon,
1017 style=filled,
1018 width=0.5];
1019 9 -> 10 [arrowhead=none,
1020 penwidth=2.0];
1021 12 [fillcolor="#9999FF",
1022 fixedsize=true,
1023 group=default,
1024 height=0.5,
1025 label=12,
1026 pin=true,
1027 pos="1,12!",
1028 shape=circle,
1029 style=filled,
1030 width=0.5];
1031 11 -> 12 [arrowhead=none,
1032 penwidth=2.0];
1033 }
1034 #endif
412 1035
413 $ hg rebase 1036 $ hg rebase
414 rebasing 6:183984ef46d1 "Adding hammer" 1037 rebasing 6:183984ef46d1 "Adding hammer"
415 merging shopping 1038 merging shopping
416 switching to topic tools 1039 switching to topic tools
417 rebasing 7:cffff85af537 "Adding saw" 1040 rebasing 7:cffff85af537 "Adding saw"
418 merging shopping 1041 merging shopping
419 rebasing 8:34255b455dac "Adding drill" 1042 rebasing 8:34255b455dac "Adding drill"
420 merging shopping 1043 merging shopping
421 1044
422 But what about the other topic? You can use 'hg topic --verbose' to see 1045 But what about the other topic? You can use 'hg topics --verbose' to see
423 information about all the topics:: 1046 information about all the topics:
424 1047
425 $ hg topic --verbose 1048 $ hg topics --verbose
426 drinks (on branch: default, 2 changesets, 2 behind) 1049 drinks (on branch: default, 2 changesets, 2 behind)
427 * tools (on branch: default, 3 changesets) 1050 * tools (on branch: default, 3 changesets)
428 1051
429 The "2 behind" is telling you that there are 2 new changesets on the named 1052 The "2 behind" is telling you that there are 2 new changesets over the base of the topic.
430 branch of the topic. You need to merge or rebase to incorporate them. 1053
431 1054 Pushing that topic would create a new head, and therefore will be prevented:
432 Pushing that topic would create a new head, and therefore will be prevented::
433 1055
434 $ hg push --rev drinks 1056 $ hg push --rev drinks
435 pushing to $TESTTMP/server (glob) 1057 pushing to $TESTTMP/server (glob)
436 searching for changes 1058 searching for changes
437 abort: push creates new remote head 70dfa201ed73! 1059 abort: push creates new remote head 70dfa201ed73!
438 (merge or see 'hg help push' for details about pushing new heads) 1060 (merge or see 'hg help push' for details about pushing new heads)
439 [255] 1061 [255]
440 1062
441 1063
442 Even after a rebase, pushing all active topics at the same time will complain 1064 Even after a rebase, pushing all active topics at the same time would publish
443 about the multiple heads it would create on that branch:: 1065 them to the default branch, and then mercurial would complain about the
1066 multiple *public* heads it would create on that branch:
444 1067
445 $ hg rebase -b drinks 1068 $ hg rebase -b drinks
446 rebasing 9:8dfa45bd5e0c "Adding apple juice" 1069 rebasing 9:8dfa45bd5e0c "Adding apple juice"
447 merging shopping 1070 merging shopping
448 switching to topic drinks 1071 switching to topic drinks
449 rebasing 10:70dfa201ed73 "Adding orange juice" 1072 rebasing 10:70dfa201ed73 "Adding orange juice"
450 merging shopping 1073 merging shopping
451 switching to topic tools 1074 switching to topic tools
1075
452 $ hg push 1076 $ hg push
453 pushing to $TESTTMP/server (glob) 1077 pushing to $TESTTMP/server (glob)
454 searching for changes 1078 searching for changes
455 abort: push creates new remote head 4cd7c1591a67! 1079 abort: push creates new remote head 4cd7c1591a67!
456 (merge or see 'hg help push' for details about pushing new heads) 1080 (merge or see 'hg help push' for details about pushing new heads)
457 [255] 1081 [255]
458 1082
459 Publishing only one of them is allowed (as long as it does not create a new 1083 Publishing only one of them is allowed (as long as it does not create a new
460 branch head as we just saw in the previous case):: 1084 branch head as we just saw in the previous case):
461 1085
462 $ hg push -r drinks 1086 $ hg push -r drinks
463 pushing to $TESTTMP/server (glob) 1087 pushing to $TESTTMP/server (glob)
464 searching for changes 1088 searching for changes
465 adding changesets 1089 adding changesets
467 adding file changes 1091 adding file changes
468 added 2 changesets with 2 changes to 1 files 1092 added 2 changesets with 2 changes to 1 files
469 2 new obsolescence markers 1093 2 new obsolescence markers
470 1094
471 The published topic has now disappeared, and the other is now marked as 1095 The published topic has now disappeared, and the other is now marked as
472 "behind":: 1096 "behind":
473 1097
474 $ hg topic --verbose 1098 $ hg topics --verbose
475 * tools (on branch: default, 3 changesets, 2 behind) 1099 * tools (on branch: default, 3 changesets, 2 behind)
1100
476 $ hg stack 1101 $ hg stack
477 ### topic: tools 1102 ### topic: tools
478 ### branch: default, 2 behind 1103 ### target: default (branch), 2 behind
479 t3@ Adding drill (current) 1104 t3@ Adding drill (current)
480 t2: Adding saw 1105 t2: Adding saw
481 t1: Adding hammer 1106 t1: Adding hammer
482 t0^ add a pair of shoes (base) 1107 t0^ add a pair of shoes (base)
483 1108
1109 Working Within Your Stack
1110 ===========================
1111
1112 Navigating within your stack
1113 ----------------------------
1114
1115 As we saw before `stack` displays changesets on your current topic in a clean way:
1116
1117 $ hg topics --verbose
1118 * tools (on branch: default, 3 changesets, 2 behind)
1119
1120 $ hg stack
1121 ### topic: tools
1122 ### target: default (branch), 2 behind
1123 t3@ Adding drill (current)
1124 t2: Adding saw
1125 t1: Adding hammer
1126 t0^ add a pair of shoes (base)
1127
1128 You can navigate in your current stack with `previous` and `next`.
1129
1130 `previous` will bring you back to the parent of the topic head.
1131
1132 $ hg previous
1133 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1134 [14] Adding saw
1135
1136 $ hg stack
1137 ### topic: tools
1138 ### target: default (branch), 2 behind
1139 t3: Adding drill
1140 t2@ Adding saw (current)
1141 t1: Adding hammer
1142 t0^ add a pair of shoes (base)
1143
1144 `next` will move you forward to the topic head.
1145
1146 $ hg next
1147 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1148 [15] Adding drill
1149
1150 $ hg stack
1151 ### topic: tools
1152 ### target: default (branch), 2 behind
1153 t3@ Adding drill (current)
1154 t2: Adding saw
1155 t1: Adding hammer
1156 t0^ add a pair of shoes (base)
1157
1158 You can also directly jump to a changeset within your stack with the revset `t#`.
1159
1160 $ hg update t1
1161 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1162
1163 $ hg stack
1164 ### topic: tools
1165 ### target: default (branch), 2 behind
1166 t3: Adding drill
1167 t2: Adding saw
1168 t1@ Adding hammer (current)
1169 t0^ add a pair of shoes (base)
1170
1171 Editing your work mid-stack
1172 ---------------------------
1173
1174 It's easy to edit your work inside your stack:
1175
1176 $ hg stack
1177 ### topic: tools
1178 ### target: default (branch), 2 behind
1179 t3: Adding drill
1180 t2: Adding saw
1181 t1@ Adding hammer (current)
1182 t0^ add a pair of shoes (base)
1183
1184 $ hg amend -m "Adding hammer to the shopping list"
1185 2 new unstable changesets
1186
1187 Understanding the current situation with hg log is not so easy, because
1188 it shows too many things:
1189
1190 $ hg log -G -r "t0::"
1191 @ changeset: 18:b7509bd417f8
1192 | tag: tip
1193 | topic: tools
1194 | parent: 12:fbff9bc37a43
1195 | user: test
1196 | date: Thu Jan 01 00:00:00 1970 +0000
1197 | summary: Adding hammer to the shopping list
1198 |
1199 | o changeset: 17:4cd7c1591a67
1200 | | user: test
1201 | | date: Thu Jan 01 00:00:00 1970 +0000
1202 | | summary: Adding orange juice
1203 | |
1204 | o changeset: 16:20759cb47ff8
1205 |/ parent: 12:fbff9bc37a43
1206 | user: test
1207 | date: Thu Jan 01 00:00:00 1970 +0000
1208 | summary: Adding apple juice
1209 |
1210 | o changeset: 15:bb1e6254f532
1211 | | topic: tools
1212 | | user: test
1213 | | date: Thu Jan 01 00:00:00 1970 +0000
1214 | | summary: Adding drill
1215 | |
1216 | o changeset: 14:d4f97f32f8a1
1217 | | topic: tools
1218 | | user: test
1219 | | date: Thu Jan 01 00:00:00 1970 +0000
1220 | | summary: Adding saw
1221 | |
1222 | x changeset: 13:a8ab3599d53d
1223 |/ topic: tools
1224 | user: test
1225 | date: Thu Jan 01 00:00:00 1970 +0000
1226 | summary: Adding hammer
1227 |
1228 o changeset: 12:fbff9bc37a43
1229 | user: test
1230 ~ date: Thu Jan 01 00:00:00 1970 +0000
1231 summary: add a pair of shoes
1232
1233
1234 #if docgraph-ext
1235 $ hg docgraph -r "t0::" --sphinx-directive --rankdir LR #rest-ignore
1236 .. graphviz::
1237
1238 strict digraph {
1239 graph [rankdir=LR,
1240 splines=polyline
1241 ];
1242 node [label="\N"];
1243 12 [fillcolor="#9999FF",
1244 fixedsize=true,
1245 group=default,
1246 height=0.5,
1247 label=12,
1248 pin=true,
1249 pos="1,12!",
1250 shape=circle,
1251 style=filled,
1252 width=0.5];
1253 13 [fillcolor="#DFDFFF",
1254 fixedsize=true,
1255 group=default_alt,
1256 height=0.5,
1257 label=13,
1258 pin=true,
1259 pos="2,13!",
1260 shape=pentagon,
1261 style="dotted, filled",
1262 width=0.5];
1263 12 -> 13 [arrowhead=none,
1264 penwidth=2.0];
1265 18 [fillcolor="#9999FF",
1266 fixedsize=true,
1267 group=default,
1268 height=0.5,
1269 label=18,
1270 pin=true,
1271 pos="1,18!",
1272 shape=pentagon,
1273 style=filled,
1274 width=0.5];
1275 12 -> 18 [arrowhead=none,
1276 penwidth=2.0];
1277 16 [fillcolor="#9999FF",
1278 fixedsize=true,
1279 group=default,
1280 height=0.5,
1281 label=16,
1282 pin=true,
1283 pos="1,16!",
1284 shape=circle,
1285 style=filled,
1286 width=0.5];
1287 12 -> 16 [arrowhead=none,
1288 penwidth=2.0];
1289 13 -> 18 [arrowhead=none,
1290 minlen=0,
1291 penwidth=2.0,
1292 style=dashed];
1293 14 [fillcolor="#FF4F4F",
1294 fixedsize=true,
1295 group=default_alt,
1296 height=0.5,
1297 label=14,
1298 pin=true,
1299 pos="2,14!",
1300 shape=pentagon,
1301 style=filled,
1302 width=0.5];
1303 13 -> 14 [arrowhead=none,
1304 penwidth=2.0];
1305 15 [fillcolor="#FF4F4F",
1306 fixedsize=true,
1307 group=default_alt,
1308 height=0.5,
1309 label=15,
1310 pin=true,
1311 pos="2,15!",
1312 shape=pentagon,
1313 style=filled,
1314 width=0.5];
1315 14 -> 15 [arrowhead=none,
1316 penwidth=2.0];
1317 17 [fillcolor="#9999FF",
1318 fixedsize=true,
1319 group=default,
1320 height=0.5,
1321 label=17,
1322 pin=true,
1323 pos="1,17!",
1324 shape=circle,
1325 style=filled,
1326 width=0.5];
1327 16 -> 17 [arrowhead=none,
1328 penwidth=2.0];
1329 }
1330 #endif
1331
1332 Fortunately stack shows you a better visualization:
1333
1334 $ hg stack
1335 ### topic: tools
1336 ### target: default (branch), 2 behind
1337 t3$ Adding drill (unstable)
1338 t2$ Adding saw (unstable)
1339 t1@ Adding hammer to the shopping list (current)
1340 t0^ add a pair of shoes (base)
1341
1342 It's easy to stabilize the situation, `next` has an `--evolve` option. It will
1343 do the necessary relocation of `t2` and `t3` over the new `t1` without having
1344 to do that rebase by hand.:
1345
1346 $ hg next --evolve
1347 move:[14] Adding saw
1348 atop:[18] Adding hammer to the shopping list
1349 working directory now at d5c51ee5762a
1350
1351 $ hg stack
1352 ### topic: tools
1353 ### target: default (branch), 2 behind
1354 t3$ Adding drill (unstable)
1355 t2@ Adding saw (current)
1356 t1: Adding hammer to the shopping list
1357 t0^ add a pair of shoes (base)
1358
1359 One more to go:
1360
1361 $ hg next --evolve
1362 move:[15] Adding drill
1363 atop:[19] Adding saw
1364 working directory now at bae3758e46bf
1365
1366 $ hg stack
1367 ### topic: tools
1368 ### target: default (branch), 2 behind
1369 t3@ Adding drill (current)
1370 t2: Adding saw
1371 t1: Adding hammer to the shopping list
1372 t0^ add a pair of shoes (base)
1373
1374 Let's take a look at `hg log` once again:
1375
1376 $ hg log -G -r "t0::"
1377 @ changeset: 20:bae3758e46bf
1378 | tag: tip
1379 | topic: tools
1380 | user: test
1381 | date: Thu Jan 01 00:00:00 1970 +0000
1382 | summary: Adding drill
1383 |
1384 o changeset: 19:d5c51ee5762a
1385 | topic: tools
1386 | user: test
1387 | date: Thu Jan 01 00:00:00 1970 +0000
1388 | summary: Adding saw
1389 |
1390 o changeset: 18:b7509bd417f8
1391 | topic: tools
1392 | parent: 12:fbff9bc37a43
1393 | user: test
1394 | date: Thu Jan 01 00:00:00 1970 +0000
1395 | summary: Adding hammer to the shopping list
1396 |
1397 | o changeset: 17:4cd7c1591a67
1398 | | user: test
1399 | | date: Thu Jan 01 00:00:00 1970 +0000
1400 | | summary: Adding orange juice
1401 | |
1402 | o changeset: 16:20759cb47ff8
1403 |/ parent: 12:fbff9bc37a43
1404 | user: test
1405 | date: Thu Jan 01 00:00:00 1970 +0000
1406 | summary: Adding apple juice
1407 |
1408 o changeset: 12:fbff9bc37a43
1409 | user: test
1410 ~ date: Thu Jan 01 00:00:00 1970 +0000
1411 summary: add a pair of shoes
1412
1413
1414 #if docgraph-ext
1415 $ hg docgraph -r "t0::" --sphinx-directive --rankdir LR #rest-ignore
1416 .. graphviz::
1417
1418 strict digraph {
1419 graph [rankdir=LR,
1420 splines=polyline
1421 ];
1422 node [label="\N"];
1423 12 [fillcolor="#9999FF",
1424 fixedsize=true,
1425 group=default,
1426 height=0.5,
1427 label=12,
1428 pin=true,
1429 pos="1,12!",
1430 shape=circle,
1431 style=filled,
1432 width=0.5];
1433 16 [fillcolor="#9999FF",
1434 fixedsize=true,
1435 group=default,
1436 height=0.5,
1437 label=16,
1438 pin=true,
1439 pos="1,16!",
1440 shape=circle,
1441 style=filled,
1442 width=0.5];
1443 12 -> 16 [arrowhead=none,
1444 penwidth=2.0];
1445 18 [fillcolor="#9999FF",
1446 fixedsize=true,
1447 group=default,
1448 height=0.5,
1449 label=18,
1450 pin=true,
1451 pos="1,18!",
1452 shape=pentagon,
1453 style=filled,
1454 width=0.5];
1455 12 -> 18 [arrowhead=none,
1456 penwidth=2.0];
1457 17 [fillcolor="#9999FF",
1458 fixedsize=true,
1459 group=default,
1460 height=0.5,
1461 label=17,
1462 pin=true,
1463 pos="1,17!",
1464 shape=circle,
1465 style=filled,
1466 width=0.5];
1467 16 -> 17 [arrowhead=none,
1468 penwidth=2.0];
1469 19 [fillcolor="#9999FF",
1470 fixedsize=true,
1471 group=default,
1472 height=0.5,
1473 label=19,
1474 pin=true,
1475 pos="1,19!",
1476 shape=pentagon,
1477 style=filled,
1478 width=0.5];
1479 18 -> 19 [arrowhead=none,
1480 penwidth=2.0];
1481 20 [fillcolor="#9999FF",
1482 fixedsize=true,
1483 group=default,
1484 height=0.5,
1485 label=20,
1486 pin=true,
1487 pos="1,20!",
1488 shape=pentagon,
1489 style=filled,
1490 width=0.5];
1491 19 -> 20 [arrowhead=none,
1492 penwidth=2.0];
1493 }
1494 #endif
1495 Multi-headed stack
1496 ------------------
1497
1498 Stack is also very helpful when you have a multi-headed stack:
1499
1500 $ hg up t1
1501 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1502
1503 $ echo "nails" > new_shopping
1504 $ cat shopping >> new_shopping
1505 $ mv new_shopping shopping
1506
1507 $ hg commit -m 'Adding nails'
1508
1509 $ hg stack
1510 ### topic: tools (2 heads)
1511 ### target: default (branch), 2 behind
1512 t4: Adding drill
1513 t3: Adding saw
1514 t1^ Adding hammer to the shopping list (base)
1515 t2@ Adding nails (current)
1516 t1: Adding hammer to the shopping list
1517 t0^ add a pair of shoes (base)
1518
1519 Solving this situation is easy with a topic: use merge or rebase.
1520 Merge within a multi-headed stack will use the other topic head as
1521 destination if the topic has two heads. But rebasing will yield a
1522 completely linear history so it's what we will do.
1523
1524 $ hg log -G
1525 @ changeset: 21:f936c6da9d61
1526 | tag: tip
1527 | topic: tools
1528 | parent: 18:b7509bd417f8
1529 | user: test
1530 | date: Thu Jan 01 00:00:00 1970 +0000
1531 | summary: Adding nails
1532 |
1533 | o changeset: 20:bae3758e46bf
1534 | | topic: tools
1535 | | user: test
1536 | | date: Thu Jan 01 00:00:00 1970 +0000
1537 | | summary: Adding drill
1538 | |
1539 | o changeset: 19:d5c51ee5762a
1540 |/ topic: tools
1541 | user: test
1542 | date: Thu Jan 01 00:00:00 1970 +0000
1543 | summary: Adding saw
1544 |
1545 o changeset: 18:b7509bd417f8
1546 | topic: tools
1547 | parent: 12:fbff9bc37a43
1548 | user: test
1549 | date: Thu Jan 01 00:00:00 1970 +0000
1550 | summary: Adding hammer to the shopping list
1551 |
1552 | o changeset: 17:4cd7c1591a67
1553 | | user: test
1554 | | date: Thu Jan 01 00:00:00 1970 +0000
1555 | | summary: Adding orange juice
1556 | |
1557 | o changeset: 16:20759cb47ff8
1558 |/ parent: 12:fbff9bc37a43
1559 | user: test
1560 | date: Thu Jan 01 00:00:00 1970 +0000
1561 | summary: Adding apple juice
1562 |
1563 o changeset: 12:fbff9bc37a43
1564 | user: test
1565 | date: Thu Jan 01 00:00:00 1970 +0000
1566 | summary: add a pair of shoes
1567 |
1568 o changeset: 11:f2d6cacc6115
1569 | parent: 5:2d50db8b5b4c
1570 | user: test
1571 | date: Thu Jan 01 00:00:00 1970 +0000
1572 | summary: add a coat
1573 |
1574 o changeset: 5:2d50db8b5b4c
1575 | user: test
1576 | date: Thu Jan 01 00:00:00 1970 +0000
1577 | summary: adding fruits
1578 |
1579 o changeset: 4:4011b46eeb33
1580 | user: test
1581 | date: Thu Jan 01 00:00:00 1970 +0000
1582 | summary: adding condiments
1583 |
1584 o changeset: 3:6104862e8b84
1585 | parent: 0:38da43f0a2ea
1586 | user: test
1587 | date: Thu Jan 01 00:00:00 1970 +0000
1588 | summary: Adding clothes
1589 |
1590 o changeset: 0:38da43f0a2ea
1591 user: test
1592 date: Thu Jan 01 00:00:00 1970 +0000
1593 summary: Shopping list
1594
1595
1596 #if docgraph-ext
1597 $ hg docgraph -r "all()" --sphinx-directive --rankdir LR #rest-ignore
1598 .. graphviz::
1599
1600 strict digraph {
1601 graph [rankdir=LR,
1602 splines=polyline
1603 ];
1604 node [label="\N"];
1605 0 [fillcolor="#9999FF",
1606 fixedsize=true,
1607 group=default,
1608 height=0.5,
1609 label=0,
1610 pin=true,
1611 pos="1,0!",
1612 shape=circle,
1613 style=filled,
1614 width=0.5];
1615 3 [fillcolor="#9999FF",
1616 fixedsize=true,
1617 group=default,
1618 height=0.5,
1619 label=3,
1620 pin=true,
1621 pos="1,3!",
1622 shape=circle,
1623 style=filled,
1624 width=0.5];
1625 0 -> 3 [arrowhead=none,
1626 penwidth=2.0];
1627 4 [fillcolor="#9999FF",
1628 fixedsize=true,
1629 group=default,
1630 height=0.5,
1631 label=4,
1632 pin=true,
1633 pos="1,4!",
1634 shape=circle,
1635 style=filled,
1636 width=0.5];
1637 3 -> 4 [arrowhead=none,
1638 penwidth=2.0];
1639 5 [fillcolor="#9999FF",
1640 fixedsize=true,
1641 group=default,
1642 height=0.5,
1643 label=5,
1644 pin=true,
1645 pos="1,5!",
1646 shape=circle,
1647 style=filled,
1648 width=0.5];
1649 4 -> 5 [arrowhead=none,
1650 penwidth=2.0];
1651 11 [fillcolor="#9999FF",
1652 fixedsize=true,
1653 group=default,
1654 height=0.5,
1655 label=11,
1656 pin=true,
1657 pos="1,11!",
1658 shape=circle,
1659 style=filled,
1660 width=0.5];
1661 5 -> 11 [arrowhead=none,
1662 penwidth=2.0];
1663 12 [fillcolor="#9999FF",
1664 fixedsize=true,
1665 group=default,
1666 height=0.5,
1667 label=12,
1668 pin=true,
1669 pos="1,12!",
1670 shape=circle,
1671 style=filled,
1672 width=0.5];
1673 11 -> 12 [arrowhead=none,
1674 penwidth=2.0];
1675 16 [fillcolor="#9999FF",
1676 fixedsize=true,
1677 group=default,
1678 height=0.5,
1679 label=16,
1680 pin=true,
1681 pos="1,16!",
1682 shape=circle,
1683 style=filled,
1684 width=0.5];
1685 12 -> 16 [arrowhead=none,
1686 penwidth=2.0];
1687 18 [fillcolor="#9999FF",
1688 fixedsize=true,
1689 group=default,
1690 height=0.5,
1691 label=18,
1692 pin=true,
1693 pos="1,18!",
1694 shape=pentagon,
1695 style=filled,
1696 width=0.5];
1697 12 -> 18 [arrowhead=none,
1698 penwidth=2.0];
1699 17 [fillcolor="#9999FF",
1700 fixedsize=true,
1701 group=default,
1702 height=0.5,
1703 label=17,
1704 pin=true,
1705 pos="1,17!",
1706 shape=circle,
1707 style=filled,
1708 width=0.5];
1709 16 -> 17 [arrowhead=none,
1710 penwidth=2.0];
1711 19 [fillcolor="#9999FF",
1712 fixedsize=true,
1713 group=default,
1714 height=0.5,
1715 label=19,
1716 pin=true,
1717 pos="1,19!",
1718 shape=pentagon,
1719 style=filled,
1720 width=0.5];
1721 18 -> 19 [arrowhead=none,
1722 penwidth=2.0];
1723 21 [fillcolor="#9999FF",
1724 fixedsize=true,
1725 group=default,
1726 height=0.5,
1727 label=21,
1728 pin=true,
1729 pos="1,21!",
1730 shape=pentagon,
1731 style=filled,
1732 width=0.5];
1733 18 -> 21 [arrowhead=none,
1734 penwidth=2.0];
1735 20 [fillcolor="#9999FF",
1736 fixedsize=true,
1737 group=default,
1738 height=0.5,
1739 label=20,
1740 pin=true,
1741 pos="1,20!",
1742 shape=pentagon,
1743 style=filled,
1744 width=0.5];
1745 19 -> 20 [arrowhead=none,
1746 penwidth=2.0];
1747 }
1748 #endif
1749
1750 $ hg up t4
1751 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1752
1753 $ hg rebase
1754 rebasing 19:d5c51ee5762a "Adding saw"
1755 merging shopping
1756 rebasing 20:bae3758e46bf "Adding drill"
1757 merging shopping
1758
1759 $ hg stack
1760 ### topic: tools
1761 ### target: default (branch), 2 behind
1762 t4@ Adding drill (current)
1763 t3: Adding saw
1764 t2: Adding nails
1765 t1: Adding hammer to the shopping list
1766 t0^ add a pair of shoes (base)
1767
1768 Collaborating through a non-publishing server
1769 =============================================
1770
1771 .. setup:
1772
1773 .. Let's create a non-publishing server:
1774
1775 $ cd ..
1776
1777 $ hg clone server non-publishing-server
1778 updating to branch default
1779 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1780
1781 $ cd non-publishing-server
1782 $ cat >> .hg/hgrc << EOF
1783 > [phases]
1784 > publish = false
1785 > EOF
1786
1787 .. And another client:
1788
1789 $ cd ..
1790
1791 $ hg clone server other-client
1792 updating to branch default
1793 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1794
1795 $ cd client
1796
1797 We can now share these draft changesets:
1798 (4.1-tests needs the --force to proceed with the test)
1799
1800 $ hg push ../non-publishing-server -r tools --force
1801 pushing to ../non-publishing-server
1802 searching for changes
1803 adding changesets
1804 adding manifests
1805 adding file changes
1806 added 4 changesets with 4 changes to 1 files (+1 heads)
1807 8 new obsolescence markers
1808
1809 Pushing the new topic branch to a non publishing server did not require
1810 --force. As long as new heads are on their own topic, Mercurial will not
1811 complain about them.
1812
1813 From another client, we will get them with their topic:
1814
1815 $ cd ../other-client
1816
1817 $ hg pull ../non-publishing-server
1818 pulling from ../non-publishing-server
1819 searching for changes
1820 adding changesets
1821 adding manifests
1822 adding file changes
1823 added 4 changesets with 4 changes to 1 files (+1 heads)
1824 8 new obsolescence markers
1825 (run 'hg heads' to see heads)
1826
1827 $ hg topics --verbose
1828 tools (on branch: default, 4 changesets, 2 behind)
1829
1830 $ hg up tools
1831 switching to topic tools
1832 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1833
1834 $ hg stack
1835 ### topic: tools
1836 ### target: default (branch), 2 behind
1837 t4@ Adding drill (current)
1838 t3: Adding saw
1839 t2: Adding nails
1840 t1: Adding hammer to the shopping list
1841 t0^ add a pair of shoes (base)
1842
1843 We can also add new changesets and share them:
1844 (4.1-tests needs the --force to proceed with the test)
1845
1846 $ echo screws >> shopping
1847
1848 $ hg commit -A -m "Adding screws"
1849
1850 $ hg push ../non-publishing-server --force
1851 pushing to ../non-publishing-server
1852 searching for changes
1853 adding changesets
1854 adding manifests
1855 adding file changes
1856 added 1 changesets with 1 changes to 1 files
1857
1858 And retrieve them on the first client:
1859
1860 $ cd ../client
1861
1862 $ hg pull ../non-publishing-server
1863 pulling from ../non-publishing-server
1864 searching for changes
1865 adding changesets
1866 adding manifests
1867 adding file changes
1868 added 1 changesets with 1 changes to 1 files
1869 (run 'hg update' to get a working copy)
1870
1871 $ hg update
1872 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1873
1874 $ hg stack
1875 ### topic: tools
1876 ### target: default (branch), 2 behind
1877 t5@ Adding screws (current)
1878 t4: Adding drill
1879 t3: Adding saw
1880 t2: Adding nails
1881 t1: Adding hammer to the shopping list
1882 t0^ add a pair of shoes (base)