Merge fix for 115026
authorJelmer Vernooij <jelmer@samba.org>
Sun, 20 May 2007 21:32:33 +0000 (22:32 +0100)
committerJelmer Vernooij <jelmer@samba.org>
Sun, 20 May 2007 21:32:33 +0000 (22:32 +0100)
1  2 
NEWS
README
__init__.py
logwalker.py
repository.py
revids.py

diff --cc NEWS
index a3f3852e3ec20917a18ad986d68f7bbc55da87c5,d882be99caadd0a05969162a9448fe3280f9426c..9fa32e00788fbec883dce4a53fe3d1a2fff69db5
--- 1/NEWS
--- 2/NEWS
+++ b/NEWS
@@@ -1,35 -1,10 +1,40 @@@
 +bzr-svn 0.4   UNRELEASED
 +  
 +  BUG FIXES
 +
 +   * Non-ascii characters in file ids are now supported (fixes imports 
 +     of the Python repository).
 +
 +   * Fixed error raised during version incompatibility. (Wouter van Heyst, 
 +                                                         #80467)
 +
 +   * Implemented Repository.get_revision_graph(None)
 +
 +   * svn-import will no longer spin using CPU if the target directory 
 +     did not exist (#80223).
 +
 +   * Remove branches when they are being replaced. Fixes DivergedBranches 
 +     error when using svn-import (#81908).
 +
 +   * Support true push (#80612).
 +
 +   * Support commits in heavy checkouts (#79330).
 +
 +  IMPROVEMENTS
 +
 +  PERFORMANCE
 +
 +   * do_update() is now used to find the contents of a directory recursively. 
 +     This should reduce the number of roundtrips significantly when 
 +       finding file id mappings.
 +
  bzr-svn 0.3.4 UNRELEASED
  
+   BUG FIXES
+   * Check for a working pysqlite, rather than checking that the 
+     first one found works. (#115026)
  bzr-svn 0.3.3 2007-04-29
  
    IMPROVEMENTS
diff --cc README
Simple merge
diff --cc __init__.py
Simple merge
diff --cc logwalker.py
Simple merge
diff --cc repository.py
index b479f5d63f1d118c6e6a136cfe05a1b36d1a6966,8c9742151df675a6caad90a60c9edb7b3f5a2a51..aacecf6a0bb46d59a118d99b744b26ec2f6637d0
@@@ -17,9 -17,8 +17,8 @@@
  
  import bzrlib
  from bzrlib.branch import BranchCheckResult
- from bzrlib.config import config_dir, ensure_config_dir_exists
  from bzrlib.errors import (InvalidRevisionId, NoSuchRevision, 
 -                           NotBranchError, UninitializableFormat)
 +                           NotBranchError, UninitializableFormat, BzrError)
  from bzrlib.inventory import Inventory
  from bzrlib.lockable_files import LockableFiles, TransportLock
  import bzrlib.osutils as osutils
@@@ -34,57 -32,79 +33,54 @@@ from svn.core import SubversionExceptio
  import svn.core
  
  import os
- try:
-     import sqlite3
- except ImportError:
-     from pysqlite2 import dbapi2 as sqlite3
  
  from branchprops import BranchPropertyList
+ from cache import create_cache_dir, sqlite3
  import errors
  import logwalker
 +from revids import (generate_svn_revision_id, parse_svn_revision_id, 
 +                    MAPPING_VERSION, RevidMap)
  from tree import SvnRevisionTree
  
 -MAPPING_VERSION = 2
  SVN_PROP_BZR_PREFIX = 'bzr:'
 -REVISION_ID_PREFIX = "svn-v%d:" % MAPPING_VERSION
  SVN_PROP_BZR_MERGE = 'bzr:merge'
 +SVN_PROP_BZR_FILEIDS = 'bzr:file-ids'
  SVN_PROP_SVK_MERGE = 'svk:merge'
  SVN_PROP_BZR_FILEIDS = 'bzr:file-ids'
 -SVN_PROP_BZR_REVPROP_PREFIX = 'bzr:revprop:'
 +SVN_PROP_BZR_REVISION_INFO = 'bzr:revision-info'
  SVN_REVPROP_BZR_SIGNATURE = 'bzr:gpg-signature'
 +SVN_PROP_BZR_REVISION_ID = 'bzr:revision-id-v%d' % MAPPING_VERSION
  
 -
 -def escape_svn_path(id, unsafe="%/-\t \n"):
 -    assert "%" in unsafe
 -    r = [((c in unsafe) and ('%%%02x' % ord(c)) or c)
 -         for c in id]
 -    ret = ''.join(r)
 -    if isinstance(ret, unicode):
 -        return ret.encode("utf-8")
 -    return ret
 -
 -
 -import urllib
 -
 -unescape_svn_path = urllib.unquote
 -
 -
 -def parse_svn_revision_id(revid):
 -    """Parse an existing Subversion-based revision id.
 -
 -    :param revid: The revision id.
 -    :raises: InvalidRevisionId
 -    :return: Tuple with uuid, branch path and revision number.
 -    """
 -
 -    assert revid
 -    assert isinstance(revid, basestring)
 -
 -    if not revid.startswith(REVISION_ID_PREFIX):
 -        raise InvalidRevisionId(revid, "")
 -
 -    revid = revid[len(REVISION_ID_PREFIX):]
 -
 -    at = revid.index("@")
 -    fash = revid.rindex("-")
 -    uuid = revid[at+1:fash]
 -
 -    branch_path = unescape_svn_path(revid[fash+1:])
 -    revnum = int(revid[0:at])
 -    assert revnum >= 0
 -    return (uuid, branch_path, revnum)
 -
 -
 -def generate_svn_revision_id(uuid, revnum, path):
 -    """Generate a unambiguous revision id. 
 -    
 -    :param uuid: UUID of the repository.
 -    :param revnum: Subversion revision number.
 -    :param path: Branch path.
 -
 -    :return: New revision id.
 -    """
 -    assert isinstance(revnum, int)
 -    assert isinstance(path, basestring)
 -    assert revnum >= 0
 -    if revnum == 0:
 -        return NULL_REVISION
 -    return "%s%d@%s-%s" % (REVISION_ID_PREFIX, revnum, uuid, escape_svn_path(path.strip("/")))
 +def parse_revision_metadata(text, rev):
 +    in_properties = False
 +    for l in text.splitlines():
 +        try:
 +            key, value = l.split(": ", 2)
 +        except ValueError:
 +            raise BzrError("Missing : in revision metadata")
 +        if key == "committer":
 +            rev.committer = str(value)
 +        elif key == "timestamp":
 +            (rev.timestamp, rev.timezone) = unpack_highres_date(value)
 +        elif key == "properties":
 +            in_properties = True
 +        elif key[0] == "\t" and in_properties:
 +            rev.properties[str(key[1:])] = str(value)
 +        else:
 +            raise BzrError("Invalid key %r" % key)
 +
 +def generate_revision_metadata(timestamp, timezone, committer, revprops):
 +    assert timestamp is None or isinstance(timestamp, float)
 +    text = ""
 +    if timestamp is not None:
 +        text += "timestamp: %s\n" % format_highres_date(timestamp, timezone) 
 +    if committer is not None:
 +        text += "committer: %s\n" % committer
 +    if revprops is not None and revprops != {}:
 +        text += "properties: \n"
 +        for k, v in sorted(revprops.items()):
 +            text += "\t%s: %s\n" % (k, v)
 +    return text
  
  
  def svk_feature_to_revision_id(feature):
diff --cc revids.py
index ce88bf206ae21ff7059f1ac54c978127a06a2a41,0000000000000000000000000000000000000000..a0a7d69b9813209640b29ec0803c7b7c0363c236
mode 100644,000000..100644
--- /dev/null
+++ b/revids.py
@@@ -1,113 -1,0 +1,109 @@@
- try:
-     import sqlite3
- except ImportError:
-     from pysqlite2 import dbapi2 as sqlite3
 +# Copyright (C) 2006-2007 Jelmer Vernooij <jelmer@samba.org>
 +
 +# 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
 +
 +from bzrlib.errors import (InvalidRevisionId, NoSuchRevision, 
 +                           NotBranchError, UninitializableFormat)
 +
 +MAPPING_VERSION = 3
 +REVISION_ID_PREFIX = "svn-v%d-" % MAPPING_VERSION
 +
 +import urllib
 +
 +def escape_svn_path(x):
 +    if isinstance(x, unicode):
 +        x = x.encode("utf-8")
 +    return urllib.quote(x, "")
 +unescape_svn_path = urllib.unquote
 +
 +
 +def parse_svn_revision_id(revid):
 +    """Parse an existing Subversion-based revision id.
 +
 +    :param revid: The revision id.
 +    :raises: InvalidRevisionId
 +    :return: Tuple with uuid, branch path and revision number.
 +    """
 +
 +    assert revid is not None
 +    assert isinstance(revid, basestring)
 +
 +    if not revid.startswith(REVISION_ID_PREFIX):
 +        raise InvalidRevisionId(revid, "")
 +
 +    try:
 +        (version, uuid, branch_path, srevnum)= revid.split(":")
 +    except ValueError:
 +        raise InvalidRevisionId(revid, "")
 +
 +    revid = revid[len(REVISION_ID_PREFIX):]
 +
 +    return (uuid, unescape_svn_path(branch_path), int(srevnum))
 +
 +
 +def generate_svn_revision_id(uuid, revnum, path, scheme="undefined"):
 +    """Generate a unambiguous revision id. 
 +    
 +    :param uuid: UUID of the repository.
 +    :param revnum: Subversion revision number.
 +    :param path: Branch path.
 +    :param scheme: Name of the branching scheme in use
 +
 +    :return: New revision id.
 +    """
 +    assert isinstance(revnum, int)
 +    assert isinstance(path, basestring)
 +    assert revnum >= 0
 +    assert revnum > 0 or path == "", \
 +            "Trying to generate revid for (%r,%r)" % (path, revnum)
 +    return "%s%s:%s:%s:%d" % (REVISION_ID_PREFIX, scheme, uuid, \
 +                   escape_svn_path(path.strip("/")), revnum)
 +
 +
 +class RevidMap(object):
 +    """Revision id mapping store. 
 +
 +    Stores mapping from revid -> (path, revnum, scheme)
 +    """
 +    def __init__(self, cache_db=None):
 +        if cache_db is None:
++            from cache import sqlite3
 +            self.cachedb = sqlite3.connect(":memory:")
 +        else:
 +            self.cachedb = cache_db
 +        self.cachedb.executescript("""
 +        create table if not exists revmap (revid text, path text, min_revnum integer, max_revnum integer, scheme text);
 +        create index if not exists revid on revmap (revid);
 +        """)
 +        self.cachedb.commit()
 +    
 +    def lookup_revid(self, revid):
 +        ret = self.cachedb.execute(
 +            "select path, min_revnum, max_revnum, scheme from revmap where revid='%s'" % revid).fetchone()
 +        if ret is None:
 +            raise NoSuchRevision(self, revid)
 +        return (str(ret[0]), ret[1], ret[2], ret[3])
 +
 +    def lookup_branch_revnum(self, revnum, path):
 +        # FIXME: SCHEME MISSING
 +        revid = self.cachedb.execute(
 +                "select revid from revmap where max_revnum = min_revnum and min_revnum='%s' and path='%s'" % (revnum, path)).fetchone()
 +        if revid is not None:
 +            return str(revid[0])
 +        return None
 +
 +    def insert_revid(self, revid, branch, min_revnum, max_revnum, scheme):
 +        assert revid is not None and revid != ""
 +        self.cachedb.execute("insert into revmap (revid, path, min_revnum, max_revnum, scheme) VALUES (?, ?, ?, ?, ?)", (revid, branch, min_revnum, max_revnum, scheme))