From afc711b8e1ee89626f0dddf0ef01fb73168d47ca Mon Sep 17 00:00:00 2001 From: Michael Haggerty Date: Tue, 18 Feb 2014 12:24:55 +0100 Subject: rename read_replace_refs to check_replace_refs The semantics of this flag was changed in commit e1111cef23 inline lookup_replace_object() calls but wasn't renamed at the time to minimize code churn. Rename it now, and add a comment explaining its use. Signed-off-by: Michael Haggerty Signed-off-by: Junio C Hamano diff --git a/builtin/fsck.c b/builtin/fsck.c index 1affdd5..3d42978 100644 --- a/builtin/fsck.c +++ b/builtin/fsck.c @@ -630,7 +630,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix) struct alternate_object_database *alt; errors_found = 0; - read_replace_refs = 0; + check_replace_refs = 0; argc = parse_options(argc, argv, prefix, fsck_opts, fsck_usage, 0); diff --git a/builtin/index-pack.c b/builtin/index-pack.c index 2f37a38..a6b1c17 100644 --- a/builtin/index-pack.c +++ b/builtin/index-pack.c @@ -1502,7 +1502,7 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix) if (argc == 2 && !strcmp(argv[1], "-h")) usage(index_pack_usage); - read_replace_refs = 0; + check_replace_refs = 0; reset_pack_idx_option(&opts); git_config(git_index_pack_config, &opts); diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c index 541667f..124015d 100644 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@ -2507,7 +2507,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix) OPT_END(), }; - read_replace_refs = 0; + check_replace_refs = 0; reset_pack_idx_option(&pack_idx_opts); git_config(git_pack_config, NULL); diff --git a/builtin/prune.c b/builtin/prune.c index de43b26..68adc1c 100644 --- a/builtin/prune.c +++ b/builtin/prune.c @@ -150,7 +150,7 @@ int cmd_prune(int argc, const char **argv, const char *prefix) expire = ULONG_MAX; save_commit_buffer = 0; - read_replace_refs = 0; + check_replace_refs = 0; init_revisions(&revs, prefix); argc = parse_options(argc, argv, prefix, options, prune_usage, 0); diff --git a/builtin/replace.c b/builtin/replace.c index 2336325..8b59775 100644 --- a/builtin/replace.c +++ b/builtin/replace.c @@ -178,7 +178,7 @@ int cmd_replace(int argc, const char **argv, const char *prefix) OPT_END() }; - read_replace_refs = 0; + check_replace_refs = 0; argc = parse_options(argc, argv, prefix, options, git_replace_usage, 0); diff --git a/builtin/unpack-objects.c b/builtin/unpack-objects.c index 62ff673..df2d3e3 100644 --- a/builtin/unpack-objects.c +++ b/builtin/unpack-objects.c @@ -497,7 +497,7 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix) int i; unsigned char sha1[20]; - read_replace_refs = 0; + check_replace_refs = 0; git_config(git_default_config, NULL); diff --git a/cache.h b/cache.h index dc040fb..b039abc 100644 --- a/cache.h +++ b/cache.h @@ -580,7 +580,17 @@ extern size_t packed_git_limit; extern size_t delta_base_cache_limit; extern unsigned long big_file_threshold; extern unsigned long pack_size_limit_cfg; -extern int read_replace_refs; + +/* + * Do replace refs need to be checked this run? This variable is + * initialized to true unless --no-replace-object is used or + * $GIT_NO_REPLACE_OBJECTS is set, but is set to false by some + * commands that do not want replace references to be active. As an + * optimization it is also set to false if replace references have + * been sought but there were none. + */ +extern int check_replace_refs; + extern int fsync_object_files; extern int core_preload_index; extern int core_apply_sparse_checkout; @@ -791,7 +801,7 @@ static inline void *read_sha1_file(const unsigned char *sha1, enum object_type * extern const unsigned char *do_lookup_replace_object(const unsigned char *sha1); static inline const unsigned char *lookup_replace_object(const unsigned char *sha1) { - if (!read_replace_refs) + if (!check_replace_refs) return sha1; return do_lookup_replace_object(sha1); } diff --git a/environment.c b/environment.c index 4a3437d..c3c8606 100644 --- a/environment.c +++ b/environment.c @@ -45,7 +45,7 @@ const char *editor_program; const char *askpass_program; const char *excludes_file; enum auto_crlf auto_crlf = AUTO_CRLF_FALSE; -int read_replace_refs = 1; /* NEEDSWORK: rename to use_replace_refs */ +int check_replace_refs = 1; enum eol core_eol = EOL_UNSET; enum safe_crlf safe_crlf = SAFE_CRLF_WARN; unsigned whitespace_rule_cfg = WS_DEFAULT_RULE; @@ -147,7 +147,7 @@ static void setup_git_env(void) if (!git_graft_file) git_graft_file = git_pathdup("info/grafts"); if (getenv(NO_REPLACE_OBJECTS_ENVIRONMENT)) - read_replace_refs = 0; + check_replace_refs = 0; namespace = expand_namespace(getenv(GIT_NAMESPACE_ENVIRONMENT)); namespace_len = strlen(namespace); shallow_file = getenv(GIT_SHALLOW_FILE_ENVIRONMENT); diff --git a/git.c b/git.c index 7cf2953..9efd1a3 100644 --- a/git.c +++ b/git.c @@ -78,7 +78,7 @@ static int handle_options(const char ***argv, int *argc, int *envchanged) if (envchanged) *envchanged = 1; } else if (!strcmp(cmd, "--no-replace-objects")) { - read_replace_refs = 0; + check_replace_refs = 0; setenv(NO_REPLACE_OBJECTS_ENVIRONMENT, "1", 1); if (envchanged) *envchanged = 1; diff --git a/log-tree.c b/log-tree.c index 08970bf..5ce217d 100644 --- a/log-tree.c +++ b/log-tree.c @@ -100,7 +100,7 @@ static int add_ref_decoration(const char *refname, const unsigned char *sha1, in if (starts_with(refname, "refs/replace/")) { unsigned char original_sha1[20]; - if (!read_replace_refs) + if (!check_replace_refs) return 0; if (get_sha1_hex(refname + 13, original_sha1)) { warning("invalid replace ref %s", refname); diff --git a/replace_object.c b/replace_object.c index cdcaf8c..c5cf9f4 100644 --- a/replace_object.c +++ b/replace_object.c @@ -86,7 +86,7 @@ static void prepare_replace_object(void) for_each_replace_ref(register_replace_ref, NULL); replace_object_prepared = 1; if (!replace_object_nr) - read_replace_refs = 0; + check_replace_refs = 0; } /* We allow "recursive" replacement. Only within reason, though */ diff --git a/upload-pack.c b/upload-pack.c index 0c44f6b..9314c25 100644 --- a/upload-pack.c +++ b/upload-pack.c @@ -796,7 +796,7 @@ int main(int argc, char **argv) packet_trace_identity("upload-pack"); git_extract_argv0_path(argv[0]); - read_replace_refs = 0; + check_replace_refs = 0; for (i = 1; i < argc; i++) { char *arg = argv[i]; -- cgit v0.10.2-6-g49f6 From 1f91e79cf61eaa7cb26eb0aa1e257b7681c4c328 Mon Sep 17 00:00:00 2001 From: Michael Haggerty Date: Fri, 28 Feb 2014 17:29:16 +0100 Subject: Add docstrings for lookup_replace_object() and do_lookup_replace_object() Signed-off-by: Michael Haggerty Signed-off-by: Junio C Hamano diff --git a/cache.h b/cache.h index b039abc..9407560 100644 --- a/cache.h +++ b/cache.h @@ -798,13 +798,26 @@ static inline void *read_sha1_file(const unsigned char *sha1, enum object_type * { return read_sha1_file_extended(sha1, type, size, LOOKUP_REPLACE_OBJECT); } + +/* + * This internal function is only declared here for the benefit of + * lookup_replace_object(). Please do not call it directly. + */ extern const unsigned char *do_lookup_replace_object(const unsigned char *sha1); + +/* + * If object sha1 should be replaced, return the replacement object's + * name (replaced recursively, if necessary). The return value is + * either sha1 or a pointer to a permanently-allocated value. When + * object replacement is suppressed, always return sha1. + */ static inline const unsigned char *lookup_replace_object(const unsigned char *sha1) { if (!check_replace_refs) return sha1; return do_lookup_replace_object(sha1); } + static inline const unsigned char *lookup_replace_object_extended(const unsigned char *sha1, unsigned flag) { if (!(flag & LOOKUP_REPLACE_OBJECT)) diff --git a/replace_object.c b/replace_object.c index c5cf9f4..31fabde 100644 --- a/replace_object.c +++ b/replace_object.c @@ -92,6 +92,13 @@ static void prepare_replace_object(void) /* We allow "recursive" replacement. Only within reason, though */ #define MAXREPLACEDEPTH 5 +/* + * If a replacement for object sha1 has been set up, return the + * replacement object's name (replaced recursively, if necessary). + * The return value is either sha1 or a pointer to a + * permanently-allocated value. This function always respects replace + * references, regardless of the value of check_replace_refs. + */ const unsigned char *do_lookup_replace_object(const unsigned char *sha1) { int pos, depth = MAXREPLACEDEPTH; -- cgit v0.10.2-6-g49f6 From 33bef7ea256e620c579aeff0e672b0becc79c75c Mon Sep 17 00:00:00 2001 From: Michael Haggerty Date: Fri, 28 Feb 2014 17:29:17 +0100 Subject: Document some functions defined in object.c Signed-off-by: Michael Haggerty Acked-by: Nicolas Pitre Signed-off-by: Junio C Hamano diff --git a/object.c b/object.c index 584f7ac..57a0890 100644 --- a/object.c +++ b/object.c @@ -43,14 +43,32 @@ int type_from_string(const char *str) die("invalid object type \"%s\"", str); } +/* + * Return a numerical hash value between 0 and n-1 for the object with + * the specified sha1. n must be a power of 2. Please note that the + * return value is *not* consistent across computer architectures. + */ static unsigned int hash_obj(const unsigned char *sha1, unsigned int n) { unsigned int hash; + + /* + * Since the sha1 is essentially random, we just take the + * required number of bits directly from the first + * sizeof(unsigned int) bytes of sha1. First we have to copy + * the bytes into a properly aligned integer. If we cared + * about getting consistent results across architectures, we + * would have to call ntohl() here, too. + */ memcpy(&hash, sha1, sizeof(unsigned int)); - /* Assumes power-of-2 hash sizes in grow_object_hash */ return hash & (n - 1); } +/* + * Insert obj into the hash table hash, which has length size (which + * must be a power of 2). On collisions, simply overflow to the next + * empty bucket. + */ static void insert_obj_hash(struct object *obj, struct object **hash, unsigned int size) { unsigned int j = hash_obj(obj->sha1, size); @@ -63,6 +81,10 @@ static void insert_obj_hash(struct object *obj, struct object **hash, unsigned i hash[j] = obj; } +/* + * Look up the record for the given sha1 in the hash map stored in + * obj_hash. Return NULL if it was not found. + */ struct object *lookup_object(const unsigned char *sha1) { unsigned int i, first; @@ -92,6 +114,11 @@ struct object *lookup_object(const unsigned char *sha1) return obj; } +/* + * Increase the size of the hash map stored in obj_hash to the next + * power of 2 (but at least 32). Copy the existing values to the new + * hash map. + */ static void grow_object_hash(void) { int i; diff --git a/object.h b/object.h index dc5df8c..732bf4d 100644 --- a/object.h +++ b/object.h @@ -42,7 +42,14 @@ struct object { extern const char *typename(unsigned int type); extern int type_from_string(const char *str); +/* + * Return the current number of buckets in the object hashmap. + */ extern unsigned int get_max_object_index(void); + +/* + * Return the object from the specified bucket in the object hashmap. + */ extern struct object *get_indexed_object(unsigned int); /* -- cgit v0.10.2-6-g49f6