Rev 3779: Merge bzr.dev 3783, resolve NEWS in http://bzr.arbash-meinel.com/branches/bzr/1.9-dev/annotate_cleanups

John Arbash Meinel john at arbash-meinel.com
Fri Oct 17 20:59:06 BST 2008


At http://bzr.arbash-meinel.com/branches/bzr/1.9-dev/annotate_cleanups

------------------------------------------------------------
revno: 3779
revision-id: john at arbash-meinel.com-20081017195853-i31d3g7sur1prgvi
parent: john at arbash-meinel.com-20081017161420-q7au1ngfvf2rwb4j
parent: pqm at pqm.ubuntu.com-20081017125551-l5zi213vopny82nt
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: annotate_cleanups
timestamp: Fri 2008-10-17 14:58:53 -0500
message:
  Merge bzr.dev 3783, resolve NEWS
modified:
  NEWS                           NEWS-20050323055033-4e00b5db738777ff
  bzrlib/branch.py               branch.py-20050309040759-e4baf4e0d046576e
  bzrlib/config.py               config.py-20051011043216-070c74f4e9e338e8
  bzrlib/patches.py              patches.py-20050727183609-378c1cc5972ce908
  bzrlib/plugins/launchpad/account.py account.py-20071011033320-50y6vfftywf4yllw-1
  bzrlib/plugins/launchpad/test_account.py test_account.py-20071011033320-50y6vfftywf4yllw-2
  bzrlib/plugins/launchpad/test_lp_directory.py test_lp_indirect.py-20070126002743-oyle362tzv9cd8mi-1
  bzrlib/tests/test_branch.py    test_branch.py-20060116013032-97819aa07b8ab3b5
  bzrlib/tests/test_config.py    testconfig.py-20051011041908-742d0c15d8d8c8eb
  bzrlib/tests/test_patches.py   test_patches.py-20051231203844-f4974d20f6aea09c
  bzrlib/tests/test_remote.py    test_remote.py-20060720103555-yeeg2x51vn0rbtdp-2
  bzrlib/tests/test_sftp_transport.py testsftp.py-20051027032739-247570325fec7e7e
  bzrlib/tests/test_transform.py test_transaction.py-20060105172520-b3ffb3946550e6c4
  bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
  bzrlib/transport/ftp/__init__.py ftp.py-20051116161804-58dc9506548c2a53
  bzrlib/transport/remote.py     ssh.py-20060608202016-c25gvf1ob7ypbus6-1
  bzrlib/transport/sftp.py       sftp.py-20051019050329-ab48ce71b7e32dfe
  bzrlib/transport/ssh.py        ssh.py-20060824042150-0s9787kng6zv1nwq-1
  doc/developers/HACKING.txt     HACKING-20050805200004-2a5dc975d870f78c
  setup.py                       setup.py-20050314065409-02f8a0a6e3f9bc70
    ------------------------------------------------------------
    revno: 3777.2.6
    revision-id: pqm at pqm.ubuntu.com-20081017125551-l5zi213vopny82nt
    parent: pqm at pqm.ubuntu.com-20081016213135-0115pw9c95l2dyxq
    parent: aaron at aaronbentley.com-20081017122234-4lygct4bu1hsube6
    committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
    branch nick: +trunk
    timestamp: Fri 2008-10-17 13:55:51 +0100
    message:
      Implement default ssh usernames via launchpad-login (abentley)
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/config.py               config.py-20051011043216-070c74f4e9e338e8
      bzrlib/plugins/launchpad/account.py account.py-20071011033320-50y6vfftywf4yllw-1
      bzrlib/plugins/launchpad/test_account.py test_account.py-20071011033320-50y6vfftywf4yllw-2
      bzrlib/plugins/launchpad/test_lp_directory.py test_lp_indirect.py-20070126002743-oyle362tzv9cd8mi-1
      bzrlib/tests/test_config.py    testconfig.py-20051011041908-742d0c15d8d8c8eb
        ------------------------------------------------------------
        revno: 3777.1.18
        revision-id: aaron at aaronbentley.com-20081017122234-4lygct4bu1hsube6
        parent: aaron at aaronbentley.com-20081016184810-ago29htjdh2z0x0t
        committer: Aaron Bentley <aaron at aaronbentley.com>
        branch nick: launchpad-login
        timestamp: Fri 2008-10-17 08:22:34 -0400
        message:
          Fix None handling wrt auth upgrades
        modified:
          bzrlib/plugins/launchpad/account.py account.py-20071011033320-50y6vfftywf4yllw-1
          bzrlib/plugins/launchpad/test_account.py test_account.py-20071011033320-50y6vfftywf4yllw-2
          bzrlib/plugins/launchpad/test_lp_directory.py test_lp_indirect.py-20070126002743-oyle362tzv9cd8mi-1
        ------------------------------------------------------------
        revno: 3777.1.17
        revision-id: aaron at aaronbentley.com-20081016184810-ago29htjdh2z0x0t
        parent: aaron at aaronbentley.com-20081016184139-ve0w21oeg0by6he6
        committer: Aaron Bentley <aaron at aaronbentley.com>
        branch nick: launchpad-login
        timestamp: Thu 2008-10-16 14:48:10 -0400
        message:
          Update NEWS
        modified:
          NEWS                           NEWS-20050323055033-4e00b5db738777ff
        ------------------------------------------------------------
        revno: 3777.1.16
        revision-id: aaron at aaronbentley.com-20081016184139-ve0w21oeg0by6he6
        parent: aaron at aaronbentley.com-20081016183519-llt3cr4n24ymrlrh
        parent: aaron at aaronbentley.com-20081016183758-1c4qosfpmdoee03b
        committer: Aaron Bentley <aaron at aaronbentley.com>
        branch nick: launchpad-login
        timestamp: Thu 2008-10-16 14:41:39 -0400
        message:
          Merge with lower thread
        modified:
          NEWS                           NEWS-20050323055033-4e00b5db738777ff
            ------------------------------------------------------------
            revno: 3777.6.3
            revision-id: aaron at aaronbentley.com-20081016183758-1c4qosfpmdoee03b
            parent: aaron at aaronbentley.com-20081016183032-cybgqp6y0ip27mem
            committer: Aaron Bentley <aaron at aaronbentley.com>
            branch nick: set_credentials
            timestamp: Thu 2008-10-16 14:37:58 -0400
            message:
              Update NEWS
            modified:
              NEWS                           NEWS-20050323055033-4e00b5db738777ff
        ------------------------------------------------------------
        revno: 3777.1.15
        revision-id: aaron at aaronbentley.com-20081016183519-llt3cr4n24ymrlrh
        parent: aaron at aaronbentley.com-20081016183220-7e692v9fac5613zb
        committer: Aaron Bentley <aaron at aaronbentley.com>
        branch nick: launchpad-login
        timestamp: Thu 2008-10-16 14:35:19 -0400
        message:
          Update docs
        modified:
          bzrlib/plugins/launchpad/account.py account.py-20071011033320-50y6vfftywf4yllw-1
        ------------------------------------------------------------
        revno: 3777.1.14
        revision-id: aaron at aaronbentley.com-20081016183220-7e692v9fac5613zb
        parent: aaron at aaronbentley.com-20081016183043-v3d3226g1x7c05ns
        committer: Aaron Bentley <aaron at aaronbentley.com>
        branch nick: launchpad-login
        timestamp: Thu 2008-10-16 14:32:20 -0400
        message:
          Adjust for new set_credentials signature
        modified:
          bzrlib/plugins/launchpad/account.py account.py-20071011033320-50y6vfftywf4yllw-1
          bzrlib/plugins/launchpad/test_account.py test_account.py-20071011033320-50y6vfftywf4yllw-2
        ------------------------------------------------------------
        revno: 3777.1.13
        revision-id: aaron at aaronbentley.com-20081016183043-v3d3226g1x7c05ns
        parent: aaron at aaronbentley.com-20081016160555-6ux64504nzwyxog9
        parent: aaron at aaronbentley.com-20081016183032-cybgqp6y0ip27mem
        committer: Aaron Bentley <aaron at aaronbentley.com>
        branch nick: launchpad-login
        timestamp: Thu 2008-10-16 14:30:43 -0400
        message:
          Merge set_credentials into launchpad-login
        modified:
          bzrlib/config.py               config.py-20051011043216-070c74f4e9e338e8
          bzrlib/tests/test_config.py    testconfig.py-20051011041908-742d0c15d8d8c8eb
            ------------------------------------------------------------
            revno: 3777.6.2
            revision-id: aaron at aaronbentley.com-20081016183032-cybgqp6y0ip27mem
            parent: aaron at aaronbentley.com-20081016182657-1xi0vmda0iffc2g8
            committer: Aaron Bentley <aaron at aaronbentley.com>
            branch nick: set_credentials
            timestamp: Thu 2008-10-16 14:30:32 -0400
            message:
              Reverse order of scheme and password
            modified:
              bzrlib/config.py               config.py-20051011043216-070c74f4e9e338e8
              bzrlib/tests/test_config.py    testconfig.py-20051011041908-742d0c15d8d8c8eb
            ------------------------------------------------------------
            revno: 3777.6.1
            revision-id: aaron at aaronbentley.com-20081016182657-1xi0vmda0iffc2g8
            parent: aaron at aaronbentley.com-20081016160425-z6e33epyqltcn6wj
            committer: Aaron Bentley <aaron at aaronbentley.com>
            branch nick: set_credentials
            timestamp: Thu 2008-10-16 14:26:57 -0400
            message:
              Update docs
            modified:
              bzrlib/config.py               config.py-20051011043216-070c74f4e9e338e8
        ------------------------------------------------------------
        revno: 3777.1.12
        revision-id: aaron at aaronbentley.com-20081016160555-6ux64504nzwyxog9
        parent: aaron at aaronbentley.com-20081016160425-z6e33epyqltcn6wj
        committer: Aaron Bentley <aaron at aaronbentley.com>
        branch nick: launchpad-login
        timestamp: Thu 2008-10-16 12:05:55 -0400
        message:
          Enable configuring ssh auth from launchpad-login, with auto-upgrade.
        modified:
          bzrlib/plugins/launchpad/account.py account.py-20071011033320-50y6vfftywf4yllw-1
          bzrlib/plugins/launchpad/test_account.py test_account.py-20071011033320-50y6vfftywf4yllw-2
        ------------------------------------------------------------
        revno: 3777.1.11
        revision-id: aaron at aaronbentley.com-20081016160425-z6e33epyqltcn6wj
        parent: aaron at aaronbentley.com-20081016132940-24l3emoih65h1nsq
        committer: Aaron Bentley <aaron at aaronbentley.com>
        branch nick: launchpad-login
        timestamp: Thu 2008-10-16 12:04:25 -0400
        message:
          Ensure changed-name updates clear old values
        modified:
          bzrlib/config.py               config.py-20051011043216-070c74f4e9e338e8
          bzrlib/tests/test_config.py    testconfig.py-20051011041908-742d0c15d8d8c8eb
        ------------------------------------------------------------
        revno: 3777.1.10
        revision-id: aaron at aaronbentley.com-20081016132940-24l3emoih65h1nsq
        parent: aaron at aaronbentley.com-20081016130333-0cti66q6xo5napqd
        committer: Aaron Bentley <aaron at aaronbentley.com>
        branch nick: launchpad-login
        timestamp: Thu 2008-10-16 09:29:40 -0400
        message:
          Ensure credentials are stored
        modified:
          bzrlib/config.py               config.py-20051011043216-070c74f4e9e338e8
          bzrlib/tests/test_config.py    testconfig.py-20051011041908-742d0c15d8d8c8eb
        ------------------------------------------------------------
        revno: 3777.1.9
        revision-id: aaron at aaronbentley.com-20081016130333-0cti66q6xo5napqd
        parent: aaron at aaronbentley.com-20081015211105-49xq5y8jnla6clni
        parent: aaron at aaronbentley.com-20081016130324-547q140zwnh6g8aq
        committer: Aaron Bentley <aaron at aaronbentley.com>
        branch nick: launchpad-login
        timestamp: Thu 2008-10-16 09:03:33 -0400
        message:
          Merge authconfig into launchpad-login
        modified:
          NEWS                           NEWS-20050323055033-4e00b5db738777ff
          bzrlib/branch.py               branch.py-20050309040759-e4baf4e0d046576e
          bzrlib/tests/test_branch.py    test_branch.py-20060116013032-97819aa07b8ab3b5
          setup.py                       setup.py-20050314065409-02f8a0a6e3f9bc70
            ------------------------------------------------------------
            revno: 3777.5.1
            revision-id: aaron at aaronbentley.com-20081016130324-547q140zwnh6g8aq
            parent: aaron at aaronbentley.com-20081015191156-mrykcuir96zszuh7
            parent: pqm at pqm.ubuntu.com-20081016043554-38i4ho6svnlyba65
            committer: Aaron Bentley <aaron at aaronbentley.com>
            branch nick: authconfig
            timestamp: Thu 2008-10-16 09:03:24 -0400
            message:
              Merge with bzr.dev
            modified:
              NEWS                           NEWS-20050323055033-4e00b5db738777ff
              bzrlib/branch.py               branch.py-20050309040759-e4baf4e0d046576e
              bzrlib/tests/test_branch.py    test_branch.py-20060116013032-97819aa07b8ab3b5
              setup.py                       setup.py-20050314065409-02f8a0a6e3f9bc70
        ------------------------------------------------------------
        revno: 3777.1.8
        revision-id: aaron at aaronbentley.com-20081015211105-49xq5y8jnla6clni
        parent: aaron at aaronbentley.com-20081015191156-mrykcuir96zszuh7
        committer: Aaron Bentley <aaron at aaronbentley.com>
        branch nick: launchpad-login
        timestamp: Wed 2008-10-15 17:11:05 -0400
        message:
          Commit work-in-progress
        modified:
          bzrlib/config.py               config.py-20051011043216-070c74f4e9e338e8
          bzrlib/tests/test_config.py    testconfig.py-20051011041908-742d0c15d8d8c8eb
    ------------------------------------------------------------
    revno: 3777.2.5
    revision-id: pqm at pqm.ubuntu.com-20081016213135-0115pw9c95l2dyxq
    parent: pqm at pqm.ubuntu.com-20081016204321-ayg99pvl7sr7y6qu
    parent: aaron at aaronbentley.com-20081016190501-rvjm4em0kmlilhyf
    committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
    branch nick: +trunk
    timestamp: Thu 2008-10-16 22:31:35 +0100
    message:
      PreviewTree.iter_changes accepts all standard parameters (abentley)
    modified:
      bzrlib/tests/test_transform.py test_transaction.py-20060105172520-b3ffb3946550e6c4
      bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
        ------------------------------------------------------------
        revno: 3363.19.4
        revision-id: aaron at aaronbentley.com-20081016190501-rvjm4em0kmlilhyf
        parent: aaron at aaronbentley.com-20081014030954-g0ht1o6t40v7ecdp
        parent: aaron at aaronbentley.com-20081016190448-2a4ilw7bqsw08190
        committer: Aaron Bentley <aaron at aaronbentley.com>
        branch nick: fix-iter-changes
        timestamp: Thu 2008-10-16 15:05:01 -0400
        message:
          Merge direct-patching into fix-iter-changes
        modified:
          bzrlib/patches.py              patches.py-20050727183609-378c1cc5972ce908
        ------------------------------------------------------------
        revno: 3363.19.3
        revision-id: aaron at aaronbentley.com-20081014030954-g0ht1o6t40v7ecdp
        parent: aaron at aaronbentley.com-20081014025056-dlyb96nmtv4aenuj
        parent: aaron at aaronbentley.com-20081014030136-8h0rtrxhq8q1d1zu
        committer: Aaron Bentley <aaron at aaronbentley.com>
        branch nick: fix-iter-changes
        timestamp: Mon 2008-10-13 23:09:54 -0400
        message:
          Merge direct-patching into fix-iter-changes
        modified:
          bzrlib/patches.py              patches.py-20050727183609-378c1cc5972ce908
          bzrlib/tests/test_patches.py   test_patches.py-20051231203844-f4974d20f6aea09c
        ------------------------------------------------------------
        revno: 3363.19.2
        revision-id: aaron at aaronbentley.com-20081014025056-dlyb96nmtv4aenuj
        parent: aaron at aaronbentley.com-20081013150916-fq1vm0mvw72jcc3n
        parent: aaron at aaronbentley.com-20081014025051-hd8sbbq3yeqrb49t
        committer: Aaron Bentley <aaron at aaronbentley.com>
        branch nick: fix-iter-changes
        timestamp: Mon 2008-10-13 22:50:56 -0400
        message:
          Merge direct-patching into fix-iter-changes
        added:
          bzrlib/tests/blackbox/test_dump_btree.py test_dump_btree.py-20081008203335-zkpcq230b6vubszz-1
        modified:
          NEWS                           NEWS-20050323055033-4e00b5db738777ff
          bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
          bzrlib/knit.py                 knit.py-20051212171256-f056ac8f0fbe1bd9
          bzrlib/tests/blackbox/__init__.py __init__.py-20051128053524-eba30d8255e08dc3
          bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
          bzrlib/tree.py                 tree.py-20050309040759-9d5f2496be663e77
          doc/developers/ppa.txt         ppa.txt-20080722055539-606u7t2z32t3ae4w-1
          setup.py                       setup.py-20050314065409-02f8a0a6e3f9bc70
        ------------------------------------------------------------
        revno: 3363.19.1
        revision-id: aaron at aaronbentley.com-20081013150916-fq1vm0mvw72jcc3n
        parent: aaron at aaronbentley.com-20081010231442-6be32m59zo304a90
        committer: Aaron Bentley <aaron at aaronbentley.com>
        branch nick: merge-into2
        timestamp: Mon 2008-10-13 11:09:16 -0400
        message:
          Make PreviewTree.iter_changes accept all options.
        modified:
          bzrlib/tests/test_transform.py test_transaction.py-20060105172520-b3ffb3946550e6c4
          bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
    ------------------------------------------------------------
    revno: 3777.2.4
    revision-id: pqm at pqm.ubuntu.com-20081016204321-ayg99pvl7sr7y6qu
    parent: pqm at pqm.ubuntu.com-20081016131807-r3p1hsepd24feegv
    parent: aaron at aaronbentley.com-20081016190448-2a4ilw7bqsw08190
    committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
    branch nick: +trunk
    timestamp: Thu 2008-10-16 21:43:21 +0100
    message:
      Add iter_patched_from_hunks to reduce API friction (abentley)
    modified:
      bzrlib/patches.py              patches.py-20050727183609-378c1cc5972ce908
      bzrlib/tests/test_patches.py   test_patches.py-20051231203844-f4974d20f6aea09c
        ------------------------------------------------------------
        revno: 3363.18.4
        revision-id: aaron at aaronbentley.com-20081016190448-2a4ilw7bqsw08190
        parent: aaron at aaronbentley.com-20081014030136-8h0rtrxhq8q1d1zu
        committer: Aaron Bentley <aaron at aaronbentley.com>
        branch nick: direct-patching
        timestamp: Thu 2008-10-16 15:04:48 -0400
        message:
          Updates from review (and a doc update)
        modified:
          bzrlib/patches.py              patches.py-20050727183609-378c1cc5972ce908
        ------------------------------------------------------------
        revno: 3363.18.3
        revision-id: aaron at aaronbentley.com-20081014030136-8h0rtrxhq8q1d1zu
        parent: aaron at aaronbentley.com-20081014025051-hd8sbbq3yeqrb49t
        committer: Aaron Bentley <aaron at aaronbentley.com>
        branch nick: direct-patching
        timestamp: Mon 2008-10-13 23:01:36 -0400
        message:
          Add tests for iter_patched_from_hunks
        modified:
          bzrlib/patches.py              patches.py-20050727183609-378c1cc5972ce908
          bzrlib/tests/test_patches.py   test_patches.py-20051231203844-f4974d20f6aea09c
        ------------------------------------------------------------
        revno: 3363.18.2
        revision-id: aaron at aaronbentley.com-20081014025051-hd8sbbq3yeqrb49t
        parent: aaron at aaronbentley.com-20081010231442-6be32m59zo304a90
        parent: aaron at aaronbentley.com-20081014024517-pu1q1kz1v51rvk9f
        committer: Aaron Bentley <aaron at aaronbentley.com>
        branch nick: direct-patching
        timestamp: Mon 2008-10-13 22:50:51 -0400
        message:
          Merge merge-into2 into direct-patching
        added:
          bzrlib/tests/blackbox/test_dump_btree.py test_dump_btree.py-20081008203335-zkpcq230b6vubszz-1
        modified:
          NEWS                           NEWS-20050323055033-4e00b5db738777ff
          bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
          bzrlib/knit.py                 knit.py-20051212171256-f056ac8f0fbe1bd9
          bzrlib/tests/blackbox/__init__.py __init__.py-20051128053524-eba30d8255e08dc3
          bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
          bzrlib/tree.py                 tree.py-20050309040759-9d5f2496be663e77
          doc/developers/ppa.txt         ppa.txt-20080722055539-606u7t2z32t3ae4w-1
          setup.py                       setup.py-20050314065409-02f8a0a6e3f9bc70
        ------------------------------------------------------------
        revno: 3363.18.1
        revision-id: aaron at aaronbentley.com-20081010231442-6be32m59zo304a90
        parent: aaron at aaronbentley.com-20081010225929-08pkzo68wbfr3yqg
        committer: Aaron Bentley <aaron at aaronbentley.com>
        branch nick: merge-into2
        timestamp: Fri 2008-10-10 19:14:42 -0400
        message:
          Allow patching directly from parsed hunks
        modified:
          bzrlib/patches.py              patches.py-20050727183609-378c1cc5972ce908
    ------------------------------------------------------------
    revno: 3777.2.3
    revision-id: pqm at pqm.ubuntu.com-20081016131807-r3p1hsepd24feegv
    parent: pqm at pqm.ubuntu.com-20081016043554-38i4ho6svnlyba65
    parent: v.ladeuil+lp at free.fr-20081016121145-0a86u6kjd4prz3nn
    committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
    branch nick: +trunk
    timestamp: Thu 2008-10-16 14:18:07 +0100
    message:
      Trivial doc fix
    modified:
      doc/developers/HACKING.txt     HACKING-20050805200004-2a5dc975d870f78c
        ------------------------------------------------------------
        revno: 3777.4.1
        revision-id: v.ladeuil+lp at free.fr-20081016121145-0a86u6kjd4prz3nn
        parent: pqm at pqm.ubuntu.com-20081016043554-38i4ho6svnlyba65
        committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
        branch nick: 284343-doc
        timestamp: Thu 2008-10-16 14:11:45 +0200
        message:
          Use '.patch. instead of '.diff'.
          
          * HACKING.txt: 
          Fix the only occurrence of '.diff' in the whole documentation,
          using '.patch' instead as we do in everywhere else.
        modified:
          doc/developers/HACKING.txt     HACKING-20050805200004-2a5dc975d870f78c
    ------------------------------------------------------------
    revno: 3777.2.2
    revision-id: pqm at pqm.ubuntu.com-20081016043554-38i4ho6svnlyba65
    parent: pqm at pqm.ubuntu.com-20081015214444-ztwoizx180edy73v
    parent: mbp at sourcefrog.net-20081016035842-77pczqghpnd5rxkt
    committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
    branch nick: +trunk
    timestamp: Thu 2008-10-16 05:35:54 +0100
    message:
      (mbp) merge 1.8final back to trunk
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/branch.py               branch.py-20050309040759-e4baf4e0d046576e
      bzrlib/tests/test_branch.py    test_branch.py-20060116013032-97819aa07b8ab3b5
      setup.py                       setup.py-20050314065409-02f8a0a6e3f9bc70
        ------------------------------------------------------------
        revno: 3777.3.1
        revision-id: mbp at sourcefrog.net-20081016035842-77pczqghpnd5rxkt
        parent: pqm at pqm.ubuntu.com-20081015214444-ztwoizx180edy73v
        parent: pqm at pqm.ubuntu.com-20081016023607-p9j30et9foqm0wa7
        committer: Martin Pool <mbp at sourcefrog.net>
        branch nick: integration
        timestamp: Thu 2008-10-16 14:58:42 +1100
        message:
          merge 1.8final back to trunk
        modified:
          NEWS                           NEWS-20050323055033-4e00b5db738777ff
          bzrlib/branch.py               branch.py-20050309040759-e4baf4e0d046576e
          bzrlib/tests/test_branch.py    test_branch.py-20060116013032-97819aa07b8ab3b5
          setup.py                       setup.py-20050314065409-02f8a0a6e3f9bc70
        ------------------------------------------------------------
        revno: 3763.3.3
        revision-id: pqm at pqm.ubuntu.com-20081016023607-p9j30et9foqm0wa7
        parent: pqm at pqm.ubuntu.com-20081009001122-ftxm8443zmis8vm4
        parent: mbp at sourcefrog.net-20081016015506-kr5oefh484xj90aw
        committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
        branch nick: 1.8
        timestamp: Thu 2008-10-16 03:36:07 +0100
        message:
          (mbp) prepare 1.8final
        modified:
          NEWS                           NEWS-20050323055033-4e00b5db738777ff
          bzrlib/__init__.py             __init__.py-20050309040759-33e65acf91bbcd5d
          bzrlib/branch.py               branch.py-20050309040759-e4baf4e0d046576e
          bzrlib/tests/test_branch.py    test_branch.py-20060116013032-97819aa07b8ab3b5
            ------------------------------------------------------------
            revno: 3763.7.2
            revision-id: mbp at sourcefrog.net-20081016015506-kr5oefh484xj90aw
            parent: mbp at sourcefrog.net-20081016015304-6rq775qvvlxtadk4
            committer: Martin Pool <mbp at sourcefrog.net>
            branch nick: prepare-1.8
            timestamp: Thu 2008-10-16 12:55:06 +1100
            message:
              Release bzr 1.8 final
            modified:
              NEWS                           NEWS-20050323055033-4e00b5db738777ff
              bzrlib/__init__.py             __init__.py-20050309040759-33e65acf91bbcd5d
            ------------------------------------------------------------
            revno: 3763.7.1
            revision-id: mbp at sourcefrog.net-20081016015304-6rq775qvvlxtadk4
            parent: pqm at pqm.ubuntu.com-20081009001122-ftxm8443zmis8vm4
            parent: andrew.bennetts at canonical.com-20081010070446-mqf1sj2g3fy7u6j1
            committer: Martin Pool <mbp at sourcefrog.net>
            branch nick: prepare-1.8
            timestamp: Thu 2008-10-16 12:53:04 +1100
            message:
              Merge Andrew's fix for 230902
            modified:
              NEWS                           NEWS-20050323055033-4e00b5db738777ff
              bzrlib/branch.py               branch.py-20050309040759-e4baf4e0d046576e
              bzrlib/tests/test_branch.py    test_branch.py-20060116013032-97819aa07b8ab3b5
            ------------------------------------------------------------
            revno: 3763.6.1
            revision-id: andrew.bennetts at canonical.com-20081010070446-mqf1sj2g3fy7u6j1
            parent: pqm at pqm.ubuntu.com-20081009001122-ftxm8443zmis8vm4
            parent: andrew.bennetts at canonical.com-20081007115411-uq38cuumnrw0trsm
            committer: Andrew Bennetts <andrew.bennetts at canonical.com>
            branch nick: push-unlock-1.8
            timestamp: Fri 2008-10-10 18:04:46 +1100
            message:
              Merge fix for #230902, adding NEWS entry.
            modified:
              NEWS                           NEWS-20050323055033-4e00b5db738777ff
              bzrlib/branch.py               branch.py-20050309040759-e4baf4e0d046576e
              bzrlib/tests/test_branch.py    test_branch.py-20060116013032-97819aa07b8ab3b5
            ------------------------------------------------------------
            revno: 3758.1.1
            revision-id: andrew.bennetts at canonical.com-20081007115411-uq38cuumnrw0trsm
            parent: pqm at pqm.ubuntu.com-20081001235145-nh3r3qcg0nwwmvdg
            committer: Andrew Bennetts <andrew.bennetts at canonical.com>
            branch nick: push-unlock
            timestamp: Tue 2008-10-07 22:54:11 +1100
            message:
              Fix #230902 by being more careful not to squash a pre-existing exception when calling foo.unlock()
            modified:
              bzrlib/branch.py               branch.py-20050309040759-e4baf4e0d046576e
              bzrlib/tests/test_branch.py    test_branch.py-20060116013032-97819aa07b8ab3b5
        ------------------------------------------------------------
        revno: 3763.3.2
        revision-id: pqm at pqm.ubuntu.com-20081009001122-ftxm8443zmis8vm4
        parent: pqm at pqm.ubuntu.com-20081007091257-ec2725q2xsrji7dn
        parent: mbp at sourcefrog.net-20081008225502-ekthueaqnz3cutg3
        committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
        branch nick: 1.8
        timestamp: Thu 2008-10-09 01:11:22 +0100
        message:
          (mbp) define -DWIN32 for pyrex
        modified:
          NEWS                           NEWS-20050323055033-4e00b5db738777ff
          setup.py                       setup.py-20050314065409-02f8a0a6e3f9bc70
        ------------------------------------------------------------
        revno: 3763.5.4
        revision-id: mbp at sourcefrog.net-20081008225502-ekthueaqnz3cutg3
        parent: mbp at sourcefrog.net-20081008053353-aqjccu3zsifjz0f1
        committer: Martin Pool <mbp at sourcefrog.net>
        branch nick: 277481-win32-pyrex
        timestamp: Thu 2008-10-09 09:55:02 +1100
        message:
          News for 277481
        modified:
          NEWS                           NEWS-20050323055033-4e00b5db738777ff
        ------------------------------------------------------------
        revno: 3763.5.3
        revision-id: mbp at sourcefrog.net-20081008053353-aqjccu3zsifjz0f1
        parent: mbp at sourcefrog.net-20081008011605-tzgv9owfn2wde4cg
        committer: Martin Pool <mbp at sourcefrog.net>
        branch nick: 277481-win32-pyrex
        timestamp: Wed 2008-10-08 16:33:53 +1100
        message:
          Review feedback on add_pyrex_extension
        modified:
          setup.py                       setup.py-20050314065409-02f8a0a6e3f9bc70
        ------------------------------------------------------------
        revno: 3763.5.2
        revision-id: mbp at sourcefrog.net-20081008011605-tzgv9owfn2wde4cg
        parent: mbp at sourcefrog.net-20081008011111-z68x2eto2j52648n
        committer: Martin Pool <mbp at sourcefrog.net>
        branch nick: prepare-1.8
        timestamp: Wed 2008-10-08 12:16:05 +1100
        message:
          Set -DWIN32 for all pyrex extensions, not one by one
        modified:
          setup.py                       setup.py-20050314065409-02f8a0a6e3f9bc70
        ------------------------------------------------------------
        revno: 3763.5.1
        revision-id: mbp at sourcefrog.net-20081008011111-z68x2eto2j52648n
        parent: pqm at pqm.ubuntu.com-20081007091257-ec2725q2xsrji7dn
        committer: Martin Pool <mbp at sourcefrog.net>
        branch nick: prepare-1.8
        timestamp: Wed 2008-10-08 12:11:11 +1100
        message:
          WIN32 must be defined when building all Pyrex extensions on Windows (#277481, from bialix)
        modified:
          setup.py                       setup.py-20050314065409-02f8a0a6e3f9bc70
    ------------------------------------------------------------
    revno: 3777.2.1
    revision-id: pqm at pqm.ubuntu.com-20081015214444-ztwoizx180edy73v
    parent: pqm at pqm.ubuntu.com-20081014031836-0pn8u98igc7gvtv0
    parent: aaron at aaronbentley.com-20081015191156-mrykcuir96zszuh7
    committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
    branch nick: +trunk
    timestamp: Wed 2008-10-15 22:44:44 +0100
    message:
      Enable specifying default ssh username in authentication.conf
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/tests/test_remote.py    test_remote.py-20060720103555-yeeg2x51vn0rbtdp-2
      bzrlib/tests/test_sftp_transport.py testsftp.py-20051027032739-247570325fec7e7e
      bzrlib/transport/ftp/__init__.py ftp.py-20051116161804-58dc9506548c2a53
      bzrlib/transport/remote.py     ssh.py-20060608202016-c25gvf1ob7ypbus6-1
      bzrlib/transport/sftp.py       sftp.py-20051019050329-ab48ce71b7e32dfe
      bzrlib/transport/ssh.py        ssh.py-20060824042150-0s9787kng6zv1nwq-1
    ------------------------------------------------------------
    revno: 3777.1.7
    revision-id: aaron at aaronbentley.com-20081015191156-mrykcuir96zszuh7
    parent: aaron at aaronbentley.com-20081015190711-so8c7mo9rfzs479e
    committer: Aaron Bentley <aaron at aaronbentley.com>
    branch nick: ssh-authconfig
    timestamp: Wed 2008-10-15 15:11:56 -0400
    message:
      Restore AuthenticationConfig
    modified:
      bzrlib/transport/ssh.py        ssh.py-20060824042150-0s9787kng6zv1nwq-1
    ------------------------------------------------------------
    revno: 3777.1.6
    revision-id: aaron at aaronbentley.com-20081015190711-so8c7mo9rfzs479e
    parent: aaron at aaronbentley.com-20081015185954-6hm2y83u6fddrkeg
    committer: Aaron Bentley <aaron at aaronbentley.com>
    branch nick: ssh-authconfig
    timestamp: Wed 2008-10-15 15:07:11 -0400
    message:
      Update NEWS
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
    ------------------------------------------------------------
    revno: 3777.1.5
    revision-id: aaron at aaronbentley.com-20081015185954-6hm2y83u6fddrkeg
    parent: aaron at aaronbentley.com-20081015185907-lw5srt2ah0huccvt
    committer: Aaron Bentley <aaron at aaronbentley.com>
    branch nick: ssh-authconfig
    timestamp: Wed 2008-10-15 14:59:54 -0400
    message:
      Remove AuthenticationConfig handling from Paramiko SSHVendor
    modified:
      bzrlib/transport/ssh.py        ssh.py-20060824042150-0s9787kng6zv1nwq-1
    ------------------------------------------------------------
    revno: 3777.1.4
    revision-id: aaron at aaronbentley.com-20081015185907-lw5srt2ah0huccvt
    parent: aaron at aaronbentley.com-20081015184528-mcdgasht0vz5bo8k
    committer: Aaron Bentley <aaron at aaronbentley.com>
    branch nick: ssh-authconfig
    timestamp: Wed 2008-10-15 14:59:07 -0400
    message:
      bzr+ssh and sftp both use ssh scheme.
    modified:
      bzrlib/tests/test_sftp_transport.py testsftp.py-20051027032739-247570325fec7e7e
      bzrlib/transport/sftp.py       sftp.py-20051019050329-ab48ce71b7e32dfe
    ------------------------------------------------------------
    revno: 3777.1.3
    revision-id: aaron at aaronbentley.com-20081015184528-mcdgasht0vz5bo8k
    parent: aaron at aaronbentley.com-20081015172318-kg6h9v0daz8m66ns
    committer: Aaron Bentley <aaron at aaronbentley.com>
    branch nick: ssh-authconfig
    timestamp: Wed 2008-10-15 14:45:28 -0400
    message:
      Use SSH default username from authentication.conf
    modified:
      bzrlib/tests/test_remote.py    test_remote.py-20060720103555-yeeg2x51vn0rbtdp-2
      bzrlib/transport/remote.py     ssh.py-20060608202016-c25gvf1ob7ypbus6-1
    ------------------------------------------------------------
    revno: 3777.1.2
    revision-id: aaron at aaronbentley.com-20081015172318-kg6h9v0daz8m66ns
    parent: aaron at aaronbentley.com-20081015155150-ewayhro15dhve4cs
    committer: Aaron Bentley <aaron at aaronbentley.com>
    branch nick: ssh-authconfig
    timestamp: Wed 2008-10-15 13:23:18 -0400
    message:
      Make testing more thorough
    modified:
      bzrlib/tests/test_sftp_transport.py testsftp.py-20051027032739-247570325fec7e7e
    ------------------------------------------------------------
    revno: 3777.1.1
    revision-id: aaron at aaronbentley.com-20081015155150-ewayhro15dhve4cs
    parent: pqm at pqm.ubuntu.com-20081014031836-0pn8u98igc7gvtv0
    committer: Aaron Bentley <aaron at aaronbentley.com>
    branch nick: ssh-authconfig
    timestamp: Wed 2008-10-15 11:51:50 -0400
    message:
      Use auth.conf for sftp
    modified:
      bzrlib/tests/test_sftp_transport.py testsftp.py-20051027032739-247570325fec7e7e
      bzrlib/transport/ftp/__init__.py ftp.py-20051116161804-58dc9506548c2a53
      bzrlib/transport/sftp.py       sftp.py-20051019050329-ab48ce71b7e32dfe
-------------- next part --------------
=== modified file 'NEWS'
--- a/NEWS	2008-10-17 16:14:20 +0000
+++ b/NEWS	2008-10-17 19:58:53 +0000
@@ -16,8 +16,24 @@
     * ``bzr dump-btree`` is a hidden command introduced to allow dumping
       the contents of a compressed btree file.  (John Arbash Meinel)
 
+    * default username for bzr+ssh and sftp can be configured in
+      authentication.conf. (Aaron Bentley)
+
+    * launchpad-login now provides a default username for bzr+ssh and sftp
+      URLs, allowing username-free URLs to work for everyone. (Aaron Bentley)
+
   BUG FIXES:
 
+    * A failure to load a plugin due to an IncompatibleAPI exception is
+      now correctly reported. (Robert Collins, #279451)
+
+    * API versioning support now has a multiple-version checking api
+      ``require_any_api``. (Robert Collins, #279447)
+
+    * ``bzr co`` uses less memory. It used to unpack the entire WT into
+      memory before writing it to disk. This was a little bit faster, but
+      consumed lots of memory. (John Arbash Meinel, #269456)
+
     * Fixes to the ``annotate`` code. The fast-path which re-used the
       stored deltas was accidentally disabled all the time, instead of
       only when a branch was stacked. Second, the code would accidentally
@@ -33,17 +49,35 @@
 
   INTERNALS:
 
+     * New AuthenticationConfig.set_credentials method allows easy programmatic
+       configuration of authetication credentials.
+
+  PORTABILITY:
+
+
+bzr 1.8 2008-10-16
+------------------
+
+Bazaar 1.8 includes several fixes that improve working tree performance,
+display of revision logs, and merges.  The bzr testsuite now passes on OS
+X and Python 2.6, and almost completely passes on Windows.  The
+smartserver code has gained several bug fixes and performance
+improvements, and can now run server-side hooks within an http server.
+
+  BUG FIXES:
+
+   * Fix "Must end write group" error when another error occurs during
+     ``bzr push``.  (Andrew Bennetts, #230902)
+
+  PORTABILITY:
+
+   * Some Pyrex versions require the WIN32 macro defined to compile on
+     that platform.  (Alexander Belchenko, Martin Pool, #277481)
+
 
 bzr 1.8rc1 2008-10-07
 ---------------------
 
-Bazaar 1.8 includes several fixes that improve working tree performance,
-display of revision logs, and merges.  We've also fixed, and the bzr
-testsuite now passes on OS X and Python 2.6, and almost completely passes
-on Windows.  The smartserver code has gained several bug fixes and
-performance improvements, and can now run server-side hooks within an http
-server.
-
   CHANGES:
 
     * ``bzr log file`` has been changed. It now uses a different method
@@ -116,24 +150,14 @@
 
   BUG FIXES:
 
-    * API versioning support now has a multiple-version checking api
-      ``require_any_api``. (Robert Collins, #279447)
-
     * Avoid random failures arising from misinterpreted ``errno`` values
       in ``_readdir_pyx.read_dir``.
       (Martin Pool, #279381)
 
-    * A failure to load a plugin due to an IncompatibleAPI exception is
-      now correctly reported. (Robert Collins, #279451)
-
     * Branching from a shared repository on a smart server into a new
       repository now preserves the repository format.
       (Andrew Bennetts, #269214)
 
-    * ``bzr co`` uses less memory. It used to unpack the entire WT into
-      memory before writing it to disk. This was a little bit faster, but
-      consumed lots of memory. (John Arbash Meinel, #269456)
-
     * ``bzr log`` now accepts a ``--change`` option.
       (Vincent Ladeuil, #248427)
 

=== modified file 'bzrlib/branch.py'
--- a/bzrlib/branch.py	2008-09-25 22:25:09 +0000
+++ b/bzrlib/branch.py	2008-10-07 11:54:11 +0000
@@ -1743,14 +1743,10 @@
         """
         # TODO: Public option to disable running hooks - should be trivial but
         # needs tests.
-        target.lock_write()
-        try:
-            result = self._push_with_bound_branches(target, overwrite,
-                    stop_revision,
-                    _override_hook_source_branch=_override_hook_source_branch)
-            return result
-        finally:
-            target.unlock()
+        return _run_with_write_locked_target(
+            target, self._push_with_bound_branches, target, overwrite,
+            stop_revision,
+            _override_hook_source_branch=_override_hook_source_branch)
 
     def _push_with_bound_branches(self, target, overwrite,
             stop_revision,
@@ -2445,3 +2441,37 @@
         branch._set_config_location('stacked_on_location', '')
         # update target format
         branch._transport.put_bytes('format', format.get_format_string())
+
+
+
+def _run_with_write_locked_target(target, callable, *args, **kwargs):
+    """Run ``callable(*args, **kwargs)``, write-locking target for the
+    duration.
+
+    _run_with_write_locked_target will attempt to release the lock it acquires.
+
+    If an exception is raised by callable, then that exception *will* be
+    propagated, even if the unlock attempt raises its own error.  Thus
+    _run_with_write_locked_target should be preferred to simply doing::
+
+        target.lock_write()
+        try:
+            return callable(*args, **kwargs)
+        finally:
+            target.unlock()
+    
+    """
+    # This is very similar to bzrlib.decorators.needs_write_lock.  Perhaps they
+    # should share code?
+    target.lock_write()
+    try:
+        result = callable(*args, **kwargs)
+    except:
+        exc_info = sys.exc_info()
+        try:
+            target.unlock()
+        finally:
+            raise exc_info[0], exc_info[1], exc_info[2]
+    else:
+        target.unlock()
+        return result

=== modified file 'bzrlib/config.py'
--- a/bzrlib/config.py	2008-09-08 12:59:00 +0000
+++ b/bzrlib/config.py	2008-10-16 18:30:32 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2005, 2007 Canonical Ltd
+# Copyright (C) 2005, 2007, 2008 Canonical Ltd
 #   Authors: Robert Collins <robert.collins at canonical.com>
 #            and others
 #
@@ -1064,6 +1064,47 @@
 
         return credentials
 
+    def set_credentials(self, name, host, user, scheme=None, password=None,
+                        port=None, path=None, verify_certificates=None):
+        """Set authentication credentials for a host.
+
+        Any existing credentials with matching scheme, host, port and path
+        will be deleted, regardless of name.
+
+        :param name: An arbitrary name to describe this set of credentials.
+        :param host: Name of the host that accepts these credentials.
+        :param user: The username portion of these credentials.
+        :param scheme: The URL scheme (e.g. ssh, http) the credentials apply
+            to.
+        :param password: Password portion of these credentials.
+        :param port: The IP port on the host that these credentials apply to.
+        :param path: A filesystem path on the host that these credentials
+            apply to.
+        :param verify_certificates: On https, verify server certificates if
+            True.
+        """
+        values = {'host': host, 'user': user}
+        if password is not None:
+            values['password'] = password
+        if scheme is not None:
+            values['scheme'] = scheme
+        if port is not None:
+            values['port'] = '%d' % port
+        if path is not None:
+            values['path'] = path
+        if verify_certificates is not None:
+            values['verify_certificates'] = str(verify_certificates)
+        config = self._get_config()
+        for_deletion = []
+        for section, existing_values in config.items():
+            for key in ('scheme', 'host', 'port', 'path'):
+                if existing_values.get(key) != values.get(key):
+                    break
+            else:
+                del config[section]
+        config.update({name: values})
+        self._save()
+
     def get_user(self, scheme, host, port=None,
                  realm=None, path=None, prompt=None):
         """Get a user from authentication file.

=== modified file 'bzrlib/patches.py'
--- a/bzrlib/patches.py	2008-09-08 12:59:00 +0000
+++ b/bzrlib/patches.py	2008-10-16 19:04:48 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2004 - 2006 Aaron Bentley, Canonical Ltd
+# Copyright (C) 2004 - 2006, 2008 Aaron Bentley, Canonical Ltd
 # <aaron.bentley at utoronto.ca>
 #
 # This program is free software; you can redistribute it and/or modify
@@ -393,13 +393,23 @@
     """Iterate through a series of lines with a patch applied.
     This handles a single file, and does exact, not fuzzy patching.
     """
-    if orig_lines is not None:
-        orig_lines = orig_lines.__iter__()
+    patch_lines = iter_lines_handle_nl(iter(patch_lines))
+    get_patch_names(patch_lines)
+    return iter_patched_from_hunks(orig_lines, iter_hunks(patch_lines))
+
+
+def iter_patched_from_hunks(orig_lines, hunks):
+    """Iterate through a series of lines with a patch applied.
+    This handles a single file, and does exact, not fuzzy patching.
+
+    :param orig_lines: The unpatched lines.
+    :param hunks: An iterable of Hunk instances.
+    """
     seen_patch = []
-    patch_lines = iter_lines_handle_nl(patch_lines.__iter__())
-    get_patch_names(patch_lines)
     line_no = 1
-    for hunk in iter_hunks(patch_lines):
+    if orig_lines is not None:
+        orig_lines = iter(orig_lines)
+    for hunk in hunks:
         while line_no < hunk.orig_pos:
             orig_line = orig_lines.next()
             yield orig_line

=== modified file 'bzrlib/plugins/launchpad/account.py'
--- a/bzrlib/plugins/launchpad/account.py	2007-11-12 21:23:07 +0000
+++ b/bzrlib/plugins/launchpad/account.py	2008-10-17 12:22:34 +0000
@@ -20,8 +20,8 @@
 than once for each place that needs to take it into account.
 """
 
-from bzrlib import errors
-from bzrlib.config import GlobalConfig
+from bzrlib import errors, trace
+from bzrlib.config import AuthenticationConfig, GlobalConfig
 from bzrlib.transport import get_transport
 
 
@@ -36,20 +36,56 @@
     _fmt = "The user %(user)s has not registered any SSH keys with Launchpad."
 
 
+class MismatchedUsernames(errors.BzrError):
+
+    _fmt = ('bazaar.conf and authentication.conf disagree about launchpad'
+            ' account name.  Please re-run launchpad-login.')
+
+
 def get_lp_login(_config=None):
-    """Return the user's Launchpad username"""
-    if _config is None:
-        _config = GlobalConfig()
-
-    return _config.get_user_option('launchpad_username')
+    """Return the user's Launchpad username.
+
+    :raises: MismatchedUsername if authentication.conf and bazaar.conf
+        disagree about username.
+    """
+    if _config is None:
+        _config = GlobalConfig()
+
+    username = _config.get_user_option('launchpad_username')
+    if username is not None:
+        auth = AuthenticationConfig()
+        auth_username = _get_auth_user(auth)
+        # Auto-upgrading
+        if auth_username is None:
+            trace.note('Setting ssh/sftp username for bazaar.launchpad.net.')
+            _set_auth_user(username, auth)
+        elif auth_username != username:
+            raise MismatchedUsernames()
+    return username
+
+
+def _set_global_option(username, _config=None):
+    if _config is None:
+        _config = GlobalConfig()
+    _config.set_user_option('launchpad_username', username)
 
 
 def set_lp_login(username, _config=None):
     """Set the user's Launchpad username"""
-    if _config is None:
-        _config = GlobalConfig()
-
-    _config.set_user_option('launchpad_username', username)
+    _set_global_option(username, _config)
+    _set_auth_user(username)
+
+
+def _get_auth_user(auth=None):
+    if auth is None:
+        auth = AuthenticationConfig()
+    return auth.get_user('ssh', 'bazaar.launchpad.net')
+
+def _set_auth_user(username, auth=None):
+    if auth is None:
+        auth = AuthenticationConfig()
+    auth.set_credentials(
+        'Launchpad', 'bazaar.launchpad.net', username, 'ssh')
 
 
 def check_lp_login(username, _transport=None):

=== modified file 'bzrlib/plugins/launchpad/test_account.py'
--- a/bzrlib/plugins/launchpad/test_account.py	2007-10-18 08:58:19 +0000
+++ b/bzrlib/plugins/launchpad/test_account.py	2008-10-17 12:22:34 +0000
@@ -63,6 +63,38 @@
         self.assertEqualDiff('The user test-user has not registered any '
                              'SSH keys with Launchpad.', str(error))
 
+    def test_set_lp_login_updates_authentication_conf(self):
+        self.assertIs(None, account._get_auth_user())
+        account.set_lp_login('foo')
+        self.assertEqual('foo', account._get_auth_user())
+
+    def test_get_lp_login_does_not_update_for_none_user(self):
+        account.get_lp_login()
+        self.assertIs(None, account._get_auth_user())
+
+    def test_get_lp_login_updates_authentication_conf(self):
+        account._set_global_option('foo')
+        self.assertIs(None, account._get_auth_user())
+        account.get_lp_login()
+        self.assertEqual('foo', account._get_auth_user())
+
+    def test_get_lp_login_leaves_existing_credentials(self):
+        auth = config.AuthenticationConfig()
+        auth.set_credentials('Foo', 'bazaar.launchpad.net', 'foo', 'ssh')
+        account._set_global_option('foo')
+        account.get_lp_login()
+        auth = config.AuthenticationConfig()
+        credentials = auth.get_credentials('ssh', 'bazaar.launchpad.net')
+        self.assertEqual('Foo', credentials['name'])
+
+    def test_get_lp_login_errors_on_mismatch(self):
+        account._set_auth_user('foo')
+        account._set_global_option('bar')
+        e = self.assertRaises(account.MismatchedUsernames,
+                              account.get_lp_login)
+        self.assertEqual('bazaar.conf and authentication.conf disagree about'
+            ' launchpad account name.  Please re-run launchpad-login.', str(e))
+
 
 class CheckAccountTests(TestCaseWithMemoryTransport):
 

=== modified file 'bzrlib/plugins/launchpad/test_lp_directory.py'
--- a/bzrlib/plugins/launchpad/test_lp_directory.py	2008-03-06 21:16:38 +0000
+++ b/bzrlib/plugins/launchpad/test_lp_directory.py	2008-10-17 12:22:34 +0000
@@ -23,7 +23,11 @@
     )
 from bzrlib.branch import Branch
 from bzrlib.directory_service import directories
-from bzrlib.tests import TestCase, TestCaseWithMemoryTransport
+from bzrlib.tests import (
+    TestCase,
+    TestCaseInTempDir,
+    TestCaseWithMemoryTransport
+)
 from bzrlib.transport import get_transport
 from bzrlib.plugins.launchpad import _register_directory
 from bzrlib.plugins.launchpad.lp_directory import (
@@ -46,7 +50,7 @@
         return self._result
 
 
-class DirectoryUrlTests(TestCase):
+class DirectoryUrlTests(TestCaseInTempDir):
     """Tests for branch urls through Launchpad.net directory"""
 
     def test_short_form(self):

=== modified file 'bzrlib/tests/test_branch.py'
--- a/bzrlib/tests/test_branch.py	2008-07-22 19:48:40 +0000
+++ b/bzrlib/tests/test_branch.py	2008-10-07 11:54:11 +0000
@@ -41,6 +41,7 @@
     BzrBranchFormat5,
     BzrBranchFormat6,
     PullResult,
+    _run_with_write_locked_target,
     )
 from bzrlib.bzrdir import (BzrDirMetaFormat1, BzrDirMeta1, 
                            BzrDir, BzrDirFormat)
@@ -438,3 +439,70 @@
         # it's still supported
         a = "%d revisions pulled" % r
         self.assertEqual(a, "10 revisions pulled")
+
+
+
+class _StubLockable(object):
+    """Helper for TestRunWithWriteLockedTarget."""
+
+    def __init__(self, calls, unlock_exc=None):
+        self.calls = calls
+        self.unlock_exc = unlock_exc
+
+    def lock_write(self):
+        self.calls.append('lock_write')
+    
+    def unlock(self):
+        self.calls.append('unlock')
+        if self.unlock_exc is not None:
+            raise self.unlock_exc
+
+
+class _ErrorFromCallable(Exception):
+    """Helper for TestRunWithWriteLockedTarget."""
+
+
+class _ErrorFromUnlock(Exception):
+    """Helper for TestRunWithWriteLockedTarget."""
+
+
+class TestRunWithWriteLockedTarget(TestCase):
+    """Tests for _run_with_write_locked_target."""
+
+    def setUp(self):
+        self._calls = []
+
+    def func_that_returns_ok(self):
+        self._calls.append('func called')
+        return 'ok'
+
+    def func_that_raises(self):
+        self._calls.append('func called')
+        raise _ErrorFromCallable()
+
+    def test_success_unlocks(self):
+        lockable = _StubLockable(self._calls)
+        result = _run_with_write_locked_target(
+            lockable, self.func_that_returns_ok)
+        self.assertEqual('ok', result)
+        self.assertEqual(['lock_write', 'func called', 'unlock'], self._calls)
+
+    def test_exception_unlocks_and_propagates(self):
+        lockable = _StubLockable(self._calls)
+        self.assertRaises(_ErrorFromCallable,
+            _run_with_write_locked_target, lockable, self.func_that_raises)
+        self.assertEqual(['lock_write', 'func called', 'unlock'], self._calls)
+
+    def test_callable_succeeds_but_error_during_unlock(self):
+        lockable = _StubLockable(self._calls, unlock_exc=_ErrorFromUnlock())
+        self.assertRaises(_ErrorFromUnlock,
+            _run_with_write_locked_target, lockable, self.func_that_returns_ok)
+        self.assertEqual(['lock_write', 'func called', 'unlock'], self._calls)
+
+    def test_error_during_unlock_does_not_mask_original_error(self):
+        lockable = _StubLockable(self._calls, unlock_exc=_ErrorFromUnlock())
+        self.assertRaises(_ErrorFromCallable,
+            _run_with_write_locked_target, lockable, self.func_that_raises)
+        self.assertEqual(['lock_write', 'func called', 'unlock'], self._calls)
+
+

=== modified file 'bzrlib/tests/test_config.py'
--- a/bzrlib/tests/test_config.py	2008-08-10 11:26:50 +0000
+++ b/bzrlib/tests/test_config.py	2008-10-16 18:30:32 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2005, 2006 Canonical Ltd
+# Copyright (C) 2005, 2006, 2008 Canonical Ltd
 #   Authors: Robert Collins <robert.collins at canonical.com>
 #
 # This program is free software; you can redistribute it and/or modify
@@ -1412,6 +1412,32 @@
         self.assertEquals(True, credentials.get('verify_certificates'))
 
 
+class TestAuthenticationStorage(tests.TestCaseInTempDir):
+
+    def test_set_credentials(self):
+        conf = config.AuthenticationConfig()
+        conf.set_credentials('name', 'host', 'user', 'scheme', 'password',
+        99, path='/foo', verify_certificates=False)
+        credentials = conf.get_credentials(host='host', scheme='scheme',
+                                           port=99, path='/foo')
+        CREDENTIALS = {'name': 'name', 'user': 'user', 'password': 'password',
+                       'verify_certificates': False,}
+        self.assertEqual(CREDENTIALS, credentials)
+        credentials_from_disk = config.AuthenticationConfig().get_credentials(
+            host='host', scheme='scheme', port=99, path='/foo')
+        self.assertEqual(CREDENTIALS, credentials_from_disk)
+
+    def test_reset_credentials_different_name(self):
+        conf = config.AuthenticationConfig()
+        conf.set_credentials('name', 'host', 'user', 'scheme', 'password'),
+        conf.set_credentials('name2', 'host', 'user2', 'scheme', 'password'),
+        self.assertIs(None, conf._get_config().get('name'))
+        credentials = conf.get_credentials(host='host', scheme='scheme')
+        CREDENTIALS = {'name': 'name2', 'user': 'user2', 'password':
+                       'password', 'verify_certificates': True}
+        self.assertEqual(CREDENTIALS, credentials)
+
+
 class TestAuthenticationConfig(tests.TestCase):
     """Test AuthenticationConfig behaviour"""
 

=== modified file 'bzrlib/tests/test_patches.py'
--- a/bzrlib/tests/test_patches.py	2008-05-08 04:18:41 +0000
+++ b/bzrlib/tests/test_patches.py	2008-10-14 03:01:36 +0000
@@ -31,6 +31,7 @@
                             get_patch_names,
                             hunk_from_header, 
                             iter_patched, 
+                            iter_patched_from_hunks,
                             parse_line,
                             parse_patch,
                             parse_patches)
@@ -187,6 +188,28 @@
                 count += 1
             self.assertEqual(count, len(mod_lines))
 
+    def test_iter_patched_from_hunks(self):
+        """Test a few patch files, and make sure they work."""
+        files = [
+            ('diff-2', 'orig-2', 'mod-2'),
+            ('diff-3', 'orig-3', 'mod-3'),
+            ('diff-4', 'orig-4', 'mod-4'),
+            ('diff-5', 'orig-5', 'mod-5'),
+            ('diff-6', 'orig-6', 'mod-6'),
+        ]
+        for diff, orig, mod in files:
+            parsed = parse_patch(self.datafile(diff))
+            orig_lines = list(self.datafile(orig))
+            mod_lines = list(self.datafile(mod))
+            iter_patched = iter_patched_from_hunks(orig_lines, parsed.hunks)
+            patched_file = IterableFile(iter_patched)
+            lines = []
+            count = 0
+            for patch_line in patched_file:
+                self.assertEqual(patch_line, mod_lines[count])
+                count += 1
+            self.assertEqual(count, len(mod_lines))
+
     def testFirstLineRenumber(self):
         """Make sure we handle lines at the beginning of the hunk"""
         patch = parse_patch(self.datafile("insert_top.patch"))

=== modified file 'bzrlib/tests/test_remote.py'
--- a/bzrlib/tests/test_remote.py	2008-09-17 04:33:24 +0000
+++ b/bzrlib/tests/test_remote.py	2008-10-15 18:45:28 +0000
@@ -27,6 +27,7 @@
 from cStringIO import StringIO
 
 from bzrlib import (
+    config,
     errors,
     graph,
     pack,
@@ -49,7 +50,11 @@
 from bzrlib.symbol_versioning import one_four
 from bzrlib.transport import get_transport, http
 from bzrlib.transport.memory import MemoryTransport
-from bzrlib.transport.remote import RemoteTransport, RemoteTCPTransport
+from bzrlib.transport.remote import (
+    RemoteTransport,
+    RemoteSSHTransport,
+    RemoteTCPTransport,
+)
 
 
 class BasicRemoteObjectTests(tests.TestCaseWithTransport):
@@ -1014,6 +1019,22 @@
             client._calls)
 
 
+class TestRemoteSSHTransportAuthentication(tests.TestCaseInTempDir):
+
+    def test_defaults_to_none(self):
+        t = RemoteSSHTransport('bzr+ssh://example.com')
+        self.assertIs(None, t._get_credentials()[0])
+
+    def test_uses_authentication_config(self):
+        conf = config.AuthenticationConfig()
+        conf._get_config().update(
+            {'bzr+sshtest': {'scheme': 'ssh', 'user': 'bar', 'host':
+            'example.com'}})
+        conf._save()
+        t = RemoteSSHTransport('bzr+ssh://example.com')
+        self.assertEqual('bar', t._get_credentials()[0])
+
+
 class TestRemoteRepository(tests.TestCase):
     """Base for testing RemoteRepository protocol usage.
     

=== modified file 'bzrlib/tests/test_sftp_transport.py'
--- a/bzrlib/tests/test_sftp_transport.py	2008-09-26 15:34:03 +0000
+++ b/bzrlib/tests/test_sftp_transport.py	2008-10-15 18:59:07 +0000
@@ -29,6 +29,7 @@
 
 from bzrlib import (
     bzrdir,
+    config,
     errors,
     tests,
     transport as _mod_transport,
@@ -483,3 +484,27 @@
         self.checkGetRequests([(0, 32768), (32768, 32768), (65536, 464)],
                               [(0, 40000), (40000, 100), (40100, 1900),
                                (42000, 24000)])
+
+
+class TestUsesAuthConfig(TestCaseWithSFTPServer):
+    """Test that AuthenticationConfig can supply default usernames."""
+
+    def get_transport_for_connection(self, set_config):
+        port = self.get_server()._listener.port
+        if set_config:
+            conf = config.AuthenticationConfig()
+            conf._get_config().update(
+                {'sftptest': {'scheme': 'ssh', 'port': port, 'user': 'bar'}})
+            conf._save()
+        t = get_transport('sftp://localhost:%d' % port)
+        # force a connection to be performed.
+        t.has('foo')
+        return t
+
+    def test_sftp_uses_config(self):
+        t = self.get_transport_for_connection(set_config=True)
+        self.assertEqual('bar', t._get_credentials()[0])
+
+    def test_sftp_is_none_if_no_config(self):
+        t = self.get_transport_for_connection(set_config=False)
+        self.assertIs(None, t._get_credentials()[0])

=== modified file 'bzrlib/tests/test_transform.py'
--- a/bzrlib/tests/test_transform.py	2008-10-10 11:55:03 +0000
+++ b/bzrlib/tests/test_transform.py	2008-10-13 15:09:16 +0000
@@ -2013,6 +2013,13 @@
         resolve_conflicts(tt)
 
 
+A_ENTRY = ('a-id', ('a', 'a'), True, (True, True),
+                  ('TREE_ROOT', 'TREE_ROOT'), ('a', 'a'), ('file', 'file'),
+                  (False, False))
+ROOT_ENTRY = ('TREE_ROOT', ('', ''), False, (True, True), (None, None),
+              ('', ''), ('directory', 'directory'), (False, None))
+
+
 class TestTransformPreview(tests.TestCaseWithTransport):
 
     def create_tree(self):
@@ -2090,23 +2097,25 @@
                           (False, False))],
                           list(preview_tree.iter_changes(revision_tree)))
 
-    def test_include_unchanged_value_error(self):
+    def test_include_unchanged_succeeds(self):
         revision_tree, preview_tree = self.get_tree_and_preview_tree()
-        e = self.assertRaises(ValueError, preview_tree.iter_changes,
-                              revision_tree, include_unchanged=True)
-        self.assertEqual('include_unchanged is not supported', str(e))
+        changes = preview_tree.iter_changes(revision_tree,
+                                            include_unchanged=True)
+        root = revision_tree.inventory.root.file_id
+
+        self.assertEqual([ROOT_ENTRY, A_ENTRY], list(changes))
 
     def test_specific_files(self):
         revision_tree, preview_tree = self.get_tree_and_preview_tree()
-        e = self.assertRaises(ValueError, preview_tree.iter_changes,
-                              revision_tree, specific_files=['pete'])
-        self.assertEqual('specific_files is not supported', str(e))
+        changes = preview_tree.iter_changes(revision_tree,
+                                            specific_files=[''])
+        self.assertEqual([ROOT_ENTRY, A_ENTRY], list(changes))
 
-    def test_want_unversioned_value_error(self):
+    def test_want_unversioned(self):
         revision_tree, preview_tree = self.get_tree_and_preview_tree()
-        e = self.assertRaises(ValueError, preview_tree.iter_changes,
-                              revision_tree, want_unversioned=True)
-        self.assertEqual('want_unversioned is not supported', str(e))
+        changes = preview_tree.iter_changes(revision_tree,
+                                            want_unversioned=True)
+        self.assertEqual([ROOT_ENTRY, A_ENTRY], list(changes))
 
     def test_ignore_extra_trees_no_specific_files(self):
         # extra_trees is harmless without specific_files, so we'll silently

=== modified file 'bzrlib/transform.py'
--- a/bzrlib/transform.py	2008-10-14 02:34:56 +0000
+++ b/bzrlib/transform.py	2008-10-14 02:50:56 +0000
@@ -1753,11 +1753,11 @@
                       require_versioned=True, want_unversioned=False):
         """See InterTree.iter_changes.
 
-        This implementation does not support include_unchanged, specific_files,
-        or want_unversioned.  extra_trees, require_versioned, and pb are
-        ignored.
+        This has a fast path that is only used when the from_tree matches
+        the transform tree, and no fancy options are supplied.
         """
-        if from_tree is not self._transform._tree:
+        if (from_tree is not self._transform._tree or include_unchanged or
+            specific_files or want_unversioned):
             return tree.InterTree(from_tree, self).iter_changes(
                 include_unchanged=include_unchanged,
                 specific_files=specific_files,
@@ -1765,10 +1765,6 @@
                 extra_trees=extra_trees,
                 require_versioned=require_versioned,
                 want_unversioned=want_unversioned)
-        if include_unchanged:
-            raise ValueError('include_unchanged is not supported')
-        if specific_files is not None:
-            raise ValueError('specific_files is not supported')
         if want_unversioned:
             raise ValueError('want_unversioned is not supported')
         return self._transform.iter_changes()

=== modified file 'bzrlib/transport/ftp/__init__.py'
--- a/bzrlib/transport/ftp/__init__.py	2008-08-28 15:01:41 +0000
+++ b/bzrlib/transport/ftp/__init__.py	2008-10-15 15:51:50 +0000
@@ -116,9 +116,10 @@
 
         :return: The created connection and its associated credentials.
 
-        The credentials are only the password as it may have been entered
-        interactively by the user and may be different from the one provided
-        in base url at transport creation time.
+        The input credentials are only the password as it may have been
+        entered interactively by the user and may be different from the one
+        provided in base url at transport creation time.  The returned
+        credentials are username, password.
         """
         if credentials is None:
             user, password = self._user, self._password

=== modified file 'bzrlib/transport/remote.py'
--- a/bzrlib/transport/remote.py	2008-09-25 16:03:22 +0000
+++ b/bzrlib/transport/remote.py	2008-10-15 18:45:28 +0000
@@ -512,15 +512,16 @@
     """
 
     def _build_medium(self):
-        # ssh will prompt the user for a password if needed and if none is
-        # provided but it will not give it back, so no credentials can be
-        # stored.
         location_config = config.LocationConfig(self.base)
         bzr_remote_path = location_config.get_bzr_remote_path()
+        user = self._user
+        if user is None:
+            auth = config.AuthenticationConfig()
+            user = auth.get_user('ssh', self._host, self._port)
         client_medium = medium.SmartSSHClientMedium(self._host, self._port,
-            self._user, self._password, self.base,
+            user, self._password, self.base,
             bzr_remote_path=bzr_remote_path)
-        return client_medium, None
+        return client_medium, (user, self._password)
 
 
 class RemoteHTTPTransport(RemoteTransport):

=== modified file 'bzrlib/transport/sftp.py'
--- a/bzrlib/transport/sftp.py	2008-09-10 17:33:01 +0000
+++ b/bzrlib/transport/sftp.py	2008-10-15 18:59:07 +0000
@@ -39,6 +39,7 @@
 import warnings
 
 from bzrlib import (
+    config,
     errors,
     urlutils,
     )
@@ -375,9 +376,13 @@
             password = credentials
 
         vendor = ssh._get_ssh_vendor()
+        user = self._user
+        if user is None:
+            auth = config.AuthenticationConfig()
+            user = auth.get_user('ssh', self._host, self._port)
         connection = vendor.connect_sftp(self._user, password,
                                          self._host, self._port)
-        return connection, password
+        return connection, (user, password)
 
     def _get_sftp(self):
         """Ensures that a connection is established"""

=== modified file 'bzrlib/transport/ssh.py'
--- a/bzrlib/transport/ssh.py	2008-04-24 07:22:53 +0000
+++ b/bzrlib/transport/ssh.py	2008-10-15 19:11:56 +0000
@@ -458,18 +458,10 @@
 
 
 def _paramiko_auth(username, password, host, port, paramiko_transport):
-    # paramiko requires a username, but it might be none if nothing was supplied
-    # use the local username, just in case.
-    # We don't override username, because if we aren't using paramiko,
-    # the username might be specified in ~/.ssh/config and we don't want to
-    # force it to something else
-    # Also, it would mess up the self.relpath() functionality
-    auth = config.AuthenticationConfig()
+    # paramiko requires a username, but it might be none if nothing was
+    # supplied.  If so, use the local username.
     if username is None:
-        username = auth.get_user('ssh', host, port=port)
-        if username is None:
-            # Default to local user
-            username = getpass.getuser()
+        username = getpass.getuser()
 
     if _use_ssh_agent:
         agent = paramiko.Agent()
@@ -496,6 +488,7 @@
             pass
 
     # give up and ask for a password
+    auth = config.AuthenticationConfig()
     password = auth.get_password('ssh', host, username, port=port)
     try:
         paramiko_transport.auth_password(username, password)

=== modified file 'doc/developers/HACKING.txt'
--- a/doc/developers/HACKING.txt	2008-09-04 04:55:36 +0000
+++ b/doc/developers/HACKING.txt	2008-10-16 12:11:45 +0000
@@ -224,9 +224,9 @@
 
 You can generate a merge request like this::
 
-  bzr send -o bug-1234.diff
+  bzr send -o bug-1234.patch
   
-A ``.diff`` extension is recommended instead of .bundle as many mail clients
+A ``.patch`` extension is recommended instead of .bundle as many mail clients
 will send the latter as a binary file.
 
 ``bzr send`` can also send mail directly if you prefer; see the help.

=== modified file 'setup.py'
--- a/setup.py	2008-10-10 19:41:44 +0000
+++ b/setup.py	2008-10-16 03:58:42 +0000
@@ -224,7 +224,7 @@
 unavailable_files = []
 
 
-def add_pyrex_extension(module_name, **kwargs):
+def add_pyrex_extension(module_name, libraries=None):
     """Add a pyrex module to build.
 
     This will use Pyrex to auto-generate the .c file if it is available.
@@ -240,26 +240,29 @@
     path = module_name.replace('.', '/')
     pyrex_name = path + '.pyx'
     c_name = path + '.c'
+    define_macros = []
+    if sys.platform == 'win32':
+        # pyrex uses the macro WIN32 to detect the platform, even though it should
+        # be using something like _WIN32 or MS_WINDOWS, oh well, we can give it the
+        # right value.
+        define_macros.append(('WIN32', None))
     if have_pyrex:
-        ext_modules.append(Extension(module_name, [pyrex_name], **kwargs))
+        ext_modules.append(Extension(module_name, [pyrex_name],
+            define_macros=define_macros, libraries=libraries))
     else:
         if not os.path.isfile(c_name):
             unavailable_files.append(c_name)
         else:
-            ext_modules.append(Extension(module_name, [c_name], **kwargs))
+            ext_modules.append(Extension(module_name, [c_name],
+                define_macros=define_macros, libraries=libraries))
 
 
 add_pyrex_extension('bzrlib._btree_serializer_c')
 add_pyrex_extension('bzrlib._knit_load_data_c')
 if sys.platform == 'win32':
     add_pyrex_extension('bzrlib._dirstate_helpers_c',
-                         libraries=['Ws2_32']
-                       )
-    # pyrex uses the macro WIN32 to detect the platform, even though it should
-    # be using something like _WIN32 or MS_WINDOWS, oh well, we can give it the
-    # right value.
-    add_pyrex_extension('bzrlib._walkdirs_win32',
-                        define_macros=[('WIN32', None)])
+                        libraries=['Ws2_32'])
+    add_pyrex_extension('bzrlib._walkdirs_win32')
 else:
     if have_pyrex and pyrex_version == '0.9.4.1':
         # Pyrex 0.9.4.1 fails to compile this extension correctly



More information about the bazaar-commits mailing list