~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to tools/history2weaves.py

  • Committer: Martin Pool
  • Date: 2005-08-24 08:59:32 UTC
  • Revision ID: mbp@sourcefrog.net-20050824085932-c61f1f1f1c930e13
- Add a simple UIFactory 

  The idea of this is to let a client of bzrlib set some 
  policy about how output is displayed.

  In this revision all that's done is that progress bars
  are constructed by a policy established by the application
  rather than being randomly constructed in the library 
  or passed down the calls.  This avoids progress bars
  popping up while running the test suite and cleans up
  some code.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#! /usr/bin/python
 
2
 
 
3
# Copyright (C) 2005 Canonical Ltd
 
4
 
 
5
# This program is free software; you can redistribute it and/or modify
 
6
# it under the terms of the GNU General Public License as published by
 
7
# the Free Software Foundation; either version 2 of the License, or
 
8
# (at your option) any later version.
 
9
 
 
10
# This program is distributed in the hope that it will be useful,
 
11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
# GNU General Public License for more details.
 
14
 
 
15
# You should have received a copy of the GNU General Public License
 
16
# along with this program; if not, write to the Free Software
 
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
18
 
 
19
"""Experiment in converting existing bzr branches to weaves."""
 
20
 
 
21
try:
 
22
    import psyco
 
23
    psyco.full()
 
24
except ImportError:
 
25
    pass
 
26
 
 
27
 
 
28
import bzrlib.branch
 
29
from bzrlib.revfile import Revfile
 
30
from bzrlib.weave import Weave
 
31
from bzrlib.weavefile import read_weave, write_weave
 
32
from bzrlib.progress import ProgressBar
 
33
from bzrlib.atomicfile import AtomicFile
 
34
import tempfile
 
35
import hotshot, hotshot.stats
 
36
import sys
 
37
 
 
38
def convert():
 
39
    pb = ProgressBar()
 
40
 
 
41
    inv_weave = Weave()
 
42
 
 
43
    last_text_sha = {}
 
44
 
 
45
    # holds in-memory weaves for all files
 
46
    text_weaves = {}
 
47
 
 
48
    b = bzrlib.branch.find_branch('.')
 
49
 
 
50
    revno = 1
 
51
    rev_history = b.revision_history()
 
52
    last_idx = None
 
53
    inv_parents = []
 
54
    text_count = 0
 
55
    
 
56
    for rev_id in rev_history:
 
57
        pb.update('converting revision', revno, len(rev_history))
 
58
        
 
59
        inv_xml = b.get_inventory_xml(rev_id).readlines()
 
60
 
 
61
        new_idx = inv_weave.add(rev_id, inv_parents, inv_xml)
 
62
        inv_parents = [new_idx]
 
63
 
 
64
        tree = b.revision_tree(rev_id)
 
65
        inv = tree.inventory
 
66
 
 
67
        # for each file in the inventory, put it into its own revfile
 
68
        for file_id in inv:
 
69
            ie = inv[file_id]
 
70
            if ie.kind != 'file':
 
71
                continue
 
72
            if last_text_sha.get(file_id) == ie.text_sha1:
 
73
                # same as last time
 
74
                continue
 
75
            last_text_sha[file_id] = ie.text_sha1
 
76
 
 
77
            # new text (though possibly already stored); need to store it
 
78
            text_lines = tree.get_file(file_id).readlines()
 
79
 
 
80
            # if the file's created for the first time in this
 
81
            # revision then make a new weave; else find the old one
 
82
            if file_id not in text_weaves:
 
83
                text_weaves[file_id] = Weave()
 
84
                
 
85
            w = text_weaves[file_id]
 
86
 
 
87
            # base the new text version off whatever was last
 
88
            # (actually it'd be better to track this, to allow for
 
89
            # files that are deleted and then reappear)
 
90
            last = len(w)
 
91
            if last == 0:
 
92
                parents = []
 
93
            else:
 
94
                parents = [last-1]
 
95
 
 
96
            w.add(rev_id, parents, text_lines)
 
97
            text_count += 1
 
98
 
 
99
        revno += 1
 
100
 
 
101
    pb.clear()
 
102
    print '%6d revisions and inventories' % revno
 
103
    print '%6d texts' % text_count
 
104
 
 
105
    i = 0
 
106
    # TODO: commit them all atomically at the end, not one by one
 
107
    write_atomic_weave(inv_weave, 'weaves/inventory.weave')
 
108
    for file_id, file_weave in text_weaves.items():
 
109
        pb.update('writing weave', i, len(text_weaves))
 
110
        write_atomic_weave(file_weave, 'weaves/%s.weave' % file_id)
 
111
        i += 1
 
112
 
 
113
    pb.clear()
 
114
 
 
115
 
 
116
def write_atomic_weave(weave, filename):
 
117
    inv_wf = AtomicFile(filename)
 
118
    try:
 
119
        write_weave(weave, inv_wf)
 
120
        inv_wf.commit()
 
121
    finally:
 
122
        inv_wf.close()
 
123
 
 
124
    
 
125
 
 
126
 
 
127
def profile_convert(): 
 
128
    prof_f = tempfile.NamedTemporaryFile()
 
129
 
 
130
    prof = hotshot.Profile(prof_f.name)
 
131
 
 
132
    prof.runcall(convert) 
 
133
    prof.close()
 
134
 
 
135
    stats = hotshot.stats.load(prof_f.name)
 
136
    #stats.strip_dirs()
 
137
    stats.sort_stats('time')
 
138
    ## XXX: Might like to write to stderr or the trace file instead but
 
139
    ## print_stats seems hardcoded to stdout
 
140
    stats.print_stats(20)
 
141
            
 
142
 
 
143
if '-p' in sys.argv[1:]:
 
144
    profile_convert()
 
145
else:
 
146
    convert()
 
147