aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2018-08-22 19:34:51 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2018-08-22 19:34:51 +0200
commit7e7dee76c870917866fd23f385211ee8101705b4 (patch)
treeb78508ec5316b6f50cbf4417337b96e874bdf439
parentb2c194aa4913afee30a78fc191912b9622a4d9ae (diff)
Add support for specifying publisher's name in addition to email
-rw-r--r--bdep/new.cli8
-rw-r--r--bdep/new.cxx4
-rw-r--r--bdep/project-author.cxx87
-rw-r--r--bdep/project-author.hxx41
-rw-r--r--bdep/project-email.cxx70
-rw-r--r--bdep/project-email.hxx23
-rw-r--r--bdep/publish.cli30
-rw-r--r--bdep/publish.cxx47
-rw-r--r--tests/publish.test3
9 files changed, 188 insertions, 125 deletions
diff --git a/bdep/new.cli b/bdep/new.cli
index b188af9..d7e3ed0 100644
--- a/bdep/new.cli
+++ b/bdep/new.cli
@@ -260,10 +260,10 @@ namespace bdep
"\h|ENVIRONMENT|
- The \cb{BDEP_EMAIL} environment variable can be used to specify the package
- email address. If not set, the \cb{new} command will first try to obtain
- the email from the version control system (if used) and then from the
- \cb{EMAIL} environment variable. If all these methods fail, a dummy
+ The \cb{BDEP_AUTHOR_EMAIL} environment variable can be used to specify the
+ package email address. If not set, the \cb{new} command will first try to
+ obtain the email from the version control system (if used) and then from
+ the \cb{EMAIL} environment variable. If all these methods fail, a dummy
\cb{@example.org} email is used.
"
}
diff --git a/bdep/new.cxx b/bdep/new.cxx
index 64e1724..45c3234 100644
--- a/bdep/new.cxx
+++ b/bdep/new.cxx
@@ -7,7 +7,7 @@
#include <libbutl/project-name.mxx>
#include <bdep/project.hxx>
-#include <bdep/project-email.hxx>
+#include <bdep/project-author.hxx>
#include <bdep/database.hxx>
#include <bdep/diagnostics.hxx>
@@ -370,7 +370,7 @@ namespace bdep
//
string email;
{
- optional<string> r (project_email (prj));
+ optional<string> r (find_project_author_email (prj));
email = r ? move (*r) : "you@example.org";
}
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 <bdep/project-author.hxx>
+
+#include <bdep/git.hxx>
+#include <bdep/diagnostics.hxx>
+
+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)
+ // <VCS>
+ // (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<string> 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 <EMAIL> TIME ZONE
+ //
+ // For example:
+ //
+ // John Doe <john@example.org> 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;
+ }
+}
diff --git a/bdep/project-author.hxx b/bdep/project-author.hxx
new file mode 100644
index 0000000..bcabdb3
--- /dev/null
+++ b/bdep/project-author.hxx
@@ -0,0 +1,41 @@
+// file : bdep/project-author.hxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2018 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#ifndef BDEP_PROJECT_AUTHOR_HXX
+#define BDEP_PROJECT_AUTHOR_HXX
+
+#include <bdep/types.hxx>
+#include <bdep/utility.hxx>
+
+namespace bdep
+{
+ // Given a project directly, try to discover the author's name/email address
+ // using the environment and, if project looks like a repository, its VCS.
+ //
+ // Note: if using this function in a command, don't forget to update its
+ // ENVIRONMENT section to mention BDEP_AUTHOR_{NAME,EMAIL}.
+ //
+ struct project_author
+ {
+ optional<string> name;
+ optional<string> email;
+ };
+
+ project_author
+ find_project_author (const dir_path&);
+
+ inline optional<string>
+ find_project_author_name (const dir_path& d)
+ {
+ return find_project_author (d).name;
+ }
+
+ inline optional<string>
+ find_project_author_email (const dir_path& d)
+ {
+ return find_project_author (d).email;
+ }
+}
+
+#endif // BDEP_PROJECT_AUTHOR_HXX
diff --git a/bdep/project-email.cxx b/bdep/project-email.cxx
deleted file mode 100644
index fe43b18..0000000
--- a/bdep/project-email.cxx
+++ /dev/null
@@ -1,70 +0,0 @@
-// file : bdep/project-email.cxx -*- C++ -*-
-// copyright : Copyright (c) 2014-2018 Code Synthesis Ltd
-// license : MIT; see accompanying LICENSE file
-
-#include <bdep/project-email.hxx>
-
-#include <bdep/git.hxx>
-#include <bdep/diagnostics.hxx>
-
-using namespace butl;
-
-namespace bdep
-{
- optional<string>
- project_email (const dir_path& prj)
- {
- optional<string> r;
-
- // The search order is as follows:
- //
- // BDEP_EMAIL
- // <VCS>
- // EMAIL
- //
- if ((r = getenv ("BDEP_EMAIL")))
- return r;
-
- // See if this is a VCS repository we recognize.
- //
- if (git_repository (prj))
- {
- // In git the author email can be specified with the GIT_AUTHOR_EMAIL
- // environment variable after which things fall back to the committer
- // (GIT_COMMITTER_EMAIL and then the user.email git-config value). The
- // resolved value can be queried with the GIT_AUTHOR_IDENT logical
- // variable.
- //
- if (optional<string> 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 <EMAIL> TIME ZONE
- //
- // For example:
- //
- // John Doe <john@example.org> 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 << "no email in GIT_AUTHOR_IDENT" << endf;
-
- if (++p1 != p2)
- return string (*l, p1, p2 - p1);
- }
- }
-
- if ((r = getenv ("EMAIL")))
- return r;
-
- return r;
- }
-}
diff --git a/bdep/project-email.hxx b/bdep/project-email.hxx
deleted file mode 100644
index c630682..0000000
--- a/bdep/project-email.hxx
+++ /dev/null
@@ -1,23 +0,0 @@
-// file : bdep/project-email.hxx -*- C++ -*-
-// copyright : Copyright (c) 2014-2018 Code Synthesis Ltd
-// license : MIT; see accompanying LICENSE file
-
-#ifndef BDEP_PROJECT_EMAIL_HXX
-#define BDEP_PROJECT_EMAIL_HXX
-
-#include <bdep/types.hxx>
-#include <bdep/utility.hxx>
-
-namespace bdep
-{
- // Given a project directly, try to discover the author's email address
- // using the environment and, if project looks like a repository, its VCS.
- //
- // Note: if using this function in a command, don't forget to update its
- // ENVIRONMENT section to mention BDEP_EMAIL.
- //
- optional<string>
- project_email (const dir_path&);
-}
-
-#endif // BDEP_PROJECT_EMAIL_HXX
diff --git a/bdep/publish.cli b/bdep/publish.cli
index fce6a23..bcbb022 100644
--- a/bdep/publish.cli
+++ b/bdep/publish.cli
@@ -45,8 +45,8 @@ namespace bdep
Along with the package archive, the submission request specifies the
project the package belongs to, the repository section to publish the
package under, the control repository URL to use for authorization, and
- the publisher's email address for notifications. While the exact usage
- and interpretation of this information depends on the specific
+ the publisher's name and email address for the record. While the exact
+ usage and interpretation of this information depends on the specific
repository, the following semantics apply when submitting to
\cb{cppget.org}.
@@ -113,12 +113,20 @@ namespace bdep
"Repository section to publish the packages under."
}
- string --email
+ string --author-name
+ {
+ "<name>",
+ "Publisher's name. If unspecified, it will be obtained from the
+ environment and/or version control system. See the ENVIRONMENT
+ section for details."
+ }
+
+ string --author-email
{
"<email>",
- "Publisher's email address for notifications. If unspecified, one will be
- obtained from the environment and/or version control system. See the
- ENVIRONMENT section for details."
+ "Publisher's email address. If unspecified, it will be obtained from the
+ environment and/or version control system. See the ENVIRONMENT section
+ for details."
}
string --simulate
@@ -134,9 +142,11 @@ namespace bdep
"\h|ENVIRONMENT|
- The \cb{BDEP_EMAIL} environment variable can be used to specify the
- publisher's email address. If not set, the \cb{publish} command will first
- try to obtain the email from the version control system (if used) and then
- from the \cb{EMAIL} environment variable. See also the \cb{--email} option.
+ The \cb{BDEP_AUTHOR_NAME} and \cb{BDEP_AUTHOR_EMAIL} environment variables
+ can be used to specify the publisher's name and email address,
+ respectively. If not set, the \cb{publish} command will first try to obtain
+ the name and email from the version control system (if used) and then from
+ the \cb{USER} and \cb{EMAIL} environment variables, respectively. See also
+ the \cb{--author-name} and \cb{--author-email} options.
"
}
diff --git a/bdep/publish.cxx b/bdep/publish.cxx
index adda05b..00fc003 100644
--- a/bdep/publish.cxx
+++ b/bdep/publish.cxx
@@ -15,7 +15,7 @@
#include <bdep/git.hxx>
#include <bdep/project.hxx>
-#include <bdep/project-email.hxx>
+#include <bdep/project-author.hxx>
#include <bdep/database.hxx>
#include <bdep/diagnostics.hxx>
@@ -249,7 +249,7 @@ namespace bdep
const path& archive,
const string& checksum,
const string& section,
- const string& email,
+ const project_author& author,
const optional<url>& ctrl)
{
using parser = manifest_parser;
@@ -338,10 +338,11 @@ namespace bdep
//
"--include",
- "--form", "archive=@" + archive.string (),
- "--form-string", "sha256sum=" + checksum,
- "--form-string", "section=" + section,
- "--form-string", "email=" + email,
+ "--form", "archive=@" + archive.string (),
+ "--form-string", "sha256sum=" + checksum,
+ "--form-string", "section=" + section,
+ "--form-string", "author-name=" + *author.name,
+ "--form-string", "author-email=" + *author.email,
ctrl
? strings ({"--form-string", "control=" + ctrl->string ()})
@@ -694,6 +695,8 @@ namespace bdep
const url& repo (o.repository ());
+ // Control repository URL.
+ //
optional<url> ctrl;
if (o.control_specified ())
{
@@ -703,14 +706,28 @@ namespace bdep
else
ctrl = control_url (prj);
- string email;
- if (o.email_specified ())
- email = o.email ();
- else if (optional<string> r = project_email (prj))
- email = move (*r);
- else
+ // Publisher's name/email.
+ //
+ project_author author;
+
+ if (o.author_name_specified ()) author.name = o.author_name ();
+ if (o.author_email_specified ()) author.email = o.author_email ();
+
+ if (!author.name || !author.email)
+ {
+ project_author a (find_project_author (prj));
+
+ if (!author.name) author.name = move (a.name);
+ if (!author.email) author.email = move (a.email);
+ }
+
+ if (!author.name || author.name->empty ())
+ fail << "unable to obtain publisher's name" <<
+ info << "use --author-name to specify explicitly";
+
+ if (!author.email || author.email->empty ())
fail << "unable to obtain publisher's email" <<
- info << "use --email to specify explicitly";
+ info << "use --author-email to specify explicitly";
// Collect package information (version, project, section, archive
// path/checksum, and manifest).
@@ -768,7 +785,7 @@ namespace bdep
{
text << "publishing:" << '\n'
<< " to: " << repo << '\n'
- << " as: " << email
+ << " as: " << *author.name << " <" << *author.email << '>'
<< '\n';
for (size_t i (0); i != pkgs.size (); ++i)
@@ -1318,7 +1335,7 @@ namespace bdep
text << "submitting " << p.archive.leaf ();
pair<string, string> r (
- submit (o, p.archive, p.checksum, p.section, email, ctrl));
+ submit (o, p.archive, p.checksum, p.section, author, ctrl));
if (verb)
text << r.second << " (" << r.first << ")";
diff --git a/tests/publish.test b/tests/publish.test
index 663066f..61f7a60 100644
--- a/tests/publish.test
+++ b/tests/publish.test
@@ -23,7 +23,8 @@ repository = ($config.bdep.test.repository == [null] \
: 'https://cppget.org') \
: "$config.bdep.test.repository")
-test.arguments += --repository "$repository" --yes --email user@example.com
+test.arguments += --repository "$repository" --yes \
+ --author-name user --author-email user@example.com
cxx = cc "config.cxx=$config.cxx"