path.hon commit Merge branch 'tb/config-default' (26a4643)
   1#ifndef PATH_H
   2#define PATH_H
   3
   4struct repository;
   5
   6/*
   7 * The result to all functions which return statically allocated memory may be
   8 * overwritten by another call to _any_ one of these functions. Consider using
   9 * the safer variants which operate on strbufs or return allocated memory.
  10 */
  11
  12/*
  13 * Return a statically allocated path.
  14 */
  15extern const char *mkpath(const char *fmt, ...)
  16        __attribute__((format (printf, 1, 2)));
  17
  18/*
  19 * Return a path.
  20 */
  21extern char *mkpathdup(const char *fmt, ...)
  22        __attribute__((format (printf, 1, 2)));
  23
  24/*
  25 * Construct a path and place the result in the provided buffer `buf`.
  26 */
  27extern char *mksnpath(char *buf, size_t n, const char *fmt, ...)
  28        __attribute__((format (printf, 3, 4)));
  29
  30/*
  31 * The `git_common_path` family of functions will construct a path into a
  32 * repository's common git directory, which is shared by all worktrees.
  33 */
  34
  35/*
  36 * Constructs a path into the common git directory of repository `repo` and
  37 * append it in the provided buffer `sb`.
  38 */
  39extern void strbuf_git_common_path(struct strbuf *sb,
  40                                   const struct repository *repo,
  41                                   const char *fmt, ...)
  42        __attribute__((format (printf, 3, 4)));
  43
  44/*
  45 * Return a statically allocated path into the main repository's
  46 * (the_repository) common git directory.
  47 */
  48extern const char *git_common_path(const char *fmt, ...)
  49        __attribute__((format (printf, 1, 2)));
  50
  51
  52/*
  53 * The `git_path` family of functions will construct a path into a repository's
  54 * git directory.
  55 *
  56 * These functions will perform adjustments to the resultant path to account
  57 * for special paths which are either considered common among worktrees (e.g.
  58 * paths into the object directory) or have been explicitly set via an
  59 * environment variable or config (e.g. path to the index file).
  60 *
  61 * For an exhaustive list of the adjustments made look at `common_list` and
  62 * `adjust_git_path` in path.c.
  63 */
  64
  65/*
  66 * Return a path into the git directory of repository `repo`.
  67 */
  68extern char *repo_git_path(const struct repository *repo,
  69                           const char *fmt, ...)
  70        __attribute__((format (printf, 2, 3)));
  71
  72/*
  73 * Construct a path into the git directory of repository `repo` and append it
  74 * to the provided buffer `sb`.
  75 */
  76extern void strbuf_repo_git_path(struct strbuf *sb,
  77                                 const struct repository *repo,
  78                                 const char *fmt, ...)
  79        __attribute__((format (printf, 3, 4)));
  80
  81/*
  82 * Return a statically allocated path into the main repository's
  83 * (the_repository) git directory.
  84 */
  85extern const char *git_path(const char *fmt, ...)
  86        __attribute__((format (printf, 1, 2)));
  87
  88/*
  89 * Return a path into the main repository's (the_repository) git directory.
  90 */
  91extern char *git_pathdup(const char *fmt, ...)
  92        __attribute__((format (printf, 1, 2)));
  93
  94/*
  95 * Construct a path into the main repository's (the_repository) git directory
  96 * and place it in the provided buffer `buf`, the contents of the buffer will
  97 * be overridden.
  98 */
  99extern char *git_path_buf(struct strbuf *buf, const char *fmt, ...)
 100        __attribute__((format (printf, 2, 3)));
 101
 102/*
 103 * Construct a path into the main repository's (the_repository) git directory
 104 * and append it to the provided buffer `sb`.
 105 */
 106extern void strbuf_git_path(struct strbuf *sb, const char *fmt, ...)
 107        __attribute__((format (printf, 2, 3)));
 108
 109/*
 110 * Return a path into the worktree of repository `repo`.
 111 *
 112 * If the repository doesn't have a worktree NULL is returned.
 113 */
 114extern char *repo_worktree_path(const struct repository *repo,
 115                                const char *fmt, ...)
 116        __attribute__((format (printf, 2, 3)));
 117
 118/*
 119 * Construct a path into the worktree of repository `repo` and append it
 120 * to the provided buffer `sb`.
 121 *
 122 * If the repository doesn't have a worktree nothing will be appended to `sb`.
 123 */
 124extern void strbuf_repo_worktree_path(struct strbuf *sb,
 125                                      const struct repository *repo,
 126                                      const char *fmt, ...)
 127        __attribute__((format (printf, 3, 4)));
 128
 129/*
 130 * Return a path into a submodule's git directory located at `path`.  `path`
 131 * must only reference a submodule of the main repository (the_repository).
 132 */
 133extern char *git_pathdup_submodule(const char *path, const char *fmt, ...)
 134        __attribute__((format (printf, 2, 3)));
 135
 136/*
 137 * Construct a path into a submodule's git directory located at `path` and
 138 * append it to the provided buffer `sb`.  `path` must only reference a
 139 * submodule of the main repository (the_repository).
 140 */
 141extern int strbuf_git_path_submodule(struct strbuf *sb, const char *path,
 142                                     const char *fmt, ...)
 143        __attribute__((format (printf, 3, 4)));
 144
 145extern void report_linked_checkout_garbage(void);
 146
 147/*
 148 * You can define a static memoized git path like:
 149 *
 150 *    static GIT_PATH_FUNC(git_path_foo, "FOO");
 151 *
 152 * or use one of the global ones below.
 153 */
 154#define GIT_PATH_FUNC(func, filename) \
 155        const char *func(void) \
 156        { \
 157                static char *ret; \
 158                if (!ret) \
 159                        ret = git_pathdup(filename); \
 160                return ret; \
 161        }
 162
 163#define REPO_GIT_PATH_FUNC(var, filename) \
 164        const char *git_path_##var(struct repository *r) \
 165        { \
 166                if (!r->cached_paths.var) \
 167                        r->cached_paths.var = git_pathdup(filename); \
 168                return r->cached_paths.var; \
 169        }
 170
 171struct path_cache {
 172        const char *cherry_pick_head;
 173        const char *revert_head;
 174        const char *squash_msg;
 175        const char *merge_msg;
 176        const char *merge_rr;
 177        const char *merge_mode;
 178        const char *merge_head;
 179        const char *fetch_head;
 180        const char *shallow;
 181};
 182
 183#define PATH_CACHE_INIT { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
 184
 185const char *git_path_cherry_pick_head(struct repository *r);
 186const char *git_path_revert_head(struct repository *r);
 187const char *git_path_squash_msg(struct repository *r);
 188const char *git_path_merge_msg(struct repository *r);
 189const char *git_path_merge_rr(struct repository *r);
 190const char *git_path_merge_mode(struct repository *r);
 191const char *git_path_merge_head(struct repository *r);
 192const char *git_path_fetch_head(struct repository *r);
 193const char *git_path_shallow(struct repository *r);
 194
 195#endif /* PATH_H */