~bzr/ubuntu/maverick/bzr-svn/bzr-ppa

« back to all changes in this revision

Viewing changes to workingtree.py

  • Committer: Jelmer Vernooij
  • Date: 2008-05-11 19:29:26 UTC
  • mfrom: (220.36.144 0.4)
  • Revision ID: jelmer@samba.org-20080511192926-7mh02j45r25qmzkz
Merge 0.4 branch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
 
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
5
 
# the Free Software Foundation; either version 2 of the License, or
 
5
# the Free Software Foundation; either version 3 of the License, or
6
6
# (at your option) any later version.
7
7
 
8
8
# This program is distributed in the hope that it will be useful,
28
28
from bzrlib.osutils import file_kind, fingerprint_file, supports_executable
29
29
from bzrlib.revision import NULL_REVISION
30
30
from bzrlib.trace import mutter
31
 
from bzrlib.tree import RevisionTree
 
31
from bzrlib.revisiontree import RevisionTree
32
32
from bzrlib.transport.local import LocalTransport
33
33
from bzrlib.workingtree import WorkingTree, WorkingTreeFormat
34
34
 
36
36
from commit import _revision_id_to_svk_feature
37
37
from convert import SvnConverter
38
38
from errors import LocalCommitsUnsupported, NoSvnRepositoryPresent
39
 
from mapping import (SVN_PROP_BZR_ANCESTRY, SVN_PROP_BZR_FILEIDS, 
 
39
from bzrlib.plugins.svn.mapping import (SVN_PROP_BZR_ANCESTRY, SVN_PROP_BZR_FILEIDS, 
40
40
                     SVN_PROP_BZR_REVISION_ID, SVN_PROP_BZR_REVISION_INFO,
41
41
                     generate_revision_metadata)
42
42
from remote import SvnRemoteAccess
43
43
from repository import SvnRepository
44
44
from svk import SVN_PROP_SVK_MERGE, parse_svk_features, serialize_svk_features
45
 
from mapping import escape_svn_path
46
 
from scheme import BranchingScheme
 
45
from bzrlib.plugins.svn.mapping import escape_svn_path
47
46
from transport import (SvnRaTransport, bzr_to_svn_url, create_svn_client,
48
47
                       svn_config) 
49
48
from tree import SvnBasisTree
52
51
import urllib
53
52
 
54
53
import svn.core, svn.wc
55
 
from svn.core import SubversionException, Pool
 
54
from svn.core import SubversionException
56
55
 
57
56
from errors import NoCheckoutSupport
58
57
from format import get_rich_root_format
59
58
 
60
 
class WorkingTreeInconsistent(BzrError):
61
 
    _fmt = """Working copy is in inconsistent state (%(min_revnum)d:%(max_revnum)d)"""
62
 
 
63
 
    def __init__(self, min_revnum, max_revnum):
64
 
        self.min_revnum = min_revnum
65
 
        self.max_revnum = max_revnum
 
59
def generate_ignore_list(ignore_map):
 
60
    """Create a list of ignores, ordered by directory.
 
61
    
 
62
    :param ignore_map: Dictionary with paths as keys, patterns as values.
 
63
    :return: list of ignores
 
64
    """
 
65
    ignores = []
 
66
    keys = ignore_map.keys()
 
67
    keys.sort()
 
68
    for k in keys:
 
69
        ignores.append("./" + os.path.join(k.strip("/"), ignore_map[k].strip("/")))
 
70
    return ignores
66
71
 
67
72
 
68
73
class SvnWorkingTree(WorkingTree):
73
78
        self.bzrdir = bzrdir
74
79
        self._branch = branch
75
80
        self.base_revnum = 0
76
 
        self.pool = Pool()
77
 
        self.client_ctx = create_svn_client(self.pool)
 
81
        self.client_ctx = create_svn_client(bzrdir.svn_url)
78
82
        self.client_ctx.log_msg_func2 = \
79
83
                svn.client.svn_swig_py_get_commit_log_func
80
84
 
81
85
        self._get_wc()
82
86
        status = svn.wc.revision_status(self.basedir, None, True, None, None)
83
 
        if status.min_rev != status.max_rev:
84
 
            #raise WorkingTreeInconsistent(status.min_rev, status.max_rev)
85
 
            rev = svn.core.svn_opt_revision_t()
86
 
            rev.kind = svn.core.svn_opt_revision_number
87
 
            rev.value.number = status.max_rev
88
 
            assert status.max_rev == svn.client.update(self.basedir, rev,
89
 
                                     True, self.client_ctx, Pool())
90
 
 
91
87
        self.base_revnum = status.max_rev
92
88
        self.base_tree = SvnBasisTree(self)
93
89
        self.base_revid = branch.generate_revision_id(self.base_revnum)
121
117
                if entry == "":
122
118
                    continue
123
119
 
 
120
                # Ignore ignores on things that aren't directories
124
121
                if entries[entry].kind != svn.core.svn_node_dir:
125
122
                    continue
126
123
 
728
725
        # Open related remote repository + branch
729
726
        wc = svn.wc.adm_open3(None, self.local_path, False, 0, None)
730
727
        try:
731
 
            svn_url = svn.wc.entry(self.local_path, wc, True).url
 
728
            self.svn_url = svn.wc.entry(self.local_path, wc, True).url
732
729
        finally:
733
730
            svn.wc.adm_close(wc)
734
731
 
735
 
        remote_transport = SvnRaTransport(svn_url)
736
 
        self.remote_bzrdir = SvnRemoteAccess(remote_transport)
737
 
        self.svn_root_transport = remote_transport.clone_root()
 
732
        self.remote_transport = SvnRaTransport(self.svn_url)
 
733
        self.remote_bzrdir = SvnRemoteAccess(self.remote_transport)
 
734
        self.svn_root_transport = self.remote_transport.clone_root()
738
735
        self.root_transport = self.transport = transport
739
736
        
740
737
    def clone(self, path, revision_id=None, force_new_repo=False):
788
785
        repos = self._find_repository()
789
786
 
790
787
        try:
791
 
            branch = SvnBranch(self.svn_root_transport.base, repos, 
 
788
            branch = SvnBranch(self.remote_transport.base, repos, 
792
789
                               self.remote_bzrdir.branch_path)
793
790
        except SubversionException, (_, num):
794
791
            if num == svn.core.SVN_ERR_WC_NOT_DIRECTORY: