~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_mergetools.py

  • Committer: Rory Yorke
  • Date: 2010-10-20 14:38:53 UTC
  • mto: This revision was merged to the branch mainline in revision 5519.
  • Revision ID: rory.yorke@gmail.com-20101020143853-9kfd2ldcjfroh8jw
Show missing files in bzr status (bug 134168).

"bzr status" will now show missing files, that is, those added with "bzr
add" and then removed by non bzr means (e.g., rm).

Blackbox tests were added for this case, and tests were also added to
test_delta, since the implementation change is in bzrlib.delta.

Might also affect bug 189709.

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
 
import os
18
 
import re
19
 
import sys
20
 
import tempfile
21
 
 
22
 
from bzrlib import (
23
 
    mergetools,
24
 
    tests
25
 
)
26
 
from bzrlib.tests.features import backslashdir_feature
27
 
 
28
 
 
29
 
class TestFilenameSubstitution(tests.TestCaseInTempDir):
30
 
 
31
 
    def test_simple_filename(self):
32
 
        cmd_list = ['kdiff3', '{base}', '{this}', '{other}', '-o', '{result}']
33
 
        args, tmpfile = mergetools._subst_filename(cmd_list, 'test.txt')
34
 
        self.assertEqual(
35
 
            ['kdiff3',
36
 
             'test.txt.BASE',
37
 
             'test.txt.THIS',
38
 
             'test.txt.OTHER',
39
 
             '-o',
40
 
             'test.txt'],
41
 
            args)
42
 
        
43
 
    def test_spaces(self):
44
 
        cmd_list = ['kdiff3', '{base}', '{this}', '{other}', '-o', '{result}']
45
 
        args, tmpfile = mergetools._subst_filename(cmd_list,
46
 
                                                   'file with space.txt')
47
 
        self.assertEqual(
48
 
            ['kdiff3',
49
 
             'file with space.txt.BASE',
50
 
             'file with space.txt.THIS',
51
 
             'file with space.txt.OTHER',
52
 
             '-o',
53
 
             'file with space.txt'],
54
 
            args)
55
 
 
56
 
    def test_spaces_and_quotes(self):
57
 
        cmd_list = ['kdiff3', '{base}', '{this}', '{other}', '-o', '{result}']
58
 
        args, tmpfile = mergetools._subst_filename(cmd_list,
59
 
            'file with "space and quotes".txt')
60
 
        self.assertEqual(
61
 
            ['kdiff3',
62
 
             'file with "space and quotes".txt.BASE',
63
 
             'file with "space and quotes".txt.THIS',
64
 
             'file with "space and quotes".txt.OTHER',
65
 
             '-o',
66
 
             'file with "space and quotes".txt'],
67
 
            args)
68
 
 
69
 
    def test_tempfile(self):
70
 
        self.build_tree(('test.txt', 'test.txt.BASE', 'test.txt.THIS',
71
 
                         'test.txt.OTHER'))
72
 
        cmd_list = ['some_tool', '{this_temp}']
73
 
        args, tmpfile = mergetools._subst_filename(cmd_list, 'test.txt')
74
 
        self.assertPathExists(tmpfile)
75
 
        os.remove(tmpfile)
76
 
 
77
 
 
78
 
class TestCheckAvailability(tests.TestCaseInTempDir):
79
 
 
80
 
    def test_full_path(self):
81
 
        self.assertTrue(mergetools.check_availability(sys.executable))
82
 
 
83
 
    def test_exe_on_path(self):
84
 
        self.assertTrue(mergetools.check_availability(
85
 
            os.path.basename(sys.executable)))
86
 
 
87
 
    def test_nonexistent(self):
88
 
        self.assertFalse(mergetools.check_availability('DOES NOT EXIST'))
89
 
 
90
 
    def test_non_executable(self):
91
 
        f, name = tempfile.mkstemp()
92
 
        try:
93
 
            self.log('temp filename: %s', name)
94
 
            self.assertFalse(mergetools.check_availability(name))
95
 
        finally:
96
 
            os.close(f)
97
 
            os.unlink(name)
98
 
 
99
 
 
100
 
class TestInvoke(tests.TestCaseInTempDir):
101
 
    def setUp(self):
102
 
        super(tests.TestCaseInTempDir, self).setUp()
103
 
        self._exe = None
104
 
        self._args = None
105
 
        self.build_tree_contents((
106
 
            ('test.txt', 'stuff'),
107
 
            ('test.txt.BASE', 'base stuff'),
108
 
            ('test.txt.THIS', 'this stuff'),
109
 
            ('test.txt.OTHER', 'other stuff'),
110
 
        ))
111
 
        
112
 
    def test_success(self):
113
 
        def dummy_invoker(exe, args, cleanup):
114
 
            self._exe = exe
115
 
            self._args = args
116
 
            cleanup(0)
117
 
            return 0
118
 
        retcode = mergetools.invoke('tool {result}', 'test.txt', dummy_invoker)
119
 
        self.assertEqual(0, retcode)
120
 
        self.assertEqual('tool', self._exe)
121
 
        self.assertEqual(['test.txt'], self._args)
122
 
    
123
 
    def test_failure(self):
124
 
        def dummy_invoker(exe, args, cleanup):
125
 
            self._exe = exe
126
 
            self._args = args
127
 
            cleanup(1)
128
 
            return 1
129
 
        retcode = mergetools.invoke('tool {result}', 'test.txt', dummy_invoker)
130
 
        self.assertEqual(1, retcode)
131
 
        self.assertEqual('tool', self._exe)
132
 
        self.assertEqual(['test.txt'], self._args)
133
 
 
134
 
    def test_success_tempfile(self):
135
 
        def dummy_invoker(exe, args, cleanup):
136
 
            self._exe = exe
137
 
            self._args = args
138
 
            self.assertPathExists(args[0])
139
 
            f = open(args[0], 'wt')
140
 
            f.write('temp stuff')
141
 
            f.close()
142
 
            cleanup(0)
143
 
            return 0
144
 
        retcode = mergetools.invoke('tool {this_temp}', 'test.txt',
145
 
                                    dummy_invoker)
146
 
        self.assertEqual(0, retcode)
147
 
        self.assertEqual('tool', self._exe)
148
 
        self.assertPathDoesNotExist(self._args[0])
149
 
        self.assertFileEqual('temp stuff', 'test.txt')
150
 
    
151
 
    def test_failure_tempfile(self):
152
 
        def dummy_invoker(exe, args, cleanup):
153
 
            self._exe = exe
154
 
            self._args = args
155
 
            self.assertPathExists(args[0])
156
 
            self.log(repr(args))
157
 
            f = open(args[0], 'wt')
158
 
            self.log(repr(f))
159
 
            f.write('temp stuff')
160
 
            f.close()
161
 
            cleanup(1)
162
 
            return 1
163
 
        retcode = mergetools.invoke('tool {this_temp}', 'test.txt',
164
 
                                    dummy_invoker)
165
 
        self.assertEqual(1, retcode)
166
 
        self.assertEqual('tool', self._exe)
167
 
        self.assertFileEqual('stuff', 'test.txt')