Re: [PATCH 4/6] var: provide explicit/implicit ident information

2012-11-14 Thread Jonathan Nieder
Jeff King wrote:

 Internally, we keep track of whether the author or committer
 ident information was provided by the user, or whether it
 was implicitly determined by the system. However, there is
 currently no way for external programs or scripts to get
 this information

What are the intended semantics?  If my machine has /etc/mailname
filled out, is that an implicit identity?  How about if I set the
EMAIL envvar but not GIT_COMMITTER_EMAIL?

If external scripts are going to start using this mechanism, they will
need answers to these questions to support users that run into
configuration problems.  A few words on this in the documentation
could probably help.

On most machines I have the EMAIL envvar set explicitly, but in the
recent past I relied on /etc/mailname on some others, so I'm also
genuinely curious about the use case here (and too lazy to dig it up).

Thanks,
Jonathan
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 4/6] var: provide explicit/implicit ident information

2012-11-14 Thread Jeff King
On Wed, Nov 14, 2012 at 09:06:57AM -0800, Jonathan Nieder wrote:

 Jeff King wrote:
 
  Internally, we keep track of whether the author or committer
  ident information was provided by the user, or whether it
  was implicitly determined by the system. However, there is
  currently no way for external programs or scripts to get
  this information
 
 What are the intended semantics?  If my machine has /etc/mailname
 filled out, is that an implicit identity?  How about if I set the
 EMAIL envvar but not GIT_COMMITTER_EMAIL?
 
 If external scripts are going to start using this mechanism, they will
 need answers to these questions to support users that run into
 configuration problems.  A few words on this in the documentation
 could probably help.

The intent is to make git's internal rules (whatever they may be)
available to calling scripts. But I agree those rules should be spelled
out now that they are becoming a more visible interface. I'll update the
documentation.

 On most machines I have the EMAIL envvar set explicitly, but in the
 recent past I relied on /etc/mailname on some others, so I'm also
 genuinely curious about the use case here (and too lazy to dig it up).

Right now EMAIL is explicit, but `id`@`cat /etc/mailname` is not. I
think changing that would be a separate issue, though (and I'm not sure
whether it is a good idea; my /etc/mailname is not an email address I
would want to use).

-Peff
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 4/6] var: provide explicit/implicit ident information

2012-11-13 Thread Jeff King
Internally, we keep track of whether the author or committer
ident information was provided by the user, or whether it
was implicitly determined by the system. However, there is
currently no way for external programs or scripts to get
this information without re-implementing the ident logic
themselves. Let's provide a way for them to do so.

Signed-off-by: Jeff King p...@peff.net
---
 Documentation/git-var.txt |  8 
 builtin/var.c | 27 +++
 t/t0007-git-var.sh| 36 
 3 files changed, 71 insertions(+)

diff --git a/Documentation/git-var.txt b/Documentation/git-var.txt
index 53abba5..963b8d4 100644
--- a/Documentation/git-var.txt
+++ b/Documentation/git-var.txt
@@ -39,9 +39,17 @@ VARIABLES
 GIT_AUTHOR_IDENT::
 The author of a piece of code.
 
+GIT_AUTHOR_EXPLICIT::
+Outputs 1 if the author identity was provided explicitly by the
+user (in the config or environment), or 0 if it was determined
+implicitly from the system.
+
 GIT_COMMITTER_IDENT::
 The person who put a piece of code into git.
 
+GIT_COMMITTER_EXPLICIT::
+Like GIT_AUTHOR_EXPLICIT, but for the committer ident.
+
 GIT_EDITOR::
 Text editor for use by git commands.  The value is meant to be
 interpreted by the shell when it is used.  Examples: `~/bin/vi`,
diff --git a/builtin/var.c b/builtin/var.c
index 49b48f5..ce28101 100644
--- a/builtin/var.c
+++ b/builtin/var.c
@@ -26,13 +26,40 @@ static const char *pager(int flag)
return pgm;
 }
 
+static const char *explicit_ident(const char * (*get_ident)(int),
+ int (*check_ident)(void))
+{
+   /*
+* Prime the explicit flag by getting the identity.
+* We do not want to be strict here, because we would not want
+* to die on bogus implicit values, but instead just report that they
+* are not explicit.
+*/
+   get_ident(0);
+   return check_ident() ? 1 : 0;
+}
+
+static const char *committer_explicit(int flag)
+{
+   return explicit_ident(git_committer_info,
+ committer_ident_sufficiently_given);
+}
+
+static const char *author_explicit(int flag)
+{
+   return explicit_ident(git_author_info,
+ author_ident_sufficiently_given);
+}
+
 struct git_var {
const char *name;
const char *(*read)(int);
 };
 static struct git_var git_vars[] = {
{ GIT_COMMITTER_IDENT, git_committer_info },
+   { GIT_COMMITTER_EXPLICIT, committer_explicit },
{ GIT_AUTHOR_IDENT,   git_author_info },
+   { GIT_AUTHOR_EXPLICIT, author_explicit },
{ GIT_EDITOR, editor },
{ GIT_PAGER, pager },
{ , NULL },
diff --git a/t/t0007-git-var.sh b/t/t0007-git-var.sh
index 45a5f66..66b9810 100755
--- a/t/t0007-git-var.sh
+++ b/t/t0007-git-var.sh
@@ -26,4 +26,40 @@ test_expect_success 'git var can show multiple values' '
test_cmp expect actual
 '
 
+for type in AUTHOR COMMITTER; do
+   test_expect_success $type ident can detect implicit values 
+   echo 0 expect 
+   (
+   sane_unset GIT_${type}_NAME 
+   sane_unset GIT_${type}_EMAIL 
+   sane_unset EMAIL 
+   git var GIT_${type}_EXPLICIT actual
+   ) 
+   test_cmp expect actual
+   
+
+   test_expect_success $type ident is explicit via environment 
+   echo 1 expect 
+   (
+   GIT_${type}_NAME='A Name' 
+   export GIT_${type}_NAME 
+   GIT_${type}_EMAIL='n...@example.com' 
+   export GIT_${type}_EMAIL 
+   git var GIT_${type}_EXPLICIT actual
+   ) 
+   test_cmp expect actual
+   
+
+   test_expect_success $type ident is explicit via config 
+   echo 1 expect 
+   test_config user.name 'A Name' 
+   test_config user.email 'n...@example.com' 
+   (
+   sane_unset GIT_${type}_NAME 
+   sane_unset GIT_${type}_EMAIL 
+   git var GIT_${type}_EXPLICIT actual
+   )
+   
+done
+
 test_done
-- 
1.8.0.207.gdf2154c

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html