From: Thiago Macieira Date: Thu, 27 Dec 2007 17:29:54 +0000 (-0200) Subject: Reintroduce the recurse rule. It's useful if you have a catch-all ignore rule. X-Git-Url: http://andersk.mit.edu/gitweb/svn-all-fast-export.git/commitdiff_plain/b4cb51888233275e6ec09f084f9fba371e01e759 Reintroduce the recurse rule. It's useful if you have a catch-all ignore rule. --- diff --git a/src/ruleparser.cpp b/src/ruleparser.cpp index e6ba7b5..0f675dd 100644 --- a/src/ruleparser.cpp +++ b/src/ruleparser.cpp @@ -104,6 +104,8 @@ void Rules::load() match.action = Match::Export; else if (action == "ignore") match.action = Match::Ignore; + else if (action == "recurse") + match.action = Match::Recurse; else qFatal("Invalid action \"%s\" on line %d", qPrintable(action), lineNumber); continue; diff --git a/src/ruleparser.h b/src/ruleparser.h index d70a39b..9525f14 100644 --- a/src/ruleparser.h +++ b/src/ruleparser.h @@ -50,7 +50,8 @@ public: enum Action { Ignore, - Export + Export, + Recurse } action; Match() : minRevision(-1), maxRevision(-1), lineNumber(0), action(Ignore) { } diff --git a/src/svn.cpp b/src/svn.cpp index 0314c3c..378dc77 100644 --- a/src/svn.cpp +++ b/src/svn.cpp @@ -352,6 +352,10 @@ public: int commit(); int exportEntry(const char *path, const svn_fs_path_change_t *change, apr_hash_t *changes); + int exportDispatch(const char *path, const svn_fs_path_change_t *change, + const char *path_from, svn_revnum_t rev_from, + apr_hash_t *changes, const QString ¤t, const Rules::Match &rule, + apr_pool_t *pool); int exportInternal(const char *path, const svn_fs_path_change_t *change, const char *path_from, svn_revnum_t rev_from, const QString ¤t, const Rules::Match &rule); @@ -470,7 +474,7 @@ int SvnRevision::exportEntry(const char *key, const svn_fs_path_change_t *change MatchRuleList::ConstIterator match = findMatchRule(matchRules, revnum, current); if (match != matchRules.constEnd()) { const Rules::Match &rule = *match; - return exportInternal(key, change, path_from, rev_from, current, rule); + return exportDispatch(key, change, path_from, rev_from, changes, current, rule, revpool); } if (is_dir && path_from != NULL) { @@ -488,17 +492,30 @@ int SvnRevision::exportEntry(const char *key, const svn_fs_path_change_t *change return EXIT_SUCCESS; } -int SvnRevision::exportInternal(const char *key, const svn_fs_path_change_t *change, +int SvnRevision::exportDispatch(const char *key, const svn_fs_path_change_t *change, const char *path_from, svn_revnum_t rev_from, - const QString ¤t, const Rules::Match &rule) + apr_hash_t *changes, const QString ¤t, + const Rules::Match &rule, apr_pool_t *pool) { - if (rule.action == Rules::Match::Ignore) { + switch (rule.action) { + case Rules::Match::Ignore: // ignore rule qDebug() << " " << qPrintable(current) << "rev" << revnum << "-> ignored (rule" << rule << ")"; return EXIT_SUCCESS; + + case Rules::Match::Recurse: + return recurse(key, change, path_from, rev_from, changes, pool); + + case Rules::Match::Export: + return exportInternal(key, change, path_from, rev_from, current, rule); } +} +int SvnRevision::exportInternal(const char *key, const svn_fs_path_change_t *change, + const char *path_from, svn_revnum_t rev_from, + const QString ¤t, const Rules::Match &rule) +{ QString svnprefix, repository, branch, path; splitPathName(rule, current, &svnprefix, &repository, &branch, &path); @@ -618,8 +635,8 @@ int SvnRevision::recurse(const char *path, const svn_fs_path_change_t *change, // find the first rule that matches this pathname MatchRuleList::ConstIterator match = findMatchRule(matchRules, revnum, current); if (match != matchRules.constEnd()) { - if (exportInternal(entry, change, entryFrom.isNull() ? 0 : entryFrom.constData(), - rev_from, current, *match) == EXIT_FAILURE) + if (exportDispatch(entry, change, entryFrom.isNull() ? 0 : entryFrom.constData(), + rev_from, changes, current, *match, dirpool) == EXIT_FAILURE) return EXIT_FAILURE; } else { qCritical() << current << "rev" << revnum