diff --git a/src/index/indexer.cpp b/src/index/indexer.cpp index 829ba167..18f249bd 100644 --- a/src/index/indexer.cpp +++ b/src/index/indexer.cpp @@ -1,5 +1,5 @@ #ifndef lint -static char rcsid[] = "@(#$Id: indexer.cpp,v 1.21 2006-01-09 16:53:31 dockes Exp $ (C) 2004 J.F.Dockes"; +static char rcsid[] = "@(#$Id: indexer.cpp,v 1.22 2006-01-17 09:31:05 dockes Exp $ (C) 2004 J.F.Dockes"; #endif #include #include @@ -46,7 +46,7 @@ DbIndexer::~DbIndexer() { db.close(); } - +// Index each directory in the topdirs for a given db bool DbIndexer::indexDb(bool resetbefore, list *topdirs) { if (!init(resetbefore)) @@ -63,17 +63,12 @@ bool DbIndexer::indexDb(bool resetbefore, list *topdirs) // Set up skipped patterns for this subtree. This probably should be // done in the directory change code in processone() instead. - { - walker.clearSkippedNames(); - string skipped; - if (config->getConfParam("skippedNames", skipped)) { - list skpl; - stringToStrings(skipped, skpl); - list::const_iterator it; - for (it = skpl.begin(); it != skpl.end(); it++) { - walker.addSkippedName(*it); - } - } + walker.clearSkippedNames(); + string skipped; + if (config->getConfParam("skippedNames", skipped)) { + list skpl; + stringToStrings(skipped, skpl); + walker.setSkippedNames(skpl); } // Walk the directory tree diff --git a/src/utils/fstreewalk.cpp b/src/utils/fstreewalk.cpp index c755d120..47ed036e 100644 --- a/src/utils/fstreewalk.cpp +++ b/src/utils/fstreewalk.cpp @@ -1,5 +1,5 @@ #ifndef lint -static char rcsid[] = "@(#$Id: fstreewalk.cpp,v 1.6 2005-12-13 12:42:59 dockes Exp $ (C) 2004 J.F.Dockes"; +static char rcsid[] = "@(#$Id: fstreewalk.cpp,v 1.7 2006-01-17 09:31:05 dockes Exp $ (C) 2004 J.F.Dockes"; #endif #ifndef TEST_FSTREEWALK @@ -63,7 +63,11 @@ bool FsTreeWalker::addSkippedName(const string& pattern) data->skippedNames.push_back(pattern); return true; } - +bool FsTreeWalker::setSkippedNames(const list &patterns) +{ + data->skippedNames = patterns; + return true; +} void FsTreeWalker::clearSkippedNames() { data->skippedNames.clear(); @@ -195,13 +199,20 @@ class myCB : public FsTreeWalkerCB { int main(int argc, const char **argv) { - if (argc != 2) { - cerr << "Usage: fstreewalk " << endl; + if (argc < 2) { + cerr << "Usage: fstreewalk [ignpat [ignpat] ...]" << endl; exit(1); } + argv++;argc--; + string topdir = *argv++;argc--; + list ignpats; + while (argc > 0) { + ignpats.push_back(*argv++);argc--; + } FsTreeWalker walker; + walker.setSkippedNames(ignpats); myCB cb; - walker.walk(argv[1], cb); + walker.walk(topdir, cb); if (walker.getErrCnt() > 0) cout << walker.getReason(); } diff --git a/src/utils/fstreewalk.h b/src/utils/fstreewalk.h index 6244e768..35edc3f4 100644 --- a/src/utils/fstreewalk.h +++ b/src/utils/fstreewalk.h @@ -1,15 +1,25 @@ #ifndef _FSTREEWALK_H_INCLUDED_ #define _FSTREEWALK_H_INCLUDED_ -/* @(#$Id: fstreewalk.h,v 1.3 2005-04-04 13:18:47 dockes Exp $ (C) 2004 J.F.Dockes */ +/* @(#$Id: fstreewalk.h,v 1.4 2006-01-17 09:31:10 dockes Exp $ (C) 2004 J.F.Dockes */ #include +#include #ifndef NO_NAMESPACES using std::string; +using std::list; #endif class FsTreeWalkerCB; +/** + * Class implementing a unix directory recursive walk. + * + * A user-defined function object is called for every file or + * directory. Patterns to be ignored can be set before starting the + * walk. Options control whether we follow symlinks and whether we recurse + * on subdirectories. + */ class FsTreeWalker { public: enum CbFlag {FtwRegular, FtwDirEnter, FtwDirReturn}; @@ -19,16 +29,26 @@ class FsTreeWalker { FsTreeWalker(Options opts = FtwOptNone); ~FsTreeWalker(); - Status walk(const std::string &dir, FsTreeWalkerCB& cb); - std::string getReason(); + /** + * Begin file system walk. + * @param dir is not checked against the ignored patterns (this is + * a feature and must not change. + * @param cb the function object that will be called back for every + * file-system object (called both at entry and exit for directories). + */ + Status walk(const string &dir, FsTreeWalkerCB& cb); + /** Get explanation for error */ + string getReason(); int getErrCnt(); - bool addSkippedName(const std::string &pattern); // Add a pattern - // for directory - // entries (file - // or dir) to be - // ignored (ie: - // #* , *~) - void clearSkippedNames(); // Clear all patterns + /** + * Add a pattern to the list of things (file or dir) to be ignored + * (ie: #* , *~) + */ + bool addSkippedName(const string &pattern); + /** Set the ignored patterns list */ + bool setSkippedNames(const list &patlist); + /** Clear the ignored patterns list */ + void clearSkippedNames(); private: class Internal;