Expose the functionality of launch_editor() for scripts to use. Signed-off-by: Jonathan Nieder <jrnieder@xxxxxxxxx> --- As I mentioned in the cover letter, the analogous change for the pager is a little more tricky. I was wrong to blame Windows for this. The excellent commit ea27a18 (spawn pager via run_command interface, 2008-07-22) explains all. The difficulties: the pager receives input from the current process and the run_pager() function does not take an argument to take input from somewhere else. Also the pager is not exec()'d directly, so the current process sticks around uselessly until it quits and it is a little tricky to find the 'less' exit status for "git var --run" to use as well. Documentation/git-var.txt | 10 ++++++++- var.c | 48 +++++++++++++++++++++++++++++++++++++------- 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/Documentation/git-var.txt b/Documentation/git-var.txt index ef6aa81..1bfdb6c 100644 --- a/Documentation/git-var.txt +++ b/Documentation/git-var.txt @@ -8,7 +8,10 @@ git-var - Show a git logical variable SYNOPSIS -------- -'git var' [ -l | <variable> ] +[verse] +'git var' <variable> +'git var' -l +'git var' --run <variable> [ args ] DESCRIPTION ----------- @@ -22,6 +25,11 @@ OPTIONS as well. (However, the configuration variables listing functionality is deprecated in favor of 'git config -l'.) +--run variable [args]:: + If the specified logical variable represents a command, run that + command. For example, `git var --run GIT_EDITOR foo.txt` edits + foo.txt with the text editor git is configured to use. + EXAMPLE -------- $ git var GIT_AUTHOR_IDENT diff --git a/var.c b/var.c index 18dad57..c97b2e6 100644 --- a/var.c +++ b/var.c @@ -6,7 +6,8 @@ #include "cache.h" #include "exec_cmd.h" -static const char var_usage[] = "git var [-l | <variable>]"; +static const char var_usage[] = + "git var { -l | <variable> | --run <variable> [args] }"; static const char *editor(int flag) { @@ -26,16 +27,25 @@ static const char *pager(int flag) return pgm; } +static int run_editor(int argc, const char *const *argv) +{ + if (argc > 1) + return error("cannot launch editor with more than one file"); + + return launch_editor(argv[0], NULL, NULL); +} + struct git_var { const char *name; const char *(*read)(int); + int (*run)(int argc, const char *const *argv); }; static struct git_var git_vars[] = { - { "GIT_COMMITTER_IDENT", git_committer_info }, - { "GIT_AUTHOR_IDENT", git_author_info }, - { "GIT_EDITOR", editor }, - { "GIT_PAGER", pager }, - { "", NULL }, + { "GIT_COMMITTER_IDENT", git_committer_info, NULL }, + { "GIT_AUTHOR_IDENT", git_author_info, NULL }, + { "GIT_EDITOR", editor, run_editor }, + { "GIT_PAGER", pager, NULL }, + { "", NULL, NULL }, }; static void list_vars(void) @@ -59,6 +69,17 @@ static const char *read_var(const char *var) return val; } +static int run_var_cmd(const char *var, int argc, char **argv) +{ + struct git_var *ptr; + + for (ptr = git_vars; ptr->read; ptr++) + if (ptr->run && strcmp(var, ptr->name) == 0) + return ptr->run(argc, (const char *const *)argv); + + return error("%s is not a variable command", var); +} + static int show_config(const char *var, const char *value, void *cb) { if (value) @@ -72,12 +93,23 @@ int main(int argc, char **argv) { const char *val; int nongit; + + git_extract_argv0_path(argv[0]); + + if (argv[1] && strcmp(argv[1], "--run") == 0) { + if (argc <= 2) + usage(var_usage); + + setup_git_directory_gently(&nongit); + git_config(git_default_config, NULL); + + return run_var_cmd(argv[2], argc - 3, argv + 3); + } + if (argc != 2) { usage(var_usage); } - git_extract_argv0_path(argv[0]); - setup_git_directory_gently(&nongit); val = NULL; -- 1.6.5.2 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html