~abentley/bzrtools/bzrtools.dev

583 by Aaron Bentley
rspush requires standalone trees
1
# Copyright (C) 2007 Aaron Bentley
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
606 by Aaron Bentley
Support branch6 formats in rspush
18
import os
19
583 by Aaron Bentley
rspush requires standalone trees
20
from bzrlib.bzrdir import BzrDir
606 by Aaron Bentley
Support branch6 formats in rspush
21
from bzrlib.tests import TestCaseWithTransport, TestSkipped
583 by Aaron Bentley
rspush requires standalone trees
22
606 by Aaron Bentley
Support branch6 formats in rspush
23
from bzrlib.plugins.bzrtools.bzrtools import (
24
    history_subset,
25
    NoRsync,
26
    NotStandalone,
27
    rspush,
28
    rsync,
29
    RsyncNoFile,
30
)
583 by Aaron Bentley
rspush requires standalone trees
31
32
33
class MockRSync(object):
34
35
    def __init__(self):
36
        self.calls = []
37
38
    def __call__(self, source, target, **kwargs):
39
        self.calls.append((source, target, kwargs))
40
        if target.endswith('revision-history'):
41
            output = open(target, 'wb')
42
            output.close()
43
44
45
class TestRSPush(TestCaseWithTransport):
46
606 by Aaron Bentley
Support branch6 formats in rspush
47
    def test_rsync(self):
48
        cwd = os.getcwd()
49
        try:
50
            self.assertRaises(RsyncNoFile, rsync, "a", "b", silent=True)
51
        except NoRsync:
52
            raise TestSkipped('rsync not installed')
53
        self.assertRaises(RsyncNoFile, rsync, cwd + "/a", cwd + "/b",
54
                          excludes=("*.py",), silent=True)
55
        self.assertRaises(NoRsync, rsync, cwd + "/a", cwd + "/b",
56
                          excludes=("*.py",), silent=True,
57
                          rsync_name="rsyncc")
58
583 by Aaron Bentley
rspush requires standalone trees
59
    def test_rspush_locking(self):
60
        tree = self.make_branch_and_tree('tree', format='dirstate-tags')
61
        tree.commit('some changes')
62
        mock_rsync = MockRSync()
63
        rspush(tree, 'example.org:foo', _rsync=mock_rsync)
584 by Aaron Bentley
Fix rspush lock error when excluding working tree
64
        rspush(tree, 'example.org:foo', working_tree = False,
65
               _rsync=mock_rsync)
583 by Aaron Bentley
rspush requires standalone trees
66
        tree2 = self.make_branch_and_tree('tree2',
592 by Aaron Bentley
Fix old format name
67
                                          format='pack-0.92')
583 by Aaron Bentley
rspush requires standalone trees
68
        rspush(tree2, 'example.org:foo', _rsync=mock_rsync)
69
70
    def test_refuse_lightweight_checkout(self):
71
        branch = self.make_branch('tree')
72
        checkout = branch.create_checkout('checkout', lightweight=True)
73
        checkout.commit('some changes')
74
        mock_rsync = MockRSync()
75
        self.assertRaises(NotStandalone, rspush, checkout, 'example.org:foo',
76
                          _rsync=mock_rsync)
77
78
    def test_refuse_checkout(self):
79
        branch = self.make_branch('tree')
80
        checkout = branch.create_checkout('checkout')
81
        checkout.commit('some changes')
82
        mock_rsync = MockRSync()
83
        self.assertRaises(NotStandalone, rspush, checkout, 'example.org:foo',
84
                          _rsync=mock_rsync)
85
86
    def test_refuse_shared(self):
87
        repo = self.make_repository('repo', shared=True)
88
        bzrdir = BzrDir.open('repo')
89
        bzrdir.create_branch()
90
        bzrdir.create_workingtree()
91
        tree = bzrdir.open_workingtree()
92
        tree.commit('some changes')
93
        mock_rsync = MockRSync()
94
        self.assertRaises(NotStandalone, rspush, tree, 'example.org:foo',
95
                          _rsync=mock_rsync)
606 by Aaron Bentley
Support branch6 formats in rspush
96
97
    def do_history_subset(self, format):
98
        tree_a = self.make_branch_and_tree('tree_a', format=format)
99
        tree_a.lock_write()
100
        self.addCleanup(tree_a.unlock)
101
        tree_a.commit('foo')
102
        tree_b = tree_a.bzrdir.sprout('tree_b').open_workingtree()
103
        tree_a.commit('bar')
104
        try:
105
            self.assertTrue(history_subset('tree_b/', tree_a.branch))
106
        except NoRsync:
107
            raise TestSkipped('rsync not installed')
108
        self.assertFalse(history_subset('tree_a/', tree_b.branch))
109
110
    def do_history_subset_no_commits(self, format):
111
        tree_a = self.make_branch_and_tree('tree_a', format=format)
112
        tree_b = self.make_branch_and_tree('tree_b', format=format)
113
        try:
114
            self.assertTrue(history_subset('tree_b/', tree_a.branch))
115
        except NoRsync:
116
            raise TestSkipped('rsync not installed')
117
118
    def test_history_subset_dirstate(self):
119
        self.do_history_subset('dirstate')
120
121
    def test_history_subset_no_commits_dirstate(self):
122
        self.do_history_subset_no_commits('dirstate')
123
124
    def test_history_subset_pack(self):
125
        self.do_history_subset('pack-0.92')
126
127
    def test_history_subset_no_commits_pack(self):
128
        self.do_history_subset_no_commits('pack-0.92')