Re: [PATCH 07/20] path: hide functions using `the_repository` by default
- From
Justin Tobler <jltobler@gmail.com>
- Date
- Aug 9, 2024, 19:43 UTC
- Message-ID
- <mc4omj4mi23fhmqp4xeafcluzf2iidp4uaf3h3gaxcalm3igvk@a7abzjynshfw>
- In-Reply-To
- <b4e973a2804ba09149224a2e18a359717228607e.1723013714.git.ps@pks.im>
On 24/08/07 08:57AM, Patrick Steinhardt wrote:
> The path subsytem provides a bunch of legacy functions that compute
s/subsytem/subsystem/
Show 7 quoted lines
> paths relative to the "gitdir" and "commondir" directories of the global > `the_repository` variable. Use of those functions is discouraged, and it > is easy to miss the implicit dependency on `the_repository` that calls > to those functions may cause. > > With `USE_THE_REPOSITORY_VARIABLE`, we have recently introduced a tool > that allows us to get rid of such functions over time. With this define,
s/define/defined/
Show 9 quoted lines
> we can hide away functions that have such implicit dependency such that > other subsystems that want to be free of `the_repository` will not use > them by accident. > > Move all path-related functions that use `the_repository` into a block > that gets only conditionally compiled depending on whether or not the > macro has been defined. This also removes all dependencies on that > variable in "path.c", allowing us to remove the definition of said > preprocessor macro.
Nice! So now the "path.c" is `the_repository` free. Implicit use of `the_repository` is guarded behind `USE_THE_REPOSITORY_VARIABLE`. This is quite neat. :)
Show 26 quoted lines
> > Signed-off-by: Patrick Steinhardt <ps@pks.im> > --- > path.c | 52 +------------------- > path.h | 147 ++++++++++++++++++++++++++++++++++++++------------------- > 2 files changed, 100 insertions(+), 99 deletions(-) > > diff --git a/path.c b/path.c > index 567eff5253..d073ae6449 100644 > --- a/path.c > +++ b/path.c > @@ -2,8 +2,6 @@ > * Utilities for paths and pathnames > */ > > -#define USE_THE_REPOSITORY_VARIABLE > - > #include "git-compat-util.h" > #include "abspath.h" > #include "environment.h" > @@ -30,7 +28,7 @@ static int get_st_mode_bits(const char *path, int *mode) > return 0; > } > > -static struct strbuf *get_pathname(void) > +struct strbuf *get_pathname(void)
Now that functions with implicit `the_repository` usage are static inlined we are required to expose `get_pathname()` for the same reason as some of the other functions in previous commits.
[snip]
> +# ifdef USE_THE_REPOSITORY_VARIABLE > +# include "strbuf.h" > +# include "repository.h"
Naive question, what is the purpose of providing the include statements here? Wouldn't they always already be included?
Show 84 quoted lines
> +
> +/*
> + * Return a statically allocated path into the main repository's
> + * (the_repository) common git directory.
> + */
> +__attribute__((format (printf, 1, 2)))
> +static inline const char *git_common_path(const char *fmt, ...)
> +{
> + struct strbuf *pathname = get_pathname();
> + va_list args;
> + va_start(args, fmt);
> + strbuf_git_common_pathv(pathname, the_repository, fmt, args);
> + va_end(args);
> + return pathname->buf;
> +}
> +
> +/*
> + * Construct a path into the main repository's (the_repository) git directory
> + * and place it in the provided buffer `buf`, the contents of the buffer will
> + * be overridden.
> + */
> +__attribute__((format (printf, 2, 3)))
> +static inline char *git_path_buf(struct strbuf *buf, const char *fmt, ...)
> +{
> + va_list args;
> + strbuf_reset(buf);
> + va_start(args, fmt);
> + repo_git_pathv(the_repository, NULL, buf, fmt, args);
> + va_end(args);
> + return buf->buf;
> +}
> +
> +/*
> + * Construct a path into the main repository's (the_repository) git directory
> + * and append it to the provided buffer `sb`.
> + */
> +__attribute__((format (printf, 2, 3)))
> +static inline void strbuf_git_path(struct strbuf *sb, const char *fmt, ...)
> +{
> + va_list args;
> + va_start(args, fmt);
> + repo_git_pathv(the_repository, NULL, sb, fmt, args);
> + va_end(args);
> +}
> +
> +/*
> + * Return a statically allocated path into the main repository's
> + * (the_repository) git directory.
> + */
> +__attribute__((format (printf, 1, 2)))
> +static inline const char *git_path(const char *fmt, ...)
> +{
> + struct strbuf *pathname = get_pathname();
> + va_list args;
> + va_start(args, fmt);
> + repo_git_pathv(the_repository, NULL, pathname, fmt, args);
> + va_end(args);
> + return pathname->buf;
> +}
> +
> +#define GIT_PATH_FUNC(func, filename) \
> + const char *func(void) \
> + { \
> + static char *ret; \
> + if (!ret) \
> + ret = git_pathdup(filename); \
> + return ret; \
> + }
> +
> +/*
> + * Return a path into the main repository's (the_repository) git directory.
> + */
> +__attribute__((format (printf, 1, 2)))
> +static inline char *git_pathdup(const char *fmt, ...)
> +{
> + struct strbuf path = STRBUF_INIT;
> + va_list args;
> + va_start(args, fmt);
> + repo_git_pathv(the_repository, NULL, &path, fmt, args);
> + va_end(args);
> + return strbuf_detach(&path, NULL);
> +}
> +
> +# endif /* USE_THE_REPOSITORY_VARIABLE */I like how it's all consolidated into this one block. Very nice! :)