Rev 3180: Merge more-find-ghosts newer logic. in http://people.ubuntu.com/~robertc/baz2.0/remote.graph

Robert Collins robertc at robertcollins.net
Mon Jan 14 05:16:15 GMT 2008


At http://people.ubuntu.com/~robertc/baz2.0/remote.graph

------------------------------------------------------------
revno: 3180
revision-id:robertc at robertcollins.net-20080114051607-8icqda4bvrc2u1xe
parent: robertc at robertcollins.net-20080114044608-bmse3mmsnp1663rf
parent: robertc at robertcollins.net-20080114030008-xdf5xvub5prv2zal
committer: Robert Collins <robertc at robertcollins.net>
branch nick: remote.graph
timestamp: Mon 2008-01-14 16:16:07 +1100
message:
  Merge more-find-ghosts newer logic.
modified:
  NEWS                           NEWS-20050323055033-4e00b5db738777ff
  bzrlib/debug.py                debug.py-20061102062349-vdhrw9qdpck8cl35-1
  bzrlib/fetch.py                fetch.py-20050818234941-26fea6105696365d
  bzrlib/graph.py                graph_walker.py-20070525030359-y852guab65d4wtn0-1
  bzrlib/help_topics/__init__.py help_topics.py-20060920210027-rnim90q9e0bwxvy4-1
  bzrlib/knit.py                 knit.py-20051212171256-f056ac8f0fbe1bd9
  bzrlib/reconfigure.py          reconfigure.py-20070908040425-6ykgo7escxhyrg9p-1
  bzrlib/repository.py           rev_storage.py-20051111201905-119e9401e46257e3
  bzrlib/tests/test_graph.py     test_graph_walker.py-20070525030405-enq4r60hhi9xrujc-1
  bzrlib/tests/test_osutils.py   test_osutils.py-20051201224856-e48ee24c12182989
  bzrlib/tests/test_reconfigure.py test_reconfigure.py-20070908040425-6ykgo7escxhyrg9p-2
    ------------------------------------------------------------
    revno: 3172.2.1.1.4
    revision-id:robertc at robertcollins.net-20080114030008-xdf5xvub5prv2zal
    parent: robertc at robertcollins.net-20080114005859-0o83m18iul1xwy0v
    committer: Robert Collins <robertc at robertcollins.net>
    branch nick: more-find-ghosts
    timestamp: Mon 2008-01-14 14:00:08 +1100
    message:
      Review feedback.
    modified:
      bzrlib/fetch.py                fetch.py-20050818234941-26fea6105696365d
      bzrlib/repository.py           rev_storage.py-20051111201905-119e9401e46257e3
    ------------------------------------------------------------
    revno: 3172.2.1.1.3
    revision-id:robertc at robertcollins.net-20080114005859-0o83m18iul1xwy0v
    parent: robertc at robertcollins.net-20080114000613-3zal7v1to7k9xp5b
    parent: robertc at robertcollins.net-20080114005456-d4a5iief649hmtiy
    committer: Robert Collins <robertc at robertcollins.net>
    branch nick: more-find-ghosts
    timestamp: Mon 2008-01-14 11:58:59 +1100
    message:
      More graph support kthanxbye.
    modified:
      bzrlib/graph.py                graph_walker.py-20070525030359-y852guab65d4wtn0-1
      bzrlib/tests/test_graph.py     test_graph_walker.py-20070525030405-enq4r60hhi9xrujc-1
        ------------------------------------------------------------
        revno: 3172.1.7
        revision-id:robertc at robertcollins.net-20080114005456-d4a5iief649hmtiy
        parent: robertc at robertcollins.net-20080113235717-9a1w22q93j81nd0o
        committer: Robert Collins <robertc at robertcollins.net>
        branch nick: breadth-first-ghosts
        timestamp: Mon 2008-01-14 11:54:56 +1100
        message:
          Update graph searchers stop_searching_any and start_searching for next_with_ghosts.
        modified:
          bzrlib/graph.py                graph_walker.py-20070525030359-y852guab65d4wtn0-1
          bzrlib/tests/test_graph.py     test_graph_walker.py-20070525030405-enq4r60hhi9xrujc-1
    ------------------------------------------------------------
    revno: 3172.2.1.1.2
    revision-id:robertc at robertcollins.net-20080114000613-3zal7v1to7k9xp5b
    parent: robertc at robertcollins.net-20080111043302-0pi5csqyr1ugry00
    parent: robertc at robertcollins.net-20080113235717-9a1w22q93j81nd0o
    committer: Robert Collins <robertc at robertcollins.net>
    branch nick: more-find-ghosts
    timestamp: Mon 2008-01-14 11:06:13 +1100
    message:
      Merge next_with_ghosts support.
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/debug.py                debug.py-20061102062349-vdhrw9qdpck8cl35-1
      bzrlib/graph.py                graph_walker.py-20070525030359-y852guab65d4wtn0-1
      bzrlib/help_topics/__init__.py help_topics.py-20060920210027-rnim90q9e0bwxvy4-1
      bzrlib/knit.py                 knit.py-20051212171256-f056ac8f0fbe1bd9
      bzrlib/reconfigure.py          reconfigure.py-20070908040425-6ykgo7escxhyrg9p-1
      bzrlib/remote.py               remote.py-20060720103555-yeeg2x51vn0rbtdp-1
      bzrlib/repository.py           rev_storage.py-20051111201905-119e9401e46257e3
      bzrlib/smart/client.py         client.py-20061116014825-2k6ada6xgulslami-1
      bzrlib/smart/repository.py     repository.py-20061128022038-vr5wy5bubyb8xttk-1
      bzrlib/smart/request.py        request.py-20061108095550-gunadhxmzkdjfeek-1
      bzrlib/tests/test_graph.py     test_graph_walker.py-20070525030405-enq4r60hhi9xrujc-1
      bzrlib/tests/test_osutils.py   test_osutils.py-20051201224856-e48ee24c12182989
      bzrlib/tests/test_reconfigure.py test_reconfigure.py-20070908040425-6ykgo7escxhyrg9p-2
      bzrlib/tests/test_remote.py    test_remote.py-20060720103555-yeeg2x51vn0rbtdp-2
      bzrlib/tests/test_smart.py     test_smart.py-20061122024551-ol0l0o0oofsu9b3t-2
      bzrlib/tests/test_smart_transport.py test_ssh_transport.py-20060608202016-c25gvf1ob7ypbus6-2
    ------------------------------------------------------------
    revno: 3172.1.6
    revision-id:robertc at robertcollins.net-20080113235717-9a1w22q93j81nd0o
    parent: pqm at pqm.ubuntu.com-20080111214408-cpkslxu95eg5c45u
    committer: Robert Collins <robertc at robertcollins.net>
    branch nick: breadth-first-ghosts
    timestamp: Mon 2008-01-14 10:57:17 +1100
    message:
       * New method ``next_with_ghosts`` on the Graph breadth-first-search objects
         which will split out ghosts and present parents into two separate sets,
         useful for code which needs to be aware of ghosts (e.g. fetching data
         cares about ghosts during revision selection). (Robert Collins)
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/graph.py                graph_walker.py-20070525030359-y852guab65d4wtn0-1
      bzrlib/tests/test_graph.py     test_graph_walker.py-20070525030405-enq4r60hhi9xrujc-1
    ------------------------------------------------------------
    revno: 3172.1.5
    revision-id:pqm at pqm.ubuntu.com-20080111214408-cpkslxu95eg5c45u
    parent: pqm at pqm.ubuntu.com-20080111083251-et161scbblpkphri
    parent: abentley at panoramicfeedback.com-20080111175920-dn202iylc1kfdfif
    committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
    branch nick: +trunk
    timestamp: Fri 2008-01-11 21:44:08 +0000
    message:
      Reconfigure can safely be interrupted while fetching (abentley,
      	#179316)
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/reconfigure.py          reconfigure.py-20070908040425-6ykgo7escxhyrg9p-1
      bzrlib/tests/test_reconfigure.py test_reconfigure.py-20070908040425-6ykgo7escxhyrg9p-2
        ------------------------------------------------------------
        revno: 2796.2.30
        revision-id:abentley at panoramicfeedback.com-20080111175920-dn202iylc1kfdfif
        parent: abentley at panoramicfeedback.com-20080111174159-ruc9j1mkhqj9m94l
        committer: Aaron Bentley <abentley at panoramicfeedback.com>
        branch nick: bzr.reconfigure
        timestamp: Fri 2008-01-11 12:59:20 -0500
        message:
          Reconfigure can safely be interrupted while fetching (#179316)
        modified:
          NEWS                           NEWS-20050323055033-4e00b5db738777ff
          bzrlib/reconfigure.py          reconfigure.py-20070908040425-6ykgo7escxhyrg9p-1
          bzrlib/tests/test_reconfigure.py test_reconfigure.py-20070908040425-6ykgo7escxhyrg9p-2
        ------------------------------------------------------------
        revno: 2796.2.29
        revision-id:abentley at panoramicfeedback.com-20080111174159-ruc9j1mkhqj9m94l
        parent: abentley at panoramicfeedback.com-20071214153828-wc2w1i8ey025bb8x
        parent: pqm at pqm.ubuntu.com-20080111083251-et161scbblpkphri
        committer: Aaron Bentley <abentley at panoramicfeedback.com>
        branch nick: bzr.reconfigure
        timestamp: Fri 2008-01-11 12:41:59 -0500
        message:
          Merge from bzr.dev
        added:
          bzrlib/help_topics/            help_topics-20071211013603-qz0sojhgxhiujm6a-1
          bzrlib/help_topics/en/         bzrlibhelp-20071209214431-xzg3moksichjwyts-1
          bzrlib/tests/repository_implementations/test_has_revisions.py test_has_revisions.p-20080111035443-xaupgdsx5fw1q54b-1
          bzrlib/tests/test_http_implementations.py test_http_implementa-20071218210003-65nh81gglcfvurw6-1
          bzrlib/version_info_formats/format_custom.py format_custom.py-20071029100350-ajovqhbpb5khf6gu-1
          contrib/bzr_access             bzr_access-20071210163004-c9lb1renhra2ncg0-1
          doc/developers/inventory.txt   inventory.txt-20080103013957-opkrhxy6lmywmx4i-1
          doc/developers/lca-merge.txt   lcamerge.txt-20080103061803-9isydn4ivgwrvorw-1
          doc/en/tutorials/using_bazaar_with_launchpad.txt using_bazaar_with_lp-20071211073140-7msh8uf9a9h4y9hb-1
          doc/en/user-reference/readme.txt readme.txt-20071211133352-guencaey6fpesv4j-1
        renamed:
          bzrlib/help_topics.py => bzrlib/help_topics/__init__.py help_topics.py-20060920210027-rnim90q9e0bwxvy4-1
          bzrlib/tests/HTTPTestUtil.py => bzrlib/tests/http_utils.py HTTPTestUtil.py-20050914180604-247d3aafb7a43343
          bzrlib/tests/HttpServer.py => bzrlib/tests/http_server.py httpserver.py-20061012142527-m1yxdj1xazsf8d7s-1
          doc/en/user-guide/authentication_conf.txt => bzrlib/help_topics/en/authentication.txt authentication_conf.-20071104135035-glfv0ri355tyg1nf-1
          doc/en/user-guide/configuration.txt => bzrlib/help_topics/en/configuration.txt configuration.txt-20060314161707-868350809502af01
          doc/en/user-guide/conflicts.txt => bzrlib/help_topics/en/conflicts.txt conflicts.txt-20070723221841-ns3jvwxdb4okn6fk-1
          doc/en/user-reference/hooks.txt => bzrlib/help_topics/en/hooks.txt hooks.txt-20070830033044-xxu2rced13f72dka-1
        modified:
          .bzrignore                     bzrignore-20050311232317-81f7b71efa2db11a
          Makefile                       Makefile-20050805140406-d96e3498bb61c5bb
          NEWS                           NEWS-20050323055033-4e00b5db738777ff
          README                         README-20050309040720-8f368abf9f346b9d
          bzrlib/_patiencediff_c.c       _patiencediff_c.c-20070721205602-q3imkipwlgagp3cy-1
          bzrlib/branch.py               branch.py-20050309040759-e4baf4e0d046576e
          bzrlib/bugtracker.py           bugtracker.py-20070410073305-vu1vu1qosjurg8kb-1
          bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
          bzrlib/bundle/serializer/v4.py v10.py-20070611062757-5ggj7k18s9dej0fr-1
          bzrlib/bzrdir.py               bzrdir.py-20060131065624-156dfea39c4387cb
          bzrlib/cmd_version_info.py     __init__.py-20051228204928-697d01fdca29c99b
          bzrlib/commands.py             bzr.py-20050309040720-d10f4714595cf8c3
          bzrlib/commit.py               commit.py-20050511101309-79ec1a0168e0e825
          bzrlib/conflicts.py            conflicts.py-20051001061850-78ef952ba63d2b42
          bzrlib/debug.py                debug.py-20061102062349-vdhrw9qdpck8cl35-1
          bzrlib/diff.py                 diff.py-20050309040759-26944fbbf2ebbf36
          bzrlib/dirstate.py             dirstate.py-20060728012006-d6mvoihjb3je9peu-1
          bzrlib/errors.py               errors.py-20050309040759-20512168c4e14fbd
          bzrlib/fetch.py                fetch.py-20050818234941-26fea6105696365d
          bzrlib/graph.py                graph_walker.py-20070525030359-y852guab65d4wtn0-1
          bzrlib/index.py                index.py-20070712131115-lolkarso50vjr64s-1
          bzrlib/inventory.py            inventory.py-20050309040759-6648b84ca2005b37
          bzrlib/knit.py                 knit.py-20051212171256-f056ac8f0fbe1bd9
          bzrlib/lockable_files.py       control_files.py-20051111201905-bb88546e799d669f
          bzrlib/merge.py                merge.py-20050513021216-953b65a438527106
          bzrlib/option.py               option.py-20051014052914-661fb36e76e7362f
          bzrlib/osutils.py              osutils.py-20050309040759-eeaff12fbf77ac86
          bzrlib/progress.py             progress.py-20050610070202-df9faaab791964c0
          bzrlib/remote.py               remote.py-20060720103555-yeeg2x51vn0rbtdp-1
          bzrlib/repofmt/knitrepo.py     knitrepo.py-20070206081537-pyy4a00xdas0j4pf-1
          bzrlib/repofmt/pack_repo.py    pack_repo.py-20070813041115-gjv5ma7ktfqwsjgn-1
          bzrlib/repofmt/weaverepo.py    presplitout.py-20070125045333-wfav3tsh73oxu3zk-1
          bzrlib/repository.py           rev_storage.py-20051111201905-119e9401e46257e3
          bzrlib/revision.py             revision.py-20050309040759-e77802c08f3999d5
          bzrlib/smart/client.py         client.py-20061116014825-2k6ada6xgulslami-1
          bzrlib/smart/medium.py         medium.py-20061103051856-rgu2huy59fkz902q-1
          bzrlib/smart/repository.py     repository.py-20061128022038-vr5wy5bubyb8xttk-1
          bzrlib/smart/request.py        request.py-20061108095550-gunadhxmzkdjfeek-1
          bzrlib/smart/vfs.py            vfs.py-20061108095550-gunadhxmzkdjfeek-2
          bzrlib/symbol_versioning.py    symbol_versioning.py-20060105104851-9ecf8af605d15a80
          bzrlib/tests/TestUtil.py       TestUtil.py-20050824080200-5f70140a2d938694
          bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
          bzrlib/tests/blackbox/test_annotate.py testannotate.py-20051013044000-457f44801bfa9d39
          bzrlib/tests/blackbox/test_checkout.py test_checkout.py-20060211231752-a5cde67cf70af854
          bzrlib/tests/blackbox/test_diff.py test_diff.py-20060110203741-aa99ac93e633d971
          bzrlib/tests/blackbox/test_ignore.py test_ignore.py-20060703063225-4tm8dc2pa7wwg2t3-1
          bzrlib/tests/blackbox/test_info.py test_info.py-20060215045507-bbdd2d34efab9e0a
          bzrlib/tests/blackbox/test_log.py test_log.py-20060112090212-78f6ea560c868e24
          bzrlib/tests/blackbox/test_merge.py test_merge.py-20060323225809-9bc0459c19917f41
          bzrlib/tests/blackbox/test_non_ascii.py test_non_ascii.py-20060105214030-68010be784a5d854
          bzrlib/tests/blackbox/test_outside_wt.py test_outside_wt.py-20060116200058-98edd33e7db8bdde
          bzrlib/tests/blackbox/test_selftest.py test_selftest.py-20060123024542-01c5f1bbcb596d78
          bzrlib/tests/blackbox/test_send.py test_bundle.py-20060616222707-c21c8b7ea5ef57b1
          bzrlib/tests/blackbox/test_split.py test_split.py-20061008023421-qy0vdpzysh5rriu8-1
          bzrlib/tests/blackbox/test_too_much.py blackbox.py-20050620052131-a7370d756399f615
          bzrlib/tests/blackbox/test_upgrade.py test_upgrade.py-20060120060132-b41e5ed2f886ad28
          bzrlib/tests/branch_implementations/test_branch.py testbranch.py-20050711070244-121d632bc37d7253
          bzrlib/tests/branch_implementations/test_http.py test_http.py-20060731224648-2eef7ae5yja95rya-1
          bzrlib/tests/branch_implementations/test_parent.py test_parent.py-20050830052751-5e62766623c32222
          bzrlib/tests/bzrdir_implementations/test_bzrdir.py test_bzrdir.py-20060131065642-0ebeca5e30e30866
          bzrlib/tests/interrepository_implementations/test_interrepository.py test_interrepository.py-20060220061411-1ec13fa99e5e3eee
          bzrlib/tests/inventory_implementations/__init__.py __init__.py-20070821044532-olbadbokgv3qv1yd-1
          bzrlib/tests/repository_implementations/__init__.py __init__.py-20060131092037-9564957a7d4a841b
          bzrlib/tests/repository_implementations/test_repository.py test_repository.py-20060131092128-ad07f494f5c9d26c
          bzrlib/tests/test_ancestry.py  test_ancestry.py-20050913023709-69768e94848312c6
          bzrlib/tests/test_bundle.py    test.py-20050630184834-092aa401ab9f039c
          bzrlib/tests/test_bzrdir.py    test_bzrdir.py-20060131065654-deba40eef51cf220
          bzrlib/tests/test_commit.py    test_commit.py-20050914060732-279f057f8c295434
          bzrlib/tests/test_conflicts.py test_conflicts.py-20051006031059-e2dad9bbeaa5891f
          bzrlib/tests/test_diff.py      testdiff.py-20050727164403-d1a3496ebb12e339
          bzrlib/tests/test_extract.py   test_extract.py-20061002214140-qdnnm67q1ov6x6pd-1
          bzrlib/tests/test_fetch.py     testfetch.py-20050825090644-f73e07e7dfb1765a
          bzrlib/tests/test_graph.py     test_graph_walker.py-20070525030405-enq4r60hhi9xrujc-1
          bzrlib/tests/test_help.py      test_help.py-20070419045354-6q6rq15j9e2n5fna-1
          bzrlib/tests/test_http.py      testhttp.py-20051018020158-b2eef6e867c514d9
          bzrlib/tests/test_http_response.py test_http_response.py-20060628233143-950b2a482a32505d
          bzrlib/tests/test_lockable_files.py test_lockable_files.py-20051225183927-365c7fd99591caf1
          bzrlib/tests/test_merge.py     testmerge.py-20050905070950-c1b5aa49ff911024
          bzrlib/tests/test_msgeditor.py test_msgeditor.py-20051202041359-920315ec6011ee51
          bzrlib/tests/test_osutils.py   test_osutils.py-20051201224856-e48ee24c12182989
          bzrlib/tests/test_progress.py  test_progress.py-20060308160359-978c397bc79b7fda
          bzrlib/tests/test_remote.py    test_remote.py-20060720103555-yeeg2x51vn0rbtdp-2
          bzrlib/tests/test_repository.py test_repository.py-20060131075918-65c555b881612f4d
          bzrlib/tests/test_revert.py    test_revert.py-20060828180832-fqb1v6ecpyvnlitj-1
          bzrlib/tests/test_revision.py  testrevision.py-20050804210559-46f5e1eb67b01289
          bzrlib/tests/test_selftest.py  test_selftest.py-20051202044319-c110a115d8c0456a
          bzrlib/tests/test_sftp_transport.py testsftp.py-20051027032739-247570325fec7e7e
          bzrlib/tests/test_smart.py     test_smart.py-20061122024551-ol0l0o0oofsu9b3t-2
          bzrlib/tests/test_smart_transport.py test_ssh_transport.py-20060608202016-c25gvf1ob7ypbus6-2
          bzrlib/tests/test_transform.py test_transaction.py-20060105172520-b3ffb3946550e6c4
          bzrlib/tests/test_transport.py testtransport.py-20050718175618-e5cdb99f4555ddce
          bzrlib/tests/test_transport_implementations.py test_transport_implementations.py-20051227111451-f97c5c7d5c49fce7
          bzrlib/tests/test_urlutils.py  test_urlutils.py-20060502192900-46b1f9579987cf9c
          bzrlib/tests/test_version_info.py test_version_info.py-20051228204928-2c364e30b702b41b
          bzrlib/tests/test_versionedfile.py test_versionedfile.py-20060222045249-db45c9ed14a1c2e5
          bzrlib/tests/test_win32utils.py test_win32utils.py-20070713181630-8xsrjymd3e8mgw23-108
          bzrlib/tests/test_workingtree.py testworkingtree.py-20051004024258-b88d0fe8f101d468
          bzrlib/tests/tree_implementations/test_inv.py test_inv.py-20070312023226-0cdvk5uwhutis9vg-1
          bzrlib/trace.py                trace.py-20050309040759-c8ed824bdcd4748a
          bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
          bzrlib/transport/__init__.py   transport.py-20050711165921-4978aa7ce1285ad5
          bzrlib/transport/http/__init__.py http_transport.py-20050711212304-506c5fd1059ace96
          bzrlib/transport/http/_pycurl.py pycurlhttp.py-20060110060940-4e2a705911af77a6
          bzrlib/transport/http/_urllib.py _urlgrabber.py-20060113083826-0bbf7d992fbf090c
          bzrlib/transport/http/_urllib2_wrappers.py _urllib2_wrappers.py-20060913231729-ha9ugi48ktx481ao-1
          bzrlib/transport/http/response.py _response.py-20060613154423-a2ci7hd4iw5c7fnt-1
          bzrlib/transport/remote.py     ssh.py-20060608202016-c25gvf1ob7ypbus6-1
          bzrlib/tree.py                 tree.py-20050309040759-9d5f2496be663e77
          bzrlib/urlutils.py             urlutils.py-20060502195429-e8a161ecf8fac004
          bzrlib/version_info_formats/__init__.py generate_version_info.py-20051228204928-8358edabcddcd97e
          bzrlib/versionedfile.py        versionedfile.py-20060222045106-5039c71ee3b65490
          bzrlib/workingtree.py          workingtree.py-20050511021032-29b6ec0a681e02e3
          bzrlib/workingtree_4.py        workingtree_4.py-20070208044105-5fgpc5j3ljlh5q6c-1
          bzrlib/xml_serializer.py       xml.py-20050309040759-57d51586fdec365d
          doc/developers/HACKING.txt     HACKING-20050805200004-2a5dc975d870f78c
          doc/developers/index.txt       index.txt-20070508041241-qznziunkg0nffhiw-1
          doc/en/user-guide/browsing_history.txt browsing_history.txt-20071121073725-0corxykv5irjal00-2
          doc/en/user-guide/bug_trackers.txt bug_trackers.txt-20070713223459-khxdlcudraii95uv-1
          doc/en/user-guide/configuring_bazaar.txt configuring_bazaar.t-20071128000722-ncxiua259xwbdbg7-1
          doc/en/user-guide/hooks.txt    hooks.txt-20070829200551-7nr6e5a1io6x78uf-1
          doc/en/user-guide/index.txt    index.txt-20060622101119-tgwtdci8z769bjb9-2
          doc/en/user-guide/introducing_bazaar.txt introducing_bazaar.t-20071114035000-q36a9h57ps06uvnl-5
          doc/en/user-guide/sending_changes.txt sending_changes.txt-20071123154453-dk2mjhrg1vpjm5w2-4
          doc/en/user-guide/setting_up_email.txt setting_up_email.txt-20060314161707-fd242c8944346173
          doc/en/user-guide/version_info.txt version_info.txt-20060921215543-gju6o5xdic8w25np-1
          doc/index.txt                  index.txt-20070813101924-07gd9i9d2jt124bf-1
          setup.py                       setup.py-20050314065409-02f8a0a6e3f9bc70
          tools/doc_generate/autodoc_rstx.py autodoc_rstx.py-20060420024836-3e0d4a526452193c
          tools/rst2html.py              rst2html.py-20060817120932-gn177u8v0008txhu-1
          bzrlib/help_topics/__init__.py help_topics.py-20060920210027-rnim90q9e0bwxvy4-1
          bzrlib/tests/http_utils.py     HTTPTestUtil.py-20050914180604-247d3aafb7a43343
          bzrlib/tests/http_server.py    httpserver.py-20061012142527-m1yxdj1xazsf8d7s-1
          bzrlib/help_topics/en/authentication.txt authentication_conf.-20071104135035-glfv0ri355tyg1nf-1
          bzrlib/help_topics/en/configuration.txt configuration.txt-20060314161707-868350809502af01
          bzrlib/help_topics/en/conflicts.txt conflicts.txt-20070723221841-ns3jvwxdb4okn6fk-1
          bzrlib/help_topics/en/hooks.txt hooks.txt-20070830033044-xxu2rced13f72dka-1
    ------------------------------------------------------------
    revno: 3172.1.4
    revision-id:pqm at pqm.ubuntu.com-20080111083251-et161scbblpkphri
    parent: pqm at pqm.ubuntu.com-20080111070636-jhozu5eo7wvh1k0o
    parent: robertc at robertcollins.net-20080111054654-vn3mvu7ylqb6gfw3
    committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
    branch nick: +trunk
    timestamp: Fri 2008-01-11 08:32:51 +0000
    message:
      (robertc) Add Repository.has_revisions as part of improving pull.
      	(Robert Collins)
    added:
      bzrlib/tests/repository_implementations/test_has_revisions.py test_has_revisions.p-20080111035443-xaupgdsx5fw1q54b-1
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/remote.py               remote.py-20060720103555-yeeg2x51vn0rbtdp-1
      bzrlib/repofmt/knitrepo.py     knitrepo.py-20070206081537-pyy4a00xdas0j4pf-1
      bzrlib/repofmt/pack_repo.py    pack_repo.py-20070813041115-gjv5ma7ktfqwsjgn-1
      bzrlib/repofmt/weaverepo.py    presplitout.py-20070125045333-wfav3tsh73oxu3zk-1
      bzrlib/repository.py           rev_storage.py-20051111201905-119e9401e46257e3
      bzrlib/tests/repository_implementations/__init__.py __init__.py-20060131092037-9564957a7d4a841b
      bzrlib/tests/test_remote.py    test_remote.py-20060720103555-yeeg2x51vn0rbtdp-2
        ------------------------------------------------------------
        revno: 3172.2.3
        revision-id:robertc at robertcollins.net-20080111054654-vn3mvu7ylqb6gfw3
        parent: robertc at robertcollins.net-20080111052846-oxt52a13l5mu73wj
        committer: Robert Collins <robertc at robertcollins.net>
        branch nick: integration
        timestamp: Fri 2008-01-11 16:46:54 +1100
        message:
          Missed one occurence of None -> NULL_REVISION.
        modified:
          bzrlib/tests/test_remote.py    test_remote.py-20060720103555-yeeg2x51vn0rbtdp-2
    ------------------------------------------------------------
    revno: 3172.1.3
    revision-id:pqm at pqm.ubuntu.com-20080111070636-jhozu5eo7wvh1k0o
    parent: pqm at pqm.ubuntu.com-20080111050820-eendmy6xgfc6w0yc
    parent: andrew.bennetts at canonical.com-20080111045553-g8rfanwmvy2bchtp
    committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
    branch nick: +trunk
    timestamp: Fri 2008-01-11 07:06:36 +0000
    message:
      (andrew) Enable use of smart revision streaming between repos with
      	compatible models.
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/debug.py                debug.py-20061102062349-vdhrw9qdpck8cl35-1
      bzrlib/help_topics/__init__.py help_topics.py-20060920210027-rnim90q9e0bwxvy4-1
      bzrlib/knit.py                 knit.py-20051212171256-f056ac8f0fbe1bd9
      bzrlib/repository.py           rev_storage.py-20051111201905-119e9401e46257e3
      bzrlib/tests/test_osutils.py   test_osutils.py-20051201224856-e48ee24c12182989
    ------------------------------------------------------------
    revno: 3172.3.1
    revision-id:andrew.bennetts at canonical.com-20080111045553-g8rfanwmvy2bchtp
    parent: pqm at pqm.ubuntu.com-20080110025628-6tl4b9cmdn335suw
    committer: Andrew Bennetts <andrew.bennetts at canonical.com>
    branch nick: remote-fetch-formats
    timestamp: Fri 2008-01-11 15:55:53 +1100
    message:
      Enable use of smart revision streaming between repos with compatible models, not just between identical format repos.
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/debug.py                debug.py-20061102062349-vdhrw9qdpck8cl35-1
      bzrlib/help_topics/__init__.py help_topics.py-20060920210027-rnim90q9e0bwxvy4-1
      bzrlib/knit.py                 knit.py-20051212171256-f056ac8f0fbe1bd9
      bzrlib/repository.py           rev_storage.py-20051111201905-119e9401e46257e3
      bzrlib/tests/test_osutils.py   test_osutils.py-20051201224856-e48ee24c12182989
=== modified file 'NEWS'
--- a/NEWS	2008-01-11 07:12:15 +0000
+++ b/NEWS	2008-01-14 05:16:07 +0000
@@ -54,6 +54,9 @@
      at the start of the file, promoting linear reads for ``bzr log`` and the
      like. This partially fixes #154129. (Robert Collins)
 
+   * Fetching between different repository formats with compatible models now
+     takes advantage of the smart method to stream revisions.  (Andrew Bennetts)
+
    * Merge directives now fetch prerequisites from the target branch if
      needed.  (Aaron Bentley)
 
@@ -116,6 +119,9 @@
    * ``reconfigure`` is able to convert trees into lightweight checkouts.
      (Aaron Bentley)
 
+   * ``reconfigure`` can safely be interrupted while fetching.
+     (Aaron Bentley, #179316)
+
    * Reduce lockdir timeout to 0 when running ``bzr serve``.  (Andrew Bennetts,
      #148087)
 
@@ -169,6 +175,11 @@
      inventories. This is primarily used by the ``revision_trees`` method, as
      direct access to inventories is discouraged. (Robert Collins)
 
+   * New method ``next_with_ghosts`` on the Graph breadth-first-search objects
+     which will split out ghosts and present parents into two separate sets,
+     useful for code which needs to be aware of ghosts (e.g. fetching data
+     cares about ghosts during revision selection). (Robert Collins)
+
    * Parent Providers should now implement ``get_parent_map`` returning a
      dictionary instead of ``get_parents`` returning a list.
      ``Graph.get_parents`` is now deprecated. (John Arbash Meinel,

=== modified file 'bzrlib/debug.py'
--- a/bzrlib/debug.py	2008-01-09 07:04:23 +0000
+++ b/bzrlib/debug.py	2008-01-11 04:55:53 +0000
@@ -34,6 +34,7 @@
  * hpss - trace smart protocol requests and responses
  * http - trace http connections, requests and responses
  * index - trace major index operations
+ * knit - trace knit operations
  * lock - trace when lockdir locks are taken or released
  * merge - emit information for debugging merges
  * times - record timestamps from program start in trace file

=== modified file 'bzrlib/fetch.py'
--- a/bzrlib/fetch.py	2008-01-11 07:12:15 +0000
+++ b/bzrlib/fetch.py	2008-01-14 05:16:07 +0000
@@ -336,6 +336,8 @@
 
         :param revs: A list of revision ids
         """
+        # In case that revs is not a list.
+        revs = list(revs)
         while revs:
             for tree in self.source.revision_trees(revs[:100]):
                 if tree.inventory.revision_id is None:

=== modified file 'bzrlib/graph.py'
--- a/bzrlib/graph.py	2008-01-11 00:44:17 +0000
+++ b/bzrlib/graph.py	2008-01-14 00:54:56 +0000
@@ -506,39 +506,92 @@
     """
 
     def __init__(self, revisions, parents_provider):
-        self._start = set(revisions)
-        self._search_revisions = None
-        self.seen = set(revisions)
+        self._iterations = 0
+        self._next_query = set(revisions)
+        self.seen = set()
         self._parents_provider = parents_provider
+        self._returning = 'checked'
 
     def __repr__(self):
-        if self._search_revisions is not None:
-            search = 'searching=%r' % (list(self._search_revisions),)
+        if self._iterations:
+            prefix = "searching"
         else:
-            search = 'starting=%r' % (list(self._start),)
-        return ('_BreadthFirstSearcher(%s,'
-                ' seen=%r)' % (search, list(self.seen)))
+            prefix = "starting"
+        search = '%s=%r' % (prefix, list(self._next_query))
+        return ('_BreadthFirstSearcher(iterations=%d, %s,'
+                ' seen=%r)' % (self._iterations, search, list(self.seen)))
 
     def next(self):
         """Return the next ancestors of this revision.
 
         Ancestors are returned in the order they are seen in a breadth-first
-        traversal.  No ancestor will be returned more than once.
+        traversal.  No ancestor will be returned more than once. Ancestors are
+        returned before their parentage is queried, so ghosts and missing
+        revisions (including the start revisions) are included in the result.
+        This can save a round trip in LCA style calculation by allowing
+        convergence to be detected without reading the data for the revision
+        the convergence occurs on.
+
+        :return: A set of revision_ids.
         """
-        if self._search_revisions is None:
-            self._search_revisions = self._start
+        if self._returning != 'query':
+            # switch to returning the query, not the results.
+            self._returning = 'query'
+            self._iterations += 1
+            self.seen.update(self._next_query)
         else:
-            new_search_revisions = set()
-            parent_map = self._parents_provider.get_parent_map(
-                            self._search_revisions)
-            for parents in parent_map.itervalues():
-                new_search_revisions.update(p for p in parents if
-                                            p not in self.seen)
-            self._search_revisions = new_search_revisions
-        if len(self._search_revisions) == 0:
-            raise StopIteration()
-        self.seen.update(self._search_revisions)
-        return self._search_revisions
+            self._advance()
+        if len(self._next_query) == 0:
+            raise StopIteration()
+        return self._next_query
+
+    def next_with_ghosts(self):
+        """Return the next found ancestors, with ghosts split out.
+        
+        Ancestors are returned in the order they are seen in a breadth-first
+        traversal.  No ancestor will be returned more than once. Ancestors are
+        returned only after asking for their parents, which can
+
+        :return: A tuple with (present ancestors, ghost ancestors) sets.
+        """
+        if self._returning != 'checked':
+            # switch to returning the results, not the current query.
+            self._returning = 'checked'
+            self._advance()
+        if len(self._next_query) == 0:
+            raise StopIteration()
+        self._advance()
+        return self._current_present, self._current_ghosts
+
+    def _advance(self):
+        """Advance the search.
+
+        Updates self.seen, self._next_query, self._current_present,
+        self._current_ghosts.
+        """
+        self._iterations += 1
+        found, ghosts, next, parents = self._do_query(self._next_query)
+        self._current_present = found
+        self._current_ghosts = ghosts
+        self._next_query = next
+        self._current_parents = parents
+
+    def _do_query(self, revisions):
+        """Query for revisions.
+
+        :param revisions: Revisions to query.
+        :return: A tuple: (set(found_revisions), set(ghost_revisions),
+           set(parents_of_found_revisions), dict(found_revisions:parents)).
+        """
+        found_parents = set()
+        parents_of_found = set()
+        parent_map = self._parents_provider.get_parent_map(revisions)
+        for rev_id, parents in parent_map.iteritems():
+            found_parents.add(rev_id)
+            parents_of_found.update(p for p in parents if p not in self.seen)
+        ghost_parents = revisions - found_parents
+        self.seen.update(parents_of_found)
+        return found_parents, ghost_parents, parents_of_found, parent_map
 
     def __iter__(self):
         return self
@@ -562,13 +615,56 @@
         None of the specified revisions are required to be present in the
         search list.  In this case, the call is a no-op.
         """
-        stopped = self._search_revisions.intersection(revisions)
-        self._search_revisions = self._search_revisions.difference(revisions)
+        revisions = frozenset(revisions)
+        if self._returning == 'query':
+            stopped = self._next_query.intersection(revisions)
+            self._next_query = self._next_query.difference(revisions)
+        else:
+            stopped = set()
+            stopped.update(self._current_present.intersection(revisions))
+            stopped.update(self._current_ghosts.intersection(revisions))
+            self._current_present.difference_update(stopped)
+            self._current_ghosts.difference_update(stopped)
+            # stopping 'x' should stop returning parents of 'x', but 
+            # not if 'y' always references those same parents
+            stop_rev_references = {}
+            for rev in stopped:
+                for parent_id in self._current_parents[rev]:
+                    if parent_id not in stop_rev_references:
+                        stop_rev_references[parent_id] = 0
+                    stop_rev_references[parent_id] += 1
+            # if only the stopped revisions reference it, the ref count will be
+            # 0 after this loop
+            for rev, parents in self._current_parents.iteritems():
+                for parent_id in parents:
+                    try:
+                        stop_rev_references[parent_id] -= 1
+                    except KeyError:
+                        pass
+            stop_parents = set()
+            for rev_id, refs in stop_rev_references.iteritems():
+                if refs == 0:
+                    stop_parents.add(rev_id)
+            self._next_query.difference_update(stop_parents)
         return stopped
 
     def start_searching(self, revisions):
-        if self._search_revisions is None:
-            self._start = set(revisions)
+        """Add revisions to the search.
+
+        The parents of revisions will be returned from the next call to next()
+        or next_with_ghosts(). If next_with_ghosts was the most recently used
+        next* call then the return value is the result of looking up the
+        ghost/not ghost status of revisions. (A tuple (present, ghosted)).
+        """
+        revisions = frozenset(revisions)
+        if self._returning == 'query':
+            self._next_query.update(revisions.difference(self.seen))
+            self.seen.update(revisions)
         else:
-            self._search_revisions.update(revisions.difference(self.seen))
-        self.seen.update(revisions)
+            # perform a query on revisions
+            revs, ghosts, query, parents = self._do_query(revisions)
+            self._current_present.update(revs)
+            self._current_ghosts.update(ghosts)
+            self._next_query.update(query)
+            self._current_parents.update(parents)
+            return revs, ghosts

=== modified file 'bzrlib/help_topics/__init__.py'
--- a/bzrlib/help_topics/__init__.py	2008-01-09 07:04:23 +0000
+++ b/bzrlib/help_topics/__init__.py	2008-01-11 04:55:53 +0000
@@ -287,6 +287,7 @@
 -Dhpss         Trace smart protocol requests and responses.
 -Dhttp         Trace http connections, requests and responses
 -Dindex        Trace major index operations.
+-Dknit         Trace knit operations.
 -Dlock         Trace when lockdir locks are taken or released.
 -Dmerge        Emit information for debugging merges.
 -Dtimes        Record timestamps from program start in trace file.

=== modified file 'bzrlib/knit.py'
--- a/bzrlib/knit.py	2008-01-02 03:08:59 +0000
+++ b/bzrlib/knit.py	2008-01-11 07:06:36 +0000
@@ -736,7 +736,9 @@
         :seealso: get_data_stream
         """
         if format != self.get_format_signature():
-            trace.mutter('incompatible format signature inserting to %r', self)
+            if 'knit' in debug.debug_flags:
+                trace.mutter(
+                    'incompatible format signature inserting to %r', self)
             source = self._knit_from_datastream(
                 (format, data_list, reader_callable))
             self.join(source)

=== modified file 'bzrlib/reconfigure.py'
--- a/bzrlib/reconfigure.py	2007-12-13 16:38:54 +0000
+++ b/bzrlib/reconfigure.py	2008-01-11 17:59:20 +0000
@@ -216,6 +216,11 @@
         if self._create_branch and self.referenced_branch is not None:
             repo.fetch(self.referenced_branch.repository,
                        self.referenced_branch.last_revision())
+        if self._create_reference:
+            reference_branch = branch.Branch.open(self._select_bind_location())
+        if self._destroy_repository:
+            if self._create_reference:
+                reference_branch.repository.fetch(self.repository)
         last_revision_info = None
         if self._destroy_reference:
             last_revision_info = self.referenced_branch.last_revision_info()
@@ -230,7 +235,6 @@
         else:
             local_branch = self.local_branch
         if self._create_reference:
-            reference_branch = branch.Branch.open(self._select_bind_location())
             format = branch.BranchReferenceFormat().initialize(self.bzrdir,
                 reference_branch)
         if self._destroy_tree:
@@ -243,6 +247,4 @@
             bind_location = self._select_bind_location()
             local_branch.bind(branch.Branch.open(bind_location))
         if self._destroy_repository:
-            if self._create_reference:
-                reference_branch.repository.fetch(self.repository)
             self.bzrdir.destroy_repository()

=== modified file 'bzrlib/repository.py'
--- a/bzrlib/repository.py	2008-01-11 07:12:15 +0000
+++ b/bzrlib/repository.py	2008-01-14 05:16:07 +0000
@@ -842,8 +842,14 @@
             for version, options, parents, some_bytes in decoded_list:
                 data_list.append((version, options, len(some_bytes), parents))
                 knit_bytes += some_bytes
+            buffer = StringIO(knit_bytes)
+            def reader_func(count):
+                if count is None:
+                    return buffer.read()
+                else:
+                    return buffer.read(count)
             knit.insert_data_stream(
-                (format, data_list, StringIO(knit_bytes).read))
+                (format, data_list, reader_func))
 
     @needs_read_lock
     def missing_revision_ids(self, other, revision_id=None, find_ghosts=True):
@@ -2303,6 +2309,39 @@
         (copied, failures).
         """
         raise NotImplementedError(self.fetch)
+
+    def _walk_to_common_revisions(self, revision_ids):
+        """Walk out from revision_ids in source to revisions target has.
+
+        :param revision_ids: The start point for the search.
+        :return: A set of revision ids.
+        """
+        graph = self.source.get_graph()
+        missing_revs = set()
+        # ensure we don't pay silly lookup costs.
+        revision_ids = frozenset(revision_ids)
+        searcher = graph._make_breadth_first_searcher(revision_ids)
+        null_set = frozenset([_mod_revision.NULL_REVISION])
+        while True:
+            try:
+                next_revs, ghosts = searcher.next_with_ghosts()
+            except StopIteration:
+                break
+            if revision_ids.intersection(ghosts):
+                absent_ids = set(revision_ids.intersection(ghosts))
+                # If all absent_ids are present in target, no error is needed.
+                absent_ids.difference_update(
+                    self.target.has_revisions(absent_ids))
+                if absent_ids:
+                    raise errors.NoSuchRevision(self.source, absent_ids.pop())
+            # we don't care about other ghosts as we can't fetch them and
+            # haven't been asked to.
+            next_revs = set(next_revs)
+            next_revs.difference_update(null_set)
+            have_revs = self.target.has_revisions(next_revs)
+            missing_revs.update(next_revs - have_revs)
+            searcher.stop_searching_any(have_revs)
+        return missing_revs
    
     @needs_read_lock
     def missing_revision_ids(self, revision_id=None, find_ghosts=True):
@@ -2317,26 +2356,7 @@
         """
         # stop searching at found target revisions.
         if not find_ghosts and revision_id is not None:
-            graph = self.source.get_graph()
-            missing_revs = set()
-            searcher = graph._make_breadth_first_searcher([revision_id])
-            null_set = frozenset([_mod_revision.NULL_REVISION])
-            while True:
-                try:
-                    next_revs = set(searcher.next())
-                except StopIteration:
-                    break
-                next_revs.difference_update(null_set)
-                have_revs = self.target.has_revisions(next_revs)
-                missing_revs.update(next_revs - have_revs)
-                searcher.stop_searching_any(have_revs)
-            if next_revs - have_revs == set([revision_id]):
-                # we saw the start rev itself, but no parents from it (or
-                # next_revs would have been updated to e.g. set(). We remove
-                # have_revs because if we found revision_id locally we
-                # stop_searching at the first time around.
-                raise errors.NoSuchRevision(self.source, revision_id)
-            return missing_revs
+            return self._walk_to_common_revisions([revision_id])
         # generic, possibly worst case, slow code path.
         target_ids = set(self.target.all_revision_ids())
         if revision_id is not None:
@@ -2679,26 +2699,7 @@
             revision_id.
         """
         if not find_ghosts and revision_id is not None:
-            graph = self.source.get_graph()
-            missing_revs = set()
-            searcher = graph._make_breadth_first_searcher([revision_id])
-            null_set = frozenset([_mod_revision.NULL_REVISION])
-            while True:
-                try:
-                    next_revs = set(searcher.next())
-                except StopIteration:
-                    break
-                next_revs.difference_update(null_set)
-                have_revs = self.target.has_revisions(next_revs)
-                missing_revs.update(next_revs - have_revs)
-                searcher.stop_searching_any(have_revs)
-            if next_revs - have_revs == set([revision_id]):
-                # we saw the start rev itself, but no parents from it (or
-                # next_revs would have been updated to e.g. set(). We remove
-                # have_revs because if we found revision_id locally we
-                # stop_searching at the first time around.
-                raise errors.NoSuchRevision(self.source, revision_id)
-            return missing_revs
+            return self._walk_to_common_revisions([revision_id])
         elif revision_id is not None:
             source_ids = self.source.get_ancestry(revision_id)
             assert source_ids[0] is None
@@ -2851,14 +2852,12 @@
     def is_compatible(source, target):
         if not isinstance(source, remote.RemoteRepository):
             return False
+        # Is source's model compatible with target's model?
         source._ensure_real()
         real_source = source._real_repository
-        # Is source's model compatible with target's model, and are they the
-        # same format?  Currently we can only optimise fetching from an
-        # identical model & format repo.
         assert not isinstance(real_source, remote.RemoteRepository), (
             "We don't support remote repos backed by remote repos yet.")
-        return real_source._format == target._format
+        return InterRepository._same_model(real_source, target)
 
     @needs_write_lock
     def fetch(self, revision_id=None, pb=None, find_ghosts=False):

=== modified file 'bzrlib/tests/test_graph.py'
--- a/bzrlib/tests/test_graph.py	2008-01-11 00:44:17 +0000
+++ b/bzrlib/tests/test_graph.py	2008-01-14 00:54:56 +0000
@@ -652,6 +652,101 @@
         self.assertEqual(set(['h1', 'h2']),
             self._run_heads_break_deeper(graph_dict, ['h1', 'h2']))
 
+    def test_breadth_first_search_start_ghosts(self):
+        parent_graph = {}
+        parents_provider = InstrumentedParentsProvider(
+            _mod_graph.DictParentsProvider(parent_graph))
+        graph = _mod_graph.Graph(parents_provider)
+        # with_ghosts reports the ghosts
+        search = graph._make_breadth_first_searcher(['a-ghost'])
+        self.assertEqual((set(), set(['a-ghost'])), search.next_with_ghosts())
+        self.assertRaises(StopIteration, search.next_with_ghosts)
+        # next includes them
+        search = graph._make_breadth_first_searcher(['a-ghost'])
+        self.assertEqual(set(['a-ghost']), search.next())
+        self.assertRaises(StopIteration, search.next)
+
+    def test_breadth_first_search_deep_ghosts(self):
+        parent_graph = {
+            'head':['present'],
+            'present':['child', 'ghost'],
+            'child':[],
+            }
+        parents_provider = InstrumentedParentsProvider(
+            _mod_graph.DictParentsProvider(parent_graph))
+        graph = _mod_graph.Graph(parents_provider)
+        # with_ghosts reports the ghosts
+        search = graph._make_breadth_first_searcher(['head'])
+        self.assertEqual((set(['head']), set()), search.next_with_ghosts())
+        self.assertEqual((set(['present']), set()), search.next_with_ghosts())
+        self.assertEqual((set(['child']), set(['ghost'])),
+            search.next_with_ghosts())
+        self.assertRaises(StopIteration, search.next_with_ghosts)
+        # next includes them
+        search = graph._make_breadth_first_searcher(['head'])
+        self.assertEqual(set(['head']), search.next())
+        self.assertEqual(set(['present']), search.next())
+        self.assertEqual(set(['child', 'ghost']),
+            search.next())
+        self.assertRaises(StopIteration, search.next)
+
+    def test_breadth_first_search_change_next_to_next_with_ghosts(self):
+        # To make the API robust, we allow changing from next() to
+        # next_with_ghosts() and vice verca.
+        parent_graph = {
+            'head':['present'],
+            'present':['child', 'ghost'],
+            'child':[],
+            }
+        parents_provider = InstrumentedParentsProvider(
+            _mod_graph.DictParentsProvider(parent_graph))
+        graph = _mod_graph.Graph(parents_provider)
+        # with_ghosts reports the ghosts
+        search = graph._make_breadth_first_searcher(['head'])
+        self.assertEqual((set(['head']), set()), search.next_with_ghosts())
+        self.assertEqual(set(['present']), search.next())
+        self.assertEqual((set(['child']), set(['ghost'])),
+            search.next_with_ghosts())
+        self.assertRaises(StopIteration, search.next)
+        # next includes them
+        search = graph._make_breadth_first_searcher(['head'])
+        self.assertEqual(set(['head']), search.next())
+        self.assertEqual((set(['present']), set()), search.next_with_ghosts())
+        self.assertEqual(set(['child', 'ghost']),
+            search.next())
+        self.assertRaises(StopIteration, search.next_with_ghosts)
+
+    def test_breadth_first_change_search(self):
+        # To make the API robust, we allow changing from next() to
+        # next_with_ghosts() and vice verca.
+        parent_graph = {
+            'head':['present'],
+            'present':['stopped'],
+            'other':['other_2'],
+            'other_2':[],
+            }
+        parents_provider = InstrumentedParentsProvider(
+            _mod_graph.DictParentsProvider(parent_graph))
+        graph = _mod_graph.Graph(parents_provider)
+        search = graph._make_breadth_first_searcher(['head'])
+        self.assertEqual((set(['head']), set()), search.next_with_ghosts())
+        self.assertEqual((set(['present']), set()), search.next_with_ghosts())
+        self.assertEqual(set(['present']),
+            search.stop_searching_any(['present']))
+        self.assertEqual((set(['other']), set(['other_ghost'])),
+            search.start_searching(['other', 'other_ghost']))
+        self.assertEqual((set(['other_2']), set()), search.next_with_ghosts())
+        self.assertRaises(StopIteration, search.next_with_ghosts)
+        # next includes them
+        search = graph._make_breadth_first_searcher(['head'])
+        self.assertEqual(set(['head']), search.next())
+        self.assertEqual(set(['present']), search.next())
+        self.assertEqual(set(['present']),
+            search.stop_searching_any(['present']))
+        search.start_searching(['other', 'other_ghost'])
+        self.assertEqual(set(['other_2']), search.next())
+        self.assertRaises(StopIteration, search.next)
+
 
 class TestCachingParentsProvider(tests.TestCase):
 

=== modified file 'bzrlib/tests/test_osutils.py'
--- a/bzrlib/tests/test_osutils.py	2008-01-09 23:21:45 +0000
+++ b/bzrlib/tests/test_osutils.py	2008-01-11 04:55:53 +0000
@@ -1114,6 +1114,7 @@
  * hpss - trace smart protocol requests and responses
  * http - trace http connections, requests and responses
  * index - trace major index operations
+ * knit - trace knit operations
  * lock - trace when lockdir locks are taken or released
  * merge - emit information for debugging merges
  * times - record timestamps from program start in trace file

=== modified file 'bzrlib/tests/test_reconfigure.py'
--- a/bzrlib/tests/test_reconfigure.py	2007-12-13 16:38:54 +0000
+++ b/bzrlib/tests/test_reconfigure.py	2008-01-11 17:59:20 +0000
@@ -200,6 +200,21 @@
         self.assertRaises(errors.NoRepositoryPresent,
                           child.bzrdir.open_repository)
 
+    def test_branch_to_lightweight_checkout_failure(self):
+        parent = self.make_branch('parent')
+        child = parent.bzrdir.sprout('child').open_workingtree()
+        child.commit('test', rev_id='new-commit')
+        reconfiguration = reconfigure.Reconfigure.to_lightweight_checkout(
+            child.bzrdir)
+        old_Repository_fetch = repository.Repository.fetch
+        repository.Repository.fetch = None
+        try:
+            self.assertRaises(TypeError, reconfiguration.apply)
+        finally:
+            repository.Repository.fetch = old_Repository_fetch
+        child = _mod_branch.Branch.open('child')
+        self.assertContainsRe(child.base, 'child/$')
+
     def test_lightweight_checkout_to_lightweight_checkout(self):
         parent = self.make_branch('parent')
         checkout = parent.create_checkout('checkout', lightweight=True)



More information about the bazaar-commits mailing list