config --global --edit: create a template file if needed
When the user has no ~/.gitconfig file, git config --global --edit used to launch an editor on an nonexistant file name. Instead, create a file with a default content before launching the editor. The template contains only commented-out entries, to save a few keystrokes for the user. If the values are guessed properly, the user will only have to uncomment the entries. Advanced users teaching newbies can create a minimalistic configuration faster for newbies. Beginners reading a tutorial advising to run "git config --global --edit" as a first step will be slightly more guided for their first contact with Git. Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									740c281d21
								
							
						
					
					
						commit
						9830534e40
					
				|  | @ -458,6 +458,20 @@ static int get_urlmatch(const char *var, const char *url) | ||||||
| 	return 0; | 	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 cmd_config(int argc, const char **argv, const char *prefix) | ||||||
| { | { | ||||||
| 	int nongit = !startup_info->have_repository; | 	int nongit = !startup_info->have_repository; | ||||||
|  | @ -564,6 +578,8 @@ int cmd_config(int argc, const char **argv, const char *prefix) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	else if (actions == ACTION_EDIT) { | 	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); | 		check_argc(argc, 0, 0); | ||||||
| 		if (!given_config_source.file && nongit) | 		if (!given_config_source.file && nongit) | ||||||
| 			die("not in a git directory"); | 			die("not in a git directory"); | ||||||
|  | @ -572,9 +588,18 @@ int cmd_config(int argc, const char **argv, const char *prefix) | ||||||
| 		if (given_config_source.blob) | 		if (given_config_source.blob) | ||||||
| 			die("editing blobs is not supported"); | 			die("editing blobs is not supported"); | ||||||
| 		git_config(git_default_config, NULL); | 		git_config(git_default_config, NULL); | ||||||
| 		launch_editor(given_config_source.file ? | 		if (use_global_config) { | ||||||
| 			      given_config_source.file : git_path("config"), | 			int fd = open(config_file, O_CREAT | O_EXCL | O_WRONLY, 0666); | ||||||
| 			      NULL, NULL); | 			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) { | 	else if (actions == ACTION_SET) { | ||||||
| 		int ret; | 		int ret; | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								cache.h
								
								
								
								
							
							
						
						
									
										1
									
								
								cache.h
								
								
								
								
							|  | @ -1025,6 +1025,7 @@ extern const char *git_author_info(int); | ||||||
| extern const char *git_committer_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_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 *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 *ident_default_email(void); | ||||||
| extern const char *git_editor(void); | extern const char *git_editor(void); | ||||||
| extern const char *git_pager(int stdout_is_tty); | extern const char *git_pager(int stdout_is_tty); | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								ident.c
								
								
								
								
							
							
						
						
									
										2
									
								
								ident.c
								
								
								
								
							|  | @ -102,7 +102,7 @@ static void copy_email(const struct passwd *pw, struct strbuf *email) | ||||||
| 	add_domainname(email); | 	add_domainname(email); | ||||||
| } | } | ||||||
|  |  | ||||||
| static const char *ident_default_name(void) | const char *ident_default_name(void) | ||||||
| { | { | ||||||
| 	if (!git_default_name.len) { | 	if (!git_default_name.len) { | ||||||
| 		copy_gecos(xgetpwuid_self(), &git_default_name); | 		copy_gecos(xgetpwuid_self(), &git_default_name); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Matthieu Moy
						Matthieu Moy