Typedef git_config_level_t and use it everywhere

The GIT_CONFIG_LEVEL constants actually work well as an enum
because they are mutually exclusive, so this adds a typedef to
the enum and uses that everywhere that one of these constants are
expected, instead of the old code that typically used an unsigned
int.
This commit is contained in:
Russell Belfer 2013-05-24 10:35:58 -07:00
parent 2e62e7c23c
commit 16adc9fade
4 changed files with 44 additions and 29 deletions

View File

@ -27,18 +27,33 @@ GIT_BEGIN_DECL
* git_config_open_default() and git_repository_config() honor those * git_config_open_default() and git_repository_config() honor those
* priority levels as well. * priority levels as well.
*/ */
enum { typedef enum {
GIT_CONFIG_LEVEL_SYSTEM = 1, /**< System-wide configuration file. */ /** System-wide configuration file; /etc/gitconfig on Linux systems */
GIT_CONFIG_LEVEL_XDG = 2, /**< XDG compatible configuration file (.config/git/config). */ GIT_CONFIG_LEVEL_SYSTEM = 1,
GIT_CONFIG_LEVEL_GLOBAL = 3, /**< User-specific configuration file, also called Global configuration file. */
GIT_CONFIG_LEVEL_LOCAL = 4, /**< Repository specific configuration file. */ /** XDG compatible configuration file; typically ~/.config/git/config */
GIT_CONFIG_HIGHEST_LEVEL = -1, /**< Represents the highest level of a config file. */ GIT_CONFIG_LEVEL_XDG = 2,
};
/** User-specific configuration file (also called Global configuration
* file); typically ~/.gitconfig
*/
GIT_CONFIG_LEVEL_GLOBAL = 3,
/** Repository specific configuration file; $WORK_DIR/.git/config on
* non-bare repos
*/
GIT_CONFIG_LEVEL_LOCAL = 4,
/** Represents the highest level available config file (i.e. the most
* specific config file available that actually is loaded)
*/
GIT_CONFIG_HIGHEST_LEVEL = -1,
} git_config_level_t;
typedef struct { typedef struct {
const char *name; const char *name;
const char *value; const char *value;
unsigned int level; git_config_level_t level;
} git_config_entry; } git_config_entry;
typedef int (*git_config_foreach_cb)(const git_config_entry *, void *); typedef int (*git_config_foreach_cb)(const git_config_entry *, void *);
@ -155,7 +170,7 @@ GIT_EXTERN(int) git_config_new(git_config **out);
GIT_EXTERN(int) git_config_add_file_ondisk( GIT_EXTERN(int) git_config_add_file_ondisk(
git_config *cfg, git_config *cfg,
const char *path, const char *path,
unsigned int level, git_config_level_t level,
int force); int force);
/** /**
@ -192,7 +207,7 @@ GIT_EXTERN(int) git_config_open_ondisk(git_config **out, const char *path);
GIT_EXTERN(int) git_config_open_level( GIT_EXTERN(int) git_config_open_level(
git_config **out, git_config **out,
const git_config *parent, const git_config *parent,
unsigned int level); git_config_level_t level);
/** /**
* Open the global/XDG configuration file according to git's rules * Open the global/XDG configuration file according to git's rules
@ -241,7 +256,7 @@ GIT_EXTERN(void) git_config_free(git_config *cfg);
* @return 0 or an error code * @return 0 or an error code
*/ */
GIT_EXTERN(int) git_config_get_entry( GIT_EXTERN(int) git_config_get_entry(
const git_config_entry **out, const git_config_entry **out,
const git_config *cfg, const git_config *cfg,
const char *name); const char *name);

View File

@ -29,7 +29,7 @@ struct git_config_backend {
struct git_config *cfg; struct git_config *cfg;
/* Open means open the file/database and parse if necessary */ /* Open means open the file/database and parse if necessary */
int (*open)(struct git_config_backend *, unsigned int level); int (*open)(struct git_config_backend *, git_config_level_t level);
int (*get)(const struct git_config_backend *, const char *key, const git_config_entry **entry); int (*get)(const struct git_config_backend *, const char *key, const git_config_entry **entry);
int (*get_multivar)(struct git_config_backend *, const char *key, const char *regexp, git_config_foreach_cb callback, void *payload); int (*get_multivar)(struct git_config_backend *, const char *key, const char *regexp, git_config_foreach_cb callback, void *payload);
int (*set)(struct git_config_backend *, const char *key, const char *value); int (*set)(struct git_config_backend *, const char *key, const char *value);
@ -63,7 +63,7 @@ struct git_config_backend {
GIT_EXTERN(int) git_config_add_backend( GIT_EXTERN(int) git_config_add_backend(
git_config *cfg, git_config *cfg,
git_config_backend *file, git_config_backend *file,
unsigned int level, git_config_level_t level,
int force); int force);
/** @} */ /** @} */

View File

@ -23,7 +23,7 @@ typedef struct {
git_refcount rc; git_refcount rc;
git_config_backend *file; git_config_backend *file;
unsigned int level; git_config_level_t level;
} file_internal; } file_internal;
static void file_internal_free(file_internal *internal) static void file_internal_free(file_internal *internal)
@ -87,7 +87,7 @@ int git_config_new(git_config **out)
int git_config_add_file_ondisk( int git_config_add_file_ondisk(
git_config *cfg, git_config *cfg,
const char *path, const char *path,
unsigned int level, git_config_level_t level,
int force) int force)
{ {
git_config_backend *file = NULL; git_config_backend *file = NULL;
@ -138,11 +138,11 @@ int git_config_open_ondisk(git_config **out, const char *path)
static int find_internal_file_by_level( static int find_internal_file_by_level(
file_internal **internal_out, file_internal **internal_out,
const git_config *cfg, const git_config *cfg,
int level) git_config_level_t level)
{ {
int pos = -1; int pos = -1;
file_internal *internal; file_internal *internal;
unsigned int i; size_t i;
/* when passing GIT_CONFIG_HIGHEST_LEVEL, the idea is to get the config file /* when passing GIT_CONFIG_HIGHEST_LEVEL, the idea is to get the config file
* which has the highest level. As config files are stored in a vector * which has the highest level. As config files are stored in a vector
@ -153,14 +153,14 @@ static int find_internal_file_by_level(
pos = 0; pos = 0;
} else { } else {
git_vector_foreach(&cfg->files, i, internal) { git_vector_foreach(&cfg->files, i, internal) {
if (internal->level == (unsigned int)level) if (internal->level == level)
pos = i; pos = i;
} }
} }
if (pos == -1) { if (pos == -1) {
giterr_set(GITERR_CONFIG, giterr_set(GITERR_CONFIG,
"No config file exists for the given level '%i'", level); "No config file exists for the given level '%i'", (int)level);
return GIT_ENOTFOUND; return GIT_ENOTFOUND;
} }
@ -175,17 +175,17 @@ static int duplicate_level(void **old_raw, void *new_raw)
GIT_UNUSED(new_raw); GIT_UNUSED(new_raw);
giterr_set(GITERR_CONFIG, "A file with the same level (%i) has already been added to the config", (*old)->level); giterr_set(GITERR_CONFIG, "A file with the same level (%i) has already been added to the config", (int)(*old)->level);
return GIT_EEXISTS; return GIT_EEXISTS;
} }
static void try_remove_existing_file_internal( static void try_remove_existing_file_internal(
git_config *cfg, git_config *cfg,
unsigned int level) git_config_level_t level)
{ {
int pos = -1; int pos = -1;
file_internal *internal; file_internal *internal;
unsigned int i; size_t i;
git_vector_foreach(&cfg->files, i, internal) { git_vector_foreach(&cfg->files, i, internal) {
if (internal->level == level) if (internal->level == level)
@ -206,7 +206,7 @@ static void try_remove_existing_file_internal(
static int git_config__add_internal( static int git_config__add_internal(
git_config *cfg, git_config *cfg,
file_internal *internal, file_internal *internal,
unsigned int level, git_config_level_t level,
int force) int force)
{ {
int result; int result;
@ -238,7 +238,7 @@ int git_config_open_global(git_config **cfg_out, git_config *cfg)
int git_config_open_level( int git_config_open_level(
git_config **cfg_out, git_config **cfg_out,
const git_config *cfg_parent, const git_config *cfg_parent,
unsigned int level) git_config_level_t level)
{ {
git_config *cfg; git_config *cfg;
file_internal *internal; file_internal *internal;
@ -263,7 +263,7 @@ int git_config_open_level(
int git_config_add_backend( int git_config_add_backend(
git_config *cfg, git_config *cfg,
git_config_backend *file, git_config_backend *file,
unsigned int level, git_config_level_t level,
int force) int force)
{ {
file_internal *internal; file_internal *internal;

View File

@ -81,10 +81,10 @@ typedef struct {
time_t file_mtime; time_t file_mtime;
size_t file_size; size_t file_size;
unsigned int level; git_config_level_t level;
} diskfile_backend; } diskfile_backend;
static int config_parse(diskfile_backend *cfg_file, unsigned int level); static int config_parse(diskfile_backend *cfg_file, git_config_level_t level);
static int parse_variable(diskfile_backend *cfg, char **var_name, char **var_value); static int parse_variable(diskfile_backend *cfg, char **var_name, char **var_value);
static int config_write(diskfile_backend *cfg, const char *key, const regex_t *preg, const char *value); static int config_write(diskfile_backend *cfg, const char *key, const regex_t *preg, const char *value);
static char *escape_value(const char *ptr); static char *escape_value(const char *ptr);
@ -181,7 +181,7 @@ static void free_vars(git_strmap *values)
git_strmap_free(values); git_strmap_free(values);
} }
static int config_open(git_config_backend *cfg, unsigned int level) static int config_open(git_config_backend *cfg, git_config_level_t level)
{ {
int res; int res;
diskfile_backend *b = (diskfile_backend *)cfg; diskfile_backend *b = (diskfile_backend *)cfg;
@ -965,7 +965,7 @@ static int strip_comments(char *line, int in_quotes)
return quote_count; return quote_count;
} }
static int config_parse(diskfile_backend *cfg_file, unsigned int level) static int config_parse(diskfile_backend *cfg_file, git_config_level_t level)
{ {
int c; int c;
char *current_section = NULL; char *current_section = NULL;