/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_smart_add.py

  • Committer: Robert Collins
  • Date: 2007-09-19 05:14:14 UTC
  • mto: (2835.1.1 ianc-integration)
  • mto: This revision was merged to the branch mainline in revision 2836.
  • Revision ID: robertc@robertcollins.net-20070919051414-2tgjqteg7k3ps4h0
* ``pull``, ``merge`` and ``push`` will no longer silently correct some
  repository index errors that occured as a result of the Weave disk format.
  Instead the ``reconcile`` command needs to be run to correct those
  problems if they exist (and it has been able to fix most such problems
  since bzr 0.8). Some new problems have been identified during this release
  and you should run ``bzr check`` once on every repository to see if you
  need to reconcile. If you cannot ``pull`` or ``merge`` from a remote
  repository due to mismatched parent errors - a symptom of index errors -
  you should simply take a full copy of that remote repository to a clean
  directory outside any local repositories, then run reconcile on it, and
  finally pull from it locally. (And naturally email the repositories owner
  to ask them to upgrade and run reconcile).
  (Robert Collins)

* ``VersionedFile.fix_parents`` has been removed as a harmful API.
  ``VersionedFile.join`` will no longer accept different parents on either
  side of a join - it will either ignore them, or error, depending on the
  implementation. See notes when upgrading for more information.
  (Robert Collins)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2005, 2006, 2007 Canonical Ltd
 
2
#
 
3
# This program is free software; you can redistribute it and/or modify
 
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
 
6
# (at your option) any later version.
 
7
#
 
8
# This program is distributed in the hope that it will be useful,
 
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
# GNU General Public License for more details.
 
12
#
 
13
# You should have received a copy of the GNU General Public License
 
14
# along with this program; if not, write to the Free Software
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
16
 
 
17
from cStringIO import StringIO
 
18
 
 
19
from bzrlib import osutils
 
20
from bzrlib.add import (
 
21
    AddAction,
 
22
    AddFromBaseAction,
 
23
    )
 
24
from bzrlib.tests import TestCase, TestCaseWithTransport
 
25
from bzrlib.inventory import Inventory
 
26
 
 
27
 
 
28
class AddCustomIDAction(AddAction):
 
29
 
 
30
    def __call__(self, inv, parent_ie, path, kind):
 
31
        # The first part just logs if appropriate
 
32
        # Now generate a custom id
 
33
        file_id = osutils.safe_file_id(kind + '-'
 
34
                                       + path.raw_path.replace('/', '%'),
 
35
                                       warn=False)
 
36
        if self.should_print:
 
37
            self._to_file.write('added %s with id %s\n'
 
38
                                % (path.raw_path, file_id))
 
39
        return file_id
 
40
 
 
41
 
 
42
class TestAddFrom(TestCaseWithTransport):
 
43
    """Tests for AddFromBaseAction"""
 
44
 
 
45
    def make_base_tree(self):
 
46
        self.base_tree = self.make_branch_and_tree('base')
 
47
        self.build_tree(['base/a', 'base/b',
 
48
                         'base/dir/', 'base/dir/a',
 
49
                         'base/dir/subdir/',
 
50
                         'base/dir/subdir/b',
 
51
                        ])
 
52
        self.base_tree.add(['a', 'b', 'dir', 'dir/a',
 
53
                            'dir/subdir', 'dir/subdir/b'])
 
54
        self.base_tree.commit('creating initial tree.')
 
55
 
 
56
    def add_helper(self, base_tree, base_path, new_tree, file_list,
 
57
                   should_print=False):
 
58
        to_file = StringIO()
 
59
        base_tree.lock_read()
 
60
        try:
 
61
            new_tree.lock_write()
 
62
            try:
 
63
                action = AddFromBaseAction(base_tree, base_path,
 
64
                                           to_file=to_file,
 
65
                                           should_print=should_print)
 
66
                new_tree.smart_add(file_list, action=action)
 
67
            finally:
 
68
                new_tree.unlock()
 
69
        finally:
 
70
            base_tree.unlock()
 
71
        return to_file.getvalue()
 
72
 
 
73
    def test_copy_all(self):
 
74
        self.make_base_tree()
 
75
        new_tree = self.make_branch_and_tree('new')
 
76
        files = ['a', 'b',
 
77
                 'dir/', 'dir/a',
 
78
                 'dir/subdir/',
 
79
                 'dir/subdir/b',
 
80
                ]
 
81
        self.build_tree(['new/' + fn for fn in files])
 
82
        self.add_helper(self.base_tree, '', new_tree, ['new'])
 
83
 
 
84
        for fn in files:
 
85
            base_file_id = self.base_tree.path2id(fn)
 
86
            new_file_id = new_tree.path2id(fn)
 
87
            self.assertEqual(base_file_id, new_file_id)
 
88
 
 
89
    def test_copy_from_dir(self):
 
90
        self.make_base_tree()
 
91
        new_tree = self.make_branch_and_tree('new')
 
92
 
 
93
        self.build_tree(['new/a', 'new/b', 'new/c',
 
94
                         'new/subdir/', 'new/subdir/b', 'new/subdir/d'])
 
95
        new_tree.set_root_id(self.base_tree.get_root_id())
 
96
        self.add_helper(self.base_tree, 'dir', new_tree, ['new'])
 
97
 
 
98
        # We know 'a' and 'b' exist in the root, and they are being added
 
99
        # in a new 'root'. Since ROOT ids have been set as the same, we will
 
100
        # use those ids
 
101
        self.assertEqual(self.base_tree.path2id('a'),
 
102
                         new_tree.path2id('a'))
 
103
        self.assertEqual(self.base_tree.path2id('b'),
 
104
                         new_tree.path2id('b'))
 
105
 
 
106
        # Because we specified 'dir/' as the base path, and we have
 
107
        # nothing named 'subdir' in the base tree, we should grab the
 
108
        # ids from there
 
109
        self.assertEqual(self.base_tree.path2id('dir/subdir'),
 
110
                         new_tree.path2id('subdir'))
 
111
        self.assertEqual(self.base_tree.path2id('dir/subdir/b'),
 
112
                         new_tree.path2id('subdir/b'))
 
113
 
 
114
        # These should get newly generated ids
 
115
        c_id = new_tree.path2id('c')
 
116
        self.assertNotEqual(None, c_id)
 
117
        self.base_tree.lock_read()
 
118
        self.addCleanup(self.base_tree.unlock)
 
119
        self.failIf(c_id in self.base_tree)
 
120
 
 
121
        d_id = new_tree.path2id('subdir/d')
 
122
        self.assertNotEqual(None, d_id)
 
123
        self.failIf(d_id in self.base_tree)
 
124
 
 
125
    def test_copy_existing_dir(self):
 
126
        self.make_base_tree()
 
127
        new_tree = self.make_branch_and_tree('new')
 
128
        self.build_tree(['new/subby/', 'new/subby/a', 'new/subby/b'])
 
129
 
 
130
        subdir_file_id = self.base_tree.path2id('dir/subdir')
 
131
        new_tree.add(['subby'], [subdir_file_id])
 
132
        self.add_helper(self.base_tree, '', new_tree, ['new'])
 
133
        # Because 'subby' already points to subdir, we should add
 
134
        # 'b' with the same id
 
135
        self.assertEqual(self.base_tree.path2id('dir/subdir/b'),
 
136
                         new_tree.path2id('subby/b'))
 
137
 
 
138
        # 'subby/a' should be added with a new id because there is no
 
139
        # matching path or child of 'subby'.
 
140
        a_id = new_tree.path2id('subby/a')
 
141
        self.assertNotEqual(None, a_id)
 
142
        self.base_tree.lock_read()
 
143
        self.addCleanup(self.base_tree.unlock)
 
144
        self.failIf(a_id in self.base_tree)
 
145
 
 
146
 
 
147
class TestAddActions(TestCase):
 
148
 
 
149
    def test_quiet(self):
 
150
        self.run_action("")
 
151
 
 
152
    def test__print(self):
 
153
        self.run_action("added path\n")
 
154
 
 
155
    def run_action(self, output):
 
156
        from bzrlib.add import AddAction
 
157
        from bzrlib.mutabletree import _FastPath
 
158
        inv = Inventory()
 
159
        stdout = StringIO()
 
160
        action = AddAction(to_file=stdout, should_print=bool(output))
 
161
 
 
162
        self.apply_redirected(None, stdout, None, action, inv, None,
 
163
            _FastPath('path'), 'file')
 
164
        self.assertEqual(stdout.getvalue(), output)