diff options
Diffstat (limited to 'build/context.cxx')
-rw-r--r-- | build/context.cxx | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/build/context.cxx b/build/context.cxx index 5a801b0..a20a7e2 100644 --- a/build/context.cxx +++ b/build/context.cxx @@ -5,6 +5,7 @@ #include <build/context> #include <ostream> +#include <sstream> #include <cassert> #include <system_error> @@ -226,5 +227,157 @@ namespace build return out_root / s.leaf (src_root); } + // relative() + // const dir_path* relative_base = &work; + + string + diag_relative (const path& p) + { + const path& b (*relative_base); + + if (p.absolute ()) + { + if (p == b) + return "."; + +#ifndef _WIN32 + if (p == home) + return "~"; +#endif + + path rb (relative (p)); + +#ifndef _WIN32 + if (rb.relative ()) + { + // See if the original path with the ~/ shortcut is better + // that the relative to base. + // + if (p.sub (home)) + { + path rh (p.leaf (home)); + if (rb.string ().size () > rh.string ().size () + 2) // 2 for '~/' + return "~/" + rh.string (); + } + } + else if (rb.sub (home)) + return "~/" + rb.leaf (home).string (); +#endif + + return rb.string (); + } + + return p.string (); + } + + string + diag_relative (const dir_path& d, bool cur) + { + string r (diag_relative (static_cast<const path&> (d))); + + // Translate "." to empty. + // + if (!cur && d.absolute () && r == ".") + r.clear (); + + // Add trailing '/'. + // + if (!r.empty () && !dir_path::traits::is_separator (r.back ())) + r += '/'; + + return r; + } + + // diag_do(), etc. + // + string + diag_do (const action&, const target& t) + { + const meta_operation_info& m (*current_mif); + const operation_info& io (*current_inner_oif); + const operation_info* oo (current_outer_oif); + + ostringstream os; + + // perform(update(x)) -> "update x" + // configure(update(x)) -> "configure updating x" + // + if (m.name_do.empty ()) + os << io.name_do << ' '; + else + { + os << m.name_do << ' '; + + if (!io.name_doing.empty ()) + os << io.name_doing << ' '; + } + + if (oo != nullptr) + os << "(for " << oo->name << ") "; + + os << t; + return os.str (); + } + + string + diag_doing (const action&, const target& t) + { + const meta_operation_info& m (*current_mif); + const operation_info& io (*current_inner_oif); + const operation_info* oo (current_outer_oif); + + ostringstream os; + + // perform(update(x)) -> "updating x" + // configure(update(x)) -> "configuring updating x" + // + if (!m.name_doing.empty ()) + os << m.name_doing << ' '; + + if (!io.name_doing.empty ()) + os << io.name_doing << ' '; + + if (oo != nullptr) + os << "(for " << oo->name << ") "; + + os << t; + return os.str (); + } + + string + diag_done (const action&, const target& t) + { + const meta_operation_info& m (*current_mif); + const operation_info& io (*current_inner_oif); + const operation_info* oo (current_outer_oif); + + ostringstream os; + + // perform(update(x)) -> "x is up to date" + // configure(update(x)) -> "updating x is configured" + // + if (m.name_done.empty ()) + { + os << t; + + if (!io.name_done.empty ()) + os << " " << io.name_done; + + if (oo != nullptr) + os << "(for " << oo->name << ") "; + } + else + { + if (!io.name_doing.empty ()) + os << io.name_doing << ' '; + + if (oo != nullptr) + os << "(for " << oo->name << ") "; + + os << t << " " << m.name_done; + } + + return os.str (); + } } |