From: Junio C Hamano <gitster@pobox.com>
To: git@vger.kernel.org
Subject: [PATCH v2 4/9] sha1_name.c: refactor find_short_packed_object()
Date: Wed, 20 Jun 2012 23:35:27 -0700 [thread overview]
Message-ID: <1340260532-11378-5-git-send-email-gitster@pobox.com> (raw)
In-Reply-To: <1340260532-11378-1-git-send-email-gitster@pobox.com>
Extract the logic to find object(s) that match a given prefix inside
a single pack into a separate helper function, and give it a bit more
comment.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
sha1_name.c | 103 +++++++++++++++++++++++++++++++++---------------------------
1 file changed, 56 insertions(+), 47 deletions(-)
diff --git a/sha1_name.c b/sha1_name.c
index 5224f39..e03992c 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -78,6 +78,59 @@ static int match_sha(unsigned len, const unsigned char *a, const unsigned char *
return 1;
}
+static int unique_in_pack(int len,
+ const unsigned char *match,
+ struct packed_git *p,
+ const unsigned char **found_sha1,
+ int seen_so_far)
+{
+ uint32_t num, last, i, first = 0;
+ const unsigned char *current = NULL;
+
+ open_pack_index(p);
+ num = p->num_objects;
+ last = num;
+ while (first < last) {
+ uint32_t mid = (first + last) / 2;
+ const unsigned char *current;
+ int cmp;
+
+ current = nth_packed_object_sha1(p, mid);
+ cmp = hashcmp(match, current);
+ if (!cmp) {
+ first = mid;
+ break;
+ }
+ if (cmp > 0) {
+ first = mid+1;
+ continue;
+ }
+ last = mid;
+ }
+
+ /*
+ * At this point, "first" is the location of the lowest object
+ * with an object name that could match "match". See if we have
+ * 0, 1 or more objects that actually match(es).
+ */
+ for (i = first; i < num; i++) {
+ current = nth_packed_object_sha1(p, first);
+ if (!match_sha(len, match, current))
+ break;
+
+ /* current matches */
+ if (!seen_so_far) {
+ *found_sha1 = current;
+ seen_so_far++;
+ } else if (seen_so_far) {
+ /* is it the same as the one previously found elsewhere? */
+ if (hashcmp(*found_sha1, current))
+ return 2; /* definitely not unique */
+ }
+ }
+ return seen_so_far;
+}
+
static int find_short_packed_object(int len, const unsigned char *match, unsigned char *sha1)
{
struct packed_git *p;
@@ -85,53 +138,9 @@ static int find_short_packed_object(int len, const unsigned char *match, unsigne
int found = 0;
prepare_packed_git();
- for (p = packed_git; p && found < 2; p = p->next) {
- uint32_t num, last;
- uint32_t first = 0;
- open_pack_index(p);
- num = p->num_objects;
- last = num;
- while (first < last) {
- uint32_t mid = (first + last) / 2;
- const unsigned char *current;
- int cmp;
-
- current = nth_packed_object_sha1(p, mid);
- cmp = hashcmp(match, current);
- if (!cmp) {
- first = mid;
- break;
- }
- if (cmp > 0) {
- first = mid+1;
- continue;
- }
- last = mid;
- }
- if (first < num) {
- const unsigned char *current, *next;
- current = nth_packed_object_sha1(p, first);
- if (match_sha(len, match, current)) {
- next = nth_packed_object_sha1(p, first+1);
- if (!next|| !match_sha(len, match, next)) {
- /* unique within this pack */
- if (!found) {
- found_sha1 = current;
- found++;
- }
- else if (hashcmp(found_sha1, current)) {
- found = 2;
- break;
- }
- }
- else {
- /* not even unique within this pack */
- found = 2;
- break;
- }
- }
- }
- }
+ for (p = packed_git; p && found < 2; p = p->next)
+ found = unique_in_pack(len, match, p, &found_sha1, found);
+
if (found == 1)
hashcpy(sha1, found_sha1);
return found;
--
1.7.11.2.gd284367
next prev parent reply other threads:[~2012-06-21 6:35 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-21 6:35 [PATCH v2 0/9] Extending the shelf-life of "git describe" output Junio C Hamano
2012-06-21 6:35 ` [PATCH v2 1/9] sha1_name.c: indentation fix Junio C Hamano
2012-06-21 6:35 ` [PATCH v2 2/9] sha1_name.c: clarify what "fake" is for in find_short_object_filename() Junio C Hamano
2012-06-21 6:35 ` [PATCH v2 3/9] sha1_name.c: rename "now" to "current" Junio C Hamano
2012-06-21 6:35 ` Junio C Hamano [this message]
2012-06-21 6:35 ` [PATCH v2 5/9] sha1_name.c: correct misnamed "canonical" and "res" Junio C Hamano
2012-06-21 6:35 ` [PATCH v2 6/9] sha1_name.c: restructure disambiguation of short names Junio C Hamano
2012-06-21 6:35 ` [PATCH v2 7/9] sha1_name.c: allow get_short_sha1() to take other flags Junio C Hamano
2012-06-21 6:35 ` [PATCH v2 8/9] sha1_name.c: teach get_short_sha1() a commit-only option Junio C Hamano
2012-06-21 6:35 ` [PATCH v2 9/9] sha1_name.c: get_describe_name() by definition groks only commits Junio C Hamano
2012-06-21 9:22 ` Erik Faye-Lund
2012-06-21 19:57 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1340260532-11378-5-git-send-email-gitster@pobox.com \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).