commit 25a58941e2beadb3c782e68c751bd74947177955 from: Stefan Sperling date: Tue Jan 08 22:56:48 2019 UTC remove the pathset abstraction again; replaced by RB tree commit - 7a9df742c247f62cb09b77ae4bd3fb8006636553 commit + 25a58941e2beadb3c782e68c751bd74947177955 blob - 59cca6fff1cd992952d074f19528f0b9831465d0 blob + c4412341928e247e4ba1e74b8a4014eb2107252d --- got/Makefile +++ got/Makefile @@ -3,8 +3,8 @@ PROG= got SRCS= got.c blame.c commit_graph.c delta.c diff.c diffoffset.c \ diffreg.c error.c fileindex.c object.c object_cache.c \ - object_idset.c object_parse.c opentemp.c path.c pathset.c \ - pack.c privsep.c reference.c repository.c sha1.c worktree.c \ + object_idset.c object_parse.c opentemp.c path.c pack.c \ + privsep.c reference.c repository.c sha1.c worktree.c \ inflate.c CPPFLAGS = -I${.CURDIR}/../include -I${.CURDIR}/../lib \ blob - 098dd95cefae9823eb8553bd2a8d3730ea263d0c (mode 644) blob + /dev/null --- lib/got_lib_pathset.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2019 Stefan Sperling - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -struct got_pathset; - -struct got_pathset *got_pathset_alloc(void); -void got_pathset_free(struct got_pathset *); - -const struct got_error *got_pathset_add(struct got_pathset *, const char *, - void *); -void *got_pathset_get(struct got_pathset *, const char *); -const struct got_error *got_pathset_remove(void **, struct got_pathset *, - const char *); -int got_pathset_contains(struct got_pathset *, const char *); -const struct got_error *got_pathset_for_each_safe(struct got_pathset *, - const struct got_error *(*cb)(const char *, void *, void *), - void *); -const struct got_error *got_pathset_for_each_reverse_safe(struct got_pathset *, - const struct got_error *(*cb)(const char *, void *, void *), - void *); -int got_pathset_num_elements(struct got_pathset *); blob - 0332c19e110a0a01f815e84f6523dff8331994da (mode 644) blob + /dev/null --- lib/pathset.c +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright (c) 2019 Stefan Sperling - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include - -#include -#include -#include -#include - -#include "got_error.h" -#include "got_lib_path.h" -#include "got_lib_pathset.h" - -struct got_pathset_element { - RB_ENTRY(got_pathset_element) entry; - char *path; - void *data; /* API user data */ -}; - -RB_HEAD(got_pathset_tree, got_pathset_element); - -static int -cmp_elements(const struct got_pathset_element *e1, - const struct got_pathset_element *e2) -{ - return got_compare_paths(e1->path, e2->path); -} - -RB_PROTOTYPE(got_pathset_tree, got_pathset_element, entry, cmp_elements); - -struct got_pathset { - struct got_pathset_tree entries; - int totelem; -#define GOT_PATHSET_MAX_ELEM INT_MAX -}; - -struct got_pathset * -got_pathset_alloc(void) -{ - struct got_pathset *set; - - set = malloc(sizeof(*set)); - if (set == NULL) - return NULL; - - RB_INIT(&set->entries); - set->totelem = 0; - - return set; -} - -static void -free_element(struct got_pathset_element *entry) -{ - free(entry->path); - free(entry); -} - -void -got_pathset_free(struct got_pathset *set) -{ - struct got_pathset_element *entry; - - while ((entry = RB_MIN(got_pathset_tree, &set->entries))) { - RB_REMOVE(got_pathset_tree, &set->entries, entry); - /* User data should be freed by caller. */ - free_element(entry); - } - - free(set); -} - -const struct got_error * -got_pathset_add(struct got_pathset *set, const char *path, void *data) -{ - struct got_pathset_element *new; - - if (set->totelem >= GOT_PATHSET_MAX_ELEM) - return got_error(GOT_ERR_NO_SPACE); - - new = malloc(sizeof(*new)); - if (new == NULL) - return got_error_from_errno(); - - new->path = strdup(path); - if (new->path == NULL) - return got_error_from_errno(); - - new->data = data; - - RB_INSERT(got_pathset_tree, &set->entries, new); - set->totelem++; - return NULL; -} - -static struct got_pathset_element * -find_element(struct got_pathset *set, const char *path) -{ - struct got_pathset_element key, *entry; - key.path = (char *)path; - key.data = NULL; - entry = RB_FIND(got_pathset_tree, &set->entries, &key); - return entry; -} - -void * -got_pathset_get(struct got_pathset *set, const char *path) -{ - struct got_pathset_element *entry = find_element(set, path); - return entry ? entry->data : NULL; -} - -const struct got_error * -got_pathset_remove(void **data, struct got_pathset *set, const char *path) -{ - struct got_pathset_element *entry; - - if (data) - *data = NULL; - - if (set->totelem == 0) - return got_error(GOT_ERR_NO_OBJ); - - if (path == NULL) - entry = RB_ROOT(&set->entries); - else - entry = find_element(set, path); - if (entry == NULL) - return got_error(GOT_ERR_NO_OBJ); - - RB_REMOVE(got_pathset_tree, &set->entries, entry); - if (data) - *data = entry->data; - free_element(entry); - set->totelem--; - return NULL; -} - -int -got_pathset_contains(struct got_pathset *set, const char *path) -{ - struct got_pathset_element *entry = find_element(set, path); - return entry ? 1 : 0; -} - -const struct got_error * -got_pathset_for_each_safe(struct got_pathset *set, - const struct got_error *(*cb)(const char *, void *, void *), void *arg) -{ - const struct got_error *err; - struct got_pathset_element *entry, *tmp; - - RB_FOREACH_SAFE(entry, got_pathset_tree, &set->entries, tmp) { - err = (*cb)(entry->path, entry->data, arg); - if (err) - return err; - } - return NULL; -} - -const struct got_error * -got_pathset_for_each_reverse_safe(struct got_pathset *set, - const struct got_error *(*cb)(const char *, void *, void *), void *arg) -{ - const struct got_error *err; - struct got_pathset_element *entry, *tmp; - - RB_FOREACH_REVERSE_SAFE(entry, got_pathset_tree, &set->entries, tmp) { - err = (*cb)(entry->path, entry->data, arg); - if (err) - return err; - } - return NULL; -} - -int -got_pathset_num_elements(struct got_pathset *set) -{ - return set->totelem; -} - -RB_GENERATE(got_pathset_tree, got_pathset_element, entry, cmp_elements); blob - f4dda9c1107a2a59b5d7c6f3878b068ca3075b96 blob + bd68cd59dd3fc57df8b43aee72ba61e5cda697d3 --- regress/Makefile +++ regress/Makefile @@ -1,3 +1,3 @@ -SUBDIR = cmdline delta idset pathset repository worktree +SUBDIR = cmdline delta idset repository worktree .include blob - 7046be709f854cb231dae101e6b5e9fe1670cc55 blob + 622918d65a3235175fbd16aaffcc60725d7d93cc --- regress/idset/Makefile +++ regress/idset/Makefile @@ -1,9 +1,9 @@ .PATH:${.CURDIR}/../../lib PROG = idset_test -SRCS = error.c object.c privsep.c sha1.c pack.c inflate.c path.c pathset.c \ - opentemp.c delta.c repository.c reference.c worktree.c fileindex.c \ - object_cache.c object_idset.c object_parse.c idset_test.c +SRCS = error.c object.c privsep.c sha1.c pack.c inflate.c path.c opentemp.c \ + delta.c repository.c reference.c worktree.c fileindex.c object_cache.c \ + object_idset.c object_parse.c idset_test.c CPPFLAGS = -I${.CURDIR}/../../include -I${.CURDIR}/../../lib LDADD = -lutil -lz blob - 35b7f216dd013066af642519d26ad4ddcb5a6b31 (mode 644) blob + /dev/null --- regress/pathset/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -.PATH:${.CURDIR}/../../lib - -PROG = pathset_test -SRCS = error.c sha1.c pathset.c path.c pathset_test.c - -CPPFLAGS = -I${.CURDIR}/../../include -I${.CURDIR}/../../lib -LDADD = - -NOMAN = yes - -.include blob - 9cd8b5a95ebbc11b42f2187aa0aebcc0a8a4aab5 (mode 644) blob + /dev/null --- regress/pathset/pathset_test.c +++ /dev/null @@ -1,264 +0,0 @@ -/* - * Copyright (c) 2019 Stefan Sperling - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include -#include -#include -#include -#include -#include - -#include "got_error.h" - -#include "got_lib_pathset.h" - -static int verbose; - -void -test_printf(char *fmt, ...) -{ - va_list ap; - - if (!verbose) - return; - - va_start(ap, fmt); - vprintf(fmt, ap); - va_end(ap); -} - -static const char *path1 = "/", *path2 = "/usr", *path3 = "/usr/bin"; -static const char *data1 = "data1", *data2 = "data2", *data3 = "data3"; - -static const struct got_error * -pathset_add_remove_iter_cb(const char *path, void *data, void *arg) -{ - test_printf("%s\n", path); - if ((strcmp(path, path1) == 0 && data == (void *)data1) || - (strcmp(path, path3) == 0 && data == (void *)data3)) - return NULL; - abort(); - return NULL; /* not reached */ -} - -static int -pathset_add_remove_iter(void) -{ - const struct got_error *err = NULL; - struct got_pathset *set; - - set = got_pathset_alloc(); - if (set == NULL) { - err = got_error_from_errno(); - goto done; - } - if (got_pathset_num_elements(set) != 0) { - err = got_error(GOT_ERR_BAD_PATH); - goto done; - } - - - err = got_pathset_add(set, path1, (void *)data1); - if (err) - goto done; - if (got_pathset_num_elements(set) != 1) { - err = got_error(GOT_ERR_BAD_PATH); - goto done; - } - - if (!got_pathset_contains(set, path1)) { - err = got_error(GOT_ERR_BAD_PATH); - goto done; - } - - err = got_pathset_add(set, path2, (void *)data2); - if (err) - goto done; - if (!got_pathset_contains(set, path2)) { - err = got_error(GOT_ERR_BAD_PATH); - goto done; - } - if (got_pathset_num_elements(set) != 2) { - err = got_error(GOT_ERR_BAD_PATH); - goto done; - } - - err = got_pathset_add(set, path3, (void *)data3); - if (err) - goto done; - if (got_pathset_get(set, path3) != (void *)data3) { - err = got_error(GOT_ERR_BAD_PATH); - goto done; - } - if (got_pathset_num_elements(set) != 3) { - err = got_error(GOT_ERR_BAD_PATH); - goto done; - } - - err = got_pathset_remove(NULL, set, path2); - if (err) - goto done; - if (got_pathset_num_elements(set) != 2) { - err = got_error(GOT_ERR_BAD_PATH); - goto done; - } - if (got_pathset_contains(set, path2)) { - err = got_error(GOT_ERR_BAD_PATH); - goto done; - } - if (got_pathset_get(set, path2) != NULL) { - err = got_error(GOT_ERR_BAD_PATH); - goto done; - } - - got_pathset_for_each_safe(set, pathset_add_remove_iter_cb, NULL); -done: - got_pathset_free(set); - return (err == NULL); -} - -static const struct got_error * -pathset_iter_order_cb(const char *path, void *data, void *arg) -{ - static int i; - test_printf("%s\n", path); - if (i == 0 && strcmp(path, "/") != 0) - abort(); - if (i == 1 && strcmp(path, "/usr.bin") != 0) - abort(); - if (i == 2 && strcmp(path, "/usr.bin/vi") != 0) - abort(); - if (i == 3 && strcmp(path, "/usr.sbin") != 0) - abort(); - if (i == 4 && strcmp(path, "/usr.sbin/unbound") != 0) - abort(); - if (i == 5 && strcmp(path, "/usr.sbin/zic") != 0) - abort(); - if (i > 5) - abort(); - i++; - return NULL; -} - -static const struct got_error * -pathset_iter_reverse_order_cb(const char *path, void *data, void *arg) -{ - static int i; - test_printf("%s\n", path); - if (i == 0 && strcmp(path, "/usr.sbin/zic") != 0) - abort(); - if (i == 1 && strcmp(path, "/usr.sbin/unbound") != 0) - abort(); - if (i == 2 && strcmp(path, "/usr.sbin") != 0) - abort(); - if (i == 3 && strcmp(path, "/usr.bin/vi") != 0) - abort(); - if (i == 4 && strcmp(path, "/usr.bin") != 0) - abort(); - if (i == 5 && strcmp(path, "/") != 0) - abort(); - if (i > 5) - abort(); - i++; - return NULL; -} - -static int -pathset_iter_order(void) -{ - const struct got_error *err = NULL; - struct got_pathset *set; - - set = got_pathset_alloc(); - if (set == NULL) { - err = got_error_from_errno(); - goto done; - } - if (got_pathset_num_elements(set) != 0) { - err = got_error(GOT_ERR_BAD_PATH); - goto done; - } - - - err = got_pathset_add(set, "/usr.bin", (void *)data1); - if (err) - goto done; - err = got_pathset_add(set, "/usr.sbin/unbound", (void *)data1); - if (err) - goto done; - err = got_pathset_add(set, "/usr.bin/vi", (void *)data1); - if (err) - goto done; - err = got_pathset_add(set, "/", (void *)data1); - if (err) - goto done; - err = got_pathset_add(set, "/usr.sbin/zic", (void *)data1); - if (err) - goto done; - err = got_pathset_add(set, "/usr.sbin", (void *)data1); - if (err) - goto done; - - test_printf("normal order:\n"); - got_pathset_for_each_safe(set, pathset_iter_order_cb, NULL); - test_printf("reverse order:\n"); - got_pathset_for_each_reverse_safe(set, pathset_iter_reverse_order_cb, - NULL); -done: - got_pathset_free(set); - return (err == NULL); -} - -#define RUN_TEST(expr, name) \ - { test_ok = (expr); \ - printf("test_%s %s\n", (name), test_ok ? "ok" : "failed"); \ - failure = (failure || !test_ok); } - -void -usage(void) -{ - fprintf(stderr, "usage: pathset_test [-v]\n"); -} - -int -main(int argc, char *argv[]) -{ - int test_ok = 0, failure = 0; - int ch; - -#ifndef PROFILE - if (pledge("stdio", NULL) == -1) - err(1, "pledge"); -#endif - - while ((ch = getopt(argc, argv, "v")) != -1) { - switch (ch) { - case 'v': - verbose = 1; - break; - default: - usage(); - return 1; - } - } - argc -= optind; - argv += optind; - - RUN_TEST(pathset_add_remove_iter(), "pathset_add_remove_iter"); - RUN_TEST(pathset_iter_order(), "pathset_iter_order"); - - return failure ? 1 : 0; -} blob - 7eba96e9e3b3cf49fc84691bde7194b8a506ac39 blob + 5da0a61342d57368a2ad4a97cf0cfcacf13e6028 --- regress/repository/Makefile +++ regress/repository/Makefile @@ -4,7 +4,7 @@ PROG = repository_test SRCS = path.c repository.c error.c reference.c object.c object_cache.c \ object_idset.c object_parse.c opentemp.c sha1.c diff.c diffreg.c \ pack.c privsep.c delta.c fileindex.c worktree.c inflate.c \ - pathset.c repository_test.c + repository_test.c CPPFLAGS = -I${.CURDIR}/../../include -I${.CURDIR}/../../lib \ -DGOT_LIBEXECDIR=${GOT_LIBEXECDIR} blob - c7e2786beead1950de2cd83f434b064dc3366aa0 blob + f31fa65e08a2297db4491f0a7c4c42af2674c65e --- regress/worktree/Makefile +++ regress/worktree/Makefile @@ -2,8 +2,8 @@ PROG = worktree_test SRCS = worktree.c repository.c object.c object_cache.c object_idset.c \ - object_parse.c opentemp.c path.c pathset.c error.c reference.c sha1.c \ - pack.c privsep.c delta.c inflate.c fileindex.c worktree_test.c + object_parse.c opentemp.c path.c error.c reference.c sha1.c pack.c \ + privsep.c delta.c inflate.c fileindex.c worktree_test.c CPPFLAGS = -I${.CURDIR}/../../include -I${.CURDIR}/../../lib \ -DGOT_LIBEXECDIR=${GOT_LIBEXECDIR} blob - fb527723e3ad29a2d4e54676089954a3376cfaa1 blob + 72f8d6d7e4c381ebb68b1e052998d0843ff100aa --- tog/Makefile +++ tog/Makefile @@ -3,8 +3,8 @@ PROG= tog SRCS= tog.c blame.c commit_graph.c delta.c diff.c diffoffset.c \ diffreg.c error.c fileindex.c object.c object_cache.c \ - object_idset.c object_parse.c opentemp.c path.c pathset.c \ - pack.c privsep.c reference.c repository.c sha1.c worktree.c \ + object_idset.c object_parse.c opentemp.c path.c pack.c \ + privsep.c reference.c repository.c sha1.c worktree.c \ utf8.c inflate.c CPPFLAGS = -I${.CURDIR}/../include -I${.CURDIR}/../lib \