diff -x .bzr -x '*~' -x bzr.1 -ruN bzr.dev/bzrlib/builtins.py bzr.robey/bzrlib/builtins.py --- bzr.dev/bzrlib/builtins.py 2006-02-01 17:01:57.000000000 -0800 +++ bzr.robey/bzrlib/builtins.py 2006-02-01 17:45:07.000000000 -0800 @@ -942,7 +942,11 @@ rev1 = rev2 = revision[0].in_history(b).revno elif len(revision) == 2: rev1 = revision[0].in_history(b).revno - rev2 = revision[1].in_history(b).revno + if revision[1].spec is None: + # missing end-range means last known revision + rev2 = b.revno() + else: + rev2 = revision[1].in_history(b).revno else: raise BzrCommandError('bzr log --revision takes one or two values.') diff -x .bzr -x '*~' -x bzr.1 -ruN bzr.dev/bzrlib/status.py bzr.robey/bzrlib/status.py --- bzr.dev/bzrlib/status.py 2006-01-31 12:06:42.000000000 -0800 +++ bzr.robey/bzrlib/status.py 2006-02-01 17:45:21.000000000 -0800 @@ -74,7 +74,7 @@ old = branch.repository.revision_tree(rev_id) except NoSuchRevision, e: raise BzrCommandError(str(e)) - if len(revision) > 1: + if (len(revision) > 1) and (revision[1].spec is not None): try: rev_id = revision[1].in_history(branch).rev_id new = branch.repository.revision_tree(rev_id) diff -x .bzr -x '*~' -x bzr.1 -ruN bzr.dev/bzrlib/tests/blackbox/__init__.py bzr.robey/bzrlib/tests/blackbox/__init__.py --- bzr.dev/bzrlib/tests/blackbox/__init__.py 2006-02-01 17:01:58.000000000 -0800 +++ bzr.robey/bzrlib/tests/blackbox/__init__.py 2006-02-01 17:45:53.000000000 -0800 @@ -32,6 +32,7 @@ 'bzrlib.tests.blackbox.test_cat', 'bzrlib.tests.blackbox.test_diff', 'bzrlib.tests.blackbox.test_export', + 'bzrlib.tests.blackbox.test_log', 'bzrlib.tests.blackbox.test_missing', 'bzrlib.tests.blackbox.test_outside_wt', 'bzrlib.tests.blackbox.test_pull', diff -x .bzr -x '*~' -x bzr.1 -ruN bzr.dev/bzrlib/tests/blackbox/test_log.py bzr.robey/bzrlib/tests/blackbox/test_log.py --- bzr.dev/bzrlib/tests/blackbox/test_log.py 1969-12-31 16:00:00.000000000 -0800 +++ bzr.robey/bzrlib/tests/blackbox/test_log.py 2006-01-12 01:01:39.000000000 -0800 @@ -0,0 +1,40 @@ +# Copyright (C) 2005 by Canonical Ltd +# -*- coding: utf-8 -*- + +# 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 + + +"""Black-box tests for bzr log. +""" + +import os + +import bzrlib +from bzrlib.tests.blackbox import ExternalBase + + +class TestLog(ExternalBase): + + def test_log(self): + self.runbzr("init") + self.build_tree(['hello.txt']) + self.runbzr("add hello.txt") + self.runbzr("commit -m message hello.txt") + result = self.runbzr("log")[0] + self.assertTrue('revno: 1\n' in result) + self.assertTrue('message:\n message\n' in result) + + result2 = self.runbzr("log -r 1..")[0] + self.assertEquals(result2, result) diff -x .bzr -x '*~' -x bzr.1 -ruN bzr.dev/bzrlib/tests/blackbox/test_status.py bzr.robey/bzrlib/tests/blackbox/test_status.py --- bzr.dev/bzrlib/tests/blackbox/test_status.py 2006-02-01 17:01:54.000000000 -0800 +++ bzr.robey/bzrlib/tests/blackbox/test_status.py 2006-02-01 18:15:38.000000000 -0800 @@ -35,6 +35,7 @@ from bzrlib.revisionspec import RevisionSpec from bzrlib.status import show_status from bzrlib.tests import TestCaseInTempDir +from bzrlib.tests.blackbox import ExternalBase from bzrlib.workingtree import WorkingTree @@ -173,3 +174,26 @@ ['unknown:\n', ' dir2\n' ]) + + +class TestStatus(ExternalBase): + + def test_status(self): + self.runbzr("init") + self.build_tree(['hello.txt']) + result = self.runbzr("status") + self.assert_("unknown:\n hello.txt\n" in result, result) + self.runbzr("add hello.txt") + result = self.runbzr("status") + self.assert_("added:\n hello.txt\n" in result, result) + self.runbzr("commit -m added") + result = self.runbzr("status -r 0..1") + self.assert_("added:\n hello.txt\n" in result, result) + self.build_tree(['world.txt']) + result = self.runbzr("status -r 0") + self.assert_("added:\n hello.txt\n" \ + "unknown:\n world.txt\n" in result, result) + + result2 = self.runbzr("status -r 0..") + self.assertEquals(result2, result) + diff -x .bzr -x '*~' -x bzr.1 -ruN bzr.dev/bzrlib/tests/blackbox/test_too_much.py bzr.robey/bzrlib/tests/blackbox/test_too_much.py --- bzr.dev/bzrlib/tests/blackbox/test_too_much.py 2006-02-01 17:02:07.000000000 -0800 +++ bzr.robey/bzrlib/tests/blackbox/test_too_much.py 2006-02-01 17:45:26.000000000 -0800 @@ -241,22 +241,6 @@ self.runbzr('revert') os.chdir('..') - def test_status(self): - self.runbzr("init") - self.build_tree(['hello.txt']) - result = self.runbzr("status") - self.assert_("unknown:\n hello.txt\n" in result, result) - self.runbzr("add hello.txt") - result = self.runbzr("status") - self.assert_("added:\n hello.txt\n" in result, result) - self.runbzr("commit -m added") - result = self.runbzr("status -r 0..1") - self.assert_("added:\n hello.txt\n" in result, result) - self.build_tree(['world.txt']) - result = self.runbzr("status -r 0") - self.assert_("added:\n hello.txt\n" \ - "unknown:\n world.txt\n" in result, result) - def test_mv_modes(self): """Test two modes of operation for mv""" self.runbzr('init') diff -x .bzr -x '*~' -x bzr.1 -ruN bzr.dev/bzrlib/transport/http.py bzr.robey/bzrlib/transport/http.py --- bzr.dev/bzrlib/transport/http.py 2006-02-01 17:02:03.000000000 -0800 +++ bzr.robey/bzrlib/transport/http.py 2006-02-01 17:45:13.000000000 -0800 @@ -28,6 +28,7 @@ from bzrlib.errors import BzrError, BzrCheckError from bzrlib.branch import Branch from bzrlib.trace import mutter +from bzrlib.ui import ui_factory def extract_auth(url, password_manager): @@ -36,34 +37,33 @@ password manager. Return the url, minus those auth parameters (which confuse urllib2). """ - assert url.startswith('http://') or url.startswith('https://') - scheme, host = url.split('//', 1) - if '/' in host: - host, path = host.split('/', 1) - path = '/' + path - else: - path = '' - port = '' - if '@' in host: - auth, host = host.split('@', 1) + scheme, netloc, path, query, fragment = urlparse.urlsplit(url) + assert (scheme == 'http') or (scheme == 'https') + + if '@' in netloc: + auth, netloc = netloc.split('@', 1) if ':' in auth: username, password = auth.split(':', 1) else: username, password = auth, None - if ':' in host: - host, port = host.split(':', 1) - port = ':' + port - # FIXME: if password isn't given, should we ask for it? + if ':' in netloc: + host = netloc.split(':', 1)[0] + else: + host = netloc + username = urllib.unquote(username) if password is not None: - username = urllib.unquote(username) password = urllib.unquote(password) - password_manager.add_password(None, host, username, password) - url = scheme + '//' + host + port + path + else: + password = ui_factory.get_password(prompt='HTTP %(user)@%(host) password', + user=username, host=host) + password_manager.add_password(None, host, username, password) + url = urlparse.urlunsplit((scheme, netloc, path, query, fragment)) return url + def get_url(url): import urllib2 - mutter("get_url %s" % url) + mutter("get_url %s", url) manager = urllib2.HTTPPasswordMgrWithDefaultRealm() url = extract_auth(url, manager) auth_handler = urllib2.HTTPBasicAuthHandler(manager) diff -x .bzr -x '*~' -x bzr.1 -ruN bzr.dev/bzrlib/transport/sftp.py bzr.robey/bzrlib/transport/sftp.py --- bzr.dev/bzrlib/transport/sftp.py 2006-02-01 17:02:08.000000000 -0800 +++ bzr.robey/bzrlib/transport/sftp.py 2006-02-01 17:45:16.000000000 -0800 @@ -19,14 +19,14 @@ import errno import getpass import os +import random import re import stat +import subprocess import sys +import time import urllib import urlparse -import time -import random -import subprocess import weakref from bzrlib.config import config_dir, ensure_config_dir_exists @@ -53,7 +53,13 @@ from paramiko.sftp_file import SFTPFile from paramiko.sftp_client import SFTPClient -if 'sftp' not in urlparse.uses_netloc: urlparse.uses_netloc.append('sftp') +if 'sftp' not in urlparse.uses_netloc: + urlparse.uses_netloc.append('sftp') + +# don't use prefetch unless paramiko version >= 1.5.2 (there were bugs earlier) +_default_do_prefetch = False +if getattr(paramiko, '__version_info__', (0, 0, 0)) >= (1, 5, 2): + _default_do_prefetch = True _close_fds = True @@ -62,6 +68,7 @@ _close_fds = False _ssh_vendor = None + def _get_ssh_vendor(): """Find out what version of SSH is on the system.""" global _ssh_vendor @@ -70,6 +77,12 @@ _ssh_vendor = 'none' + if 'BZR_SSH' in os.environ: + _ssh_vendor = os.environ['BZR_SSH'] + if _ssh_vendor == 'paramiko': + _ssh_vendor = 'none' + return _ssh_vendor + try: p = subprocess.Popen(['ssh', '-V'], close_fds=_close_fds, @@ -243,12 +256,11 @@ # What specific errors should we catch here? pass - class SFTPTransport (Transport): """ Transport implementation for SFTP access. """ - _do_prefetch = False # Right now Paramiko's prefetch support causes things to hang + _do_prefetch = _default_do_prefetch def __init__(self, base, clone_from=None): assert base.startswith('sftp://') @@ -353,7 +365,7 @@ try: path = self._remote_path(relpath) f = self._sftp.file(path, mode='rb') - if self._do_prefetch and hasattr(f, 'prefetch'): + if self._do_prefetch and (getattr(f, 'prefetch', None) is not None): f.prefetch() return f except (IOError, paramiko.SSHException), e: