From b54f28af95fac641397f9e2a85df0a21234f2e1b Mon Sep 17 00:00:00 2001 From: Allan Odgaard Date: Thu, 31 Jan 2013 15:08:04 +0100 Subject: [PATCH] Improve encapsulation --- Frameworks/scm/src/drivers/api.cc | 27 ++++++++++++++++++++------- Frameworks/scm/src/drivers/api.h | 5 +++-- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/Frameworks/scm/src/drivers/api.cc b/Frameworks/scm/src/drivers/api.cc index 5e450322..e91f0bd2 100644 --- a/Frameworks/scm/src/drivers/api.cc +++ b/Frameworks/scm/src/drivers/api.cc @@ -3,6 +3,7 @@ #include #include #include +#include #include static std::string find_executable (std::string const& name, std::string const& variable) @@ -45,6 +46,24 @@ namespace scm { } + bool driver_t::has_info_for_directory (std::string const& path) + { + bool res = path::exists(text::format(_wc_root_format_string.c_str(), path.c_str())); + if(res) + setup(); + return res; + } + + void driver_t::setup () + { + if(_resolved_executable == NULL_STR && _required_executable != NULL_STR) + { + _resolved_executable = find_executable(_required_executable, "TM_" + text::uppercase(_name)); + if(_resolved_executable == NULL_STR) + fprintf(stderr, "scm: unable to find ā€˜%s’ executable (set %s or PATH in ~/.tm_properties)\n", _required_executable.c_str(), ("TM_" + text::uppercase(_name)).c_str()); + } + } + driver_t* git_driver (); driver_t* hg_driver (); driver_t* p4_driver (); @@ -60,16 +79,10 @@ namespace scm { iterate(driver, drivers) { - if(*driver && path::exists(text::format((*driver)->_wc_root_format_string.c_str(), cwd.c_str()))) + if(*driver && (*driver)->has_info_for_directory(cwd)) { if(wcPath) *wcPath = cwd; - if((*driver)->_resolved_executable == NULL_STR && (*driver)->_required_executable != NULL_STR) - { - (*driver)->_resolved_executable = find_executable((*driver)->_required_executable, "TM_" + text::uppercase((*driver)->_name)); - if((*driver)->_resolved_executable == NULL_STR) - fprintf(stderr, "scm: unable to find ā€˜%s’ executable (set %s or PATH in ~/.tm_properties)\n", (*driver)->_required_executable.c_str(), ("TM_" + text::uppercase((*driver)->_name)).c_str()); - } return *driver; } } diff --git a/Frameworks/scm/src/drivers/api.h b/Frameworks/scm/src/drivers/api.h index 4b6dcb6a..820e7579 100644 --- a/Frameworks/scm/src/drivers/api.h +++ b/Frameworks/scm/src/drivers/api.h @@ -17,12 +17,13 @@ namespace scm virtual bool tracks_directories () const { return false; } virtual bool may_touch_filesystem () const { return false; } + bool has_info_for_directory (std::string const& path); + protected: std::string const& executable () const { return _resolved_executable; } + void setup (); private: - friend driver_t const* driver_for_path (std::string const& path, std::string* wcPath); - std::string _name; std::string _wc_root_format_string; std::string _required_executable;