source: trunk/lib/Stats.h @ 1122

Last change on this file since 1122 was 1122, checked in by Peter Johansson, 11 years ago

added line in config file describing config used to create cache (refs
#433). If config is different from the current one, the cache is
ignored and stats are retrieved from repo. Restructured code a bit to
allow loading old cache files; the first line (in cache) is used to
decide which function to use for the loading. Cache files VERSION 7
and newer are supported and older are ignored (refs #289).

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 7.8 KB
Line 
1#ifndef _theplu_svndigest_stats_
2#define _theplu_svndigest_stats_
3
4// $Id: Stats.h 1122 2010-07-07 04:00:11Z peter $
5
6/*
7  Copyright (C) 2005 Peter Johansson
8  Copyright (C) 2006, 2007, 2008 Jari Häkkinen, Peter Johansson
9  Copyright (C) 2010 Peter Johansson
10
11  This file is part of svndigest, http://dev.thep.lu.se/svndigest
12
13  svndigest is free software; you can redistribute it and/or modify it
14  under the terms of the GNU General Public License as published by
15  the Free Software Foundation; either version 3 of the License, or
16  (at your option) any later version.
17
18  svndigest is distributed in the hope that it will be useful, but
19  WITHOUT ANY WARRANTY; without even the implied warranty of
20  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21  General Public License for more details.
22
23  You should have received a copy of the GNU General Public License
24  along with svndigest. If not, see <http://www.gnu.org/licenses/>.
25*/
26
27#include "LineTypeParser.h"
28
29#include <subversion-1/svn_types.h>
30
31#include <map>
32#include <istream>
33#include <set>
34#include <string>
35#include <vector>
36
37namespace theplu{
38namespace svndigest{
39
40  ///
41  /// Class taking care of statistics from svn.
42  ///
43  class Stats
44  {
45  public:
46    ///
47    /// @brief Default Constructor
48    ///
49    explicit Stats(const std::string& path);
50
51    /**
52       \brief Destructor
53    */
54    virtual ~Stats(void);
55
56    ///
57    /// @brief adding \a n line(s) to \a user from \a revision to the stats
58    ///
59    void add(const std::string& user, const unsigned int& revision,
60             const LineTypeParser::line_type&, unsigned int n=1); 
61
62    ///
63    /// @return set of authors
64    ///
65    const std::set<std::string>& authors(void) const;
66
67    ///
68    /// \return number of code lines for \a user for latest revision.
69    ///
70    unsigned int code(const std::string& user="all") const; 
71
72
73    ///
74    /// \return number of comments lines for \a user for latest revision.
75    ///
76    unsigned int comments(const std::string& user="all") const; 
77
78    ///
79    /// \return number of empty lines for \a user for latest revision.
80    ///
81    unsigned int empty(const std::string& user="all") const; 
82
83    ///
84    /// \return revison node was modified
85    ///
86    svn_revnum_t last_changed_rev(void) const;
87
88    ///
89    /// \return number of lines for \a user for latest revision
90    ///
91    unsigned int lines(const std::string& user="all") const; 
92
93    /**
94       Load object from a stream.
95       
96       \return revision the cache represents - 0 if failed
97     */
98    svn_revnum_t load_cache(std::istream&);
99
100    /**
101       Do the parsing for \a path. Revisions from \a rev will be parsed.
102    */
103    void parse(const std::string& path, svn_revnum_t rev=0);
104
105    ///
106    /// Create statistics graph.
107    ///
108    std::string plot(const std::string&, const std::string&) const;
109
110    ///
111    /// Plotting code, comment, other, and total in same plot (for
112    /// 'all' not individual authors).
113    ///
114    void plot_summary(const std::string& output) const;
115
116    /**
117       Send Stats to a stream.
118     */
119    void print(std::ostream&) const;
120
121    ///
122    /// @brief Clear all statistics
123    ///
124    void reset(void); 
125
126    ///
127    /// \return latest revision for whole project
128    ///
129    svn_revnum_t revision(void) const { return revision_; }
130
131    /**
132       \return resulting Stats
133    */
134    Stats& operator+=(const Stats&);
135
136    /**
137       \return number of lines for \a author and \a linetype from
138       revision \a rev.
139
140       \throw if \a author does not exist
141     */
142    size_t operator()(int linetype, std::string author, svn_revnum_t rev) const;
143
144  protected:
145    typedef std::map<std::string, std::vector<unsigned int> > Author2Vector;
146    typedef Author2Vector::iterator A2VIter;
147    typedef Author2Vector::const_iterator A2VConstIter;
148
149    /**
150       Calculate accumalated statistics for fundamental statistics,
151       i.e., code, comment, empty, and copyright for each author.
152       \see accumulate
153     */
154    void accumulate_stats(svn_revnum_t rev=1);
155    void add_author(std::string);
156    void add_authors(std::set<std::string>::const_iterator, 
157                     std::set<std::string>::const_iterator);
158
159    // references to data
160    inline Author2Vector& code_stats(void) 
161    { return stats_[LineTypeParser::code]; }
162    inline Author2Vector& comment_stats(void) 
163    { return stats_[LineTypeParser::comment]; }
164    inline Author2Vector& copyright_stats(void) 
165    { return stats_[LineTypeParser::copyright]; }
166    inline Author2Vector& other_stats(void) 
167    { return stats_[LineTypeParser::other]; }
168    inline Author2Vector& comment_or_copy_stats(void) 
169    { return stats_[LineTypeParser::comment_or_copy]; }
170    inline Author2Vector& total_stats(void) 
171    { return stats_[LineTypeParser::total]; }
172
173    // const references to data
174    inline const Author2Vector& code_stats(void) const
175    { return stats_[LineTypeParser::code]; }
176    inline const Author2Vector& comment_stats(void) const
177    { return stats_[LineTypeParser::comment]; }
178    inline const Author2Vector& copyright_stats(void) const
179    { return stats_[LineTypeParser::copyright]; }
180    inline const Author2Vector& other_stats(void) const
181    { return stats_[LineTypeParser::other]; }
182    inline const Author2Vector& comment_or_copy_stats(void) const
183    { return stats_[LineTypeParser::comment_or_copy]; }
184    inline const Author2Vector& total_stats(void) const
185    { return stats_[LineTypeParser::total]; }
186
187    /**
188       add range [\a first, \a last) to \a map
189     */
190    void map_add(Author2Vector::const_iterator first, 
191                 Author2Vector::const_iterator last,
192                 Author2Vector& map);
193
194    std::set<std::string> authors_;
195
196    const std::vector<unsigned int>& get_vector(const Author2Vector&, 
197                                         std::string user) const;
198  private:
199    /// one liner used in cache file to validate that cache file was
200    /// created current configuration
201    std::string config_code_;
202
203    /**
204       \a vec is resized to revision().
205       vec is accumulated such that
206       vec[rev] = vec[rev-1] + vec[rev]
207       vec[rev+1] = vec[rev] + vec[rev+1]
208       et cetera
209     */
210    void accumulate(std::vector<unsigned int>& vec,
211                    svn_revnum_t rev=1) const;
212    void add(std::vector<unsigned int>& vec, unsigned int rev, bool x,
213             unsigned int n);
214
215    /**
216       Parse statistics for fundamental categories, i.e., code,
217       comment, empty, and copyright for each author. Ignore revisions
218       earlier than \a first_rev.
219     */
220    virtual void do_parse(const std::string&, svn_revnum_t first_rev)=0;
221   
222    /// load cache file version 7
223    svn_revnum_t load_cache7(std::istream&);
224    /// load cache file version 8
225    svn_revnum_t load_cache8(std::istream&);
226
227    /**
228       called from plot(2)
229     */
230    void plot(const std::string& basename, const std::string& linetype,
231              const std::string& format) const;
232
233    /**
234       called from plot_summary(1)
235     */
236    void plot_summary(const std::string& basename, 
237                      const std::string& format) const;
238
239    // Change this string if cache format is changed in such a way
240    // that all old cache files are obsolete.
241    inline std::string cache_check_str(void) const 
242    {return "CACHE FILE VERSION 7";} 
243
244    void calc_all(void);
245    void calc_comment_or_copy(void);
246    void calc_total(void);
247    unsigned int get_back(const Author2Vector&, std::string user) const;
248    void load(std::istream& is, Author2Vector& m);
249    /**
250       Finds the largets element by iterating through the entire
251       vector. Inherited classes should implement their own version
252       when it is possible to get the largest element in faster than
253       in linear time.
254
255       \return the largest largest element in \a v.
256    */
257    virtual unsigned int max_element(const std::vector<unsigned int>& v) const; 
258
259    void print(std::ostream& os, const Author2Vector& m) const;
260
261    svn_revnum_t revision_; // Should be the latest revision for whole project
262    svn_revnum_t last_changed_rev_; // Should be the latest revision for file
263
264    std::vector<Author2Vector> stats_; // from linetype to a2v
265
266    // using compiler generated copy constructor
267    //Stats(const Stats&);
268    // no assignment
269    Stats& operator=(const Stats&);
270
271  };
272}} // end of namespace svndigest end of namespace theplu
273
274#endif
Note: See TracBrowser for help on using the repository browser.