topics: add a config to reject draft changeset without topic on a server
This patch adds a new config option experimental.topic-mode.server which if
sets to True, the server won't accept any draft changeset without topic on it.
In case both `experimental.topic-mode.server` and
`experimental.topic.publish-bare-branch` are set to True, the enforce-topic one
is respected.
Tests are added for it. The CHANGELOG file is also updated mentioning about the
config option.
ensurethatallthescenariosintheuserguideworkasdocumentedbasicrepo$hginitt$cdt$touchfile1.cfile2.c$hg-qcommit-A-minitexample1:commitcreatesachangesetindraftphase(thisisnothingtodowithevolve,butit's mentioned in the user guide) $ echo 'featureY' >> file1.c $ hg commit -u alice -d '00' -m 'implementfeatureX' $ hg phase -r . 1: draft $ hg identify -in 6e725fd2be6f 1example 2: unsafe amend with plain vanilla Mercurial: the originalcommit is stripped $ hg commit --amend -u alice -d '10' -m 'implementfeatureY' saved backup bundle to $TESTTMP/t/.hg/strip-backup/6e725fd2be6f-42cc74d4-amend.hg (glob) $ hg log -r 23fe4ac6d3f1 abort: unknown revision '23fe4ac6d3f1'! [255] $ hg identify -in fe0ecd3bd2a4 1enable evolve for safe history modification $ cat >> $HGRCPATH <<EOF>[alias]>shortlog=log--template'{rev}:{node|short}{phase}{desc|firstline}\n'>[extensions]>rebase=>EOF$echo"evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/">>$HGRCPATHexample3:safeamendwith"hg commit --amend"(figure2)$echo'tweak feature Y'>>file1.c$hgcommit--amend-ualice-d'2 0'-m'implement feature Y'$hgshortlog-q-rfe0ecd3bd2a4abort:hiddenrevision'fe0ecd3bd2a4'!(use--hiddentoaccesshiddenrevisions;successor:934359450037)[255]$hg--hiddenshortlog-G@2:934359450037draftimplementfeatureY||x1:fe0ecd3bd2a4draftimplementfeatureY|/o0:08c4b6f4efc8draftinitexample3redux:repeatsafeamend,thistimewith"hg amend"$hgrollback-q$hgamend-ualice-d'2 0'-m'implement feature Y'$hg--hiddenshortlog-G@2:934359450037draftimplementfeatureY||x1:fe0ecd3bd2a4draftimplementfeatureY|/o0:08c4b6f4efc8draftinitexample4:pruneathead(figure3)$echo'debug hack'>> file1.c $ hg commit -m 'debughack' $ hg prune . 1 files updated, 0 files merged, 0 files removed, 0 files unresolved working directory now at 934359450037 1 changesets pruned $ hg parents --template '{rev}:{node|short}{desc|firstline}\n' 2:934359450037 implement feature Y $ hg --hidden shortlog -G -r 934359450037: x 3:a3e0ef24aaf0 draft debug hack | @ 2:934359450037 draft implement feature Y | ~example 5: uncommit files at head (figure 4) $ echo 'relevant' >> file1.c $ echo 'irrelevant' >> file2.c $ hg commit -u dan -d '100' -m 'fixbug234' $ hg uncommit file2.c $ hg status M file2.c $ hg --hidden shortlog -G -r 'descendants(934359450037)-a3e0ef24aaf0' @ 5:c8defeecf7a4 draft fix bug 234 | | x 4:da4331967f5f draft fix bug 234 |/ o 2:934359450037 draft implement feature Y | ~ $ hg parents --template '{rev}:{node|short}{desc|firstline}\n{files}\n' 5:c8defeecf7a4 fix bug 234 file1.c $ hg revert --no-backup file2.cexample 6: fold multiple changesets together into one (figure 5) $ echo step1 >> file1.c $ hg commit -m 'step1' $ echo step2 >> file1.c $ hg commit -m 'step2' $ echo step3 >> file2.c $ hg commit -m 'step3' $ hg log --template '{rev}:{node|short}{desc|firstline}\n' -r 05e61aab8294:: 6:05e61aab8294 step 1 7:be6d5bc8e4cc step 2 8:35f432d9f7c1 step 3 $ hg fold -d '00' -m 'fixbug64' --from -r 05e61aab8294:: 3 changesets folded 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg --hidden shortlog -G -r c8defeecf7a4:: @ 9:171c6a79a27b draft fix bug 64 | | x 8:35f432d9f7c1 draft step 3 | | | x 7:be6d5bc8e4cc draft step 2 | | | x 6:05e61aab8294 draft step 1 |/ o 5:c8defeecf7a4 draft fix bug 234 | ~ $ hg --hidden log -q -r 'successors(05e61aab8294)|successors(be6d5bc8e4cc)|successors(35f432d9f7c1)' 9:171c6a79a27b $ hg --hidden log -q -r 'precursors(171c6a79a27b)' 6:05e61aab8294 7:be6d5bc8e4cc 8:35f432d9f7c1 $ hg diff -c 171c6a79a27b -U 0 diff -r c8defeecf7a4 -r 171c6a79a27b file1.c --- a/file1.c Thu Jan 01 00:00:10 1970 +0000 +++ b/file1.c Thu Jan 01 00:00:00 1970 +0000 @@ -3,0 +4,2 @@ +step1 +step2 diff -r c8defeecf7a4 -r 171c6a79a27b file2.c --- a/file2.c Thu Jan 01 00:00:10 1970 +0000 +++ b/file2.c Thu Jan 01 00:00:00 1970 +0000 @@ -0,0 +1,1 @@ +step3setup for example 7: amend an older changeset $ echo 'fixfixoopsfix' > file2.c $ hg commit -u bob -d '30' -m 'fixbug17' $ echo 'cleanup' >> file1.c $ hg commit -u bob -d '40' -m 'cleanup' $ echo 'newfeature' >> file1.c $ hg commit -u bob -d '50' -m 'feature23' $ hg --hidden shortlog -G -r 171c6a79a27b:: @ 12:dadcbba2d606 draft feature 23 | o 11:debd46bb29dc draft cleanup | o 10:3e1cb8f70c02 draft fix bug 17 | o 9:171c6a79a27b draft fix bug 64 | ~example 7: amend an older changeset (figures 6, 7) $ hg update -q -r 3e1cb8f70c02 $ echo 'fixfixfixfix' > file2.c $ hg amend -u bob -d '60' 2 new orphan changesets $ hg shortlog -r 'obsolete()' 10:3e1cb8f70c02 draft fix bug 17 $ hg shortlog -r "orphan()" 11:debd46bb29dc draft cleanup 12:dadcbba2d606 draft feature 23 $ hg --hidden shortlog -G -r 171c6a79a27b:: @ 13:395cbeda3a06 draft fix bug 17 | | o 12:dadcbba2d606 draft feature 23 | | | o 11:debd46bb29dc draft cleanup | | | x 10:3e1cb8f70c02 draft fix bug 17 |/ o 9:171c6a79a27b draft fix bug 64 | ~ $ hg evolve -q --all $ hg shortlog -G -r 171c6a79a27b:: @ 15:91b4b0f8b5c5 draft feature 23 | o 14:fe8858bd9bc2 draft cleanup | o 13:395cbeda3a06 draft fix bug 17 | o 9:171c6a79a27b draft fix bug 64 | ~setup for example 8: prune an older changeset (figure 8) $ echo 'useful' >> file1.c $ hg commit -u carl -d '70' -m 'usefulwork' $ echo 'debug' >> file2.c $ hg commit -u carl -d '80' -m 'debughack' $ echo 'moreuseful' >> file1.c $ hg commit -u carl -d '90' -m 'morework' $ hg shortlog -G -r 91b4b0f8b5c5:: @ 18:ea8fafca914b draft more work | o 17:b23d06b457a8 draft debug hack | o 16:1f33e68b18b9 draft useful work | o 15:91b4b0f8b5c5 draft feature 23 | ~example 8: prune an older changeset (figures 8, 9) $ hg prune b23d06b457a8 1 changesets pruned 1 new orphan changesets $ hg --hidden shortlog -G -r b23d06b457a8:: @ 18:ea8fafca914b draft more work | x 17:b23d06b457a8 draft debug hack | ~ $ hg evolve -q --all --any $ hg --hidden shortlog -G -r 1f33e68b18b9:: @ 19:4393e5877437 draft more work | | x 18:ea8fafca914b draft more work | | | x 17:b23d06b457a8 draft debug hack |/ o 16:1f33e68b18b9 draft useful work | ~example 9: uncommit files from an older changeset (discard changes)(figure 10) $ echo 'thisfixesbug53' >> file1.c $ echo 'debughack' >> file2.c $ hg commit -u dan -d '110' -m 'fixbug53' $ echo 'andthishandlesbug67' >> file1.c $ hg commit -u dan -d '120' -m 'fixbug67' $ hg update -r f84357446753 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg shortlog -G -r 4393e5877437:: o 21:4db2428c8ae3 draft fix bug 67 | @ 20:f84357446753 draft fix bug 53 | o 19:4393e5877437 draft more work | ~ $ hg uncommit file2.c 1 new orphan changesets $ hg status M file2.c $ hg revert file2.c $ hg evolve --all --any move:[21] fix bug 67 atop:[22] fix bug 53 working directory is now at 0d972d6888e6 $ hg --hidden shortlog -G -r 4393e5877437:: @ 23:0d972d6888e6 draft fix bug 67 | o 22:71bb83d674c5 draft fix bug 53 | | x 21:4db2428c8ae3 draft fix bug 67 | | | x 20:f84357446753 draft fix bug 53 |/ o 19:4393e5877437 draft more work | ~ $ rm file2.c.origexample 10: uncommit files from an older changeset (keep changes)(figures 11, 12) $ echo 'fixabug' >> file1.c $ echo 'usefulbutunrelated' >> file2.c $ hg commit -u dan -d '110' -m 'fixabug' $ echo 'newfeature' >> file1.c $ hg commit -u dan -d '120' -m 'newfeature' $ hg update 5b31a1239ab9 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg --hidden shortlog -G -r 0d972d6888e6:: o 25:fbb3c6d50427 draft new feature | @ 24:5b31a1239ab9 draft fix a bug | o 23:0d972d6888e6 draft fix bug 67 | ~ $ hg uncommit file2.c 1 new orphan changesets $ hg status M file2.c $ hg commit -m 'usefultweak' $ hg --hidden shortlog -G -r 0d972d6888e6:: @ 27:51e0d8c0a922 draft useful tweak | o 26:2594e98553a9 draft fix a bug | | o 25:fbb3c6d50427 draft new feature | | | x 24:5b31a1239ab9 draft fix a bug |/ o 23:0d972d6888e6 draft fix bug 67 | ~ $ hg evolve --all --any move:[25] new feature atop:[26] fix a bug working directory is now at 166c1c368ab6 $ hg --hidden shortlog -G -r 0d972d6888e6:: @ 28:166c1c368ab6 draft new feature | | o 27:51e0d8c0a922 draft useful tweak |/ o 26:2594e98553a9 draft fix a bug | | x 25:fbb3c6d50427 draft new feature | | | x 24:5b31a1239ab9 draft fix a bug |/ o 23:0d972d6888e6 draft fix bug 67 | ~