Fix filename and linenumber for included rulefiles.
[svn2git: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 <QRegExp>
23 #include <QString>
24 #include <QStringList>
25 #include <QStringBuilder>
26
27 class Rules
28 {
29 public:
30     struct Rule
31     {
32         QString filename;
33         int lineNumber;
34         Rule() : lineNumber(0) {}
35     };
36     struct Repository : Rule
37     {
38         struct Branch
39         {
40             QString name;
41         };
42
43         QString name;
44         QList<Branch> branches;
45
46         QString forwardTo;
47         QString prefix;
48
49         Repository() { }
50         const QString info() const {
51             const QString info = Rule::filename % ":" % QByteArray::number(Rule::lineNumber);
52             return info;
53         }
54
55     };
56
57     struct Match : Rule
58     {
59         QRegExp rx;
60         QString repository;
61         QString branch;
62         QString prefix;
63         int minRevision;
64         int maxRevision;
65         bool annotate;
66
67         enum Action {
68             Ignore,
69             Export,
70             Recurse
71         } action;
72
73         Match() : minRevision(-1), maxRevision(-1), annotate(false), action(Ignore) { }
74         const QString info() const {
75             const QString info = rx.pattern() % " (" % Rule::filename % ":" % QByteArray::number(Rule::lineNumber) % ")";
76             return info;
77         }
78     };
79
80     Rules(const QString &filename);
81     ~Rules();
82
83     const QList<Repository> repositories() const;
84     const QList<Match> matchRules() const;
85
86     void load();
87
88 private:
89     void load(const QString &filename);
90
91     QString filename;
92     QList<Repository> m_repositories;
93     QList<Match> m_matchRules;
94 };
95
96 class RulesList
97 {
98 public:
99   RulesList( const QString &filenames);
100   ~RulesList();
101
102   const QList<Rules::Repository> allRepositories() const;
103   const QList<QList<Rules::Match> > allMatchRules() const;
104   const QList<Rules*> rules() const;
105   void load();
106
107 private:
108   QString m_filenames;
109   QList<Rules*> m_rules;
110   QList<Rules::Repository> m_allrepositories;
111   QList<QList<Rules::Match> > m_allMatchRules;
112 };
113
114 #ifndef QT_NO_DEBUG_STREAM
115 class QDebug;
116 QDebug operator<<(QDebug, const Rules::Match &);
117 #endif
118
119 #endif