From 7e7dee76c870917866fd23f385211ee8101705b4 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 22 Aug 2018 19:34:51 +0200 Subject: Add support for specifying publisher's name in addition to email --- bdep/project-author.cxx | 87 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 bdep/project-author.cxx (limited to 'bdep/project-author.cxx') diff --git a/bdep/project-author.cxx b/bdep/project-author.cxx new file mode 100644 index 0000000..7aa1eb9 --- /dev/null +++ b/bdep/project-author.cxx @@ -0,0 +1,87 @@ +// file : bdep/project-author.cxx -*- C++ -*- +// copyright : Copyright (c) 2014-2018 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#include + +#include +#include + +using namespace butl; + +namespace bdep +{ + project_author + find_project_author (const dir_path& prj) + { + project_author r; + + // The search order is as follows: + // + // BDEP_AUTHOR_(NAME|EMAIL) + // + // (USER|EMAIL) + // + r.name = getenv ("BDEP_AUTHOR_NAME"); + r.email = getenv ("BDEP_AUTHOR_EMAIL"); + + if (!r.name || !r.email) + { + // See if this is a VCS repository we recognize. + // + if (git_repository (prj)) + { + // In git the author name/email can be specified with the + // GIT_AUTHOR_NAME/EMAIL environment variables after which things + // fall back to the committer (GIT_COMMITTER_NAME/EMAIL and then + // the user.name/email git-config value). The resolved value can + // be queried with the GIT_AUTHOR_IDENT logical variable. + // + if (optional l = git_line (semantic_version {2, 1, 0}, + prj, + true /* ignore_error */, + "var", "GIT_AUTHOR_IDENT")) + { + // The output should be a single line in this form: + // + // NAME TIME ZONE + // + // For example: + // + // John Doe 1530517726 +0200 + // + // The <> delimiters are there even if the email is empty so we use + // them as anchors. + // + size_t p1, p2; + + if ((p2 = l->rfind ('>' )) == string::npos || + (p1 = l->rfind ('<', p2)) == string::npos) + fail << "invalid GIT_AUTHOR_IDENT value '" << *l << "'" << endf; + + if (!r.name) + { + string n (*l, 0, p1); + + if (!trim (n).empty ()) + r.name = move (n); + } + + if (!r.email) + { + ++p1; + string e (*l, p1, p2 - p1); + + if (!trim (e).empty ()) + r.email = move (e); + } + } + } + } + + if (!r.name ) r.name = getenv ("USER"); + if (!r.email) r.email = getenv ("EMAIL"); + + return r; + } +} -- cgit v1.1