Skip to content

Commit

Permalink
Merge branch 'mm/config-edit-global'
Browse files Browse the repository at this point in the history
Start "git config --edit --global" from a skeletal per-user
configuration file contents, instead of a total blank, when the
user does not already have any.  This immediately reduces the need
for a later "Have you forgotten setting core.user?" and we can add
more to the template as we gain more experience.

* mm/config-edit-global:
  commit: advertise config --global --edit on guessed identity
  home_config_paths(): let the caller ignore xdg path
  config --global --edit: create a template file if needed
  • Loading branch information
Junio C Hamano committed Sep 2, 2014
2 parents c518279 + 8b27ff7 commit 1d8a6f6
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 10 deletions.
35 changes: 33 additions & 2 deletions builtin/commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,20 @@ static const char * const builtin_status_usage[] = {
NULL
};

static const char implicit_ident_advice[] =
static const char implicit_ident_advice_noconfig[] =
N_("Your name and email address were configured automatically based\n"
"on your username and hostname. Please check that they are accurate.\n"
"You can suppress this message by setting them explicitly. Run the\n"
"following command and follow the instructions in your editor to edit\n"
"your configuration file:\n"
"\n"
" git config --global --edit\n"
"\n"
"After doing this, you may fix the identity used for this commit with:\n"
"\n"
" git commit --amend --reset-author\n");

static const char implicit_ident_advice_config[] =
N_("Your name and email address were configured automatically based\n"
"on your username and hostname. Please check that they are accurate.\n"
"You can suppress this message by setting them explicitly:\n"
Expand Down Expand Up @@ -1402,6 +1415,24 @@ int cmd_status(int argc, const char **argv, const char *prefix)
return 0;
}

static const char *implicit_ident_advice(void)
{
char *user_config = NULL;
char *xdg_config = NULL;
int config_exists;

home_config_paths(&user_config, &xdg_config, "config");
config_exists = file_exists(user_config) || file_exists(xdg_config);
free(user_config);
free(xdg_config);

if (config_exists)
return _(implicit_ident_advice_config);
else
return _(implicit_ident_advice_noconfig);

}

static void print_summary(const char *prefix, const unsigned char *sha1,
int initial_commit)
{
Expand Down Expand Up @@ -1440,7 +1471,7 @@ static void print_summary(const char *prefix, const unsigned char *sha1,
strbuf_addbuf_percentquote(&format, &committer_ident);
if (advice_implicit_identity) {
strbuf_addch(&format, '\n');
strbuf_addstr(&format, _(implicit_ident_advice));
strbuf_addstr(&format, implicit_ident_advice());
}
}
strbuf_release(&author_ident);
Expand Down
31 changes: 28 additions & 3 deletions builtin/config.c
Original file line number Diff line number Diff line change
Expand Up @@ -445,6 +445,20 @@ static int get_urlmatch(const char *var, const char *url)
return 0;
}

static char *default_user_config(void)
{
struct strbuf buf = STRBUF_INIT;
strbuf_addf(&buf,
_("# This is Git's per-user configuration file.\n"
"[core]\n"
"# Please adapt and uncomment the following lines:\n"
"# user = %s\n"
"# email = %s\n"),
ident_default_name(),
ident_default_email());
return strbuf_detach(&buf, NULL);
}

int cmd_config(int argc, const char **argv, const char *prefix)
{
int nongit = !startup_info->have_repository;
Expand Down Expand Up @@ -551,6 +565,8 @@ int cmd_config(int argc, const char **argv, const char *prefix)
}
}
else if (actions == ACTION_EDIT) {
const char *config_file = given_config_source.file ?
given_config_source.file : git_path("config");
check_argc(argc, 0, 0);
if (!given_config_source.file && nongit)
die("not in a git directory");
Expand All @@ -559,9 +575,18 @@ int cmd_config(int argc, const char **argv, const char *prefix)
if (given_config_source.blob)
die("editing blobs is not supported");
git_config(git_default_config, NULL);
launch_editor(given_config_source.file ?
given_config_source.file : git_path("config"),
NULL, NULL);
if (use_global_config) {
int fd = open(config_file, O_CREAT | O_EXCL | O_WRONLY, 0666);
if (fd) {
char *content = default_user_config();
write_str_in_full(fd, content);
free(content);
close(fd);
}
else if (errno != EEXIST)
die_errno(_("cannot create configuration file %s"), config_file);
}
launch_editor(config_file, NULL, NULL);
}
else if (actions == ACTION_SET) {
int ret;
Expand Down
1 change: 1 addition & 0 deletions cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -1062,6 +1062,7 @@ extern const char *git_author_info(int);
extern const char *git_committer_info(int);
extern const char *fmt_ident(const char *name, const char *email, const char *date_str, int);
extern const char *fmt_name(const char *name, const char *email);
extern const char *ident_default_name(void);
extern const char *ident_default_email(void);
extern const char *git_editor(void);
extern const char *git_pager(int stdout_is_tty);
Expand Down
2 changes: 1 addition & 1 deletion ident.c
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ static void copy_email(const struct passwd *pw, struct strbuf *email)
add_domainname(email);
}

static const char *ident_default_name(void)
const char *ident_default_name(void)
{
if (!git_default_name.len) {
copy_gecos(xgetpwuid_self(), &git_default_name);
Expand Down
10 changes: 6 additions & 4 deletions path.c
Original file line number Diff line number Diff line change
Expand Up @@ -148,10 +148,12 @@ void home_config_paths(char **global, char **xdg, char *file)
*global = mkpathdup("%s/.gitconfig", home);
}

if (!xdg_home)
*xdg = NULL;
else
*xdg = mkpathdup("%s/git/%s", xdg_home, file);
if (xdg) {
if (!xdg_home)
*xdg = NULL;
else
*xdg = mkpathdup("%s/git/%s", xdg_home, file);
}

free(to_free);
}
Expand Down

0 comments on commit 1d8a6f6

Please sign in to comment.