}
}
+static bool wasDir(svn_fs_t *fs, int revnum, const char *pathname, apr_pool_t *pool)
+{
+ AprAutoPool subpool(pool);
+ svn_fs_root_t *fs_root;
+ if (svn_fs_revision_root(&fs_root, fs, revnum, subpool) != SVN_NO_ERROR)
+ return false;
+
+ svn_boolean_t is_dir;
+ if (svn_fs_is_dir(&is_dir, fs_root, pathname, subpool) != SVN_NO_ERROR)
+ return false;
+
+ return is_dir;
+}
+
time_t get_epoch(char *svn_date)
{
struct tm tm;
continue;
if (rule.rx.exactMatch(current)) {
foundMatch = true;
+ if (rule.repository.isEmpty()) {
+ // ignore rule
+ qDebug() << "..." << qPrintable(current) << "rev" << revnum
+ << "-> ignored";
+ break;
+ }
+
QString repository = current;
QString branch = current;
QString path = current;
if (!txn) {
Repository *repo = repositories.value(repository, 0);
if (!repo) {
- qCritical() << "Rule" << rule.rx.pattern()
+ qCritical() << "Rule" << rule.rx.pattern() << "line" << rule.lineNumber
<< "references unknown repository" << repository;
return EXIT_FAILURE;
}
}
if (!foundMatch) {
- qCritical() << current << "did not match any rules; cannot continue";
- return EXIT_FAILURE;
+ if (is_dir) {
+ qDebug() << current << "is a directory; ignoring";
+ } else if (wasDir(fs, revnum - 1, key, pool)) {
+ qDebug() << current << "was a directory; ignoring";
+ } else {
+ qCritical() << current << "did not match any rules; cannot continue";
+ return EXIT_FAILURE;
+ }
}
}
revpool.clear();
svn_string_t *svnlog = (svn_string_t*)apr_hash_get(revprops, "svn:log", APR_HASH_KEY_STRING);
QByteArray log = (char *)svnlog->data;
- QByteArray authorident = identities.value((char *)svnauthor->data);
+ QByteArray authorident = svnauthor ? identities.value((char *)svnauthor->data) : QByteArray();
time_t epoch = get_epoch((char*)svndate->data);
if (authorident.isEmpty()) {
if (!svnauthor || svn_string_isempty(svnauthor))