source: trunk/lib/Node.h @ 497

Last change on this file since 497 was 497, checked in by Peter Johansson, 14 years ago

preparing for more statistics by adding StatsType layer in structure on top of previous structure, i.e., NewStructure? = StatsType/OldStructure?

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 5.9 KB
Line 
1#ifndef _theplu_svndigest_node_
2#define _theplu_svndigest_node_
3
4// $Id: Node.h 497 2007-10-14 04:58:06Z peter $
5
6/*
7  Copyright (C) 2005, 2006, 2007 Jari Häkkinen, Peter Johansson
8
9  This file is part of svndigest, http://trac.thep.lu.se/trac/svndigest
10
11  svndigest is free software; you can redistribute it and/or modify it
12  under the terms of the GNU General Public License as published by
13  the Free Software Foundation; either version 2 of the License, or
14  (at your option) any later version.
15
16  svndigest is distributed in the hope that it will be useful, but
17  WITHOUT ANY WARRANTY; without even the implied warranty of
18  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19  General Public License for more details.
20
21  You should have received a copy of the GNU General Public License
22  along with this program; if not, write to the Free Software
23  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
24  02111-1307, USA.
25*/
26
27#include "html_utility.h"
28#include "ClassicStats.h"
29#include "SVNinfo.h"
30#include "SVNlog.h"
31#include "utility.h"
32
33#include <map>
34#include <ostream>
35#include <stdexcept>
36#include <string>
37
38namespace theplu{
39namespace svndigest{
40
41  class Alias;
42
43  ///
44  /// If something goes wrong in the use of the Node or its derived
45  /// classes, a NodeException is thrown.
46  ///
47  struct NodeException : public std::runtime_error
48  { inline NodeException(const std::string& msg) : runtime_error(msg) {} };
49
50  ///
51  /// Abstract Base Class for files.
52  ///
53  class Node
54  {
55  public:
56
57    ///
58    /// @brief Constructor
59    ///
60    Node(const u_int, const std::string&, const std::string&);
61
62    ///
63    /// @brief Destructor
64    ///
65    virtual ~Node(void);
66
67    ///
68    /// @brief Get the author of the latest commit.
69    ///
70    std::string author(void) const;
71
72
73    /**
74       @brief Check whether node is binary.
75
76       @return True if node is binary.
77    */
78    inline bool binary(void) const { return binary_; }
79
80    ///
81    /// @return true if directory
82    ///
83    virtual bool dir(void) const;
84
85    ///
86    /// @return href to this node
87    ///
88    virtual std::string href(void) const=0;
89
90    void html_tablerow(std::ostream&, const std::string&, 
91                       const std::string& user) const;
92
93    /**
94       @brief Check whether node should be ignored in statistics.
95
96       If a node is to be ignored the statistics implementer should
97       respect this state. Currently binary files and items with
98       property svndigest:ignore are to be ignored by svndigest. If
99       the node is a directory then the direcotry and its siblings
100       should be ignored by statistics.
101
102       @return True of node should be ignored by statistics.
103
104       @see SVNproperty::svndigest_ingorable
105    */
106    inline bool ignore(void) const 
107    { return binary_ || svndigest_ignore_ || link_; }
108
109    ///
110    /// @brief Get the revision number of the latest commit.
111    ///
112    svn_revnum_t last_changed_rev(void) const;
113
114    /**
115       @return log of this node in a recursive manner.
116    */
117    const SVNlog& log(void) const;
118
119    /**
120       @return The explicit string identifying the underlying derived
121       class.
122    */
123    virtual std::string node_type(void) const=0;
124
125    ///
126    /// @return
127    ///
128    inline const std::string& local_path(void) const { return local_path_; }
129
130    ///
131    /// Function returning everything after the last '/'
132    ///
133    /// @return name of node (not full path)
134    ///
135    std::string name(void) const;
136
137    /**
138       Note that returned string always end with '/' with the
139       exception when an empty string is returned.
140
141       @return output dir for example 'lib/' for this file
142     */
143    std::string output_dir(void) const;
144
145    /**
146       @return output path for example 'lib/Node.h.html' for this file
147     */
148    virtual std::string output_path(void) const=0;
149
150    ///
151    /// @brief parsing file using svn blame.
152    ///
153    virtual const ClassicStats& parse(const bool verbose=false)=0;
154
155    ///
156    /// @todo doc
157    ///
158    inline const std::string& path(void) const { return path_; }
159
160    ///
161    /// Function printing HTML in current working directory
162    ///
163    void print(const bool verbose=false) const;
164
165    void print_author_summary(std::ostream&, std::string, const SVNlog&) const; 
166
167    virtual void print_copyright(std::map<std::string,Alias>&, bool) const=0;
168
169    /**
170       @brief Check if item used to create this object has been
171       assigned property svndigest:ignore.
172
173       Currently files with property svndigest:ignore are to be
174       ignored by svndigest. It is the responsibility of the
175       statistics implementer to obey the ignore state.
176
177       @return True if item property svndigest:ignore was set.
178    */
179    inline bool svndigest_ignore(void) const { return svndigest_ignore_; }
180
181    /**
182       \see SVNinfo::url(void)
183    */
184    std::string url(void) const;
185   
186  protected:
187
188    virtual SVNlog log_core(void) const=0;
189
190    ///
191    /// print path in html format (with anchors) to @a os
192    ///
193    void path_anchor(std::ostream& os) const; 
194
195    u_int level_;
196    std::string local_path_; // path from root
197    std::string output_dir_;
198    std::string path_; // absolute path
199    static std::string project_;
200    ClassicStats stats_;
201
202  private:
203    ///
204    /// @brief Copy Constructor, not implemented
205    ///
206    Node(const Node&);
207
208    virtual void print_core(bool verbose=false) const=0;
209
210    ///
211    /// print page for specific user (or all) and specific line_style
212    /// (or total).
213    ///
214    virtual void print_core(const std::string& stats_type,
215                            const std::string& user, 
216                            const std::string& line_type,
217                            const SVNlog&) const=0; 
218
219    bool binary_;
220    bool link_;
221    mutable SVNlog* log_;
222    bool svndigest_ignore_;
223    SVNinfo svninfo_;
224  };
225
226  /**
227     \brief Functor class to compare pointers of Nodes
228  */
229  struct NodePtrLess
230  {
231    /**
232       @return true if first and second are of same type (Directory or
233       File) and name of first is (alphabetically) less than name of
234       second; or if first is a Directory and second is a File.
235     */
236    inline bool operator()(const Node* first, const Node* second) const
237    {   
238      if (first->dir()==second->dir())
239        return first->name()<second->name();
240      return first->dir();
241    }
242  };
243
244}} // end of namespace svndigest and namespace theplu
245
246#endif
Note: See TracBrowser for help on using the repository browser.