# HG changeset patch # User Adrian Buehlmann <adr...@cadifra.com> # Date 1247411546 -7200 # Node ID 935f8fa4a4d47c39b2254a28cf5c994b859f9ad8 # Parent c477cecc73a67fe1691e5136a5319c126fce5833 shellext: teach DirectoryStatus to detect '@@noicons' in .hg/thgstatus
this will allow to disable the overlay icons per repository if .hg/thgstatus begins with the string '@@noicons' diff --git a/win32/shellext/DirectoryStatus.cpp b/win32/shellext/DirectoryStatus.cpp --- a/win32/shellext/DirectoryStatus.cpp +++ b/win32/shellext/DirectoryStatus.cpp @@ -59,6 +59,7 @@ char DirectoryStatus::status(const std:: int DirectoryStatus::read(const std::string& hgroot, const std::string& cwd) { v_.clear(); + noicons_ = false; std::string p = hgroot + "\\.hg\\thgstatus"; @@ -71,37 +72,65 @@ int DirectoryStatus::read(const std::str return 0; } - char state; - std::vector<char> path(MAX_PATH); - DirectoryStatus::E e; - while (fread(&state, sizeof(state), 1, f) == 1) + int res = 1; + const std::string noicons = "@@noicons"; + + std::vector<char> vline(200); + + for (;;) { - e.status_ = state; + vline.clear(); + char t; - path.clear(); - char t; - while (fread(&t, sizeof(t), 1, f) == 1 && t != '\n') + for (;;) { - path.push_back(t); - if (path.size() > 1000) - return 0; + if (fread(&t, sizeof(t), 1, f) != 1) + goto close; + if (t == '\n') + break; + vline.push_back(t); + if (vline.size() > 1000) + { + res = 0; + goto close; + } + } + vline.push_back(0); + + std::string line = &vline[0]; + + if (line.substr(0, noicons.size()) == noicons) + { + noicons_ = true; + goto close; + } + + if (line.empty()) + goto close; + + e.status_ = line[0]; + + std::string path; + if (line.size() > 1) + { + path = line.c_str() + 1; } path.push_back('/'); - path.push_back(0); - e.path_ = &path[0]; + e.path_ = path; v_.push_back(e); } +close: fclose(f); TDEBUG_TRACE("DirectoryStatus::read(" << hgroot << "): done. " - << v_.size() << " entries read"); + << v_.size() << " entries read. noicons_ = " << noicons_ ); - return 1; + return res; } diff --git a/win32/shellext/DirectoryStatus.h b/win32/shellext/DirectoryStatus.h --- a/win32/shellext/DirectoryStatus.h +++ b/win32/shellext/DirectoryStatus.h @@ -30,11 +30,15 @@ class DirectoryStatus typedef std::vector<E> V; V v_; + bool noicons_; public: + DirectoryStatus(): noicons_(false) {} + static DirectoryStatus* get( const std::string& hgroot, const std::string& cwd); char status(const std::string& relpath) const; + bool noicons() const { return noicons_; } private: int read(const std::string& hgroot, const std::string& cwd); ------------------------------------------------------------------------------ Enter the BlackBerry Developer Challenge This is your chance to win up to $100,000 in prizes! For a limited time, vendors submitting new applications to BlackBerry App World(TM) will have the opportunity to enter the BlackBerry Developer Challenge. See full prize details at: http://p.sf.net/sfu/Challenge _______________________________________________ Tortoisehg-develop mailing list Tortoisehg-develop@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tortoisehg-develop