From: Junio C Hamano Date: Mon, 9 Sep 2019 19:26:39 +0000 (-0700) Subject: Merge branch 'rs/sort-oid-array-thread-safe' X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/2743b61bc65156d337c0740da5122b58a044b1a5?hp=-c Merge branch 'rs/sort-oid-array-thread-safe' Prepare get_short_oid() codepath to be thread-safe. * rs/sort-oid-array-thread-safe: sha1-name: make sort_ambiguous_oid_array() thread-safe --- 2743b61bc65156d337c0740da5122b58a044b1a5 diff --combined sha1-name.c index 2989e27b71,c99fbb2f8e..c665e3f96d --- a/sha1-name.c +++ b/sha1-name.c @@@ -403,9 -403,9 +403,9 @@@ static int repo_collect_ambiguous(struc return collect_ambiguous(oid, data); } - static struct repository *sort_ambiguous_repo; - static int sort_ambiguous(const void *a, const void *b) + static int sort_ambiguous(const void *a, const void *b, void *ctx) { + struct repository *sort_ambiguous_repo = ctx; int a_type = oid_object_info(sort_ambiguous_repo, a, NULL); int b_type = oid_object_info(sort_ambiguous_repo, b, NULL); int a_type_sort; @@@ -434,10 -434,7 +434,7 @@@ static void sort_ambiguous_oid_array(struct repository *r, struct oid_array *a) { - /* mutex will be needed if this code is to be made thread safe */ - sort_ambiguous_repo = r; - QSORT(a->oid, a->nr, sort_ambiguous); - sort_ambiguous_repo = NULL; + QSORT_S(a->oid, a->nr, sort_ambiguous, r); } static enum get_oid_result get_short_oid(struct repository *r, @@@ -478,7 -475,7 +475,7 @@@ * or migrated from loose to packed. */ if (status == MISSING_OBJECT) { - reprepare_packed_git(the_repository); + reprepare_packed_git(r); find_short_object_filename(&ds); find_short_packed_object(&ds); status = finish_object_disambiguation(&ds, oid); @@@ -801,7 -798,7 +798,7 @@@ static int get_oid_basic(struct reposit "because it will be ignored when you just specify 40-hex. These refs\n" "may be created by mistake. For example,\n" "\n" - " git checkout -b $br $(git rev-parse ...)\n" + " git switch -c $br $(git rev-parse ...)\n" "\n" "where \"$br\" is somehow empty and a 40-hex ref is created. Please\n" "examine these refs and maybe delete them. Turn this message off by\n" @@@ -1389,7 -1386,9 +1386,7 @@@ int repo_get_oid_mb(struct repository * two = lookup_commit_reference_gently(r, &oid_tmp, 0); if (!two) return -1; - if (r != the_repository) - BUG("sorry get_merge_bases() can't take struct repository yet"); - mbs = get_merge_bases(one, two); + mbs = repo_get_merge_bases(r, one, two); if (!mbs || mbs->next) st = -1; else { @@@ -1675,8 -1674,7 +1672,8 @@@ int repo_get_oid_blob(struct repositor } /* Must be called only when object_name:filename doesn't exist. */ -static void diagnose_invalid_oid_path(const char *prefix, +static void diagnose_invalid_oid_path(struct repository *r, + const char *prefix, const char *filename, const struct object_id *tree_oid, const char *object_name, @@@ -1694,7 -1692,7 +1691,7 @@@ if (is_missing_file_error(errno)) { char *fullname = xstrfmt("%s%s", prefix, filename); - if (!get_tree_entry(tree_oid, fullname, &oid, &mode)) { + if (!get_tree_entry(r, tree_oid, fullname, &oid, &mode)) { die("Path '%s' exists, but not '%s'.\n" "Did you mean '%.*s:%s' aka '%.*s:./%s'?", fullname, @@@ -1888,15 -1886,23 +1885,15 @@@ static enum get_oid_result get_oid_with new_filename = resolve_relative_path(repo, filename); if (new_filename) filename = new_filename; - /* - * NEEDSWORK: Eventually get_tree_entry*() should - * learn to take struct repository directly and we - * would not need to inject submodule odb to the - * in-core odb. - */ - if (repo != the_repository) - add_to_alternates_memory(repo->objects->odb->path); if (flags & GET_OID_FOLLOW_SYMLINKS) { - ret = get_tree_entry_follow_symlinks(&tree_oid, + ret = get_tree_entry_follow_symlinks(repo, &tree_oid, filename, oid, &oc->symlink_path, &oc->mode); } else { - ret = get_tree_entry(&tree_oid, filename, oid, + ret = get_tree_entry(repo, &tree_oid, filename, oid, &oc->mode); if (ret && only_to_die) { - diagnose_invalid_oid_path(prefix, + diagnose_invalid_oid_path(repo, prefix, filename, &tree_oid, name, len);