Rev 3122: merge fix for bug #177643 in file:///v/home/vila/src/bzr/bugs/175524/

Vincent Ladeuil v.ladeuil+lp at free.fr
Thu Dec 20 16:36:52 GMT 2007


At file:///v/home/vila/src/bzr/bugs/175524/

------------------------------------------------------------
revno: 3122
revision-id:v.ladeuil+lp at free.fr-20071220163644-nh05tvd3jfsfz2y0
parent: v.ladeuil+lp at free.fr-20071220091804-8by0r5bwsw3qfg1q
parent: v.ladeuil+lp at free.fr-20071220142933-xf5h8kd1885f8nz6
committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
branch nick: 175524
timestamp: Thu 2007-12-20 17:36:44 +0100
message:
  merge fix for bug #177643
modified:
  NEWS                           NEWS-20050323055033-4e00b5db738777ff
  bzrlib/_patiencediff_c.c       _patiencediff_c.c-20070721205602-q3imkipwlgagp3cy-1
  bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
  bzrlib/diff.py                 diff.py-20050309040759-26944fbbf2ebbf36
  bzrlib/errors.py               errors.py-20050309040759-20512168c4e14fbd
  bzrlib/merge.py                merge.py-20050513021216-953b65a438527106
  bzrlib/tests/blackbox/test_merge.py test_merge.py-20060323225809-9bc0459c19917f41
  bzrlib/tests/test_diff.py      testdiff.py-20050727164403-d1a3496ebb12e339
  bzrlib/tests/test_merge.py     testmerge.py-20050905070950-c1b5aa49ff911024
  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/tree.py                 tree.py-20050309040759-9d5f2496be663e77
  bzrlib/versionedfile.py        versionedfile.py-20060222045106-5039c71ee3b65490
    ------------------------------------------------------------
    revno: 3111.1.25
    revision-id:v.ladeuil+lp at free.fr-20071220142933-xf5h8kd1885f8nz6
    parent: v.ladeuil+lp at free.fr-20071220141421-1m9i2monq5d9zgno
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: 177643
    timestamp: Thu 2007-12-20 15:29:33 +0100
    message:
      Fix typo (hi John ;).
    modified:
      bzrlib/transport/http/_urllib2_wrappers.py _urllib2_wrappers.py-20060913231729-ha9ugi48ktx481ao-1
    ------------------------------------------------------------
    revno: 3111.1.24
    revision-id:v.ladeuil+lp at free.fr-20071220141421-1m9i2monq5d9zgno
    parent: v.ladeuil+lp at free.fr-20071220120730-o0nbkwl4a4o70ecs
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: 177643
    timestamp: Thu 2007-12-20 15:14:21 +0100
    message:
      Fix #177643 by making pycurl handle url-embedded credentials again.
      
      * bzrlib/tests/test_http.py:
      Define proper tests for pycurl instead of replacing the urllib
      ones (a correct refactoring is already under work elsewhere). Add
      KnownFailures to document limitations in the pycurl
      implementation (cant prompt for password, no support for
      authentication.conf, cant handle a nonce change for digest auth).
      (TestAuth.test_no_prompt_for_password_when_using_auth_config): Fix
      typo.
      
      * bzrlib/transport/http/__init__.py:
      (HttpTransportBase._remote_path): Don't mention user and passwords
      in urls since bothe implementations handle credentials separately.
      (HttpTransportBase._create_auth): Share default credentials
      creation between both implementation.
      
      * bzrlib/transport/http/_pycurl.py:
      (PyCurlTransport._get_curl): Save user provided credentials.
      (PyCurlTransport._set_curl_options): Set USERPWD explicitely from
      credentials if any have been provided in the url.
      
      * bzrlib/transport/http/_urllib.py:
      (HttpTransport_urllib._remote_path): Deleted, pushed to base class.
      (HttpTransport_urllib._perform): Simplified.
      
      * bzrlib/transport/http/_urllib2_wrappers.py:
      (AbstractAuthHandler._build_password_prompt): Fix typo.
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/tests/test_http.py      testhttp.py-20051018020158-b2eef6e867c514d9
      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
    ------------------------------------------------------------
    revno: 3111.1.23
    revision-id:v.ladeuil+lp at free.fr-20071220120730-o0nbkwl4a4o70ecs
    parent: pqm at pqm.ubuntu.com-20071220042019-wsij5vgvhgw4qhdt
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: 177643
    timestamp: Thu 2007-12-20 13:07:30 +0100
    message:
      Reproduce bug #177643.
      
      * bzrlib/tests/test_http.py: 
      Switch the tests against pycurl instead of urllib.
    modified:
      bzrlib/tests/test_http.py      testhttp.py-20051018020158-b2eef6e867c514d9
    ------------------------------------------------------------
    revno: 3111.1.22
    revision-id:pqm at pqm.ubuntu.com-20071220042019-wsij5vgvhgw4qhdt
    parent: pqm at pqm.ubuntu.com-20071220032735-fldmkfcg632g4uez
    parent: aaron.bentley at utoronto.ca-20071220024739-nyw87k23467u4q31
    committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
    branch nick: +trunk
    timestamp: Thu 2007-12-20 04:20:19 +0000
    message:
      Annotate merge can do cherrypicks (abentley)
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
      bzrlib/errors.py               errors.py-20050309040759-20512168c4e14fbd
      bzrlib/merge.py                merge.py-20050513021216-953b65a438527106
      bzrlib/tests/blackbox/test_merge.py test_merge.py-20060323225809-9bc0459c19917f41
      bzrlib/tests/test_merge.py     testmerge.py-20050905070950-c1b5aa49ff911024
      bzrlib/tree.py                 tree.py-20050309040759-9d5f2496be663e77
      bzrlib/versionedfile.py        versionedfile.py-20060222045106-5039c71ee3b65490
        ------------------------------------------------------------
        revno: 3062.1.12.1.13
        revision-id:aaron.bentley at utoronto.ca-20071220024739-nyw87k23467u4q31
        parent: aaron.bentley at utoronto.ca-20071220012542-x0y3073oc4rzw0m4
        committer: Aaron Bentley <aaron.bentley at utoronto.ca>
        branch nick: fast-plan-merge2
        timestamp: Wed 2007-12-19 21:47:39 -0500
        message:
          Update prepare_cherrypick docstring
        modified:
          bzrlib/tests/test_merge.py     testmerge.py-20050905070950-c1b5aa49ff911024
        ------------------------------------------------------------
        revno: 3062.1.12.1.12
        revision-id:aaron.bentley at utoronto.ca-20071220012542-x0y3073oc4rzw0m4
        parent: aaron.bentley at utoronto.ca-20071220005646-cfebcxoxqtpsk3uo
        committer: Aaron Bentley <aaron.bentley at utoronto.ca>
        branch nick: fast-plan-merge2
        timestamp: Wed 2007-12-19 20:25:42 -0500
        message:
          Switch to using PatienceSequenceMatcher, now that C version allows tuples
        modified:
          bzrlib/merge.py                merge.py-20050513021216-953b65a438527106
        ------------------------------------------------------------
        revno: 3062.1.12.1.11
        revision-id:aaron.bentley at utoronto.ca-20071220005646-cfebcxoxqtpsk3uo
        parent: aaron.bentley at utoronto.ca-20071210000206-r4u7wa4ox1xpnwm8
        parent: pqm at pqm.ubuntu.com-20071219234039-462zdjboqfg4lcr1
        committer: Aaron Bentley <aaron.bentley at utoronto.ca>
        branch nick: fast-plan-merge2
        timestamp: Wed 2007-12-19 19:56:46 -0500
        message:
          Merge bzr.dev
        removed:
          doc/en/user-reference/index.txt index.txt-20070830033353-ud9e03xsh24053oo-1
        added:
          bzrlib/help_topics/            help_topics-20071211013603-qz0sojhgxhiujm6a-1
          bzrlib/help_topics/en/         bzrlibhelp-20071209214431-xzg3moksichjwyts-1
          bzrlib/version_info_formats/format_custom.py format_custom.py-20071029100350-ajovqhbpb5khf6gu-1
          doc/en/user-guide/adv_merging.txt adv_merging.txt-20071213070245-d7u7150lb2hhnvby-1
          doc/en/user-reference/readme.txt readme.txt-20071211133352-guencaey6fpesv4j-1
          index.txt                      index.txt-20071121073725-0corxykv5irjal00-1
        renamed:
          bzrlib/help_topics.py => bzrlib/help_topics/__init__.py help_topics.py-20060920210027-rnim90q9e0bwxvy4-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
          bzr                            bzr.py-20050313053754-5485f144c7006fa6
          bzrlib/__init__.py             __init__.py-20050309040759-33e65acf91bbcd5d
          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/diff.py                 diff.py-20050309040759-26944fbbf2ebbf36
          bzrlib/dirstate.py             dirstate.py-20060728012006-d6mvoihjb3je9peu-1
          bzrlib/errors.py               errors.py-20050309040759-20512168c4e14fbd
          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/lockable_files.py       control_files.py-20051111201905-bb88546e799d669f
          bzrlib/merge_directive.py      merge_directive.py-20070228184838-ja62280spt1g7f4x-1
          bzrlib/osutils.py              osutils.py-20050309040759-eeaff12fbf77ac86
          bzrlib/reconfigure.py          reconfigure.py-20070908040425-6ykgo7escxhyrg9p-1
          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/repository.py           rev_storage.py-20051111201905-119e9401e46257e3
          bzrlib/revision.py             revision.py-20050309040759-e77802c08f3999d5
          bzrlib/smart/medium.py         medium.py-20061103051856-rgu2huy59fkz902q-1
          bzrlib/symbol_versioning.py    symbol_versioning.py-20060105104851-9ecf8af605d15a80
          bzrlib/tests/HttpServer.py     httpserver.py-20061012142527-m1yxdj1xazsf8d7s-1
          bzrlib/tests/TestUtil.py       TestUtil.py-20050824080200-5f70140a2d938694
          bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
          bzrlib/tests/blackbox/test_bound_branches.py test_bound_branches.py-20051109215527-2373188ad566c205
          bzrlib/tests/blackbox/test_commit.py test_commit.py-20060212094538-ae88fc861d969db0
          bzrlib/tests/blackbox/test_diff.py test_diff.py-20060110203741-aa99ac93e633d971
          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_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_send.py test_bundle.py-20060616222707-c21c8b7ea5ef57b1
          bzrlib/tests/blackbox/test_split.py test_split.py-20061008023421-qy0vdpzysh5rriu8-1
          bzrlib/tests/blackbox/test_uncommit.py test_uncommit.py-20051027212835-84944b63adae51be
          bzrlib/tests/branch_implementations/test_branch.py testbranch.py-20050711070244-121d632bc37d7253
          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_diff.py      testdiff.py-20050727164403-d1a3496ebb12e339
          bzrlib/tests/test_errors.py    test_errors.py-20060210110251-41aba2deddf936a8
          bzrlib/tests/test_extract.py   test_extract.py-20061002214140-qdnnm67q1ov6x6pd-1
          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_directive.py test_merge_directive-20070228184838-ja62280spt1g7f4x-2
          bzrlib/tests/test_msgeditor.py test_msgeditor.py-20051202041359-920315ec6011ee51
          bzrlib/tests/test_osutils.py   test_osutils.py-20051201224856-e48ee24c12182989
          bzrlib/tests/test_reconfigure.py test_reconfigure.py-20070908040425-6ykgo7escxhyrg9p-2
          bzrlib/tests/test_repository.py test_repository.py-20060131075918-65c555b881612f4d
          bzrlib/tests/test_revision.py  testrevision.py-20050804210559-46f5e1eb67b01289
          bzrlib/tests/test_selftest.py  test_selftest.py-20051202044319-c110a115d8c0456a
          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_version_info.py test_version_info.py-20051228204928-2c364e30b702b41b
          bzrlib/tests/tree_implementations/test_inv.py test_inv.py-20070312023226-0cdvk5uwhutis9vg-1
          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/version_info_formats/__init__.py generate_version_info.py-20051228204928-8358edabcddcd97e
          bzrlib/workingtree.py          workingtree.py-20050511021032-29b6ec0a681e02e3
          doc/en/mini-tutorial/index.txt index.txt-20070813141352-2u64ooqzo0or4hss-2
          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/core_concepts.txt core_concepts.txt-20071114035000-q36a9h57ps06uvnl-2
          doc/en/user-guide/hooks.txt    hooks.txt-20070829200551-7nr6e5a1io6x78uf-1
          doc/en/user-guide/http_smart_server.txt fastcgi.txt-20061005091552-rz8pva0olkxv0sd8-3
          doc/en/user-guide/index.txt    index.txt-20060622101119-tgwtdci8z769bjb9-2
          doc/en/user-guide/installing_bazaar.txt installing_bazaar.tx-20071114035000-q36a9h57ps06uvnl-4
          doc/en/user-guide/introducing_bazaar.txt introducing_bazaar.t-20071114035000-q36a9h57ps06uvnl-5
          doc/en/user-guide/plugins.txt  plugins.txt-20060314145616-525099a747f3ffdd
          doc/en/user-guide/publishing_a_branch.txt publishing_a_branch.-20071123055134-k5x4ekduci2lbn36-2
          doc/en/user-guide/reusing_a_checkout.txt reusing_a_checkout.t-20071123055134-k5x4ekduci2lbn36-3
          doc/en/user-guide/sending_changes.txt sending_changes.txt-20071123154453-dk2mjhrg1vpjm5w2-4
          doc/en/user-guide/server.txt   server.txt-20060913044801-h939fvbwzz39gf7g-1
          doc/en/user-guide/setting_up_email.txt setting_up_email.txt-20060314161707-fd242c8944346173
          doc/en/user-guide/specifying_revisions.txt specifying_revisions.txt-20060314161707-19deb139101bea33
          doc/en/user-guide/version_info.txt version_info.txt-20060921215543-gju6o5xdic8w25np-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/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: 3062.1.12.1.10
        revision-id:aaron.bentley at utoronto.ca-20071210000206-r4u7wa4ox1xpnwm8
        parent: aaron.bentley at utoronto.ca-20071209235350-qp39yk0xzx7a4f6p
        committer: Aaron Bentley <aaron.bentley at utoronto.ca>
        branch nick: fast-plan-merge2
        timestamp: Sun 2007-12-09 19:02:06 -0500
        message:
          Update NEWS
        modified:
          NEWS                           NEWS-20050323055033-4e00b5db738777ff
        ------------------------------------------------------------
        revno: 3062.1.12.1.9
        revision-id:aaron.bentley at utoronto.ca-20071209235350-qp39yk0xzx7a4f6p
        parent: aaron.bentley at utoronto.ca-20071209232413-whllotzpnbaj4hrw
        committer: Aaron Bentley <aaron.bentley at utoronto.ca>
        branch nick: fast-plan-merge2
        timestamp: Sun 2007-12-09 18:53:50 -0500
        message:
          Don't use the base if not cherrypicking
        modified:
          bzrlib/merge.py                merge.py-20050513021216-953b65a438527106
        ------------------------------------------------------------
        revno: 3062.1.12.1.8
        revision-id:aaron.bentley at utoronto.ca-20071209232413-whllotzpnbaj4hrw
        parent: aaron.bentley at utoronto.ca-20071209225847-742dknf7ywjzv5uo
        committer: Aaron Bentley <aaron.bentley at utoronto.ca>
        branch nick: fast-plan-merge2
        timestamp: Sun 2007-12-09 18:24:13 -0500
        message:
          Update remerge to use Merger.from_revision_ids
        modified:
          bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
        ------------------------------------------------------------
        revno: 3062.1.12.1.7
        revision-id:aaron.bentley at utoronto.ca-20071209225847-742dknf7ywjzv5uo
        parent: aaron.bentley at utoronto.ca-20071209205803-9puidarg2y33bpzj
        committer: Aaron Bentley <aaron.bentley at utoronto.ca>
        branch nick: fast-plan-merge2
        timestamp: Sun 2007-12-09 17:58:47 -0500
        message:
          Prevent reverse cherry-picking with weave
        modified:
          bzrlib/errors.py               errors.py-20050309040759-20512168c4e14fbd
          bzrlib/merge.py                merge.py-20050513021216-953b65a438527106
          bzrlib/tests/test_merge.py     testmerge.py-20050905070950-c1b5aa49ff911024
        ------------------------------------------------------------
        revno: 3062.1.12.1.6
        revision-id:aaron.bentley at utoronto.ca-20071209205803-9puidarg2y33bpzj
        parent: aaron.bentley at utoronto.ca-20071208010058-1vuj9qn49qfu808e
        committer: Aaron Bentley <aaron.bentley at utoronto.ca>
        branch nick: fast-plan-merge2
        timestamp: Sun 2007-12-09 15:58:03 -0500
        message:
          Get cherrypick-on-weave working
        modified:
          bzrlib/tests/blackbox/test_merge.py test_merge.py-20060323225809-9bc0459c19917f41
          bzrlib/tests/test_merge.py     testmerge.py-20050905070950-c1b5aa49ff911024
          bzrlib/tree.py                 tree.py-20050309040759-9d5f2496be663e77
        ------------------------------------------------------------
        revno: 3062.1.12.1.5
        revision-id:aaron.bentley at utoronto.ca-20071208010058-1vuj9qn49qfu808e
        parent: aaron.bentley at utoronto.ca-20071208005727-no3rg7qob9eygt86
        parent: pqm at pqm.ubuntu.com-20071207083421-7uxzmxup5kpl4w9r
        committer: Aaron Bentley <aaron.bentley at utoronto.ca>
        branch nick: fast-plan-merge2
        timestamp: Fri 2007-12-07 20:00:58 -0500
        message:
          Merge bzr.dev
        added:
          doc/en/quick-reference/quick-start-summary.pdf quickstartsummary.pd-20071207005239-it6xmdjml8nxvzgt-1
          doc/en/quick-reference/quick-start-summary.png quickstartsummary.pn-20071203142852-hsiybkmh37q5owwe-1
        modified:
          Makefile                       Makefile-20050805140406-d96e3498bb61c5bb
          NEWS                           NEWS-20050323055033-4e00b5db738777ff
          README                         README-20050309040720-8f368abf9f346b9d
          bzrlib/branch.py               branch.py-20050309040759-e4baf4e0d046576e
          bzrlib/bugtracker.py           bugtracker.py-20070410073305-vu1vu1qosjurg8kb-1
          bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
          bzrlib/config.py               config.py-20051011043216-070c74f4e9e338e8
          bzrlib/debug.py                debug.py-20061102062349-vdhrw9qdpck8cl35-1
          bzrlib/diff.py                 diff.py-20050309040759-26944fbbf2ebbf36
          bzrlib/errors.py               errors.py-20050309040759-20512168c4e14fbd
          bzrlib/graph.py                graph_walker.py-20070525030359-y852guab65d4wtn0-1
          bzrlib/help_topics.py          help_topics.py-20060920210027-rnim90q9e0bwxvy4-1
          bzrlib/log.py                  log.py-20050505065812-c40ce11702fe5fb1
          bzrlib/merge.py                merge.py-20050513021216-953b65a438527106
          bzrlib/plugins/launchpad/lp_indirect.py lp_indirect.py-20070126012204-de5rugwlt22c7u7e-1
          bzrlib/plugins/launchpad/test_lp_indirect.py test_lp_indirect.py-20070126002743-oyle362tzv9cd8mi-1
          bzrlib/remote.py               remote.py-20060720103555-yeeg2x51vn0rbtdp-1
          bzrlib/switch.py               switch.py-20071116011000-v5lnw7d2wkng9eux-1
          bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
          bzrlib/tests/blackbox/test_cat.py test_cat.py-20051201162916-f0937e4e19ea24b3
          bzrlib/tests/blackbox/test_exceptions.py test_exceptions.py-20060604211237-yi2cxg0ose3xk4id-1
          bzrlib/tests/blackbox/test_merge.py test_merge.py-20060323225809-9bc0459c19917f41
          bzrlib/tests/blackbox/test_push.py test_push.py-20060329002750-929af230d5d22663
          bzrlib/tests/branch_implementations/test_branch.py testbranch.py-20050711070244-121d632bc37d7253
          bzrlib/tests/repository_implementations/test_repository.py test_repository.py-20060131092128-ad07f494f5c9d26c
          bzrlib/tests/test_bugtracker.py test_bugtracker.py-20070410073305-vu1vu1qosjurg8kb-2
          bzrlib/tests/test_config.py    testconfig.py-20051011041908-742d0c15d8d8c8eb
          bzrlib/tests/test_diff.py      testdiff.py-20050727164403-d1a3496ebb12e339
          bzrlib/tests/test_errors.py    test_errors.py-20060210110251-41aba2deddf936a8
          bzrlib/tests/test_graph.py     test_graph_walker.py-20070525030405-enq4r60hhi9xrujc-1
          bzrlib/tests/test_log.py       testlog.py-20050728115707-1a514809d7d49309
          bzrlib/tests/test_msgeditor.py test_msgeditor.py-20051202041359-920315ec6011ee51
          bzrlib/tests/test_switch.py    test_switch.py-20071116011000-v5lnw7d2wkng9eux-2
          bzrlib/trace.py                trace.py-20050309040759-c8ed824bdcd4748a
          doc/developers/bundles.txt     bundles.txt-20070621030528-qkjnugd7iyud6ow3-1
          doc/developers/index.txt       index.txt-20070508041241-qznziunkg0nffhiw-1
          doc/developers/packrepo.txt    knitpack.txt-20071023074744-q0g5u8me8gk5zbtb-1
          doc/en/quick-reference/quick-start-summary.svg quickstartsummary.sv-20070813143223-5i7bgw7w8s7l3ae2-3
          doc/en/user-guide/bug_trackers.txt bug_trackers.txt-20070713223459-khxdlcudraii95uv-1
          doc/en/user-guide/core_concepts.txt core_concepts.txt-20071114035000-q36a9h57ps06uvnl-2
          doc/en/user-guide/introducing_bazaar.txt introducing_bazaar.t-20071114035000-q36a9h57ps06uvnl-5
          doc/en/user-guide/merging_changes.txt merging_changes.txt-20071122141511-0knao2lklsdsvb1q-3
          doc/en/user-guide/resolving_conflicts.txt resolving_conflicts.-20071122141511-0knao2lklsdsvb1q-5
          doc/en/user-guide/reusing_a_checkout.txt reusing_a_checkout.t-20071123055134-k5x4ekduci2lbn36-3
          doc/en/user-guide/undoing_mistakes.txt undoing_mistakes.txt-20071121092300-8fyacngt1w98e5mp-1
          doc/en/user-guide/working_offline_central.txt working_offline_cent-20071123055134-k5x4ekduci2lbn36-5
          doc/index.txt                  index.txt-20070813101924-07gd9i9d2jt124bf-1
        ------------------------------------------------------------
        revno: 3062.1.12.1.4
        revision-id:aaron.bentley at utoronto.ca-20071208005727-no3rg7qob9eygt86
        parent: aaron.bentley at utoronto.ca-20071204035455-9baojlvaynm0wv5f
        committer: Aaron Bentley <aaron.bentley at utoronto.ca>
        branch nick: fast-plan-merge2
        timestamp: Fri 2007-12-07 19:57:27 -0500
        message:
          Start supporting merge-with-base
        modified:
          bzrlib/merge.py                merge.py-20050513021216-953b65a438527106
          bzrlib/tests/blackbox/test_merge.py test_merge.py-20060323225809-9bc0459c19917f41
          bzrlib/tree.py                 tree.py-20050309040759-9d5f2496be663e77
        ------------------------------------------------------------
        revno: 3062.1.12.1.3
        revision-id:aaron.bentley at utoronto.ca-20071204035455-9baojlvaynm0wv5f
        parent: aaron.bentley at utoronto.ca-20071204033603-equ8y41vfk8vkway
        committer: Aaron Bentley <aaron.bentley at utoronto.ca>
        branch nick: fast-plan-merge2
        timestamp: Mon 2007-12-03 22:54:55 -0500
        message:
          Sync up with bzr.dev API changes
        modified:
          bzrlib/merge.py                merge.py-20050513021216-953b65a438527106
          bzrlib/tests/test_merge.py     testmerge.py-20050905070950-c1b5aa49ff911024
          bzrlib/versionedfile.py        versionedfile.py-20060222045106-5039c71ee3b65490
        ------------------------------------------------------------
        revno: 3062.1.12.1.2
        revision-id:aaron.bentley at utoronto.ca-20071204033603-equ8y41vfk8vkway
        parent: abentley at panoramicfeedback.com-20071203151536-b34fe60wl3nr9eln
        parent: pqm at pqm.ubuntu.com-20071204004243-cgss0sl9yf0ayepc
        committer: Aaron Bentley <aaron.bentley at utoronto.ca>
        branch nick: fast-plan-merge2
        timestamp: Mon 2007-12-03 22:36:03 -0500
        message:
          Merge bzr.dev
        removed:
          index.txt                      index.txt-20071121073725-0corxykv5irjal00-1
        modified:
          NEWS                           NEWS-20050323055033-4e00b5db738777ff
          bzrlib/branch.py               branch.py-20050309040759-e4baf4e0d046576e
          bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
          bzrlib/bundle/serializer/v4.py v10.py-20070611062757-5ggj7k18s9dej0fr-1
          bzrlib/commit.py               commit.py-20050511101309-79ec1a0168e0e825
          bzrlib/graph.py                graph_walker.py-20070525030359-y852guab65d4wtn0-1
          bzrlib/log.py                  log.py-20050505065812-c40ce11702fe5fb1
          bzrlib/merge.py                merge.py-20050513021216-953b65a438527106
          bzrlib/remote.py               remote.py-20060720103555-yeeg2x51vn0rbtdp-1
          bzrlib/repofmt/pack_repo.py    pack_repo.py-20070813041115-gjv5ma7ktfqwsjgn-1
          bzrlib/repository.py           rev_storage.py-20051111201905-119e9401e46257e3
          bzrlib/smart/medium.py         medium.py-20061103051856-rgu2huy59fkz902q-1
          bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
          bzrlib/tests/blackbox/test_commit.py test_commit.py-20060212094538-ae88fc861d969db0
          bzrlib/tests/blackbox/test_log.py test_log.py-20060112090212-78f6ea560c868e24
          bzrlib/tests/branch_implementations/test_pull.py test_pull.py-20060410103942-83c35b26657414fc
          bzrlib/tests/interrepository_implementations/__init__.py __init__.py-20060220054744-baf49a1f88f17b1a
          bzrlib/tests/interrepository_implementations/test_interrepository.py test_interrepository.py-20060220061411-1ec13fa99e5e3eee
          bzrlib/tests/repository_implementations/test_reconcile.py test_reconcile.py-20060223022332-572ef70a3288e369
          bzrlib/tests/test_graph.py     test_graph_walker.py-20070525030405-enq4r60hhi9xrujc-1
          bzrlib/tests/test_log.py       testlog.py-20050728115707-1a514809d7d49309
          bzrlib/tests/test_merge.py     testmerge.py-20050905070950-c1b5aa49ff911024
          bzrlib/tests/test_transform.py test_transaction.py-20060105172520-b3ffb3946550e6c4
          bzrlib/tests/test_versionedfile.py test_versionedfile.py-20060222045249-db45c9ed14a1c2e5
          bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
          bzrlib/transport/ssh.py        ssh.py-20060824042150-0s9787kng6zv1nwq-1
          bzrlib/tree.py                 tree.py-20050309040759-9d5f2496be663e77
          bzrlib/versionedfile.py        versionedfile.py-20060222045106-5039c71ee3b65490
        ------------------------------------------------------------
        revno: 3062.1.12.1.1
        revision-id:abentley at panoramicfeedback.com-20071203151536-b34fe60wl3nr9eln
        parent: aaron.bentley at utoronto.ca-20071203003633-pb9662ni2fwad2g0
        committer: Aaron Bentley <abentley at panoramicfeedback.com>
        branch nick: fast-plan-merge
        timestamp: Mon 2007-12-03 10:15:36 -0500
        message:
          Add support for plan-merge with a base
        modified:
          bzrlib/merge.py                merge.py-20050513021216-953b65a438527106
          bzrlib/tests/test_merge.py     testmerge.py-20050905070950-c1b5aa49ff911024
    ------------------------------------------------------------
    revno: 3111.1.21
    revision-id:pqm at pqm.ubuntu.com-20071220032735-fldmkfcg632g4uez
    parent: pqm at pqm.ubuntu.com-20071219234039-462zdjboqfg4lcr1
    parent: aaron.bentley at utoronto.ca-20071220001534-hufz1x7smg3l3en6
    committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
    branch nick: +trunk
    timestamp: Thu 2007-12-20 03:27:35 +0000
    message:
      Warn when merge directives cause cherrypicks (abentley)
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/merge.py                merge.py-20050513021216-953b65a438527106
      bzrlib/tests/blackbox/test_merge.py test_merge.py-20060323225809-9bc0459c19917f41
        ------------------------------------------------------------
        revno: 1551.2.49.1.40.1.22.1.42.1.31.1.39.1.17.1.77.1.3.1.20.1.23
        revision-id:aaron.bentley at utoronto.ca-20071220001534-hufz1x7smg3l3en6
        parent: aaron.bentley at utoronto.ca-20071215044454-43118sh0ptmkfojx
        parent: pqm at pqm.ubuntu.com-20071219234039-462zdjboqfg4lcr1
        committer: Aaron Bentley <aaron.bentley at utoronto.ca>
        branch nick: Aaron's mergeable stuff
        timestamp: Wed 2007-12-19 19:15:34 -0500
        message:
          Merge bzr.dev
        added:
          bzrlib/help_topics/            help_topics-20071211013603-qz0sojhgxhiujm6a-1
          bzrlib/help_topics/en/         bzrlibhelp-20071209214431-xzg3moksichjwyts-1
          bzrlib/version_info_formats/format_custom.py format_custom.py-20071029100350-ajovqhbpb5khf6gu-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
          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
          bzrlib/_patiencediff_c.c       _patiencediff_c.c-20070721205602-q3imkipwlgagp3cy-1
          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/diff.py                 diff.py-20050309040759-26944fbbf2ebbf36
          bzrlib/dirstate.py             dirstate.py-20060728012006-d6mvoihjb3je9peu-1
          bzrlib/errors.py               errors.py-20050309040759-20512168c4e14fbd
          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/lockable_files.py       control_files.py-20051111201905-bb88546e799d669f
          bzrlib/osutils.py              osutils.py-20050309040759-eeaff12fbf77ac86
          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/repository.py           rev_storage.py-20051111201905-119e9401e46257e3
          bzrlib/revision.py             revision.py-20050309040759-e77802c08f3999d5
          bzrlib/smart/medium.py         medium.py-20061103051856-rgu2huy59fkz902q-1
          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_diff.py test_diff.py-20060110203741-aa99ac93e633d971
          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_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_split.py test_split.py-20061008023421-qy0vdpzysh5rriu8-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_diff.py      testdiff.py-20050727164403-d1a3496ebb12e339
          bzrlib/tests/test_extract.py   test_extract.py-20061002214140-qdnnm67q1ov6x6pd-1
          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_lockable_files.py test_lockable_files.py-20051225183927-365c7fd99591caf1
          bzrlib/tests/test_msgeditor.py test_msgeditor.py-20051202041359-920315ec6011ee51
          bzrlib/tests/test_osutils.py   test_osutils.py-20051201224856-e48ee24c12182989
          bzrlib/tests/test_revision.py  testrevision.py-20050804210559-46f5e1eb67b01289
          bzrlib/tests/test_selftest.py  test_selftest.py-20051202044319-c110a115d8c0456a
          bzrlib/tests/test_version_info.py test_version_info.py-20051228204928-2c364e30b702b41b
          bzrlib/tests/tree_implementations/test_inv.py test_inv.py-20070312023226-0cdvk5uwhutis9vg-1
          bzrlib/version_info_formats/__init__.py generate_version_info.py-20051228204928-8358edabcddcd97e
          bzrlib/workingtree.py          workingtree.py-20050511021032-29b6ec0a681e02e3
          doc/en/user-guide/browsing_history.txt browsing_history.txt-20071121073725-0corxykv5irjal00-2
          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
          setup.py                       setup.py-20050314065409-02f8a0a6e3f9bc70
          tools/doc_generate/autodoc_rstx.py autodoc_rstx.py-20060420024836-3e0d4a526452193c
          bzrlib/help_topics/__init__.py help_topics.py-20060920210027-rnim90q9e0bwxvy4-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: 1551.2.49.1.40.1.22.1.42.1.31.1.39.1.17.1.77.1.3.1.20.1.22
        revision-id:aaron.bentley at utoronto.ca-20071215044454-43118sh0ptmkfojx
        parent: aaron.bentley at utoronto.ca-20071215000134-fq3wi3f9pm1k8hnu
        committer: Aaron Bentley <aaron.bentley at utoronto.ca>
        branch nick: Aaron's mergeable stuff
        timestamp: Fri 2007-12-14 23:44:54 -0500
        message:
          Add warning when merge directives cause cherrypicks
        modified:
          NEWS                           NEWS-20050323055033-4e00b5db738777ff
          bzrlib/merge.py                merge.py-20050513021216-953b65a438527106
          bzrlib/tests/blackbox/test_merge.py test_merge.py-20060323225809-9bc0459c19917f41
        ------------------------------------------------------------
        revno: 1551.2.49.1.40.1.22.1.42.1.31.1.39.1.17.1.77.1.3.1.20.1.21
        revision-id:aaron.bentley at utoronto.ca-20071215000134-fq3wi3f9pm1k8hnu
        parent: aaron.bentley at utoronto.ca-20071214044458-ce124oijzzqwj7a6
        parent: pqm at pqm.ubuntu.com-20071214163914-dqiqxlhho36ce54r
        committer: Aaron Bentley <aaron.bentley at utoronto.ca>
        branch nick: Aaron's mergeable stuff
        timestamp: Fri 2007-12-14 19:01:34 -0500
        message:
          Merge bzr.dev
        removed:
          doc/en/user-reference/index.txt index.txt-20070830033353-ud9e03xsh24053oo-1
        added:
          doc/en/quick-reference/quick-start-summary.pdf quickstartsummary.pd-20071207005239-it6xmdjml8nxvzgt-1
          doc/en/user-guide/adv_merging.txt adv_merging.txt-20071213070245-d7u7150lb2hhnvby-1
          index.txt                      index.txt-20071121073725-0corxykv5irjal00-1
        modified:
          Makefile                       Makefile-20050805140406-d96e3498bb61c5bb
          NEWS                           NEWS-20050323055033-4e00b5db738777ff
          README                         README-20050309040720-8f368abf9f346b9d
          bzr                            bzr.py-20050313053754-5485f144c7006fa6
          bzrlib/__init__.py             __init__.py-20050309040759-33e65acf91bbcd5d
          bzrlib/branch.py               branch.py-20050309040759-e4baf4e0d046576e
          bzrlib/bugtracker.py           bugtracker.py-20070410073305-vu1vu1qosjurg8kb-1
          bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
          bzrlib/diff.py                 diff.py-20050309040759-26944fbbf2ebbf36
          bzrlib/errors.py               errors.py-20050309040759-20512168c4e14fbd
          bzrlib/graph.py                graph_walker.py-20070525030359-y852guab65d4wtn0-1
          bzrlib/help_topics.py          help_topics.py-20060920210027-rnim90q9e0bwxvy4-1
          bzrlib/reconfigure.py          reconfigure.py-20070908040425-6ykgo7escxhyrg9p-1
          bzrlib/remote.py               remote.py-20060720103555-yeeg2x51vn0rbtdp-1
          bzrlib/repofmt/pack_repo.py    pack_repo.py-20070813041115-gjv5ma7ktfqwsjgn-1
          bzrlib/switch.py               switch.py-20071116011000-v5lnw7d2wkng9eux-1
          bzrlib/tests/HttpServer.py     httpserver.py-20061012142527-m1yxdj1xazsf8d7s-1
          bzrlib/tests/blackbox/test_bound_branches.py test_bound_branches.py-20051109215527-2373188ad566c205
          bzrlib/tests/blackbox/test_commit.py test_commit.py-20060212094538-ae88fc861d969db0
          bzrlib/tests/blackbox/test_exceptions.py test_exceptions.py-20060604211237-yi2cxg0ose3xk4id-1
          bzrlib/tests/blackbox/test_send.py test_bundle.py-20060616222707-c21c8b7ea5ef57b1
          bzrlib/tests/blackbox/test_uncommit.py test_uncommit.py-20051027212835-84944b63adae51be
          bzrlib/tests/branch_implementations/test_branch.py testbranch.py-20050711070244-121d632bc37d7253
          bzrlib/tests/repository_implementations/test_repository.py test_repository.py-20060131092128-ad07f494f5c9d26c
          bzrlib/tests/test_diff.py      testdiff.py-20050727164403-d1a3496ebb12e339
          bzrlib/tests/test_errors.py    test_errors.py-20060210110251-41aba2deddf936a8
          bzrlib/tests/test_http.py      testhttp.py-20051018020158-b2eef6e867c514d9
          bzrlib/tests/test_http_response.py test_http_response.py-20060628233143-950b2a482a32505d
          bzrlib/tests/test_reconfigure.py test_reconfigure.py-20070908040425-6ykgo7escxhyrg9p-2
          bzrlib/tests/test_repository.py test_repository.py-20060131075918-65c555b881612f4d
          bzrlib/tests/test_revision.py  testrevision.py-20050804210559-46f5e1eb67b01289
          bzrlib/tests/test_switch.py    test_switch.py-20071116011000-v5lnw7d2wkng9eux-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/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
          doc/en/mini-tutorial/index.txt index.txt-20070813141352-2u64ooqzo0or4hss-2
          doc/en/user-guide/authentication_conf.txt authentication_conf.-20071104135035-glfv0ri355tyg1nf-1
          doc/en/user-guide/bug_trackers.txt bug_trackers.txt-20070713223459-khxdlcudraii95uv-1
          doc/en/user-guide/configuration.txt configuration.txt-20060314161707-868350809502af01
          doc/en/user-guide/core_concepts.txt core_concepts.txt-20071114035000-q36a9h57ps06uvnl-2
          doc/en/user-guide/http_smart_server.txt fastcgi.txt-20061005091552-rz8pva0olkxv0sd8-3
          doc/en/user-guide/index.txt    index.txt-20060622101119-tgwtdci8z769bjb9-2
          doc/en/user-guide/installing_bazaar.txt installing_bazaar.tx-20071114035000-q36a9h57ps06uvnl-4
          doc/en/user-guide/plugins.txt  plugins.txt-20060314145616-525099a747f3ffdd
          doc/en/user-guide/publishing_a_branch.txt publishing_a_branch.-20071123055134-k5x4ekduci2lbn36-2
          doc/en/user-guide/reusing_a_checkout.txt reusing_a_checkout.t-20071123055134-k5x4ekduci2lbn36-3
          doc/en/user-guide/server.txt   server.txt-20060913044801-h939fvbwzz39gf7g-1
          doc/en/user-guide/setting_up_email.txt setting_up_email.txt-20060314161707-fd242c8944346173
          doc/en/user-guide/specifying_revisions.txt specifying_revisions.txt-20060314161707-19deb139101bea33
          doc/en/user-guide/version_info.txt version_info.txt-20060921215543-gju6o5xdic8w25np-1
          doc/index.txt                  index.txt-20070813101924-07gd9i9d2jt124bf-1
          tools/doc_generate/autodoc_rstx.py autodoc_rstx.py-20060420024836-3e0d4a526452193c
          tools/rst2html.py              rst2html.py-20060817120932-gn177u8v0008txhu-1
    ------------------------------------------------------------
    revno: 3111.1.20
    revision-id:pqm at pqm.ubuntu.com-20071219234039-462zdjboqfg4lcr1
    parent: pqm at pqm.ubuntu.com-20071219211725-mgnpnt2keboqflwi
    parent: john at arbash-meinel.com-20071219224427-iovj1ha49yuo2rjf
    committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
    branch nick: +trunk
    timestamp: Wed 2007-12-19 23:40:39 +0000
    message:
      (jam) allow _patience_diff_c to support any object that supports
      	hash()
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/_patiencediff_c.c       _patiencediff_c.c-20070721205602-q3imkipwlgagp3cy-1
      bzrlib/tests/test_diff.py      testdiff.py-20050727164403-d1a3496ebb12e339
        ------------------------------------------------------------
        revno: 3074.2.12
        revision-id:john at arbash-meinel.com-20071219224427-iovj1ha49yuo2rjf
        parent: john at arbash-meinel.com-20071219223929-l239ac2atqdcapb8
        committer: John Arbash Meinel <john at arbash-meinel.com>
        branch nick: patience_tuples
        timestamp: Wed 2007-12-19 16:44:27 -0600
        message:
          NEWS
        modified:
          NEWS                           NEWS-20050323055033-4e00b5db738777ff
        ------------------------------------------------------------
        revno: 3074.2.11
        revision-id:john at arbash-meinel.com-20071219223929-l239ac2atqdcapb8
        parent: john at arbash-meinel.com-20071219164503-dxzdtrm0i3jet9ea
        parent: pqm at pqm.ubuntu.com-20071219091053-81xgp971m1pgmccf
        committer: John Arbash Meinel <john at arbash-meinel.com>
        branch nick: patience_tuples
        timestamp: Wed 2007-12-19 16:39:29 -0600
        message:
          [merge] bzr.dev 3129
        removed:
          doc/en/user-reference/index.txt index.txt-20070830033353-ud9e03xsh24053oo-1
        added:
          bzrlib/help_topics/            help_topics-20071211013603-qz0sojhgxhiujm6a-1
          bzrlib/help_topics/en/         bzrlibhelp-20071209214431-xzg3moksichjwyts-1
          bzrlib/version_info_formats/format_custom.py format_custom.py-20071029100350-ajovqhbpb5khf6gu-1
          doc/en/quick-reference/quick-start-summary.pdf quickstartsummary.pd-20071207005239-it6xmdjml8nxvzgt-1
          doc/en/quick-reference/quick-start-summary.png quickstartsummary.pn-20071203142852-hsiybkmh37q5owwe-1
          doc/en/user-guide/adv_merging.txt adv_merging.txt-20071213070245-d7u7150lb2hhnvby-1
          doc/en/user-reference/readme.txt readme.txt-20071211133352-guencaey6fpesv4j-1
          index.txt                      index.txt-20071121073725-0corxykv5irjal00-1
        renamed:
          bzrlib/help_topics.py => bzrlib/help_topics/__init__.py help_topics.py-20060920210027-rnim90q9e0bwxvy4-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
          bzr                            bzr.py-20050313053754-5485f144c7006fa6
          bzrlib/__init__.py             __init__.py-20050309040759-33e65acf91bbcd5d
          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/config.py               config.py-20051011043216-070c74f4e9e338e8
          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/graph.py                graph_walker.py-20070525030359-y852guab65d4wtn0-1
          bzrlib/index.py                index.py-20070712131115-lolkarso50vjr64s-1
          bzrlib/inventory.py            inventory.py-20050309040759-6648b84ca2005b37
          bzrlib/lockable_files.py       control_files.py-20051111201905-bb88546e799d669f
          bzrlib/log.py                  log.py-20050505065812-c40ce11702fe5fb1
          bzrlib/merge.py                merge.py-20050513021216-953b65a438527106
          bzrlib/merge_directive.py      merge_directive.py-20070228184838-ja62280spt1g7f4x-1
          bzrlib/osutils.py              osutils.py-20050309040759-eeaff12fbf77ac86
          bzrlib/plugins/launchpad/lp_indirect.py lp_indirect.py-20070126012204-de5rugwlt22c7u7e-1
          bzrlib/plugins/launchpad/test_lp_indirect.py test_lp_indirect.py-20070126002743-oyle362tzv9cd8mi-1
          bzrlib/reconfigure.py          reconfigure.py-20070908040425-6ykgo7escxhyrg9p-1
          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/repository.py           rev_storage.py-20051111201905-119e9401e46257e3
          bzrlib/revision.py             revision.py-20050309040759-e77802c08f3999d5
          bzrlib/smart/medium.py         medium.py-20061103051856-rgu2huy59fkz902q-1
          bzrlib/switch.py               switch.py-20071116011000-v5lnw7d2wkng9eux-1
          bzrlib/symbol_versioning.py    symbol_versioning.py-20060105104851-9ecf8af605d15a80
          bzrlib/tests/HttpServer.py     httpserver.py-20061012142527-m1yxdj1xazsf8d7s-1
          bzrlib/tests/TestUtil.py       TestUtil.py-20050824080200-5f70140a2d938694
          bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
          bzrlib/tests/blackbox/test_bound_branches.py test_bound_branches.py-20051109215527-2373188ad566c205
          bzrlib/tests/blackbox/test_cat.py test_cat.py-20051201162916-f0937e4e19ea24b3
          bzrlib/tests/blackbox/test_commit.py test_commit.py-20060212094538-ae88fc861d969db0
          bzrlib/tests/blackbox/test_diff.py test_diff.py-20060110203741-aa99ac93e633d971
          bzrlib/tests/blackbox/test_exceptions.py test_exceptions.py-20060604211237-yi2cxg0ose3xk4id-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_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_push.py test_push.py-20060329002750-929af230d5d22663
          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_uncommit.py test_uncommit.py-20051027212835-84944b63adae51be
          bzrlib/tests/branch_implementations/test_branch.py testbranch.py-20050711070244-121d632bc37d7253
          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_bugtracker.py test_bugtracker.py-20070410073305-vu1vu1qosjurg8kb-2
          bzrlib/tests/test_config.py    testconfig.py-20051011041908-742d0c15d8d8c8eb
          bzrlib/tests/test_diff.py      testdiff.py-20050727164403-d1a3496ebb12e339
          bzrlib/tests/test_errors.py    test_errors.py-20060210110251-41aba2deddf936a8
          bzrlib/tests/test_extract.py   test_extract.py-20061002214140-qdnnm67q1ov6x6pd-1
          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_log.py       testlog.py-20050728115707-1a514809d7d49309
          bzrlib/tests/test_merge_directive.py test_merge_directive-20070228184838-ja62280spt1g7f4x-2
          bzrlib/tests/test_msgeditor.py test_msgeditor.py-20051202041359-920315ec6011ee51
          bzrlib/tests/test_osutils.py   test_osutils.py-20051201224856-e48ee24c12182989
          bzrlib/tests/test_reconfigure.py test_reconfigure.py-20070908040425-6ykgo7escxhyrg9p-2
          bzrlib/tests/test_repository.py test_repository.py-20060131075918-65c555b881612f4d
          bzrlib/tests/test_revision.py  testrevision.py-20050804210559-46f5e1eb67b01289
          bzrlib/tests/test_selftest.py  test_selftest.py-20051202044319-c110a115d8c0456a
          bzrlib/tests/test_switch.py    test_switch.py-20071116011000-v5lnw7d2wkng9eux-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_version_info.py test_version_info.py-20051228204928-2c364e30b702b41b
          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/version_info_formats/__init__.py generate_version_info.py-20051228204928-8358edabcddcd97e
          bzrlib/workingtree.py          workingtree.py-20050511021032-29b6ec0a681e02e3
          doc/developers/bundles.txt     bundles.txt-20070621030528-qkjnugd7iyud6ow3-1
          doc/developers/index.txt       index.txt-20070508041241-qznziunkg0nffhiw-1
          doc/developers/packrepo.txt    knitpack.txt-20071023074744-q0g5u8me8gk5zbtb-1
          doc/en/mini-tutorial/index.txt index.txt-20070813141352-2u64ooqzo0or4hss-2
          doc/en/quick-reference/quick-start-summary.svg quickstartsummary.sv-20070813143223-5i7bgw7w8s7l3ae2-3
          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/core_concepts.txt core_concepts.txt-20071114035000-q36a9h57ps06uvnl-2
          doc/en/user-guide/hooks.txt    hooks.txt-20070829200551-7nr6e5a1io6x78uf-1
          doc/en/user-guide/http_smart_server.txt fastcgi.txt-20061005091552-rz8pva0olkxv0sd8-3
          doc/en/user-guide/index.txt    index.txt-20060622101119-tgwtdci8z769bjb9-2
          doc/en/user-guide/installing_bazaar.txt installing_bazaar.tx-20071114035000-q36a9h57ps06uvnl-4
          doc/en/user-guide/introducing_bazaar.txt introducing_bazaar.t-20071114035000-q36a9h57ps06uvnl-5
          doc/en/user-guide/merging_changes.txt merging_changes.txt-20071122141511-0knao2lklsdsvb1q-3
          doc/en/user-guide/plugins.txt  plugins.txt-20060314145616-525099a747f3ffdd
          doc/en/user-guide/publishing_a_branch.txt publishing_a_branch.-20071123055134-k5x4ekduci2lbn36-2
          doc/en/user-guide/resolving_conflicts.txt resolving_conflicts.-20071122141511-0knao2lklsdsvb1q-5
          doc/en/user-guide/reusing_a_checkout.txt reusing_a_checkout.t-20071123055134-k5x4ekduci2lbn36-3
          doc/en/user-guide/sending_changes.txt sending_changes.txt-20071123154453-dk2mjhrg1vpjm5w2-4
          doc/en/user-guide/server.txt   server.txt-20060913044801-h939fvbwzz39gf7g-1
          doc/en/user-guide/setting_up_email.txt setting_up_email.txt-20060314161707-fd242c8944346173
          doc/en/user-guide/specifying_revisions.txt specifying_revisions.txt-20060314161707-19deb139101bea33
          doc/en/user-guide/undoing_mistakes.txt undoing_mistakes.txt-20071121092300-8fyacngt1w98e5mp-1
          doc/en/user-guide/version_info.txt version_info.txt-20060921215543-gju6o5xdic8w25np-1
          doc/en/user-guide/working_offline_central.txt working_offline_cent-20071123055134-k5x4ekduci2lbn36-5
          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/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: 3074.2.10
        revision-id:john at arbash-meinel.com-20071219164503-dxzdtrm0i3jet9ea
        parent: john at arbash-meinel.com-20071219154004-wjlljom34fzjw8ws
        committer: John Arbash Meinel <john at arbash-meinel.com>
        branch nick: patience_tuples
        timestamp: Wed 2007-12-19 10:45:03 -0600
        message:
          Cleanup the test cases (Andrew)
        modified:
          bzrlib/tests/test_diff.py      testdiff.py-20050727164403-d1a3496ebb12e339
        ------------------------------------------------------------
        revno: 3074.2.9
        revision-id:john at arbash-meinel.com-20071219154004-wjlljom34fzjw8ws
        parent: john at arbash-meinel.com-20071219151157-stcd2kh9chb4qo61
        committer: John Arbash Meinel <john at arbash-meinel.com>
        branch nick: patience_tuples
        timestamp: Wed 2007-12-19 09:40:04 -0600
        message:
          Large simplification by ignoring len() and just sticking with py objects.
        modified:
          bzrlib/_patiencediff_c.c       _patiencediff_c.c-20070721205602-q3imkipwlgagp3cy-1
        ------------------------------------------------------------
        revno: 3074.2.8
        revision-id:john at arbash-meinel.com-20071219151157-stcd2kh9chb4qo61
        parent: john at arbash-meinel.com-20071205140908-d02s0wgd2wssygwv
        committer: John Arbash Meinel <john at arbash-meinel.com>
        branch nick: patience_tuples
        timestamp: Wed 2007-12-19 09:11:57 -0600
        message:
          Stop using const, since PyObject_Compare doesn't like it. (Lukáš)
        modified:
          bzrlib/_patiencediff_c.c       _patiencediff_c.c-20070721205602-q3imkipwlgagp3cy-1
        ------------------------------------------------------------
        revno: 3074.2.7
        revision-id:john at arbash-meinel.com-20071205140908-d02s0wgd2wssygwv
        parent: john at arbash-meinel.com-20071205140005-aexhlajexv5r1w3l
        committer: John Arbash Meinel <john at arbash-meinel.com>
        branch nick: patience_tuples
        timestamp: Wed 2007-12-05 08:09:08 -0600
        message:
          Using just PyObject_Compare: 3.6s-3.9s
        modified:
          bzrlib/_patiencediff_c.c       _patiencediff_c.c-20070721205602-q3imkipwlgagp3cy-1
        ------------------------------------------------------------
        revno: 3074.2.6
        revision-id:john at arbash-meinel.com-20071205140005-aexhlajexv5r1w3l
        parent: john at arbash-meinel.com-20071205134925-4s1wo9k920cbnavb
        committer: John Arbash Meinel <john at arbash-meinel.com>
        branch nick: patience_tuples
        timestamp: Wed 2007-12-05 08:00:05 -0600
        message:
          The numbers are a bit noisy...
          Using djb2 hash and memcmp/PyObject_Compare ranges from: 3.5s-4.1s
          Using original code ranges from: 3.9s-4.1s
        modified:
          bzrlib/_patiencediff_c.c       _patiencediff_c.c-20070721205602-q3imkipwlgagp3cy-1
        ------------------------------------------------------------
        revno: 3074.2.5
        revision-id:john at arbash-meinel.com-20071205134925-4s1wo9k920cbnavb
        parent: john at arbash-meinel.com-20071204170735-1l5oc5vt7w473qds
        committer: John Arbash Meinel <john at arbash-meinel.com>
        branch nick: patience_tuples
        timestamp: Wed 2007-12-05 07:49:25 -0600
        message:
          using PyObject_Hash, but memcmp if both sides are strings
          Using original djb2 hash and only handling strings: 4.340s
          With PyObject_Hash and memcmp/PyObject_Compare: 5.550s :(
        modified:
          bzrlib/_patiencediff_c.c       _patiencediff_c.c-20070721205602-q3imkipwlgagp3cy-1
        ------------------------------------------------------------
        revno: 3074.2.4
        revision-id:john at arbash-meinel.com-20071204170735-1l5oc5vt7w473qds
        parent: john at arbash-meinel.com-20071204162828-chfnl5ylzkh0y2ll
        committer: John Arbash Meinel <john at arbash-meinel.com>
        branch nick: patience_tuples
        timestamp: Tue 2007-12-04 11:07:35 -0600
        message:
          Don't leak references to the sequence object.
        modified:
          bzrlib/_patiencediff_c.c       _patiencediff_c.c-20070721205602-q3imkipwlgagp3cy-1
        ------------------------------------------------------------
        revno: 3074.2.3
        revision-id:john at arbash-meinel.com-20071204162828-chfnl5ylzkh0y2ll
        parent: john at arbash-meinel.com-20071204160709-mmzmchn2daf0quma
        committer: John Arbash Meinel <john at arbash-meinel.com>
        branch nick: patience_tuples
        timestamp: Tue 2007-12-04 10:28:28 -0600
        message:
          Enable some error checking, and small amount of code cleanup.
          If PyObject_Hash() or PyObject_Length() fails, we should raise an exception, not
          silently swallow it.
        modified:
          bzrlib/_patiencediff_c.c       _patiencediff_c.c-20070721205602-q3imkipwlgagp3cy-1
          bzrlib/tests/test_diff.py      testdiff.py-20050727164403-d1a3496ebb12e339
        ------------------------------------------------------------
        revno: 3074.2.2
        revision-id:john at arbash-meinel.com-20071204160709-mmzmchn2daf0quma
        parent: john at arbash-meinel.com-20071204152439-hlj4y6a8a2fb6nkz
        committer: John Arbash Meinel <john at arbash-meinel.com>
        branch nick: patience_tuples
        timestamp: Tue 2007-12-04 10:07:09 -0600
        message:
          Simple cleanup.
        modified:
          bzrlib/_patiencediff_c.c       _patiencediff_c.c-20070721205602-q3imkipwlgagp3cy-1
        ------------------------------------------------------------
        revno: 3074.2.1
        revision-id:john at arbash-meinel.com-20071204152439-hlj4y6a8a2fb6nkz
        parent: pqm at pqm.ubuntu.com-20071204035213-2kot5u403spjchen
        committer: John Arbash Meinel <john at arbash-meinel.com>
        branch nick: patience_tuples
        timestamp: Tue 2007-12-04 09:24:39 -0600
        message:
          Change the C PatienceDiff implementation to support arbitrary objects.
        modified:
          bzrlib/_patiencediff_c.c       _patiencediff_c.c-20070721205602-q3imkipwlgagp3cy-1
          bzrlib/tests/test_diff.py      testdiff.py-20050727164403-d1a3496ebb12e339
    ------------------------------------------------------------
    revno: 3111.1.19
    revision-id:pqm at pqm.ubuntu.com-20071219211725-mgnpnt2keboqflwi
    parent: pqm at pqm.ubuntu.com-20071219091053-81xgp971m1pgmccf
    parent: abentley at panoramicfeedback.com-20071219201946-stemyt7hujf76w7p
    committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
    branch nick: +trunk
    timestamp: Wed 2007-12-19 21:17:25 +0000
    message:
      Sort diff results alphabetically
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/diff.py                 diff.py-20050309040759-26944fbbf2ebbf36
      bzrlib/tests/test_diff.py      testdiff.py-20050727164403-d1a3496ebb12e339
    ------------------------------------------------------------
    revno: 3111.1.12.4.3
    revision-id:abentley at panoramicfeedback.com-20071219201946-stemyt7hujf76w7p
    parent: abentley at panoramicfeedback.com-20071219154601-c530qweqgev4z7x5
    committer: Aaron Bentley <abentley at panoramicfeedback.com>
    branch nick: no-inventory2
    timestamp: Wed 2007-12-19 15:19:46 -0500
    message:
      Tweak path handling
    modified:
      bzrlib/diff.py                 diff.py-20050309040759-26944fbbf2ebbf36
    ------------------------------------------------------------
    revno: 3111.1.12.4.2
    revision-id:abentley at panoramicfeedback.com-20071219154601-c530qweqgev4z7x5
    parent: aaron.bentley at utoronto.ca-20071218041534-w9spqi20zck44bvd
    committer: Aaron Bentley <abentley at panoramicfeedback.com>
    branch nick: no-inventory2
    timestamp: Wed 2007-12-19 10:46:01 -0500
    message:
      Handle diff with property change correctly
    modified:
      bzrlib/diff.py                 diff.py-20050309040759-26944fbbf2ebbf36
    ------------------------------------------------------------
    revno: 3111.1.12.4.1
    revision-id:aaron.bentley at utoronto.ca-20071218041534-w9spqi20zck44bvd
    parent: pqm at pqm.ubuntu.com-20071217234754-hzi1en08nilnvh6s
    committer: Aaron Bentley <aaron.bentley at utoronto.ca>
    branch nick: no-inventory2
    timestamp: Mon 2007-12-17 23:15:34 -0500
    message:
      Diff sorts files in alphabetical order
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/diff.py                 diff.py-20050309040759-26944fbbf2ebbf36
      bzrlib/tests/test_diff.py      testdiff.py-20050727164403-d1a3496ebb12e339
-------------- next part --------------
=== modified file 'NEWS'
--- a/NEWS	2007-12-19 08:06:07 +0000
+++ b/NEWS	2007-12-20 14:14:21 +0000
@@ -21,6 +21,8 @@
 
   IMPROVEMENTS:
 
+   * ``bzr diff`` now sorts files in alphabetical order.  (Aaron Bentley)
+
    * ``bzr diff`` now works on branches without working trees. Tree-less
      branches can also be compared to each other and to working trees using
      the new diff options ``--old`` and ``--new``. Diffing between branches,
@@ -34,10 +36,16 @@
    * Merge directives now fetch prerequisites from the target branch if
      needed.  (Aaron Bentley)
 
+   * pycurl now handles digest authentication.
+     (Vincent Ladeuil)
+
    * ``reconfigure`` can now convert from repositories.  (Aaron Bentley)
 
    * ``-l`` is now a short form for ``--limit`` in ``log``.  (Matt Nordhoff)
 
+   * ``merge`` now warns when merge directives cause cherrypicks.
+     (Aaron Bentley)
+
    * ``split`` now supported, to enable splitting large trees into smaller
      pieces.  (Aaron Bentley)
 
@@ -49,6 +57,10 @@
    * Fix traceback when sending large response bodies over the smart protocol
      on Windows. (Andrew Bennetts, #115781)
 
+   * pycurl authentication handling was broken and incomplete. Fix handling of
+     user:pass embedded in the urls.
+     (Vincent Ladeuil, #177643)
+
    * Transform failures no longer cause ImmortalLimbo errors (Aaron Bentley,
      #137681)
 
@@ -81,6 +93,9 @@
       dictionary instead of ``get_parents`` returning a list.
       ``get_parents`` is now considered deprecated.  (John Arbash Meinel)
 
+    * Patience Diff now supports arbitrary python objects, as long as they
+      support ``hash()``. (John Arbash Meinel)
+
   API BREAKS:
 
   TESTING:
@@ -181,6 +196,9 @@
 
    * Added a --coverage option to selftest. (Andrew Bennetts)
 
+   * Annotate merge (merge-type=weave) now supports cherrypicking.
+     (Aaron Bentley)
+
    * ``bzr commit`` now doesn't print the revision number twice. (Matt
      Nordhoff, #172612)
 

=== modified file 'bzrlib/_patiencediff_c.c'
--- a/bzrlib/_patiencediff_c.c	2007-09-04 09:10:35 +0000
+++ b/bzrlib/_patiencediff_c.c	2007-12-19 15:40:04 +0000
@@ -70,11 +70,10 @@
 
 
 struct line {
-    int hash;          /* hash code of the string */
+    long hash;         /* hash code of the string/object */
     Py_ssize_t next;   /* next line from the same equivalence class */
     Py_ssize_t equiv;  /* equivalence class */
-    Py_ssize_t len;
-    const char *data;
+    PyObject *data;
 };
 
 
@@ -151,8 +150,8 @@
 static inline int
 compare_lines(struct line *a, struct line *b)
 {
-    return ((a->hash != b->hash) || (a->len != b->len) ||
-            memcmp(a->data, b->data, a->len));
+    return ((a->hash != b->hash)
+            || PyObject_Compare(a->data, b->data));
 }
 
 
@@ -545,9 +544,7 @@
 static Py_ssize_t
 load_lines(PyObject *orig, struct line **lines)
 {
-    Py_ssize_t size, i, j;
-    int h;
-    char *p;
+    Py_ssize_t size, i;
     struct line *line;
     PyObject *seq, *item;
 
@@ -571,29 +568,18 @@
 
     for (i = 0; i < size; i++) {
         item = PySequence_Fast_GET_ITEM(seq, i);
-        if (!PyString_Check(item)){
-            PyErr_Format(PyExc_TypeError,
-                     "sequence item %zd: expected string,"
-                     " %.80s found",
-                     i, item->ob_type->tp_name);
-            Py_DECREF(seq);
-            return -1;
+        line->data = item;
+        line->hash = PyObject_Hash(item);
+        if (line->hash == (-1)) {
+            /* Propogate the hash exception */
+            size = -1;
+            goto cleanup;
         }
-        line->len = PyString_GET_SIZE(item);
-        line->data = p = PyString_AS_STRING(item);
-        /* 'djb2' hash. This gives us a nice compromise between fast hash
-            function and a hash with less collisions. The algorithm doesn't
-            use the hash for actual lookups, only for building the table
-            so a better hash function wouldn't bring us much benefit, but
-            would make this loading code slower. */
-        h = 5381;
-        for (j = 0; j < line->len; j++)
-            h = ((h << 5) + h) + *p++;
-        line->hash = h;
         line->next = SENTINEL;
         line++;
     }
 
+    cleanup:
     Py_DECREF(seq);
     return size;
 }

=== modified file 'bzrlib/builtins.py'
--- a/bzrlib/builtins.py	2007-12-19 06:04:19 +0000
+++ b/bzrlib/builtins.py	2007-12-20 00:56:46 +0000
@@ -3023,10 +3023,6 @@
                                              " merges.  Not cherrypicking or"
                                              " multi-merges.")
             repository = tree.branch.repository
-            graph = repository.get_graph()
-            base_revision = graph.find_unique_lca(parents[0], parents[1])
-            base_tree = repository.revision_tree(base_revision)
-            other_tree = repository.revision_tree(parents[1])
             interesting_ids = None
             new_conflicts = []
             conflicts = tree.conflicts()
@@ -3062,18 +3058,19 @@
             # list, we imply that the working tree text has seen and rejected
             # all the changes from the other tree, when in fact those changes
             # have not yet been seen.
+            pb = ui.ui_factory.nested_progress_bar()
             tree.set_parent_ids(parents[:1])
             try:
-                conflicts = _mod_merge.merge_inner(
-                                          tree.branch, other_tree, base_tree,
-                                          this_tree=tree,
-                                          interesting_ids=interesting_ids,
-                                          other_rev_id=parents[1],
-                                          merge_type=merge_type,
-                                          show_base=show_base,
-                                          reprocess=reprocess)
+                merger = _mod_merge.Merger.from_revision_ids(pb,
+                                                             tree, parents[1])
+                merger.interesting_ids = interesting_ids
+                merger.merge_type = merge_type
+                merger.show_base = show_base
+                merger.reprocess = reprocess
+                conflicts = merger.do_merge()
             finally:
                 tree.set_parent_ids(parents)
+                pb.finished()
         finally:
             tree.unlock()
         if conflicts > 0:

=== modified file 'bzrlib/diff.py'
--- a/bzrlib/diff.py	2007-12-18 15:22:47 +0000
+++ b/bzrlib/diff.py	2007-12-19 21:17:25 +0000
@@ -813,45 +813,52 @@
         """
         # TODO: Generation of pseudo-diffs for added/deleted files could
         # be usefully made into a much faster special case.
-
-        delta = self.new_tree.changes_from(self.old_tree,
-            specific_files=specific_files,
-            extra_trees=extra_trees, require_versioned=True)
-
+        iterator = self.new_tree._iter_changes(self.old_tree,
+                                               specific_files=specific_files,
+                                               extra_trees=extra_trees,
+                                               require_versioned=True)
         has_changes = 0
-        for path, file_id, kind in delta.removed:
-            has_changes = 1
-            path_encoded = path.encode(self.path_encoding, "replace")
-            self.to_file.write("=== removed %s '%s'\n" % (kind, path_encoded))
-            self.diff(file_id, path, path)
-
-        for path, file_id, kind in delta.added:
-            has_changes = 1
-            path_encoded = path.encode(self.path_encoding, "replace")
-            self.to_file.write("=== added %s '%s'\n" % (kind, path_encoded))
-            self.diff(file_id, path, path)
-        for (old_path, new_path, file_id, kind,
-             text_modified, meta_modified) in delta.renamed:
-            has_changes = 1
-            prop_str = get_prop_change(meta_modified)
-            oldpath_encoded = old_path.encode(self.path_encoding, "replace")
-            newpath_encoded = new_path.encode(self.path_encoding, "replace")
-            self.to_file.write("=== renamed %s '%s' => '%s'%s\n" % (kind,
-                                oldpath_encoded, newpath_encoded, prop_str))
-            if text_modified:
-                self.diff(file_id, old_path, new_path)
-        for path, file_id, kind, text_modified, meta_modified in\
-            delta.modified:
-            has_changes = 1
-            prop_str = get_prop_change(meta_modified)
-            path_encoded = path.encode(self.path_encoding, "replace")
-            self.to_file.write("=== modified %s '%s'%s\n" % (kind,
-                                path_encoded, prop_str))
-            # The file may be in a different location in the old tree (because
-            # the containing dir was renamed, but the file itself was not)
-            if text_modified:
-                old_path = self.old_tree.id2path(file_id)
-                self.diff(file_id, old_path, path)
+        def changes_key(change):
+            old_path, new_path = change[1]
+            path = new_path
+            if path is None:
+                path = old_path
+            return path
+        def get_encoded_path(path):
+            if path is not None:
+                return path.encode(self.path_encoding, "replace")
+        for (file_id, paths, changed_content, versioned, parent, name, kind,
+             executable) in sorted(iterator, key=changes_key):
+            if parent == (None, None):
+                continue
+            oldpath, newpath = paths
+            oldpath_encoded = get_encoded_path(paths[0])
+            newpath_encoded = get_encoded_path(paths[1])
+            old_present = (kind[0] is not None and versioned[0])
+            new_present = (kind[1] is not None and versioned[1])
+            renamed = (parent[0], name[0]) != (parent[1], name[1])
+            prop_str = get_prop_change(executable[0] != executable[1])
+            if (old_present, new_present) == (True, False):
+                self.to_file.write("=== removed %s '%s'\n" %
+                                   (kind[0], oldpath_encoded))
+                newpath = oldpath
+            elif (old_present, new_present) == (False, True):
+                self.to_file.write("=== added %s '%s'\n" %
+                                   (kind[1], newpath_encoded))
+                oldpath = newpath
+            elif renamed:
+                self.to_file.write("=== renamed %s '%s' => '%s'%s\n" %
+                    (kind[0], oldpath_encoded, newpath_encoded, prop_str))
+            else:
+                # if it was produced by _iter_changes, it must be
+                # modified *somehow*, either content or execute bit.
+                self.to_file.write("=== modified %s '%s'%s\n" % (kind[0],
+                                   newpath_encoded, prop_str))
+            if changed_content:
+                self.diff(file_id, oldpath, newpath)
+                has_changes = 1
+            if renamed:
+                has_changes = 1
         return has_changes
 
     def diff(self, file_id, old_path, new_path):

=== modified file 'bzrlib/errors.py'
--- a/bzrlib/errors.py	2007-12-17 17:28:25 +0000
+++ b/bzrlib/errors.py	2007-12-20 00:56:46 +0000
@@ -1101,6 +1101,12 @@
             " no merge base revision was specified.")
 
 
+class CannotReverseCherrypick(BzrError):
+
+    _fmt = ('Selected merge cannot perform reverse cherrypicks.  Try merge3'
+            ' or diff3.')
+
+
 class NoCommonAncestor(BzrError):
     
     _fmt = "Revisions have no common ancestor: %(revision_a)s %(revision_b)s"

=== modified file 'bzrlib/merge.py'
--- a/bzrlib/merge.py	2007-12-06 17:52:30 +0000
+++ b/bzrlib/merge.py	2007-12-20 04:20:19 +0000
@@ -119,6 +119,8 @@
             tree.branch.repository.get_graph().is_ancestor(
             base_revision_id, tree.branch.last_revision())):
             base_revision_id = None
+        else:
+            warning('Performing cherrypick')
         merger = klass.from_revision_ids(pb, tree, other_revision_id,
                                          base_revision_id)
         return merger, verified
@@ -368,6 +370,12 @@
         elif self.show_base:
             raise BzrError("Showing base is not supported for this"
                                   " merge type. %s" % self.merge_type)
+        if (not getattr(self.merge_type, 'supports_reverse_cherrypick', True)
+            and not self.base_is_other_ancestor):
+            raise errors.CannotReverseCherrypick()
+        if self.merge_type.history_based:
+            kwargs['cherrypick'] = (not self.base_is_ancestor or
+                                    not self.base_is_other_ancestor)
         self.this_tree.lock_tree_write()
         if self.base_tree is not None:
             self.base_tree.lock_read()
@@ -415,6 +423,7 @@
     supports_reprocess = True
     supports_show_base = True
     history_based = False
+    supports_reverse_cherrypick = True
     winner_idx = {"this": 2, "other": 1, "conflict": 1}
 
     def __init__(self, working_tree, this_tree, base_tree, other_tree, 
@@ -977,11 +986,14 @@
     """Three-way tree merger, text weave merger."""
     supports_reprocess = True
     supports_show_base = False
+    supports_reverse_cherrypick = False
+    history_based = True
 
     def __init__(self, working_tree, this_tree, base_tree, other_tree, 
                  interesting_ids=None, pb=DummyProgress(), pp=None,
                  reprocess=False, change_reporter=None,
-                 interesting_files=None):
+                 interesting_files=None, cherrypick=False):
+        self.cherrypick = cherrypick
         super(WeaveMerger, self).__init__(working_tree, this_tree, 
                                           base_tree, other_tree, 
                                           interesting_ids=interesting_ids, 
@@ -993,7 +1005,12 @@
         There is no distinction between lines that are meant to contain <<<<<<<
         and conflicts.
         """
-        plan = self.this_tree.plan_file_merge(file_id, self.other_tree)
+        if self.cherrypick:
+            base = self.base_tree
+        else:
+            base = None
+        plan = self.this_tree.plan_file_merge(file_id, self.other_tree,
+                                              base=base)
         if 'merge' in debug.debug_flags:
             plan = list(plan)
             trans_id = self.tt.trans_id_file_id(file_id)
@@ -1263,3 +1280,21 @@
             else:
                 new.intersection_update(result)
         return new
+
+    @staticmethod
+    def _subtract_plans(old_plan, new_plan):
+        matcher = patiencediff.PatienceSequenceMatcher(None, old_plan,
+                                                       new_plan)
+        last_j = 0
+        for i, j, n in matcher.get_matching_blocks():
+            for jj in range(last_j, j):
+                yield new_plan[jj]
+            for jj in range(j, j+n):
+                plan_line = new_plan[jj]
+                if plan_line[0] == 'new-b':
+                    pass
+                elif plan_line[0] == 'killed-b':
+                    yield 'unchanged', plan_line[1]
+                else:
+                    yield plan_line
+            last_j = j + n

=== modified file 'bzrlib/tests/blackbox/test_merge.py'
--- a/bzrlib/tests/blackbox/test_merge.py	2007-12-04 03:13:51 +0000
+++ b/bzrlib/tests/blackbox/test_merge.py	2007-12-20 04:20:19 +0000
@@ -301,9 +301,10 @@
         target.commit('empty commit')
         self.write_directive('directive', source.branch, 'target', 'rev2',
                              'rev1')
-        self.run_bzr('merge -d target directive')
+        out, err = self.run_bzr('merge -d target directive')
         self.failIfExists('target/a')
         self.failUnlessExists('target/b')
+        self.assertContainsRe(err, 'Performing cherrypick')
 
     def write_directive(self, filename, source, target, revision_id,
                         base_revision_id=None, mangle_patch=False):
@@ -406,3 +407,16 @@
         graph = tree_a.branch.repository.get_graph(tree_b.branch.repository)
         out, err = self.run_bzr(['merge', '-d', 'a', 'b'])
         self.assertContainsRe(err, 'Warning: criss-cross merge encountered.')
+
+    def test_weave_cherrypick(self):
+        this_tree = self.make_branch_and_tree('this')
+        self.build_tree_contents([('this/file', "a\n")])
+        this_tree.add('file')
+        this_tree.commit('rev1')
+        other_tree = this_tree.bzrdir.sprout('other').open_workingtree()
+        self.build_tree_contents([('other/file', "a\nb\n")])
+        other_tree.commit('rev2b')
+        self.build_tree_contents([('other/file', "c\na\nb\n")])
+        other_tree.commit('rev3b')
+        self.run_bzr('merge --weave -d this other -r -2..-1')
+        self.assertFileEqual('c\na\n', 'this/file')

=== modified file 'bzrlib/tests/test_diff.py'
--- a/bzrlib/tests/test_diff.py	2007-12-06 18:20:35 +0000
+++ b/bzrlib/tests/test_diff.py	2007-12-19 23:40:39 +0000
@@ -723,6 +723,15 @@
         self.assertContainsRe(differ.to_file.getvalue(),
                               'was: old\nis: new\n')
 
+    def test_alphabetical_order(self):
+        self.build_tree(['new-tree/a-file'])
+        self.new_tree.add('a-file')
+        self.build_tree(['old-tree/b-file'])
+        self.old_tree.add('b-file')
+        self.differ.show_diff(None)
+        self.assertContainsRe(self.differ.to_file.getvalue(),
+            '.*a-file(.|\n)*b-file')
+
 
 class TestPatienceDiffLib(TestCase):
 
@@ -774,37 +783,43 @@
         # This is what it currently gives:
         test_one('aBccDe', 'abccde', [(0,0), (5,5)])
 
+    def assertDiffBlocks(self, a, b, expected_blocks):
+        """Check that the sequence matcher returns the correct blocks.
+
+        :param a: A sequence to match
+        :param b: Another sequence to match
+        :param expected_blocks: The expected output, not including the final
+            matching block (len(a), len(b), 0)
+        """
+        matcher = self._PatienceSequenceMatcher(None, a, b)
+        blocks = matcher.get_matching_blocks()
+        last = blocks.pop()
+        self.assertEqual((len(a), len(b), 0), last)
+        self.assertEqual(expected_blocks, blocks)
+
     def test_matching_blocks(self):
-        def chk_blocks(a, b, expected_blocks):
-            # difflib always adds a signature of the total
-            # length, with no matching entries at the end
-            s = self._PatienceSequenceMatcher(None, a, b)
-            blocks = s.get_matching_blocks()
-            self.assertEquals((len(a), len(b), 0), blocks[-1])
-            self.assertEquals(expected_blocks, blocks[:-1])
-
         # Some basic matching tests
-        chk_blocks('', '', [])
-        chk_blocks([], [], [])
-        chk_blocks('abc', '', [])
-        chk_blocks('', 'abc', [])
-        chk_blocks('abcd', 'abcd', [(0, 0, 4)])
-        chk_blocks('abcd', 'abce', [(0, 0, 3)])
-        chk_blocks('eabc', 'abce', [(1, 0, 3)])
-        chk_blocks('eabce', 'abce', [(1, 0, 4)])
-        chk_blocks('abcde', 'abXde', [(0, 0, 2), (3, 3, 2)])
-        chk_blocks('abcde', 'abXYZde', [(0, 0, 2), (3, 5, 2)])
-        chk_blocks('abde', 'abXYZde', [(0, 0, 2), (2, 5, 2)])
-        # This may check too much, but it checks to see that 
+        self.assertDiffBlocks('', '', [])
+        self.assertDiffBlocks([], [], [])
+        self.assertDiffBlocks('abc', '', [])
+        self.assertDiffBlocks('', 'abc', [])
+        self.assertDiffBlocks('abcd', 'abcd', [(0, 0, 4)])
+        self.assertDiffBlocks('abcd', 'abce', [(0, 0, 3)])
+        self.assertDiffBlocks('eabc', 'abce', [(1, 0, 3)])
+        self.assertDiffBlocks('eabce', 'abce', [(1, 0, 4)])
+        self.assertDiffBlocks('abcde', 'abXde', [(0, 0, 2), (3, 3, 2)])
+        self.assertDiffBlocks('abcde', 'abXYZde', [(0, 0, 2), (3, 5, 2)])
+        self.assertDiffBlocks('abde', 'abXYZde', [(0, 0, 2), (2, 5, 2)])
+        # This may check too much, but it checks to see that
         # a copied block stays attached to the previous section,
         # not the later one.
         # difflib would tend to grab the trailing longest match
         # which would make the diff not look right
-        chk_blocks('abcdefghijklmnop', 'abcdefxydefghijklmnop',
-                   [(0, 0, 6), (6, 11, 10)])
+        self.assertDiffBlocks('abcdefghijklmnop', 'abcdefxydefghijklmnop',
+                              [(0, 0, 6), (6, 11, 10)])
 
         # make sure it supports passing in lists
-        chk_blocks(
+        self.assertDiffBlocks(
                    ['hello there\n',
                     'world\n',
                     'how are you today?\n'],
@@ -814,21 +829,45 @@
 
         # non unique lines surrounded by non-matching lines
         # won't be found
-        chk_blocks('aBccDe', 'abccde', [(0,0,1), (5,5,1)])
+        self.assertDiffBlocks('aBccDe', 'abccde', [(0,0,1), (5,5,1)])
 
         # But they only need to be locally unique
-        chk_blocks('aBcDec', 'abcdec', [(0,0,1), (2,2,1), (4,4,2)])
+        self.assertDiffBlocks('aBcDec', 'abcdec', [(0,0,1), (2,2,1), (4,4,2)])
 
         # non unique blocks won't be matched
-        chk_blocks('aBcdEcdFg', 'abcdecdfg', [(0,0,1), (8,8,1)])
+        self.assertDiffBlocks('aBcdEcdFg', 'abcdecdfg', [(0,0,1), (8,8,1)])
 
         # but locally unique ones will
-        chk_blocks('aBcdEeXcdFg', 'abcdecdfg', [(0,0,1), (2,2,2),
+        self.assertDiffBlocks('aBcdEeXcdFg', 'abcdecdfg', [(0,0,1), (2,2,2),
                                               (5,4,1), (7,5,2), (10,8,1)])
 
-        chk_blocks('abbabbXd', 'cabbabxd', [(7,7,1)])
-        chk_blocks('abbabbbb', 'cabbabbc', [])
-        chk_blocks('bbbbbbbb', 'cbbbbbbc', [])
+        self.assertDiffBlocks('abbabbXd', 'cabbabxd', [(7,7,1)])
+        self.assertDiffBlocks('abbabbbb', 'cabbabbc', [])
+        self.assertDiffBlocks('bbbbbbbb', 'cbbbbbbc', [])
+
+    def test_matching_blocks_tuples(self):
+        # Some basic matching tests
+        self.assertDiffBlocks([], [], [])
+        self.assertDiffBlocks([('a',), ('b',), ('c,')], [], [])
+        self.assertDiffBlocks([], [('a',), ('b',), ('c,')], [])
+        self.assertDiffBlocks([('a',), ('b',), ('c,')],
+                              [('a',), ('b',), ('c,')],
+                              [(0, 0, 3)])
+        self.assertDiffBlocks([('a',), ('b',), ('c,')],
+                              [('a',), ('b',), ('d,')],
+                              [(0, 0, 2)])
+        self.assertDiffBlocks([('d',), ('b',), ('c,')],
+                              [('a',), ('b',), ('c,')],
+                              [(1, 1, 2)])
+        self.assertDiffBlocks([('d',), ('a',), ('b',), ('c,')],
+                              [('a',), ('b',), ('c,')],
+                              [(1, 0, 3)])
+        self.assertDiffBlocks([('a', 'b'), ('c', 'd'), ('e', 'f')],
+                              [('a', 'b'), ('c', 'X'), ('e', 'f')],
+                              [(0, 0, 1), (2, 2, 1)])
+        self.assertDiffBlocks([('a', 'b'), ('c', 'd'), ('e', 'f')],
+                              [('a', 'b'), ('c', 'dX'), ('e', 'f')],
+                              [(0, 0, 1), (2, 2, 1)])
 
     def test_opcodes(self):
         def chk_ops(a, b, expected_codes):
@@ -946,25 +985,16 @@
     def test_multiple_ranges(self):
         # There was an earlier bug where we used a bad set of ranges,
         # this triggers that specific bug, to make sure it doesn't regress
-        def chk_blocks(a, b, expected_blocks):
-            # difflib always adds a signature of the total
-            # length, with no matching entries at the end
-            s = self._PatienceSequenceMatcher(None, a, b)
-            blocks = s.get_matching_blocks()
-            x = blocks.pop()
-            self.assertEquals(x, (len(a), len(b), 0))
-            self.assertEquals(expected_blocks, blocks)
-
-        chk_blocks('abcdefghijklmnop'
-                 , 'abcXghiYZQRSTUVWXYZijklmnop'
-                 , [(0, 0, 3), (6, 4, 3), (9, 20, 7)])
-
-        chk_blocks('ABCd efghIjk  L'
-                 , 'AxyzBCn mo pqrstuvwI1 2  L'
-                 , [(0,0,1), (1, 4, 2), (9, 19, 1), (12, 23, 3)])
+        self.assertDiffBlocks('abcdefghijklmnop',
+                              'abcXghiYZQRSTUVWXYZijklmnop',
+                              [(0, 0, 3), (6, 4, 3), (9, 20, 7)])
+
+        self.assertDiffBlocks('ABCd efghIjk  L',
+                              'AxyzBCn mo pqrstuvwI1 2  L',
+                              [(0,0,1), (1, 4, 2), (9, 19, 1), (12, 23, 3)])
 
         # These are rot13 code snippets.
-        chk_blocks('''\
+        self.assertDiffBlocks('''\
     trg nqqrq jura lbh nqq n svyr va gur qverpgbel.
     """
     gnxrf_netf = ['svyr*']
@@ -1077,6 +1107,19 @@
         self._PatienceSequenceMatcher = \
             bzrlib._patiencediff_c.PatienceSequenceMatcher_c
 
+    def test_unhashable(self):
+        """We should get a proper exception here."""
+        # We need to be able to hash items in the sequence, lists are
+        # unhashable, and thus cannot be diffed
+        e = self.assertRaises(TypeError, self._PatienceSequenceMatcher,
+                                         None, [[]], [])
+        e = self.assertRaises(TypeError, self._PatienceSequenceMatcher,
+                                         None, ['valid', []], [])
+        e = self.assertRaises(TypeError, self._PatienceSequenceMatcher,
+                                         None, ['valid'], [[]])
+        e = self.assertRaises(TypeError, self._PatienceSequenceMatcher,
+                                         None, ['valid'], ['valid', []])
+
 
 class TestPatienceDiffLibFiles(TestCaseInTempDir):
 

=== modified file 'bzrlib/tests/test_merge.py'
--- a/bzrlib/tests/test_merge.py	2007-12-03 21:33:36 +0000
+++ b/bzrlib/tests/test_merge.py	2007-12-20 02:47:39 +0000
@@ -288,6 +288,52 @@
         merger.do_merge()
         self.assertEqual(tree_a.get_parent_ids(), [tree_b.last_revision()])
 
+    def prepare_cherrypick(self):
+        """Prepare a pair of trees for cherrypicking tests.
+
+        Both trees have a file, 'file'.
+        rev1 sets content to 'a'.
+        rev2b adds 'b'.
+        rev3b adds 'c'.
+        A full merge of rev2b and rev3b into this_tree would add both 'b' and
+        'c'.  A successful cherrypick of rev2b-rev3b into this_tree will add
+        'c', but not 'b'.
+        """
+        this_tree = self.make_branch_and_tree('this')
+        self.build_tree_contents([('this/file', "a\n")])
+        this_tree.add('file')
+        this_tree.commit('rev1')
+        other_tree = this_tree.bzrdir.sprout('other').open_workingtree()
+        self.build_tree_contents([('other/file', "a\nb\n")])
+        other_tree.commit('rev2b', rev_id='rev2b')
+        self.build_tree_contents([('other/file', "c\na\nb\n")])
+        other_tree.commit('rev3b', rev_id='rev3b')
+        this_tree.lock_write()
+        self.addCleanup(this_tree.unlock)
+        return this_tree, other_tree
+
+    def test_weave_cherrypick(self):
+        this_tree, other_tree = self.prepare_cherrypick()
+        merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
+            this_tree, 'rev3b', 'rev2b', other_tree.branch)
+        merger.merge_type = _mod_merge.WeaveMerger
+        merger.do_merge()
+        self.assertFileEqual('c\na\n', 'this/file')
+
+    def test_weave_cannot_reverse_cherrypick(self):
+        this_tree, other_tree = self.prepare_cherrypick()
+        merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
+            this_tree, 'rev2b', 'rev3b', other_tree.branch)
+        merger.merge_type = _mod_merge.WeaveMerger
+        self.assertRaises(errors.CannotReverseCherrypick, merger.do_merge)
+
+    def test_merge3_can_reverse_cherrypick(self):
+        this_tree, other_tree = self.prepare_cherrypick()
+        merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
+            this_tree, 'rev2b', 'rev3b', other_tree.branch)
+        merger.merge_type = _mod_merge.Merge3Merger
+        merger.do_merge()
+
 
 class TestPlanMerge(TestCaseWithMemoryTransport):
 
@@ -368,3 +414,46 @@
                           ('killed-a', 'b\n'),
                           ('unchanged', 'g\n')],
                          list(plan))
+
+    def test_subtract_plans(self):
+        old_plan = [
+        ('unchanged', 'a\n'),
+        ('new-a', 'b\n'),
+        ('killed-a', 'c\n'),
+        ('new-b', 'd\n'),
+        ('new-b', 'e\n'),
+        ('killed-b', 'f\n'),
+        ('killed-b', 'g\n'),
+        ]
+        new_plan = [
+        ('unchanged', 'a\n'),
+        ('new-a', 'b\n'),
+        ('killed-a', 'c\n'),
+        ('new-b', 'd\n'),
+        ('new-b', 'h\n'),
+        ('killed-b', 'f\n'),
+        ('killed-b', 'i\n'),
+        ]
+        subtracted_plan = [
+        ('unchanged', 'a\n'),
+        ('new-a', 'b\n'),
+        ('killed-a', 'c\n'),
+        ('new-b', 'h\n'),
+        ('unchanged', 'f\n'),
+        ('killed-b', 'i\n'),
+        ]
+        self.assertEqual(subtracted_plan,
+            list(_PlanMerge._subtract_plans(old_plan, new_plan)))
+
+    def test_plan_merge_with_base(self):
+        self.add_version('COMMON', [], 'abc')
+        self.add_version('THIS', ['COMMON'], 'abcd')
+        self.add_version('BASE', ['COMMON'], 'eabc')
+        self.add_version('OTHER', ['BASE'], 'eafb')
+        plan = self.plan_merge_vf.plan_merge('THIS', 'OTHER', 'BASE')
+        self.assertEqual([('unchanged', 'a\n'),
+                          ('new-b', 'f\n'),
+                          ('unchanged', 'b\n'),
+                          ('killed-b', 'c\n'),
+                          ('new-a', 'd\n')
+                         ], list(plan))

=== modified file 'bzrlib/transport/http/__init__.py'
--- a/bzrlib/transport/http/__init__.py	2007-12-12 21:06:05 +0000
+++ b/bzrlib/transport/http/__init__.py	2007-12-20 14:14:21 +0000
@@ -114,15 +114,6 @@
         else:
             self._range_hint = 'multi'
 
-    def _remote_path(self, relpath):
-        """Produce absolute path, adjusting protocol."""
-        relative = urlutils.unescape(relpath).encode('utf-8')
-        path = self._combine_paths(self._path, relative)
-        return self._unsplit_url(self._unqualified_scheme,
-                                 self._user, self._password,
-                                 self._host, self._port,
-                                 path)
-
     def has(self, relpath):
         raise NotImplementedError("has() is abstract on %r" % self)
 
@@ -151,6 +142,24 @@
         """
         raise NotImplementedError(self._get)
 
+    def _remote_path(self, relpath):
+        """See ConnectedTransport._remote_path.
+
+        user and passwords are not embedded in the path provided to the server.
+        """
+        relative = urlutils.unescape(relpath).encode('utf-8')
+        path = self._combine_paths(self._path, relative)
+        return self._unsplit_url(self._unqualified_scheme,
+                                 None, None, self._host, self._port, path)
+
+    def _create_auth(self):
+        """Returns a dict returning the credentials provided at build time."""
+        auth = dict(host=self._host, port=self._port,
+                    user=self._user, password=self._password,
+                    protocol=self._unqualified_scheme,
+                    path=self._path)
+        return auth
+
     def get_request(self):
         return SmartClientHTTPMediumRequest(self)
 

=== modified file 'bzrlib/transport/http/_pycurl.py'
--- a/bzrlib/transport/http/_pycurl.py	2007-12-11 14:26:18 +0000
+++ b/bzrlib/transport/http/_pycurl.py	2007-12-20 16:36:44 +0000
@@ -123,7 +123,10 @@
             # connect to the http server until the first request (which had
             # just called us).
             connection = pycurl.Curl()
-            self._set_connection(connection, None)
+            # First request, initialize credentials.
+            auth = self._create_auth()
+            # Proxy handling is out of reach, so we punt
+            self._set_connection(connection, auth)
         return connection
 
     def has(self, relpath):
@@ -295,6 +298,18 @@
         curl.setopt(pycurl.USERAGENT, ua_str)
         if self.cabundle:
             curl.setopt(pycurl.CAINFO, self.cabundle)
+        # Set accepted auth methods
+        curl.setopt(pycurl.HTTPAUTH, pycurl.HTTPAUTH_ANY)
+        curl.setopt(pycurl.PROXYAUTH, pycurl.HTTPAUTH_ANY)
+        auth = self._get_credentials()
+        user = auth.get('user', None)
+        password = auth.get('password', None)
+        userpass = None
+        if user is not None:
+            userpass = user + ':'
+            if password is not None: # '' is a valid password
+                userpass += password
+            curl.setopt(pycurl.USERPWD, userpass)
 
     def _curl_perform(self, curl, header, more_headers=[]):
         """Perform curl operation and translate exceptions."""

=== modified file 'bzrlib/transport/http/_urllib.py'
--- a/bzrlib/transport/http/_urllib.py	2007-12-11 14:26:18 +0000
+++ b/bzrlib/transport/http/_urllib.py	2007-12-20 16:36:44 +0000
@@ -49,17 +49,6 @@
         else:
             self._opener = self._opener_class()
 
-    def _remote_path(self, relpath):
-        """Produce absolute path, adjusting protocol."""
-        relative = urlutils.unescape(relpath).encode('utf-8')
-        path = self._combine_paths(self._path, relative)
-        # urllib2 will be confused if it find authentication
-        # info (user, password) in the urls. So we handle them separatly.
-
-        # rhaaaa ! confused where ? confused when ? --vila 20070922
-        return self._unsplit_url(self._unqualified_scheme,
-                                 None, None, self._host, self._port, path)
-
     def _perform(self, request):
         """Send the request to the server and handles common errors.
 
@@ -74,15 +63,10 @@
             # request couldn't do it
             connection.cleanup_pipe()
         else:
-            # First request, intialize credentials.
+            # First request, initialize credentials.
             # scheme and realm will be set by the _urllib2_wrappers.AuthHandler
-            user = self._user
-            password = self._password
-            auth = dict(host=self._host, port=self._port,
-                        user=user, password=password,
-                        protocol=self._unqualified_scheme,
-                        path=self._path)
-            # Proxy initialization will be done by first proxied request
+            auth = self._create_auth()
+            # Proxy initialization will be done by the first proxied request
             proxy_auth = dict()
         # Ensure authentication info is provided
         request.auth = auth

=== modified file 'bzrlib/transport/http/_urllib2_wrappers.py'
--- a/bzrlib/transport/http/_urllib2_wrappers.py	2007-12-14 10:34:45 +0000
+++ b/bzrlib/transport/http/_urllib2_wrappers.py	2007-12-20 16:36:44 +0000
@@ -1038,8 +1038,8 @@
         the prompt, so we build the prompt from the authentication dict which
         contains all the needed parts.
 
-        Also, hhtp and proxy AuthHandlers present different prompts to the
-        user. The daughter classes hosuld implements a public
+        Also, http and proxy AuthHandlers present different prompts to the
+        user. The daughter classes should implements a public
         build_password_prompt using this method.
         """
         prompt = '%s' % auth['protocol'].upper() + ' %(user)s@%(host)s'

=== modified file 'bzrlib/tree.py'
--- a/bzrlib/tree.py	2007-12-03 21:33:36 +0000
+++ b/bzrlib/tree.py	2007-12-09 20:58:03 +0000
@@ -291,7 +291,7 @@
         """
         raise NotImplementedError(self.annotate_iter)
 
-    def plan_file_merge(self, file_id, other):
+    def plan_file_merge(self, file_id, other, base=None):
         """Generate a merge plan based on annotations.
 
         If the file contains uncommitted changes in this tree, they will be
@@ -303,7 +303,12 @@
         vf = versionedfile._PlanMergeVersionedFile(file_id)
         last_revision_a = self._get_file_revision(file_id, vf, 'this:')
         last_revision_b = other._get_file_revision(file_id, vf, 'other:')
-        return vf.plan_merge(last_revision_a, last_revision_b)
+        if base is None:
+            last_revision_base = None
+        else:
+            last_revision_base = base._get_file_revision(file_id, vf, 'base:')
+        return vf.plan_merge(last_revision_a, last_revision_b,
+                             last_revision_base)
 
     def _get_file_revision(self, file_id, vf, tree_revision):
         def file_revision(revision_tree):

=== modified file 'bzrlib/versionedfile.py'
--- a/bzrlib/versionedfile.py	2007-12-03 21:38:07 +0000
+++ b/bzrlib/versionedfile.py	2007-12-04 03:54:55 +0000
@@ -517,10 +517,15 @@
         self._parents = {}
         self._lines = {}
 
-    def plan_merge(self, ver_a, ver_b):
+    def plan_merge(self, ver_a, ver_b, base=None):
         """See VersionedFile.plan_merge"""
         from merge import _PlanMerge
-        return _PlanMerge(ver_a, ver_b, self).plan_merge()
+        if base is None:
+            return _PlanMerge(ver_a, ver_b, self).plan_merge()
+        old_plan = list(_PlanMerge(ver_a, base, self).plan_merge())
+        new_plan = list(_PlanMerge(ver_a, ver_b, self).plan_merge())
+        return _PlanMerge._subtract_plans(old_plan, new_plan)
+
 
     def add_lines(self, version_id, parents, lines):
         """See VersionedFile.add_lines



More information about the bazaar-commits mailing list