/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
6651.3.1 by Jelmer Vernooij
Bundle the fetch-ghosts command as hidden command.
1
# Copyright (C) 2005 by 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.
6651.3.3 by Jelmer Vernooij
Fix source tests.
7
#
6651.3.1 by Jelmer Vernooij
Bundle the fetch-ghosts command as hidden command.
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.
6651.3.3 by Jelmer Vernooij
Fix source tests.
12
#
6651.3.1 by Jelmer Vernooij
Bundle the fetch-ghosts command as hidden command.
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
6651.3.3 by Jelmer Vernooij
Fix source tests.
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
17
from __future__ import absolute_import
6651.3.1 by Jelmer Vernooij
Bundle the fetch-ghosts command as hidden command.
18
7356.1.5 by Jelmer Vernooij
Use more ExitStacks.
19
from . import cleanup
6651.3.1 by Jelmer Vernooij
Bundle the fetch-ghosts command as hidden command.
20
from .branch import Branch
21
from .trace import note
7490.61.1 by Jelmer Vernooij
Rename BzrCommandError to CommandError.
22
from .errors import NoSuchRevision, CommandError
6651.3.1 by Jelmer Vernooij
Bundle the fetch-ghosts command as hidden command.
23
24
25
class GhostFetcher(object):
26
27
    @classmethod
6651.3.2 by Jelmer Vernooij
Move fetch_ghosts body, avoid print.
28
    def from_cmdline(cls, other):
6651.3.1 by Jelmer Vernooij
Bundle the fetch-ghosts command as hidden command.
29
        this_branch = Branch.open_containing('.')[0]
30
        if other is None:
31
            other = this_branch.get_parent()
32
            if other is None:
7490.61.1 by Jelmer Vernooij
Rename BzrCommandError to CommandError.
33
                raise CommandError('No branch specified and no location'
6651.3.1 by Jelmer Vernooij
Bundle the fetch-ghosts command as hidden command.
34
                                      ' saved.')
35
            else:
36
                note("Using saved location %s.", other)
37
        other_branch = Branch.open_containing(other)[0]
6651.3.2 by Jelmer Vernooij
Move fetch_ghosts body, avoid print.
38
        return cls(this_branch, other_branch)
6651.3.1 by Jelmer Vernooij
Bundle the fetch-ghosts command as hidden command.
39
40
    def __init__(self, this_branch, other_branch):
41
        self.this_branch = this_branch
42
        self.other_branch = other_branch
43
44
    def run(self):
45
        lock_other = self.this_branch.base != self.other_branch.base
7356.1.5 by Jelmer Vernooij
Use more ExitStacks.
46
        with cleanup.ExitStack() as exit_stack:
47
            exit_stack.enter_context(self.this_branch.lock_write())
6651.3.1 by Jelmer Vernooij
Bundle the fetch-ghosts command as hidden command.
48
            if lock_other:
7356.1.5 by Jelmer Vernooij
Use more ExitStacks.
49
                exit_stack.enter_context(self.other_branch.lock_read())
50
            return self._run_locked()
6651.3.1 by Jelmer Vernooij
Bundle the fetch-ghosts command as hidden command.
51
52
    def iter_ghosts(self):
53
        """Find all ancestors that aren't stored in this branch."""
54
        seen = set()
55
        lines = [self.this_branch.last_revision()]
56
        if lines[0] is None:
57
            return
58
        while len(lines) > 0:
59
            new_lines = []
60
            for line in lines:
61
                if line in seen:
62
                    continue
63
                seen.add(line)
64
                try:
65
                    revision = self.this_branch.repository.get_revision(line)
66
                    new_lines.extend(revision.parent_ids)
67
                except NoSuchRevision:
68
                    yield line
69
            lines = new_lines
70
71
    def _run_locked(self):
72
        installed = []
73
        failed = []
74
        if self.this_branch.last_revision() is None:
75
            print("No revisions in branch.")
76
            return
77
        # Because iter_ghosts tests for existence after our last fetch
78
        # is complete, it won't falsely report an ancestor as a ghost.
79
        # Yay iterators!
80
        ghosts = self.iter_ghosts()
81
        for revision in ghosts:
82
            try:
83
                self.this_branch.fetch(self.other_branch, revision)
84
                installed.append(revision)
85
            except NoSuchRevision:
86
                failed.append(revision)
87
        return installed, failed