obshistory: use formatter instead of ui.write in the debugobshistory command
Replace ui.write with a formater to have template support and json output.
Update tests to assert json outputs.
============================================Testingobsolescencemarkerspush:CasesC.1============================================Mercurialpushesobsolescencesmarkersrelevanttothe"pushed-set",thesetofallchangesetsthatrequestedtobe"in sync"afterthepush(eveniftheyarealreadyonbothside).Thistestbelongstoaseriesoftestscheckingsuchsetisproperlycomputedandapplied.Thisdoesnottests"obsmarkers"discoverycapabilities.CategoryC:advancedcaseTestCase1:MultipleprunedchangesetatopeachotherVariants:# a: explicite push# b: bare pushC.1Multipleprunedchangesetatopeachother=============================================..{{{..⊗B..|..⊗A..|..●O..}}}....Markerexistfrom:....*A(prune)..*B(prune)....Commandsrun:....*hgpush-rO..*hgpush....Expectedexchange:....*A(prune)..*B(prune)Setup-----$.$TESTDIR/testlib/exchange-obsmarker-util.shInitial$setupreposC.1creatingtestrepofortestcaseC.1-pulldest-main-pushdestcdinto`main`andproceedwithenvsetup$cdmain$mkcommitA$mkcommitB$hgprune-qd'0 0''.~1'1newunstablechangesets$hgprune-qd'0 0'.$hglog-G--hiddenxf6fbb35d8ac9(draft):B|xf5bc6836db60(draft):A|@a9bdc8b26820(public):O$inspect_obsmarkersobsstorecontent================f5bc6836db60e308a17ba08bf050154ba9c4fad70{a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04}(ThuJan0100:00:001970+0000){'user':'test'}f6fbb35d8ac958bbe70035e4c789c18471cdc0af0{f5bc6836db60e308a17ba08bf050154ba9c4fad7}(ThuJan0100:00:001970+0000){'user':'test'}obshashtree===========a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc041ce18e5a71f78d443a80c819f2f7197c4706af70f5bc6836db60e308a17ba08bf050154ba9c4fad792af733686ce7e0469d8b2b87b4612a4c2d33468f6fbb35d8ac958bbe70035e4c789c18471cdc0af3800aeba3728457abb9c508c94f6abc59e698c55obshashrange============revnodeindexsizedepthobshash0a9bdc8b268200111ce18e5a71f7$cd..$cd..$cp-RC.1C.1.a$cp-RC.1C.1.bActualTest(explicitpush)---------------------------$dotestC.1.aO##RunningtestcaseC.1.a # testing echange of "O" (a9bdc8b26820) ## initial state # obstore: mainf5bc6836db60e308a17ba08bf050154ba9c4fad70{a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04}(ThuJan0100:00:001970+0000){'user':'test'}f6fbb35d8ac958bbe70035e4c789c18471cdc0af0{f5bc6836db60e308a17ba08bf050154ba9c4fad7}(ThuJan0100:00:001970+0000){'user':'test'} # obstore: pushdest # obstore: pulldest ## pushing "O" from main to pushdestpushingtopushdestsearchingforchangesnochangesfoundremote:2newobsolescencemarkers##postpushstate#obstore:mainf5bc6836db60e308a17ba08bf050154ba9c4fad70{a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04}(ThuJan0100:00:001970+0000){'user':'test'}f6fbb35d8ac958bbe70035e4c789c18471cdc0af0{f5bc6836db60e308a17ba08bf050154ba9c4fad7}(ThuJan0100:00:001970+0000){'user':'test'} # obstore: pushdestf5bc6836db60e308a17ba08bf050154ba9c4fad70{a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04}(ThuJan0100:00:001970+0000){'user':'test'}f6fbb35d8ac958bbe70035e4c789c18471cdc0af0{f5bc6836db60e308a17ba08bf050154ba9c4fad7}(ThuJan0100:00:001970+0000){'user':'test'} # obstore: pulldest ## pulling "a9bdc8b26820" from main into pulldestpullingfrommainnochangesfound2newobsolescencemarkers##postpullstate#obstore:mainf5bc6836db60e308a17ba08bf050154ba9c4fad70{a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04}(ThuJan0100:00:001970+0000){'user':'test'}f6fbb35d8ac958bbe70035e4c789c18471cdc0af0{f5bc6836db60e308a17ba08bf050154ba9c4fad7}(ThuJan0100:00:001970+0000){'user':'test'} # obstore: pushdestf5bc6836db60e308a17ba08bf050154ba9c4fad70{a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04}(ThuJan0100:00:001970+0000){'user':'test'}f6fbb35d8ac958bbe70035e4c789c18471cdc0af0{f5bc6836db60e308a17ba08bf050154ba9c4fad7}(ThuJan0100:00:001970+0000){'user':'test'} # obstore: pulldestf5bc6836db60e308a17ba08bf050154ba9c4fad70{a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04}(ThuJan0100:00:001970+0000){'user':'test'}f6fbb35d8ac958bbe70035e4c789c18471cdc0af0{f5bc6836db60e308a17ba08bf050154ba9c4fad7}(ThuJan0100:00:001970+0000){'user':'test'}ActualTest(barepush)-------------------------------------$dotestC.1.b ## Running testcase C.1.b ## initial state # obstore: mainf5bc6836db60e308a17ba08bf050154ba9c4fad70{a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04}(ThuJan0100:00:001970+0000){'user':'test'}f6fbb35d8ac958bbe70035e4c789c18471cdc0af0{f5bc6836db60e308a17ba08bf050154ba9c4fad7}(ThuJan0100:00:001970+0000){'user':'test'} # obstore: pushdest # obstore: pulldest ## pushing from main to pushdestpushingtopushdestsearchingforchangesnochangesfoundremote:2newobsolescencemarkers##postpushstate#obstore:mainf5bc6836db60e308a17ba08bf050154ba9c4fad70{a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04}(ThuJan0100:00:001970+0000){'user':'test'}f6fbb35d8ac958bbe70035e4c789c18471cdc0af0{f5bc6836db60e308a17ba08bf050154ba9c4fad7}(ThuJan0100:00:001970+0000){'user':'test'} # obstore: pushdestf5bc6836db60e308a17ba08bf050154ba9c4fad70{a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04}(ThuJan0100:00:001970+0000){'user':'test'}f6fbb35d8ac958bbe70035e4c789c18471cdc0af0{f5bc6836db60e308a17ba08bf050154ba9c4fad7}(ThuJan0100:00:001970+0000){'user':'test'} # obstore: pulldest ## pulling from main into pulldestpullingfrommainsearchingforchangesnochangesfound2newobsolescencemarkers##postpullstate#obstore:mainf5bc6836db60e308a17ba08bf050154ba9c4fad70{a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04}(ThuJan0100:00:001970+0000){'user':'test'}f6fbb35d8ac958bbe70035e4c789c18471cdc0af0{f5bc6836db60e308a17ba08bf050154ba9c4fad7}(ThuJan0100:00:001970+0000){'user':'test'} # obstore: pushdestf5bc6836db60e308a17ba08bf050154ba9c4fad70{a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04}(ThuJan0100:00:001970+0000){'user':'test'}f6fbb35d8ac958bbe70035e4c789c18471cdc0af0{f5bc6836db60e308a17ba08bf050154ba9c4fad7}(ThuJan0100:00:001970+0000){'user':'test'} # obstore: pulldestf5bc6836db60e308a17ba08bf050154ba9c4fad70{a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04}(ThuJan0100:00:001970+0000){'user':'test'}f6fbb35d8ac958bbe70035e4c789c18471cdc0af0{f5bc6836db60e308a17ba08bf050154ba9c4fad7}(ThuJan0100:00:001970+0000){'user':'test'}