Rev 3970: Add local & remote revision filtering to missing (Marius Kruger) in file:///home/pqm/archives/thelove/bzr/%2Btrunk/

Canonical.com Patch Queue Manager pqm at pqm.ubuntu.com
Thu Jan 29 06:04:47 GMT 2009


At file:///home/pqm/archives/thelove/bzr/%2Btrunk/

------------------------------------------------------------
revno: 3970
revision-id: pqm at pqm.ubuntu.com-20090129060443-6hvfgxb55cd6r527
parent: pqm at pqm.ubuntu.com-20090129050743-a1sxceuybyrjfv8k
parent: ian.clatworthy at canonical.com-20090129052136-1a0ue2k2rhxznu23
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Thu 2009-01-29 06:04:43 +0000
message:
  Add local & remote revision filtering to missing (Marius Kruger)
modified:
  NEWS                           NEWS-20050323055033-4e00b5db738777ff
  bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
  bzrlib/graph.py                graph_walker.py-20070525030359-y852guab65d4wtn0-1
  bzrlib/missing.py              missing.py-20050812153334-097f7097e2a8bcd1
  bzrlib/tests/blackbox/test_missing.py test_missing.py-20051211212735-a2cf4c1840bb84c4
  bzrlib/tests/test_graph.py     test_graph_walker.py-20070525030405-enq4r60hhi9xrujc-1
  bzrlib/tests/test_missing.py   test_missing.py-20051212000028-694fa4f658a81f48
    ------------------------------------------------------------
    revno: 3969.1.1
    revision-id: ian.clatworthy at canonical.com-20090129052136-1a0ue2k2rhxznu23
    parent: pqm at pqm.ubuntu.com-20090129050743-a1sxceuybyrjfv8k
    parent: amanic at gmail.com-20090125010347-qk0gt8kq6wtq6pt4
    committer: Ian Clatworthy <ian.clatworthy at canonical.com>
    branch nick: ianc-integration
    timestamp: Thu 2009-01-29 15:21:36 +1000
    message:
      Add local & remote revision filtering to missing (Marius Kruger)
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
      bzrlib/graph.py                graph_walker.py-20070525030359-y852guab65d4wtn0-1
      bzrlib/missing.py              missing.py-20050812153334-097f7097e2a8bcd1
      bzrlib/tests/blackbox/test_missing.py test_missing.py-20051211212735-a2cf4c1840bb84c4
      bzrlib/tests/test_graph.py     test_graph_walker.py-20070525030405-enq4r60hhi9xrujc-1
      bzrlib/tests/test_missing.py   test_missing.py-20051212000028-694fa4f658a81f48
    ------------------------------------------------------------
    revno: 3921.3.14
    revision-id: amanic at gmail.com-20090125010347-qk0gt8kq6wtq6pt4
    parent: amanic at gmail.com-20090125005526-800c7w470ggms63y
    committer: Marius Kruger <amanic at gmail.com>
    branch nick: bzr.missing_revision
    timestamp: Sun 2009-01-25 03:03:47 +0200
    message:
      put spaces after commas
    modified:
      bzrlib/tests/test_missing.py   test_missing.py-20051212000028-694fa4f658a81f48
    ------------------------------------------------------------
    revno: 3921.3.13
    revision-id: amanic at gmail.com-20090125005526-800c7w470ggms63y
    parent: amanic at gmail.com-20090125002626-y0r2jmu7o13bo3ou
    committer: Marius Kruger <amanic at gmail.com>
    branch nick: bzr.missing_revision
    timestamp: Sun 2009-01-25 02:55:26 +0200
    message:
      update missing documentation and blackbox test to better reflect `-r 3` behaviour.
    modified:
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
      bzrlib/tests/blackbox/test_missing.py test_missing.py-20051211212735-a2cf4c1840bb84c4
    ------------------------------------------------------------
    revno: 3921.3.12
    revision-id: amanic at gmail.com-20090125002626-y0r2jmu7o13bo3ou
    parent: amanic at gmail.com-20090124234908-xf4sh7ph1x0erax5
    committer: Marius Kruger <amanic at gmail.com>
    branch nick: bzr.missing_revision
    timestamp: Sun 2009-01-25 02:26:26 +0200
    message:
      add missing examples and NEWS
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
    ------------------------------------------------------------
    revno: 3921.3.11
    revision-id: amanic at gmail.com-20090124234908-xf4sh7ph1x0erax5
    parent: amanic at gmail.com-20090124225433-0hm7jvh9aui3iihd
    committer: Marius Kruger <amanic at gmail.com>
    branch nick: bzr.missing_revision
    timestamp: Sun 2009-01-25 01:49:08 +0200
    message:
      swap options as per review:
        --revision, -r for remote revision filtering
        --my-revision for this revision filtering.
      
      Also updated the blackbox tests accordingly
    modified:
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
      bzrlib/tests/blackbox/test_missing.py test_missing.py-20051211212735-a2cf4c1840bb84c4
    ------------------------------------------------------------
    revno: 3921.3.10
    revision-id: amanic at gmail.com-20090124225433-0hm7jvh9aui3iihd
    parent: amanic at gmail.com-20090102094753-8h0o3sxfvwz5wv9c
    parent: pqm at pqm.ubuntu.com-20090124185051-8oryvqq68n6repso
    committer: Marius Kruger <amanic at gmail.com>
    branch nick: bzr.missing_revision
    timestamp: Sun 2009-01-25 00:54:33 +0200
    message:
      merge with bzr.dev
    added:
      bzrlib/plugins/netrc_credential_store/ netrc_credential_sto-20081006090354-oaoid1olhgk8vevm-1
      bzrlib/plugins/netrc_credential_store/__init__.py __init__.py-20081006090402-hd75m8kcrrm0vlz1-1
      bzrlib/plugins/netrc_credential_store/tests/ tests-20081006090406-6mddz8j10pux993e-1
      bzrlib/plugins/netrc_credential_store/tests/__init__.py __init__.py-20081006090411-vytweyz6sun61d4q-1
      bzrlib/plugins/netrc_credential_store/tests/test_netrc.py test_netrc.py-20081006090414-vm3or4tz6c9wk2oi-1
      bzrlib/tests/blackbox/test_filesystem_cicp.py test_filesystem_cicp-20081028010456-vclkg401m81keaxc-1
      bzrlib/tests/branch_implementations/test_dotted_revno_to_revision_id.py test_dotted_revno_to-20090121014844-6x7d9jtri5sspg1o-1
      bzrlib/tests/branch_implementations/test_iter_merge_sorted_revisions.py test_merge_sorted_re-20090121004847-to3gvjwigstu93eh-1
      bzrlib/tests/branch_implementations/test_revision_id_to_dotted_revno.py test_revision_id_to_-20090122052032-g3czslif6sdqfkh3-1
      bzrlib/tests/https_server.py   https_server.py-20071121173708-aj8zczi0ziwbwz21-1
      bzrlib/tests/ssl_certs/        ssl_certs-20071124141654-dc9za9nho2gmzbri-1
      bzrlib/tests/ssl_certs/__init__.py __init__.py-20071124141703-j5hr254lm287lyut-8
      bzrlib/tests/ssl_certs/ca.crt  ca.crt-20071124141703-j5hr254lm287lyut-7
      bzrlib/tests/ssl_certs/ca.key  ca.key-20071124141703-j5hr254lm287lyut-6
      bzrlib/tests/ssl_certs/create_ssls.py create_ssls.py-20071124141703-j5hr254lm287lyut-5
      bzrlib/tests/ssl_certs/server.crt server.crt-20071124141703-j5hr254lm287lyut-4
      bzrlib/tests/ssl_certs/server.csr server.csr-20071124141703-j5hr254lm287lyut-3
      bzrlib/tests/ssl_certs/server_with_pass.key server_with_pass.key-20071124141703-j5hr254lm287lyut-2
      bzrlib/tests/ssl_certs/server_without_pass.key server_without_pass.-20071124141703-j5hr254lm287lyut-1
      doc/developers/case-insensitive-file-systems.txt caseinsensitivefiles-20081117224243-p84xpmqnsa1p8k91-1
      doc/news-template.txt          newstemplate.txt-20090113030949-kn6dn0xcj1rd6vmn-1
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzr                            bzr.py-20050313053754-5485f144c7006fa6
      bzrlib/__init__.py             __init__.py-20050309040759-33e65acf91bbcd5d
      bzrlib/branch.py               branch.py-20050309040759-e4baf4e0d046576e
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
      bzrlib/bzrdir.py               bzrdir.py-20060131065624-156dfea39c4387cb
      bzrlib/commands.py             bzr.py-20050309040720-d10f4714595cf8c3
      bzrlib/config.py               config.py-20051011043216-070c74f4e9e338e8
      bzrlib/delta.py                delta.py-20050729221636-54cf14ef94783d0a
      bzrlib/diff.py                 diff.py-20050309040759-26944fbbf2ebbf36
      bzrlib/dirstate.py             dirstate.py-20060728012006-d6mvoihjb3je9peu-1
      bzrlib/errors.py               errors.py-20050309040759-20512168c4e14fbd
      bzrlib/help_topics/__init__.py help_topics.py-20060920210027-rnim90q9e0bwxvy4-1
      bzrlib/help_topics/en/configuration.txt configuration.txt-20060314161707-868350809502af01
      bzrlib/help_topics/en/rules.txt rules.txt-20080516063844-ghr5l6pvvrhiycun-1
      bzrlib/knit.py                 knit.py-20051212171256-f056ac8f0fbe1bd9
      bzrlib/log.py                  log.py-20050505065812-c40ce11702fe5fb1
      bzrlib/mail_client.py          mail_client.py-20070809192806-vuxt3t19srtpjpdn-1
      bzrlib/merge.py                merge.py-20050513021216-953b65a438527106
      bzrlib/mutabletree.py          mutabletree.py-20060906023413-4wlkalbdpsxi2r4y-2
      bzrlib/osutils.py              osutils.py-20050309040759-eeaff12fbf77ac86
      bzrlib/patiencediff.py         patiencediff.py-20070721205536-jz8gaykeb7xtampk-1
      bzrlib/progress.py             progress.py-20050610070202-df9faaab791964c0
      bzrlib/push.py                 push.py-20080606021927-5fe39050e8xne9un-1
      bzrlib/remote.py               remote.py-20060720103555-yeeg2x51vn0rbtdp-1
      bzrlib/revisionspec.py         revisionspec.py-20050907152633-17567659fd5c0ddb
      bzrlib/rules.py                properties.py-20080506032617-9k06uqalkf09ck0z-1
      bzrlib/smart/medium.py         medium.py-20061103051856-rgu2huy59fkz902q-1
      bzrlib/status.py               status.py-20050505062338-431bfa63ec9b19e6
      bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
      bzrlib/tests/blackbox/__init__.py __init__.py-20051128053524-eba30d8255e08dc3
      bzrlib/tests/blackbox/test_init.py test_init.py-20060309032856-a292116204d86eb7
      bzrlib/tests/blackbox/test_log.py test_log.py-20060112090212-78f6ea560c868e24
      bzrlib/tests/blackbox/test_push.py test_push.py-20060329002750-929af230d5d22663
      bzrlib/tests/blackbox/test_status.py teststatus.py-20050712014354-508855eb9f29f7dc
      bzrlib/tests/blackbox/test_upgrade.py test_upgrade.py-20060120060132-b41e5ed2f886ad28
      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_stacking.py test_stacking.py-20080214020755-msjlkb7urobwly0f-1
      bzrlib/tests/bzrdir_implementations/test_bzrdir.py test_bzrdir.py-20060131065642-0ebeca5e30e30866
      bzrlib/tests/commands/test_push.py test_push.py-20070525122003-gc1ob0ea0nueoqgj-1
      bzrlib/tests/http_server.py    httpserver.py-20061012142527-m1yxdj1xazsf8d7s-1
      bzrlib/tests/test_bzrdir.py    test_bzrdir.py-20060131065654-deba40eef51cf220
      bzrlib/tests/test_config.py    testconfig.py-20051011041908-742d0c15d8d8c8eb
      bzrlib/tests/test_delta.py     test_delta.py-20070110134455-sqpd1y7mbjndelxf-1
      bzrlib/tests/test_diff.py      testdiff.py-20050727164403-d1a3496ebb12e339
      bzrlib/tests/test_errors.py    test_errors.py-20060210110251-41aba2deddf936a8
      bzrlib/tests/test_http.py      testhttp.py-20051018020158-b2eef6e867c514d9
      bzrlib/tests/test_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_osutils.py   test_osutils.py-20051201224856-e48ee24c12182989
      bzrlib/tests/test_plugins.py   plugins.py-20050622075746-32002b55e5e943e9
      bzrlib/tests/test_progress.py  test_progress.py-20060308160359-978c397bc79b7fda
      bzrlib/tests/test_rules.py     test_properties.py-20080506033501-3p9kmuob25dho8xl-1
      bzrlib/tests/test_sftp_transport.py testsftp.py-20051027032739-247570325fec7e7e
      bzrlib/tests/test_status.py    test_status.py-20060516190614-fbf6432e4a6e8aa5
      bzrlib/tests/test_transform.py test_transaction.py-20060105172520-b3ffb3946550e6c4
      bzrlib/tests/test_ui.py        test_ui.py-20051130162854-458e667a7414af09
      bzrlib/tests/tree_implementations/test_inv.py test_inv.py-20070312023226-0cdvk5uwhutis9vg-1
      bzrlib/tests/workingtree_implementations/test_move.py test_move.py-20070225171927-mohn2vqj5fx7edc6-1
      bzrlib/trace.py                trace.py-20050309040759-c8ed824bdcd4748a
      bzrlib/transport/__init__.py   transport.py-20050711165921-4978aa7ce1285ad5
      bzrlib/transport/ftp/__init__.py ftp.py-20051116161804-58dc9506548c2a53
      bzrlib/transport/http/__init__.py http_transport.py-20050711212304-506c5fd1059ace96
      bzrlib/transport/http/_pycurl.py pycurlhttp.py-20060110060940-4e2a705911af77a6
      bzrlib/transport/http/_urllib.py _urlgrabber.py-20060113083826-0bbf7d992fbf090c
      bzrlib/transport/http/ca_bundle.py ca_bundle.py-20070226091335-84kb1xg1r2jjf858-1
      bzrlib/transport/http/response.py _response.py-20060613154423-a2ci7hd4iw5c7fnt-1
      bzrlib/transport/sftp.py       sftp.py-20051019050329-ab48ce71b7e32dfe
      bzrlib/tree.py                 tree.py-20050309040759-9d5f2496be663e77
      bzrlib/ui/__init__.py          ui.py-20050824083933-8cf663c763ba53a9
      bzrlib/ui/text.py              text.py-20051130153916-2e438cffc8afc478
      bzrlib/upgrade.py              history2weaves.py-20050818063535-e7d319791c19a8b2
      doc/developers/authentication-ring.txt authring.txt-20070718200437-q5tdik0ne6lor86d-1
      doc/developers/index.txt       index.txt-20070508041241-qznziunkg0nffhiw-1
      setup.py                       setup.py-20050314065409-02f8a0a6e3f9bc70
      tools/win32/build_release.py   build_release.py-20081105204355-2ghh5cv01v1x4rzz-1
      tools/win32/bzr.iss.cog        bzr.iss.cog-20060622100836-b3yup582rt3y0nvm-5
    ------------------------------------------------------------
    revno: 3921.3.9
    revision-id: amanic at gmail.com-20090102094753-8h0o3sxfvwz5wv9c
    parent: amanic at gmail.com-20090101232107-poye5hxejqgqq0sg
    committer: Marius Kruger <amanic at gmail.com>
    branch nick: bzr.missing_revision
    timestamp: Fri 2009-01-02 11:47:53 +0200
    message:
      * add some blackbox tests and another whitebox test
      * don't import _parse_revision_str lazily
      * remove some unneeded todos I added
    modified:
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
      bzrlib/tests/blackbox/test_missing.py test_missing.py-20051211212735-a2cf4c1840bb84c4
      bzrlib/tests/test_missing.py   test_missing.py-20051212000028-694fa4f658a81f48
    ------------------------------------------------------------
    revno: 3921.3.8
    revision-id: amanic at gmail.com-20090101232107-poye5hxejqgqq0sg
    parent: amanic at gmail.com-20090101225617-2ztzo62eb2o02ym8
    committer: Marius Kruger <amanic at gmail.com>
    branch nick: bzr.missing_revision
    timestamp: Fri 2009-01-02 01:21:07 +0200
    message:
      * _filter_revs can now handle None and len=3 revs
      * fix up the rest of the white box tests
    modified:
      bzrlib/missing.py              missing.py-20050812153334-097f7097e2a8bcd1
      bzrlib/tests/test_missing.py   test_missing.py-20051212000028-694fa4f658a81f48
    ------------------------------------------------------------
    revno: 3921.3.7
    revision-id: amanic at gmail.com-20090101225617-2ztzo62eb2o02ym8
    parent: amanic at gmail.com-20090101220822-iopb8ag69ie4auno
    committer: Marius Kruger <amanic at gmail.com>
    branch nick: bzr.missing_revision
    timestamp: Fri 2009-01-02 00:56:17 +0200
    message:
      just filter the missing revisions once all have been calculated.
      (in stead of trying to be clever and adjust the tip and chaging the
      way the enumeration is done, which might even be slower)
    modified:
      bzrlib/missing.py              missing.py-20050812153334-097f7097e2a8bcd1
      bzrlib/tests/test_missing.py   test_missing.py-20051212000028-694fa4f658a81f48
    ------------------------------------------------------------
    revno: 3921.3.6
    revision-id: amanic at gmail.com-20090101220822-iopb8ag69ie4auno
    parent: amanic at gmail.com-20090101214606-lak9wejufcjehpm6
    committer: Marius Kruger <amanic at gmail.com>
    branch nick: bzr.missing_revision
    timestamp: Fri 2009-01-02 00:08:22 +0200
    message:
      * fix some indentation anomalies in cmd_missing
      * note that the `missing` revision filters are inclusive
      * some minor white space cleanups
      * add some param docstrings for missing.find_unmerged
    modified:
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
      bzrlib/missing.py              missing.py-20050812153334-097f7097e2a8bcd1
    ------------------------------------------------------------
    revno: 3921.3.5
    revision-id: amanic at gmail.com-20090101214606-lak9wejufcjehpm6
    parent: amanic at gmail.com-20090101110637-t6d0xytq2gyiquji
    committer: Marius Kruger <amanic at gmail.com>
    branch nick: bzr.missing_revision
    timestamp: Thu 2009-01-01 23:46:06 +0200
    message:
      extract graph.is_between from builtins.cmd_tags.run, and test it
    modified:
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
      bzrlib/graph.py                graph_walker.py-20070525030359-y852guab65d4wtn0-1
      bzrlib/tests/test_graph.py     test_graph_walker.py-20070525030405-enq4r60hhi9xrujc-1
    ------------------------------------------------------------
    revno: 3921.3.4
    revision-id: amanic at gmail.com-20090101110637-t6d0xytq2gyiquji
    parent: amanic at gmail.com-20081231223701-u0u20omx4igpnqxd
    committer: Marius Kruger <amanic at gmail.com>
    branch nick: bzr.missing_revision
    timestamp: Thu 2009-01-01 13:06:37 +0200
    message:
      add support to filter on local and remote revisions
    modified:
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
      bzrlib/missing.py              missing.py-20050812153334-097f7097e2a8bcd1
    ------------------------------------------------------------
    revno: 3921.3.3
    revision-id: amanic at gmail.com-20081231223701-u0u20omx4igpnqxd
    parent: amanic at gmail.com-20081231205214-2uaelv7n6s62wibs
    committer: Marius Kruger <amanic at gmail.com>
    branch nick: bzr.missing_revision
    timestamp: Thu 2009-01-01 00:37:01 +0200
    message:
      tried to add `bzr missing -r1..-1` but failed :(
    modified:
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
    ------------------------------------------------------------
    revno: 3921.3.2
    revision-id: amanic at gmail.com-20081231205214-2uaelv7n6s62wibs
    parent: amanic at gmail.com-20081231142930-4i3efine315vu0vc
    committer: Marius Kruger <amanic at gmail.com>
    branch nick: bzr.missing_revision
    timestamp: Wed 2008-12-31 22:52:14 +0200
    message:
      * rename _get_revid_in_bounds() -> _get_revid_in_range()
      * check if the new revid is actually in the branch before using it
      * add some more tests for find_unmerged in a range
    modified:
      bzrlib/missing.py              missing.py-20050812153334-097f7097e2a8bcd1
      bzrlib/tests/test_missing.py   test_missing.py-20051212000028-694fa4f658a81f48
    ------------------------------------------------------------
    revno: 3921.3.1
    revision-id: amanic at gmail.com-20081231142930-4i3efine315vu0vc
    parent: pqm at pqm.ubuntu.com-20081229142916-z08eu2alga2acrh6
    committer: Marius Kruger <amanic at gmail.com>
    branch nick: bzr.missing_revision
    timestamp: Wed 2008-12-31 16:29:30 +0200
    message:
      * add support for specifying a revision range to missing.find_unmerged
      * test it
      * let `restrict` parameter of TestFindUnmerged.assertUnmerged() default to 'all'
    modified:
      bzrlib/missing.py              missing.py-20050812153334-097f7097e2a8bcd1
      bzrlib/tests/test_missing.py   test_missing.py-20051212000028-694fa4f658a81f48
=== modified file 'NEWS'
--- a/NEWS	2009-01-28 21:57:12 +0000
+++ b/NEWS	2009-01-29 05:21:36 +0000
@@ -7,27 +7,6 @@
 IN DEVELOPMENT
 --------------
 
-  IMPROVEMENTS:
-
-    * Progress bars now show the rate of activity for some sftp 
-      operations, and they are drawn different.  (Martin Pool, #172741)
-
-  BUG FIXES:
-
-    * ``bzr annotate --show-ids`` doesn't give a backtrace on empty files
-      anymore.
-      (Anne Mohsen, Vincent Ladeuil, #314525)
-
-    * There was a bug in how we handled resolving when a file is deleted
-      in one branch, and modified in the other. If there was a criss-cross
-      merge, we would cause the deletion to conflict a second time.
-      (Vincent Ladeuil, John Arbash Meinel)
-
-    * There was another bug in how we chose the correct intermediate LCA in
-      criss-cross merges leading to several kind of changes be incorrectly
-      handled.
-      (John Arbash Meinel, Vincent Ladeuil)
-
   COMPATIBILITY BREAKS:
 
     * By default, ``bzr status`` after a merge now shows just the pending
@@ -42,6 +21,11 @@
 
   NEW FEATURES:
 
+    * Add support for filtering `bzr missing` on revisions.  Remote revisions
+      can be filtered using `bzr missing -r -20..-10` and local revisions can
+      be filtered using `bzr missing --my-revision -20..-10`.
+      (Marius Kruger)
+
     * ``bzr log -p`` displays the patch diff for each revision.
       When logging a file, the diff only includes changes to that file.
       (Ian Clatworthy, #202331, #227335)
@@ -57,6 +41,9 @@
       before the optional ``[merge]`` indicator. For line format,
       the tags appear after the date. (Ian Clatworthy)
 
+    * Progress bars now show the rate of activity for some sftp 
+      operations, and they are drawn different.  (Martin Pool, #172741)
+
     * Rule-based preferences can now accept multiple patterns for a set of
       rules.  (Marius Kruger)
 
@@ -66,6 +53,10 @@
 
   BUG FIXES:
 
+    * ``bzr annotate --show-ids`` doesn't give a backtrace on empty files
+      anymore.
+      (Anne Mohsen, Vincent Ladeuil, #314525)
+
     * ``bzr log FILE`` now correctly shows mainline revisions merging
       a change to FILE when the ``--short`` and ``--line`` log formats
       are used. (Ian Clatworthy, #317417)
@@ -82,6 +73,16 @@
       a new ``until_no_eintr`` helper function in ``bzrlib.osutils``.
       (Andrew Bennetts)
 
+    * There was a bug in how we handled resolving when a file is deleted
+      in one branch, and modified in the other. If there was a criss-cross
+      merge, we would cause the deletion to conflict a second time.
+      (Vincent Ladeuil, John Arbash Meinel)
+
+    * There was another bug in how we chose the correct intermediate LCA in
+      criss-cross merges leading to several kind of changes be incorrectly
+      handled.
+      (John Arbash Meinel, Vincent Ladeuil)
+
   DOCUMENTATION:
 
     * Improved plugin developer documentation.  (Martin Pool)

=== modified file 'bzrlib/builtins.py'
--- a/bzrlib/builtins.py	2009-01-27 23:06:35 +0000
+++ b/bzrlib/builtins.py	2009-01-29 05:21:36 +0000
@@ -55,7 +55,13 @@
 """)
 
 from bzrlib.commands import Command, display_command
-from bzrlib.option import ListOption, Option, RegistryOption, custom_help
+from bzrlib.option import (
+    ListOption,
+    Option,
+    RegistryOption,
+    custom_help,
+    _parse_revision_str,
+    )
 from bzrlib.trace import mutter, note, warning, is_quiet, get_verbosity_level
 
 
@@ -1967,6 +1973,16 @@
             'bzr %s --revision takes one or two values.' % command_name)
     return rev1, rev2
 
+
+def _revision_range_to_revid_range(revision_range):
+    rev_id1 = None
+    rev_id2 = None
+    if revision_range[0] is not None:
+        rev_id1 = revision_range[0].rev_id
+    if revision_range[1] is not None:
+        rev_id2 = revision_range[1].rev_id
+    return rev_id1, rev_id2
+
 def get_log_format(long=False, short=False, line=False, default='long'):
     log_format = default
     if long:
@@ -3512,25 +3528,57 @@
 
 class cmd_missing(Command):
     """Show unmerged/unpulled revisions between two branches.
-    
+
     OTHER_BRANCH may be local or remote.
+
+    To filter on a range of revirions, you can use the command -r begin..end
+    -r revision requests a specific revision, -r ..end or -r begin.. are
+    also valid.
+
+    :Examples:
+
+        Determine the missing revisions between this and the branch at the
+        remembered pull location::
+
+            bzr missing
+
+        Determine the missing revisions between this and another branch::
+
+            bzr missing http://server/branch
+
+        Determine the missing revisions up to a specific revision on the other
+        branch::
+
+            bzr missing -r ..-10
+
+        Determine the missing revisions up to a specific revision on this
+        branch::
+
+            bzr missing --my-revision ..-10
     """
 
     _see_also = ['merge', 'pull']
     takes_args = ['other_branch?']
     takes_options = [
-            Option('reverse', 'Reverse the order of revisions.'),
-            Option('mine-only',
-                   'Display changes in the local branch only.'),
-            Option('this' , 'Same as --mine-only.'),
-            Option('theirs-only',
-                   'Display changes in the remote branch only.'),
-            Option('other', 'Same as --theirs-only.'),
-            'log-format',
-            'show-ids',
-            'verbose',
-            Option('include-merges', 'Show merged revisions.'),
-            ]
+        Option('reverse', 'Reverse the order of revisions.'),
+        Option('mine-only',
+               'Display changes in the local branch only.'),
+        Option('this' , 'Same as --mine-only.'),
+        Option('theirs-only',
+               'Display changes in the remote branch only.'),
+        Option('other', 'Same as --theirs-only.'),
+        'log-format',
+        'show-ids',
+        'verbose',
+        custom_help('revision',
+             help='Filter on other branch revisions (inclusive). '
+                'See "help revisionspec" for details.'),
+        Option('my-revision',
+            type=_parse_revision_str,
+            help='Filter on local branch revisions (inclusive). '
+                'See "help revisionspec" for details.'),
+        Option('include-merges', 'Show merged revisions.'),
+        ]
     encoding_type = 'replace'
 
     @display_command
@@ -3538,7 +3586,7 @@
             theirs_only=False,
             log_format=None, long=False, short=False, line=False,
             show_ids=False, verbose=False, this=False, other=False,
-            include_merges=False):
+            include_merges=False, revision=None, my_revision=None):
         from bzrlib.missing import find_unmerged, iter_log_revisions
         def message(s):
             if not is_quiet():
@@ -3572,6 +3620,15 @@
         remote_branch = Branch.open(other_branch)
         if remote_branch.base == local_branch.base:
             remote_branch = local_branch
+
+        local_revid_range = _revision_range_to_revid_range(
+            _get_revision_range(my_revision, local_branch,
+                self.name()))
+
+        remote_revid_range = _revision_range_to_revid_range(
+            _get_revision_range(revision,
+                remote_branch, self.name()))
+
         local_branch.lock_read()
         try:
             remote_branch.lock_read()
@@ -3579,7 +3636,9 @@
                 local_extra, remote_extra = find_unmerged(
                     local_branch, remote_branch, restrict,
                     backward=not reverse,
-                    include_merges=include_merges)
+                    include_merges=include_merges,
+                    local_revid_range=local_revid_range,
+                    remote_revid_range=remote_revid_range)
 
                 if log_format is None:
                     registry = log.log_formatter_registry
@@ -4716,10 +4775,7 @@
                 revid1, revid2 = rev1.rev_id, rev2.rev_id
                 # only show revisions between revid1 and revid2 (inclusive)
                 tags = [(tag, revid) for tag, revid in tags if
-                     (revid2 is None or
-                         graph.is_ancestor(revid, revid2)) and
-                     (revid1 is None or
-                         graph.is_ancestor(revid1, revid))]
+                    graph.is_between(revid, revid1, revid2)]
             finally:
                 branch.unlock()
         if sort == 'alpha':

=== modified file 'bzrlib/graph.py'
--- a/bzrlib/graph.py	2008-12-12 01:17:04 +0000
+++ b/bzrlib/graph.py	2009-01-01 21:46:06 +0000
@@ -920,6 +920,17 @@
         return set([candidate_descendant]) == self.heads(
             [candidate_ancestor, candidate_descendant])
 
+    def is_between(self, revid, lower_bound_revid, upper_bound_revid):
+        """Determine whether a revision is between two others.
+
+        returns true if and only if:
+        lower_bound_revid <= revid <= upper_bound_revid
+        """
+        return ((upper_bound_revid is None or
+                    self.is_ancestor(revid, upper_bound_revid)) and
+               (lower_bound_revid is None or
+                    self.is_ancestor(lower_bound_revid, revid)))
+
     def _search_for_extra_common(self, common, searchers):
         """Make sure that unique nodes are genuinely unique.
 

=== modified file 'bzrlib/missing.py'
--- a/bzrlib/missing.py	2008-09-11 19:36:38 +0000
+++ b/bzrlib/missing.py	2009-01-01 23:21:07 +0000
@@ -53,7 +53,8 @@
 
 
 def find_unmerged(local_branch, remote_branch, restrict='all',
-                  include_merges=False, backward=False):
+                  include_merges=False, backward=False,
+                  local_revid_range=None, remote_revid_range=None):
     """Find revisions from each side that have not been merged.
 
     :param local_branch: Compare the history of local_branch
@@ -66,7 +67,11 @@
     :param include_merges: Show mainline revisions only if False,
         all revisions otherwise.
     :param backward: Show oldest versions first when True, newest versions
-        first when False. 
+        first when False.
+    :param local_revid_range: Revision-id range for filtering local_branch
+        revisions (lower bound, upper bound)
+    :param remote_revid_range: Revision-id range for filtering remote_branch
+        revisions (lower bound, upper bound)
 
     :return: A list of [(revno, revision_id)] for the mainline revisions on
         each side.
@@ -77,7 +82,9 @@
         try:
             return _find_unmerged(
                 local_branch, remote_branch, restrict=restrict,
-                include_merges=include_merges, backward=backward)
+                include_merges=include_merges, backward=backward,
+                local_revid_range=local_revid_range,
+                remote_revid_range=remote_revid_range)
         finally:
             remote_branch.unlock()
     finally:
@@ -174,8 +181,16 @@
     return revline
 
 
+def _filter_revs(graph, revs, revid_range):
+    if revid_range is None or revs is None:
+        return revs
+    return [rev for rev in revs
+        if graph.is_between(rev[1], revid_range[0], revid_range[1])]
+
+
 def _find_unmerged(local_branch, remote_branch, restrict,
-                   include_merges, backward):
+                   include_merges, backward,
+                   local_revid_range=None, remote_revid_range=None):
     """See find_unmerged.
 
     The branches should already be locked before entering.
@@ -214,7 +229,8 @@
                                      local_revision_id, backward)
         remotes = _enumerate_mainline(remote_extra, graph, remote_revno,
                                       remote_revision_id, backward)
-    return locals, remotes
+    return _filter_revs(graph, locals, local_revid_range), _filter_revs(graph,
+        remotes, remote_revid_range)
 
 
 def sorted_revisions(revisions, history_map):

=== modified file 'bzrlib/tests/blackbox/test_missing.py'
--- a/bzrlib/tests/blackbox/test_missing.py	2008-10-17 08:32:52 +0000
+++ b/bzrlib/tests/blackbox/test_missing.py	2009-01-25 00:55:26 +0000
@@ -26,6 +26,13 @@
 
 class TestMissing(TestCaseWithTransport):
 
+    def assertMessages(self, out, must_have=(), must_not_have=()):
+        """Check if commit messages are in or not in the output"""
+        for m in must_have:
+            self.assertContainsRe(out, r'\nmessage:\n  %s\n' % m)
+        for m in must_not_have:
+            self.assertNotContainsRe(out, r'\nmessage:\n  %s\n' % m)
+
     def test_missing_quiet(self):
         # <https://bugs.launchpad.net/bzr/+bug/284748>
         # create a source branch
@@ -137,6 +144,40 @@
         self.assertEqualDiff('Other branch is up to date.\n',
                              self.run_bzr('missing ../a --theirs-only')[0])
 
+    def test_missing_filtered(self):
+        # create a source branch
+        a_tree = self.make_branch_and_tree('a')
+        self.build_tree_contents([('a/a', 'initial\n')])
+        a_tree.add('a')
+        a_tree.commit(message='r1')
+        # clone and add differing revisions
+        b_tree = a_tree.bzrdir.sprout('b').open_workingtree()
+
+        for i in range(2, 6):
+            a_tree.commit(message='a%d' % i)
+            b_tree.commit(message='b%d' % i)
+
+        os.chdir('a')
+        # local
+        out,err = self.run_bzr('missing ../b --my-revision 3', retcode=1)
+        self.assertMessages(out, ('a3', 'b2', 'b3', 'b4', 'b5'), ('a2', 'a4'))
+
+        out,err = self.run_bzr('missing ../b --my-revision 3..4', retcode=1)
+        self.assertMessages(out, ('a3', 'a4'), ('a2', 'a5'))
+
+        #remote
+        out,err = self.run_bzr('missing ../b -r 3', retcode=1)
+        self.assertMessages(out, ('a2', 'a3', 'a4', 'a5', 'b3'), ('b2', 'b4'))
+
+        out,err = self.run_bzr('missing ../b -r 3..4', retcode=1)
+        self.assertMessages(out, ('b3', 'b4'), ('b2', 'b5'))
+
+        #both
+        out,err = self.run_bzr('missing ../b --my-revision 3..4 -r 3..4',
+            retcode=1)
+        self.assertMessages(out, ('a3', 'a4', 'b3', 'b4'),
+            ('a2', 'a5', 'b2', 'b5'))
+
     def test_missing_check_last_location(self):
         # check that last location shown as filepath not file URL
 

=== modified file 'bzrlib/tests/test_graph.py'
--- a/bzrlib/tests/test_graph.py	2008-12-11 16:25:46 +0000
+++ b/bzrlib/tests/test_graph.py	2009-01-01 21:46:06 +0000
@@ -698,6 +698,17 @@
         instrumented_graph.is_ancestor('rev2a', 'rev2b')
         self.assertTrue('null:' not in instrumented_provider.calls)
 
+    def test_is_between(self):
+        graph = self.make_graph(ancestry_1)
+        self.assertEqual(True, graph.is_between('null:', 'null:', 'null:'))
+        self.assertEqual(True, graph.is_between('rev1', 'null:', 'rev1'))
+        self.assertEqual(True, graph.is_between('rev1', 'rev1', 'rev4'))
+        self.assertEqual(True, graph.is_between('rev4', 'rev1', 'rev4'))
+        self.assertEqual(True, graph.is_between('rev3', 'rev1', 'rev4'))
+        self.assertEqual(False, graph.is_between('rev4', 'rev1', 'rev3'))
+        self.assertEqual(False, graph.is_between('rev1', 'rev2a', 'rev4'))
+        self.assertEqual(False, graph.is_between('null:', 'rev1', 'rev4'))
+
     def test_is_ancestor_boundary(self):
         """Ensure that we avoid searching the whole graph.
         

=== modified file 'bzrlib/tests/test_missing.py'
--- a/bzrlib/tests/test_missing.py	2008-09-12 08:44:07 +0000
+++ b/bzrlib/tests/test_missing.py	2009-01-25 01:03:47 +0000
@@ -138,13 +138,14 @@
 class TestFindUnmerged(tests.TestCaseWithTransport):
 
     def assertUnmerged(self, local, remote, local_branch, remote_branch,
-                       restrict, include_merges=False,
-                       backward=False):
+            restrict='all', include_merges=False, backward=False,
+            local_revid_range=None, remote_revid_range=None):
         """Check the output of find_unmerged_mainline_revisions"""
         local_extra, remote_extra = missing.find_unmerged(
-                                        local_branch, remote_branch, restrict,
-                                        include_merges=include_merges,
-                                        backward=backward)
+            local_branch, remote_branch, restrict,
+            include_merges=include_merges, backward=backward,
+            local_revid_range=local_revid_range,
+            remote_revid_range=remote_revid_range)
         self.assertEqual(local, local_extra)
         self.assertEqual(remote, remote_extra)
 
@@ -153,22 +154,24 @@
         rev1 = tree.commit('one')
         tree.lock_read()
         self.addCleanup(tree.unlock)
-        self.assertUnmerged([], [], tree.branch, tree.branch, 'all')
+        self.assertUnmerged([], [], tree.branch, tree.branch)
+        self.assertUnmerged([], [], tree.branch, tree.branch,
+            local_revid_range=(rev1, rev1))
 
     def test_one_ahead(self):
         tree = self.make_branch_and_tree('tree')
         rev1 = tree.commit('one')
         tree2 = tree.bzrdir.sprout('tree2').open_workingtree()
         rev2 = tree2.commit('two')
-        self.assertUnmerged([], [('2', rev2)], tree.branch, tree2.branch, 'all')
-        self.assertUnmerged([('2', rev2)], [], tree2.branch, tree.branch, 'all')
+        self.assertUnmerged([], [('2', rev2)], tree.branch, tree2.branch)
+        self.assertUnmerged([('2', rev2)], [], tree2.branch, tree.branch)
 
     def test_restrict(self):
         tree = self.make_branch_and_tree('tree')
         rev1 = tree.commit('one')
         tree2 = tree.bzrdir.sprout('tree2').open_workingtree()
         rev2 = tree2.commit('two')
-        self.assertUnmerged([], [('2', rev2)], tree.branch, tree2.branch, 'all')
+        self.assertUnmerged([], [('2', rev2)], tree.branch, tree2.branch)
         self.assertUnmerged([], None, tree.branch, tree2.branch, 'local')
         self.assertUnmerged(None, [('2', rev2)], tree.branch, tree2.branch,
                                                'remote')
@@ -182,7 +185,11 @@
         tree.merge_from_branch(tree2.branch)
         rev4 = tree.commit('four')
 
-        self.assertUnmerged([('2', rev4)], [], tree.branch, tree2.branch, 'all')
+        self.assertUnmerged([('2', rev4)], [], tree.branch, tree2.branch)
+        self.assertUnmerged([('2', rev4)], [], tree.branch, tree2.branch,
+            local_revid_range=(rev4, rev4))
+        self.assertUnmerged([], [], tree.branch, tree2.branch,
+            local_revid_range=(rev1, rev1))
 
     def test_include_merges(self):
         tree = self.make_branch_and_tree('tree')
@@ -199,17 +206,80 @@
         tree2.merge_from_branch(tree3.branch)
         rev6 = tree2.commit('six', rev_id='rev6')
 
-        self.assertUnmerged([], [('2', 'rev2', 0), ('3', 'rev3',0 ),
+        self.assertUnmerged([], [('2', 'rev2', 0), ('3', 'rev3', 0),
                                  ('4', 'rev6', 0),
                                  ('3.1.1', 'rev4', 1), ('3.1.2', 'rev5', 1),
                                  ],
-                            tree.branch, tree2.branch, 'all',
+                            tree.branch, tree2.branch,
                             include_merges=True)
 
         self.assertUnmerged([], [('4', 'rev6', 0),
                                  ('3.1.2', 'rev5', 1), ('3.1.1', 'rev4', 1),
-                                 ('3', 'rev3',0 ), ('2', 'rev2', 0),
+                                 ('3', 'rev3', 0), ('2', 'rev2', 0),
                                  ],
-                            tree.branch, tree2.branch, 'all',
+                            tree.branch, tree2.branch,
                             include_merges=True,
                             backward=True)
+
+        self.assertUnmerged([], [('4', 'rev6', 0)],
+            tree.branch, tree2.branch,
+            include_merges=True, remote_revid_range=(rev6, rev6))
+
+        self.assertUnmerged([], [('3', 'rev3', 0), ('3.1.1', 'rev4', 1)],
+                    tree.branch, tree2.branch,
+                    include_merges=True, remote_revid_range=(rev3, rev4))
+
+        self.assertUnmerged([], [('4', 'rev6', 0), ('3.1.2', 'rev5', 1)],
+                    tree.branch, tree2.branch,
+                    include_merges=True, remote_revid_range=(rev5, rev6))
+
+    def test_revision_range(self):
+        local = self.make_branch_and_tree('local')
+        lrevid1 = local.commit('one')
+        remote = local.bzrdir.sprout('remote').open_workingtree()
+        rrevid2 = remote.commit('two')
+        rrevid3 = remote.commit('three')
+        rrevid4 = remote.commit('four')
+        lrevid2 = local.commit('two')
+        lrevid3 = local.commit('three')
+        lrevid4 = local.commit('four')
+        local_extra = [('2', lrevid2), ('3', lrevid3), ('4', lrevid4)]
+        remote_extra = [('2', rrevid2), ('3', rrevid3), ('4', rrevid4)]
+
+        # control
+        self.assertUnmerged(local_extra, remote_extra,
+            local.branch, remote.branch)
+        self.assertUnmerged(local_extra, remote_extra,
+            local.branch, remote.branch, local_revid_range=(None, None),
+            remote_revid_range=(None, None))
+
+        # exclude local revisions
+        self.assertUnmerged([('2', lrevid2)], remote_extra,
+            local.branch, remote.branch, local_revid_range=(lrevid2, lrevid2))
+        self.assertUnmerged([('2', lrevid2), ('3', lrevid3)], remote_extra,
+            local.branch, remote.branch, local_revid_range=(lrevid2, lrevid3))
+        self.assertUnmerged([('2', lrevid2), ('3', lrevid3)], None,
+            local.branch, remote.branch, 'local',
+            local_revid_range=(lrevid2, lrevid3))
+
+        # exclude remote revisions
+        self.assertUnmerged(local_extra, [('2', rrevid2)],
+            local.branch, remote.branch, remote_revid_range=(None, rrevid2))
+        self.assertUnmerged(local_extra, [('2', rrevid2)],
+            local.branch, remote.branch, remote_revid_range=(lrevid1, rrevid2))
+        self.assertUnmerged(local_extra, [('2', rrevid2)],
+            local.branch, remote.branch, remote_revid_range=(rrevid2, rrevid2))
+        self.assertUnmerged(local_extra, [('2', rrevid2), ('3', rrevid3)],
+            local.branch, remote.branch, remote_revid_range=(None, rrevid3))
+        self.assertUnmerged(local_extra, [('2', rrevid2), ('3', rrevid3)],
+            local.branch, remote.branch, remote_revid_range=(rrevid2, rrevid3))
+        self.assertUnmerged(local_extra, [('3', rrevid3)],
+            local.branch, remote.branch, remote_revid_range=(rrevid3, rrevid3))
+        self.assertUnmerged(None, [('2', rrevid2), ('3', rrevid3)],
+            local.branch, remote.branch, 'remote',
+            remote_revid_range=(rrevid2, rrevid3))
+
+        # exclude local and remote revisions
+        self.assertUnmerged([('3', lrevid3)], [('3', rrevid3)],
+            local.branch, remote.branch, local_revid_range=(lrevid3, lrevid3),
+            remote_revid_range=(rrevid3, rrevid3))




More information about the bazaar-commits mailing list