/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to contrib/convert_to_1.9.py

  • Committer: John Arbash Meinel
  • Date: 2009-06-18 18:18:36 UTC
  • mto: This revision was merged to the branch mainline in revision 4461.
  • Revision ID: john@arbash-meinel.com-20090618181836-biodfkat9a8eyzjz
The new add_inventory_by_delta is returning a CHKInventory when mapping from NULL
Which is completely valid, but 'broke' one of the tests.
So to fix it, changed the test to use CHKInventories on both sides, and add an __eq__
member. The nice thing is that CHKInventory.__eq__ is fairly cheap, since it only
has to check the root keys.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/env python
 
2
"""Convert a pack-0.92 repository into a 1.9 (btree) repository.
 
3
 
 
4
This works directly on the indices, rather than using the generic conversion
 
5
logic. After conversion, it will have backed up your old indices to
 
6
.bzr/repository/indices-gi. This is significantly faster than the generic 'bzr
 
7
upgrade' but it does not work for all repository formats (only pack format
 
8
repositories are supported).
 
9
"""
 
10
 
 
11
 
 
12
steps_to_revert = []
 
13
def add_revert_step(func, *args, **kwargs):
 
14
    steps_to_revert.append((func, args, kwargs))
 
15
 
 
16
def do_revert():
 
17
    print "** Reverting repository"
 
18
    for func, args, kwargs in reversed(steps_to_revert):
 
19
        func(*args, **kwargs)
 
20
 
 
21
 
 
22
def main(args):
 
23
    import optparse
 
24
    p = optparse.OptionParser(usage='%prog [options]\n' + __doc__)
 
25
 
 
26
    opts, args = p.parse_args(args)
 
27
 
 
28
    from bzrlib import ui, trace, repository
 
29
    from bzrlib.ui import text
 
30
    from bzrlib.repofmt import pack_repo
 
31
    ui.ui_factory = text.TextUIFactory()
 
32
    trace.enable_default_logging()
 
33
 
 
34
    trace.note('processing "."')
 
35
 
 
36
    fmt = getattr(pack_repo, 'RepositoryFormatKnitPack6', None)
 
37
    if fmt is None:
 
38
        trace.note("** Your bzrlib does not have RepositoryFormatPack6 (--1.9)")
 
39
        trace.note("   upgrade your bzrlib installation.")
 
40
        return
 
41
 
 
42
    r = repository.Repository.open('.')
 
43
    if isinstance(r._format, (pack_repo.RepositoryFormatKnitPack1, # 0.92
 
44
                              pack_repo.RepositoryFormatKnitPack5, # 1.6
 
45
                              )):
 
46
        fmt = pack_repo.RepositoryFormatKnitPack6
 
47
    elif isinstance(r._format, (pack_repo.RepositoryFormatKnitPack4, # rich-root-pack
 
48
                                pack_repo.RepositoryFormatKnitPack5RichRoot, # 1.6.1-rich-root
 
49
                               )):
 
50
        fmt = pack_repo.RepositoryFormatKnitPack6RichRoot
 
51
    elif isinstance(r._format, (pack_repo.RepositoryFormatKnitPack6, # 1.9
 
52
                                pack_repo.RepositoryFormatKnitPack6RichRoot, # 1.9-rich-root
 
53
                               )):
 
54
        trace.note("Repository is already upgraded to: %s", r._format)
 
55
        return
 
56
    else:
 
57
        trace.note("** Do not know how to upgrade a repository of format:")
 
58
        trace.note("   %s", (r._format,))
 
59
        return
 
60
 
 
61
    t = r._transport
 
62
    t.rename('format', 'format-gi')
 
63
    add_revert_step(t.rename, 'format-gi', 'format')
 
64
    t.put_bytes('format',
 
65
        'Bazaar Repository Upgrade to 1.9 (%s) in progress\n' % (fmt,))
 
66
    add_revert_step(t.delete, 'format')
 
67
    pb = ui.ui_factory.nested_progress_bar()
 
68
    try:
 
69
        do_upgrade(r, fmt, pb)
 
70
    except:
 
71
        do_revert()
 
72
        pb.finished()
 
73
        raise
 
74
    pb.finished()
 
75
 
 
76
 
 
77
def do_upgrade(r, fmt, pb):
 
78
    from bzrlib import errors, repository, transport, ui, index, btree_index
 
79
    from bzrlib.repofmt import pack_repo
 
80
    t = r._transport
 
81
    index_t = t.clone('indices')
 
82
    btree_index_t = t.clone('indices-btree')
 
83
 
 
84
    try:
 
85
      btree_index_t.mkdir('.')
 
86
    except errors.FileExists:
 
87
      pass
 
88
 
 
89
    names_to_sizes = {}
 
90
    files = index_t.list_dir('.')
 
91
    step_count = len(files)*2
 
92
    for idx, n in enumerate(files):
 
93
        gi = index.GraphIndex(index_t, n, index_t.stat(n).st_size)
 
94
        key_count = gi.key_count()
 
95
        msg = 'copying %s (%5d)' % (n, key_count)
 
96
        pb.update(msg, 2*idx, step_count)
 
97
        new_bi = btree_index.BTreeBuilder(gi.node_ref_lists, gi._key_length)
 
98
        new_bi.add_nodes(x[1:] for x in gi.iter_all_entries())
 
99
        pb.update(msg, 2*idx+1, step_count)
 
100
        size = btree_index_t.put_file(n, new_bi.finish())
 
101
        names_to_sizes[n] = size
 
102
 
 
103
 
 
104
    ext_to_offset = {'rix':0, 'iix':1, 'tix':2, 'six':3}
 
105
    base_to_sizes = {}
 
106
    for n, size in names_to_sizes.iteritems():
 
107
        base, ext = n.split('.')
 
108
        sizes = base_to_sizes.setdefault(base, [None, None, None, None])
 
109
        sizes[ext_to_offset[ext]] = size
 
110
 
 
111
    # We upgrade all index files, but all of them may not be referenced by
 
112
    # pack-names, so make sure to only include the referenced ones.
 
113
    pack_name_gi = index.GraphIndex(t, 'pack-names', None)
 
114
    pack_name_gi.key_count() # Parse the header
 
115
    pack_name_bi = btree_index.BTreeBuilder(pack_name_gi.node_ref_lists,
 
116
                                            pack_name_gi._key_length)
 
117
    for index, key, value in pack_name_gi.iter_all_entries():
 
118
        for x in base_to_sizes[key[0]]:
 
119
            assert x is not None
 
120
        new_value = ' '.join(map(str, base_to_sizes[key[0]]))
 
121
        pack_name_bi.add_node(key, new_value)
 
122
 
 
123
    t.put_file('pack-names-btree', pack_name_bi.finish())
 
124
 
 
125
    del r
 
126
    # While we swap everything out, block other clients.
 
127
    t.rename('pack-names', 'pack-names-gi')
 
128
    add_revert_step(t.rename, 'pack-names-gi', 'pack-names')
 
129
    t.rename('indices', 'indices-gi')
 
130
    add_revert_step(t.rename, 'indices-gi', 'indices')
 
131
    t.rename('pack-names-btree', 'pack-names')
 
132
    add_revert_step(t.rename, 'pack-names', 'pack-names-btree')
 
133
    t.rename('indices-btree', 'indices')
 
134
    add_revert_step(t.rename, 'indices', 'indices-btree')
 
135
    t.put_bytes('format', fmt().get_format_string())
 
136
    # format will be deleted by the earlier steps
 
137
 
 
138
 
 
139
if __name__ == '__main__':
 
140
    import sys
 
141
    main(sys.argv[1:])