aboutsummaryrefslogtreecommitdiff
path: root/devel/got
diff options
context:
space:
mode:
authorChristian Weisgerber <naddy@FreeBSD.org>2020-09-17 19:36:47 +0000
committerChristian Weisgerber <naddy@FreeBSD.org>2020-09-17 19:36:47 +0000
commit902e169038b2c326b5b479435df0804c4ca7d391 (patch)
tree25ec9ab112159436a53239906d65ad891f111e07 /devel/got
parentb2de7c8c2c591a32e72e27fe3a685469d8c39e10 (diff)
downloadports-902e169038b2c326b5b479435df0804c4ca7d391.tar.gz
ports-902e169038b2c326b5b479435df0804c4ca7d391.zip
Import got 0.39.
Game of Trees (Got) is a version control system which prioritizes ease of use and simplicity over flexibility. Got uses Git repositories to store versioned data. Git can be used for any functionality which has not yet been implemented in Got. It will always remain possible to work with both Got and Git on the same repository. WWW: https://gameoftrees.org
Notes
Notes: svn path=/head/; revision=548853
Diffstat (limited to 'devel/got')
-rw-r--r--devel/got/Makefile26
-rw-r--r--devel/got/distinfo3
-rw-r--r--devel/got/files/openbsd-compat/Makefile12
-rw-r--r--devel/got/files/openbsd-compat/endian.h6
-rw-r--r--devel/got/files/openbsd-compat/freezero.c25
-rw-r--r--devel/got/files/openbsd-compat/getdtablecount.c58
-rw-r--r--devel/got/files/openbsd-compat/imsg-buffer.c309
-rw-r--r--devel/got/files/openbsd-compat/imsg.c302
-rw-r--r--devel/got/files/openbsd-compat/imsg.h113
-rw-r--r--devel/got/files/openbsd-compat/recallocarray.c80
-rw-r--r--devel/got/files/openbsd-compat/sha1.h14
-rw-r--r--devel/got/files/openbsd-compat/stdlib.h9
-rw-r--r--devel/got/files/openbsd-compat/sys/cdefs.h8
-rw-r--r--devel/got/files/openbsd-compat/sys/queue.h119
-rw-r--r--devel/got/files/openbsd-compat/unistd.h14
-rw-r--r--devel/got/files/openbsd-compat/util.h19
-rw-r--r--devel/got/files/patch-Makefile8
-rw-r--r--devel/got/files/patch-Makefile.inc16
-rw-r--r--devel/got/files/patch-got_Makefile13
-rw-r--r--devel/got/files/patch-got_got.c53
-rw-r--r--devel/got/files/patch-lib_object__create.c44
-rw-r--r--devel/got/files/patch-lib_utf8.c11
-rw-r--r--devel/got/files/patch-lib_worktree.c50
-rw-r--r--devel/got/files/patch-libexec_Makefile.inc12
-rw-r--r--devel/got/files/patch-libexec_got-index-pack_got-index-pack.c11
-rw-r--r--devel/got/files/patch-libexec_got-read-gotconfig_got-read-gotconfig.c11
-rw-r--r--devel/got/files/patch-libexec_got-read-gotconfig_parse.y59
-rw-r--r--devel/got/files/patch-regress_Makefile8
-rw-r--r--devel/got/files/patch-regress_cmdline_Makefile10
-rw-r--r--devel/got/files/patch-regress_cmdline_commit.sh13
-rw-r--r--devel/got/files/patch-regress_cmdline_common.sh52
-rw-r--r--devel/got/files/patch-regress_cmdline_import.sh38
-rw-r--r--devel/got/files/patch-regress_cmdline_rm.sh20
-rw-r--r--devel/got/files/patch-regress_delta_Makefile12
-rw-r--r--devel/got/files/patch-regress_fetch_Makefile12
-rw-r--r--devel/got/files/patch-regress_idset_Makefile12
-rw-r--r--devel/got/files/patch-regress_path_Makefile12
-rw-r--r--devel/got/files/patch-tog_Makefile11
-rw-r--r--devel/got/files/patch-tog_tog.c11
-rw-r--r--devel/got/pkg-descr9
-rw-r--r--devel/got/pkg-plist17
41 files changed, 1642 insertions, 0 deletions
diff --git a/devel/got/Makefile b/devel/got/Makefile
new file mode 100644
index 000000000000..5b027407558c
--- /dev/null
+++ b/devel/got/Makefile
@@ -0,0 +1,26 @@
+# $FreeBSD$
+
+PORTNAME= got
+PORTVERSION= 0.39
+CATEGORIES= devel
+MASTER_SITES= https://gameoftrees.org/releases/
+
+MAINTAINER= naddy@FreeBSD.org
+COMMENT= Game of Trees version control system
+
+LICENSE= ISCL
+LICENSE_FILE= ${WRKSRC}/LICENCE
+
+USES= uidfix
+
+post-extract:
+ ${CP} -R ${FILESDIR}/openbsd-compat ${WRKSRC}
+
+# The regression test suite requires:
+# installed got
+# installed git
+# ssh to 127.0.0.1
+run-test:
+ @(cd ${WRKSRC}/regress && ${SETENV} ${MAKE_ENV} ${MAKE_CMD} regress)
+
+.include <bsd.port.mk>
diff --git a/devel/got/distinfo b/devel/got/distinfo
new file mode 100644
index 000000000000..4ea70eb44925
--- /dev/null
+++ b/devel/got/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1600100495
+SHA256 (got-0.39.tar.gz) = 0169e18c71e9005935e8c6b77ea95f18c49762b98767b7d312a3d24121e39df4
+SIZE (got-0.39.tar.gz) = 440979
diff --git a/devel/got/files/openbsd-compat/Makefile b/devel/got/files/openbsd-compat/Makefile
new file mode 100644
index 000000000000..c590b173a81a
--- /dev/null
+++ b/devel/got/files/openbsd-compat/Makefile
@@ -0,0 +1,12 @@
+LIB= openbsd-compat
+INTERNALLIB=
+
+SRCS= freezero.c \
+ getdtablecount.c \
+ imsg.c \
+ imsg-buffer.c \
+ recallocarray.c
+
+CFLAGS+= -I${.CURDIR}
+
+.include <bsd.lib.mk>
diff --git a/devel/got/files/openbsd-compat/endian.h b/devel/got/files/openbsd-compat/endian.h
new file mode 100644
index 000000000000..4da84f324eb7
--- /dev/null
+++ b/devel/got/files/openbsd-compat/endian.h
@@ -0,0 +1,6 @@
+#ifndef _OPENBSD_COMPAT_ENDIAN_H_
+#define _OPENBSD_COMPAT_ENDIAN_H_
+
+#include <sys/endian.h>
+
+#endif
diff --git a/devel/got/files/openbsd-compat/freezero.c b/devel/got/files/openbsd-compat/freezero.c
new file mode 100644
index 000000000000..2f6c0c35de59
--- /dev/null
+++ b/devel/got/files/openbsd-compat/freezero.c
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2008, 2010, 2011, 2016 Otto Moerbeek <otto@drijf.net>
+ *
+ * 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 <stdlib.h>
+#include <string.h>
+
+void
+freezero(void *ptr, size_t sz)
+{
+ explicit_bzero(ptr, sz);
+ free(ptr);
+}
diff --git a/devel/got/files/openbsd-compat/getdtablecount.c b/devel/got/files/openbsd-compat/getdtablecount.c
new file mode 100644
index 000000000000..9d2ba2575074
--- /dev/null
+++ b/devel/got/files/openbsd-compat/getdtablecount.c
@@ -0,0 +1,58 @@
+/*-
+ * Copyright (c) 2015 Craig Rodrigues
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#include <stddef.h>
+
+int getdtablecount(void);
+
+/*
+ * Return the count of open file descriptors for this process.
+ *
+ */
+int
+getdtablecount(void)
+{
+ int mib[4];
+ int error;
+ int nfds;
+ size_t len;
+
+ len = sizeof(nfds);
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_PROC;
+ mib[2] = KERN_PROC_NFDS;
+ mib[3] = 0;
+
+ error = sysctl(mib, 4, &nfds, &len, NULL, 0);
+ if (error)
+ return (-1);
+ return (nfds);
+}
diff --git a/devel/got/files/openbsd-compat/imsg-buffer.c b/devel/got/files/openbsd-compat/imsg-buffer.c
new file mode 100644
index 000000000000..7c60d9e9e727
--- /dev/null
+++ b/devel/got/files/openbsd-compat/imsg-buffer.c
@@ -0,0 +1,309 @@
+/* $OpenBSD: imsg-buffer.c,v 1.12 2019/01/20 02:50:03 bcook Exp $ */
+
+/*
+ * Copyright (c) 2003, 2004 Henning Brauer <henning@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/types.h>
+#include <sys/queue.h>
+#include <sys/socket.h>
+#include <sys/uio.h>
+
+#include <limits.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "imsg.h"
+
+static int ibuf_realloc(struct ibuf *, size_t);
+static void ibuf_enqueue(struct msgbuf *, struct ibuf *);
+static void ibuf_dequeue(struct msgbuf *, struct ibuf *);
+
+struct ibuf *
+ibuf_open(size_t len)
+{
+ struct ibuf *buf;
+
+ if ((buf = calloc(1, sizeof(struct ibuf))) == NULL)
+ return (NULL);
+ if ((buf->buf = malloc(len)) == NULL) {
+ free(buf);
+ return (NULL);
+ }
+ buf->size = buf->max = len;
+ buf->fd = -1;
+
+ return (buf);
+}
+
+struct ibuf *
+ibuf_dynamic(size_t len, size_t max)
+{
+ struct ibuf *buf;
+
+ if (max < len)
+ return (NULL);
+
+ if ((buf = ibuf_open(len)) == NULL)
+ return (NULL);
+
+ if (max > 0)
+ buf->max = max;
+
+ return (buf);
+}
+
+static int
+ibuf_realloc(struct ibuf *buf, size_t len)
+{
+ unsigned char *b;
+
+ /* on static buffers max is eq size and so the following fails */
+ if (buf->wpos + len > buf->max) {
+ errno = ERANGE;
+ return (-1);
+ }
+
+ b = recallocarray(buf->buf, buf->size, buf->wpos + len, 1);
+ if (b == NULL)
+ return (-1);
+ buf->buf = b;
+ buf->size = buf->wpos + len;
+
+ return (0);
+}
+
+int
+ibuf_add(struct ibuf *buf, const void *data, size_t len)
+{
+ if (buf->wpos + len > buf->size)
+ if (ibuf_realloc(buf, len) == -1)
+ return (-1);
+
+ memcpy(buf->buf + buf->wpos, data, len);
+ buf->wpos += len;
+ return (0);
+}
+
+void *
+ibuf_reserve(struct ibuf *buf, size_t len)
+{
+ void *b;
+
+ if (buf->wpos + len > buf->size)
+ if (ibuf_realloc(buf, len) == -1)
+ return (NULL);
+
+ b = buf->buf + buf->wpos;
+ buf->wpos += len;
+ return (b);
+}
+
+void *
+ibuf_seek(struct ibuf *buf, size_t pos, size_t len)
+{
+ /* only allowed to seek in already written parts */
+ if (pos + len > buf->wpos)
+ return (NULL);
+
+ return (buf->buf + pos);
+}
+
+size_t
+ibuf_size(struct ibuf *buf)
+{
+ return (buf->wpos);
+}
+
+size_t
+ibuf_left(struct ibuf *buf)
+{
+ return (buf->max - buf->wpos);
+}
+
+void
+ibuf_close(struct msgbuf *msgbuf, struct ibuf *buf)
+{
+ ibuf_enqueue(msgbuf, buf);
+}
+
+int
+ibuf_write(struct msgbuf *msgbuf)
+{
+ struct iovec iov[IOV_MAX];
+ struct ibuf *buf;
+ unsigned int i = 0;
+ ssize_t n;
+
+ memset(&iov, 0, sizeof(iov));
+ TAILQ_FOREACH(buf, &msgbuf->bufs, entry) {
+ if (i >= IOV_MAX)
+ break;
+ iov[i].iov_base = buf->buf + buf->rpos;
+ iov[i].iov_len = buf->wpos - buf->rpos;
+ i++;
+ }
+
+again:
+ if ((n = writev(msgbuf->fd, iov, i)) == -1) {
+ if (errno == EINTR)
+ goto again;
+ if (errno == ENOBUFS)
+ errno = EAGAIN;
+ return (-1);
+ }
+
+ if (n == 0) { /* connection closed */
+ errno = 0;
+ return (0);
+ }
+
+ msgbuf_drain(msgbuf, n);
+
+ return (1);
+}
+
+void
+ibuf_free(struct ibuf *buf)
+{
+ if (buf == NULL)
+ return;
+ freezero(buf->buf, buf->size);
+ free(buf);
+}
+
+void
+msgbuf_init(struct msgbuf *msgbuf)
+{
+ msgbuf->queued = 0;
+ msgbuf->fd = -1;
+ TAILQ_INIT(&msgbuf->bufs);
+}
+
+void
+msgbuf_drain(struct msgbuf *msgbuf, size_t n)
+{
+ struct ibuf *buf, *next;
+
+ for (buf = TAILQ_FIRST(&msgbuf->bufs); buf != NULL && n > 0;
+ buf = next) {
+ next = TAILQ_NEXT(buf, entry);
+ if (buf->rpos + n >= buf->wpos) {
+ n -= buf->wpos - buf->rpos;
+ ibuf_dequeue(msgbuf, buf);
+ } else {
+ buf->rpos += n;
+ n = 0;
+ }
+ }
+}
+
+void
+msgbuf_clear(struct msgbuf *msgbuf)
+{
+ struct ibuf *buf;
+
+ while ((buf = TAILQ_FIRST(&msgbuf->bufs)) != NULL)
+ ibuf_dequeue(msgbuf, buf);
+}
+
+int
+msgbuf_write(struct msgbuf *msgbuf)
+{
+ struct iovec iov[IOV_MAX];
+ struct ibuf *buf;
+ unsigned int i = 0;
+ ssize_t n;
+ struct msghdr msg;
+ struct cmsghdr *cmsg;
+ union {
+ struct cmsghdr hdr;
+ char buf[CMSG_SPACE(sizeof(int))];
+ } cmsgbuf;
+
+ memset(&iov, 0, sizeof(iov));
+ memset(&msg, 0, sizeof(msg));
+ memset(&cmsgbuf, 0, sizeof(cmsgbuf));
+ TAILQ_FOREACH(buf, &msgbuf->bufs, entry) {
+ if (i >= IOV_MAX)
+ break;
+ iov[i].iov_base = buf->buf + buf->rpos;
+ iov[i].iov_len = buf->wpos - buf->rpos;
+ i++;
+ if (buf->fd != -1)
+ break;
+ }
+
+ msg.msg_iov = iov;
+ msg.msg_iovlen = i;
+
+ if (buf != NULL && buf->fd != -1) {
+ msg.msg_control = (caddr_t)&cmsgbuf.buf;
+ msg.msg_controllen = sizeof(cmsgbuf.buf);
+ cmsg = CMSG_FIRSTHDR(&msg);
+ cmsg->cmsg_len = CMSG_LEN(sizeof(int));
+ cmsg->cmsg_level = SOL_SOCKET;
+ cmsg->cmsg_type = SCM_RIGHTS;
+ *(int *)CMSG_DATA(cmsg) = buf->fd;
+ }
+
+again:
+ if ((n = sendmsg(msgbuf->fd, &msg, 0)) == -1) {
+ if (errno == EINTR)
+ goto again;
+ if (errno == ENOBUFS)
+ errno = EAGAIN;
+ return (-1);
+ }
+
+ if (n == 0) { /* connection closed */
+ errno = 0;
+ return (0);
+ }
+
+ /*
+ * assumption: fd got sent if sendmsg sent anything
+ * this works because fds are passed one at a time
+ */
+ if (buf != NULL && buf->fd != -1) {
+ close(buf->fd);
+ buf->fd = -1;
+ }
+
+ msgbuf_drain(msgbuf, n);
+
+ return (1);
+}
+
+static void
+ibuf_enqueue(struct msgbuf *msgbuf, struct ibuf *buf)
+{
+ TAILQ_INSERT_TAIL(&msgbuf->bufs, buf, entry);
+ msgbuf->queued++;
+}
+
+static void
+ibuf_dequeue(struct msgbuf *msgbuf, struct ibuf *buf)
+{
+ TAILQ_REMOVE(&msgbuf->bufs, buf, entry);
+
+ if (buf->fd != -1)
+ close(buf->fd);
+
+ msgbuf->queued--;
+ ibuf_free(buf);
+}
diff --git a/devel/got/files/openbsd-compat/imsg.c b/devel/got/files/openbsd-compat/imsg.c
new file mode 100644
index 000000000000..c0ff22978e01
--- /dev/null
+++ b/devel/got/files/openbsd-compat/imsg.c
@@ -0,0 +1,302 @@
+/* $OpenBSD: imsg.c,v 1.16 2017/12/14 09:27:44 kettenis Exp $ */
+
+/*
+ * Copyright (c) 2003, 2004 Henning Brauer <henning@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/types.h>
+#include <sys/queue.h>
+#include <sys/socket.h>
+#include <sys/uio.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "imsg.h"
+
+int imsg_fd_overhead = 0;
+
+static int imsg_get_fd(struct imsgbuf *);
+
+void
+imsg_init(struct imsgbuf *ibuf, int fd)
+{
+ msgbuf_init(&ibuf->w);
+ memset(&ibuf->r, 0, sizeof(ibuf->r));
+ ibuf->fd = fd;
+ ibuf->w.fd = fd;
+ ibuf->pid = getpid();
+ TAILQ_INIT(&ibuf->fds);
+}
+
+ssize_t
+imsg_read(struct imsgbuf *ibuf)
+{
+ struct msghdr msg;
+ struct cmsghdr *cmsg;
+ union {
+ struct cmsghdr hdr;
+ char buf[CMSG_SPACE(sizeof(int) * 1)];
+ } cmsgbuf;
+ struct iovec iov;
+ ssize_t n = -1;
+ int fd;
+ struct imsg_fd *ifd;
+
+ memset(&msg, 0, sizeof(msg));
+ memset(&cmsgbuf, 0, sizeof(cmsgbuf));
+
+ iov.iov_base = ibuf->r.buf + ibuf->r.wpos;
+ iov.iov_len = sizeof(ibuf->r.buf) - ibuf->r.wpos;
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+ msg.msg_control = &cmsgbuf.buf;
+ msg.msg_controllen = sizeof(cmsgbuf.buf);
+
+ if ((ifd = calloc(1, sizeof(struct imsg_fd))) == NULL)
+ return (-1);
+
+again:
+ if (getdtablecount() + imsg_fd_overhead +
+ (int)((CMSG_SPACE(sizeof(int))-CMSG_SPACE(0))/sizeof(int))
+ >= getdtablesize()) {
+ errno = EAGAIN;
+ free(ifd);
+ return (-1);
+ }
+
+ if ((n = recvmsg(ibuf->fd, &msg, 0)) == -1) {
+ if (errno == EINTR)
+ goto again;
+ goto fail;
+ }
+
+ ibuf->r.wpos += n;
+
+ for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL;
+ cmsg = CMSG_NXTHDR(&msg, cmsg)) {
+ if (cmsg->cmsg_level == SOL_SOCKET &&
+ cmsg->cmsg_type == SCM_RIGHTS) {
+ int i;
+ int j;
+
+ /*
+ * We only accept one file descriptor. Due to C
+ * padding rules, our control buffer might contain
+ * more than one fd, and we must close them.
+ */
+ j = ((char *)cmsg + cmsg->cmsg_len -
+ (char *)CMSG_DATA(cmsg)) / sizeof(int);
+ for (i = 0; i < j; i++) {
+ fd = ((int *)CMSG_DATA(cmsg))[i];
+ if (ifd != NULL) {
+ ifd->fd = fd;
+ TAILQ_INSERT_TAIL(&ibuf->fds, ifd,
+ entry);
+ ifd = NULL;
+ } else
+ close(fd);
+ }
+ }
+ /* we do not handle other ctl data level */
+ }
+
+fail:
+ free(ifd);
+ return (n);
+}
+
+ssize_t
+imsg_get(struct imsgbuf *ibuf, struct imsg *imsg)
+{
+ size_t av, left, datalen;
+
+ av = ibuf->r.wpos;
+
+ if (IMSG_HEADER_SIZE > av)
+ return (0);
+
+ memcpy(&imsg->hdr, ibuf->r.buf, sizeof(imsg->hdr));
+ if (imsg->hdr.len < IMSG_HEADER_SIZE ||
+ imsg->hdr.len > MAX_IMSGSIZE) {
+ errno = ERANGE;
+ return (-1);
+ }
+ if (imsg->hdr.len > av)
+ return (0);
+ datalen = imsg->hdr.len - IMSG_HEADER_SIZE;
+ ibuf->r.rptr = ibuf->r.buf + IMSG_HEADER_SIZE;
+ if (datalen == 0)
+ imsg->data = NULL;
+ else if ((imsg->data = malloc(datalen)) == NULL)
+ return (-1);
+
+ if (imsg->hdr.flags & IMSGF_HASFD)
+ imsg->fd = imsg_get_fd(ibuf);
+ else
+ imsg->fd = -1;
+
+ memcpy(imsg->data, ibuf->r.rptr, datalen);
+
+ if (imsg->hdr.len < av) {
+ left = av - imsg->hdr.len;
+ memmove(&ibuf->r.buf, ibuf->r.buf + imsg->hdr.len, left);
+ ibuf->r.wpos = left;
+ } else
+ ibuf->r.wpos = 0;
+
+ return (datalen + IMSG_HEADER_SIZE);
+}
+
+int
+imsg_compose(struct imsgbuf *ibuf, uint32_t type, uint32_t peerid, pid_t pid,
+ int fd, const void *data, uint16_t datalen)
+{
+ struct ibuf *wbuf;
+
+ if ((wbuf = imsg_create(ibuf, type, peerid, pid, datalen)) == NULL)
+ return (-1);
+
+ if (imsg_add(wbuf, data, datalen) == -1)
+ return (-1);
+
+ wbuf->fd = fd;
+
+ imsg_close(ibuf, wbuf);
+
+ return (1);
+}
+
+int
+imsg_composev(struct imsgbuf *ibuf, uint32_t type, uint32_t peerid, pid_t pid,
+ int fd, const struct iovec *iov, int iovcnt)
+{
+ struct ibuf *wbuf;
+ int i, datalen = 0;
+
+ for (i = 0; i < iovcnt; i++)
+ datalen += iov[i].iov_len;
+
+ if ((wbuf = imsg_create(ibuf, type, peerid, pid, datalen)) == NULL)
+ return (-1);
+
+ for (i = 0; i < iovcnt; i++)
+ if (imsg_add(wbuf, iov[i].iov_base, iov[i].iov_len) == -1)
+ return (-1);
+
+ wbuf->fd = fd;
+
+ imsg_close(ibuf, wbuf);
+
+ return (1);
+}
+
+/* ARGSUSED */
+struct ibuf *
+imsg_create(struct imsgbuf *ibuf, uint32_t type, uint32_t peerid, pid_t pid,
+ uint16_t datalen)
+{
+ struct ibuf *wbuf;
+ struct imsg_hdr hdr;
+
+ datalen += IMSG_HEADER_SIZE;
+ if (datalen > MAX_IMSGSIZE) {
+ errno = ERANGE;
+ return (NULL);
+ }
+
+ hdr.type = type;
+ hdr.flags = 0;
+ hdr.peerid = peerid;
+ if ((hdr.pid = pid) == 0)
+ hdr.pid = ibuf->pid;
+ if ((wbuf = ibuf_dynamic(datalen, MAX_IMSGSIZE)) == NULL) {
+ return (NULL);
+ }
+ if (imsg_add(wbuf, &hdr, sizeof(hdr)) == -1)
+ return (NULL);
+
+ return (wbuf);
+}
+
+int
+imsg_add(struct ibuf *msg, const void *data, uint16_t datalen)
+{
+ if (datalen)
+ if (ibuf_add(msg, data, datalen) == -1) {
+ ibuf_free(msg);
+ return (-1);
+ }
+ return (datalen);
+}
+
+void
+imsg_close(struct imsgbuf *ibuf, struct ibuf *msg)
+{
+ struct imsg_hdr *hdr;
+
+ hdr = (struct imsg_hdr *)msg->buf;
+
+ hdr->flags &= ~IMSGF_HASFD;
+ if (msg->fd != -1)
+ hdr->flags |= IMSGF_HASFD;
+
+ hdr->len = (uint16_t)msg->wpos;
+
+ ibuf_close(&ibuf->w, msg);
+}
+
+void
+imsg_free(struct imsg *imsg)
+{
+ freezero(imsg->data, imsg->hdr.len - IMSG_HEADER_SIZE);
+}
+
+static int
+imsg_get_fd(struct imsgbuf *ibuf)
+{
+ int fd;
+ struct imsg_fd *ifd;
+
+ if ((ifd = TAILQ_FIRST(&ibuf->fds)) == NULL)
+ return (-1);
+
+ fd = ifd->fd;
+ TAILQ_REMOVE(&ibuf->fds, ifd, entry);
+ free(ifd);
+
+ return (fd);
+}
+
+int
+imsg_flush(struct imsgbuf *ibuf)
+{
+ while (ibuf->w.queued)
+ if (msgbuf_write(&ibuf->w) <= 0)
+ return (-1);
+ return (0);
+}
+
+void
+imsg_clear(struct imsgbuf *ibuf)
+{
+ int fd;
+
+ msgbuf_clear(&ibuf->w);
+ while ((fd = imsg_get_fd(ibuf)) != -1)
+ close(fd);
+}
diff --git a/devel/got/files/openbsd-compat/imsg.h b/devel/got/files/openbsd-compat/imsg.h
new file mode 100644
index 000000000000..5b092cfcfd53
--- /dev/null
+++ b/devel/got/files/openbsd-compat/imsg.h
@@ -0,0 +1,113 @@
+/* $OpenBSD: imsg.h,v 1.5 2019/01/20 02:50:03 bcook Exp $ */
+
+/*
+ * Copyright (c) 2006, 2007 Pierre-Yves Ritschard <pyr@openbsd.org>
+ * Copyright (c) 2006, 2007, 2008 Reyk Floeter <reyk@openbsd.org>
+ * Copyright (c) 2003, 2004 Henning Brauer <henning@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.
+ */
+
+#ifndef _IMSG_H_
+#define _IMSG_H_
+
+#include <stdint.h>
+
+#define IBUF_READ_SIZE 65535
+#define IMSG_HEADER_SIZE sizeof(struct imsg_hdr)
+#define MAX_IMSGSIZE 16384
+
+struct ibuf {
+ TAILQ_ENTRY(ibuf) entry;
+ unsigned char *buf;
+ size_t size;
+ size_t max;
+ size_t wpos;
+ size_t rpos;
+ int fd;
+};
+
+struct msgbuf {
+ TAILQ_HEAD(, ibuf) bufs;
+ uint32_t queued;
+ int fd;
+};
+
+struct ibuf_read {
+ unsigned char buf[IBUF_READ_SIZE];
+ unsigned char *rptr;
+ size_t wpos;
+};
+
+struct imsg_fd {
+ TAILQ_ENTRY(imsg_fd) entry;
+ int fd;
+};
+
+struct imsgbuf {
+ TAILQ_HEAD(, imsg_fd) fds;
+ struct ibuf_read r;
+ struct msgbuf w;
+ int fd;
+ pid_t pid;
+};
+
+#define IMSGF_HASFD 1
+
+struct imsg_hdr {
+ uint32_t type;
+ uint16_t len;
+ uint16_t flags;
+ uint32_t peerid;
+ uint32_t pid;
+};
+
+struct imsg {
+ struct imsg_hdr hdr;
+ int fd;
+ void *data;
+};
+
+
+/* buffer.c */
+struct ibuf *ibuf_open(size_t);
+struct ibuf *ibuf_dynamic(size_t, size_t);
+int ibuf_add(struct ibuf *, const void *, size_t);
+void *ibuf_reserve(struct ibuf *, size_t);
+void *ibuf_seek(struct ibuf *, size_t, size_t);
+size_t ibuf_size(struct ibuf *);
+size_t ibuf_left(struct ibuf *);
+void ibuf_close(struct msgbuf *, struct ibuf *);
+int ibuf_write(struct msgbuf *);
+void ibuf_free(struct ibuf *);
+void msgbuf_init(struct msgbuf *);
+void msgbuf_clear(struct msgbuf *);
+int msgbuf_write(struct msgbuf *);
+void msgbuf_drain(struct msgbuf *, size_t);
+
+/* imsg.c */
+void imsg_init(struct imsgbuf *, int);
+ssize_t imsg_read(struct imsgbuf *);
+ssize_t imsg_get(struct imsgbuf *, struct imsg *);
+int imsg_compose(struct imsgbuf *, uint32_t, uint32_t, pid_t, int,
+ const void *, uint16_t);
+int imsg_composev(struct imsgbuf *, uint32_t, uint32_t, pid_t, int,
+ const struct iovec *, int);
+struct ibuf *imsg_create(struct imsgbuf *, uint32_t, uint32_t, pid_t, uint16_t);
+int imsg_add(struct ibuf *, const void *, uint16_t);
+void imsg_close(struct imsgbuf *, struct ibuf *);
+void imsg_free(struct imsg *);
+int imsg_flush(struct imsgbuf *);
+void imsg_clear(struct imsgbuf *);
+
+#endif
diff --git a/devel/got/files/openbsd-compat/recallocarray.c b/devel/got/files/openbsd-compat/recallocarray.c
new file mode 100644
index 000000000000..d93abd2da5fd
--- /dev/null
+++ b/devel/got/files/openbsd-compat/recallocarray.c
@@ -0,0 +1,80 @@
+/* $OpenBSD: recallocarray.c,v 1.1 2017/03/06 18:44:21 otto Exp $ */
+/*
+ * Copyright (c) 2008, 2017 Otto Moerbeek <otto@drijf.net>
+ *
+ * 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 <errno.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <unistd.h>
+
+/*
+ * This is sqrt(SIZE_MAX+1), as s1*s2 <= SIZE_MAX
+ * if both s1 < MUL_NO_OVERFLOW and s2 < MUL_NO_OVERFLOW
+ */
+#define MUL_NO_OVERFLOW ((size_t)1 << (sizeof(size_t) * 4))
+
+void *
+recallocarray(void *ptr, size_t oldnmemb, size_t newnmemb, size_t size)
+{
+ size_t oldsize, newsize;
+ void *newptr;
+
+ if (ptr == NULL)
+ return calloc(newnmemb, size);
+
+ if ((newnmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) &&
+ newnmemb > 0 && SIZE_MAX / newnmemb < size) {
+ errno = ENOMEM;
+ return NULL;
+ }
+ newsize = newnmemb * size;
+
+ if ((oldnmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) &&
+ oldnmemb > 0 && SIZE_MAX / oldnmemb < size) {
+ errno = EINVAL;
+ return NULL;
+ }
+ oldsize = oldnmemb * size;
+
+ /*
+ * Don't bother too much if we're shrinking just a bit,
+ * we do not shrink for series of small steps, oh well.
+ */
+ if (newsize <= oldsize) {
+ size_t d = oldsize - newsize;
+
+ if (d < oldsize / 2 && d < getpagesize()) {
+ memset((char *)ptr + newsize, 0, d);
+ return ptr;
+ }
+ }
+
+ newptr = malloc(newsize);
+ if (newptr == NULL)
+ return NULL;
+
+ if (newsize > oldsize) {
+ memcpy(newptr, ptr, oldsize);
+ memset((char *)newptr + oldsize, 0, newsize - oldsize);
+ } else
+ memcpy(newptr, ptr, newsize);
+
+ explicit_bzero(ptr, oldsize);
+ free(ptr);
+
+ return newptr;
+}
diff --git a/devel/got/files/openbsd-compat/sha1.h b/devel/got/files/openbsd-compat/sha1.h
new file mode 100644
index 000000000000..bfa1dab97f64
--- /dev/null
+++ b/devel/got/files/openbsd-compat/sha1.h
@@ -0,0 +1,14 @@
+#ifndef _OPENBSD_COMPAT_SHA1_H_
+#define _OPENBSD_COMPAT_SHA1_H_
+
+#include <sha.h>
+
+#define SHA1_DIGEST_LENGTH SHA_DIGEST_LENGTH
+#define SHA1_DIGEST_STRING_LENGTH (SHA1_DIGEST_LENGTH * 2 + 1)
+
+#define SHA1_CTX SHA_CTX
+#define SHA1Init SHA1_Init
+#define SHA1Update SHA1_Update
+#define SHA1Final SHA1_Final
+
+#endif
diff --git a/devel/got/files/openbsd-compat/stdlib.h b/devel/got/files/openbsd-compat/stdlib.h
new file mode 100644
index 000000000000..760f4e2fa9a5
--- /dev/null
+++ b/devel/got/files/openbsd-compat/stdlib.h
@@ -0,0 +1,9 @@
+#ifndef _OPENBSD_COMPAT_STDLIB_H_
+#define _OPENBSD_COMPAT_STDLIB_H_
+
+#include_next <stdlib.h>
+
+void freezero(void *, size_t);
+void *recallocarray(void *, size_t, size_t, size_t);
+
+#endif
diff --git a/devel/got/files/openbsd-compat/sys/cdefs.h b/devel/got/files/openbsd-compat/sys/cdefs.h
new file mode 100644
index 000000000000..de5996041bc1
--- /dev/null
+++ b/devel/got/files/openbsd-compat/sys/cdefs.h
@@ -0,0 +1,8 @@
+#ifndef _OPENBSD_COMPAT_SYS_CDEFS_
+#define _OPENBSD_COMPAT_SYS_CDEFS_
+
+#include_next <sys/cdefs.h>
+
+#define __dead __dead2
+
+#endif
diff --git a/devel/got/files/openbsd-compat/sys/queue.h b/devel/got/files/openbsd-compat/sys/queue.h
new file mode 100644
index 000000000000..079b439f3a30
--- /dev/null
+++ b/devel/got/files/openbsd-compat/sys/queue.h
@@ -0,0 +1,119 @@
+/* $OpenBSD: queue.h,v 1.45 2018/07/12 14:22:54 sashan Exp $ */
+
+/*
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)queue.h 8.5 (Berkeley) 8/20/94
+ */
+
+#ifndef _OPENBSD_COMPAT_SYS_QUEUE_H_
+#define _OPENBSD_COMPAT_SYS_QUEUE_H_
+
+#include_next <sys/queue.h>
+
+/*
+ * Simple queue definitions.
+ */
+#define SIMPLEQ_HEAD(name, type) \
+struct name { \
+ struct type *sqh_first; /* first element */ \
+ struct type **sqh_last; /* addr of last next element */ \
+}
+
+#define SIMPLEQ_HEAD_INITIALIZER(head) \
+ { NULL, &(head).sqh_first }
+
+#define SIMPLEQ_ENTRY(type) \
+struct { \
+ struct type *sqe_next; /* next element */ \
+}
+
+/*
+ * Simple queue access methods.
+ */
+#define SIMPLEQ_FIRST(head) ((head)->sqh_first)
+#define SIMPLEQ_END(head) NULL
+#define SIMPLEQ_EMPTY(head) (SIMPLEQ_FIRST(head) == SIMPLEQ_END(head))
+#define SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next)
+
+#define SIMPLEQ_FOREACH(var, head, field) \
+ for((var) = SIMPLEQ_FIRST(head); \
+ (var) != SIMPLEQ_END(head); \
+ (var) = SIMPLEQ_NEXT(var, field))
+
+#define SIMPLEQ_FOREACH_SAFE(var, head, field, tvar) \
+ for ((var) = SIMPLEQ_FIRST(head); \
+ (var) && ((tvar) = SIMPLEQ_NEXT(var, field), 1); \
+ (var) = (tvar))
+
+/*
+ * Simple queue functions.
+ */
+#define SIMPLEQ_INIT(head) do { \
+ (head)->sqh_first = NULL; \
+ (head)->sqh_last = &(head)->sqh_first; \
+} while (0)
+
+#define SIMPLEQ_INSERT_HEAD(head, elm, field) do { \
+ if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \
+ (head)->sqh_last = &(elm)->field.sqe_next; \
+ (head)->sqh_first = (elm); \
+} while (0)
+
+#define SIMPLEQ_INSERT_TAIL(head, elm, field) do { \
+ (elm)->field.sqe_next = NULL; \
+ *(head)->sqh_last = (elm); \
+ (head)->sqh_last = &(elm)->field.sqe_next; \
+} while (0)
+
+#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \
+ if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\
+ (head)->sqh_last = &(elm)->field.sqe_next; \
+ (listelm)->field.sqe_next = (elm); \
+} while (0)
+
+#define SIMPLEQ_REMOVE_HEAD(head, field) do { \
+ if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \
+ (head)->sqh_last = &(head)->sqh_first; \
+} while (0)
+
+#define SIMPLEQ_REMOVE_AFTER(head, elm, field) do { \
+ if (((elm)->field.sqe_next = (elm)->field.sqe_next->field.sqe_next) \
+ == NULL) \
+ (head)->sqh_last = &(elm)->field.sqe_next; \
+} while (0)
+
+#define SIMPLEQ_CONCAT(head1, head2) do { \
+ if (!SIMPLEQ_EMPTY((head2))) { \
+ *(head1)->sqh_last = (head2)->sqh_first; \
+ (head1)->sqh_last = (head2)->sqh_last; \
+ SIMPLEQ_INIT((head2)); \
+ } \
+} while (0)
+
+#endif
diff --git a/devel/got/files/openbsd-compat/unistd.h b/devel/got/files/openbsd-compat/unistd.h
new file mode 100644
index 000000000000..de0af88cba19
--- /dev/null
+++ b/devel/got/files/openbsd-compat/unistd.h
@@ -0,0 +1,14 @@
+#ifndef _OPENBSD_COMPAT_UNISTD_H_
+#define _OPENBSD_COMPAT_UNISTD_H_
+
+#include_next <unistd.h>
+
+int getdtablecount(void);
+
+/* void -> int */
+#define closefrom(fd) (closefrom(fd), 0)
+
+#define pledge(promises, execpromises) 0
+#define unveil(path, permissions) 0
+
+#endif
diff --git a/devel/got/files/openbsd-compat/util.h b/devel/got/files/openbsd-compat/util.h
new file mode 100644
index 000000000000..d985406bdee6
--- /dev/null
+++ b/devel/got/files/openbsd-compat/util.h
@@ -0,0 +1,19 @@
+#ifndef _OPENBSD_COMPAT_UTIL_H_
+#define _OPENBSD_COMPAT_UTIL_H_
+
+#include <libutil.h>
+
+/*
+ * fmt_scaled(3) specific flags.
+ */
+#define FMT_SCALED_STRSIZE 7 /* minus sign, 4 digits, suffix, null byte */
+
+#define fmt_scaled(number, result) ({ \
+ int64_t num = number; \
+ int r = humanize_number(result, \
+ FMT_SCALED_STRSIZE - (num < 0 ? 0 : 1), \
+ num, "", HN_AUTOSCALE, HN_NOSPACE | HN_B); \
+ r == -1 ? -1 : 0; \
+})
+
+#endif
diff --git a/devel/got/files/patch-Makefile b/devel/got/files/patch-Makefile
new file mode 100644
index 000000000000..303104208994
--- /dev/null
+++ b/devel/got/files/patch-Makefile
@@ -0,0 +1,8 @@
+--- Makefile.orig 2020-09-09 15:30:46 UTC
++++ Makefile
+@@ -1,4 +1,4 @@
+-SUBDIR = libexec got tog
++SUBDIR = openbsd-compat libexec got tog
+
+ .PHONY: release dist
+
diff --git a/devel/got/files/patch-Makefile.inc b/devel/got/files/patch-Makefile.inc
new file mode 100644
index 000000000000..8b7941707061
--- /dev/null
+++ b/devel/got/files/patch-Makefile.inc
@@ -0,0 +1,16 @@
+--- Makefile.inc.orig 2020-07-25 09:10:27 UTC
++++ Makefile.inc
+@@ -3,6 +3,13 @@ CPPFLAGS += -DGOT_LIBEXECDIR=${LIBEXECDIR} -DGOT_VERSI
+ #CFLAGS += -DGOT_NO_OBJ_CACHE
+ #CFLAGS += -DGOT_OBJ_CACHE_DEBUG
+
++OPENBSD_COMPAT := ${.PARSEDIR}/openbsd-compat
++CFLAGS += ${CPPFLAGS} -I${OPENBSD_COMPAT}
++CFLAGS += -Wno-pointer-sign
++
++LDFLAGS += -L${OPENBSD_COMPAT}
++LDADD += -lopenbsd-compat -lmd
++
+ .if "${GOT_RELEASE}" == "Yes"
+ PREFIX ?= /usr/local
+ BINDIR ?= ${PREFIX}/bin
diff --git a/devel/got/files/patch-got_Makefile b/devel/got/files/patch-got_Makefile
new file mode 100644
index 000000000000..7e816cb3bed7
--- /dev/null
+++ b/devel/got/files/patch-got_Makefile
@@ -0,0 +1,13 @@
+--- got/Makefile.orig 2020-09-14 14:04:47 UTC
++++ got/Makefile
+@@ -25,10 +25,6 @@ DPADD = ${LIBZ} ${LIBUTIL}
+ NOMAN = Yes
+ .endif
+
+-realinstall:
+- ${INSTALL} ${INSTALL_COPY} -o ${BINOWN} -g ${BINGRP} \
+- -m ${BINMODE} ${PROG} ${BINDIR}/${PROG}
+-
+ dist:
+ mkdir ../got-${GOT_VERSION}/got
+ cp ${SRCS} ${MAN} ../got-${GOT_VERSION}/got
diff --git a/devel/got/files/patch-got_got.c b/devel/got/files/patch-got_got.c
new file mode 100644
index 000000000000..a35ffc028d8e
--- /dev/null
+++ b/devel/got/files/patch-got_got.c
@@ -0,0 +1,53 @@
+--- got/got.c.orig 2020-09-14 13:58:27 UTC
++++ got/got.c
+@@ -213,7 +213,8 @@ main(int argc, char *argv[])
+
+ argc -= optind;
+ argv += optind;
+- optind = 0;
++ optind = 1;
++ optreset = 1;
+
+ if (Vflag) {
+ got_version_print_str();
+@@ -3884,7 +3885,7 @@ print_diff(void *arg, unsigned char status, unsigned c
+ if (dirfd != -1) {
+ fd = openat(dirfd, de_name, O_RDONLY | O_NOFOLLOW);
+ if (fd == -1) {
+- if (errno != ELOOP) {
++ if (errno != ELOOP && errno != EMLINK) {
+ err = got_error_from_errno2("openat",
+ abspath);
+ goto done;
+@@ -3897,7 +3898,7 @@ print_diff(void *arg, unsigned char status, unsigned c
+ } else {
+ fd = open(abspath, O_RDONLY | O_NOFOLLOW);
+ if (fd == -1) {
+- if (errno != ELOOP) {
++ if (errno != ELOOP && errno != EMLINK) {
+ err = got_error_from_errno2("open",
+ abspath);
+ goto done;
+@@ -9283,11 +9284,11 @@ cat_commit(struct got_object_id *id, struct got_reposi
+ }
+ fprintf(outfile, "%s%s %lld +0000\n", GOT_COMMIT_LABEL_AUTHOR,
+ got_object_commit_get_author(commit),
+- got_object_commit_get_author_time(commit));
++ (long long)got_object_commit_get_author_time(commit));
+
+ fprintf(outfile, "%s%s %lld +0000\n", GOT_COMMIT_LABEL_COMMITTER,
+ got_object_commit_get_author(commit),
+- got_object_commit_get_committer_time(commit));
++ (long long)got_object_commit_get_committer_time(commit));
+
+ logmsg = got_object_commit_get_logmsg_raw(commit);
+ fprintf(outfile, "messagelen %zd\n", strlen(logmsg));
+@@ -9342,7 +9343,7 @@ cat_tag(struct got_object_id *id, struct got_repositor
+
+ fprintf(outfile, "%s%s %lld +0000\n", GOT_TAG_LABEL_TAGGER,
+ got_object_tag_get_tagger(tag),
+- got_object_tag_get_tagger_time(tag));
++ (long long)got_object_tag_get_tagger_time(tag));
+
+ tagmsg = got_object_tag_get_message(tag);
+ fprintf(outfile, "messagelen %zd\n", strlen(tagmsg));
diff --git a/devel/got/files/patch-lib_object__create.c b/devel/got/files/patch-lib_object__create.c
new file mode 100644
index 000000000000..93dad5464e30
--- /dev/null
+++ b/devel/got/files/patch-lib_object__create.c
@@ -0,0 +1,44 @@
+--- lib/object_create.c.orig 2020-07-25 09:10:27 UTC
++++ lib/object_create.c
+@@ -129,7 +129,7 @@ got_object_blob_create(struct got_object_id **id, cons
+
+ fd = open(ondisk_path, O_RDONLY | O_NOFOLLOW);
+ if (fd == -1) {
+- if (errno != ELOOP)
++ if (errno != ELOOP && errno != EMLINK)
+ return got_error_from_errno2("open", ondisk_path);
+
+ if (lstat(ondisk_path, &sb) == -1) {
+@@ -142,7 +142,7 @@ got_object_blob_create(struct got_object_id **id, cons
+ }
+
+ if (asprintf(&header, "%s %lld", GOT_OBJ_LABEL_BLOB,
+- sb.st_size) == -1) {
++ (long long)sb.st_size) == -1) {
+ err = got_error_from_errno("asprintf");
+ goto done;
+ }
+@@ -417,12 +417,12 @@ got_object_commit_create(struct got_object_id **id,
+ }
+
+ if (asprintf(&author_str, "%s%s %lld +0000\n",
+- GOT_COMMIT_LABEL_AUTHOR, author, author_time) == -1)
++ GOT_COMMIT_LABEL_AUTHOR, author, (long long)author_time) == -1)
+ return got_error_from_errno("asprintf");
+
+ if (asprintf(&committer_str, "%s%s %lld +0000\n",
+ GOT_COMMIT_LABEL_COMMITTER, committer ? committer : author,
+- committer ? committer_time : author_time)
++ (long long)(committer ? committer_time : author_time))
+ == -1) {
+ err = got_error_from_errno("asprintf");
+ goto done;
+@@ -623,7 +623,7 @@ got_object_tag_create(struct got_object_id **id,
+ }
+
+ if (asprintf(&tagger_str, "%s%s %lld +0000\n",
+- GOT_TAG_LABEL_TAGGER, tagger, tagger_time) == -1)
++ GOT_TAG_LABEL_TAGGER, tagger, (long long)tagger_time) == -1)
+ return got_error_from_errno("asprintf");
+
+ msg0 = strdup(tagmsg);
diff --git a/devel/got/files/patch-lib_utf8.c b/devel/got/files/patch-lib_utf8.c
new file mode 100644
index 000000000000..c0995c10cf0e
--- /dev/null
+++ b/devel/got/files/patch-lib_utf8.c
@@ -0,0 +1,11 @@
+--- lib/utf8.c.orig 2020-09-10 16:01:39 UTC
++++ lib/utf8.c
+@@ -15,6 +15,8 @@
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
++#include <sys/types.h>
++
+ #include <err.h>
+ #include <stdlib.h>
+ #include <string.h>
diff --git a/devel/got/files/patch-lib_worktree.c b/devel/got/files/patch-lib_worktree.c
new file mode 100644
index 000000000000..a5e14bdc476b
--- /dev/null
+++ b/devel/got/files/patch-lib_worktree.c
@@ -0,0 +1,50 @@
+--- lib/worktree.c.orig 2020-09-11 17:05:16 UTC
++++ lib/worktree.c
+@@ -1225,7 +1225,7 @@ replace_existing_symlink(const char *ondisk_path, cons
+ */
+ fd = open(ondisk_path, O_RDWR | O_EXCL | O_NOFOLLOW);
+ if (fd == -1) {
+- if (errno != ELOOP)
++ if (errno != ELOOP && errno != EMLINK)
+ return got_error_from_errno2("open", ondisk_path);
+
+ /* We are updating an existing on-disk symlink. */
+@@ -1701,9 +1701,9 @@ get_file_status(unsigned char *status, struct stat *sb
+ }
+ } else {
+ fd = open(abspath, O_RDONLY | O_NOFOLLOW);
+- if (fd == -1 && errno != ENOENT && errno != ELOOP)
++ if (fd == -1 && errno != ENOENT && errno != ELOOP && errno != EMLINK)
+ return got_error_from_errno2("open", abspath);
+- else if (fd == -1 && errno == ELOOP) {
++ else if (fd == -1 && (errno == ELOOP || errno == EMLINK)) {
+ if (lstat(abspath, sb) == -1)
+ return got_error_from_errno2("lstat", abspath);
+ } else if (fd == -1 || fstat(fd, sb) == -1) {
+@@ -3484,7 +3484,7 @@ worktree_status(struct got_worktree *worktree, const c
+ fd = open(ondisk_path, O_RDONLY | O_NOFOLLOW | O_DIRECTORY);
+ if (fd == -1) {
+ if (errno != ENOTDIR && errno != ENOENT && errno != EACCES &&
+- errno != ELOOP)
++ errno != ELOOP && errno != EMLINK)
+ err = got_error_from_errno2("open", ondisk_path);
+ else
+ err = report_single_file_status(path, ondisk_path,
+@@ -4156,7 +4156,7 @@ create_patched_content(char **path_outfile, int revers
+ if (dirfd2 != -1) {
+ fd2 = openat(dirfd2, de_name2, O_RDONLY | O_NOFOLLOW);
+ if (fd2 == -1) {
+- if (errno != ELOOP) {
++ if (errno != ELOOP && errno != EMLINK) {
+ err = got_error_from_errno2("openat", path2);
+ goto done;
+ }
+@@ -4170,7 +4170,7 @@ create_patched_content(char **path_outfile, int revers
+ } else {
+ fd2 = open(path2, O_RDONLY | O_NOFOLLOW);
+ if (fd2 == -1) {
+- if (errno != ELOOP) {
++ if (errno != ELOOP && errno != EMLINK) {
+ err = got_error_from_errno2("open", path2);
+ goto done;
+ }
diff --git a/devel/got/files/patch-libexec_Makefile.inc b/devel/got/files/patch-libexec_Makefile.inc
new file mode 100644
index 000000000000..60e91e9a9924
--- /dev/null
+++ b/devel/got/files/patch-libexec_Makefile.inc
@@ -0,0 +1,12 @@
+--- libexec/Makefile.inc.orig 2020-09-10 19:02:02 UTC
++++ libexec/Makefile.inc
+@@ -1,7 +1,5 @@
+ .include "../Makefile.inc"
+
+-realinstall:
+- ${INSTALL} ${INSTALL_COPY} -o ${BINOWN} -g ${BINGRP} \
+- -m ${BINMODE} ${PROG} ${LIBEXECDIR}/${PROG}
++BINDIR = ${PREFIX}/libexec
+
+-NOMAN = Yes
++MAN =
diff --git a/devel/got/files/patch-libexec_got-index-pack_got-index-pack.c b/devel/got/files/patch-libexec_got-index-pack_got-index-pack.c
new file mode 100644
index 000000000000..124649c84b56
--- /dev/null
+++ b/devel/got/files/patch-libexec_got-index-pack_got-index-pack.c
@@ -0,0 +1,11 @@
+--- libexec/got-index-pack/got-index-pack.c.orig 2020-09-11 20:18:20 UTC
++++ libexec/got-index-pack/got-index-pack.c
+@@ -244,7 +244,7 @@ read_packed_object(struct got_pack *pack, struct got_i
+ free(data);
+ break;
+ }
+- if (asprintf(&header, "%s %lld", obj_label, obj->size) == -1) {
++ if (asprintf(&header, "%s %lld", obj_label, (long long)obj->size) == -1) {
+ err = got_error_from_errno("asprintf");
+ free(data);
+ break;
diff --git a/devel/got/files/patch-libexec_got-read-gotconfig_got-read-gotconfig.c b/devel/got/files/patch-libexec_got-read-gotconfig_got-read-gotconfig.c
new file mode 100644
index 000000000000..a6b391ded6f4
--- /dev/null
+++ b/devel/got/files/patch-libexec_got-read-gotconfig_got-read-gotconfig.c
@@ -0,0 +1,11 @@
+XXX remove after 0.39
+--- libexec/got-read-gotconfig/got-read-gotconfig.c.orig 2020-09-14 16:29:32 UTC
++++ libexec/got-read-gotconfig/got-read-gotconfig.c
+@@ -27,6 +27,7 @@
+ #include <stdlib.h>
+ #include <string.h>
+ #include <sha1.h>
++#include <unistd.h>
+ #include <zlib.h>
+
+ #include "got_error.h"
diff --git a/devel/got/files/patch-libexec_got-read-gotconfig_parse.y b/devel/got/files/patch-libexec_got-read-gotconfig_parse.y
new file mode 100644
index 000000000000..857a2869f2ee
--- /dev/null
+++ b/devel/got/files/patch-libexec_got-read-gotconfig_parse.y
@@ -0,0 +1,59 @@
+XXX remove first hunk after 0.39
+--- libexec/got-read-gotconfig/parse.y.orig 2020-09-14 16:35:22 UTC
++++ libexec/got-read-gotconfig/parse.y
+@@ -24,27 +24,17 @@
+ %{
+ #include <sys/types.h>
+ #include <sys/queue.h>
+-#include <sys/socket.h>
+-#include <sys/stat.h>
+
+-#include <netinet/in.h>
+-
+-#include <arpa/inet.h>
+-
+ #include <netdb.h>
+
+ #include <ctype.h>
+ #include <err.h>
+ #include <errno.h>
+-#include <event.h>
+-#include <ifaddrs.h>
+-#include <imsg.h>
+ #include <limits.h>
+ #include <stdarg.h>
+ #include <stdio.h>
++#include <stdlib.h>
+ #include <string.h>
+-#include <syslog.h>
+-#include <unistd.h>
+
+ #include "got_error.h"
+ #include "gotconfig.h"
+@@ -71,7 +61,7 @@ int igetc(void);
+ int lgetc(int);
+ void lungetc(int);
+ int findeol(void);
+-static int parseport(char *, long long *);
++static int parseport(char *, int64_t *);
+
+ TAILQ_HEAD(symhead, sym) symhead = TAILQ_HEAD_INITIALIZER(symhead);
+ struct sym {
+@@ -133,7 +123,7 @@ boolean : STRING {
+ ;
+ numberstring : NUMBER {
+ char *s;
+- if (asprintf(&s, "%lld", $1) == -1) {
++ if (asprintf(&s, "%lld", (long long)$1) == -1) {
+ yyerror("string: asprintf");
+ YYERROR;
+ }
+@@ -395,7 +385,7 @@ getservice(char *n)
+ }
+
+ static int
+-parseport(char *port, long long *pn)
++parseport(char *port, int64_t *pn)
+ {
+ if ((*pn = getservice(port)) == -1) {
+ *pn = 0LL;
diff --git a/devel/got/files/patch-regress_Makefile b/devel/got/files/patch-regress_Makefile
new file mode 100644
index 000000000000..df777163fbf8
--- /dev/null
+++ b/devel/got/files/patch-regress_Makefile
@@ -0,0 +1,8 @@
+--- regress/Makefile.orig 2020-09-13 22:58:33 UTC
++++ regress/Makefile
+@@ -1,3 +1,5 @@
+ SUBDIR = cmdline delta idset path fetch
+
++SUBDIR_TARGETS+= regress
++
+ .include <bsd.subdir.mk>
diff --git a/devel/got/files/patch-regress_cmdline_Makefile b/devel/got/files/patch-regress_cmdline_Makefile
new file mode 100644
index 000000000000..98a72bfc05f0
--- /dev/null
+++ b/devel/got/files/patch-regress_cmdline_Makefile
@@ -0,0 +1,10 @@
+--- regress/cmdline/Makefile.orig 2020-08-09 09:17:05 UTC
++++ regress/cmdline/Makefile
+@@ -78,4 +78,6 @@ fetch:
+ tree:
+ ./tree.sh -q
+
+-.include <bsd.regress.mk>
++regress: ${REGRESS_TARGETS} .PHONY .SILENT
++
++.include <bsd.prog.mk>
diff --git a/devel/got/files/patch-regress_cmdline_commit.sh b/devel/got/files/patch-regress_cmdline_commit.sh
new file mode 100644
index 000000000000..3c4f2edf6682
--- /dev/null
+++ b/devel/got/files/patch-regress_cmdline_commit.sh
@@ -0,0 +1,13 @@
+XXX remove after 0.39
+--- regress/cmdline/commit.sh.orig 2020-09-13 18:20:00 UTC
++++ regress/cmdline/commit.sh
+@@ -248,7 +248,8 @@ test_commit_deleted_subdirs() {
+ return 1
+ fi
+
+- (cd $testroot/wt && got rm -R $testroot/wt/{epsilon,gamma} >/dev/null)
++ (cd $testroot/wt && \
++ got rm -R $testroot/wt/epsilon $testroot/wt/gamma >/dev/null)
+
+ (cd $testroot/wt && got commit -m 'test commit_deleted_subdirs' \
+ > $testroot/stdout 2> $testroot/stderr)
diff --git a/devel/got/files/patch-regress_cmdline_common.sh b/devel/got/files/patch-regress_cmdline_common.sh
new file mode 100644
index 000000000000..6d5156bca83a
--- /dev/null
+++ b/devel/got/files/patch-regress_cmdline_common.sh
@@ -0,0 +1,52 @@
+XXX remove second hunk after 0.39
+--- regress/cmdline/common.sh.orig 2020-09-13 18:20:00 UTC
++++ regress/cmdline/common.sh
+@@ -24,6 +24,20 @@ export GOT_LOG_DEFAULT_LIMIT=0
+
+ export MALLOC_OPTIONS=S
+
++# compat wrapper
++sed()
++(
++ for i; do
++ arg=$1
++ shift
++ case $arg in
++ -i) set - "$@" "$arg" '' ;;
++ *) set - "$@" "$arg" ;;
++ esac
++ done
++ exec sed "$@"
++)
++
+ git_init()
+ {
+ git init -q "$1"
+@@ -96,13 +110,13 @@ git_show_tree()
+
+ trim_obj_id()
+ {
+- let trimcount=$1
+- id=$2
++ local trimcount=$1
++ local id=$2
+
+- pat=""
+- while [ trimcount -gt 0 ]; do
++ local pat=""
++ while [ "$trimcount" -gt 0 ]; do
+ pat="[0-9a-f]$pat"
+- let trimcount--
++ trimcount=$((trimcount - 1))
+ done
+
+ echo ${id%$pat}
+@@ -168,7 +182,7 @@ test_init()
+ echo "No test name provided" >&2
+ return 1
+ fi
+- local testroot=`mktemp -p /tmp -d got-test-$testname-XXXXXXXX`
++ local testroot=`mktemp -d ${TMPDIR-/tmp}/got-test-$testname-XXXXXXXX`
+ mkdir $testroot/repo
+ git_init $testroot/repo
+ if [ -z "$no_tree" ]; then
diff --git a/devel/got/files/patch-regress_cmdline_import.sh b/devel/got/files/patch-regress_cmdline_import.sh
new file mode 100644
index 000000000000..24780e2bc2fb
--- /dev/null
+++ b/devel/got/files/patch-regress_cmdline_import.sh
@@ -0,0 +1,38 @@
+--- regress/cmdline/import.sh.orig 2020-09-13 18:20:00 UTC
++++ regress/cmdline/import.sh
+@@ -18,7 +18,7 @@
+
+ test_import_basic() {
+ local testname=import_basic
+- local testroot=`mktemp -p /tmp -d got-test-$testname-XXXXXXXX`
++ local testroot=`mktemp -d ${TMPDIR-/tmp}/got-test-$testname-XXXXXXXX`
+
+ got init $testroot/repo
+
+@@ -170,7 +170,7 @@ test_import_requires_new_branch() {
+
+ test_import_ignores() {
+ local testname=import_ignores
+- local testroot=`mktemp -p /tmp -d got-test-$testname-XXXXXXXX`
++ local testroot=`mktemp -d ${TMPDIR-/tmp}/got-test-$testname-XXXXXXXX`
+
+ got init $testroot/repo
+
+@@ -200,7 +200,7 @@ test_import_ignores() {
+
+ test_import_empty_dir() {
+ local testname=import_empty_dir
+- local testroot=`mktemp -p /tmp -d got-test-$testname-XXXXXXXX`
++ local testroot=`mktemp -d ${TMPDIR-/tmp}/got-test-$testname-XXXXXXXX`
+
+ got init $testroot/repo
+
+@@ -243,7 +243,7 @@ test_import_empty_dir() {
+
+ test_import_symlink() {
+ local testname=import_symlink
+- local testroot=`mktemp -p /tmp -d got-test-$testname-XXXXXXXX`
++ local testroot=`mktemp -d ${TMPDIR-/tmp}/got-test-$testname-XXXXXXXX`
+
+ got init $testroot/repo
+
diff --git a/devel/got/files/patch-regress_cmdline_rm.sh b/devel/got/files/patch-regress_cmdline_rm.sh
new file mode 100644
index 000000000000..e02e31402b13
--- /dev/null
+++ b/devel/got/files/patch-regress_cmdline_rm.sh
@@ -0,0 +1,20 @@
+--- regress/cmdline/rm.sh.orig 2020-09-15 22:43:33 UTC
++++ regress/cmdline/rm.sh
+@@ -239,7 +239,7 @@ test_rm_directory() {
+ return 1
+ fi
+
+- (cd $testroot/wt && ls -l > $testroot/stdout)
++ (cd $testroot/wt && ls -l | sed '/^total/d' > $testroot/stdout)
+
+ echo -n '' > $testroot/stdout.expected
+
+@@ -251,7 +251,7 @@ test_rm_directory() {
+ return 1
+ fi
+
+- (cd $testroot/wt && ls -l > $testroot/stdout)
++ (cd $testroot/wt && ls -l | sed '/^total/d' > $testroot/stdout)
+
+ echo -n '' > $testroot/stdout.expected
+
diff --git a/devel/got/files/patch-regress_delta_Makefile b/devel/got/files/patch-regress_delta_Makefile
new file mode 100644
index 000000000000..396bea89d157
--- /dev/null
+++ b/devel/got/files/patch-regress_delta_Makefile
@@ -0,0 +1,12 @@
+--- regress/delta/Makefile.orig 2020-08-09 09:17:05 UTC
++++ regress/delta/Makefile
+@@ -8,7 +8,7 @@ LDADD = -lz
+
+ NOMAN = yes
+
+-run-regress-delta_test:
++regress: ${PROG} .PHONY
+ ${.OBJDIR}/delta_test -q
+
+-.include <bsd.regress.mk>
++.include <bsd.prog.mk>
diff --git a/devel/got/files/patch-regress_fetch_Makefile b/devel/got/files/patch-regress_fetch_Makefile
new file mode 100644
index 000000000000..8964acce92df
--- /dev/null
+++ b/devel/got/files/patch-regress_fetch_Makefile
@@ -0,0 +1,12 @@
+--- regress/fetch/Makefile.orig 2020-09-11 17:05:16 UTC
++++ regress/fetch/Makefile
+@@ -11,7 +11,7 @@ LDADD = -lutil -lz
+
+ NOMAN = yes
+
+-run-regress-fetch_test:
++regress: ${PROG} .PHONY
+ ${.OBJDIR}/fetch_test -q
+
+-.include <bsd.regress.mk>
++.include <bsd.prog.mk>
diff --git a/devel/got/files/patch-regress_idset_Makefile b/devel/got/files/patch-regress_idset_Makefile
new file mode 100644
index 000000000000..d3da8c50877d
--- /dev/null
+++ b/devel/got/files/patch-regress_idset_Makefile
@@ -0,0 +1,12 @@
+--- regress/idset/Makefile.orig 2020-08-09 09:17:05 UTC
++++ regress/idset/Makefile
+@@ -9,7 +9,7 @@ LDADD = -lutil -lz
+
+ NOMAN = yes
+
+-run-regress-idset_test:
++regress: ${PROG} .PHONY
+ ${.OBJDIR}/idset_test -q
+
+-.include <bsd.regress.mk>
++.include <bsd.prog.mk>
diff --git a/devel/got/files/patch-regress_path_Makefile b/devel/got/files/patch-regress_path_Makefile
new file mode 100644
index 000000000000..f3240e0f74d5
--- /dev/null
+++ b/devel/got/files/patch-regress_path_Makefile
@@ -0,0 +1,12 @@
+--- regress/path/Makefile.orig 2020-08-09 09:17:05 UTC
++++ regress/path/Makefile
+@@ -8,7 +8,7 @@ LDADD = -lutil -lz
+
+ NOMAN = yes
+
+-run-regress-path_test:
++regress: ${PROG} .PHONY
+ ${.OBJDIR}/path_test -q
+
+-.include <bsd.regress.mk>
++.include <bsd.prog.mk>
diff --git a/devel/got/files/patch-tog_Makefile b/devel/got/files/patch-tog_Makefile
new file mode 100644
index 000000000000..a8e1397f9bcb
--- /dev/null
+++ b/devel/got/files/patch-tog_Makefile
@@ -0,0 +1,11 @@
+--- tog/Makefile.orig 2020-09-11 17:05:16 UTC
++++ tog/Makefile
+@@ -25,8 +25,4 @@ DPADD = ${LIBZ} ${LIBUTIL}
+ NOMAN = Yes
+ .endif
+
+-realinstall:
+- ${INSTALL} ${INSTALL_COPY} -o ${BINOWN} -g ${BINGRP} \
+- -m ${BINMODE} ${PROG} ${BINDIR}/${PROG}
+-
+ .include <bsd.prog.mk>
diff --git a/devel/got/files/patch-tog_tog.c b/devel/got/files/patch-tog_tog.c
new file mode 100644
index 000000000000..13342c971645
--- /dev/null
+++ b/devel/got/files/patch-tog_tog.c
@@ -0,0 +1,11 @@
+--- tog/tog.c.orig 2020-09-14 19:31:57 UTC
++++ tog/tog.c
+@@ -5645,7 +5645,7 @@ main(int argc, char *argv[])
+
+ argc -= optind;
+ argv += optind;
+- optind = 0;
++ optind = 1;
+ optreset = 1;
+
+ if (Vflag) {
diff --git a/devel/got/pkg-descr b/devel/got/pkg-descr
new file mode 100644
index 000000000000..d72a6442447f
--- /dev/null
+++ b/devel/got/pkg-descr
@@ -0,0 +1,9 @@
+Game of Trees (Got) is a version control system which prioritizes
+ease of use and simplicity over flexibility.
+
+Got uses Git repositories to store versioned data. Git can be used
+for any functionality which has not yet been implemented in Got.
+It will always remain possible to work with both Got and Git on the
+same repository.
+
+WWW: https://gameoftrees.org
diff --git a/devel/got/pkg-plist b/devel/got/pkg-plist
new file mode 100644
index 000000000000..f5107f44ec1b
--- /dev/null
+++ b/devel/got/pkg-plist
@@ -0,0 +1,17 @@
+bin/got
+bin/tog
+libexec/got-fetch-pack
+libexec/got-index-pack
+libexec/got-read-blob
+libexec/got-read-commit
+libexec/got-read-gitconfig
+libexec/got-read-gotconfig
+libexec/got-read-object
+libexec/got-read-pack
+libexec/got-read-tag
+libexec/got-read-tree
+man/man1/got.1.gz
+man/man1/tog.1.gz
+man/man5/git-repository.5.gz
+man/man5/got-worktree.5.gz
+man/man5/got.conf.5.gz