Since ages we do not care about our program enough. Lets not treat them
as slaves anymore and say please.

Signed-off-by: Heiko Voigt <hvo...@hvoigt.net>
Signed-off-by: Jonathan Nieder <jrnie...@gmail.com>
Signed-off-by: Jens Lehmann <jens.lehm...@web.de>
Signed-off-by: Thomas Rast <tr...@inf.ethz.ch>
Signed-off-by: Johan Herland <jo...@herland.net>
---
 .gitignore                       |  1 +
 Makefile                         |  1 +
 builtin.h                        |  1 +
 builtin/config.c                 | 23 ++-----------------
 builtin/please.c                 |  9 ++++++++
 cache.h                          |  1 +
 config.c                         | 23 +++++++++++++++++++
 contrib/completion/git-prompt.sh |  5 +++-
 git.c                            | 49 +++++++++++++++++++++++++++++++++++++++-
 9 files changed, 90 insertions(+), 23 deletions(-)
 create mode 100644 builtin/please.c

diff --git a/.gitignore b/.gitignore
index 6669bf0..28dd4cf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -105,6 +105,7 @@
 /git-parse-remote
 /git-patch-id
 /git-peek-remote
+/git-please
 /git-prune
 /git-prune-packed
 /git-pull
diff --git a/Makefile b/Makefile
index 0f931a2..7e22cc0 100644
--- a/Makefile
+++ b/Makefile
@@ -943,6 +943,7 @@ BUILTIN_OBJS += builtin/pack-objects.o
 BUILTIN_OBJS += builtin/pack-redundant.o
 BUILTIN_OBJS += builtin/pack-refs.o
 BUILTIN_OBJS += builtin/patch-id.o
+BUILTIN_OBJS += builtin/please.o
 BUILTIN_OBJS += builtin/prune-packed.o
 BUILTIN_OBJS += builtin/prune.o
 BUILTIN_OBJS += builtin/push.o
diff --git a/builtin.h b/builtin.h
index faef559..6fe1d5f 100644
--- a/builtin.h
+++ b/builtin.h
@@ -105,6 +105,7 @@ extern int cmd_notes(int argc, const char **argv, const 
char *prefix);
 extern int cmd_pack_objects(int argc, const char **argv, const char *prefix);
 extern int cmd_pack_redundant(int argc, const char **argv, const char *prefix);
 extern int cmd_patch_id(int argc, const char **argv, const char *prefix);
+extern int cmd_please(int argc, const char **argv, const char *prefix);
 extern int cmd_prune(int argc, const char **argv, const char *prefix);
 extern int cmd_prune_packed(int argc, const char **argv, const char *prefix);
 extern int cmd_push(int argc, const char **argv, const char *prefix);
diff --git a/builtin/config.c b/builtin/config.c
index 33c9bf9..16b5152 100644
--- a/builtin/config.c
+++ b/builtin/config.c
@@ -364,27 +364,8 @@ int cmd_config(int argc, const char **argv, const char 
*prefix)
                usage_with_options(builtin_config_usage, 
builtin_config_options);
        }
 
-       if (use_global_config) {
-               char *user_config = NULL;
-               char *xdg_config = NULL;
-
-               home_config_paths(&user_config, &xdg_config, "config");
-
-               if (!user_config)
-                       /*
-                        * It is unknown if HOME/.gitconfig exists, so
-                        * we do not know if we should write to XDG
-                        * location; error out even if XDG_CONFIG_HOME
-                        * is set and points at a sane location.
-                        */
-                       die("$HOME not set");
-
-               if (access_or_warn(user_config, R_OK) &&
-                   xdg_config && !access_or_warn(xdg_config, R_OK))
-                       given_config_file = xdg_config;
-               else
-                       given_config_file = user_config;
-       }
+       if (use_global_config)
+               given_config_file = git_user_config();
        else if (use_system_config)
                given_config_file = git_etc_gitconfig();
        else if (use_local_config)
diff --git a/builtin/please.c b/builtin/please.c
new file mode 100644
index 0000000..aea8424
--- /dev/null
+++ b/builtin/please.c
@@ -0,0 +1,9 @@
+#include "builtin.h"
+#include "run-command.h"
+
+int cmd_please(int argc, const char **argv, const char *prefix)
+{
+       if (!strcmp(argv[1], "-h"))
+               usage("Sometimes");
+       return run_command_v_opt(argv+1, RUN_GIT_CMD);
+}
diff --git a/cache.h b/cache.h
index 94ca1ac..73a9caf 100644
--- a/cache.h
+++ b/cache.h
@@ -1164,6 +1164,7 @@ extern int git_config_set_multivar_in_file(const char *, 
const char *, const cha
 extern int git_config_rename_section(const char *, const char *);
 extern int git_config_rename_section_in_file(const char *, const char *, const 
char *);
 extern const char *git_etc_gitconfig(void);
+extern const char *git_user_config(void);
 extern int check_repository_format_version(const char *var, const char *value, 
void *cb);
 extern int git_env_bool(const char *, int);
 extern int git_config_system(void);
diff --git a/config.c b/config.c
index aefd80b..8b3e473 100644
--- a/config.c
+++ b/config.c
@@ -935,6 +935,29 @@ const char *git_etc_gitconfig(void)
        return system_wide;
 }
 
+const char *git_user_config(void)
+{
+       char *user_config = NULL;
+       char *xdg_config = NULL;
+
+       home_config_paths(&user_config, &xdg_config, "config");
+
+       if (!user_config)
+               /*
+                * It is unknown if HOME/.gitconfig exists, so
+                * we do not know if we should write to XDG
+                * location; error out even if XDG_CONFIG_HOME
+                * is set and points at a sane location.
+                */
+               die("$HOME not set");
+
+       if (access_or_warn(user_config, R_OK) &&
+                       xdg_config && !access_or_warn(xdg_config, R_OK))
+               return xdg_config;
+       else
+               return user_config;
+}
+
 int git_env_bool(const char *k, int def)
 {
        const char *v = getenv(k);
diff --git a/contrib/completion/git-prompt.sh b/contrib/completion/git-prompt.sh
index eaf5c36..a455d72 100644
--- a/contrib/completion/git-prompt.sh
+++ b/contrib/completion/git-prompt.sh
@@ -241,6 +241,7 @@ __git_ps1 ()
        local ps1pc_start='\u@\h:\w '
        local ps1pc_end='\$ '
        local printf_format=' (%s)'
+       export GIT_POLITENESS_CHECK_PASSED="Yes"
 
        case "$#" in
                2|3)    pcmode=yes
@@ -250,7 +251,8 @@ __git_ps1 ()
                ;;
                0|1)    printf_format="${1:-$printf_format}"
                ;;
-               *)      return
+               *)      unset GIT_POLITENESS_CHECK_PASSED
+                       return
                ;;
        esac
 
@@ -409,4 +411,5 @@ __git_ps1 ()
                        printf -- "$printf_format" "$c${b##refs/heads/}${f:+ 
$f}$r$p"
                fi
        fi
+       unset GIT_POLITENESS_CHECK_PASSED
 }
diff --git a/git.c b/git.c
index 1ada169..6c67cef 100644
--- a/git.c
+++ b/git.c
@@ -19,6 +19,8 @@ const char git_more_info_string[] =
 
 static struct startup_info git_startup_info;
 static int use_pager = -1;
+static int impolite_counter;
+static int polite_counter;
 
 static void commit_pager_choice(void) {
        switch (use_pager) {
@@ -302,6 +304,48 @@ static int run_builtin(struct cmd_struct *p, int argc, 
const char **argv)
        return 0;
 }
 
+static int read_polite_counter(const char *key, const char *value, void *data)
+{
+       if (!strcmp(key, "user.impolite"))
+               impolite_counter = git_config_int(key, value);
+       else if (!strcmp(key, "user.polite"))
+               polite_counter = git_config_int(key, value);
+       return 0;
+}
+
+static void check_politeness(const char *cmd)
+{
+       const char *user_config;
+       struct strbuf buf = STRBUF_INIT;
+
+       if (getenv("GIT_POLITENESS_CHECK_PASSED"))
+               return;
+
+       setenv("GIT_POLITENESS_CHECK_PASSED", "Yes", 1);
+
+       git_config_early(read_polite_counter, NULL, NULL);
+       if (!strcmp(cmd, "please")) {
+               impolite_counter = 0;
+               polite_counter++;
+       } else {
+               impolite_counter++;
+               polite_counter = 0;
+       }
+
+       if (impolite_counter > 10)
+               die("Error: Learn some manners, say please some time!");
+       if (polite_counter > 10)
+               die("Error: Too many please! I don't believe you.");
+
+       user_config = git_user_config();
+       strbuf_addf(&buf, "%d", polite_counter);
+       git_config_set_in_file(user_config, "user.polite", buf.buf);
+       strbuf_reset(&buf);
+       strbuf_addf(&buf, "%d", impolite_counter);
+       git_config_set_in_file(user_config, "user.impolite", buf.buf);
+       strbuf_release(&buf);
+}
+
 static void handle_internal_command(int argc, const char **argv)
 {
        const char *cmd = argv[0];
@@ -379,6 +423,7 @@ static void handle_internal_command(int argc, const char 
**argv)
                { "patch-id", cmd_patch_id },
                { "peek-remote", cmd_ls_remote, RUN_SETUP_GENTLY },
                { "pickaxe", cmd_blame, RUN_SETUP },
+               { "please", cmd_please, RUN_SETUP_GENTLY },
                { "prune", cmd_prune, RUN_SETUP },
                { "prune-packed", cmd_prune_packed, RUN_SETUP },
                { "push", cmd_push, RUN_SETUP },
@@ -441,8 +486,11 @@ static void handle_internal_command(int argc, const char 
**argv)
 
        for (i = 0; i < ARRAY_SIZE(commands); i++) {
                struct cmd_struct *p = commands+i;
+
                if (strcmp(p->cmd, cmd))
                        continue;
+
+               check_politeness(cmd);
                exit(run_builtin(p, argc, argv));
        }
 }
-- 
1.8.3.rc1.44.gb387c77

--
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

Reply via email to