Rev 4172: Merge lifeless into make-it-work in file:///home/vila/src/bzr/experimental/parallel-selftest/

Vincent Ladeuil v.ladeuil+lp at free.fr
Thu Mar 19 17:43:39 GMT 2009


At file:///home/vila/src/bzr/experimental/parallel-selftest/

------------------------------------------------------------
revno: 4172
revision-id: v.ladeuil+lp at free.fr-20090319174337-uvqj55ton9lvhevc
parent: v.ladeuil+lp at free.fr-20090319133453-j3akze05io438pkq
parent: v.ladeuil+lp at free.fr-20090319174333-v6zols9yktwm44oe
committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
branch nick: make-it-work
timestamp: Thu 2009-03-19 18:43:37 +0100
message:
  Merge lifeless into make-it-work
added:
  bzrlib/tests/ftp_server/       ftp_server-20090227112800-4r9jkezw2hw9tij7-1
  bzrlib/tests/ftp_server/__init__.py __init__.py-20090227130107-4gcpgvr00l7v3fsw-1
  bzrlib/tests/ftp_server/pyftpdlib_based.py pyftpdlib_based.py-20090227151014-882k9q34m1gwnhvi-1
renamed:
  bzrlib/tests/ftp_server.py => bzrlib/tests/ftp_server/medusa_based.py ftpserver.py-20071019102346-61jbvdkrr70igauv-1
modified:
  NEWS                           NEWS-20050323055033-4e00b5db738777ff
  bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
  bzrlib/tests/blackbox/test_breakin.py test_breakin.py-20070424043903-qyy6zm4pj3h4sbp3-1
  bzrlib/tests/test_ftp_transport.py test_aftp_transport.-20060823221619-98mwjzxtwtkt527k-1
  bzrlib/tests/test_transport_implementations.py test_transport_implementations.py-20051227111451-f97c5c7d5c49fce7
  bzrlib/transport/__init__.py   transport.py-20050711165921-4978aa7ce1285ad5
  bzrlib/transport/ftp/__init__.py ftp.py-20051116161804-58dc9506548c2a53
  bzrlib/transport/ftp/_gssapi.py _gssapi.py-20080611190840-7ejrtp884bk5eu72-2
  bzrlib/tests/ftp_server/medusa_based.py ftpserver.py-20071019102346-61jbvdkrr70igauv-1
    ------------------------------------------------------------
    revno: 4169.1.1
    revision-id: v.ladeuil+lp at free.fr-20090319174333-v6zols9yktwm44oe
    parent: v.ladeuil+lp at free.fr-20090319093838-ssxp448su3adcrb5
    parent: v.ladeuil+lp at free.fr-20090319172945-rh9hk9n71flc93ph
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: lifeless
    timestamp: Thu 2009-03-19 18:43:33 +0100
    message:
      Merge bzr.dev into lifeless
    added:
      bzrlib/tests/ftp_server/       ftp_server-20090227112800-4r9jkezw2hw9tij7-1
      bzrlib/tests/ftp_server/__init__.py __init__.py-20090227130107-4gcpgvr00l7v3fsw-1
      bzrlib/tests/ftp_server/pyftpdlib_based.py pyftpdlib_based.py-20090227151014-882k9q34m1gwnhvi-1
    renamed:
      bzrlib/tests/ftp_server.py => bzrlib/tests/ftp_server/medusa_based.py ftpserver.py-20071019102346-61jbvdkrr70igauv-1
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
      bzrlib/tests/blackbox/test_breakin.py test_breakin.py-20070424043903-qyy6zm4pj3h4sbp3-1
      bzrlib/tests/test_ftp_transport.py test_aftp_transport.-20060823221619-98mwjzxtwtkt527k-1
      bzrlib/tests/test_transport_implementations.py test_transport_implementations.py-20051227111451-f97c5c7d5c49fce7
      bzrlib/transport/__init__.py   transport.py-20050711165921-4978aa7ce1285ad5
      bzrlib/transport/ftp/__init__.py ftp.py-20051116161804-58dc9506548c2a53
      bzrlib/transport/ftp/_gssapi.py _gssapi.py-20080611190840-7ejrtp884bk5eu72-2
      bzrlib/tests/ftp_server/medusa_based.py ftpserver.py-20071019102346-61jbvdkrr70igauv-1
    ------------------------------------------------------------
    revno: 4167.2.2
    revision-id: v.ladeuil+lp at free.fr-20090319172945-rh9hk9n71flc93ph
    parent: pqm at pqm.ubuntu.com-20090319154145-159h7mmiivu3df6v
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: bzr.dev
    timestamp: Thu 2009-03-19 18:29:45 +0100
    message:
      Delete faulty test that can leak a subprocess and/or hang the test suite.
      
      * bzrlib/tests/blackbox/test_breakin.py:
      (TestBreakin.test_breakin): Deleted. The spawn process may be left
      hanging around under some circumstances.
      (TestBreakin.test_breakin_harder): Get some bits from test_breakin
      to avoid reducing test coverage.
    modified:
      bzrlib/tests/blackbox/test_breakin.py test_breakin.py-20070424043903-qyy6zm4pj3h4sbp3-1
    ------------------------------------------------------------
    revno: 4167.2.1
    revision-id: pqm at pqm.ubuntu.com-20090319154145-159h7mmiivu3df6v
    parent: pqm at pqm.ubuntu.com-20090319070051-g88q6nfmvkxgvnto
    parent: v.ladeuil+lp at free.fr-20090319145751-6vg1h5oo1jox3wsw
    committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
    branch nick: +trunk
    timestamp: Thu 2009-03-19 15:41:45 +0000
    message:
      (vila) FTP test server: disable medusa for python2.6, add pyftpdlib
    added:
      bzrlib/tests/ftp_server/       ftp_server-20090227112800-4r9jkezw2hw9tij7-1
      bzrlib/tests/ftp_server/__init__.py __init__.py-20090227130107-4gcpgvr00l7v3fsw-1
      bzrlib/tests/ftp_server/pyftpdlib_based.py pyftpdlib_based.py-20090227151014-882k9q34m1gwnhvi-1
    renamed:
      bzrlib/tests/ftp_server.py => bzrlib/tests/ftp_server/medusa_based.py ftpserver.py-20071019102346-61jbvdkrr70igauv-1
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
      bzrlib/tests/test_ftp_transport.py test_aftp_transport.-20060823221619-98mwjzxtwtkt527k-1
      bzrlib/tests/test_transport_implementations.py test_transport_implementations.py-20051227111451-f97c5c7d5c49fce7
      bzrlib/transport/__init__.py   transport.py-20050711165921-4978aa7ce1285ad5
      bzrlib/transport/ftp/__init__.py ftp.py-20051116161804-58dc9506548c2a53
      bzrlib/transport/ftp/_gssapi.py _gssapi.py-20080611190840-7ejrtp884bk5eu72-2
      bzrlib/tests/ftp_server/medusa_based.py ftpserver.py-20071019102346-61jbvdkrr70igauv-1
    ------------------------------------------------------------
    revno: 4167.1.1
    revision-id: v.ladeuil+lp at free.fr-20090319145751-6vg1h5oo1jox3wsw
    parent: pqm at pqm.ubuntu.com-20090319070051-g88q6nfmvkxgvnto
    parent: v.ladeuil+lp at free.fr-20090319144141-wd2ng1ooqcs2n6ai
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: integration
    timestamp: Thu 2009-03-19 15:57:51 +0100
    message:
      FTP test server: disable medusa for python2.6, add pyftpdlib
    added:
      bzrlib/tests/ftp_server/       ftp_server-20090227112800-4r9jkezw2hw9tij7-1
      bzrlib/tests/ftp_server/__init__.py __init__.py-20090227130107-4gcpgvr00l7v3fsw-1
      bzrlib/tests/ftp_server/pyftpdlib_based.py pyftpdlib_based.py-20090227151014-882k9q34m1gwnhvi-1
    renamed:
      bzrlib/tests/ftp_server.py => bzrlib/tests/ftp_server/medusa_based.py ftpserver.py-20071019102346-61jbvdkrr70igauv-1
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
      bzrlib/tests/test_ftp_transport.py test_aftp_transport.-20060823221619-98mwjzxtwtkt527k-1
      bzrlib/tests/test_transport_implementations.py test_transport_implementations.py-20051227111451-f97c5c7d5c49fce7
      bzrlib/transport/__init__.py   transport.py-20050711165921-4978aa7ce1285ad5
      bzrlib/transport/ftp/__init__.py ftp.py-20051116161804-58dc9506548c2a53
      bzrlib/transport/ftp/_gssapi.py _gssapi.py-20080611190840-7ejrtp884bk5eu72-2
      bzrlib/tests/ftp_server/medusa_based.py ftpserver.py-20071019102346-61jbvdkrr70igauv-1
    ------------------------------------------------------------
    revno: 3508.1.24
    revision-id: v.ladeuil+lp at free.fr-20090319144141-wd2ng1ooqcs2n6ai
    parent: v.ladeuil+lp at free.fr-20090319142827-m03usu4my6qvukc8
    parent: v.ladeuil+lp at free.fr-20090319143726-vb161l9frg896do7
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: pyftpdlib
    timestamp: Thu 2009-03-19 15:41:41 +0100
    message:
      Merge bzr.dev at 4167 to avoid conflicts
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      doc/developers/HACKING.txt     HACKING-20050805200004-2a5dc975d870f78c
      doc/developers/index.txt       index.txt-20070508041241-qznziunkg0nffhiw-1
      doc/developers/overview.txt    overview.txt-20080904022501-ww2ggomrs5elxfm0-1
      doc/developers/performance-contributing.txt performancecontribut-20070621063612-ac4zhhagjzkr21qp-1
      doc/developers/releasing.txt   releasing.txt-20080502015919-fnrcav8fwy8ccibu-1
        ------------------------------------------------------------
        revno: 4063.3.5
        revision-id: v.ladeuil+lp at free.fr-20090319143726-vb161l9frg896do7
        parent: v.ladeuil+lp at free.fr-20090318163323-k607telg4uumomyy
        parent: pqm at pqm.ubuntu.com-20090319070051-g88q6nfmvkxgvnto
        committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
        branch nick: disable-medusa-for-python-2.6
        timestamp: Thu 2009-03-19 15:37:26 +0100
        message:
          Merge bzr.dev into disable-medusa-for-python-2.6
        modified:
          NEWS                           NEWS-20050323055033-4e00b5db738777ff
          doc/developers/HACKING.txt     HACKING-20050805200004-2a5dc975d870f78c
          doc/developers/index.txt       index.txt-20070508041241-qznziunkg0nffhiw-1
          doc/developers/overview.txt    overview.txt-20080904022501-ww2ggomrs5elxfm0-1
          doc/developers/performance-contributing.txt performancecontribut-20070621063612-ac4zhhagjzkr21qp-1
          doc/developers/releasing.txt   releasing.txt-20080502015919-fnrcav8fwy8ccibu-1
    ------------------------------------------------------------
    revno: 3508.1.23
    revision-id: v.ladeuil+lp at free.fr-20090319142827-m03usu4my6qvukc8
    parent: v.ladeuil+lp at free.fr-20090318182837-bofmu0jpqlctqli7
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: pyftpdlib
    timestamp: Thu 2009-03-19 15:28:27 +0100
    message:
      Fix as per Martin's review.
      
      * bzrlib/transport/ftp/_gssapi.py:
      (get_test_permutations): Replace all occurences of FTPServer by
      FTPTestServer to distinguish between the test front-end and the
      real server.
      
      * bzrlib/transport/ftp/__init__.py:
      (get_test_permutations): Replace all occurences of FTPServer by
      FTPTestServer.
      
      
      * bzrlib/tests/test_ftp_transport.py:
      Replace all occurences of FTPServer by FTPTestServer.
      
      * bzrlib/tests/ftp_server/pyftpdlib_based.py:
      Replace all occurences of FTPServer by FTPTestServer.
      (BzrConformingFTPHandler): Fix odd capitalization.
      
      * bzrlib/tests/ftp_server/medusa_based.py:
      Replace all occurences of FTPServer by FTPTestServer.
      
      * bzrlib/tests/ftp_server/__init__.py:
      (_FTPServerFeature): Update docstring.
      (FTPTestServer): Replace all occurences of FTPServer by
      FTPTestServer.
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/tests/ftp_server/__init__.py __init__.py-20090227130107-4gcpgvr00l7v3fsw-1
      bzrlib/tests/ftp_server/medusa_based.py ftpserver.py-20071019102346-61jbvdkrr70igauv-1
      bzrlib/tests/ftp_server/pyftpdlib_based.py pyftpdlib_based.py-20090227151014-882k9q34m1gwnhvi-1
      bzrlib/tests/test_ftp_transport.py test_aftp_transport.-20060823221619-98mwjzxtwtkt527k-1
      bzrlib/transport/ftp/__init__.py ftp.py-20051116161804-58dc9506548c2a53
      bzrlib/transport/ftp/_gssapi.py _gssapi.py-20080611190840-7ejrtp884bk5eu72-2
    ------------------------------------------------------------
    revno: 3508.1.22
    revision-id: v.ladeuil+lp at free.fr-20090318182837-bofmu0jpqlctqli7
    parent: v.ladeuil+lp at free.fr-20090318163342-bglgu1htdktf4y00
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: pyftpdlib
    timestamp: Wed 2009-03-18 19:28:37 +0100
    message:
      Fix python2.4 failures.
      
      * bzrlib/tests/__init__.py:
      (TestCase.assertTransportMode): python2.4 is pickier than 2.[56],
      don't use oct() for comparison purposes.
    modified:
      bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
    ------------------------------------------------------------
    revno: 3508.1.21
    revision-id: v.ladeuil+lp at free.fr-20090318163342-bglgu1htdktf4y00
    parent: v.ladeuil+lp at free.fr-20090318162901-5u660idisu4txvqu
    parent: v.ladeuil+lp at free.fr-20090318163323-k607telg4uumomyy
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: pyftpdlib
    timestamp: Wed 2009-03-18 17:33:42 +0100
    message:
      Merge disable-medusa-for-python-2.6 into pyftpdlib
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/_dirstate_helpers_c.pyx dirstate_helpers.pyx-20070503201057-u425eni465q4idwn-3
      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/commands.py             bzr.py-20050309040720-d10f4714595cf8c3
      bzrlib/dirstate.py             dirstate.py-20060728012006-d6mvoihjb3je9peu-1
      bzrlib/help.py                 help.py-20050505025907-4dd7a6d63912f894
      bzrlib/hooks.py                hooks.py-20070325015548-ix4np2q0kd8452au-1
      bzrlib/lockable_files.py       control_files.py-20051111201905-bb88546e799d669f
      bzrlib/option.py               option.py-20051014052914-661fb36e76e7362f
      bzrlib/plugin.py               plugin.py-20050622060424-829b654519533d69
      bzrlib/remote.py               remote.py-20060720103555-yeeg2x51vn0rbtdp-1
      bzrlib/tests/blackbox/test_help.py test_help.py-20060216004358-4ee8a2a338f75a62
      bzrlib/tests/interrepository_implementations/test_fetch.py test_fetch.py-20080425213627-j60cjh782ufm83ry-1
      bzrlib/tests/test__dirstate_helpers.py test_dirstate_helper-20070504035751-jsbn00xodv0y1eve-2
      bzrlib/tests/test_bzrdir.py    test_bzrdir.py-20060131065654-deba40eef51cf220
      bzrlib/tests/test_dirstate.py  test_dirstate.py-20060728012006-d6mvoihjb3je9peu-2
      bzrlib/tests/test_help.py      test_help.py-20070419045354-6q6rq15j9e2n5fna-1
      bzrlib/tests/test_remote.py    test_remote.py-20060720103555-yeeg2x51vn0rbtdp-2
      doc/developers/releasing.txt   releasing.txt-20080502015919-fnrcav8fwy8ccibu-1
        ------------------------------------------------------------
        revno: 4063.3.4
        revision-id: v.ladeuil+lp at free.fr-20090318163323-k607telg4uumomyy
        parent: v.ladeuil+lp at free.fr-20090317081823-9aq6bv3todhjc1oh
        parent: pqm at pqm.ubuntu.com-20090318162156-yz3r7446r141qzub
        committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
        branch nick: disable-medusa-for-python-2.6
        timestamp: Wed 2009-03-18 17:33:23 +0100
        message:
          Merge bzr.dev into disable-medusa-for-python-2.6
        modified:
          NEWS                           NEWS-20050323055033-4e00b5db738777ff
          bzrlib/_dirstate_helpers_c.pyx dirstate_helpers.pyx-20070503201057-u425eni465q4idwn-3
          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/commands.py             bzr.py-20050309040720-d10f4714595cf8c3
          bzrlib/dirstate.py             dirstate.py-20060728012006-d6mvoihjb3je9peu-1
          bzrlib/help.py                 help.py-20050505025907-4dd7a6d63912f894
          bzrlib/hooks.py                hooks.py-20070325015548-ix4np2q0kd8452au-1
          bzrlib/lockable_files.py       control_files.py-20051111201905-bb88546e799d669f
          bzrlib/option.py               option.py-20051014052914-661fb36e76e7362f
          bzrlib/plugin.py               plugin.py-20050622060424-829b654519533d69
          bzrlib/remote.py               remote.py-20060720103555-yeeg2x51vn0rbtdp-1
          bzrlib/tests/blackbox/test_help.py test_help.py-20060216004358-4ee8a2a338f75a62
          bzrlib/tests/interrepository_implementations/test_fetch.py test_fetch.py-20080425213627-j60cjh782ufm83ry-1
          bzrlib/tests/test__dirstate_helpers.py test_dirstate_helper-20070504035751-jsbn00xodv0y1eve-2
          bzrlib/tests/test_bzrdir.py    test_bzrdir.py-20060131065654-deba40eef51cf220
          bzrlib/tests/test_dirstate.py  test_dirstate.py-20060728012006-d6mvoihjb3je9peu-2
          bzrlib/tests/test_help.py      test_help.py-20070419045354-6q6rq15j9e2n5fna-1
          bzrlib/tests/test_remote.py    test_remote.py-20060720103555-yeeg2x51vn0rbtdp-2
          doc/developers/releasing.txt   releasing.txt-20080502015919-fnrcav8fwy8ccibu-1
    ------------------------------------------------------------
    revno: 3508.1.20
    revision-id: v.ladeuil+lp at free.fr-20090318162901-5u660idisu4txvqu
    parent: v.ladeuil+lp at free.fr-20090318105733-q0i1ou3cb9u766s4
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: pyftpdlib
    timestamp: Wed 2009-03-18 17:29:01 +0100
    message:
      Test passing for python2.5 and 2.6.
      
      * bzrlib/tests/ftp_server/pyftpdlib_based.py:
      (BzrConformingFS.chmod): Wrongly deleted earlier, this is needed
      to implement SITE CHMOD.
    modified:
      bzrlib/tests/ftp_server/pyftpdlib_based.py pyftpdlib_based.py-20090227151014-882k9q34m1gwnhvi-1
    ------------------------------------------------------------
    revno: 3508.1.19
    revision-id: v.ladeuil+lp at free.fr-20090318105733-q0i1ou3cb9u766s4
    parent: v.ladeuil+lp at free.fr-20090318105652-qrgo4ua4nw294bg4
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: pyftpdlib
    timestamp: Wed 2009-03-18 11:57:33 +0100
    message:
      Remove empty line in BRANCH.TODO.
    modified:
      BRANCH.TODO                    BRANCH.TODO-20060103052123-79ac4969351c03a9
    ------------------------------------------------------------
    revno: 3508.1.18
    revision-id: v.ladeuil+lp at free.fr-20090318105652-qrgo4ua4nw294bg4
    parent: v.ladeuil+lp at free.fr-20090317085017-3z3rqqt7uku3sc22
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: pyftpdlib
    timestamp: Wed 2009-03-18 11:56:52 +0100
    message:
      Final tweaks.
      
      * bzrlib/tests/ftp_server/pyftpdlib_based.py:
      (BzrConformingFS.listdir, BzrConformingFS.fs2ftp): Ensure we use
      utf8 paths even if not tested.
    modified:
      BRANCH.TODO                    BRANCH.TODO-20060103052123-79ac4969351c03a9
      bzrlib/tests/ftp_server/pyftpdlib_based.py pyftpdlib_based.py-20090227151014-882k9q34m1gwnhvi-1
    ------------------------------------------------------------
    revno: 3508.1.17
    revision-id: v.ladeuil+lp at free.fr-20090317085017-3z3rqqt7uku3sc22
    parent: v.ladeuil+lp at free.fr-20090317081926-yzoqbtmef0lvifes
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: pyftpdlib
    timestamp: Tue 2009-03-17 09:50:17 +0100
    message:
      Allows empty passwords with pyftpdlib ftp test server.
      
      * bzrlib/tests/test_ftp_transport.py:
      (TestFTPServerUI.test_no_prompt_for_password_when_using_auth_config):
      Explicitly test empty password.
      
      * bzrlib/tests/ftp_server/pyftpdlib_based.py:
      (ftpserver.proto_cmds): Override PASS to allow empty passwords.
    modified:
      BRANCH.TODO                    BRANCH.TODO-20060103052123-79ac4969351c03a9
      bzrlib/tests/ftp_server/pyftpdlib_based.py pyftpdlib_based.py-20090227151014-882k9q34m1gwnhvi-1
      bzrlib/tests/test_ftp_transport.py test_aftp_transport.-20060823221619-98mwjzxtwtkt527k-1
    ------------------------------------------------------------
    revno: 3508.1.16
    revision-id: v.ladeuil+lp at free.fr-20090317081926-yzoqbtmef0lvifes
    parent: v.ladeuil+lp at free.fr-20090317081545-650uqmy2v5j9dy0s
    parent: v.ladeuil+lp at free.fr-20090317081823-9aq6bv3todhjc1oh
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: pyftpdlib
    timestamp: Tue 2009-03-17 09:19:26 +0100
    message:
      Merge disable-medusa-for-python-2.6 into pyftpdlib
    removed:
      bzrlib/help_topics/en/hooks.txt hooks.txt-20070830033044-xxu2rced13f72dka-1
    added:
      bzrlib/clean_tree.py           clean_tree.py-20050827022328-5ba46e22d074695c
      bzrlib/help_topics/en/debug-flags.txt debugflags.txt-20090312050229-rdspqbqq4fzbjtpe-1
      bzrlib/tests/blackbox/test_clean_tree.py test_clean_tree.py-20090219235516-em1ybc01twsqacx9-1
      bzrlib/tests/per_repository/test_refresh_data.py test_refresh_data.py-20090316045630-5sw0ipqwk7rvpn3h-1
      bzrlib/tests/per_repository_reference/test_default_stacking.py test_default_stackin-20090311055345-9ajahgm58oq3wh6h-1
      bzrlib/tests/test_clean_tree.py test_clean_tree.py-20060603174249-ozlk5sl2166opxbk-1
      bzrlib/tests/test_debug.py     test_debug.py-20090303053802-01e8mlv24odmpgix-1
      doc/developers/ec2-windows.txt ec2windows.txt-20090219062112-2ga0nqpcm7n02njf-1
      doc/en/user-guide/organizing_your_workspace.txt organizing_your_work-20090226112520-bc2njq3kwvpeo814-1
      doc/en/user-guide/shelving_changes.txt shelving_changes.txt-20090312060214-kfn9smg37syy9kcl-1
      tools/check-newsbugs.py        checknewsbugs.py-20090128204947-lsdwd8nlswm1yrwv-1
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzr                            bzr.py-20050313053754-5485f144c7006fa6
      bzrlib/__init__.py             __init__.py-20050309040759-33e65acf91bbcd5d
      bzrlib/_dirstate_helpers_c.pyx dirstate_helpers.pyx-20070503201057-u425eni465q4idwn-3
      bzrlib/_readdir_pyx.pyx        readdir.pyx-20060609152855-rm6v321vuaqyh9tu-1
      bzrlib/annotate.py             annotate.py-20050922133147-7c60541d2614f022
      bzrlib/branch.py               branch.py-20050309040759-e4baf4e0d046576e
      bzrlib/branchbuilder.py        branchbuilder.py-20070427022007-zlxpqz2lannhk6y8-1
      bzrlib/bugtracker.py           bugtracker.py-20070410073305-vu1vu1qosjurg8kb-1
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
      bzrlib/bzrdir.py               bzrdir.py-20060131065624-156dfea39c4387cb
      bzrlib/check.py                check.py-20050309040759-f3a679400c06bcc1
      bzrlib/commands.py             bzr.py-20050309040720-d10f4714595cf8c3
      bzrlib/commit.py               commit.py-20050511101309-79ec1a0168e0e825
      bzrlib/config.py               config.py-20051011043216-070c74f4e9e338e8
      bzrlib/debug.py                debug.py-20061102062349-vdhrw9qdpck8cl35-1
      bzrlib/dirstate.py             dirstate.py-20060728012006-d6mvoihjb3je9peu-1
      bzrlib/errors.py               errors.py-20050309040759-20512168c4e14fbd
      bzrlib/fetch.py                fetch.py-20050818234941-26fea6105696365d
      bzrlib/graph.py                graph_walker.py-20070525030359-y852guab65d4wtn0-1
      bzrlib/help_topics/__init__.py help_topics.py-20060920210027-rnim90q9e0bwxvy4-1
      bzrlib/help_topics/en/configuration.txt configuration.txt-20060314161707-868350809502af01
      bzrlib/hooks.py                hooks.py-20070325015548-ix4np2q0kd8452au-1
      bzrlib/inventory.py            inventory.py-20050309040759-6648b84ca2005b37
      bzrlib/knit.py                 knit.py-20051212171256-f056ac8f0fbe1bd9
      bzrlib/lock.py                 lock.py-20050527050856-ec090bb51bc03349
      bzrlib/lockable_files.py       control_files.py-20051111201905-bb88546e799d669f
      bzrlib/lockdir.py              lockdir.py-20060220222025-98258adf27fbdda3
      bzrlib/log.py                  log.py-20050505065812-c40ce11702fe5fb1
      bzrlib/lsprof.py               lsprof.py-20051208071030-833790916798ceed
      bzrlib/mail_client.py          mail_client.py-20070809192806-vuxt3t19srtpjpdn-1
      bzrlib/merge.py                merge.py-20050513021216-953b65a438527106
      bzrlib/msgeditor.py            msgeditor.py-20050901111708-ef6d8de98f5d8f2f
      bzrlib/multiparent.py          __init__.py-20070410133617-n1jdhcc1n1mibarp-1
      bzrlib/mutabletree.py          mutabletree.py-20060906023413-4wlkalbdpsxi2r4y-2
      bzrlib/osutils.py              osutils.py-20050309040759-eeaff12fbf77ac86
      bzrlib/pack.py                 container.py-20070607160755-tr8zc26q18rn0jnb-1
      bzrlib/plugins/launchpad/__init__.py __init__.py-20060315182712-2d5feebd2a1032dc
      bzrlib/plugins/launchpad/lp_registration.py lp_registration.py-20060315190948-daa617eafe3a8d48
      bzrlib/plugins/launchpad/test_lp_open.py test_lp_open.py-20090125174355-hxrsxh3sj84225qu-1
      bzrlib/plugins/launchpad/test_lp_service.py test_lp_service.py-20080213034527-drf0ucr2x1js3onb-1
      bzrlib/plugins/netrc_credential_store/tests/test_netrc.py test_netrc.py-20081006090414-vm3or4tz6c9wk2oi-1
      bzrlib/progress.py             progress.py-20050610070202-df9faaab791964c0
      bzrlib/push.py                 push.py-20080606021927-5fe39050e8xne9un-1
      bzrlib/reconcile.py            reweave_inventory.py-20051108164726-1e5e0934febac06e
      bzrlib/registry.py             lazy_factory.py-20060809213415-2gfvqadtvdn0phtg-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/shelf.py                prepare_shelf.py-20081005181341-n74qe6gu1e65ad4v-1
      bzrlib/shelf_ui.py             shelver.py-20081005210102-33worgzwrtdw0yrm-1
      bzrlib/smart/branch.py         branch.py-20061124031907-mzh3pla28r83r97f-1
      bzrlib/smart/bzrdir.py         bzrdir.py-20061122024551-ol0l0o0oofsu9b3t-1
      bzrlib/smart/client.py         client.py-20061116014825-2k6ada6xgulslami-1
      bzrlib/smart/medium.py         medium.py-20061103051856-rgu2huy59fkz902q-1
      bzrlib/smart/message.py        message.py-20080222013625-ncqmh3nrxjkxab87-1
      bzrlib/smart/protocol.py       protocol.py-20061108035435-ot0lstk2590yqhzr-1
      bzrlib/smart/repository.py     repository.py-20061128022038-vr5wy5bubyb8xttk-1
      bzrlib/smart/request.py        request.py-20061108095550-gunadhxmzkdjfeek-1
      bzrlib/smart/server.py         server.py-20061110062051-chzu10y32vx8gvur-1
      bzrlib/tag.py                  tag.py-20070212110532-91cw79inah2cfozx-1
      bzrlib/tests/EncodingAdapter.py EncodingAdapter.py-20060113032051-4d7e1d8c1e38b4a1
      bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
      bzrlib/tests/blackbox/__init__.py __init__.py-20051128053524-eba30d8255e08dc3
      bzrlib/tests/blackbox/test_add.py test_add.py-20060518072250-857e4f86f54a30b2
      bzrlib/tests/blackbox/test_branch.py test_branch.py-20060524161337-noms9gmcwqqrfi8y-1
      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_filtered_view_ops.py test_filtered_view_o-20081110012645-5t7ogtola0l33lkg-1
      bzrlib/tests/blackbox/test_hooks.py test_hooks.py-20080308163236-xljgf9j41hik1x21-1
      bzrlib/tests/blackbox/test_ignore.py test_ignore.py-20060703063225-4tm8dc2pa7wwg2t3-1
      bzrlib/tests/blackbox/test_log.py test_log.py-20060112090212-78f6ea560c868e24
      bzrlib/tests/blackbox/test_logformats.py test_logformats.py-20060216104208-ba5a16c83480b7e4
      bzrlib/tests/blackbox/test_merge.py test_merge.py-20060323225809-9bc0459c19917f41
      bzrlib/tests/blackbox/test_non_ascii.py test_non_ascii.py-20060105214030-68010be784a5d854
      bzrlib/tests/blackbox/test_push.py test_push.py-20060329002750-929af230d5d22663
      bzrlib/tests/blackbox/test_shared_repository.py test_shared_repository.py-20060317053531-ed30c0d79325e483
      bzrlib/tests/blackbox/test_shelve.py test_ls_shelf.py-20081202053526-thlo8yt0pi1cgor1-1
      bzrlib/tests/branch_implementations/__init__.py __init__.py-20060123013057-b12a52c3f361daf4
      bzrlib/tests/branch_implementations/test_branch.py testbranch.py-20050711070244-121d632bc37d7253
      bzrlib/tests/branch_implementations/test_hooks.py test_hooks.py-20070129154855-blhpwxmvjs07waei-1
      bzrlib/tests/branch_implementations/test_last_revision_info.py test_last_revision_i-20070201133317-51mzi40m8hv1i0i9-1
      bzrlib/tests/branch_implementations/test_push.py test_push.py-20070130153159-fhfap8uoifevg30j-1
      bzrlib/tests/branch_implementations/test_revision_history.py test_revision_histor-20070326062311-v7co92liyuchb80w-1
      bzrlib/tests/branch_implementations/test_sprout.py test_sprout.py-20070521151739-b8t8p7axw1h966ws-1
      bzrlib/tests/branch_implementations/test_stacking.py test_stacking.py-20080214020755-msjlkb7urobwly0f-1
      bzrlib/tests/branch_implementations/test_tags.py test_tags.py-20070212110545-w2s799hm2jlbsmg5-1
      bzrlib/tests/bzrdir_implementations/__init__.py __init__.py-20060131065642-34c39b54f42dd048
      bzrlib/tests/bzrdir_implementations/test_bzrdir.py test_bzrdir.py-20060131065642-0ebeca5e30e30866
      bzrlib/tests/interrepository_implementations/__init__.py __init__.py-20060220054744-baf49a1f88f17b1a
      bzrlib/tests/interrepository_implementations/test_fetch.py test_fetch.py-20080425213627-j60cjh782ufm83ry-1
      bzrlib/tests/interrepository_implementations/test_interrepository.py test_interrepository.py-20060220061411-1ec13fa99e5e3eee
      bzrlib/tests/intertree_implementations/__init__.py __init__.py-20060724101752-09ysswo1a92uqyoz-3
      bzrlib/tests/intertree_implementations/test_compare.py test_compare.py-20060724101752-09ysswo1a92uqyoz-2
      bzrlib/tests/inventory_implementations/__init__.py __init__.py-20070821044532-olbadbokgv3qv1yd-1
      bzrlib/tests/inventory_implementations/basics.py basics.py-20070903044446-kdjwbiu1p1zi9phs-1
      bzrlib/tests/per_interbranch/__init__.py __init__.py-20090225010018-l7w4uvvt73ea2vj9-1
      bzrlib/tests/per_lock/__init__.py __init__.py-20070314201444-u92yjsqrkh2m3qcb-1
      bzrlib/tests/per_repository/__init__.py __init__.py-20060131092037-9564957a7d4a841b
      bzrlib/tests/per_repository/test_fetch.py test_fetch.py-20070814052151-5cxha9slx4c93uog-1
      bzrlib/tests/per_repository/test_fileid_involved.py test_file_involved.py-20051215205901-728a172d1014daaa
      bzrlib/tests/per_repository/test_repository.py test_repository.py-20060131092128-ad07f494f5c9d26c
      bzrlib/tests/per_repository_reference/__init__.py __init__.py-20080220025549-nnm2s80it1lvcwnc-2
      bzrlib/tests/test__chunks_to_lines.py test__chunks_to_line-20081211024848-6uc3mtuje8j14l60-2
      bzrlib/tests/test__dirstate_helpers.py test_dirstate_helper-20070504035751-jsbn00xodv0y1eve-2
      bzrlib/tests/test_annotate.py  test_annotate.py-20061213215015-sttc9agsxomls7q0-1
      bzrlib/tests/test_branch.py    test_branch.py-20060116013032-97819aa07b8ab3b5
      bzrlib/tests/test_branchbuilder.py test_branchbuilder.p-20070427022007-zlxpqz2lannhk6y8-2
      bzrlib/tests/test_btree_index.py test_index.py-20080624222253-p0x5f92uyh5hw734-13
      bzrlib/tests/test_bugtracker.py test_bugtracker.py-20070410073305-vu1vu1qosjurg8kb-2
      bzrlib/tests/test_bzrdir.py    test_bzrdir.py-20060131065654-deba40eef51cf220
      bzrlib/tests/test_commands.py  test_command.py-20051019190109-3b17be0f52eaa7a8
      bzrlib/tests/test_commit.py    test_commit.py-20050914060732-279f057f8c295434
      bzrlib/tests/test_config.py    testconfig.py-20051011041908-742d0c15d8d8c8eb
      bzrlib/tests/test_errors.py    test_errors.py-20060210110251-41aba2deddf936a8
      bzrlib/tests/test_fetch.py     testfetch.py-20050825090644-f73e07e7dfb1765a
      bzrlib/tests/test_generate_docs.py test_generate_docs.p-20070102123151-cqctnsrlqwmiljd7-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_hooks.py     test_hooks.py-20070628030849-89rtsbe5dmer5npz-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_knit.py      test_knit.py-20051212171302-95d4c00dd5f11f2b
      bzrlib/tests/test_log.py       testlog.py-20050728115707-1a514809d7d49309
      bzrlib/tests/test_mail_client.py test_mail_client.py-20070809192806-vuxt3t19srtpjpdn-2
      bzrlib/tests/test_merge.py     testmerge.py-20050905070950-c1b5aa49ff911024
      bzrlib/tests/test_msgeditor.py test_msgeditor.py-20051202041359-920315ec6011ee51
      bzrlib/tests/test_mutabletree.py test_mutabletree.py-20080405014429-2v0cdi3re320p8db-1
      bzrlib/tests/test_options.py   testoptions.py-20051014093702-96457cfc86319a8f
      bzrlib/tests/test_osutils.py   test_osutils.py-20051201224856-e48ee24c12182989
      bzrlib/tests/test_osutils_encodings.py test_osutils_encodin-20061226013130-kkp732tpt3lm91vv-1
      bzrlib/tests/test_pack.py      test_container.py-20070607160755-tr8zc26q18rn0jnb-2
      bzrlib/tests/test_pack_repository.py test_pack_repository-20080801043947-eaw0e6h2gu75kwmy-1
      bzrlib/tests/test_progress.py  test_progress.py-20060308160359-978c397bc79b7fda
      bzrlib/tests/test_read_bundle.py test_read_bundle.py-20060615211421-ud8cwr1ulgd914zf-1
      bzrlib/tests/test_remote.py    test_remote.py-20060720103555-yeeg2x51vn0rbtdp-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_shelf.py     test_prepare_shelf.p-20081005181341-n74qe6gu1e65ad4v-2
      bzrlib/tests/test_shelf_ui.py  test_shelf_ui.py-20081027155203-wtcuazg85wp9u4fv-1
      bzrlib/tests/test_smart.py     test_smart.py-20061122024551-ol0l0o0oofsu9b3t-2
      bzrlib/tests/test_smart_request.py test_smart_request.p-20090211070731-o38wayv3asm25d6a-1
      bzrlib/tests/test_smart_transport.py test_ssh_transport.py-20060608202016-c25gvf1ob7ypbus6-2
      bzrlib/tests/test_source.py    test_source.py-20051207061333-a58dea6abecc030d
      bzrlib/tests/test_symbol_versioning.py test_symbol_versioning.py-20060105104851-51d7722c2018d42b
      bzrlib/tests/test_tag.py       test_tag.py-20070212110532-91cw79inah2cfozx-2
      bzrlib/tests/test_trace.py     testtrace.py-20051110225523-a21117fc7a07eeff
      bzrlib/tests/test_transport_implementations.py test_transport_implementations.py-20051227111451-f97c5c7d5c49fce7
      bzrlib/tests/test_ui.py        test_ui.py-20051130162854-458e667a7414af09
      bzrlib/tests/test_upgrade_stacked.py test_upgrade_stacked-20080804072225-jd13yami19nskns5-1
      bzrlib/tests/test_urlutils.py  test_urlutils.py-20060502192900-46b1f9579987cf9c
      bzrlib/tests/test_versionedfile.py test_versionedfile.py-20060222045249-db45c9ed14a1c2e5
      bzrlib/tests/test_workingtree_4.py test_workingtree_4.p-20070223025758-531n3tznl3zacv2o-1
      bzrlib/tests/test_xml.py       test_xml.py-20050905091053-80b45588931a9b35
      bzrlib/tests/tree_implementations/__init__.py __init__.py-20060717075546-420s7b0bj9hzeowi-2
      bzrlib/tests/tree_implementations/test_path_content_summary.py test_path_content_su-20070904100855-3vrwedz6akn34kl5-1
      bzrlib/tests/workingtree_implementations/__init__.py __init__.py-20060203003124-b2aa5aca21a8bfad
      bzrlib/tests/workingtree_implementations/test_mkdir.py test_mkdir.py-20060907214856-4omn6hf1u7fvrart-3
      bzrlib/tests/workingtree_implementations/test_nested_specifics.py test_nested_specific-20070306004443-qut978c488jr11sg-1
      bzrlib/tests/workingtree_implementations/test_parents.py test_set_parents.py-20060807231740-yicmnlci1mj8smu1-1
      bzrlib/tests/workingtree_implementations/test_workingtree.py test_workingtree.py-20060203003124-817757d3e31444fb
      bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
      bzrlib/transport/http/__init__.py http_transport.py-20050711212304-506c5fd1059ace96
      bzrlib/transport/http/_urllib2_wrappers.py _urllib2_wrappers.py-20060913231729-ha9ugi48ktx481ao-1
      bzrlib/transport/remote.py     ssh.py-20060608202016-c25gvf1ob7ypbus6-1
      bzrlib/transport/sftp.py       sftp.py-20051019050329-ab48ce71b7e32dfe
      bzrlib/transport/trace.py      trace.py-20070828055009-7kt0bbc4t4b92apz-1
      bzrlib/tree.py                 tree.py-20050309040759-9d5f2496be663e77
      bzrlib/ui/__init__.py          ui.py-20050824083933-8cf663c763ba53a9
      bzrlib/ui/text.py              text.py-20051130153916-2e438cffc8afc478
      bzrlib/urlutils.py             urlutils.py-20060502195429-e8a161ecf8fac004
      bzrlib/versionedfile.py        versionedfile.py-20060222045106-5039c71ee3b65490
      bzrlib/weave.py                knit.py-20050627021749-759c29984154256b
      bzrlib/workingtree.py          workingtree.py-20050511021032-29b6ec0a681e02e3
      bzrlib/workingtree_4.py        workingtree_4.py-20070208044105-5fgpc5j3ljlh5q6c-1
      bzrlib/xml8.py                 xml5.py-20050907032657-aac8f960815b66b1
      doc/developers/HACKING.txt     HACKING-20050805200004-2a5dc975d870f78c
      doc/developers/index.txt       index.txt-20070508041241-qznziunkg0nffhiw-1
      doc/developers/network-protocol.txt networkprotocol.txt-20070903044232-woustorrjbmg5zol-1
      doc/developers/releasing.txt   releasing.txt-20080502015919-fnrcav8fwy8ccibu-1
      doc/developers/revision-properties.txt revisionproperties.t-20070807133526-w57m8zv5o7t5kugm-1
      doc/developers/testing.txt     testing.txt-20080812140359-i70zzh6v2z7grqex-1
      doc/en/user-guide/branching_a_project.txt branching_a_project.-20071122141511-0knao2lklsdsvb1q-2
      doc/en/user-guide/bzrtools_plugin.txt bzrtools_plugin.txt-20080509065016-cjc90f46407vi9a0-1
      doc/en/user-guide/index.txt    index.txt-20060622101119-tgwtdci8z769bjb9-2
      doc/en/user-guide/publishing_a_branch.txt publishing_a_branch.-20071123055134-k5x4ekduci2lbn36-2
      doc/en/user-guide/recording_changes.txt recording_changes.tx-20071121073725-0corxykv5irjal00-4
      doc/en/user-guide/shared_repository_layouts.txt shared_repository_la-20070502152030-bagewuqs18ns24o7-1
      setup.py                       setup.py-20050314065409-02f8a0a6e3f9bc70
      tools/doc_generate/autodoc_man.py bzrman.py-20050601153041-0ff7f74de456d15e
        ------------------------------------------------------------
        revno: 4063.3.3
        revision-id: v.ladeuil+lp at free.fr-20090317081823-9aq6bv3todhjc1oh
        parent: v.ladeuil+lp at free.fr-20090228214300-wnyb0iflp71ww6j4
        parent: pqm at pqm.ubuntu.com-20090317070537-zaud24vjs2szna87
        committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
        branch nick: disable-medusa-for-python-2.6
        timestamp: Tue 2009-03-17 09:18:23 +0100
        message:
          Merge bzr.dev into disable-medusa-for-python-2.6
        removed:
          bzrlib/help_topics/en/hooks.txt hooks.txt-20070830033044-xxu2rced13f72dka-1
        added:
          bzrlib/clean_tree.py           clean_tree.py-20050827022328-5ba46e22d074695c
          bzrlib/help_topics/en/debug-flags.txt debugflags.txt-20090312050229-rdspqbqq4fzbjtpe-1
          bzrlib/tests/blackbox/test_clean_tree.py test_clean_tree.py-20090219235516-em1ybc01twsqacx9-1
          bzrlib/tests/per_repository/test_refresh_data.py test_refresh_data.py-20090316045630-5sw0ipqwk7rvpn3h-1
          bzrlib/tests/per_repository_reference/test_default_stacking.py test_default_stackin-20090311055345-9ajahgm58oq3wh6h-1
          bzrlib/tests/test_clean_tree.py test_clean_tree.py-20060603174249-ozlk5sl2166opxbk-1
          bzrlib/tests/test_debug.py     test_debug.py-20090303053802-01e8mlv24odmpgix-1
          doc/developers/ec2-windows.txt ec2windows.txt-20090219062112-2ga0nqpcm7n02njf-1
          doc/en/user-guide/organizing_your_workspace.txt organizing_your_work-20090226112520-bc2njq3kwvpeo814-1
          doc/en/user-guide/shelving_changes.txt shelving_changes.txt-20090312060214-kfn9smg37syy9kcl-1
          tools/check-newsbugs.py        checknewsbugs.py-20090128204947-lsdwd8nlswm1yrwv-1
        modified:
          NEWS                           NEWS-20050323055033-4e00b5db738777ff
          bzr                            bzr.py-20050313053754-5485f144c7006fa6
          bzrlib/__init__.py             __init__.py-20050309040759-33e65acf91bbcd5d
          bzrlib/_dirstate_helpers_c.pyx dirstate_helpers.pyx-20070503201057-u425eni465q4idwn-3
          bzrlib/_readdir_pyx.pyx        readdir.pyx-20060609152855-rm6v321vuaqyh9tu-1
          bzrlib/annotate.py             annotate.py-20050922133147-7c60541d2614f022
          bzrlib/branch.py               branch.py-20050309040759-e4baf4e0d046576e
          bzrlib/branchbuilder.py        branchbuilder.py-20070427022007-zlxpqz2lannhk6y8-1
          bzrlib/bugtracker.py           bugtracker.py-20070410073305-vu1vu1qosjurg8kb-1
          bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
          bzrlib/bzrdir.py               bzrdir.py-20060131065624-156dfea39c4387cb
          bzrlib/check.py                check.py-20050309040759-f3a679400c06bcc1
          bzrlib/commands.py             bzr.py-20050309040720-d10f4714595cf8c3
          bzrlib/commit.py               commit.py-20050511101309-79ec1a0168e0e825
          bzrlib/config.py               config.py-20051011043216-070c74f4e9e338e8
          bzrlib/debug.py                debug.py-20061102062349-vdhrw9qdpck8cl35-1
          bzrlib/dirstate.py             dirstate.py-20060728012006-d6mvoihjb3je9peu-1
          bzrlib/errors.py               errors.py-20050309040759-20512168c4e14fbd
          bzrlib/fetch.py                fetch.py-20050818234941-26fea6105696365d
          bzrlib/graph.py                graph_walker.py-20070525030359-y852guab65d4wtn0-1
          bzrlib/help_topics/__init__.py help_topics.py-20060920210027-rnim90q9e0bwxvy4-1
          bzrlib/help_topics/en/configuration.txt configuration.txt-20060314161707-868350809502af01
          bzrlib/hooks.py                hooks.py-20070325015548-ix4np2q0kd8452au-1
          bzrlib/inventory.py            inventory.py-20050309040759-6648b84ca2005b37
          bzrlib/knit.py                 knit.py-20051212171256-f056ac8f0fbe1bd9
          bzrlib/lock.py                 lock.py-20050527050856-ec090bb51bc03349
          bzrlib/lockable_files.py       control_files.py-20051111201905-bb88546e799d669f
          bzrlib/lockdir.py              lockdir.py-20060220222025-98258adf27fbdda3
          bzrlib/log.py                  log.py-20050505065812-c40ce11702fe5fb1
          bzrlib/lsprof.py               lsprof.py-20051208071030-833790916798ceed
          bzrlib/mail_client.py          mail_client.py-20070809192806-vuxt3t19srtpjpdn-1
          bzrlib/merge.py                merge.py-20050513021216-953b65a438527106
          bzrlib/msgeditor.py            msgeditor.py-20050901111708-ef6d8de98f5d8f2f
          bzrlib/multiparent.py          __init__.py-20070410133617-n1jdhcc1n1mibarp-1
          bzrlib/mutabletree.py          mutabletree.py-20060906023413-4wlkalbdpsxi2r4y-2
          bzrlib/osutils.py              osutils.py-20050309040759-eeaff12fbf77ac86
          bzrlib/pack.py                 container.py-20070607160755-tr8zc26q18rn0jnb-1
          bzrlib/plugins/launchpad/__init__.py __init__.py-20060315182712-2d5feebd2a1032dc
          bzrlib/plugins/launchpad/lp_registration.py lp_registration.py-20060315190948-daa617eafe3a8d48
          bzrlib/plugins/launchpad/test_lp_open.py test_lp_open.py-20090125174355-hxrsxh3sj84225qu-1
          bzrlib/plugins/launchpad/test_lp_service.py test_lp_service.py-20080213034527-drf0ucr2x1js3onb-1
          bzrlib/plugins/netrc_credential_store/tests/test_netrc.py test_netrc.py-20081006090414-vm3or4tz6c9wk2oi-1
          bzrlib/progress.py             progress.py-20050610070202-df9faaab791964c0
          bzrlib/push.py                 push.py-20080606021927-5fe39050e8xne9un-1
          bzrlib/reconcile.py            reweave_inventory.py-20051108164726-1e5e0934febac06e
          bzrlib/registry.py             lazy_factory.py-20060809213415-2gfvqadtvdn0phtg-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/shelf.py                prepare_shelf.py-20081005181341-n74qe6gu1e65ad4v-1
          bzrlib/shelf_ui.py             shelver.py-20081005210102-33worgzwrtdw0yrm-1
          bzrlib/smart/branch.py         branch.py-20061124031907-mzh3pla28r83r97f-1
          bzrlib/smart/bzrdir.py         bzrdir.py-20061122024551-ol0l0o0oofsu9b3t-1
          bzrlib/smart/client.py         client.py-20061116014825-2k6ada6xgulslami-1
          bzrlib/smart/medium.py         medium.py-20061103051856-rgu2huy59fkz902q-1
          bzrlib/smart/message.py        message.py-20080222013625-ncqmh3nrxjkxab87-1
          bzrlib/smart/protocol.py       protocol.py-20061108035435-ot0lstk2590yqhzr-1
          bzrlib/smart/repository.py     repository.py-20061128022038-vr5wy5bubyb8xttk-1
          bzrlib/smart/request.py        request.py-20061108095550-gunadhxmzkdjfeek-1
          bzrlib/smart/server.py         server.py-20061110062051-chzu10y32vx8gvur-1
          bzrlib/tag.py                  tag.py-20070212110532-91cw79inah2cfozx-1
          bzrlib/tests/EncodingAdapter.py EncodingAdapter.py-20060113032051-4d7e1d8c1e38b4a1
          bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
          bzrlib/tests/blackbox/__init__.py __init__.py-20051128053524-eba30d8255e08dc3
          bzrlib/tests/blackbox/test_add.py test_add.py-20060518072250-857e4f86f54a30b2
          bzrlib/tests/blackbox/test_branch.py test_branch.py-20060524161337-noms9gmcwqqrfi8y-1
          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_filtered_view_ops.py test_filtered_view_o-20081110012645-5t7ogtola0l33lkg-1
          bzrlib/tests/blackbox/test_hooks.py test_hooks.py-20080308163236-xljgf9j41hik1x21-1
          bzrlib/tests/blackbox/test_ignore.py test_ignore.py-20060703063225-4tm8dc2pa7wwg2t3-1
          bzrlib/tests/blackbox/test_log.py test_log.py-20060112090212-78f6ea560c868e24
          bzrlib/tests/blackbox/test_logformats.py test_logformats.py-20060216104208-ba5a16c83480b7e4
          bzrlib/tests/blackbox/test_merge.py test_merge.py-20060323225809-9bc0459c19917f41
          bzrlib/tests/blackbox/test_non_ascii.py test_non_ascii.py-20060105214030-68010be784a5d854
          bzrlib/tests/blackbox/test_push.py test_push.py-20060329002750-929af230d5d22663
          bzrlib/tests/blackbox/test_shared_repository.py test_shared_repository.py-20060317053531-ed30c0d79325e483
          bzrlib/tests/blackbox/test_shelve.py test_ls_shelf.py-20081202053526-thlo8yt0pi1cgor1-1
          bzrlib/tests/branch_implementations/__init__.py __init__.py-20060123013057-b12a52c3f361daf4
          bzrlib/tests/branch_implementations/test_branch.py testbranch.py-20050711070244-121d632bc37d7253
          bzrlib/tests/branch_implementations/test_hooks.py test_hooks.py-20070129154855-blhpwxmvjs07waei-1
          bzrlib/tests/branch_implementations/test_last_revision_info.py test_last_revision_i-20070201133317-51mzi40m8hv1i0i9-1
          bzrlib/tests/branch_implementations/test_push.py test_push.py-20070130153159-fhfap8uoifevg30j-1
          bzrlib/tests/branch_implementations/test_revision_history.py test_revision_histor-20070326062311-v7co92liyuchb80w-1
          bzrlib/tests/branch_implementations/test_sprout.py test_sprout.py-20070521151739-b8t8p7axw1h966ws-1
          bzrlib/tests/branch_implementations/test_stacking.py test_stacking.py-20080214020755-msjlkb7urobwly0f-1
          bzrlib/tests/branch_implementations/test_tags.py test_tags.py-20070212110545-w2s799hm2jlbsmg5-1
          bzrlib/tests/bzrdir_implementations/__init__.py __init__.py-20060131065642-34c39b54f42dd048
          bzrlib/tests/bzrdir_implementations/test_bzrdir.py test_bzrdir.py-20060131065642-0ebeca5e30e30866
          bzrlib/tests/interrepository_implementations/__init__.py __init__.py-20060220054744-baf49a1f88f17b1a
          bzrlib/tests/interrepository_implementations/test_fetch.py test_fetch.py-20080425213627-j60cjh782ufm83ry-1
          bzrlib/tests/interrepository_implementations/test_interrepository.py test_interrepository.py-20060220061411-1ec13fa99e5e3eee
          bzrlib/tests/intertree_implementations/__init__.py __init__.py-20060724101752-09ysswo1a92uqyoz-3
          bzrlib/tests/intertree_implementations/test_compare.py test_compare.py-20060724101752-09ysswo1a92uqyoz-2
          bzrlib/tests/inventory_implementations/__init__.py __init__.py-20070821044532-olbadbokgv3qv1yd-1
          bzrlib/tests/inventory_implementations/basics.py basics.py-20070903044446-kdjwbiu1p1zi9phs-1
          bzrlib/tests/per_interbranch/__init__.py __init__.py-20090225010018-l7w4uvvt73ea2vj9-1
          bzrlib/tests/per_lock/__init__.py __init__.py-20070314201444-u92yjsqrkh2m3qcb-1
          bzrlib/tests/per_repository/__init__.py __init__.py-20060131092037-9564957a7d4a841b
          bzrlib/tests/per_repository/test_fetch.py test_fetch.py-20070814052151-5cxha9slx4c93uog-1
          bzrlib/tests/per_repository/test_fileid_involved.py test_file_involved.py-20051215205901-728a172d1014daaa
          bzrlib/tests/per_repository/test_repository.py test_repository.py-20060131092128-ad07f494f5c9d26c
          bzrlib/tests/per_repository_reference/__init__.py __init__.py-20080220025549-nnm2s80it1lvcwnc-2
          bzrlib/tests/test__chunks_to_lines.py test__chunks_to_line-20081211024848-6uc3mtuje8j14l60-2
          bzrlib/tests/test__dirstate_helpers.py test_dirstate_helper-20070504035751-jsbn00xodv0y1eve-2
          bzrlib/tests/test_annotate.py  test_annotate.py-20061213215015-sttc9agsxomls7q0-1
          bzrlib/tests/test_branch.py    test_branch.py-20060116013032-97819aa07b8ab3b5
          bzrlib/tests/test_branchbuilder.py test_branchbuilder.p-20070427022007-zlxpqz2lannhk6y8-2
          bzrlib/tests/test_btree_index.py test_index.py-20080624222253-p0x5f92uyh5hw734-13
          bzrlib/tests/test_bugtracker.py test_bugtracker.py-20070410073305-vu1vu1qosjurg8kb-2
          bzrlib/tests/test_bzrdir.py    test_bzrdir.py-20060131065654-deba40eef51cf220
          bzrlib/tests/test_commands.py  test_command.py-20051019190109-3b17be0f52eaa7a8
          bzrlib/tests/test_commit.py    test_commit.py-20050914060732-279f057f8c295434
          bzrlib/tests/test_config.py    testconfig.py-20051011041908-742d0c15d8d8c8eb
          bzrlib/tests/test_errors.py    test_errors.py-20060210110251-41aba2deddf936a8
          bzrlib/tests/test_fetch.py     testfetch.py-20050825090644-f73e07e7dfb1765a
          bzrlib/tests/test_generate_docs.py test_generate_docs.p-20070102123151-cqctnsrlqwmiljd7-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_hooks.py     test_hooks.py-20070628030849-89rtsbe5dmer5npz-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_knit.py      test_knit.py-20051212171302-95d4c00dd5f11f2b
          bzrlib/tests/test_log.py       testlog.py-20050728115707-1a514809d7d49309
          bzrlib/tests/test_mail_client.py test_mail_client.py-20070809192806-vuxt3t19srtpjpdn-2
          bzrlib/tests/test_merge.py     testmerge.py-20050905070950-c1b5aa49ff911024
          bzrlib/tests/test_msgeditor.py test_msgeditor.py-20051202041359-920315ec6011ee51
          bzrlib/tests/test_mutabletree.py test_mutabletree.py-20080405014429-2v0cdi3re320p8db-1
          bzrlib/tests/test_options.py   testoptions.py-20051014093702-96457cfc86319a8f
          bzrlib/tests/test_osutils.py   test_osutils.py-20051201224856-e48ee24c12182989
          bzrlib/tests/test_osutils_encodings.py test_osutils_encodin-20061226013130-kkp732tpt3lm91vv-1
          bzrlib/tests/test_pack.py      test_container.py-20070607160755-tr8zc26q18rn0jnb-2
          bzrlib/tests/test_pack_repository.py test_pack_repository-20080801043947-eaw0e6h2gu75kwmy-1
          bzrlib/tests/test_progress.py  test_progress.py-20060308160359-978c397bc79b7fda
          bzrlib/tests/test_read_bundle.py test_read_bundle.py-20060615211421-ud8cwr1ulgd914zf-1
          bzrlib/tests/test_remote.py    test_remote.py-20060720103555-yeeg2x51vn0rbtdp-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_shelf.py     test_prepare_shelf.p-20081005181341-n74qe6gu1e65ad4v-2
          bzrlib/tests/test_shelf_ui.py  test_shelf_ui.py-20081027155203-wtcuazg85wp9u4fv-1
          bzrlib/tests/test_smart.py     test_smart.py-20061122024551-ol0l0o0oofsu9b3t-2
          bzrlib/tests/test_smart_request.py test_smart_request.p-20090211070731-o38wayv3asm25d6a-1
          bzrlib/tests/test_smart_transport.py test_ssh_transport.py-20060608202016-c25gvf1ob7ypbus6-2
          bzrlib/tests/test_source.py    test_source.py-20051207061333-a58dea6abecc030d
          bzrlib/tests/test_symbol_versioning.py test_symbol_versioning.py-20060105104851-51d7722c2018d42b
          bzrlib/tests/test_tag.py       test_tag.py-20070212110532-91cw79inah2cfozx-2
          bzrlib/tests/test_trace.py     testtrace.py-20051110225523-a21117fc7a07eeff
          bzrlib/tests/test_transport_implementations.py test_transport_implementations.py-20051227111451-f97c5c7d5c49fce7
          bzrlib/tests/test_ui.py        test_ui.py-20051130162854-458e667a7414af09
          bzrlib/tests/test_upgrade_stacked.py test_upgrade_stacked-20080804072225-jd13yami19nskns5-1
          bzrlib/tests/test_urlutils.py  test_urlutils.py-20060502192900-46b1f9579987cf9c
          bzrlib/tests/test_versionedfile.py test_versionedfile.py-20060222045249-db45c9ed14a1c2e5
          bzrlib/tests/test_workingtree_4.py test_workingtree_4.p-20070223025758-531n3tznl3zacv2o-1
          bzrlib/tests/test_xml.py       test_xml.py-20050905091053-80b45588931a9b35
          bzrlib/tests/tree_implementations/__init__.py __init__.py-20060717075546-420s7b0bj9hzeowi-2
          bzrlib/tests/tree_implementations/test_path_content_summary.py test_path_content_su-20070904100855-3vrwedz6akn34kl5-1
          bzrlib/tests/workingtree_implementations/__init__.py __init__.py-20060203003124-b2aa5aca21a8bfad
          bzrlib/tests/workingtree_implementations/test_mkdir.py test_mkdir.py-20060907214856-4omn6hf1u7fvrart-3
          bzrlib/tests/workingtree_implementations/test_nested_specifics.py test_nested_specific-20070306004443-qut978c488jr11sg-1
          bzrlib/tests/workingtree_implementations/test_parents.py test_set_parents.py-20060807231740-yicmnlci1mj8smu1-1
          bzrlib/tests/workingtree_implementations/test_workingtree.py test_workingtree.py-20060203003124-817757d3e31444fb
          bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
          bzrlib/transport/http/__init__.py http_transport.py-20050711212304-506c5fd1059ace96
          bzrlib/transport/http/_urllib2_wrappers.py _urllib2_wrappers.py-20060913231729-ha9ugi48ktx481ao-1
          bzrlib/transport/remote.py     ssh.py-20060608202016-c25gvf1ob7ypbus6-1
          bzrlib/transport/sftp.py       sftp.py-20051019050329-ab48ce71b7e32dfe
          bzrlib/transport/trace.py      trace.py-20070828055009-7kt0bbc4t4b92apz-1
          bzrlib/tree.py                 tree.py-20050309040759-9d5f2496be663e77
          bzrlib/ui/__init__.py          ui.py-20050824083933-8cf663c763ba53a9
          bzrlib/ui/text.py              text.py-20051130153916-2e438cffc8afc478
          bzrlib/urlutils.py             urlutils.py-20060502195429-e8a161ecf8fac004
          bzrlib/versionedfile.py        versionedfile.py-20060222045106-5039c71ee3b65490
          bzrlib/weave.py                knit.py-20050627021749-759c29984154256b
          bzrlib/workingtree.py          workingtree.py-20050511021032-29b6ec0a681e02e3
          bzrlib/workingtree_4.py        workingtree_4.py-20070208044105-5fgpc5j3ljlh5q6c-1
          bzrlib/xml8.py                 xml5.py-20050907032657-aac8f960815b66b1
          doc/developers/HACKING.txt     HACKING-20050805200004-2a5dc975d870f78c
          doc/developers/index.txt       index.txt-20070508041241-qznziunkg0nffhiw-1
          doc/developers/network-protocol.txt networkprotocol.txt-20070903044232-woustorrjbmg5zol-1
          doc/developers/releasing.txt   releasing.txt-20080502015919-fnrcav8fwy8ccibu-1
          doc/developers/revision-properties.txt revisionproperties.t-20070807133526-w57m8zv5o7t5kugm-1
          doc/developers/testing.txt     testing.txt-20080812140359-i70zzh6v2z7grqex-1
          doc/en/user-guide/branching_a_project.txt branching_a_project.-20071122141511-0knao2lklsdsvb1q-2
          doc/en/user-guide/bzrtools_plugin.txt bzrtools_plugin.txt-20080509065016-cjc90f46407vi9a0-1
          doc/en/user-guide/index.txt    index.txt-20060622101119-tgwtdci8z769bjb9-2
          doc/en/user-guide/publishing_a_branch.txt publishing_a_branch.-20071123055134-k5x4ekduci2lbn36-2
          doc/en/user-guide/recording_changes.txt recording_changes.tx-20071121073725-0corxykv5irjal00-4
          doc/en/user-guide/shared_repository_layouts.txt shared_repository_la-20070502152030-bagewuqs18ns24o7-1
          setup.py                       setup.py-20050314065409-02f8a0a6e3f9bc70
          tools/doc_generate/autodoc_man.py bzrman.py-20050601153041-0ff7f74de456d15e
    ------------------------------------------------------------
    revno: 3508.1.15
    revision-id: v.ladeuil+lp at free.fr-20090317081545-650uqmy2v5j9dy0s
    parent: v.ladeuil+lp at free.fr-20090317081400-9tjv65u6f77sfsu0
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: pyftpdlib
    timestamp: Tue 2009-03-17 09:15:45 +0100
    message:
      Tweak chmod bits output for easier debug.
      
      * bzrlib/transport/ftp/__init__.py: 
      Fix import order.
      
      * bzrlib/tests/__init__.py:
      (TestCase.assertTransportMode): Output chmod bits in octal.
    modified:
      bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
      bzrlib/transport/ftp/__init__.py ftp.py-20051116161804-58dc9506548c2a53
    ------------------------------------------------------------
    revno: 3508.1.14
    revision-id: v.ladeuil+lp at free.fr-20090317081400-9tjv65u6f77sfsu0
    parent: v.ladeuil+lp at free.fr-20090303154749-61puv7w8t2pnz7zm
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: pyftpdlib
    timestamp: Tue 2009-03-17 09:14:00 +0100
    message:
      Tweak SITE_CHMOD server command.
      
      * bzrlib/tests/ftp_server/pyftpdlib_based.py:
      (BZRConformingFTPHandler.ftp_SITE_CHMOD): Allow spaces in paths.
    modified:
      BRANCH.TODO                    BRANCH.TODO-20060103052123-79ac4969351c03a9
      bzrlib/tests/ftp_server/pyftpdlib_based.py pyftpdlib_based.py-20090227151014-882k9q34m1gwnhvi-1
    ------------------------------------------------------------
    revno: 3508.1.13
    revision-id: v.ladeuil+lp at free.fr-20090303154749-61puv7w8t2pnz7zm
    parent: v.ladeuil+lp at free.fr-20090302195435-goqqmr9lhwr5z03u
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: pyftpdlib
    timestamp: Tue 2009-03-03 16:47:49 +0100
    message:
      Fix last failing tests under python2.6.
      
      * bzrlib/tests/ftp_server/pyftpdlib_based.py:
      (FTPServer.get_url, FTPServer.setUp): Because medusa authorized
      connections without checking the password, we have tests that more
      or less relies on that behavior in direct or indirect ways. The
      simplest solution is to give write access to anonymous with
      pyftpdlib and test authentication in a separate test.
      
      * bzrlib/tests/test_ftp_transport.py:
      (TestFTPServerUI.setUp, TestFTPServerUI.get_url): Implementation
      compatible with medusa and pyftplib.
      (TestFTPServerUI.test_prompt_for_password,
      TestFTPServerUI.test_no_prompt_for_password_when_using_auth_config):
      Simplified.
      
      * bzrlib/tests/ftp_server/medusa_based.py:
      (FTPServer.add_user): Factored out from
      bzrlib.tests.test_ftp_transport.TestFTPServerUI._add_authorized_user
      since that's specific to our medusa based ftp server.
      
      * bzrlib/tests/test_transport_implementations.py:
      (TransportTests.test_connect_twice_is_same_content): Previous fix
      was incorrect, '.base' contained the needed server prefix, using
      self.get_transport instead of the basre get_transport provides the
      wanted feature.
    modified:
      bzrlib/tests/ftp_server/medusa_based.py ftpserver.py-20071019102346-61jbvdkrr70igauv-1
      bzrlib/tests/ftp_server/pyftpdlib_based.py pyftpdlib_based.py-20090227151014-882k9q34m1gwnhvi-1
      bzrlib/tests/test_ftp_transport.py test_aftp_transport.-20060823221619-98mwjzxtwtkt527k-1
      bzrlib/tests/test_transport_implementations.py test_transport_implementations.py-20051227111451-f97c5c7d5c49fce7
    ------------------------------------------------------------
    revno: 3508.1.12
    revision-id: v.ladeuil+lp at free.fr-20090302195435-goqqmr9lhwr5z03u
    parent: v.ladeuil+lp at free.fr-20090302142604-guy21k12jikewl37
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: pyftpdlib
    timestamp: Mon 2009-03-02 20:54:35 +0100
    message:
      Don't require patched version for pyftpdlib.
      
      * bzrlib/tests/ftp_server/pyftpdlib_based.py:
      (FTPServer.setUp, tearDown, _run_server): Use lock to ensure we
      wait for the server to start and use pyftpdlib without any
      patches.
      
      * bzrlib/tests/ftp_server/__init__.py: 
      Fix python version for medusa support.
    modified:
      bzrlib/tests/ftp_server/__init__.py __init__.py-20090227130107-4gcpgvr00l7v3fsw-1
      bzrlib/tests/ftp_server/pyftpdlib_based.py pyftpdlib_based.py-20090227151014-882k9q34m1gwnhvi-1
    ------------------------------------------------------------
    revno: 3508.1.11
    revision-id: v.ladeuil+lp at free.fr-20090302142604-guy21k12jikewl37
    parent: v.ladeuil+lp at free.fr-20090301100200-1qdmf362uw5q35s0
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: pyftpdlib
    timestamp: Mon 2009-03-02 15:26:04 +0100
    message:
      Tests passing for python2.5 and python2.6 (and python2.4 :).
      
      * bzrlib/tests/ftp_server/pyftpdlib_based.py:
      (BzrConformingFS.fs2ftp): Fix the cause of the remaining failing
      tests.
      (FTPServer.setUp, FTPServer.tearDown): Better server handling,
      avoiding socket leaks, hangs and other weirdness. Requires a patch
      upstream though.
    modified:
      bzrlib/tests/ftp_server/pyftpdlib_based.py pyftpdlib_based.py-20090227151014-882k9q34m1gwnhvi-1
    ------------------------------------------------------------
    revno: 3508.1.10
    revision-id: v.ladeuil+lp at free.fr-20090301100200-1qdmf362uw5q35s0
    parent: v.ladeuil+lp at free.fr-20090228214320-8wjuatnu074v8pny
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: pyftpdlib
    timestamp: Sun 2009-03-01 11:02:00 +0100
    message:
      Start supporting pyftpdlib as an ftp test server.
      
      * bzrlib/transport/ftp/__init__.py:
      (FtpTransport._setmode): Report mode bits in octal.
      
      * bzrlib/transport/__init__.py:
      Don't register GSSAPI ftp transports if kerberos can't be
      imported, this avoids useless repeated messages in log as the
      import repeatedly fail.
      
      * bzrlib/tests/test_transport_implementations.py:
      (TransportTests.test_has): Fix too long lines.
      (TransportTests.test_connect_twice_is_same_content): Fig bogus
      test. transport.base is *not* usable, it miss the password for
      authenticated urls. This was passing only because no test server
      use authentication by default *except* medusa for which we had a
      dummy authorizer with no password check.
      
      * bzrlib/tests/ftp_server/pyftpdlib_based.py: 
      First shot at an ftp test server running is a separate thread.
      
      * bzrlib/tests/ftp_server/__init__.py: 
      Add support for pyftpdlib based ftp test server.
      (_FTPServerFeature._probe): One of medusa or pyftpdlib is needed.
    added:
      bzrlib/tests/ftp_server/pyftpdlib_based.py pyftpdlib_based.py-20090227151014-882k9q34m1gwnhvi-1
    modified:
      BRANCH.TODO                    BRANCH.TODO-20060103052123-79ac4969351c03a9
      bzrlib/tests/ftp_server/__init__.py __init__.py-20090227130107-4gcpgvr00l7v3fsw-1
      bzrlib/tests/test_transport_implementations.py test_transport_implementations.py-20051227111451-f97c5c7d5c49fce7
      bzrlib/transport/__init__.py   transport.py-20050711165921-4978aa7ce1285ad5
      bzrlib/transport/ftp/__init__.py ftp.py-20051116161804-58dc9506548c2a53
    ------------------------------------------------------------
    revno: 3508.1.9
    revision-id: v.ladeuil+lp at free.fr-20090228214320-8wjuatnu074v8pny
    parent: v.ladeuil+lp at free.fr-20090228170617-3ezbrszcsdad3mqh
    parent: v.ladeuil+lp at free.fr-20090228214300-wnyb0iflp71ww6j4
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: pyftpdlib
    timestamp: Sat 2009-02-28 22:43:20 +0100
    message:
      Merge disable-medusa-for-python-2.6 into pyftpdlib
    modified:
      bzrlib/tests/ftp_server/__init__.py __init__.py-20090227130107-4gcpgvr00l7v3fsw-1
        ------------------------------------------------------------
        revno: 4063.3.2
        revision-id: v.ladeuil+lp at free.fr-20090228214300-wnyb0iflp71ww6j4
        parent: v.ladeuil+lp at free.fr-20090228210158-cpwfhldwzmlyirfa
        committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
        branch nick: disable-medusa-for-python-2.6
        timestamp: Sat 2009-02-28 22:43:00 +0100
        message:
          Disable medusa under python2.6 until we find or replacement or it get fixed.
          
          * bzrlib/tests/ftp_server/__init__.py: 
          Disable medusa under python2.6.
        modified:
          bzrlib/tests/ftp_server/__init__.py __init__.py-20090227130107-4gcpgvr00l7v3fsw-1
        ------------------------------------------------------------
        revno: 4063.3.1
        revision-id: v.ladeuil+lp at free.fr-20090228210158-cpwfhldwzmlyirfa
        parent: pqm at pqm.ubuntu.com-20090227165204-wtg2koex221f2g8b
        parent: v.ladeuil+lp at free.fr-20090228170617-3ezbrszcsdad3mqh
        committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
        branch nick: disable-medusa-for-python-2.6
        timestamp: Sat 2009-02-28 22:01:58 +0100
        message:
          split pyftpdlib thread to isolate medusa related changes
        added:
          bzrlib/tests/ftp_server/       ftp_server-20090227112800-4r9jkezw2hw9tij7-1
          bzrlib/tests/ftp_server/__init__.py __init__.py-20090227130107-4gcpgvr00l7v3fsw-1
        renamed:
          bzrlib/tests/ftp_server.py => bzrlib/tests/ftp_server/medusa_based.py ftpserver.py-20071019102346-61jbvdkrr70igauv-1
        modified:
          bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
          bzrlib/tests/test_ftp_transport.py test_aftp_transport.-20060823221619-98mwjzxtwtkt527k-1
          bzrlib/transport/ftp/__init__.py ftp.py-20051116161804-58dc9506548c2a53
          bzrlib/tests/ftp_server/medusa_based.py ftpserver.py-20071019102346-61jbvdkrr70igauv-1
    ------------------------------------------------------------
    revno: 3508.1.8
    revision-id: v.ladeuil+lp at free.fr-20090228170617-3ezbrszcsdad3mqh
    parent: v.ladeuil+lp at free.fr-20090227132613-ez1i849mn2xpt97q
    parent: v.ladeuil+lp at free.fr-20090228170605-foexzya9e468zrc7
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: pyftpdlib
    timestamp: Sat 2009-02-28 18:06:17 +0100
    message:
      Merge binary-mode into pyftpdlib
    added:
      doc/en/user-guide/filtered_views.txt filtered_views.txt-20090226100856-a16ba1v97v91ru58-1
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/bzrdir.py               bzrdir.py-20060131065624-156dfea39c4387cb
      bzrlib/fetch.py                fetch.py-20050818234941-26fea6105696365d
      bzrlib/graph.py                graph_walker.py-20070525030359-y852guab65d4wtn0-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/repofmt/weaverepo.py    presplitout.py-20070125045333-wfav3tsh73oxu3zk-1
      bzrlib/repository.py           rev_storage.py-20051111201905-119e9401e46257e3
      bzrlib/smart/bzrdir.py         bzrdir.py-20061122024551-ol0l0o0oofsu9b3t-1
      bzrlib/smart/request.py        request.py-20061108095550-gunadhxmzkdjfeek-1
      bzrlib/tests/blackbox/test_push.py test_push.py-20060329002750-929af230d5d22663
      bzrlib/tests/branch_implementations/test_create_clone.py test_create_clone.py-20090225031440-8ybpkzojo7cvourv-1
      bzrlib/tests/branch_implementations/test_push.py test_push.py-20070130153159-fhfap8uoifevg30j-1
      bzrlib/tests/per_repository/test_repository.py test_repository.py-20060131092128-ad07f494f5c9d26c
      bzrlib/tests/test_fetch.py     testfetch.py-20050825090644-f73e07e7dfb1765a
      bzrlib/tests/test_graph.py     test_graph_walker.py-20070525030405-enq4r60hhi9xrujc-1
      bzrlib/tests/test_pack_repository.py test_pack_repository-20080801043947-eaw0e6h2gu75kwmy-1
      bzrlib/tests/test_remote.py    test_remote.py-20060720103555-yeeg2x51vn0rbtdp-2
      bzrlib/tests/test_repository.py test_repository.py-20060131075918-65c555b881612f4d
      bzrlib/tests/test_smart.py     test_smart.py-20061122024551-ol0l0o0oofsu9b3t-2
      bzrlib/transport/remote.py     ssh.py-20060608202016-c25gvf1ob7ypbus6-1
      doc/en/user-guide/index.txt    index.txt-20060622101119-tgwtdci8z769bjb9-2
        ------------------------------------------------------------
        revno: 3508.3.1
        revision-id: v.ladeuil+lp at free.fr-20090228170605-foexzya9e468zrc7
        parent: v.ladeuil+lp at free.fr-20090227084436-4j9864kycsieuycj
        parent: v.ladeuil+lp at free.fr-20090228170555-5atqlgvoiy36rd71
        committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
        branch nick: binary-mode
        timestamp: Sat 2009-02-28 18:06:05 +0100
        message:
          Merge fix-chmod into binary-mode
        added:
          doc/en/user-guide/filtered_views.txt filtered_views.txt-20090226100856-a16ba1v97v91ru58-1
        modified:
          NEWS                           NEWS-20050323055033-4e00b5db738777ff
          bzrlib/bzrdir.py               bzrdir.py-20060131065624-156dfea39c4387cb
          bzrlib/fetch.py                fetch.py-20050818234941-26fea6105696365d
          bzrlib/graph.py                graph_walker.py-20070525030359-y852guab65d4wtn0-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/repofmt/weaverepo.py    presplitout.py-20070125045333-wfav3tsh73oxu3zk-1
          bzrlib/repository.py           rev_storage.py-20051111201905-119e9401e46257e3
          bzrlib/smart/bzrdir.py         bzrdir.py-20061122024551-ol0l0o0oofsu9b3t-1
          bzrlib/smart/request.py        request.py-20061108095550-gunadhxmzkdjfeek-1
          bzrlib/tests/blackbox/test_push.py test_push.py-20060329002750-929af230d5d22663
          bzrlib/tests/branch_implementations/test_create_clone.py test_create_clone.py-20090225031440-8ybpkzojo7cvourv-1
          bzrlib/tests/branch_implementations/test_push.py test_push.py-20070130153159-fhfap8uoifevg30j-1
          bzrlib/tests/per_repository/test_repository.py test_repository.py-20060131092128-ad07f494f5c9d26c
          bzrlib/tests/test_fetch.py     testfetch.py-20050825090644-f73e07e7dfb1765a
          bzrlib/tests/test_graph.py     test_graph_walker.py-20070525030405-enq4r60hhi9xrujc-1
          bzrlib/tests/test_pack_repository.py test_pack_repository-20080801043947-eaw0e6h2gu75kwmy-1
          bzrlib/tests/test_remote.py    test_remote.py-20060720103555-yeeg2x51vn0rbtdp-2
          bzrlib/tests/test_repository.py test_repository.py-20060131075918-65c555b881612f4d
          bzrlib/tests/test_smart.py     test_smart.py-20061122024551-ol0l0o0oofsu9b3t-2
          bzrlib/transport/remote.py     ssh.py-20060608202016-c25gvf1ob7ypbus6-1
          doc/en/user-guide/index.txt    index.txt-20060622101119-tgwtdci8z769bjb9-2
        ------------------------------------------------------------
        revno: 3508.2.1
        revision-id: v.ladeuil+lp at free.fr-20090228170555-5atqlgvoiy36rd71
        parent: v.ladeuil+lp at free.fr-20090226193006-mleqjssvlnebdeea
        parent: pqm at pqm.ubuntu.com-20090227165204-wtg2koex221f2g8b
        committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
        branch nick: fix-chmod
        timestamp: Sat 2009-02-28 18:05:55 +0100
        message:
          Merge bzr.dev into fix-chmod
        added:
          doc/en/user-guide/filtered_views.txt filtered_views.txt-20090226100856-a16ba1v97v91ru58-1
        modified:
          NEWS                           NEWS-20050323055033-4e00b5db738777ff
          bzrlib/bzrdir.py               bzrdir.py-20060131065624-156dfea39c4387cb
          bzrlib/fetch.py                fetch.py-20050818234941-26fea6105696365d
          bzrlib/graph.py                graph_walker.py-20070525030359-y852guab65d4wtn0-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/repofmt/weaverepo.py    presplitout.py-20070125045333-wfav3tsh73oxu3zk-1
          bzrlib/repository.py           rev_storage.py-20051111201905-119e9401e46257e3
          bzrlib/smart/bzrdir.py         bzrdir.py-20061122024551-ol0l0o0oofsu9b3t-1
          bzrlib/smart/request.py        request.py-20061108095550-gunadhxmzkdjfeek-1
          bzrlib/tests/blackbox/test_push.py test_push.py-20060329002750-929af230d5d22663
          bzrlib/tests/branch_implementations/test_create_clone.py test_create_clone.py-20090225031440-8ybpkzojo7cvourv-1
          bzrlib/tests/branch_implementations/test_push.py test_push.py-20070130153159-fhfap8uoifevg30j-1
          bzrlib/tests/per_repository/test_repository.py test_repository.py-20060131092128-ad07f494f5c9d26c
          bzrlib/tests/test_fetch.py     testfetch.py-20050825090644-f73e07e7dfb1765a
          bzrlib/tests/test_graph.py     test_graph_walker.py-20070525030405-enq4r60hhi9xrujc-1
          bzrlib/tests/test_pack_repository.py test_pack_repository-20080801043947-eaw0e6h2gu75kwmy-1
          bzrlib/tests/test_remote.py    test_remote.py-20060720103555-yeeg2x51vn0rbtdp-2
          bzrlib/tests/test_repository.py test_repository.py-20060131075918-65c555b881612f4d
          bzrlib/tests/test_smart.py     test_smart.py-20061122024551-ol0l0o0oofsu9b3t-2
          bzrlib/transport/ftp/__init__.py ftp.py-20051116161804-58dc9506548c2a53
          bzrlib/transport/remote.py     ssh.py-20060608202016-c25gvf1ob7ypbus6-1
          doc/en/user-guide/index.txt    index.txt-20060622101119-tgwtdci8z769bjb9-2
    ------------------------------------------------------------
    revno: 3508.1.7
    revision-id: v.ladeuil+lp at free.fr-20090227132613-ez1i849mn2xpt97q
    parent: v.ladeuil+lp at free.fr-20090227084436-4j9864kycsieuycj
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: pyftpdlib
    timestamp: Fri 2009-02-27 14:26:13 +0100
    message:
      Prepare test framework for pyftpdlib injection.
      
      * bzrlib/tests/ftp_server/__init__.py:
      Provide a single front-end for ftp test servers.
      
      * bzrlib/tests/test_ftp_transport.py: 
      Use ftp_server import.
      
      * bzrlib/transport/ftp/__init__.py:
      (get_test_permutations): Simplified.
      
      * bzrlib/tests/__init__.py:
      (FTPServerFeature): Moved to bzrlib/tests/ftp_server/__init__.py.
    added:
      bzrlib/tests/ftp_server/       ftp_server-20090227112800-4r9jkezw2hw9tij7-1
      bzrlib/tests/ftp_server/__init__.py __init__.py-20090227130107-4gcpgvr00l7v3fsw-1
    renamed:
      bzrlib/tests/ftp_server.py => bzrlib/tests/ftp_server/medusa_based.py ftpserver.py-20071019102346-61jbvdkrr70igauv-1
    modified:
      bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
      bzrlib/tests/test_ftp_transport.py test_aftp_transport.-20060823221619-98mwjzxtwtkt527k-1
      bzrlib/transport/ftp/__init__.py ftp.py-20051116161804-58dc9506548c2a53
      bzrlib/tests/ftp_server/medusa_based.py ftpserver.py-20071019102346-61jbvdkrr70igauv-1
-------------- next part --------------
=== modified file 'NEWS'
--- a/NEWS	2009-03-19 04:48:30 +0000
+++ b/NEWS	2009-03-19 14:41:41 +0000
@@ -121,6 +121,12 @@
   faulty tests were not properly isolated.
   (Andrew Bennetts, Robert Collins)
 
+* ``medusa`` is not used anymore as an FTP test server starting with
+  python2.6. A new FTP test server based on ``pyftplib`` can be used
+  instead. This new server is a soft dependency as medusa which is still
+  preferred if both are available (modulo python version).
+  (Vincent Ladeuil)
+
 Internals
 *********
 

=== modified file 'bzrlib/tests/__init__.py'
--- a/bzrlib/tests/__init__.py	2009-03-19 13:34:53 +0000
+++ b/bzrlib/tests/__init__.py	2009-03-19 17:43:37 +0000
@@ -1018,7 +1018,8 @@
         path_stat = transport.stat(path)
         actual_mode = stat.S_IMODE(path_stat.st_mode)
         self.assertEqual(mode, actual_mode,
-            'mode of %r incorrect (%o != %o)' % (path, mode, actual_mode))
+                         'mode of %r incorrect (%s != %s)'
+                         % (path, oct(mode), oct(actual_mode)))
 
     def assertIsSameRealPath(self, path1, path2):
         """Fail if path1 and path2 points to different files"""
@@ -3687,27 +3688,6 @@
     return None
 
 
-class _FTPServerFeature(Feature):
-    """Some tests want an FTP Server, check if one is available.
-
-    Right now, the only way this is available is if 'medusa' is installed.
-    http://www.amk.ca/python/code/medusa.html
-    """
-
-    def _probe(self):
-        try:
-            import bzrlib.tests.ftp_server
-            return True
-        except ImportError:
-            return False
-
-    def feature_name(self):
-        return 'FTPServer'
-
-
-FTPServerFeature = _FTPServerFeature()
-
-
 class _HTTPSServerFeature(Feature):
     """Some tests want an https Server, check if one is available.
 

=== modified file 'bzrlib/tests/blackbox/test_breakin.py'
--- a/bzrlib/tests/blackbox/test_breakin.py	2009-02-23 15:29:35 +0000
+++ b/bzrlib/tests/blackbox/test_breakin.py	2009-03-19 17:29:45 +0000
@@ -47,29 +47,16 @@
     # port 0 means to allocate any port
     _test_process_args = ['serve', '--port', 'localhost:0']
 
-    def test_breakin(self):
-        # Break in to a debugger while bzr is running
-        # we need to test against a command that will wait for
-        # a while -- bzr serve should do
+    def test_breakin_harder(self):
+        self._dont_SIGQUIT_on_darwin()
         proc = self.start_bzr_subprocess(self._test_process_args,
                 env_changes=dict(BZR_SIGQUIT_PDB=None))
         # wait for it to get started, and print the 'listening' line
         proc.stderr.readline()
-        # first sigquit pops into debugger
+        # break into the debugger
         os.kill(proc.pid, signal.SIGQUIT)
-        proc.stdin.write("q\n")
-        time.sleep(.5)
         err = proc.stderr.readline()
         self.assertContainsRe(err, r'entering debugger')
-
-    def test_breakin_harder(self):
-        self._dont_SIGQUIT_on_darwin()
-        proc = self.start_bzr_subprocess(self._test_process_args,
-                env_changes=dict(BZR_SIGQUIT_PDB=None))
-        # wait for it to get started, and print the 'listening' line
-        proc.stderr.readline()
-        # break into the debugger
-        os.kill(proc.pid, signal.SIGQUIT)
         # now send a second sigquit, which should cause it to exit.  That
         # won't happen until the original signal has been noticed by the
         # child and it's run its signal handler.  We don't know quite how long
@@ -83,7 +70,7 @@
             r = os.waitpid(proc.pid, os.WNOHANG)
             if r != (0, 0):
                 # high bit says if core was dumped; we don't care
-                self.assertEquals(r[1] & 0x7f, signal.SIGQUIT)
+                self.assertEquals(signal.SIGQUIT, r[1] & 0x7f)
                 break
         else:
             self.fail("subprocess wasn't terminated by repeated SIGQUIT")

=== added directory 'bzrlib/tests/ftp_server'
=== added file 'bzrlib/tests/ftp_server/__init__.py'
--- a/bzrlib/tests/ftp_server/__init__.py	1970-01-01 00:00:00 +0000
+++ b/bzrlib/tests/ftp_server/__init__.py	2009-03-19 14:28:27 +0000
@@ -0,0 +1,87 @@
+# Copyright (C) 2009 Canonical Ltd
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+"""
+Facilities to use ftp test servers.
+"""
+
+import sys
+
+from bzrlib import tests
+
+
+try:
+    from bzrlib.tests.ftp_server import medusa_based
+    # medusa is bogus under python2.6
+    medusa_available = sys.version_info < (2, 6)
+except ImportError:
+    medusa_available = False
+
+
+try:
+    from bzrlib.tests.ftp_server import pyftpdlib_based
+    pyftpdlib_available = True
+except ImportError:
+    pyftpdlib_available = False
+
+
+class _FTPServerFeature(tests.Feature):
+    """Some tests want an FTP Server, check if one is available.
+
+    Right now, the only way this is available is if one of the following is
+    installed:
+
+    - 'medusa': http://www.amk.ca/python/code/medusa.html
+    - 'pyftpdlib': http://code.google.com/p/pyftpdlib/
+    """
+
+    def _probe(self):
+        return medusa_available or pyftpdlib_available
+
+    def feature_name(self):
+        return 'FTPServer'
+
+
+FTPServerFeature = _FTPServerFeature()
+
+
+class UnavailableFTPServer(object):
+    """Dummy ftp test server.
+
+    This allows the test suite report the number of tests needing that
+    feature. We raise UnavailableFeature from methods before the test server is
+    being used. Doing so in the setUp method has bad side-effects (tearDown is
+    never called).
+    """
+
+    def setUp(self, vfs_server=None):
+        pass
+
+    def tearDown(self):
+        pass
+
+    def get_url(self):
+        raise tests.UnavailableFeature(FTPServerFeature)
+
+    def get_bogus_url(self):
+        raise tests.UnavailableFeature(FTPServerFeature)
+
+
+if medusa_available:
+    FTPTestServer = medusa_based.FTPTestServer
+elif pyftpdlib_available:
+    FTPTestServer = pyftpdlib_based.FTPTestServer
+else:
+    FTPTestServer = UnavailableFTPTestServer

=== renamed file 'bzrlib/tests/ftp_server.py' => 'bzrlib/tests/ftp_server/medusa_based.py'
--- a/bzrlib/tests/ftp_server.py	2009-01-17 01:30:58 +0000
+++ b/bzrlib/tests/ftp_server/medusa_based.py	2009-03-19 14:28:27 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2007 Canonical Ltd
+# Copyright (C) 2007, 2008, 2009 Canonical Ltd
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -210,7 +210,7 @@
         trace.mutter('ftp_server %s: %s', type, message)
 
 
-class FTPServer(transport.Server):
+class FTPTestServer(transport.Server):
     """Common code for FTP server facilities."""
 
     def __init__(self):
@@ -250,7 +250,7 @@
         # Don't let it loop forever, or handle an infinite number of requests.
         # In this case it will run for 1000s, or 10000 requests
         self._async_thread = threading.Thread(
-                target=FTPServer._asyncore_loop_ignore_EBADF,
+                target=FTPTestServer._asyncore_loop_ignore_EBADF,
                 kwargs={'timeout':0.1, 'count':10000})
         self._async_thread.setDaemon(True)
         self._async_thread.start()
@@ -279,6 +279,9 @@
             if e.args[0] != errno.EBADF:
                 raise
 
-
-
+    def add_user(self, user, password):
+        """Add a user with write access."""
+        authorizer = server = self._ftp_server.authorizer
+        authorizer.secured_user = user
+        authorizer.secured_password = password
 

=== added file 'bzrlib/tests/ftp_server/pyftpdlib_based.py'
--- a/bzrlib/tests/ftp_server/pyftpdlib_based.py	1970-01-01 00:00:00 +0000
+++ b/bzrlib/tests/ftp_server/pyftpdlib_based.py	2009-03-19 14:28:27 +0000
@@ -0,0 +1,211 @@
+# Copyright (C) 2009 Canonical Ltd
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+"""
+FTP test server.
+
+Based on pyftpdlib: http://code.google.com/p/pyftpdlib/
+"""
+
+import errno
+import os
+from pyftpdlib import ftpserver
+import select
+import threading
+
+
+from bzrlib import (
+    osutils,
+    trace,
+    transport,
+    )
+
+
+class AnonymousWithWriteAccessAuthorizer(ftpserver.DummyAuthorizer):
+
+    def _check_permissions(self, username, perm):
+        # Like base implementation but don't warn about write permissions
+        # assigned to anonymous, since that's exactly our purpose.
+        for p in perm:
+            if p not in self.read_perms + self.write_perms:
+                raise ftpserver.AuthorizerError('No such permission "%s"' %p)
+
+
+class BzrConformingFS(ftpserver.AbstractedFS):
+
+    def chmod(self, path, mode):
+        return os.chmod(path, mode)
+
+    def listdir(self, path):
+        """List the content of a directory."""
+        # FIXME: need tests with unicode paths
+        return [osutils.safe_utf8(s) for s in os.listdir(path)]
+
+    def fs2ftp(self, fspath):
+        p = ftpserver.AbstractedFS.fs2ftp(self, fspath)
+        # FIXME: need tests with unicode paths
+        return osutils.safe_utf8(p)
+
+
+class BzrConformingFTPHandler(ftpserver.FTPHandler):
+
+    abstracted_fs = BzrConformingFS
+
+    def __init__(self, conn, server):
+        ftpserver.FTPHandler.__init__(self, conn, server)
+        self.authorizer = server.authorizer
+
+    def ftp_SIZE(self, path):
+        # bzr is overly picky here, but we want to make the test suite pass
+        # first. This may need to be revisited -- vila 20090226
+        line = self.fs.fs2ftp(path)
+        if self.fs.isdir(self.fs.realpath(path)):
+            why = "%s is a directory" % line
+            self.log('FAIL SIZE "%s". %s.' % (line, why))
+            self.respond("550 %s."  %why)
+        else:
+            ftpserver.FTPHandler.ftp_SIZE(self, path)
+
+    def ftp_NLST(self, path):
+        # bzr is overly picky here, but we want to make the test suite pass
+        # first. This may need to be revisited -- vila 20090226
+        line = self.fs.fs2ftp(path)
+        if self.fs.isfile(self.fs.realpath(path)):
+            why = "Not a directory: %s" % line
+            self.log('FAIL SIZE "%s". %s.' % (line, why))
+            self.respond("550 %s."  %why)
+        else:
+            ftpserver.FTPHandler.ftp_NLST(self, path)
+
+    def ftp_SITE_CHMOD(self, line):
+        try:
+            mode, path = line.split(None, 1)
+            mode = int(mode, 8)
+        except ValueError:
+            # We catch both malformed line and malformed mode with the same
+            # ValueError.
+            self.respond("500 'SITE CHMOD %s': command not understood."
+                         % line)
+            self.log('FAIL SITE CHMOD ' % line)
+            return
+        ftp_path = self.fs.fs2ftp(path)
+        try:
+            self.run_as_current_user(self.fs.chmod, self.fs.ftp2fs(path), mode)
+        except OSError, err:
+            why = ftpserver._strerror(err)
+            self.log('FAIL SITE CHMOD 0%03o "%s". %s.' % (mode, ftp_path, why))
+            self.respond('550 %s.' % why)
+        else:
+            self.log('OK SITE CHMOD 0%03o "%s".' % (mode, ftp_path))
+            self.respond('200 SITE CHMOD succesful.')
+
+
+# pyftpdlib says to define SITE commands by declaring ftp_SITE_<CMD> methods,
+# but fails to recognize them.
+ftpserver.proto_cmds['SITE CHMOD'] = ftpserver._CommandProperty(
+    perm='w', # Best fit choice even if not exactly right (can be d, f or m too)
+    auth_needed=True, arg_needed=True, check_path=False,
+    help='Syntax: SITE CHMOD <SP>  octal_mode_bits file-name (chmod file)',
+    )
+# An empty password is valid, hence the arg is neither mandatory not forbidden
+ftpserver.proto_cmds['PASS'].arg_needed = None
+
+
+class ftp_server(ftpserver.FTPServer):
+
+    def __init__(self, address, handler, authorizer):
+        ftpserver.FTPServer.__init__(self, address, handler)
+        self.authorizer = authorizer
+        # Worth backporting upstream ?
+        self.addr = self.socket.getsockname()
+
+
+class FTPTestServer(transport.Server):
+    """Common code for FTP server facilities."""
+
+    def __init__(self):
+        self._root = None
+        self._ftp_server = None
+        self._port = None
+        self._async_thread = None
+        # ftp server logs
+        self.logs = []
+        self._ftpd_running = False
+
+    def get_url(self):
+        """Calculate an ftp url to this server."""
+        return 'ftp://anonymous@localhost:%d/' % (self._port)
+
+    def get_bogus_url(self):
+        """Return a URL which cannot be connected to."""
+        return 'ftp://127.0.0.1:1/'
+
+    def log(self, message):
+        """This is used by ftp_server to log connections, etc."""
+        self.logs.append(message)
+
+    def setUp(self, vfs_server=None):
+        from bzrlib.transport.local import LocalURLServer
+        if not (vfs_server is None or isinstance(vfs_server, LocalURLServer)):
+            raise AssertionError(
+                "FTPServer currently assumes local transport, got %s"
+                % vfs_server)
+        self._root = os.getcwdu()
+
+        address = ('localhost', 0) # bind to a random port
+        authorizer = AnonymousWithWriteAccessAuthorizer()
+        authorizer.add_anonymous(self._root, perm='elradfmw')
+        self._ftp_server = ftp_server(address, BzrConformingFTPHandler,
+                                      authorizer)
+        # This is hacky as hell, will not work if we need two servers working
+        # at the same time, but that's the best we can do so far...
+        # FIXME: At least log and logline could be overriden in the handler ?
+        # -- vila 20090227
+        ftpserver.log = self.log
+        ftpserver.logline = self.log
+        ftpserver.logerror = self.log
+
+        self._port = self._ftp_server.socket.getsockname()[1]
+        self._ftpd_starting = threading.Lock()
+        self._ftpd_starting.acquire() # So it can be released by the server
+        self._ftpd_thread = threading.Thread(
+                target=self._run_server,)
+        self._ftpd_thread.start()
+        # Wait for the server thread to start (i.e release the lock)
+        self._ftpd_starting.acquire()
+        self._ftpd_starting.release()
+
+    def tearDown(self):
+        """See bzrlib.transport.Server.tearDown."""
+        # Tell the server to stop, but also close the server socket for tests
+        # that start the server but never initiate a connection. Closing the
+        # socket should be done first though, to avoid further connections.
+        self._ftp_server.close()
+        self._ftpd_running = False
+        self._ftpd_thread.join()
+
+    def _run_server(self):
+        """Run the server until tearDown is called, shut it down properly then.
+        """
+        self._ftpd_running = True
+        self._ftpd_starting.release()
+        while self._ftpd_running:
+            self._ftp_server.serve_forever(timeout=0.1, count=1)
+        self._ftp_server.close_all(ignore_all=True)
+
+    def add_user(self, user, password):
+        """Add a user with write access."""
+        self._ftp_server.authorizer.add_user(user, password, self._root,
+                                             perm='elradfmw')

=== modified file 'bzrlib/tests/test_ftp_transport.py'
--- a/bzrlib/tests/test_ftp_transport.py	2007-11-04 15:29:17 +0000
+++ b/bzrlib/tests/test_ftp_transport.py	2009-03-19 14:28:27 +0000
@@ -24,14 +24,15 @@
     ui,
     )
 
+from bzrlib.tests import ftp_server
+
 
 class TestCaseWithFTPServer(tests.TestCaseWithTransport):
 
-    _test_needs_features = [tests.FTPServerFeature]
+    _test_needs_features = [ftp_server.FTPServerFeature]
 
     def setUp(self):
-        from bzrlib.tests import ftp_server
-        self.transport_server = ftp_server.FTPServer
+        self.transport_server = ftp_server.FTPTestServer
         super(TestCaseWithFTPServer, self).setUp()
 
 
@@ -47,7 +48,7 @@
         self.assertEqual('aftp://host/path', t.abspath(''))
 
 
-class TestFTPServer(TestCaseWithFTPServer):
+class TestFTPTestServer(TestCaseWithFTPServer):
 
     def test_basic_exists(self):
         url = self.get_url()
@@ -66,28 +67,27 @@
         self.assertEqual('test more bytes\n', t.get_bytes('foo'))
 
 
-class TestFTPServerUI(TestCaseWithFTPServer):
-
-    def _add_authorized_user(self, user, password):
-        server = self.get_server()
-        # FIXME: There should be a better way to declare authorized users and
-        # passwords to the server
-        authorizer = server._ftp_server.authorizer
-        authorizer.secured_user = user
-        authorizer.secured_password = password
+class TestFTPTestServerUI(TestCaseWithFTPServer):
+
+    def setUp(self):
+        super(TestFTPTestServerUI, self).setUp()
+        self.user = 'joe'
+        self.password = 'secret'
+        self.get_server().add_user(self.user, self.password)
+
+    def get_url(self, relpath=None):
+        """Overrides get_url to inject our user."""
+        base = super(TestFTPTestServerUI, self).get_url(relpath)
+        (scheme, user, password,
+         host, port, path) = transport.ConnectedTransport._split_url(base)
+        url = transport.ConnectedTransport._unsplit_url(
+            scheme, self.user, self.password, host, port, path)
+        return url
 
     def test_prompt_for_password(self):
         t = self.get_transport()
-        # Ensure that the test framework set the password
-        self.assertIsNot(t._password, None)
-        # Reset the password (get_url set the password to 'bar' so we
-        # reset it to None in the transport before the connection).
-        password = t._password
-        t._password = None
-        ui.ui_factory = tests.TestUIFactory(stdin=password+'\n',
+        ui.ui_factory = tests.TestUIFactory(stdin=self.password+'\n',
                                             stdout=tests.StringIOWrapper())
-        # Ask the server to check the password
-        self._add_authorized_user(t._user, password)
         # Issue a request to the server to connect
         t.has('whatever/not/existing')
         # stdin should be empty (the provided password have been consumed)
@@ -95,23 +95,31 @@
 
     def test_no_prompt_for_password_when_using_auth_config(self):
         t = self.get_transport()
-        # Reset the password (get_url set the password to 'bar' so we
-        # reset it to None in the transport before the connection).
-        password = t._password
-        t._password = None
         ui.ui_factory = tests.TestUIFactory(stdin='precious\n',
                                             stdout=tests.StringIOWrapper())
-        # Ask the server to check the password
-        self._add_authorized_user(t._user, password)
-
         # Create a config file with the right password
         conf = config.AuthenticationConfig()
         conf._get_config().update({'ftptest': {'scheme': 'ftp',
-                                               'user': t._user,
-                                               'password': password}})
+                                               'user': self.user,
+                                               'password': self.password}})
         conf._save()
         # Issue a request to the server to connect
         t.put_bytes('foo', 'test bytes\n')
         self.assertEqual('test bytes\n', t.get_bytes('foo'))
         # stdin should have  been left untouched
         self.assertEqual('precious\n', ui.ui_factory.stdin.readline())
+
+    def test_empty_password(self):
+        # Override the default user/password from setUp
+        self.user = 'jim'
+        self.password = ''
+        self.get_server().add_user(self.user, self.password)
+        t = self.get_transport()
+        ui.ui_factory = tests.TestUIFactory(stdin=self.password+'\n',
+                                            stdout=tests.StringIOWrapper())
+        # Issue a request to the server to connect
+        t.has('whatever/not/existing')
+        # stdin should be empty (the provided password have been consumed),
+        # even if the password is empty, it's followed by a newline.
+        self.assertEqual('', ui.ui_factory.stdin.readline())
+

=== modified file 'bzrlib/tests/test_transport_implementations.py'
--- a/bzrlib/tests/test_transport_implementations.py	2009-03-07 06:58:17 +0000
+++ b/bzrlib/tests/test_transport_implementations.py	2009-03-17 08:19:26 +0000
@@ -155,12 +155,17 @@
         self.assertEqual(True, t.has('a'))
         self.assertEqual(False, t.has('c'))
         self.assertEqual(True, t.has(urlutils.escape('%')))
-        self.assertEqual(list(t.has_multi(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])),
-                [True, True, False, False, True, False, True, False])
+        self.assertEqual(list(t.has_multi(['a', 'b', 'c', 'd',
+                                           'e', 'f', 'g', 'h'])),
+                         [True, True, False, False,
+                          True, False, True, False])
         self.assertEqual(True, t.has_any(['a', 'b', 'c']))
-        self.assertEqual(False, t.has_any(['c', 'd', 'f', urlutils.escape('%%')]))
-        self.assertEqual(list(t.has_multi(iter(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']))),
-                [True, True, False, False, True, False, True, False])
+        self.assertEqual(False, t.has_any(['c', 'd', 'f',
+                                           urlutils.escape('%%')]))
+        self.assertEqual(list(t.has_multi(iter(['a', 'b', 'c', 'd',
+                                                'e', 'f', 'g', 'h']))),
+                         [True, True, False, False,
+                          True, False, True, False])
         self.assertEqual(False, t.has_any(['c', 'c', 'c']))
         self.assertEqual(True, t.has_any(['b', 'b', 'b']))
 
@@ -1495,16 +1500,10 @@
         transport.put_bytes('foo', 'bar')
         transport3 = self.get_transport()
         self.check_transport_contents('bar', transport3, 'foo')
-        # its base should be usable. XXX: This is true only if we don't use
-        # auhentication, otherwise 'base' doesn't mention the password and we
-        # can't access it anymore since the password is lost (it *could* be
-        # mentioned in the url given by the test server) --vila 090226
-        transport4 = get_transport(transport.base)
-        self.check_transport_contents('bar', transport4, 'foo')
 
         # now opening at a relative url should give use a sane result:
         transport.mkdir('newdir')
-        transport5 = get_transport(transport.base + "newdir")
+        transport5 = self.get_transport('newdir')
         transport6 = transport5.clone('..')
         self.check_transport_contents('bar', transport6, 'foo')
 

=== modified file 'bzrlib/transport/__init__.py'
--- a/bzrlib/transport/__init__.py	2009-02-23 15:42:47 +0000
+++ b/bzrlib/transport/__init__.py	2009-03-01 10:02:00 +0000
@@ -1787,24 +1787,32 @@
 register_transport_proto('aftp://', help="Access using active FTP.")
 register_lazy_transport('aftp://', 'bzrlib.transport.ftp', 'FtpTransport')
 
-# Default to trying GSSAPI authentication (if the kerberos module is available)
-register_transport_proto('ftp+gssapi://', register_netloc=True)
-register_lazy_transport('ftp+gssapi://', 'bzrlib.transport.ftp._gssapi',
-                        'GSSAPIFtpTransport')
-register_transport_proto('aftp+gssapi://', register_netloc=True)
-register_lazy_transport('aftp+gssapi://', 'bzrlib.transport.ftp._gssapi',
-                        'GSSAPIFtpTransport')
-register_transport_proto('ftp+nogssapi://', register_netloc=True)
-register_transport_proto('aftp+nogssapi://', register_netloc=True)
-
-register_lazy_transport('ftp://', 'bzrlib.transport.ftp._gssapi',
-                        'GSSAPIFtpTransport')
-register_lazy_transport('aftp://', 'bzrlib.transport.ftp._gssapi',
-                        'GSSAPIFtpTransport')
-register_lazy_transport('ftp+nogssapi://', 'bzrlib.transport.ftp',
-                        'FtpTransport')
-register_lazy_transport('aftp+nogssapi://', 'bzrlib.transport.ftp',
-                        'FtpTransport')
+try:
+    import kerberos
+    kerberos_available = True
+except ImportError:
+    kerberos_available = False
+
+if kerberos_available:
+    # Default to trying GSSAPI authentication (if the kerberos module is
+    # available)
+    register_transport_proto('ftp+gssapi://', register_netloc=True)
+    register_lazy_transport('ftp+gssapi://', 'bzrlib.transport.ftp._gssapi',
+                            'GSSAPIFtpTransport')
+    register_transport_proto('aftp+gssapi://', register_netloc=True)
+    register_lazy_transport('aftp+gssapi://', 'bzrlib.transport.ftp._gssapi',
+                            'GSSAPIFtpTransport')
+    register_transport_proto('ftp+nogssapi://', register_netloc=True)
+    register_transport_proto('aftp+nogssapi://', register_netloc=True)
+
+    register_lazy_transport('ftp://', 'bzrlib.transport.ftp._gssapi',
+                            'GSSAPIFtpTransport')
+    register_lazy_transport('aftp://', 'bzrlib.transport.ftp._gssapi',
+                            'GSSAPIFtpTransport')
+    register_lazy_transport('ftp+nogssapi://', 'bzrlib.transport.ftp',
+                            'FtpTransport')
+    register_lazy_transport('aftp+nogssapi://', 'bzrlib.transport.ftp',
+                            'FtpTransport')
 
 register_transport_proto('memory://')
 register_lazy_transport('memory://', 'bzrlib.transport.memory',

=== modified file 'bzrlib/transport/ftp/__init__.py'
--- a/bzrlib/transport/ftp/__init__.py	2009-02-27 08:44:36 +0000
+++ b/bzrlib/transport/ftp/__init__.py	2009-03-19 14:28:27 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2005, 2006, 2007 Canonical Ltd
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Canonical Ltd
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -31,10 +31,10 @@
 import os
 import os.path
 import urlparse
+import random
 import socket
 import stat
 import time
-import random
 from warnings import warn
 
 from bzrlib import (
@@ -439,7 +439,7 @@
         if mode:
             try:
                 mutter("FTP site chmod: setting permissions to %s on %s",
-                    str(mode), self._remote_path(relpath))
+                       oct(mode), self._remote_path(relpath))
                 ftp = self._get_FTP()
                 cmd = "SITE CHMOD %s %s" % (oct(mode),
                                             self._remote_path(relpath))
@@ -447,7 +447,7 @@
             except ftplib.error_perm, e:
                 # Command probably not available on this server
                 warning("FTP Could not set permissions to %s on %s. %s",
-                        str(mode), self._remote_path(relpath), str(e))
+                        oct(mode), self._remote_path(relpath), str(e))
 
     # TODO: jam 20060516 I believe ftp allows you to tell an ftp server
     #       to copy something to another machine. And you may be able
@@ -597,27 +597,5 @@
 
 def get_test_permutations():
     """Return the permutations to be used in testing."""
-    from bzrlib import tests
-    if tests.FTPServerFeature.available():
-        from bzrlib.tests import ftp_server
-        return [(FtpTransport, ftp_server.FTPServer)]
-    else:
-        # Dummy server to have the test suite report the number of tests
-        # needing that feature. We raise UnavailableFeature from methods before
-        # the test server is being used. Doing so in the setUp method has bad
-        # side-effects (tearDown is never called).
-        class UnavailableFTPServer(object):
-
-            def setUp(self, vfs_server=None):
-                pass
-
-            def tearDown(self):
-                pass
-
-            def get_url(self):
-                raise tests.UnavailableFeature(tests.FTPServerFeature)
-
-            def get_bogus_url(self):
-                raise tests.UnavailableFeature(tests.FTPServerFeature)
-
-        return [(FtpTransport, UnavailableFTPServer)]
+    from bzrlib.tests import ftp_server
+    return [(FtpTransport, ftp_server.FTPTestServer)]

=== modified file 'bzrlib/transport/ftp/_gssapi.py'
--- a/bzrlib/transport/ftp/_gssapi.py	2009-01-17 01:30:58 +0000
+++ b/bzrlib/transport/ftp/_gssapi.py	2009-03-19 14:28:27 +0000
@@ -153,6 +153,6 @@
     from bzrlib import tests
     if tests.FTPServerFeature.available():
         from bzrlib.tests import ftp_server
-        return [(GSSAPIFtpTransport, ftp_server.FTPServer)]
+        return [(GSSAPIFtpTransport, ftp_server.FTPTestServer)]
     else:
         return []



More information about the bazaar-commits mailing list