git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] introduce inline is_same_sha1
@ 2006-08-17  0:25 David Rientjes
  2006-08-17  1:12 ` Junio C Hamano
  2006-08-17 11:59 ` Alex Riesen
  0 siblings, 2 replies; 8+ messages in thread
From: David Rientjes @ 2006-08-17  0:25 UTC (permalink / raw)
  To: git

Introduces global inline:
	is_same_sha1(const unsigned char *sha1,
		     const unsigned char *sha2);

Uses memcmp for comparison and returns the result.  All tests for comparisons 
for sha1 have been changed to use the new global inline, but existing uses of 
memcmp have been preserved where the return value other than 0 is needed, i.e.:

	int cmp = !memcmp(old_sha1, new_sha1, 20);

Conversions from char* to unsigned char* casts have been made where appropriate.

Signed-off-by: David Rientjes <rientjes@google.com>
---
 builtin-commit-tree.c    |    2 +-
 builtin-diff-stages.c    |    2 +-
 builtin-diff.c           |    2 +-
 builtin-pack-objects.c   |    6 +++---
 builtin-show-branch.c    |    4 ++--
 builtin-unpack-objects.c |    4 ++--
 builtin-update-index.c   |    4 ++--
 cache.h                  |    4 ++++
 combine-diff.c           |    4 ++--
 diff-lib.c               |    2 +-
 diff.c                   |    8 ++++----
 diffcore-break.c         |    2 +-
 diffcore-rename.c        |    2 +-
 dump-cache-tree.c        |    2 +-
 http-fetch.c             |    6 +++---
 http-push.c              |    4 ++--
 index-pack.c             |   10 ++++++----
 merge-tree.c             |    2 +-
 object.c                 |    2 +-
 pack-check.c             |    6 +++---
 read-cache.c             |    2 +-
 refs.c                   |    8 ++++----
 send-pack.c              |    2 +-
 sha1_file.c              |   16 ++++++++--------
 sha1_name.c              |    4 ++--
 ssh-fetch.c              |    2 +-
 tree-diff.c              |    2 +-
 unpack-trees.c           |    2 +-
 28 files changed, 61 insertions(+), 55 deletions(-)

diff --git a/builtin-commit-tree.c b/builtin-commit-tree.c
index 9c98796..99fab3b 100644
--- a/builtin-commit-tree.c
+++ b/builtin-commit-tree.c
@@ -69,7 +69,7 @@ static int new_parent(int idx)
 	int i;
 	unsigned char *sha1 = parent_sha1[idx];
 	for (i = 0; i < idx; i++) {
-		if (!memcmp(parent_sha1[i], sha1, 20)) {
+		if (is_same_sha1(parent_sha1[i], sha1)) {
 			error("duplicate parent %s ignored", sha1_to_hex(sha1));
 			return 0;
 		}
diff --git a/builtin-diff-stages.c b/builtin-diff-stages.c
index 5960e08..4593fd2 100644
--- a/builtin-diff-stages.c
+++ b/builtin-diff-stages.c
@@ -46,7 +46,7 @@ static void diff_stages(int stage1, int 
 		else if (!two)
 			diff_addremove(&diff_options, '-', ntohl(one->ce_mode),
 				       one->sha1, name, NULL);
-		else if (memcmp(one->sha1, two->sha1, 20) ||
+		else if (!is_same_sha1(one->sha1, two->sha1) ||
 			 (one->ce_mode != two->ce_mode) ||
 			 diff_options.find_copies_harder)
 			diff_change(&diff_options,
diff --git a/builtin-diff.c b/builtin-diff.c
index 40e5c96..12ae9b1 100644
--- a/builtin-diff.c
+++ b/builtin-diff.c
@@ -69,7 +69,7 @@ static void stuff_change(struct diff_opt
 	struct diff_filespec *one, *two;
 
 	if (!is_null_sha1(old_sha1) && !is_null_sha1(new_sha1) &&
-	    !memcmp(old_sha1, new_sha1, 20))
+	    is_same_sha1(old_sha1, new_sha1))
 		return;
 
 	if (opt->reverse_diff) {
diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c
index 448461b..3c1d3c1 100644
--- a/builtin-pack-objects.c
+++ b/builtin-pack-objects.c
@@ -441,7 +441,7 @@ static int locate_object_entry_hash(cons
 	memcpy(&ui, sha1, sizeof(unsigned int));
 	i = ui % object_ix_hashsz;
 	while (0 < object_ix[i]) {
-		if (!memcmp(sha1, objects[object_ix[i]-1].sha1, 20))
+		if (is_same_sha1(sha1, objects[object_ix[i] - 1].sha1))
 			return i;
 		if (++i == object_ix_hashsz)
 			i = 0;
@@ -607,7 +607,7 @@ static struct pbase_tree_cache *pbase_tr
 	 */
 	for (neigh = 0; neigh < 8; neigh++) {
 		ent = pbase_tree_cache[my_ix];
-		if (ent && !memcmp(ent->sha1, sha1, 20)) {
+		if (ent && is_same_sha1(ent->sha1, sha1)) {
 			ent->ref++;
 			return ent;
 		}
@@ -789,7 +789,7 @@ static void add_preferred_base(unsigned 
 		return;
 
 	for (it = pbase_tree; it; it = it->next) {
-		if (!memcmp(it->pcache.sha1, tree_sha1, 20)) {
+		if (is_same_sha1(it->pcache.sha1, tree_sha1)) {
 			free(data);
 			return;
 		}
diff --git a/builtin-show-branch.c b/builtin-show-branch.c
index 95fbf77..88c7c1c 100644
--- a/builtin-show-branch.c
+++ b/builtin-show-branch.c
@@ -378,7 +378,7 @@ static int append_head_ref(const char *r
 	/* If both heads/foo and tags/foo exists, get_sha1 would
 	 * get confused.
 	 */
-	if (get_sha1(refname + ofs, tmp) || memcmp(tmp, sha1, 20))
+	if (get_sha1(refname + ofs, tmp) || !is_same_sha1(tmp, sha1))
 		ofs = 5;
 	return append_ref(refname + ofs, sha1);
 }
@@ -442,7 +442,7 @@ static int rev_is_head(char *head_path, 
 {
 	int namelen;
 	if ((!head_path[0]) ||
-	    (head_sha1 && sha1 && memcmp(head_sha1, sha1, 20)))
+	    (head_sha1 && sha1 && !is_same_sha1(head_sha1, sha1)))
 		return 0;
 	namelen = strlen(name);
 	if ((headlen < namelen) ||
diff --git a/builtin-unpack-objects.c b/builtin-unpack-objects.c
index 63f4b8e..4f42d21 100644
--- a/builtin-unpack-objects.c
+++ b/builtin-unpack-objects.c
@@ -136,7 +136,7 @@ static void added_object(unsigned char *
 	struct delta_info *info;
 
 	while ((info = *p) != NULL) {
-		if (!memcmp(info->base_sha1, sha1, 20)) {
+		if (is_same_sha1(info->base_sha1, sha1)) {
 			*p = info->next;
 			p = &delta_list;
 			resolve_delta(type, data, size, info->delta, info->size);
@@ -292,7 +292,7 @@ int cmd_unpack_objects(int argc, const c
 	unpack_all();
 	SHA1_Update(&ctx, buffer, offset);
 	SHA1_Final(sha1, &ctx);
-	if (memcmp(fill(20), sha1, 20))
+	if (!is_same_sha1(fill(20), sha1))
 		die("final sha1 did not match");
 	use(20);
 
diff --git a/builtin-update-index.c b/builtin-update-index.c
index 9f0cf28..1f74edd 100644
--- a/builtin-update-index.c
+++ b/builtin-update-index.c
@@ -378,7 +378,7 @@ static int unresolve_one(const char *pat
 		ret = -1;
 		goto free_return;
 	}
-	if (!memcmp(ce_2->sha1, ce_3->sha1, 20) &&
+	if (is_same_sha1(ce_2->sha1, ce_3->sha1) &&
 	    ce_2->ce_mode == ce_3->ce_mode) {
 		fprintf(stderr, "%s: identical in both, skipping.\n",
 			path);
@@ -460,7 +460,7 @@ static int do_reupdate(int ac, const cha
 			old = read_one_ent(NULL, head_sha1,
 					   ce->name, ce_namelen(ce), 0);
 		if (old && ce->ce_mode == old->ce_mode &&
-		    !memcmp(ce->sha1, old->sha1, 20)) {
+		    is_same_sha1(ce->sha1, old->sha1)) {
 			free(old);
 			continue; /* unchanged */
 		}
diff --git a/cache.h b/cache.h
index c738299..5a78b03 100644
--- a/cache.h
+++ b/cache.h
@@ -214,6 +214,10 @@ static inline int is_null_sha1(const uns
 {
 	return !memcmp(sha1, null_sha1, 20);
 }
+static inline int is_same_sha1(const unsigned char *sha1, const unsigned char *sha2)
+{
+	return !memcmp(sha1, sha2, 20);
+}
 
 int git_mkstemp(char *path, size_t n, const char *template);
 
diff --git a/combine-diff.c b/combine-diff.c
index ce063b4..c78a157 100644
--- a/combine-diff.c
+++ b/combine-diff.c
@@ -688,8 +688,8 @@ static void show_patch_diff(struct combi
 	for (i = 0; i < num_parent; i++) {
 		int j;
 		for (j = 0; j < i; j++) {
-			if (!memcmp(elem->parent[i].sha1,
-				    elem->parent[j].sha1, 20)) {
+			if (is_same_sha1(elem->parent[i].sha1,
+					 elem->parent[j].sha1)) {
 				reuse_combine_diff(sline, cnt, i, j);
 				break;
 			}
diff --git a/diff-lib.c b/diff-lib.c
index 116b5a9..4bcb350 100644
--- a/diff-lib.c
+++ b/diff-lib.c
@@ -215,7 +215,7 @@ static int show_modified(struct rev_info
 	}
 
 	oldmode = old->ce_mode;
-	if (mode == oldmode && !memcmp(sha1, old->sha1, 20) &&
+	if (mode == oldmode && is_same_sha1(sha1, old->sha1) &&
 	    !revs->diffopt.find_copies_harder)
 		return 0;
 
diff --git a/diff.c b/diff.c
index 7a238d0..b1e07a1 100644
--- a/diff.c
+++ b/diff.c
@@ -1140,7 +1140,7 @@ static int work_tree_matches(const char 
 	if ((lstat(name, &st) < 0) ||
 	    !S_ISREG(st.st_mode) || /* careful! */
 	    ce_match_stat(ce, &st, 0) ||
-	    memcmp(sha1, ce->sha1, 20))
+	    !is_same_sha1(sha1, ce->sha1))
 		return 0;
 	/* we return 1 only when we can stat, it is a regular file,
 	 * stat information matches, and sha1 recorded in the cache
@@ -1579,7 +1579,7 @@ static void run_diff(struct diff_filepai
 		;
 	}
 
-	if (memcmp(one->sha1, two->sha1, 20)) {
+	if (!is_same_sha1(one->sha1, two->sha1)) {
 		int abbrev = o->full_index ? 40 : DEFAULT_ABBREV;
 
 		len += snprintf(msg + len, sizeof(msg) - len,
@@ -2098,7 +2098,7 @@ int diff_unmodified_pair(struct diff_fil
 	 * dealing with a change.
 	 */
 	if (one->sha1_valid && two->sha1_valid &&
-	    !memcmp(one->sha1, two->sha1, sizeof(one->sha1)))
+	    is_same_sha1(one->sha1, two->sha1))
 		return 1; /* no change */
 	if (!one->sha1_valid && !two->sha1_valid)
 		return 1; /* both look at the same file on the filesystem. */
@@ -2237,7 +2237,7 @@ static void diff_resolve_rename_copy(voi
 			if (!p->status)
 				p->status = DIFF_STATUS_RENAMED;
 		}
-		else if (memcmp(p->one->sha1, p->two->sha1, 20) ||
+		else if (!is_same_sha1(p->one->sha1, p->two->sha1) ||
 			 p->one->mode != p->two->mode)
 			p->status = DIFF_STATUS_MODIFIED;
 		else {
diff --git a/diffcore-break.c b/diffcore-break.c
index ed0e14c..821ec57 100644
--- a/diffcore-break.c
+++ b/diffcore-break.c
@@ -56,7 +56,7 @@ static int should_break(struct diff_file
 		return 0; /* leave symlink rename alone */
 
 	if (src->sha1_valid && dst->sha1_valid &&
-	    !memcmp(src->sha1, dst->sha1, 20))
+	    is_same_sha1(src->sha1, dst->sha1))
 		return 0; /* they are the same */
 
 	if (diff_populate_filespec(src, 0) || diff_populate_filespec(dst, 0))
diff --git a/diffcore-rename.c b/diffcore-rename.c
index 0ec488a..32afcc3 100644
--- a/diffcore-rename.c
+++ b/diffcore-rename.c
@@ -101,7 +101,7 @@ static int is_exact_match(struct diff_fi
 			  int contents_too)
 {
 	if (src->sha1_valid && dst->sha1_valid &&
-	    !memcmp(src->sha1, dst->sha1, 20))
+	    is_same_sha1(src->sha1, dst->sha1))
 		return 1;
 	if (!contents_too)
 		return 0;
diff --git a/dump-cache-tree.c b/dump-cache-tree.c
index 1ccaf51..51aadcc 100644
--- a/dump-cache-tree.c
+++ b/dump-cache-tree.c
@@ -33,7 +33,7 @@ static int dump_cache_tree(struct cache_
 	}
 	else {
 		dump_one(it, pfx, "");
-		if (memcmp(it->sha1, ref->sha1, 20) ||
+		if (!is_same_sha1(it->sha1, ref->sha1) ||
 		    ref->entry_count != it->entry_count ||
 		    ref->subtree_nr != it->subtree_nr) {
 			dump_one(ref, pfx, "#(ref) ");
diff --git a/http-fetch.c b/http-fetch.c
index 7f07d2a..dc4e30e 100644
--- a/http-fetch.c
+++ b/http-fetch.c
@@ -301,7 +301,7 @@ static void finish_object_request(struct
 		unlink(obj_req->tmpfile);
 		return;
 	}
-	if (memcmp(obj_req->sha1, obj_req->real_sha1, 20)) {
+	if (!is_same_sha1(obj_req->sha1, obj_req->real_sha1)) {
 		unlink(obj_req->tmpfile);
 		return;
 	}
@@ -1070,7 +1070,7 @@ static int fetch_object(struct alt_base 
 	int ret = 0;
 	struct object_request *obj_req = object_queue_head;
 
-	while (obj_req != NULL && memcmp(obj_req->sha1, sha1, 20))
+	while (obj_req != NULL && !is_same_sha1(obj_req->sha1, sha1))
 		obj_req = obj_req->next;
 	if (obj_req == NULL)
 		return error("Couldn't find request for %s in the queue", hex);
@@ -1109,7 +1109,7 @@ #endif
 	} else if (obj_req->zret != Z_STREAM_END) {
 		corrupt_object_found++;
 		ret = error("File %s (%s) corrupt", hex, obj_req->url);
-	} else if (memcmp(obj_req->sha1, obj_req->real_sha1, 20)) {
+	} else if (!is_same_sha1(obj_req->sha1, obj_req->real_sha1)) {
 		ret = error("File %s has bad hash", hex);
 	} else if (obj_req->rename < 0) {
 		ret = error("unable to write sha1 filename %s",
diff --git a/http-push.c b/http-push.c
index 2bd9845..6a13c3e 100644
--- a/http-push.c
+++ b/http-push.c
@@ -745,7 +745,7 @@ static void finish_request(struct transf
 			SHA1_Final(request->real_sha1, &request->c);
 			if (request->zret != Z_STREAM_END) {
 				unlink(request->tmpfile);
-			} else if (memcmp(request->obj->sha1, request->real_sha1, 20)) {
+			} else if (!is_same_sha1(request->obj->sha1, request->real_sha1)) {
 				unlink(request->tmpfile);
 			} else {
 				request->rename =
@@ -2416,7 +2416,7 @@ int main(int argc, char **argv)
 
 		if (!ref->peer_ref)
 			continue;
-		if (!memcmp(ref->old_sha1, ref->peer_ref->new_sha1, 20)) {
+		if (is_same_sha1(ref->old_sha1, ref->peer_ref->new_sha1)) {
 			if (push_verbosely || 1)
 				fprintf(stderr, "'%s': up-to-date\n", ref->name);
 			continue;
diff --git a/index-pack.c b/index-pack.c
index b20659c..be4c36b 100644
--- a/index-pack.c
+++ b/index-pack.c
@@ -82,7 +82,7 @@ static void parse_pack_header(void)
 	SHA1_Init(&ctx);
 	SHA1_Update(&ctx, pack_base, pack_size - 20);
 	SHA1_Final(sha1, &ctx);
-	if (memcmp(sha1, pack_base + pack_size - 20, 20))
+	if (!is_same_sha1(sha1, pack_base + pack_size - 20))
 		die("packfile '%s' SHA1 mismatch", pack_name);
 }
 
@@ -210,9 +210,11 @@ static int find_deltas_based_on_sha1(con
 
 	if (first < 0)
 		return -1;
-	while (first > 0 && !memcmp(deltas[first-1].base_sha1, base_sha1, 20))
+	while (first > 0 && is_same_sha1(deltas[first - 1].base_sha1,
+					 base_sha1))
 		--first;
-	while (last < end && !memcmp(deltas[last+1].base_sha1, base_sha1, 20))
+	while (last < end && is_same_sha1(deltas[last + 1].base_sha1,
+					  base_sha1))
 		++last;
 	*first_index = first;
 	*last_index = last;
diff --git a/merge-tree.c b/merge-tree.c
index 7cf00be..7f68cb9 100644
--- a/merge-tree.c
+++ b/merge-tree.c
@@ -152,7 +152,7 @@ static int same_entry(struct name_entry 
 {
 	return	a->sha1 &&
 		b->sha1 &&
-		!memcmp(a->sha1, b->sha1, 20) &&
+		is_same_sha1(a->sha1, b->sha1) &&
 		a->mode == b->mode;
 }
 
diff --git a/object.c b/object.c
index b5d8ed4..bcf3564 100644
--- a/object.c
+++ b/object.c
@@ -58,7 +58,7 @@ struct object *lookup_object(const unsig
 
 	i = hashtable_index(sha1);
 	while ((obj = obj_hash[i]) != NULL) {
-		if (!memcmp(sha1, obj->sha1, 20))
+		if (is_same_sha1(sha1, obj->sha1))
 			break;
 		i++;
 		if (i == obj_hash_size)
diff --git a/pack-check.c b/pack-check.c
index 3a62e1b..8434a8d 100644
--- a/pack-check.c
+++ b/pack-check.c
@@ -29,10 +29,10 @@ static int verify_packfile(struct packed
 	pack_base = p->pack_base;
 	SHA1_Update(&ctx, pack_base, pack_size - 20);
 	SHA1_Final(sha1, &ctx);
-	if (memcmp(sha1, (char *) pack_base + pack_size - 20, 20))
+	if (!is_same_sha1(sha1, (unsigned char *)pack_base + pack_size - 20))
 		return error("Packfile %s SHA1 mismatch with itself",
 			     p->pack_name);
-	if (memcmp(sha1, (char *) index_base + index_size - 40, 20))
+	if (!is_same_sha1(sha1, (unsigned char *)index_base + index_size - 40))
 		return error("Packfile %s SHA1 mismatch with idx",
 			     p->pack_name);
 
@@ -135,7 +135,7 @@ int verify_pack(struct packed_git *p, in
 	SHA1_Init(&ctx);
 	SHA1_Update(&ctx, index_base, index_size - 20);
 	SHA1_Final(sha1, &ctx);
-	if (memcmp(sha1, (char *) index_base + index_size - 20, 20))
+	if (!is_same_sha1(sha1, (unsigned char *)index_base + index_size - 20))
 		ret = error("Packfile index for %s SHA1 mismatch",
 			    p->pack_name);
 
diff --git a/read-cache.c b/read-cache.c
index 3228ffb..ae0156f 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -739,7 +739,7 @@ static int verify_hdr(struct cache_heade
 	SHA1_Init(&c);
 	SHA1_Update(&c, hdr, size - 20);
 	SHA1_Final(sha1, &c);
-	if (memcmp(sha1, (char *) hdr + size - 20, 20))
+	if (!is_same_sha1(sha1, (unsigned char *)hdr + size - 20))
 		return error("bad index file sha1 signature");
 	return 0;
 }
diff --git a/refs.c b/refs.c
index 86ef916..5f3f5d2 100644
--- a/refs.c
+++ b/refs.c
@@ -281,7 +281,7 @@ static struct ref_lock *verify_lock(stru
 		unlock_ref(lock);
 		return NULL;
 	}
-	if (memcmp(lock->old_sha1, old_sha1, 20)) {
+	if (!is_same_sha1(lock->old_sha1, old_sha1)) {
 		error("Ref %s is at %s but expected %s", lock->ref_file,
 			sha1_to_hex(lock->old_sha1), sha1_to_hex(old_sha1));
 		unlock_ref(lock);
@@ -411,7 +411,7 @@ int write_ref_sha1(struct ref_lock *lock
 
 	if (!lock)
 		return -1;
-	if (!lock->force_write && !memcmp(lock->old_sha1, sha1, 20)) {
+	if (!lock->force_write && is_same_sha1(lock->old_sha1, sha1)) {
 		unlock_ref(lock);
 		return 0;
 	}
@@ -475,7 +475,7 @@ int read_ref_at(const char *ref, unsigne
 					die("Log %s is corrupt.", logfile);
 				if (get_sha1_hex(rec + 41, sha1))
 					die("Log %s is corrupt.", logfile);
-				if (memcmp(logged_sha1, sha1, 20)) {
+				if (!is_same_sha1(logged_sha1, sha1)) {
 					tz = strtoul(tz_c, NULL, 10);
 					fprintf(stderr,
 						"warning: Log %s has gap after %s.\n",
@@ -489,7 +489,7 @@ int read_ref_at(const char *ref, unsigne
 			else {
 				if (get_sha1_hex(rec + 41, logged_sha1))
 					die("Log %s is corrupt.", logfile);
-				if (memcmp(logged_sha1, sha1, 20)) {
+				if (!is_same_sha1(logged_sha1, sha1)) {
 					tz = strtoul(tz_c, NULL, 10);
 					fprintf(stderr,
 						"warning: Log %s unexpectedly ended on %s.\n",
diff --git a/send-pack.c b/send-pack.c
index 43e10b0..d7f58cd 100644
--- a/send-pack.c
+++ b/send-pack.c
@@ -265,7 +265,7 @@ static int send_pack(int in, int out, in
 		char old_hex[60], *new_hex;
 		if (!ref->peer_ref)
 			continue;
-		if (!memcmp(ref->old_sha1, ref->peer_ref->new_sha1, 20)) {
+		if (is_same_sha1(ref->old_sha1, ref->peer_ref->new_sha1)) {
 			if (verbose)
 				fprintf(stderr, "'%s': up-to-date\n", ref->name);
 			continue;
diff --git a/sha1_file.c b/sha1_file.c
index 18dece4..04d54ef 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -485,10 +485,10 @@ int use_packed_git(struct packed_git *p)
 		/* Check if the pack file matches with the index file.
 		 * this is cheap.
 		 */
-		if (memcmp((char*)(p->index_base) + p->index_size - 40,
-			   (char *) p->pack_base + p->pack_size - 20,
-			   20)) {
-
+		if (!is_same_sha1((unsigned char *)(p->index_base) +
+				  p->index_size - 40,
+				  (unsigned char *)p->pack_base +
+				  p->pack_size - 20)) {
 			die("packfile %s does not match index.", p->pack_name);
 		}
 	}
@@ -643,7 +643,7 @@ int check_sha1_signature(const unsigned 
 	SHA1_Update(&c, header, 1+sprintf(header, "%s %lu", type, size));
 	SHA1_Update(&c, map, size);
 	SHA1_Final(real_sha1, &c);
-	return memcmp(sha1, real_sha1, 20) ? -1 : 0;
+	return !is_same_sha1(sha1, real_sha1) ? -1 : 0;
 }
 
 void *map_sha1_file(const unsigned char *sha1, unsigned long *size)
@@ -941,7 +941,7 @@ int check_reuse_pack_delta(struct packed
 	ptr = unpack_object_header(p, ptr, kindp, sizep);
 	if (*kindp != OBJ_DELTA)
 		goto done;
-	memcpy(base, (char *) p->pack_base + ptr, 20);
+	memcpy(base, (unsigned char *) p->pack_base + ptr, 20);
 	status = 0;
  done:
 	unuse_packed_git(p);
@@ -1715,7 +1715,7 @@ int write_sha1_from_fd(const unsigned ch
 		unlink(tmpfile);
 		return error("File %s corrupted", sha1_to_hex(sha1));
 	}
-	if (memcmp(sha1, real_sha1, 20)) {
+	if (!is_same_sha1(sha1, real_sha1)) {
 		unlink(tmpfile);
 		return error("File %s has bad hash", sha1_to_hex(sha1));
 	}
diff --git a/sha1_name.c b/sha1_name.c
index f567454..2d4d26a 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -106,7 +106,7 @@ static int find_short_packed_object(int 
 						memcpy(found_sha1, now, 20);
 						found++;
 					}
-					else if (memcmp(found_sha1, now, 20)) {
+					else if (!is_same_sha1(found_sha1, now)) {
 						found = 2;
 						break;
 					}
@@ -144,7 +144,7 @@ static int find_unique_short_object(int 
 		return 0;
 	}
 	/* Both have unique ones -- do they match? */
-	if (memcmp(packed_sha1, unpacked_sha1, 20))
+	if (!is_same_sha1(packed_sha1, unpacked_sha1))
 		return SHORT_NAME_AMBIGUOUS;
 	memcpy(sha1, packed_sha1, 20);
 	return 0;
diff --git a/ssh-fetch.c b/ssh-fetch.c
index 0b89df6..603e244 100644
--- a/ssh-fetch.c
+++ b/ssh-fetch.c
@@ -67,7 +67,7 @@ int fetch(unsigned char *sha1)
 	signed char remote;
 	struct object_list *temp;
 
-	if (memcmp(sha1, in_transit->item->sha1, 20)) {
+	if (!is_same_sha1(sha1, in_transit->item->sha1)) {
 		/* we must have already fetched it to clean the queue */
 		return has_sha1_file(sha1) ? 0 : -1;
 	}
diff --git a/tree-diff.c b/tree-diff.c
index 916f489..51df262 100644
--- a/tree-diff.c
+++ b/tree-diff.c
@@ -40,7 +40,7 @@ static int compare_tree_entry(struct tre
 		return 1;
 	}
 	if (!opt->find_copies_harder &&
-	    !memcmp(sha1, sha2, 20) && mode1 == mode2)
+	    is_same_sha1(sha1, sha2) && mode1 == mode2)
 		return 0;
 
 	/*
diff --git a/unpack-trees.c b/unpack-trees.c
index 43ed124..153b321 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -417,7 +417,7 @@ static int same(struct cache_entry *a, s
 	if (!a && !b)
 		return 1;
 	return a->ce_mode == b->ce_mode &&
-		!memcmp(a->sha1, b->sha1, 20);
+		is_same_sha1(a->sha1, b->sha1);
 }
 
 
-- 
1.4.2.g1c2a-dirty

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] introduce inline is_same_sha1
  2006-08-17  0:25 [PATCH] introduce inline is_same_sha1 David Rientjes
@ 2006-08-17  1:12 ` Junio C Hamano
  2006-08-17  3:51   ` David Rientjes
  2006-08-17 11:59 ` Alex Riesen
  1 sibling, 1 reply; 8+ messages in thread
From: Junio C Hamano @ 2006-08-17  1:12 UTC (permalink / raw)
  To: David Rientjes; +Cc: git

David Rientjes <rientjes@google.com> writes:

> Introduces global inline:
> 	is_same_sha1(const unsigned char *sha1,
> 		     const unsigned char *sha2);
>
> Uses memcmp for comparison and returns the result.  All tests
> for comparisons for sha1 have been changed to use the new
> global inline, but existing uses of memcmp have been preserved
> where the return value other than 0 is needed, i.e.:
>
> 	int cmp = !memcmp(old_sha1, new_sha1, 20);
>
> Conversions from char* to unsigned char* casts have been made
> where appropriate.
>
> Signed-off-by: David Rientjes <rientjes@google.com>

I would have expected the inline function to be:

	int cmp_object_name(const void *, const void *)

No need for "unsigned char *" that way [*1*].  

I do not know what your ultimate goal with this patch is, but I
like the fact that we do not have to hardcode "20" everywhere.
With a yet-to-be-written companion patch to make the "20" into a
symbolic constant OBJECT_NAME_LENGTH, we could someday have a
flag day to use a hash different from SHA-1 with an updated
'git-convert-objects' ;-).

I would have liked if the function were to give the comparison
results similar to standard comparison functions such as memcmp
and strcmp.  I do not know off-hand if we order by the object
names, and we might only be interested in equality tests, but
still...

Line-wrap the message for comfortable viewing on 80-column
terminals, please.

[Footnote]

*1* On the other hand if stricter type checking is wanted,
    "const unsigned char *" is too weak.  We would need either
    sparse annotation or a new type (maybe a struct that has a
    single member that has 20-byte uchar array).  I personally
    think that is an overkill, though.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] introduce inline is_same_sha1
  2006-08-17  1:12 ` Junio C Hamano
@ 2006-08-17  3:51   ` David Rientjes
  2006-08-17  6:26     ` Junio C Hamano
  0 siblings, 1 reply; 8+ messages in thread
From: David Rientjes @ 2006-08-17  3:51 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

On Wed, 16 Aug 2006, Junio C Hamano wrote:

> I would have expected the inline function to be:
> 
> 	int cmp_object_name(const void *, const void *)
> 
> No need for "unsigned char *" that way [*1*].  
> 
> I do not know what your ultimate goal with this patch is, but I
> like the fact that we do not have to hardcode "20" everywhere.
> With a yet-to-be-written companion patch to make the "20" into a
> symbolic constant OBJECT_NAME_LENGTH, we could someday have a
> flag day to use a hash different from SHA-1 with an updated
> 'git-convert-objects' ;-).
> 

The reason it is not
	int cmp_object_name(const void *, const void *)

ties into the ultimate goal.  As you said, 20 is hardcoded everywhere in 
the code as the length sha1's name.  Since my own development tree uses 
two different hashes configurable at runtime, I decided to create a single 
static inline that would deal with name comparisons.  I submitted a 
similar change to your tree because, like you, I envisioned that someday 
you may have several different hashes that require different comparison 
lengths.  The easy solution is using strcmp in the inline but then you're 
required to cast based on signness and sometimes you want to truncate the 
comparison to n bytes anyway depending on your hash of choice.  If you 
want to open your project to the possibility of implementing other 
hashes, my patch is a step in that direction.

> I would have liked if the function were to give the comparison
> results similar to standard comparison functions such as memcmp
> and strcmp.  I do not know off-hand if we order by the object
> names, and we might only be interested in equality tests, but
> still...
> 

Remember, this is an inline function.  The only reason for writing it 
would be to isolate the number 20 to this particular function (those that 
require comparisons were untouched, as I previously stated, so it still 
exists there as well), otherwise it's useless.  If you're going to allow a 
configurable hash function, then you'll need to isolate the n-bytes 
somewhere if you don't want to pass HASH_NAME_LENGTH around everywhere.

git does sort on sha1 name, specifically with qsort in pack-objects using 
sha1_sort (which isn't an inline, but should be).

(It would be helpful if you were to specifically request changes to a 
patch or explicitly state whether or not you queued to apply it, I can 
never tell).

		David

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] introduce inline is_same_sha1
  2006-08-17  3:51   ` David Rientjes
@ 2006-08-17  6:26     ` Junio C Hamano
  0 siblings, 0 replies; 8+ messages in thread
From: Junio C Hamano @ 2006-08-17  6:26 UTC (permalink / raw)
  To: David Rientjes; +Cc: git

David Rientjes <rientjes@google.com> writes:

> On Wed, 16 Aug 2006, Junio C Hamano wrote:
>
> The reason it is not
> 	int cmp_object_name(const void *, const void *)
>
> ties into the ultimate goal.  As you said, 20 is hardcoded everywhere in 
> the code as the length sha1's name.  Since my own development tree uses 
> two different hashes configurable at runtime, I decided to create a single 
> static inline that would deal with name comparisons.  I submitted a 
> similar change to your tree because, like you, I envisioned that someday 
> you may have several different hashes that require different comparison 
> lengths.

Good, we are on the same wavelength.  But that does not explain
why you do not use (void *) which would let you avoid casts at
the calling sites.

>> I would have liked if the function were to give the comparison
>> results similar to standard comparison functions such as memcmp
>> and strcmp.  I do not know off-hand if we order by the object
>> names, and we might only be interested in equality tests, but
>> still...
>
> Remember, this is an inline function.  The only reason for writing it 
> would be to isolate the number 20 to this particular function (those that 
> require comparisons were untouched, as I previously stated, so it still 
> exists there as well), otherwise it's useless.

I may be slower than I usually am, but I fail to see the logic.
If we are isolating the comparison length and nothing else,
which I agree is a good thing, I would expect the function to
return 0 when same, just like memcmp(), which means "is_same" is
not the interface we would want.  "is_same" is justified only
when all the callers want to know equality and not comparison.

> ... If you're going to allow a 
> configurable hash function, then you'll need to isolate the n-bytes 
> somewhere if you don't want to pass HASH_NAME_LENGTH around everywhere.

Exactly.  So if some other call sites do want comparison, they
would either need to do memcmp() with 20 or needs cmp_object_name()
like interface, wouldn't they?

> git does sort on sha1 name, specifically with qsort in pack-objects using 
> sha1_sort (which isn't an inline, but should be).

Correct, pack idx is sorted by object name.

> (It would be helpful if you were to specifically request changes to a 
> patch or explicitly state whether or not you queued to apply it, I can 
> never tell).

I am interested in this clean-up, but please convince me that
having two interfaces (is_same and compare) is better way to
abstract out 20 than one interface (compare), or if you agree
with me that one interface is better, please redo the patch and
the change the call sites you deliberately left as memcmp() in
the patch as well.

I sometimes say "I'd apply this as is, but you need to fix such
and such", when the contributor has a good track record of
responding.  Please don't get this wrong, but you are still
unknown quantity to me.  This is a learning process for both of
us.

By the way, Wednesdays and Saturdays (my time) are my git days,
so I try to summarize the current status of "master" and "next"
branches on these days.  On other days I hack on git only during
lunch and evenings so the turnaround and response tend be slower
and sketchier.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] introduce inline is_same_sha1
  2006-08-17  0:25 [PATCH] introduce inline is_same_sha1 David Rientjes
  2006-08-17  1:12 ` Junio C Hamano
@ 2006-08-17 11:59 ` Alex Riesen
  2006-08-17 18:54   ` David Rientjes
  1 sibling, 1 reply; 8+ messages in thread
From: Alex Riesen @ 2006-08-17 11:59 UTC (permalink / raw)
  To: David Rientjes; +Cc: git

On 8/17/06, David Rientjes <rientjes@google.com> wrote:
> Introduces global inline:
>         is_same_sha1(const unsigned char *sha1,
>                      const unsigned char *sha2);

It is longer and negates all (like in "lots") previous callsites of memcmp.
Are sure you didn't do a trivial typo somewhere?

Why not just sha1cmp? And if you're aiming at hash-type independence,
why not hashcmp?

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] introduce inline is_same_sha1
  2006-08-17 11:59 ` Alex Riesen
@ 2006-08-17 18:54   ` David Rientjes
  2006-08-17 20:50     ` Alex Riesen
  2006-08-18  4:09     ` Junio C Hamano
  0 siblings, 2 replies; 8+ messages in thread
From: David Rientjes @ 2006-08-17 18:54 UTC (permalink / raw)
  To: Alex Riesen; +Cc: git

On Thu, 17 Aug 2006, Alex Riesen wrote:

> It is longer and negates all (like in "lots") previous callsites of memcmp.
> Are sure you didn't do a trivial typo somewhere?
> 
> Why not just sha1cmp? And if you're aiming at hash-type independence,
> why not hashcmp?
> 

hashcmp is a very good suggestion.  Please ack the following.

		David
---
Introduces global inline:
	hashcmp(const unsigned char *sha1, const unsigned char *sha2)

Uses memcmp for comparison and returns the result based on the length of 
the hash name (a future runtime decision).

Signed-off-by: David Rientjes <rientjes@google.com>
---
 builtin-commit-tree.c    |    2 +-
 builtin-diff-stages.c    |    2 +-
 builtin-diff.c           |    2 +-
 builtin-pack-objects.c   |    8 ++++----
 builtin-show-branch.c    |    4 ++--
 builtin-unpack-objects.c |    4 ++--
 builtin-update-index.c   |    4 ++--
 cache.h                  |    4 ++++
 combine-diff.c           |    4 ++--
 commit.c                 |    2 +-
 convert-objects.c        |    2 +-
 diff-lib.c               |    2 +-
 diff.c                   |   10 +++++-----
 diffcore-break.c         |    2 +-
 diffcore-rename.c        |    2 +-
 dump-cache-tree.c        |    2 +-
 http-fetch.c             |    6 +++---
 http-push.c              |    4 ++--
 index-pack.c             |   14 ++++++++------
 merge-tree.c             |    2 +-
 object.c                 |    2 +-
 pack-check.c             |    6 +++---
 pack-redundant.c         |   14 +++++++-------
 read-cache.c             |    4 ++--
 refs.c                   |    8 ++++----
 send-pack.c              |    2 +-
 sha1_file.c              |   16 ++++++++--------
 sha1_name.c              |    6 +++---
 ssh-fetch.c              |    2 +-
 tree-diff.c              |    3 +--
 unpack-trees.c           |    2 +-
 31 files changed, 76 insertions(+), 71 deletions(-)

diff --git a/builtin-commit-tree.c b/builtin-commit-tree.c
index 9c98796..e2e690a 100644
--- a/builtin-commit-tree.c
+++ b/builtin-commit-tree.c
@@ -69,7 +69,7 @@ static int new_parent(int idx)
 	int i;
 	unsigned char *sha1 = parent_sha1[idx];
 	for (i = 0; i < idx; i++) {
-		if (!memcmp(parent_sha1[i], sha1, 20)) {
+		if (!hashcmp(parent_sha1[i], sha1)) {
 			error("duplicate parent %s ignored", sha1_to_hex(sha1));
 			return 0;
 		}
diff --git a/builtin-diff-stages.c b/builtin-diff-stages.c
index 5960e08..70bb898 100644
--- a/builtin-diff-stages.c
+++ b/builtin-diff-stages.c
@@ -46,7 +46,7 @@ static void diff_stages(int stage1, int 
 		else if (!two)
 			diff_addremove(&diff_options, '-', ntohl(one->ce_mode),
 				       one->sha1, name, NULL);
-		else if (memcmp(one->sha1, two->sha1, 20) ||
+		else if (hashcmp(one->sha1, two->sha1) ||
 			 (one->ce_mode != two->ce_mode) ||
 			 diff_options.find_copies_harder)
 			diff_change(&diff_options,
diff --git a/builtin-diff.c b/builtin-diff.c
index 40e5c96..874f773 100644
--- a/builtin-diff.c
+++ b/builtin-diff.c
@@ -69,7 +69,7 @@ static void stuff_change(struct diff_opt
 	struct diff_filespec *one, *two;
 
 	if (!is_null_sha1(old_sha1) && !is_null_sha1(new_sha1) &&
-	    !memcmp(old_sha1, new_sha1, 20))
+	    !hashcmp(old_sha1, new_sha1))
 		return;
 
 	if (opt->reverse_diff) {
diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c
index 448461b..f19f0d6 100644
--- a/builtin-pack-objects.c
+++ b/builtin-pack-objects.c
@@ -441,7 +441,7 @@ static int locate_object_entry_hash(cons
 	memcpy(&ui, sha1, sizeof(unsigned int));
 	i = ui % object_ix_hashsz;
 	while (0 < object_ix[i]) {
-		if (!memcmp(sha1, objects[object_ix[i]-1].sha1, 20))
+		if (!hashcmp(sha1, objects[object_ix[i] - 1].sha1))
 			return i;
 		if (++i == object_ix_hashsz)
 			i = 0;
@@ -607,7 +607,7 @@ static struct pbase_tree_cache *pbase_tr
 	 */
 	for (neigh = 0; neigh < 8; neigh++) {
 		ent = pbase_tree_cache[my_ix];
-		if (ent && !memcmp(ent->sha1, sha1, 20)) {
+		if (ent && !hashcmp(ent->sha1, sha1)) {
 			ent->ref++;
 			return ent;
 		}
@@ -789,7 +789,7 @@ static void add_preferred_base(unsigned 
 		return;
 
 	for (it = pbase_tree; it; it = it->next) {
-		if (!memcmp(it->pcache.sha1, tree_sha1, 20)) {
+		if (!hashcmp(it->pcache.sha1, tree_sha1)) {
 			free(data);
 			return;
 		}
@@ -931,7 +931,7 @@ static struct object_entry **create_sort
 
 static int sha1_sort(const struct object_entry *a, const struct object_entry *b)
 {
-	return memcmp(a->sha1, b->sha1, 20);
+	return hashcmp(a->sha1, b->sha1);
 }
 
 static struct object_entry **create_final_object_list(void)
diff --git a/builtin-show-branch.c b/builtin-show-branch.c
index 95fbf77..18786f8 100644
--- a/builtin-show-branch.c
+++ b/builtin-show-branch.c
@@ -378,7 +378,7 @@ static int append_head_ref(const char *r
 	/* If both heads/foo and tags/foo exists, get_sha1 would
 	 * get confused.
 	 */
-	if (get_sha1(refname + ofs, tmp) || memcmp(tmp, sha1, 20))
+	if (get_sha1(refname + ofs, tmp) || hashcmp(tmp, sha1))
 		ofs = 5;
 	return append_ref(refname + ofs, sha1);
 }
@@ -442,7 +442,7 @@ static int rev_is_head(char *head_path, 
 {
 	int namelen;
 	if ((!head_path[0]) ||
-	    (head_sha1 && sha1 && memcmp(head_sha1, sha1, 20)))
+	    (head_sha1 && sha1 && hashcmp(head_sha1, sha1)))
 		return 0;
 	namelen = strlen(name);
 	if ((headlen < namelen) ||
diff --git a/builtin-unpack-objects.c b/builtin-unpack-objects.c
index 63f4b8e..f0ae5c9 100644
--- a/builtin-unpack-objects.c
+++ b/builtin-unpack-objects.c
@@ -136,7 +136,7 @@ static void added_object(unsigned char *
 	struct delta_info *info;
 
 	while ((info = *p) != NULL) {
-		if (!memcmp(info->base_sha1, sha1, 20)) {
+		if (!hashcmp(info->base_sha1, sha1)) {
 			*p = info->next;
 			p = &delta_list;
 			resolve_delta(type, data, size, info->delta, info->size);
@@ -292,7 +292,7 @@ int cmd_unpack_objects(int argc, const c
 	unpack_all();
 	SHA1_Update(&ctx, buffer, offset);
 	SHA1_Final(sha1, &ctx);
-	if (memcmp(fill(20), sha1, 20))
+	if (hashcmp(fill(20), sha1))
 		die("final sha1 did not match");
 	use(20);
 
diff --git a/builtin-update-index.c b/builtin-update-index.c
index 9f0cf28..5dd91af 100644
--- a/builtin-update-index.c
+++ b/builtin-update-index.c
@@ -378,7 +378,7 @@ static int unresolve_one(const char *pat
 		ret = -1;
 		goto free_return;
 	}
-	if (!memcmp(ce_2->sha1, ce_3->sha1, 20) &&
+	if (!hashcmp(ce_2->sha1, ce_3->sha1) &&
 	    ce_2->ce_mode == ce_3->ce_mode) {
 		fprintf(stderr, "%s: identical in both, skipping.\n",
 			path);
@@ -460,7 +460,7 @@ static int do_reupdate(int ac, const cha
 			old = read_one_ent(NULL, head_sha1,
 					   ce->name, ce_namelen(ce), 0);
 		if (old && ce->ce_mode == old->ce_mode &&
-		    !memcmp(ce->sha1, old->sha1, 20)) {
+		    !hashcmp(ce->sha1, old->sha1)) {
 			free(old);
 			continue; /* unchanged */
 		}
diff --git a/cache.h b/cache.h
index c738299..f99254b 100644
--- a/cache.h
+++ b/cache.h
@@ -214,6 +214,10 @@ static inline int is_null_sha1(const uns
 {
 	return !memcmp(sha1, null_sha1, 20);
 }
+static inline int hashcmp(const unsigned char *sha1, const unsigned char *sha2)
+{
+	return memcmp(sha1, sha2, 20);
+}
 
 int git_mkstemp(char *path, size_t n, const char *template);
 
diff --git a/combine-diff.c b/combine-diff.c
index ce063b4..0682acd 100644
--- a/combine-diff.c
+++ b/combine-diff.c
@@ -688,8 +688,8 @@ static void show_patch_diff(struct combi
 	for (i = 0; i < num_parent; i++) {
 		int j;
 		for (j = 0; j < i; j++) {
-			if (!memcmp(elem->parent[i].sha1,
-				    elem->parent[j].sha1, 20)) {
+			if (!hashcmp(elem->parent[i].sha1,
+				     elem->parent[j].sha1)) {
 				reuse_combine_diff(sline, cnt, i, j);
 				break;
 			}
diff --git a/commit.c b/commit.c
index 972d1b7..d17451f 100644
--- a/commit.c
+++ b/commit.c
@@ -123,7 +123,7 @@ static int commit_graft_pos(const unsign
 	while (lo < hi) {
 		int mi = (lo + hi) / 2;
 		struct commit_graft *graft = commit_graft[mi];
-		int cmp = memcmp(sha1, graft->sha1, 20);
+		int cmp = hashcmp(sha1, graft->sha1);
 		if (!cmp)
 			return mi;
 		if (cmp < 0)
diff --git a/convert-objects.c b/convert-objects.c
index 168771e..4e7ff75 100644
--- a/convert-objects.c
+++ b/convert-objects.c
@@ -39,7 +39,7 @@ static struct entry *lookup_entry(unsign
 	while (low < high) {
 		int next = (low + high) / 2;
 		struct entry *n = convert[next];
-		int cmp = memcmp(sha1, n->old_sha1, 20);
+		int cmp = hashcmp(sha1, n->old_sha1);
 		if (!cmp)
 			return n;
 		if (cmp < 0) {
diff --git a/diff-lib.c b/diff-lib.c
index 116b5a9..3e4b3b9 100644
--- a/diff-lib.c
+++ b/diff-lib.c
@@ -215,7 +215,7 @@ static int show_modified(struct rev_info
 	}
 
 	oldmode = old->ce_mode;
-	if (mode == oldmode && !memcmp(sha1, old->sha1, 20) &&
+	if (mode == oldmode && !hashcmp(sha1, old->sha1) &&
 	    !revs->diffopt.find_copies_harder)
 		return 0;
 
diff --git a/diff.c b/diff.c
index 7a238d0..da7cca1 100644
--- a/diff.c
+++ b/diff.c
@@ -1140,7 +1140,7 @@ static int work_tree_matches(const char 
 	if ((lstat(name, &st) < 0) ||
 	    !S_ISREG(st.st_mode) || /* careful! */
 	    ce_match_stat(ce, &st, 0) ||
-	    memcmp(sha1, ce->sha1, 20))
+	    hashcmp(sha1, ce->sha1))
 		return 0;
 	/* we return 1 only when we can stat, it is a regular file,
 	 * stat information matches, and sha1 recorded in the cache
@@ -1168,7 +1168,7 @@ static struct sha1_size_cache *locate_si
 	while (last > first) {
 		int cmp, next = (last + first) >> 1;
 		e = sha1_size_cache[next];
-		cmp = memcmp(e->sha1, sha1, 20);
+		cmp = hashcmp(e->sha1, sha1);
 		if (!cmp)
 			return e;
 		if (cmp < 0) {
@@ -1579,7 +1579,7 @@ static void run_diff(struct diff_filepai
 		;
 	}
 
-	if (memcmp(one->sha1, two->sha1, 20)) {
+	if (hashcmp(one->sha1, two->sha1)) {
 		int abbrev = o->full_index ? 40 : DEFAULT_ABBREV;
 
 		len += snprintf(msg + len, sizeof(msg) - len,
@@ -2098,7 +2098,7 @@ int diff_unmodified_pair(struct diff_fil
 	 * dealing with a change.
 	 */
 	if (one->sha1_valid && two->sha1_valid &&
-	    !memcmp(one->sha1, two->sha1, sizeof(one->sha1)))
+	    !hashcmp(one->sha1, two->sha1))
 		return 1; /* no change */
 	if (!one->sha1_valid && !two->sha1_valid)
 		return 1; /* both look at the same file on the filesystem. */
@@ -2237,7 +2237,7 @@ static void diff_resolve_rename_copy(voi
 			if (!p->status)
 				p->status = DIFF_STATUS_RENAMED;
 		}
-		else if (memcmp(p->one->sha1, p->two->sha1, 20) ||
+		else if (hashcmp(p->one->sha1, p->two->sha1) ||
 			 p->one->mode != p->two->mode)
 			p->status = DIFF_STATUS_MODIFIED;
 		else {
diff --git a/diffcore-break.c b/diffcore-break.c
index ed0e14c..acb18db 100644
--- a/diffcore-break.c
+++ b/diffcore-break.c
@@ -56,7 +56,7 @@ static int should_break(struct diff_file
 		return 0; /* leave symlink rename alone */
 
 	if (src->sha1_valid && dst->sha1_valid &&
-	    !memcmp(src->sha1, dst->sha1, 20))
+	    !hashcmp(src->sha1, dst->sha1))
 		return 0; /* they are the same */
 
 	if (diff_populate_filespec(src, 0) || diff_populate_filespec(dst, 0))
diff --git a/diffcore-rename.c b/diffcore-rename.c
index 0ec488a..ef23901 100644
--- a/diffcore-rename.c
+++ b/diffcore-rename.c
@@ -101,7 +101,7 @@ static int is_exact_match(struct diff_fi
 			  int contents_too)
 {
 	if (src->sha1_valid && dst->sha1_valid &&
-	    !memcmp(src->sha1, dst->sha1, 20))
+	    !hashcmp(src->sha1, dst->sha1))
 		return 1;
 	if (!contents_too)
 		return 0;
diff --git a/dump-cache-tree.c b/dump-cache-tree.c
index 1ccaf51..1f73f1e 100644
--- a/dump-cache-tree.c
+++ b/dump-cache-tree.c
@@ -33,7 +33,7 @@ static int dump_cache_tree(struct cache_
 	}
 	else {
 		dump_one(it, pfx, "");
-		if (memcmp(it->sha1, ref->sha1, 20) ||
+		if (hashcmp(it->sha1, ref->sha1) ||
 		    ref->entry_count != it->entry_count ||
 		    ref->subtree_nr != it->subtree_nr) {
 			dump_one(ref, pfx, "#(ref) ");
diff --git a/http-fetch.c b/http-fetch.c
index 7f07d2a..d1f74b4 100644
--- a/http-fetch.c
+++ b/http-fetch.c
@@ -301,7 +301,7 @@ static void finish_object_request(struct
 		unlink(obj_req->tmpfile);
 		return;
 	}
-	if (memcmp(obj_req->sha1, obj_req->real_sha1, 20)) {
+	if (hashcmp(obj_req->sha1, obj_req->real_sha1)) {
 		unlink(obj_req->tmpfile);
 		return;
 	}
@@ -1070,7 +1070,7 @@ static int fetch_object(struct alt_base 
 	int ret = 0;
 	struct object_request *obj_req = object_queue_head;
 
-	while (obj_req != NULL && memcmp(obj_req->sha1, sha1, 20))
+	while (obj_req != NULL && hashcmp(obj_req->sha1, sha1))
 		obj_req = obj_req->next;
 	if (obj_req == NULL)
 		return error("Couldn't find request for %s in the queue", hex);
@@ -1109,7 +1109,7 @@ #endif
 	} else if (obj_req->zret != Z_STREAM_END) {
 		corrupt_object_found++;
 		ret = error("File %s (%s) corrupt", hex, obj_req->url);
-	} else if (memcmp(obj_req->sha1, obj_req->real_sha1, 20)) {
+	} else if (hashcmp(obj_req->sha1, obj_req->real_sha1)) {
 		ret = error("File %s has bad hash", hex);
 	} else if (obj_req->rename < 0) {
 		ret = error("unable to write sha1 filename %s",
diff --git a/http-push.c b/http-push.c
index 2bd9845..4849779 100644
--- a/http-push.c
+++ b/http-push.c
@@ -745,7 +745,7 @@ static void finish_request(struct transf
 			SHA1_Final(request->real_sha1, &request->c);
 			if (request->zret != Z_STREAM_END) {
 				unlink(request->tmpfile);
-			} else if (memcmp(request->obj->sha1, request->real_sha1, 20)) {
+			} else if (hashcmp(request->obj->sha1, request->real_sha1)) {
 				unlink(request->tmpfile);
 			} else {
 				request->rename =
@@ -2416,7 +2416,7 @@ int main(int argc, char **argv)
 
 		if (!ref->peer_ref)
 			continue;
-		if (!memcmp(ref->old_sha1, ref->peer_ref->new_sha1, 20)) {
+		if (!hashcmp(ref->old_sha1, ref->peer_ref->new_sha1)) {
 			if (push_verbosely || 1)
 				fprintf(stderr, "'%s': up-to-date\n", ref->name);
 			continue;
diff --git a/index-pack.c b/index-pack.c
index b20659c..2063ae9 100644
--- a/index-pack.c
+++ b/index-pack.c
@@ -82,7 +82,7 @@ static void parse_pack_header(void)
 	SHA1_Init(&ctx);
 	SHA1_Update(&ctx, pack_base, pack_size - 20);
 	SHA1_Final(sha1, &ctx);
-	if (memcmp(sha1, pack_base + pack_size - 20, 20))
+	if (hashcmp(sha1, pack_base + pack_size - 20))
 		die("packfile '%s' SHA1 mismatch", pack_name);
 }
 
@@ -189,7 +189,7 @@ static int find_delta(const unsigned cha
                 struct delta_entry *delta = &deltas[next];
                 int cmp;
 
-                cmp = memcmp(base_sha1, delta->base_sha1, 20);
+                cmp = hashcmp(base_sha1, delta->base_sha1);
                 if (!cmp)
                         return next;
                 if (cmp < 0) {
@@ -210,9 +210,11 @@ static int find_deltas_based_on_sha1(con
 
 	if (first < 0)
 		return -1;
-	while (first > 0 && !memcmp(deltas[first-1].base_sha1, base_sha1, 20))
+	while (first > 0 && !hashcmp(deltas[first - 1].base_sha1,
+				     base_sha1))
 		--first;
-	while (last < end && !memcmp(deltas[last+1].base_sha1, base_sha1, 20))
+	while (last < end && !hashcmp(deltas[last + 1].base_sha1,
+				      base_sha1))
 		++last;
 	*first_index = first;
 	*last_index = last;
@@ -278,7 +280,7 @@ static int compare_delta_entry(const voi
 {
 	const struct delta_entry *delta_a = a;
 	const struct delta_entry *delta_b = b;
-	return memcmp(delta_a->base_sha1, delta_b->base_sha1, 20);
+	return hashcmp(delta_a->base_sha1, delta_b->base_sha1);
 }
 
 static void parse_pack_objects(void)
@@ -350,7 +352,7 @@ static int sha1_compare(const void *_a, 
 {
 	struct object_entry *a = *(struct object_entry **)_a;
 	struct object_entry *b = *(struct object_entry **)_b;
-	return memcmp(a->sha1, b->sha1, 20);
+	return hashcmp(a->sha1, b->sha1);
 }
 
 static void write_index_file(const char *index_name, unsigned char *sha1)
diff --git a/merge-tree.c b/merge-tree.c
index 7cf00be..c2e9a86 100644
--- a/merge-tree.c
+++ b/merge-tree.c
@@ -152,7 +152,7 @@ static int same_entry(struct name_entry 
 {
 	return	a->sha1 &&
 		b->sha1 &&
-		!memcmp(a->sha1, b->sha1, 20) &&
+		!hashcmp(a->sha1, b->sha1) &&
 		a->mode == b->mode;
 }
 
diff --git a/object.c b/object.c
index b5d8ed4..fdcfff7 100644
--- a/object.c
+++ b/object.c
@@ -58,7 +58,7 @@ struct object *lookup_object(const unsig
 
 	i = hashtable_index(sha1);
 	while ((obj = obj_hash[i]) != NULL) {
-		if (!memcmp(sha1, obj->sha1, 20))
+		if (!hashcmp(sha1, obj->sha1))
 			break;
 		i++;
 		if (i == obj_hash_size)
diff --git a/pack-check.c b/pack-check.c
index 3a62e1b..04c6c00 100644
--- a/pack-check.c
+++ b/pack-check.c
@@ -29,10 +29,10 @@ static int verify_packfile(struct packed
 	pack_base = p->pack_base;
 	SHA1_Update(&ctx, pack_base, pack_size - 20);
 	SHA1_Final(sha1, &ctx);
-	if (memcmp(sha1, (char *) pack_base + pack_size - 20, 20))
+	if (hashcmp(sha1, (unsigned char *)pack_base + pack_size - 20))
 		return error("Packfile %s SHA1 mismatch with itself",
 			     p->pack_name);
-	if (memcmp(sha1, (char *) index_base + index_size - 40, 20))
+	if (hashcmp(sha1, (unsigned char *)index_base + index_size - 40))
 		return error("Packfile %s SHA1 mismatch with idx",
 			     p->pack_name);
 
@@ -135,7 +135,7 @@ int verify_pack(struct packed_git *p, in
 	SHA1_Init(&ctx);
 	SHA1_Update(&ctx, index_base, index_size - 20);
 	SHA1_Final(sha1, &ctx);
-	if (memcmp(sha1, (char *) index_base + index_size - 20, 20))
+	if (hashcmp(sha1, (unsigned char *)index_base + index_size - 20))
 		ret = error("Packfile index for %s SHA1 mismatch",
 			    p->pack_name);
 
diff --git a/pack-redundant.c b/pack-redundant.c
index 92a09ed..edb5524 100644
--- a/pack-redundant.c
+++ b/pack-redundant.c
@@ -139,7 +139,7 @@ static inline struct llist_item *llist_i
 
 	l = (hint == NULL) ? list->front : hint;
 	while (l) {
-		int cmp = memcmp(l->sha1, sha1, 20);
+		int cmp = hashcmp(l->sha1, sha1);
 		if (cmp > 0) { /* we insert before this entry */
 			return llist_insert(list, prev, sha1);
 		}
@@ -162,7 +162,7 @@ redo_from_start:
 	l = (hint == NULL) ? list->front : hint;
 	prev = NULL;
 	while (l) {
-		int cmp = memcmp(l->sha1, sha1, 20);
+		int cmp = hashcmp(l->sha1, sha1);
 		if (cmp > 0) /* not in list, since sorted */
 			return prev;
 		if(!cmp) { /* found */
@@ -256,7 +256,7 @@ static void cmp_two_packs(struct pack_li
 	while (p1_off <= p1->pack->index_size - 3 * 20 &&
 	       p2_off <= p2->pack->index_size - 3 * 20)
 	{
-		int cmp = memcmp(p1_base + p1_off, p2_base + p2_off, 20);
+		int cmp = hashcmp(p1_base + p1_off, p2_base + p2_off);
 		/* cmp ~ p1 - p2 */
 		if (cmp == 0) {
 			p1_hint = llist_sorted_remove(p1->unique_objects,
@@ -351,16 +351,16 @@ static size_t sizeof_union(struct packed
 {
 	size_t ret = 0;
 	int p1_off, p2_off;
-	char *p1_base, *p2_base;
+	unsigned char *p1_base, *p2_base;
 
 	p1_off = p2_off = 256 * 4 + 4;
-	p1_base = (char *)p1->index_base;
-	p2_base = (char *)p2->index_base;
+	p1_base = (unsigned char *)p1->index_base;
+	p2_base = (unsigned char *)p2->index_base;
 
 	while (p1_off <= p1->index_size - 3 * 20 &&
 	       p2_off <= p2->index_size - 3 * 20)
 	{
-		int cmp = memcmp(p1_base + p1_off, p2_base + p2_off, 20);
+		int cmp = hashcmp(p1_base + p1_off, p2_base + p2_off);
 		/* cmp ~ p1 - p2 */
 		if (cmp == 0) {
 			ret++;
diff --git a/read-cache.c b/read-cache.c
index 6bec833..b6982ea 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -60,7 +60,7 @@ static int ce_compare_data(struct cache_
 	if (fd >= 0) {
 		unsigned char sha1[20];
 		if (!index_fd(sha1, fd, st, 0, NULL))
-			match = memcmp(sha1, ce->sha1, 20);
+			match = hashcmp(sha1, ce->sha1);
 		/* index_fd() closed the file descriptor already */
 	}
 	return match;
@@ -744,7 +744,7 @@ static int verify_hdr(struct cache_heade
 	SHA1_Init(&c);
 	SHA1_Update(&c, hdr, size - 20);
 	SHA1_Final(sha1, &c);
-	if (memcmp(sha1, (char *) hdr + size - 20, 20))
+	if (hashcmp(sha1, (unsigned char *)hdr + size - 20))
 		return error("bad index file sha1 signature");
 	return 0;
 }
diff --git a/refs.c b/refs.c
index 86ef916..17cd0ce 100644
--- a/refs.c
+++ b/refs.c
@@ -281,7 +281,7 @@ static struct ref_lock *verify_lock(stru
 		unlock_ref(lock);
 		return NULL;
 	}
-	if (memcmp(lock->old_sha1, old_sha1, 20)) {
+	if (hashcmp(lock->old_sha1, old_sha1)) {
 		error("Ref %s is at %s but expected %s", lock->ref_file,
 			sha1_to_hex(lock->old_sha1), sha1_to_hex(old_sha1));
 		unlock_ref(lock);
@@ -411,7 +411,7 @@ int write_ref_sha1(struct ref_lock *lock
 
 	if (!lock)
 		return -1;
-	if (!lock->force_write && !memcmp(lock->old_sha1, sha1, 20)) {
+	if (!lock->force_write && !hashcmp(lock->old_sha1, sha1)) {
 		unlock_ref(lock);
 		return 0;
 	}
@@ -475,7 +475,7 @@ int read_ref_at(const char *ref, unsigne
 					die("Log %s is corrupt.", logfile);
 				if (get_sha1_hex(rec + 41, sha1))
 					die("Log %s is corrupt.", logfile);
-				if (memcmp(logged_sha1, sha1, 20)) {
+				if (hashcmp(logged_sha1, sha1)) {
 					tz = strtoul(tz_c, NULL, 10);
 					fprintf(stderr,
 						"warning: Log %s has gap after %s.\n",
@@ -489,7 +489,7 @@ int read_ref_at(const char *ref, unsigne
 			else {
 				if (get_sha1_hex(rec + 41, logged_sha1))
 					die("Log %s is corrupt.", logfile);
-				if (memcmp(logged_sha1, sha1, 20)) {
+				if (hashcmp(logged_sha1, sha1)) {
 					tz = strtoul(tz_c, NULL, 10);
 					fprintf(stderr,
 						"warning: Log %s unexpectedly ended on %s.\n",
diff --git a/send-pack.c b/send-pack.c
index 43e10b0..f7c0cfc 100644
--- a/send-pack.c
+++ b/send-pack.c
@@ -265,7 +265,7 @@ static int send_pack(int in, int out, in
 		char old_hex[60], *new_hex;
 		if (!ref->peer_ref)
 			continue;
-		if (!memcmp(ref->old_sha1, ref->peer_ref->new_sha1, 20)) {
+		if (!hashcmp(ref->old_sha1, ref->peer_ref->new_sha1)) {
 			if (verbose)
 				fprintf(stderr, "'%s': up-to-date\n", ref->name);
 			continue;
diff --git a/sha1_file.c b/sha1_file.c
index 18dece4..04f7f94 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -485,10 +485,10 @@ int use_packed_git(struct packed_git *p)
 		/* Check if the pack file matches with the index file.
 		 * this is cheap.
 		 */
-		if (memcmp((char*)(p->index_base) + p->index_size - 40,
-			   (char *) p->pack_base + p->pack_size - 20,
-			   20)) {
-
+		if (hashcmp((unsigned char *)(p->index_base) +
+			    p->index_size - 40,
+			    (unsigned char *)p->pack_base +
+			    p->pack_size - 20)) {
 			die("packfile %s does not match index.", p->pack_name);
 		}
 	}
@@ -643,7 +643,7 @@ int check_sha1_signature(const unsigned 
 	SHA1_Update(&c, header, 1+sprintf(header, "%s %lu", type, size));
 	SHA1_Update(&c, map, size);
 	SHA1_Final(real_sha1, &c);
-	return memcmp(sha1, real_sha1, 20) ? -1 : 0;
+	return hashcmp(sha1, real_sha1) ? -1 : 0;
 }
 
 void *map_sha1_file(const unsigned char *sha1, unsigned long *size)
@@ -941,7 +941,7 @@ int check_reuse_pack_delta(struct packed
 	ptr = unpack_object_header(p, ptr, kindp, sizep);
 	if (*kindp != OBJ_DELTA)
 		goto done;
-	memcpy(base, (char *) p->pack_base + ptr, 20);
+	memcpy(base, (unsigned char *) p->pack_base + ptr, 20);
 	status = 0;
  done:
 	unuse_packed_git(p);
@@ -1206,7 +1206,7 @@ int find_pack_entry_one(const unsigned c
 
 	do {
 		int mi = (lo + hi) / 2;
-		int cmp = memcmp((char *) index + (24 * mi) + 4, sha1, 20);
+		int cmp = hashcmp((unsigned char *)index + (24 * mi) + 4, sha1);
 		if (!cmp) {
 			e->offset = ntohl(*((unsigned int *) ((char *) index + (24 * mi))));
 			memcpy(e->sha1, sha1, 20);
@@ -1715,7 +1715,7 @@ int write_sha1_from_fd(const unsigned ch
 		unlink(tmpfile);
 		return error("File %s corrupted", sha1_to_hex(sha1));
 	}
-	if (memcmp(sha1, real_sha1, 20)) {
+	if (hashcmp(sha1, real_sha1)) {
 		unlink(tmpfile);
 		return error("File %s has bad hash", sha1_to_hex(sha1));
 	}
diff --git a/sha1_name.c b/sha1_name.c
index f567454..e9eb6ce 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -84,7 +84,7 @@ static int find_short_packed_object(int 
 			int cmp;
 
 			nth_packed_object_sha1(p, mid, now);
-			cmp = memcmp(match, now, 20);
+			cmp = hashcmp(match, now);
 			if (!cmp) {
 				first = mid;
 				break;
@@ -106,7 +106,7 @@ static int find_short_packed_object(int 
 						memcpy(found_sha1, now, 20);
 						found++;
 					}
-					else if (memcmp(found_sha1, now, 20)) {
+					else if (hashcmp(found_sha1, now)) {
 						found = 2;
 						break;
 					}
@@ -144,7 +144,7 @@ static int find_unique_short_object(int 
 		return 0;
 	}
 	/* Both have unique ones -- do they match? */
-	if (memcmp(packed_sha1, unpacked_sha1, 20))
+	if (hashcmp(packed_sha1, unpacked_sha1))
 		return SHORT_NAME_AMBIGUOUS;
 	memcpy(sha1, packed_sha1, 20);
 	return 0;
diff --git a/ssh-fetch.c b/ssh-fetch.c
index 0b89df6..b006c5c 100644
--- a/ssh-fetch.c
+++ b/ssh-fetch.c
@@ -67,7 +67,7 @@ int fetch(unsigned char *sha1)
 	signed char remote;
 	struct object_list *temp;
 
-	if (memcmp(sha1, in_transit->item->sha1, 20)) {
+	if (hashcmp(sha1, in_transit->item->sha1)) {
 		/* we must have already fetched it to clean the queue */
 		return has_sha1_file(sha1) ? 0 : -1;
 	}
diff --git a/tree-diff.c b/tree-diff.c
index 916f489..7e2f4f0 100644
--- a/tree-diff.c
+++ b/tree-diff.c
@@ -39,8 +39,7 @@ static int compare_tree_entry(struct tre
 		show_entry(opt, "+", t2, base);
 		return 1;
 	}
-	if (!opt->find_copies_harder &&
-	    !memcmp(sha1, sha2, 20) && mode1 == mode2)
+	if (!opt->find_copies_harder && !hashcmp(sha1, sha2) && mode1 == mode2)
 		return 0;
 
 	/*
diff --git a/unpack-trees.c b/unpack-trees.c
index 43ed124..467d994 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -417,7 +417,7 @@ static int same(struct cache_entry *a, s
 	if (!a && !b)
 		return 1;
 	return a->ce_mode == b->ce_mode &&
-		!memcmp(a->sha1, b->sha1, 20);
+	       !hashcmp(a->sha1, b->sha1);
 }
 
 
-- 
1.4.2.gd4ba-dirty

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] introduce inline is_same_sha1
  2006-08-17 18:54   ` David Rientjes
@ 2006-08-17 20:50     ` Alex Riesen
  2006-08-18  4:09     ` Junio C Hamano
  1 sibling, 0 replies; 8+ messages in thread
From: Alex Riesen @ 2006-08-17 20:50 UTC (permalink / raw)
  To: David Rientjes; +Cc: git

On 8/17/06, David Rientjes <rientjes@google.com> wrote:
> Introduces global inline:
>         hashcmp(const unsigned char *sha1, const unsigned char *sha2)
>
> Uses memcmp for comparison and returns the result based on the length of
> the hash name (a future runtime decision).
>
> Signed-off-by: David Rientjes <rientjes@google.com>

Acked-by: Alex Riesen <raa.lkml@gmail.com>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] introduce inline is_same_sha1
  2006-08-17 18:54   ` David Rientjes
  2006-08-17 20:50     ` Alex Riesen
@ 2006-08-18  4:09     ` Junio C Hamano
  1 sibling, 0 replies; 8+ messages in thread
From: Junio C Hamano @ 2006-08-18  4:09 UTC (permalink / raw)
  To: David Rientjes; +Cc: git, Alex Riesen

David Rientjes <rientjes@google.com> writes:

> On Thu, 17 Aug 2006, Alex Riesen wrote:
>
>> Why not just sha1cmp? And if you're aiming at hash-type independence,
>> why not hashcmp?
>
> hashcmp is a very good suggestion.
>
> 		David
> ---
> Introduces global inline:
> 	hashcmp(const unsigned char *sha1, const unsigned char *sha2)
>
> Uses memcmp for comparison and returns the result based on the length of 
> the hash name (a future runtime decision).
>
> Signed-off-by: David Rientjes <rientjes@google.com>

Looks very very good.  Much cleaner.

Also, I retract my previous comment that the parameters should
be (void*).  Looking at the call sites that need casts, they
would need either (unsigned char*) or (char*) cast regardless of
the type of the argument hashcmp() function takes anyway.

Thanks.  Will apply.

Oh, by the way, two minor procedural requests.

Pick a good one-line description of the patch; as it was sent,
the commit would have shown (in "git shortlog" output):

	Introduces global inline:

which does not make much sense to the first time readers.

Please use something other than '---' as the delimiter after the
cover letter, if you write one _before_ the commit log message.
E-mailed patch acceptance tools consider anything after '---' is
patch and does not contribute to the commit log, so it is lost
from the resulting commit.

A short cover letter like this is better placed _after_ the real
separator '---' that comes after your commit log message, like
this:

From: David Rientjes <rientjes@google.com>
Subject: Do not use memcmp(sha1_1, sha1_2, 20) with hardcoded length.

Introduces global inline:

	hashcmp(const unsigned char *sha1, const unsigned char *sha2)

Uses memcmp for comparison and returns the result based on the length of 
the hash name (a future runtime decision).

Signed-off-by: David Rientjes <rientjes@google.com>
---

 On Thu, 17 Aug 2006, Alex Riesen wrote:

 > Why not just sha1cmp? And if you're aiming at hash-type independence,
 > why not hashcmp?

 hashcmp is a very good suggestion.  Please ack the following.

 builtin-commit-tree.c    |    2 +-
 builtin-diff-stages.c    |    2 +-
 ...

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2006-08-18  4:09 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-08-17  0:25 [PATCH] introduce inline is_same_sha1 David Rientjes
2006-08-17  1:12 ` Junio C Hamano
2006-08-17  3:51   ` David Rientjes
2006-08-17  6:26     ` Junio C Hamano
2006-08-17 11:59 ` Alex Riesen
2006-08-17 18:54   ` David Rientjes
2006-08-17 20:50     ` Alex Riesen
2006-08-18  4:09     ` Junio C Hamano

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).