~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/blackbox/test_resolve.py

  • Committer: John Arbash Meinel
  • Date: 2010-08-05 16:27:35 UTC
  • mto: This revision was merged to the branch mainline in revision 5374.
  • Revision ID: john@arbash-meinel.com-20100805162735-172opvx34sr5gpbl
Find a case where we are wasting a bit of memory.

Specifically the 'build_details' tuple contains a lot of wasted references,
and we hold on to one of these for each record we are fetching.
And for something like 'bzr pack', that is all keys.

For just loading all text build details on my bzr+ repository, With:
locations = b.repository.texts._index.get_build_details(b.repository.texts.keys())
This drops the memory consumption from:
WorkingSize   77604KiB
 to
WorkingSize   64640KiB

Or around 10.6MB. I worked it out to a savings of about 80 bytes/record
on data that can have hundreds of thousands of records (in 32-bit).

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2010 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
 
 
17
 
from bzrlib import (
18
 
    conflicts,
19
 
    tests,
20
 
    )
21
 
from bzrlib.tests import script
22
 
from bzrlib.tests.blackbox import test_conflicts
23
 
 
24
 
 
25
 
class TestResolve(script.TestCaseWithTransportAndScript):
26
 
 
27
 
    def setUp(self):
28
 
        super(TestResolve, self).setUp()
29
 
        test_conflicts.make_tree_with_conflicts(self, 'branch', 'other')
30
 
 
31
 
    def test_resolve_one_by_one(self):
32
 
        self.run_script("""\
33
 
$ cd branch
34
 
$ bzr conflicts
35
 
Text conflict in my_other_file
36
 
Path conflict: mydir3 / mydir2
37
 
Text conflict in myfile
38
 
$ bzr resolve myfile
39
 
2>1 conflict(s) resolved, 2 remaining
40
 
$ bzr resolve my_other_file
41
 
2>1 conflict(s) resolved, 1 remaining
42
 
$ bzr resolve mydir2
43
 
2>1 conflict(s) resolved, 0 remaining
44
 
""")
45
 
 
46
 
    def test_resolve_all(self):
47
 
        self.run_script("""\
48
 
$ cd branch
49
 
$ bzr resolve --all
50
 
2>3 conflict(s) resolved, 0 remaining
51
 
$ bzr conflicts
52
 
""")
53
 
 
54
 
    def test_resolve_from_subdir(self):
55
 
        self.run_script("""\
56
 
$ mkdir branch/subdir
57
 
$ cd branch/subdir
58
 
$ bzr resolve ../myfile
59
 
2>1 conflict(s) resolved, 2 remaining
60
 
""")
61
 
 
62
 
    def test_resolve_via_directory_option(self):
63
 
        self.run_script("""\
64
 
$ bzr resolve -d branch myfile
65
 
2>1 conflict(s) resolved, 2 remaining
66
 
""")
67
 
 
68
 
    def test_resolve_all_via_directory_option(self):
69
 
        self.run_script("""\
70
 
$ bzr resolve -d branch --all
71
 
2>3 conflict(s) resolved, 0 remaining
72
 
$ bzr conflicts -d branch
73
 
""")
74
 
 
75
 
 
76
 
class TestResolveAuto(tests.TestCaseWithTransport):
77
 
 
78
 
    def test_auto_resolve(self):
79
 
        """Text conflicts can be resolved automatically"""
80
 
        tree = self.make_branch_and_tree('tree')
81
 
        self.build_tree_contents([('tree/file',
82
 
            '<<<<<<<\na\n=======\n>>>>>>>\n')])
83
 
        tree.add('file', 'file_id')
84
 
        self.assertEqual(tree.kind('file_id'), 'file')
85
 
        file_conflict = conflicts.TextConflict('file', file_id='file_id')
86
 
        tree.set_conflicts(conflicts.ConflictList([file_conflict]))
87
 
        note = self.run_bzr('resolve', retcode=1, working_dir='tree')[1]
88
 
        self.assertContainsRe(note, '0 conflict\\(s\\) auto-resolved.')
89
 
        self.assertContainsRe(note,
90
 
            'Remaining conflicts:\nText conflict in file')
91
 
        self.build_tree_contents([('tree/file', 'a\n')])
92
 
        note = self.run_bzr('resolve', working_dir='tree')[1]
93
 
        self.assertContainsRe(note, 'All conflicts resolved.')