2 * This file is part of the vng project
3 * Copyright (C) 2008 Thomas Zander <tzander@trolltech.com>
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #include "ExcludeMatcher.h"
20 #include "GitRunner.h"
25 ExcludeMatcher::ExcludeMatcher()
29 bool ExcludeMatcher::isExcluded(const QString
&entry
)
32 // current dir should have a .git dir. [assert]
33 // entry is a relative path from our current dir. [assert]
34 if (m_baseMatches
.isEmpty()) {
36 // call git config --get core.excludesfile
37 // $GIT_DIR/info/exclude
40 // split entry into separate dirs.
41 QStringList pathSegments
= entry
.split(QDir::separator(), QString::SkipEmptyParts
);
42 QString fileName
= "/"+ pathSegments
.takeLast(); // remove last entry (the actual filename);
44 if (isExcluded(m_baseMatches
, entry
, fileName
))
48 pathSegments
.insert(0, ".");
50 foreach(QString segment
, pathSegments
) {
51 path
= path
+ segment
+ QDir::separator();
52 if (! m_cachedMatches
.contains(path
)) {
53 QList
<IgnoreLine
> items
;
54 QFile
ignoreFile(path
+".gitignore");
55 if (ignoreFile
.exists()) {
56 if (ignoreFile
.open(QFile::ReadOnly
)) {
57 QTextStream
file(&ignoreFile
);
61 QString line
= file
.readLine();
64 if (line
.isEmpty() || line
[0] == '#')
66 IgnoreLine ignoreLine
;
67 ignoreLine
.inverted
= line
[0] == '!';
68 if (ignoreLine
.inverted
)
70 ignoreLine
.matchOnFileOnly
= line
.contains('/');
71 QRegExp
re(line
, Qt::CaseInsensitive
, QRegExp::Wildcard
);
72 ignoreLine
.regExp
= re
;
76 Logger::debug() << "invalid entry in " << ignoreFile
.fileName() << " line " << line
;
81 m_cachedMatches
.insert(path
, items
);
83 if (isExcluded(m_cachedMatches
[path
], entry
, fileName
))
90 bool ExcludeMatcher::isExcluded(const QList
<IgnoreLine
> &ignores
, const QString
&path
, const QString
&fileName
)
92 foreach (IgnoreLine il
, ignores
) {
94 // qDebug() << "trying on " << il.regExp.pattern() << il.matchOnFileOnly << il.inverted;
95 if (il
.matchOnFileOnly
)
96 matches
= il
.regExp
.exactMatch(fileName
);
98 matches
= il
.regExp
.exactMatch(path
);
99 if (matches
!= il
.inverted
)