2023-04-11 15:41:49 +08:00
|
|
|
#ifndef OBJECT_NAME_H
|
|
|
|
#define OBJECT_NAME_H
|
|
|
|
|
|
|
|
#include "object.h"
|
|
|
|
#include "strbuf.h"
|
|
|
|
|
|
|
|
struct object_id;
|
|
|
|
struct repository;
|
|
|
|
|
|
|
|
struct object_context {
|
|
|
|
unsigned short mode;
|
|
|
|
/*
|
|
|
|
* symlink_path is only used by get_tree_entry_follow_symlinks,
|
|
|
|
* and only for symlinks that point outside the repository.
|
|
|
|
*/
|
|
|
|
struct strbuf symlink_path;
|
|
|
|
/*
|
|
|
|
* If GET_OID_RECORD_PATH is set, this will record path (if any)
|
|
|
|
* found when resolving the name. The caller is responsible for
|
|
|
|
* releasing the memory.
|
|
|
|
*/
|
|
|
|
char *path;
|
|
|
|
};
|
|
|
|
|
2024-06-11 17:19:59 +08:00
|
|
|
void object_context_release(struct object_context *ctx);
|
|
|
|
|
2023-04-11 15:41:49 +08:00
|
|
|
/*
|
|
|
|
* Return an abbreviated sha1 unique within this repository's object database.
|
|
|
|
* The result will be at least `len` characters long, and will be NUL
|
|
|
|
* terminated.
|
|
|
|
*
|
|
|
|
* The non-`_r` version returns a static buffer which remains valid until 4
|
|
|
|
* more calls to repo_find_unique_abbrev are made.
|
|
|
|
*
|
|
|
|
* The `_r` variant writes to a buffer supplied by the caller, which must be at
|
|
|
|
* least `GIT_MAX_HEXSZ + 1` bytes. The return value is the number of bytes
|
|
|
|
* written (excluding the NUL terminator).
|
|
|
|
*
|
|
|
|
* Note that while this version avoids the static buffer, it is not fully
|
|
|
|
* reentrant, as it calls into other non-reentrant git code.
|
|
|
|
*/
|
|
|
|
const char *repo_find_unique_abbrev(struct repository *r, const struct object_id *oid, int len);
|
|
|
|
int repo_find_unique_abbrev_r(struct repository *r, char *hex, const struct object_id *oid, int len);
|
|
|
|
|
2023-06-07 03:48:41 +08:00
|
|
|
/**
|
|
|
|
* Add the abbreviation, as generated by repo_find_unique_abbrev(), of `sha1` to
|
|
|
|
* the strbuf `sb`.
|
|
|
|
*/
|
|
|
|
void strbuf_repo_add_unique_abbrev(struct strbuf *sb, struct repository *repo,
|
|
|
|
const struct object_id *oid, int abbrev_len);
|
|
|
|
void strbuf_add_unique_abbrev(struct strbuf *sb, const struct object_id *oid,
|
|
|
|
int abbrev_len);
|
|
|
|
|
2023-04-11 15:41:49 +08:00
|
|
|
int repo_get_oid(struct repository *r, const char *str, struct object_id *oid);
|
|
|
|
__attribute__((format (printf, 2, 3)))
|
|
|
|
int get_oidf(struct object_id *oid, const char *fmt, ...);
|
|
|
|
int repo_get_oid_commit(struct repository *r, const char *str, struct object_id *oid);
|
|
|
|
int repo_get_oid_committish(struct repository *r, const char *str, struct object_id *oid);
|
|
|
|
int repo_get_oid_tree(struct repository *r, const char *str, struct object_id *oid);
|
|
|
|
int repo_get_oid_treeish(struct repository *r, const char *str, struct object_id *oid);
|
|
|
|
int repo_get_oid_blob(struct repository *r, const char *str, struct object_id *oid);
|
|
|
|
int repo_get_oid_mb(struct repository *r, const char *str, struct object_id *oid);
|
|
|
|
void maybe_die_on_misspelt_object_name(struct repository *repo,
|
|
|
|
const char *name,
|
|
|
|
const char *prefix);
|
|
|
|
enum get_oid_result get_oid_with_context(struct repository *repo, const char *str,
|
|
|
|
unsigned flags, struct object_id *oid,
|
|
|
|
struct object_context *oc);
|
|
|
|
|
|
|
|
|
|
|
|
typedef int each_abbrev_fn(const struct object_id *oid, void *);
|
2023-10-02 10:40:07 +08:00
|
|
|
int repo_for_each_abbrev(struct repository *r, const char *prefix,
|
|
|
|
const struct git_hash_algo *algo, each_abbrev_fn, void *);
|
2023-04-11 15:41:49 +08:00
|
|
|
|
|
|
|
int set_disambiguate_hint_config(const char *var, const char *value);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* This reads short-hand syntax that not only evaluates to a commit
|
|
|
|
* object name, but also can act as if the end user spelled the name
|
|
|
|
* of the branch from the command line.
|
|
|
|
*
|
|
|
|
* - "@{-N}" finds the name of the Nth previous branch we were on, and
|
|
|
|
* places the name of the branch in the given buf and returns the
|
|
|
|
* number of characters parsed if successful.
|
|
|
|
*
|
|
|
|
* - "<branch>@{upstream}" finds the name of the other ref that
|
|
|
|
* <branch> is configured to merge with (missing <branch> defaults
|
|
|
|
* to the current branch), and places the name of the branch in the
|
|
|
|
* given buf and returns the number of characters parsed if
|
|
|
|
* successful.
|
|
|
|
*
|
|
|
|
* If the input is not of the accepted format, it returns a negative
|
|
|
|
* number to signal an error.
|
|
|
|
*
|
|
|
|
* If the input was ok but there are not N branch switches in the
|
|
|
|
* reflog, it returns 0.
|
|
|
|
*/
|
|
|
|
#define INTERPRET_BRANCH_LOCAL (1<<0)
|
|
|
|
#define INTERPRET_BRANCH_REMOTE (1<<1)
|
|
|
|
#define INTERPRET_BRANCH_HEAD (1<<2)
|
|
|
|
struct interpret_branch_name_options {
|
|
|
|
/*
|
|
|
|
* If "allowed" is non-zero, it is a treated as a bitfield of allowable
|
|
|
|
* expansions: local branches ("refs/heads/"), remote branches
|
|
|
|
* ("refs/remotes/"), or "HEAD". If no "allowed" bits are set, any expansion is
|
|
|
|
* allowed, even ones to refs outside of those namespaces.
|
|
|
|
*/
|
|
|
|
unsigned allowed;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* If ^{upstream} or ^{push} (or equivalent) is requested, and the
|
|
|
|
* branch in question does not have such a reference, return -1 instead
|
|
|
|
* of die()-ing.
|
|
|
|
*/
|
|
|
|
unsigned nonfatal_dangling_mark : 1;
|
|
|
|
};
|
|
|
|
int repo_interpret_branch_name(struct repository *r,
|
|
|
|
const char *str, int len,
|
|
|
|
struct strbuf *buf,
|
|
|
|
const struct interpret_branch_name_options *options);
|
|
|
|
|
|
|
|
struct object *repo_peel_to_type(struct repository *r,
|
|
|
|
const char *name, int namelen,
|
|
|
|
struct object *o, enum object_type);
|
|
|
|
|
|
|
|
/* Convert to/from hex/sha1 representation */
|
|
|
|
#define MINIMUM_ABBREV minimum_abbrev
|
|
|
|
#define DEFAULT_ABBREV default_abbrev
|
|
|
|
|
|
|
|
/* used when the code does not know or care what the default abbrev is */
|
|
|
|
#define FALLBACK_DEFAULT_ABBREV 7
|
|
|
|
|
|
|
|
#endif /* OBJECT_NAME_H */
|