commit - 7a9df742c247f62cb09b77ae4bd3fb8006636553
commit + 25a58941e2beadb3c782e68c751bd74947177955
blob - 59cca6fff1cd992952d074f19528f0b9831465d0
blob + c4412341928e247e4ba1e74b8a4014eb2107252d
--- got/Makefile
+++ got/Makefile
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
-/*
- * Copyright (c) 2019 Stefan Sperling <stsp@openbsd.org>
- *
- * 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
-/*
- * Copyright (c) 2019 Stefan Sperling <stsp@openbsd.org>
- *
- * 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 <sys/tree.h>
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <limits.h>
-
-#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
-SUBDIR = cmdline delta idset pathset repository worktree
+SUBDIR = cmdline delta idset repository worktree
.include <bsd.subdir.mk>
blob - 7046be709f854cb231dae101e6b5e9fe1670cc55
blob + 622918d65a3235175fbd16aaffcc60725d7d93cc
--- regress/idset/Makefile
+++ regress/idset/Makefile
.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
-.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 <bsd.regress.mk>
blob - 9cd8b5a95ebbc11b42f2187aa0aebcc0a8a4aab5 (mode 644)
blob + /dev/null
--- regress/pathset/pathset_test.c
+++ /dev/null
-/*
- * Copyright (c) 2019 Stefan Sperling <stsp@openbsd.org>
- *
- * 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 <stdarg.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <err.h>
-
-#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
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
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
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 \