git@vger.kernel.org list mirror (unofficial, one of many)
 help / color / Atom feed
* [PATCH v2 0/3] Test oidmap
@ 2019-06-11  8:23 Christian Couder
  2019-06-11  8:23 ` [PATCH v2 1/3] t/helper: add test-oidmap.c Christian Couder
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Christian Couder @ 2019-06-11  8:23 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, Ævar Arnfjörð Bjarmason,
	Jonathan Tan, SZEDER Gábor, Christian Couder

Unlike hashmap that has t/helper/test-hashmap.c and t/t0011-hashmap.sh
oidmap has no specific test. The goal of this small patch series is to
change that and also improve oidmap a bit while at it.

Changes compared to V1 are the following:

  - use printf("%x\n", ntohl(sha1hash(oid.hash))) to print hashes as
    suggested by Gábor and approved by Junio,

  - use `git rev-parse "$1" | cut -c1-8` to check hashes in t0016 as
    suggested by Gábor,

  - removed PERL prereq on "hash" test in t0016 as allowed by the
    above change and suggested by Gábor,

  - removed suprious space between ">" and "expect" in t0016 as
    suggested by Gábor.

I decided against hardcoding values as I think it might help
transitionning from SHA1 to SHA256.

Christian Couder (3):
  t/helper: add test-oidmap.c
  t: add t0016-oidmap.sh
  oidmap: use sha1hash() instead of static hash() function

 Makefile               |   1 +
 oidmap.c               |  13 +---
 t/helper/test-oidmap.c | 134 +++++++++++++++++++++++++++++++++++++++++
 t/helper/test-tool.c   |   1 +
 t/helper/test-tool.h   |   1 +
 t/t0016-oidmap.sh      | 100 ++++++++++++++++++++++++++++++
 6 files changed, 240 insertions(+), 10 deletions(-)
 create mode 100644 t/helper/test-oidmap.c
 create mode 100755 t/t0016-oidmap.sh

-- 
2.22.0.6.gde8b105b43


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

* [PATCH v2 1/3] t/helper: add test-oidmap.c
  2019-06-11  8:23 [PATCH v2 0/3] Test oidmap Christian Couder
@ 2019-06-11  8:23 ` Christian Couder
  2019-06-11  8:23 ` [PATCH v2 2/3] t: add t0016-oidmap.sh Christian Couder
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 7+ messages in thread
From: Christian Couder @ 2019-06-11  8:23 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, Ævar Arnfjörð Bjarmason,
	Jonathan Tan, SZEDER Gábor, Christian Couder

This new helper is very similar to "test-hashmap.c" and will help
test how `struct oidmap` from oidmap.{c,h} can be used.

Helped-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 Makefile               |   1 +
 t/helper/test-oidmap.c | 134 +++++++++++++++++++++++++++++++++++++++++
 t/helper/test-tool.c   |   1 +
 t/helper/test-tool.h   |   1 +
 4 files changed, 137 insertions(+)
 create mode 100644 t/helper/test-oidmap.c

diff --git a/Makefile b/Makefile
index 8a7e235352..5efc7700ed 100644
--- a/Makefile
+++ b/Makefile
@@ -727,6 +727,7 @@ TEST_BUILTINS_OBJS += test-lazy-init-name-hash.o
 TEST_BUILTINS_OBJS += test-match-trees.o
 TEST_BUILTINS_OBJS += test-mergesort.o
 TEST_BUILTINS_OBJS += test-mktemp.o
+TEST_BUILTINS_OBJS += test-oidmap.o
 TEST_BUILTINS_OBJS += test-online-cpus.o
 TEST_BUILTINS_OBJS += test-parse-options.o
 TEST_BUILTINS_OBJS += test-path-utils.o
diff --git a/t/helper/test-oidmap.c b/t/helper/test-oidmap.c
new file mode 100644
index 0000000000..60e92096a1
--- /dev/null
+++ b/t/helper/test-oidmap.c
@@ -0,0 +1,134 @@
+#include "test-tool.h"
+#include "cache.h"
+#include "oidmap.h"
+#include "strbuf.h"
+
+/* key is an oid and value is a name (could be a refname for example) */
+struct test_entry {
+	struct oidmap_entry entry;
+	char name[FLEX_ARRAY];
+};
+
+#define DELIM " \t\r\n"
+
+/*
+ * Read stdin line by line and print result of commands to stdout:
+ *
+ * hash oidkey -> sha1hash(oidkey)
+ * put oidkey namevalue -> NULL / old namevalue
+ * get oidkey -> NULL / namevalue
+ * remove oidkey -> NULL / old namevalue
+ * iterate -> oidkey1 namevalue1\noidkey2 namevalue2\n...
+ *
+ */
+int cmd__oidmap(int argc, const char **argv)
+{
+	struct strbuf line = STRBUF_INIT;
+	struct oidmap map = OIDMAP_INIT;
+
+	setup_git_directory();
+
+	/* init oidmap */
+	oidmap_init(&map, 0);
+
+	/* process commands from stdin */
+	while (strbuf_getline(&line, stdin) != EOF) {
+		char *cmd, *p1 = NULL, *p2 = NULL;
+		struct test_entry *entry;
+		struct object_id oid;
+
+		/* break line into command and up to two parameters */
+		cmd = strtok(line.buf, DELIM);
+		/* ignore empty lines */
+		if (!cmd || *cmd == '#')
+			continue;
+
+		p1 = strtok(NULL, DELIM);
+		if (p1)
+			p2 = strtok(NULL, DELIM);
+
+		if (!strcmp("hash", cmd) && p1) {
+
+			/* print hash of oid */
+			if (!get_oid(p1, &oid))
+				printf("%x\n", ntohl(sha1hash(oid.hash)));
+			else
+				printf("Unknown oid: %s\n", p1);
+
+		} else if (!strcmp("add", cmd) && p1 && p2) {
+
+			if (get_oid(p1, &oid)) {
+				printf("Unknown oid: %s\n", p1);
+				continue;
+			}
+
+			/* create entry with oidkey from p1, value = p2 */
+			FLEX_ALLOC_STR(entry, name, p2);
+			oidcpy(&entry->entry.oid, &oid);
+
+			/* add to oidmap */
+			oidmap_put(&map, entry);
+
+		} else if (!strcmp("put", cmd) && p1 && p2) {
+
+			if (get_oid(p1, &oid)) {
+				printf("Unknown oid: %s\n", p1);
+				continue;
+			}
+
+			/* create entry with oid_key = p1, name_value = p2 */
+			FLEX_ALLOC_STR(entry, name, p2);
+			oidcpy(&entry->entry.oid, &oid);
+
+			/* add / replace entry */
+			entry = oidmap_put(&map, entry);
+
+			/* print and free replaced entry, if any */
+			puts(entry ? entry->name : "NULL");
+			free(entry);
+
+		} else if (!strcmp("get", cmd) && p1) {
+
+			if (get_oid(p1, &oid)) {
+				printf("Unknown oid: %s\n", p1);
+				continue;
+			}
+
+			/* lookup entry in oidmap */
+			entry = oidmap_get(&map, &oid);
+
+			/* print result */
+			puts(entry ? entry->name : "NULL");
+
+		} else if (!strcmp("remove", cmd) && p1) {
+
+			if (get_oid(p1, &oid)) {
+				printf("Unknown oid: %s\n", p1);
+				continue;
+			}
+
+			/* remove entry from oidmap */
+			entry = oidmap_remove(&map, &oid);
+
+			/* print result and free entry*/
+			puts(entry ? entry->name : "NULL");
+			free(entry);
+
+		} else if (!strcmp("iterate", cmd)) {
+
+			struct oidmap_iter iter;
+			oidmap_iter_init(&map, &iter);
+			while ((entry = oidmap_iter_next(&iter)))
+				printf("%s %s\n", oid_to_hex(&entry->entry.oid), entry->name);
+
+		} else {
+
+			printf("Unknown command %s\n", cmd);
+
+		}
+	}
+
+	strbuf_release(&line);
+	oidmap_free(&map, 1);
+	return 0;
+}
diff --git a/t/helper/test-tool.c b/t/helper/test-tool.c
index 087a8c0cc9..1eac25233f 100644
--- a/t/helper/test-tool.c
+++ b/t/helper/test-tool.c
@@ -35,6 +35,7 @@ static struct test_cmd cmds[] = {
 	{ "match-trees", cmd__match_trees },
 	{ "mergesort", cmd__mergesort },
 	{ "mktemp", cmd__mktemp },
+	{ "oidmap", cmd__oidmap },
 	{ "online-cpus", cmd__online_cpus },
 	{ "parse-options", cmd__parse_options },
 	{ "path-utils", cmd__path_utils },
diff --git a/t/helper/test-tool.h b/t/helper/test-tool.h
index 7e703f3038..c7a46dc320 100644
--- a/t/helper/test-tool.h
+++ b/t/helper/test-tool.h
@@ -25,6 +25,7 @@ int cmd__lazy_init_name_hash(int argc, const char **argv);
 int cmd__match_trees(int argc, const char **argv);
 int cmd__mergesort(int argc, const char **argv);
 int cmd__mktemp(int argc, const char **argv);
+int cmd__oidmap(int argc, const char **argv);
 int cmd__online_cpus(int argc, const char **argv);
 int cmd__parse_options(int argc, const char **argv);
 int cmd__path_utils(int argc, const char **argv);
-- 
2.22.0.6.gde8b105b43


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

* [PATCH v2 2/3] t: add t0016-oidmap.sh
  2019-06-11  8:23 [PATCH v2 0/3] Test oidmap Christian Couder
  2019-06-11  8:23 ` [PATCH v2 1/3] t/helper: add test-oidmap.c Christian Couder
@ 2019-06-11  8:23 ` Christian Couder
  2019-06-11 10:12   ` SZEDER Gábor
  2019-06-11  8:23 ` [PATCH v2 3/3] oidmap: use sha1hash() instead of static hash() function Christian Couder
  2019-06-11 10:12 ` [PATCH v2 0/3] Test oidmap SZEDER Gábor
  3 siblings, 1 reply; 7+ messages in thread
From: Christian Couder @ 2019-06-11  8:23 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, Ævar Arnfjörð Bjarmason,
	Jonathan Tan, SZEDER Gábor, Christian Couder,
	Christian Couder

From: Christian Couder <christian.couder@gmail.com>

Add actual tests for operations using `struct oidmap` from oidmap.{c,h}.

Helped-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 t/t0016-oidmap.sh | 100 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 100 insertions(+)
 create mode 100755 t/t0016-oidmap.sh

diff --git a/t/t0016-oidmap.sh b/t/t0016-oidmap.sh
new file mode 100755
index 0000000000..cbd2cb71d6
--- /dev/null
+++ b/t/t0016-oidmap.sh
@@ -0,0 +1,100 @@
+#!/bin/sh
+
+test_description='test oidmap'
+. ./test-lib.sh
+
+# This purposefully is very similar to t0011-hashmap.sh
+
+test_oidmap() {
+	echo "$1" | test-tool oidmap $3 > actual &&
+	echo "$2" >expect &&
+	test_cmp expect actual
+}
+
+
+test_expect_success 'setup' '
+
+	test_commit one &&
+	test_commit two &&
+	test_commit three &&
+	test_commit four
+
+'
+
+test_oidhash() {
+	git rev-parse "$1" | cut -c1-8
+}
+
+test_expect_success 'hash' '
+
+test_oidmap "hash one
+hash two
+hash invalidOid
+hash three" "$(test_oidhash one)
+$(test_oidhash two)
+Unknown oid: invalidOid
+$(test_oidhash three)"
+
+'
+
+test_expect_success 'put' '
+
+test_oidmap "put one 1
+put two 2
+put invalidOid 4
+put three 3" "NULL
+NULL
+Unknown oid: invalidOid
+NULL"
+
+'
+
+test_expect_success 'replace' '
+
+test_oidmap "put one 1
+put two 2
+put three 3
+put invalidOid 4
+put two deux
+put one un" "NULL
+NULL
+NULL
+Unknown oid: invalidOid
+2
+1"
+
+'
+
+test_expect_success 'get' '
+
+test_oidmap "put one 1
+put two 2
+put three 3
+get two
+get four
+get invalidOid
+get one" "NULL
+NULL
+NULL
+2
+NULL
+Unknown oid: invalidOid
+1"
+
+'
+
+test_expect_success 'iterate' '
+
+test_oidmap "put one 1
+put two 2
+put three 3
+iterate" "NULL
+NULL
+NULL
+$(git rev-parse two) 2
+$(git rev-parse one) 1
+$(git rev-parse three) 3"
+
+'
+
+test_done
-- 
2.22.0.6.gde8b105b43


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

* [PATCH v2 3/3] oidmap: use sha1hash() instead of static hash() function
  2019-06-11  8:23 [PATCH v2 0/3] Test oidmap Christian Couder
  2019-06-11  8:23 ` [PATCH v2 1/3] t/helper: add test-oidmap.c Christian Couder
  2019-06-11  8:23 ` [PATCH v2 2/3] t: add t0016-oidmap.sh Christian Couder
@ 2019-06-11  8:23 ` Christian Couder
  2019-06-11 10:12 ` [PATCH v2 0/3] Test oidmap SZEDER Gábor
  3 siblings, 0 replies; 7+ messages in thread
From: Christian Couder @ 2019-06-11  8:23 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, Ævar Arnfjörð Bjarmason,
	Jonathan Tan, SZEDER Gábor, Christian Couder,
	Christian Couder

From: Christian Couder <christian.couder@gmail.com>

Get rid of the static hash() function in oidmap.c which is redundant
with sha1hash(). Use sha1hash() directly instead.

Let's be more consistent and not use several hash functions doing
nearly exactly the same thing.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 oidmap.c | 13 +++----------
 1 file changed, 3 insertions(+), 10 deletions(-)

diff --git a/oidmap.c b/oidmap.c
index b0841a0f58..01c206aaef 100644
--- a/oidmap.c
+++ b/oidmap.c
@@ -12,13 +12,6 @@ static int oidmap_neq(const void *hashmap_cmp_fn_data,
 		      &((const struct oidmap_entry *) entry_or_key)->oid);
 }
 
-static int hash(const struct object_id *oid)
-{
-	int hash;
-	memcpy(&hash, oid->hash, sizeof(hash));
-	return hash;
-}
-
 void oidmap_init(struct oidmap *map, size_t initial_size)
 {
 	hashmap_init(&map->map, oidmap_neq, NULL, initial_size);
@@ -36,7 +29,7 @@ void *oidmap_get(const struct oidmap *map, const struct object_id *key)
 	if (!map->map.cmpfn)
 		return NULL;
 
-	return hashmap_get_from_hash(&map->map, hash(key), key);
+	return hashmap_get_from_hash(&map->map, sha1hash(key->hash), key);
 }
 
 void *oidmap_remove(struct oidmap *map, const struct object_id *key)
@@ -46,7 +39,7 @@ void *oidmap_remove(struct oidmap *map, const struct object_id *key)
 	if (!map->map.cmpfn)
 		oidmap_init(map, 0);
 
-	hashmap_entry_init(&entry, hash(key));
+	hashmap_entry_init(&entry, sha1hash(key->hash));
 	return hashmap_remove(&map->map, &entry, key);
 }
 
@@ -57,6 +50,6 @@ void *oidmap_put(struct oidmap *map, void *entry)
 	if (!map->map.cmpfn)
 		oidmap_init(map, 0);
 
-	hashmap_entry_init(&to_put->internal_entry, hash(&to_put->oid));
+	hashmap_entry_init(&to_put->internal_entry, sha1hash(to_put->oid.hash));
 	return hashmap_put(&map->map, to_put);
 }
-- 
2.22.0.6.gde8b105b43


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

* Re: [PATCH v2 0/3] Test oidmap
  2019-06-11  8:23 [PATCH v2 0/3] Test oidmap Christian Couder
                   ` (2 preceding siblings ...)
  2019-06-11  8:23 ` [PATCH v2 3/3] oidmap: use sha1hash() instead of static hash() function Christian Couder
@ 2019-06-11 10:12 ` SZEDER Gábor
  3 siblings, 0 replies; 7+ messages in thread
From: SZEDER Gábor @ 2019-06-11 10:12 UTC (permalink / raw)
  To: Christian Couder
  Cc: git, Junio C Hamano, Ævar Arnfjörð Bjarmason,
	Jonathan Tan, Christian Couder

On Tue, Jun 11, 2019 at 10:23:22AM +0200, Christian Couder wrote:
> I decided against hardcoding values as I think it might help
> transitionning from SHA1 to SHA256.

Ok, that makes sense.


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

* Re: [PATCH v2 2/3] t: add t0016-oidmap.sh
  2019-06-11  8:23 ` [PATCH v2 2/3] t: add t0016-oidmap.sh Christian Couder
@ 2019-06-11 10:12   ` SZEDER Gábor
  2019-06-12 17:09     ` Christian Couder
  0 siblings, 1 reply; 7+ messages in thread
From: SZEDER Gábor @ 2019-06-11 10:12 UTC (permalink / raw)
  To: Christian Couder
  Cc: git, Junio C Hamano, Ævar Arnfjörð Bjarmason,
	Jonathan Tan, Christian Couder

On Tue, Jun 11, 2019 at 10:23:24AM +0200, Christian Couder wrote:
> diff --git a/t/t0016-oidmap.sh b/t/t0016-oidmap.sh
> new file mode 100755
> index 0000000000..cbd2cb71d6
> --- /dev/null
> +++ b/t/t0016-oidmap.sh
> @@ -0,0 +1,100 @@
> +#!/bin/sh
> +
> +test_description='test oidmap'
> +. ./test-lib.sh
> +
> +# This purposefully is very similar to t0011-hashmap.sh
> +
> +test_oidmap() {
> +	echo "$1" | test-tool oidmap $3 > actual &&

Style nit: space between redirection op and filename ;)


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

* Re: [PATCH v2 2/3] t: add t0016-oidmap.sh
  2019-06-11 10:12   ` SZEDER Gábor
@ 2019-06-12 17:09     ` Christian Couder
  0 siblings, 0 replies; 7+ messages in thread
From: Christian Couder @ 2019-06-12 17:09 UTC (permalink / raw)
  To: SZEDER Gábor
  Cc: git, Junio C Hamano, Ævar Arnfjörð Bjarmason,
	Jonathan Tan, Christian Couder

On Tue, Jun 11, 2019 at 12:12 PM SZEDER Gábor <szeder.dev@gmail.com> wrote:
>
> On Tue, Jun 11, 2019 at 10:23:24AM +0200, Christian Couder wrote:
> > diff --git a/t/t0016-oidmap.sh b/t/t0016-oidmap.sh
> > new file mode 100755
> > index 0000000000..cbd2cb71d6
> > --- /dev/null
> > +++ b/t/t0016-oidmap.sh
> > @@ -0,0 +1,100 @@
> > +#!/bin/sh
> > +
> > +test_description='test oidmap'
> > +. ./test-lib.sh
> > +
> > +# This purposefully is very similar to t0011-hashmap.sh
> > +
> > +test_oidmap() {
> > +     echo "$1" | test-tool oidmap $3 > actual &&
>
> Style nit: space between redirection op and filename ;)

Aargh! I will resend soon with a fix.

It will actually have everything that Junio put in 7f2a91c1a6
(SQUASH??? sh style, 2019-06-11) which is in pu.

Thanks,
Christian.

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

end of thread, back to index

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-11  8:23 [PATCH v2 0/3] Test oidmap Christian Couder
2019-06-11  8:23 ` [PATCH v2 1/3] t/helper: add test-oidmap.c Christian Couder
2019-06-11  8:23 ` [PATCH v2 2/3] t: add t0016-oidmap.sh Christian Couder
2019-06-11 10:12   ` SZEDER Gábor
2019-06-12 17:09     ` Christian Couder
2019-06-11  8:23 ` [PATCH v2 3/3] oidmap: use sha1hash() instead of static hash() function Christian Couder
2019-06-11 10:12 ` [PATCH v2 0/3] Test oidmap SZEDER Gábor

git@vger.kernel.org list mirror (unofficial, one of many)

Archives are clonable:
	git clone --mirror https://public-inbox.org/git
	git clone --mirror http://ou63pmih66umazou.onion/git
	git clone --mirror http://czquwvybam4bgbro.onion/git
	git clone --mirror http://hjrcffqmbrq6wope.onion/git

Newsgroups are available over NNTP:
	nntp://news.public-inbox.org/inbox.comp.version-control.git
	nntp://ou63pmih66umazou.onion/inbox.comp.version-control.git
	nntp://czquwvybam4bgbro.onion/inbox.comp.version-control.git
	nntp://hjrcffqmbrq6wope.onion/inbox.comp.version-control.git
	nntp://news.gmane.org/gmane.comp.version-control.git

 note: .onion URLs require Tor: https://www.torproject.org/

AGPL code for this site: git clone https://public-inbox.org/ public-inbox