~abentley/bzrtools/bzrtools.dev

144 by aaron.bentley at utoronto
Added fetch-missing 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.
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
158 by Aaron Bentley
Updated to match API changes
16
from bzrlib.branch import Branch
216 by Aaron Bentley
Show branch location when using saved.
17
from bzrlib.errors import NoSuchRevision, InstallFailed, BzrCommandError
275.1.3 by Daniel Silverstone
Fix up fetch_ghosts to lock the branches, and to invoke bzr fix if it fetches any ghosts into the tree
18
def fetch_ghosts(branch, no_fix):
215 by Aaron Bentley
Renamed fetch-missing to fetch-ghosts.
19
    """Install ghosts from copies in another branch."""
234 by Aaron Bentley
Adopted Branch.open_containing's new format
20
    this_branch = Branch.open_containing('.')[0]
150 by abentley
Made fetch_missing use the x-pull file
21
    if branch is None:
163 by Aaron Bentley
switched fetch_missing to use 'parent', not 'x-pull'
22
        branch = this_branch.get_parent()
216 by Aaron Bentley
Show branch location when using saved.
23
        if branch is None:
24
            raise BzrCommandError('No branch specified and no location saved.')
25
        else:
26
            print "Using saved location %s" % branch
150 by abentley
Made fetch_missing use the x-pull file
27
234 by Aaron Bentley
Adopted Branch.open_containing's new format
28
    other_branch = Branch.open_containing(branch)[0]
144 by aaron.bentley at utoronto
Added fetch-missing command
29
    installed = []
30
    failed = []
275.1.3 by Daniel Silverstone
Fix up fetch_ghosts to lock the branches, and to invoke bzr fix if it fetches any ghosts into the tree
31
    lock_other = this_branch.base != other_branch.base
32
    
33
    this_branch.lock_write()
34
    try:
35
        if lock_other:
36
            other_branch.lock_read()
144 by aaron.bentley at utoronto
Added fetch-missing command
37
        try:
275.1.3 by Daniel Silverstone
Fix up fetch_ghosts to lock the branches, and to invoke bzr fix if it fetches any ghosts into the tree
38
            # Because iter_ghosts tests for existence after our last fetch
39
            # is complete, it won't falsely report an ancestor as a ghost.
40
            # Yay iterators!
41
            ghosts = iter_ghosts(this_branch)
42
            for revision in ghosts:
43
                try:
317 by Aaron Bentley
Fixed fetching code to use Branch.fetch
44
                    this_branch.fetch(other_branch, revision)
275.1.3 by Daniel Silverstone
Fix up fetch_ghosts to lock the branches, and to invoke bzr fix if it fetches any ghosts into the tree
45
                    installed.append(revision)
46
                except InstallFailed:
47
                    failed.append(revision)
286.1.1 by Aaron Bentley
Updates to match API changes
48
            else:
49
                if this_branch.last_revision() is None:
50
                    print "No revisions in branch."
275.1.3 by Daniel Silverstone
Fix up fetch_ghosts to lock the branches, and to invoke bzr fix if it fetches any ghosts into the tree
51
            if len(installed) > 0:
52
                print "Installed:"
53
                for rev in installed:
54
                    print rev
55
            if len(failed) > 0:
56
                print "Still missing:"
57
                for rev in failed:
58
                    print rev
59
        finally:
60
            if lock_other:
61
                other_branch.unlock()
62
    finally:
63
        this_branch.unlock()
144 by aaron.bentley at utoronto
Added fetch-missing command
64
275.1.3 by Daniel Silverstone
Fix up fetch_ghosts to lock the branches, and to invoke bzr fix if it fetches any ghosts into the tree
65
    if not no_fix and len(installed) > 0:
341 by Aaron Bentley
Switch fetch-ghosts from running "fix" to "reconcile"
66
        from bzrlib.builtins import cmd_reconcile
67
        cmd_reconcile().run(".")
275.1.3 by Daniel Silverstone
Fix up fetch_ghosts to lock the branches, and to invoke bzr fix if it fetches any ghosts into the tree
68
        
215 by Aaron Bentley
Renamed fetch-missing to fetch-ghosts.
69
def iter_ghosts(branch):
144 by aaron.bentley at utoronto
Added fetch-missing command
70
    """Find all ancestors that aren't stored in this branch."""
71
    seen = set()
208 by Aaron Bentley
Fixed last_revision calls
72
    lines = [branch.last_revision()]
286.1.1 by Aaron Bentley
Updates to match API changes
73
    if lines[0] is None:
74
        return
144 by aaron.bentley at utoronto
Added fetch-missing command
75
    while len(lines) > 0:
76
        new_lines = []
77
        for line in lines:
78
            if line in seen:
79
                continue
80
            seen.add(line)
81
            try:
310 by Aaron Bentley
Fixed fetch-ghosts
82
                revision = branch.repository.get_revision(line)
214 by Aaron Bentley
Got fetch_missing iterating properly. Can't actually fetch missing right now.
83
                new_lines.extend(revision.parent_ids)
144 by aaron.bentley at utoronto
Added fetch-missing command
84
            except NoSuchRevision:
85
                yield line
86
        lines = new_lines