/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5195.3.31 by Parth Malwankar
close review comments from jam.
1
# Copyright (C) 2010 Canonical Ltd
5195.3.17 by Parth Malwankar
remote push now shows estimated work.
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6379.6.3 by Jelmer Vernooij
Use absolute_import.
16
6379.6.7 by Jelmer Vernooij
Move importing from future until after doc string, otherwise the doc string will disappear.
17
"""Record counting support for showing progress of revision fetch."""
18
6379.6.3 by Jelmer Vernooij
Use absolute_import.
19
from __future__ import absolute_import
20
5195.3.31 by Parth Malwankar
close review comments from jam.
21
5195.3.17 by Parth Malwankar
remote push now shows estimated work.
22
class RecordCounter(object):
5195.3.21 by Parth Malwankar
Documentation and cleanup for RecordCounter
23
    """Container for maintains estimates of work requires for fetch.
24
25
    Instance of this class is used along with a progress bar to provide
26
    the user an estimate of the amount of work pending for a fetch (push,
27
    pull, branch, checkout) operation.
28
    """
7143.15.2 by Jelmer Vernooij
Run autopep8.
29
5195.3.17 by Parth Malwankar
remote push now shows estimated work.
30
    def __init__(self):
31
        self.initialized = False
32
        self.current = 0
33
        self.key_count = 0
34
        self.max = 0
5195.3.33 by Parth Malwankar
added comments on choice of STEP value and estimate multiplies
35
36
        # Users of RecordCounter instance update progress bar every
37
        # _STEP_ records. We choose are reasonably high number to keep
5289.1.1 by Parth Malwankar
reduced STEP in recordcounter to allow more frequent updates
38
        # display updates from being too frequent. This is an odd number
5195.3.33 by Parth Malwankar
added comments on choice of STEP value and estimate multiplies
39
        # to ensure that the last digit of the records fetched in
40
        # fetches vs estimate ratio changes periodically.
5289.1.1 by Parth Malwankar
reduced STEP in recordcounter to allow more frequent updates
41
        self.STEP = 7
5195.3.17 by Parth Malwankar
remote push now shows estimated work.
42
43
    def is_initialized(self):
44
        return self.initialized
45
5195.3.21 by Parth Malwankar
Documentation and cleanup for RecordCounter
46
    def _estimate_max(self, key_count):
47
        """Estimate the maximum amount of 'inserting stream' work.
48
49
        This is just an estimate.
50
        """
51
        # Note: The magic number below is based of empirical data
52
        # based on 3 seperate projects. Estimatation can probably
53
        # be improved but this should work well for most cases.
5195.3.33 by Parth Malwankar
added comments on choice of STEP value and estimate multiplies
54
        # The project used for the estimate (with approx. numbers) were:
55
        # lp:bzr with records_fetched = 7 * revs_required
56
        # lp:emacs with records_fetched = 8 * revs_required
57
        # bzr-svn checkout of lp:parrot = 10.63 * revs_required
58
        # Hence, 10.3 was chosen as for a realistic progress bar as:
59
        # 1. If records fetched is is lower than 10.3x then we simply complete
60
        #    with 10.3x. Under promise, over deliver.
61
        # 2. In case of remote fetch, when we start the count fetch vs estimate
62
        #    display with revs_required/estimate, having a multiplier with a
63
        #    decimal point produces a realistic looking _estimate_ number rather
64
        #    than using something like 3125/31250 (for 10x)
65
        # 3. Based on the above data, the possibility of overshooting this
66
        #    factor is minimal, and in case of an overshoot the estimate value
67
        #    should not need to be corrected too many times.
5195.3.21 by Parth Malwankar
Documentation and cleanup for RecordCounter
68
        return int(key_count * 10.3)
69
5195.3.24 by Parth Malwankar
progress indicator for local branch.
70
    def setup(self, key_count, current=0):
5195.3.21 by Parth Malwankar
Documentation and cleanup for RecordCounter
71
        """Setup RecordCounter with basic estimate of work pending.
72
73
        Setup self.max and self.current to reflect the amount of work
74
        pending for a fetch.
75
        """
5195.3.17 by Parth Malwankar
remote push now shows estimated work.
76
        self.current = current
77
        self.key_count = key_count
5195.3.21 by Parth Malwankar
Documentation and cleanup for RecordCounter
78
        self.max = self._estimate_max(key_count)
5195.3.17 by Parth Malwankar
remote push now shows estimated work.
79
        self.initialized = True
80
81
    def increment(self, count):
5195.3.21 by Parth Malwankar
Documentation and cleanup for RecordCounter
82
        """Increment self.current by count.
83
84
        Apart from incrementing self.current by count, also ensure
85
        that self.max > self.current.
86
        """
5195.3.17 by Parth Malwankar
remote push now shows estimated work.
87
        self.current += count
88
        if self.current > self.max:
89
            self.max += self.key_count