Support 'description' field in the create repository rule.
[svn2git:sdoerners-svn2git.git] / src / ruleparser.h
1 /*
2  *  Copyright (C) 2007  Thiago Macieira <thiago@kde.org>
3  *
4  *  This program is free software: you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation, either version 3 of the License, or
7  *  (at your option) any later version.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17
18 #ifndef RULEPARSER_H
19 #define RULEPARSER_H
20
21 #include <QList>
22 #include <QMap>
23 #include <QRegExp>
24 #include <QString>
25 #include <QStringList>
26 #include <QStringBuilder>
27
28 class Rules
29 {
30 public:
31     struct Rule
32     {
33         QString filename;
34         int lineNumber;
35         Rule() : lineNumber(0) {}
36     };
37     struct Repository : Rule
38     {
39         struct Branch
40         {
41             QString name;
42         };
43
44         QString name;
45         QList<Branch> branches;
46         QString description;
47
48         QString forwardTo;
49         QString prefix;
50
51         Repository() { }
52         const QString info() const {
53             const QString info = Rule::filename % ":" % QByteArray::number(Rule::lineNumber);
54             return info;
55         }
56
57     };
58
59     struct Match : Rule
60     {
61         QRegExp rx;
62         QString repository;
63         QString branch;
64         QString prefix;
65         int minRevision;
66         int maxRevision;
67         bool annotate;
68
69         enum Action {
70             Ignore,
71             Export,
72             Recurse
73         } action;
74
75         Match() : minRevision(-1), maxRevision(-1), annotate(false), action(Ignore) { }
76         const QString info() const {
77             const QString info = Rule::filename % ":" % QByteArray::number(Rule::lineNumber) % " " % rx.pattern();
78             return info;
79         }
80     };
81
82     Rules(const QString &filename);
83     ~Rules();
84
85     const QList<Repository> repositories() const;
86     const QList<Match> matchRules() const;
87     void load();
88
89 private:
90     void load(const QString &filename);
91     QString filename;
92     QList<Repository> m_repositories;
93     QList<Match> m_matchRules;
94     QMap<QString,QString> m_variables;
95 };
96
97 class RulesList
98 {
99 public:
100   RulesList( const QString &filenames);
101   ~RulesList();
102
103   const QList<Rules::Repository> allRepositories() const;
104   const QList<QList<Rules::Match> > allMatchRules() const;
105   const QList<Rules*> rules() const;
106   void load();
107
108 private:
109   QString m_filenames;
110   QList<Rules*> m_rules;
111   QList<Rules::Repository> m_allrepositories;
112   QList<QList<Rules::Match> > m_allMatchRules;
113 };
114
115 class Stats
116 {
117 public:
118     static Stats *instance();
119     void printStats() const;
120     void ruleMatched(const Rules::Match &rule, const int rev = -1);
121     void addRule( const Rules::Match &rule);
122     static void init();
123     ~Stats();
124
125 private:
126     Stats();
127     class Private;
128     Private * const d;
129     static Stats *self;
130     bool use;
131 };
132
133 #ifndef QT_NO_DEBUG_STREAM
134 class QDebug;
135 QDebug operator<<(QDebug, const Rules::Match &);
136 #endif
137
138 #endif