Merge branch 'mm/config-edit-global'

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
This commit is contained in:
Junio C Hamano 2014-09-02 13:23:19 -07:00
Родитель c518279c0e 8b27ff7eac
Коммит 1d8a6f6929
5 изменённых файлов: 69 добавлений и 10 удалений

Просмотреть файл

@ -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"
@ -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)
{
@ -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);

Просмотреть файл

@ -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;
@ -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");
@ -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;

Просмотреть файл

@ -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);

Просмотреть файл

@ -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);

10
path.c
Просмотреть файл

@ -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);
}