Merge branch 'bc/more-git-var'
Add more "git var" for toolsmiths to learn various locations Git is configured with either via the configuration or hardcoded defaults. * bc/more-git-var: var: add config file locations var: add attributes files locations attr: expose and rename accessor functions var: adjust memory allocation for strings var: format variable structure with C99 initializers var: add support for listing the shell t: add a function to check executable bit var: mark unused parameters in git_var callbacks
This commit is contained in:
169
builtin/var.c
169
builtin/var.c
@ -4,60 +4,188 @@
|
||||
* Copyright (C) Eric Biederman, 2005
|
||||
*/
|
||||
#include "builtin.h"
|
||||
#include "attr.h"
|
||||
#include "config.h"
|
||||
#include "editor.h"
|
||||
#include "ident.h"
|
||||
#include "pager.h"
|
||||
#include "refs.h"
|
||||
#include "path.h"
|
||||
#include "strbuf.h"
|
||||
|
||||
static const char var_usage[] = "git var (-l | <variable>)";
|
||||
|
||||
static const char *editor(int flag)
|
||||
static char *committer(int ident_flag)
|
||||
{
|
||||
return git_editor();
|
||||
return xstrdup_or_null(git_committer_info(ident_flag));
|
||||
}
|
||||
|
||||
static const char *sequence_editor(int flag)
|
||||
static char *author(int ident_flag)
|
||||
{
|
||||
return git_sequence_editor();
|
||||
return xstrdup_or_null(git_author_info(ident_flag));
|
||||
}
|
||||
|
||||
static const char *pager(int flag)
|
||||
static char *editor(int ident_flag UNUSED)
|
||||
{
|
||||
return xstrdup_or_null(git_editor());
|
||||
}
|
||||
|
||||
static char *sequence_editor(int ident_flag UNUSED)
|
||||
{
|
||||
return xstrdup_or_null(git_sequence_editor());
|
||||
}
|
||||
|
||||
static char *pager(int ident_flag UNUSED)
|
||||
{
|
||||
const char *pgm = git_pager(1);
|
||||
|
||||
if (!pgm)
|
||||
pgm = "cat";
|
||||
return pgm;
|
||||
return xstrdup(pgm);
|
||||
}
|
||||
|
||||
static const char *default_branch(int flag)
|
||||
static char *default_branch(int ident_flag UNUSED)
|
||||
{
|
||||
return git_default_branch_name(1);
|
||||
return xstrdup_or_null(git_default_branch_name(1));
|
||||
}
|
||||
|
||||
static char *shell_path(int ident_flag UNUSED)
|
||||
{
|
||||
return xstrdup(SHELL_PATH);
|
||||
}
|
||||
|
||||
static char *git_attr_val_system(int ident_flag UNUSED)
|
||||
{
|
||||
if (git_attr_system_is_enabled()) {
|
||||
char *file = xstrdup(git_attr_system_file());
|
||||
normalize_path_copy(file, file);
|
||||
return file;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static char *git_attr_val_global(int ident_flag UNUSED)
|
||||
{
|
||||
char *file = xstrdup(git_attr_global_file());
|
||||
if (file) {
|
||||
normalize_path_copy(file, file);
|
||||
return file;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static char *git_config_val_system(int ident_flag UNUSED)
|
||||
{
|
||||
if (git_config_system()) {
|
||||
char *file = git_system_config();
|
||||
normalize_path_copy(file, file);
|
||||
return file;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static char *git_config_val_global(int ident_flag UNUSED)
|
||||
{
|
||||
struct strbuf buf = STRBUF_INIT;
|
||||
char *user, *xdg;
|
||||
size_t unused;
|
||||
|
||||
git_global_config(&user, &xdg);
|
||||
if (xdg && *xdg) {
|
||||
normalize_path_copy(xdg, xdg);
|
||||
strbuf_addf(&buf, "%s\n", xdg);
|
||||
}
|
||||
if (user && *user) {
|
||||
normalize_path_copy(user, user);
|
||||
strbuf_addf(&buf, "%s\n", user);
|
||||
}
|
||||
free(xdg);
|
||||
free(user);
|
||||
strbuf_trim_trailing_newline(&buf);
|
||||
if (buf.len == 0) {
|
||||
strbuf_release(&buf);
|
||||
return NULL;
|
||||
}
|
||||
return strbuf_detach(&buf, &unused);
|
||||
}
|
||||
|
||||
struct git_var {
|
||||
const char *name;
|
||||
const char *(*read)(int);
|
||||
char *(*read)(int);
|
||||
int multivalued;
|
||||
};
|
||||
static struct git_var git_vars[] = {
|
||||
{ "GIT_COMMITTER_IDENT", git_committer_info },
|
||||
{ "GIT_AUTHOR_IDENT", git_author_info },
|
||||
{ "GIT_EDITOR", editor },
|
||||
{ "GIT_SEQUENCE_EDITOR", sequence_editor },
|
||||
{ "GIT_PAGER", pager },
|
||||
{ "GIT_DEFAULT_BRANCH", default_branch },
|
||||
{ "", NULL },
|
||||
{
|
||||
.name = "GIT_COMMITTER_IDENT",
|
||||
.read = committer,
|
||||
},
|
||||
{
|
||||
.name = "GIT_AUTHOR_IDENT",
|
||||
.read = author,
|
||||
},
|
||||
{
|
||||
.name = "GIT_EDITOR",
|
||||
.read = editor,
|
||||
},
|
||||
{
|
||||
.name = "GIT_SEQUENCE_EDITOR",
|
||||
.read = sequence_editor,
|
||||
},
|
||||
{
|
||||
.name = "GIT_PAGER",
|
||||
.read = pager,
|
||||
},
|
||||
{
|
||||
.name = "GIT_DEFAULT_BRANCH",
|
||||
.read = default_branch,
|
||||
},
|
||||
{
|
||||
.name = "GIT_SHELL_PATH",
|
||||
.read = shell_path,
|
||||
},
|
||||
{
|
||||
.name = "GIT_ATTR_SYSTEM",
|
||||
.read = git_attr_val_system,
|
||||
},
|
||||
{
|
||||
.name = "GIT_ATTR_GLOBAL",
|
||||
.read = git_attr_val_global,
|
||||
},
|
||||
{
|
||||
.name = "GIT_CONFIG_SYSTEM",
|
||||
.read = git_config_val_system,
|
||||
},
|
||||
{
|
||||
.name = "GIT_CONFIG_GLOBAL",
|
||||
.read = git_config_val_global,
|
||||
.multivalued = 1,
|
||||
},
|
||||
{
|
||||
.name = "",
|
||||
.read = NULL,
|
||||
},
|
||||
};
|
||||
|
||||
static void list_vars(void)
|
||||
{
|
||||
struct git_var *ptr;
|
||||
const char *val;
|
||||
char *val;
|
||||
|
||||
for (ptr = git_vars; ptr->read; ptr++)
|
||||
if ((val = ptr->read(0)))
|
||||
printf("%s=%s\n", ptr->name, val);
|
||||
if ((val = ptr->read(0))) {
|
||||
if (ptr->multivalued && *val) {
|
||||
struct string_list list = STRING_LIST_INIT_DUP;
|
||||
int i;
|
||||
|
||||
string_list_split(&list, val, '\n', -1);
|
||||
for (i = 0; i < list.nr; i++)
|
||||
printf("%s=%s\n", ptr->name, list.items[i].string);
|
||||
string_list_clear(&list, 0);
|
||||
} else {
|
||||
printf("%s=%s\n", ptr->name, val);
|
||||
}
|
||||
free(val);
|
||||
}
|
||||
}
|
||||
|
||||
static const struct git_var *get_git_var(const char *var)
|
||||
@ -83,7 +211,7 @@ static int show_config(const char *var, const char *value, void *cb)
|
||||
int cmd_var(int argc, const char **argv, const char *prefix UNUSED)
|
||||
{
|
||||
const struct git_var *git_var;
|
||||
const char *val;
|
||||
char *val;
|
||||
|
||||
if (argc != 2)
|
||||
usage(var_usage);
|
||||
@ -104,6 +232,7 @@ int cmd_var(int argc, const char **argv, const char *prefix UNUSED)
|
||||
return 1;
|
||||
|
||||
printf("%s\n", val);
|
||||
free(val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user