Elijah Newren | dabab1d | 2023-04-11 00:41:49 -0700 | [diff] [blame] | 1 | #ifndef OBJECT_NAME_H |
| 2 | #define OBJECT_NAME_H |
| 3 | |
| 4 | #include "object.h" |
| 5 | #include "strbuf.h" |
| 6 | |
| 7 | struct object_id; |
| 8 | struct repository; |
| 9 | |
| 10 | struct object_context { |
| 11 | unsigned short mode; |
| 12 | /* |
| 13 | * symlink_path is only used by get_tree_entry_follow_symlinks, |
| 14 | * and only for symlinks that point outside the repository. |
| 15 | */ |
| 16 | struct strbuf symlink_path; |
| 17 | /* |
| 18 | * If GET_OID_RECORD_PATH is set, this will record path (if any) |
| 19 | * found when resolving the name. The caller is responsible for |
| 20 | * releasing the memory. |
| 21 | */ |
| 22 | char *path; |
| 23 | }; |
| 24 | |
| 25 | /* |
| 26 | * Return an abbreviated sha1 unique within this repository's object database. |
| 27 | * The result will be at least `len` characters long, and will be NUL |
| 28 | * terminated. |
| 29 | * |
| 30 | * The non-`_r` version returns a static buffer which remains valid until 4 |
| 31 | * more calls to repo_find_unique_abbrev are made. |
| 32 | * |
| 33 | * The `_r` variant writes to a buffer supplied by the caller, which must be at |
| 34 | * least `GIT_MAX_HEXSZ + 1` bytes. The return value is the number of bytes |
| 35 | * written (excluding the NUL terminator). |
| 36 | * |
| 37 | * Note that while this version avoids the static buffer, it is not fully |
| 38 | * reentrant, as it calls into other non-reentrant git code. |
| 39 | */ |
| 40 | const char *repo_find_unique_abbrev(struct repository *r, const struct object_id *oid, int len); |
| 41 | int repo_find_unique_abbrev_r(struct repository *r, char *hex, const struct object_id *oid, int len); |
| 42 | |
Calvin Wan | f940185 | 2023-06-06 19:48:41 +0000 | [diff] [blame] | 43 | /** |
| 44 | * Add the abbreviation, as generated by repo_find_unique_abbrev(), of `sha1` to |
| 45 | * the strbuf `sb`. |
| 46 | */ |
| 47 | void strbuf_repo_add_unique_abbrev(struct strbuf *sb, struct repository *repo, |
| 48 | const struct object_id *oid, int abbrev_len); |
| 49 | void strbuf_add_unique_abbrev(struct strbuf *sb, const struct object_id *oid, |
| 50 | int abbrev_len); |
| 51 | |
Elijah Newren | dabab1d | 2023-04-11 00:41:49 -0700 | [diff] [blame] | 52 | int repo_get_oid(struct repository *r, const char *str, struct object_id *oid); |
| 53 | __attribute__((format (printf, 2, 3))) |
| 54 | int get_oidf(struct object_id *oid, const char *fmt, ...); |
| 55 | int repo_get_oid_commit(struct repository *r, const char *str, struct object_id *oid); |
| 56 | int repo_get_oid_committish(struct repository *r, const char *str, struct object_id *oid); |
| 57 | int repo_get_oid_tree(struct repository *r, const char *str, struct object_id *oid); |
| 58 | int repo_get_oid_treeish(struct repository *r, const char *str, struct object_id *oid); |
| 59 | int repo_get_oid_blob(struct repository *r, const char *str, struct object_id *oid); |
| 60 | int repo_get_oid_mb(struct repository *r, const char *str, struct object_id *oid); |
| 61 | void maybe_die_on_misspelt_object_name(struct repository *repo, |
| 62 | const char *name, |
| 63 | const char *prefix); |
| 64 | enum get_oid_result get_oid_with_context(struct repository *repo, const char *str, |
| 65 | unsigned flags, struct object_id *oid, |
| 66 | struct object_context *oc); |
| 67 | |
| 68 | |
| 69 | typedef int each_abbrev_fn(const struct object_id *oid, void *); |
Eric W. Biederman | 52fca06 | 2023-10-01 21:40:07 -0500 | [diff] [blame] | 70 | int repo_for_each_abbrev(struct repository *r, const char *prefix, |
| 71 | const struct git_hash_algo *algo, each_abbrev_fn, void *); |
Elijah Newren | dabab1d | 2023-04-11 00:41:49 -0700 | [diff] [blame] | 72 | |
| 73 | int set_disambiguate_hint_config(const char *var, const char *value); |
| 74 | |
| 75 | /* |
| 76 | * This reads short-hand syntax that not only evaluates to a commit |
| 77 | * object name, but also can act as if the end user spelled the name |
| 78 | * of the branch from the command line. |
| 79 | * |
| 80 | * - "@{-N}" finds the name of the Nth previous branch we were on, and |
| 81 | * places the name of the branch in the given buf and returns the |
| 82 | * number of characters parsed if successful. |
| 83 | * |
| 84 | * - "<branch>@{upstream}" finds the name of the other ref that |
| 85 | * <branch> is configured to merge with (missing <branch> defaults |
| 86 | * to the current branch), and places the name of the branch in the |
| 87 | * given buf and returns the number of characters parsed if |
| 88 | * successful. |
| 89 | * |
| 90 | * If the input is not of the accepted format, it returns a negative |
| 91 | * number to signal an error. |
| 92 | * |
| 93 | * If the input was ok but there are not N branch switches in the |
| 94 | * reflog, it returns 0. |
| 95 | */ |
| 96 | #define INTERPRET_BRANCH_LOCAL (1<<0) |
| 97 | #define INTERPRET_BRANCH_REMOTE (1<<1) |
| 98 | #define INTERPRET_BRANCH_HEAD (1<<2) |
| 99 | struct interpret_branch_name_options { |
| 100 | /* |
| 101 | * If "allowed" is non-zero, it is a treated as a bitfield of allowable |
| 102 | * expansions: local branches ("refs/heads/"), remote branches |
| 103 | * ("refs/remotes/"), or "HEAD". If no "allowed" bits are set, any expansion is |
| 104 | * allowed, even ones to refs outside of those namespaces. |
| 105 | */ |
| 106 | unsigned allowed; |
| 107 | |
| 108 | /* |
| 109 | * If ^{upstream} or ^{push} (or equivalent) is requested, and the |
| 110 | * branch in question does not have such a reference, return -1 instead |
| 111 | * of die()-ing. |
| 112 | */ |
| 113 | unsigned nonfatal_dangling_mark : 1; |
| 114 | }; |
| 115 | int repo_interpret_branch_name(struct repository *r, |
| 116 | const char *str, int len, |
| 117 | struct strbuf *buf, |
| 118 | const struct interpret_branch_name_options *options); |
| 119 | |
| 120 | struct object *repo_peel_to_type(struct repository *r, |
| 121 | const char *name, int namelen, |
| 122 | struct object *o, enum object_type); |
| 123 | |
| 124 | /* Convert to/from hex/sha1 representation */ |
| 125 | #define MINIMUM_ABBREV minimum_abbrev |
| 126 | #define DEFAULT_ABBREV default_abbrev |
| 127 | |
| 128 | /* used when the code does not know or care what the default abbrev is */ |
| 129 | #define FALLBACK_DEFAULT_ABBREV 7 |
| 130 | |
| 131 | #endif /* OBJECT_NAME_H */ |