~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()
663 by Aaron Bentley
Fix NotStandalone (#277652)
75
        e = self.assertRaises(NotStandalone, rspush, checkout,
76
                              'example.org:foo', _rsync=mock_rsync)
77
        self.assertContainsRe(str(e), '/checkout/ is not a standalone tree.$')
583 by Aaron Bentley
rspush requires standalone trees
78
79
    def test_refuse_checkout(self):
80
        branch = self.make_branch('tree')
81
        checkout = branch.create_checkout('checkout')
82
        checkout.commit('some changes')
83
        mock_rsync = MockRSync()
84
        self.assertRaises(NotStandalone, rspush, checkout, 'example.org:foo',
85
                          _rsync=mock_rsync)
86
87
    def test_refuse_shared(self):
88
        repo = self.make_repository('repo', shared=True)
89
        bzrdir = BzrDir.open('repo')
90
        bzrdir.create_branch()
91
        bzrdir.create_workingtree()
92
        tree = bzrdir.open_workingtree()
93
        tree.commit('some changes')
94
        mock_rsync = MockRSync()
95
        self.assertRaises(NotStandalone, rspush, tree, 'example.org:foo',
96
                          _rsync=mock_rsync)
606 by Aaron Bentley
Support branch6 formats in rspush
97
98
    def do_history_subset(self, format):
99
        tree_a = self.make_branch_and_tree('tree_a', format=format)
100
        tree_a.lock_write()
101
        self.addCleanup(tree_a.unlock)
102
        tree_a.commit('foo')
103
        tree_b = tree_a.bzrdir.sprout('tree_b').open_workingtree()
104
        tree_a.commit('bar')
105
        try:
106
            self.assertTrue(history_subset('tree_b/', tree_a.branch))
107
        except NoRsync:
108
            raise TestSkipped('rsync not installed')
109
        self.assertFalse(history_subset('tree_a/', tree_b.branch))
110
111
    def do_history_subset_no_commits(self, format):
112
        tree_a = self.make_branch_and_tree('tree_a', format=format)
113
        tree_b = self.make_branch_and_tree('tree_b', format=format)
114
        try:
115
            self.assertTrue(history_subset('tree_b/', tree_a.branch))
116
        except NoRsync:
117
            raise TestSkipped('rsync not installed')
118
119
    def test_history_subset_dirstate(self):
120
        self.do_history_subset('dirstate')
121
122
    def test_history_subset_no_commits_dirstate(self):
123
        self.do_history_subset_no_commits('dirstate')
124
125
    def test_history_subset_pack(self):
126
        self.do_history_subset('pack-0.92')
127
128
    def test_history_subset_no_commits_pack(self):
129
        self.do_history_subset_no_commits('pack-0.92')