aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/nngcat/CMakeLists.txt39
-rw-r--r--tools/nngcat/nngcat.c1217
-rwxr-xr-xtools/nngcat/nngcat_ambiguous_test.sh31
-rwxr-xr-xtools/nngcat/nngcat_async_test.sh32
-rwxr-xr-xtools/nngcat/nngcat_dup_proto_test.sh23
-rwxr-xr-xtools/nngcat/nngcat_help_test.sh32
-rwxr-xr-xtools/nngcat/nngcat_incompat_test.sh73
-rwxr-xr-xtools/nngcat/nngcat_need_proto_test.sh23
-rwxr-xr-xtools/nngcat/nngcat_pubsub_test.sh45
-rwxr-xr-xtools/nngcat/nngcat_recvmaxsz_test.sh46
-rwxr-xr-xtools/nngcat/nngcat_stdin_pipe_test.sh44
-rwxr-xr-xtools/nngcat/nngcat_unlimited_test.sh46
-rw-r--r--tools/pubrefman/README.adoc10
-rw-r--r--tools/pubrefman/go.mod11
-rw-r--r--tools/pubrefman/go.sum277
-rw-r--r--tools/pubrefman/pubrefman.go493
16 files changed, 0 insertions, 2442 deletions
diff --git a/tools/nngcat/CMakeLists.txt b/tools/nngcat/CMakeLists.txt
deleted file mode 100644
index bd7327ac..00000000
--- a/tools/nngcat/CMakeLists.txt
+++ /dev/null
@@ -1,39 +0,0 @@
-#
-# Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
-# Copyright 2018 Capitar IT Group BV <info@capitar.com>
-#
-# This software is supplied under the terms of the MIT License, a
-# copy of which should be located in the distribution where this
-# file was obtained (LICENSE.txt). A copy of the license may also be
-# found online at https://opensource.org/licenses/MIT.
-#
-
-if (NNG_ENABLE_NNGCAT)
- add_executable(nngcat nngcat.c)
- target_include_directories(nngcat PUBLIC ${PROJECT_SOURCE_DIR}/src)
- target_link_libraries(nngcat nng nng_private)
- install(TARGETS nngcat RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
- COMPONENT Tools)
-
- if (NNG_TESTS AND CMAKE_SYSTEM_NAME MATCHES "Linux")
- include(FindUnixCommands)
- endif ()
- # TODO: This should be refactored to use a test driver.
- # We only run the tests on Linux for now, because the Darwin CI/CD is too brittle.
- if (NNG_TESTS AND BASH AND CMAKE_SYSTEM_NAME MATCHES "Linux")
- macro(add_nngcat_test NAME TIMEOUT)
- add_test(NAME nng.${NAME} COMMAND ${BASH} ${CMAKE_CURRENT_SOURCE_DIR}/${NAME}_test.sh $<TARGET_FILE:nngcat>)
- set_tests_properties(nng.${NAME} PROPERTIES TIMEOUT ${TIMEOUT})
- endmacro()
- add_nngcat_test(nngcat_async 10)
- add_nngcat_test(nngcat_ambiguous 10)
- add_nngcat_test(nngcat_need_proto 10)
- add_nngcat_test(nngcat_dup_proto 10)
- add_nngcat_test(nngcat_help 10)
- add_nngcat_test(nngcat_incompat 10)
- add_nngcat_test(nngcat_pubsub 20)
- add_nngcat_test(nngcat_recvmaxsz 20)
- add_nngcat_test(nngcat_unlimited 20)
- add_nngcat_test(nngcat_stdin_pipe 20)
- endif ()
-endif ()
diff --git a/tools/nngcat/nngcat.c b/tools/nngcat/nngcat.c
deleted file mode 100644
index 9e106069..00000000
--- a/tools/nngcat/nngcat.c
+++ /dev/null
@@ -1,1217 +0,0 @@
-//
-// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
-// Copyright 2018 Capitar IT Group BV <info@capitar.com>
-// Copyright 2020 Lager Data, Inc. <support@lagerdata.com>
-//
-// This software is supplied under the terms of the MIT License, a
-// copy of which should be located in the distribution where this
-// file was obtained (LICENSE.txt). A copy of the license may also be
-// found online at https://opensource.org/licenses/MIT.
-//
-
-#include <ctype.h>
-#include <errno.h>
-#include <stdarg.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <nng/nng.h>
-#include <nng/protocol/bus0/bus.h>
-#include <nng/protocol/pair0/pair.h>
-#include <nng/protocol/pair1/pair.h>
-#include <nng/protocol/pipeline0/pull.h>
-#include <nng/protocol/pipeline0/push.h>
-#include <nng/protocol/pubsub0/pub.h>
-#include <nng/protocol/pubsub0/sub.h>
-#include <nng/protocol/reqrep0/rep.h>
-#include <nng/protocol/reqrep0/req.h>
-#include <nng/protocol/survey0/respond.h>
-#include <nng/protocol/survey0/survey.h>
-#include <nng/supplemental/tls/tls.h>
-#include <nng/supplemental/util/options.h>
-#include <nng/supplemental/util/platform.h>
-#include <nng/transport/zerotier/zerotier.h>
-
-// Globals. We need this to avoid passing around everything.
-int format = 0;
-int proto = 0;
-int verbose = 0;
-int delay = 0;
-nng_duration interval = NNG_DURATION_INFINITE;
-nng_duration sendtimeo = NNG_DURATION_INFINITE;
-nng_duration recvtimeo = NNG_DURATION_INFINITE;
-void * data = NULL;
-size_t datalen = 0;
-int compat = 0;
-int async = 0;
-int insecure = 0;
-void * cacert = NULL;
-size_t cacertlen = 0;
-void * keyfile = NULL;
-size_t keylen = 0;
-void * certfile = NULL;
-size_t certlen = 0;
-const char * zthome = NULL;
-int count = 0;
-int recvmaxsz = -1;
-
-// Options, must start at 1 because zero is sentinel.
-enum options {
- OPT_HELP = 1,
- OPT_VERBOSE,
- OPT_SILENT,
- OPT_REP0,
- OPT_REQ0,
- OPT_PUSH0,
- OPT_PULL0,
- OPT_PUB0,
- OPT_SUB0,
- OPT_SURVEY0,
- OPT_RESPOND0,
- OPT_PAIR0,
- OPT_PAIR1,
- OPT_PAIR,
- OPT_BUS0,
- OPT_DIAL,
- OPT_LISTEN,
- OPT_DATA,
- OPT_FILE,
- OPT_SUBSCRIBE,
- OPT_INTERVAL,
- OPT_DELAY,
- OPT_COUNT,
- OPT_FORMAT,
- OPT_RAW,
- OPT_ASCII,
- OPT_QUOTED,
- OPT_MSGPACK,
- OPT_HEX,
- OPT_BLANK, // no printing, not an actual option.
- OPT_COMPAT,
- OPT_ASYNC,
- OPT_RCV_TIMEO,
- OPT_SND_TIMEO,
- OPT_SOCK_NAME,
- OPT_LISTEN_IPC,
- OPT_DIAL_IPC,
- OPT_LISTEN_LOCAL,
- OPT_DIAL_LOCAL,
- OPT_INSECURE,
- OPT_CACERT,
- OPT_KEYFILE,
- OPT_CERTFILE,
- OPT_VERSION,
- OPT_RECVMAXSZ,
- OPT_ZTHOME,
-};
-
-static nng_optspec opts[] = {
- { .o_name = "help", .o_short = 'h', .o_val = OPT_HELP },
- { .o_name = "verbose", .o_short = 'v', .o_val = OPT_VERBOSE },
- { .o_name = "silent", .o_short = 'q', .o_val = OPT_SILENT },
- { .o_name = "req0", .o_val = OPT_REQ0 },
- { .o_name = "rep0", .o_val = OPT_REP0 },
- { .o_name = "push0", .o_val = OPT_PUSH0 },
- { .o_name = "pull0", .o_val = OPT_PULL0 },
- { .o_name = "pub0", .o_val = OPT_PUB0 },
- { .o_name = "sub", .o_val = OPT_SUB0 }, // explicit for alias
- { .o_name = "sub0", .o_val = OPT_SUB0 },
- { .o_name = "surveyor0", .o_val = OPT_SURVEY0 },
- { .o_name = "respondent0", .o_val = OPT_RESPOND0 },
- { .o_name = "pair", .o_val = OPT_PAIR },
- { .o_name = "pair0", .o_val = OPT_PAIR0 },
- { .o_name = "pair1", .o_val = OPT_PAIR1 },
- { .o_name = "bus0", .o_val = OPT_BUS0 },
- { .o_name = "dial", .o_val = OPT_DIAL, .o_arg = true },
- { .o_name = "listen", .o_val = OPT_LISTEN, .o_arg = true },
- { .o_name = "data", .o_short = 'D', .o_val = OPT_DATA, .o_arg = true },
- { .o_name = "file", .o_short = 'F', .o_val = OPT_FILE, .o_arg = true },
- { .o_name = "subscribe", .o_val = OPT_SUBSCRIBE, .o_arg = true },
- { .o_name = "format", .o_val = OPT_FORMAT, .o_arg = true },
- { .o_name = "ascii", .o_short = 'A', .o_val = OPT_ASCII },
- { .o_name = "quoted", .o_short = 'Q', .o_val = OPT_QUOTED },
- { .o_name = "raw", .o_val = OPT_RAW },
- { .o_name = "hex", .o_val = OPT_HEX },
- { .o_name = "compat", .o_val = OPT_COMPAT },
- { .o_name = "async", .o_val = OPT_ASYNC },
- { .o_name = "msgpack", .o_val = OPT_MSGPACK },
-
- {
- .o_name = "recv-maxsz",
- .o_short = 'Z',
- .o_val = OPT_RECVMAXSZ,
- .o_arg = true,
- },
- {
- .o_name = "count",
- .o_short = 'C',
- .o_val = OPT_COUNT,
- .o_arg = true,
- },
- {
- .o_name = "delay",
- .o_short = 'd',
- .o_val = OPT_DELAY,
- .o_arg = true,
- },
- {
- .o_name = "interval",
- .o_short = 'i',
- .o_val = OPT_INTERVAL,
- .o_arg = true,
- },
- { .o_name = "recv-timeout", .o_val = OPT_RCV_TIMEO, .o_arg = true },
- { .o_name = "send-timeout", .o_val = OPT_SND_TIMEO, .o_arg = true },
- { .o_name = "socket-name", .o_val = OPT_SOCK_NAME, .o_arg = true },
-
- // Legacy compatibility with nanocat.
- { .o_name = "bind", .o_val = OPT_LISTEN, .o_arg = true },
- { .o_name = "connect", .o_val = OPT_DIAL, .o_arg = true },
- {
- .o_name = "bind-ipc",
- .o_short = 'X',
- .o_val = OPT_LISTEN_IPC,
- .o_arg = true,
- },
- {
- .o_name = "connect-ipc",
- .o_short = 'x',
- .o_val = OPT_DIAL_IPC,
- .o_arg = true,
- },
- {
- .o_name = "bind-local",
- .o_short = 'L',
- .o_val = OPT_LISTEN_LOCAL,
- .o_arg = true,
- },
- {
- .o_name = "connect-local",
- .o_short = 'l',
- .o_val = OPT_DIAL_LOCAL,
- .o_arg = true,
- },
- { .o_name = "insecure", .o_short = 'k', .o_val = OPT_INSECURE },
- { .o_name = "cacert", .o_val = OPT_CACERT, .o_arg = true },
- { .o_name = "key", .o_val = OPT_KEYFILE, .o_arg = true },
- {
- .o_name = "cert",
- .o_short = 'E',
- .o_val = OPT_CERTFILE,
- .o_arg = true,
- },
- {
- .o_name = "zt-home",
- .o_val = OPT_ZTHOME,
- .o_arg = true,
- },
- { .o_name = "version", .o_short = 'V', .o_val = OPT_VERSION },
-
- // Sentinel.
- { .o_name = NULL, .o_val = 0 },
-};
-
-static void
-fatal(const char *msg, ...)
-{
- va_list ap;
- va_start(ap, msg);
- vfprintf(stderr, msg, ap);
- va_end(ap);
- fprintf(stderr, "\n");
- exit(1);
-}
-
-static void
-help(void)
-{
- printf(
- "Usage: nngcat <proto> <addr>... [<fmt>] [<opts>...] [<src>]\n\n");
- printf("<proto> must be one of:\n");
- printf(" --req0 (or alias --req)\n");
- printf(" --rep0 (or alias --rep)\n");
- printf(" --pub0 (or alias --pub)\n");
- printf(" --sub0 (or alias --sub)\n");
- printf(" --push0 (or alias --push)\n");
- printf(" --pull0 (or alias --pull)\n");
- printf(" --surveyor0 (or alias --surveyor)\n");
- printf(" --respondent0 (or alias --respondent)\n");
- printf(" --pair0\n");
- printf(" --pair1\n");
- printf(" --pair (alias for either pair0 or pair1)\n");
- printf("\n<addr> must be one or more of:\n");
- printf(" --dial <url> (or alias --connect <url>)\n");
- printf(" --listen <url> (or alias --bind <url>)\n");
- printf(" --bind-local <port> (or alias -L <port>)\n");
- printf(" --connect-local <port> (or alias -l <port>)\n");
- printf(" --bind-ipc <path> (or alias -X <path>)\n");
- printf(" --connect-ipc <path> (or alias -x <path>)\n");
- printf("\n<fmt> may be one or none of:\n");
- printf(" --format <no|ascii|hex|msgpack|quoted|raw>\n");
- printf(" --ascii (or alias -A)\n");
- printf(" --quoted (or alias -Q)\n");
- printf(" --hex\n");
- printf(" --msgpack\n");
- printf(" --raw\n");
- printf("\n<opts> may be any of:\n");
- printf(" --subscribe <topic> (only with --sub protocol)\n");
- printf(" --silent (or alias -q)\n");
- printf(" --verbose (or alias -v)\n");
- printf(" --count <num> (or alias -C <num>)\n");
- printf(" --delay <secs> (or alias -d <secs>)\n");
- printf(" --interval <secs> (or alias -i <secs>)\n");
- printf(" --recv-timeout <secs>\n");
- printf(" --send-timeout <secs>\n");
- printf(" --recv-maxsz <size> (or alias -Z <size>)\n");
- printf(" --compat\n");
- printf(" --async\n");
- printf(" --insecure (or alias -k)\n");
- printf(" --cacert <file>\n");
- printf(" --cert <file> (or alias -E <file>)\n");
- printf(" --key <file>\n");
- printf(" --zt-home <path>\n");
- printf("\n<src> may be one of:\n");
- printf(" --file <file> (or alias -F <file>). "
- "Use - for standard input.\n");
- printf(" --data <data> (or alias -D <data>)\n");
- exit(1);
-}
-
-static int
-intarg(const char *val, int maxv)
-{
- int v = 0;
-
- if (val[0] == '\0') {
- fatal("Empty integer argument.");
- }
- while (*val != '\0') {
- if (!isdigit(*val)) {
- fatal("Integer argument expected.");
- }
- v *= 10;
- v += ((*val) - '0');
- val++;
- if (v > maxv) {
- fatal("Integer argument too large.");
- }
- }
- if (v < 0) {
- fatal("Integer argument overflow.");
- }
- return (v);
-}
-
-// This reads a file into memory. Care is taken to ensure that
-// the buffer is one byte larger and contains a terminating
-// NUL. (Useful for key files and such.)
-static void
-loadfile(const char *path, void **datap, size_t *lenp)
-{
- FILE * f;
- size_t total_read = 0;
- size_t allocation_size = BUFSIZ;
- char * fdata;
- char * realloc_result;
-
- if (strcmp(path, "-") == 0) {
- f = stdin;
- } else {
- if ((f = fopen(path, "rb")) == NULL) {
- fatal(
- "Cannot open file %s: %s", path, strerror(errno));
- }
- }
-
- if ((fdata = malloc(allocation_size + 1)) == NULL) {
- fatal("Out of memory.");
- }
-
- while (1) {
- total_read += fread(
- fdata + total_read, 1, allocation_size - total_read, f);
- if (ferror(f)) {
- if (errno == EINTR) {
- continue;
- }
- fatal(
- "Read from %s failed: %s", path, strerror(errno));
- }
- if (feof(f)) {
- break;
- }
- if (total_read == allocation_size) {
- if (allocation_size > SIZE_MAX / 2) {
- fatal("Out of memory.");
- }
- allocation_size *= 2;
- if ((realloc_result = realloc(
- fdata, allocation_size + 1)) == NULL) {
- free(fdata);
- fatal("Out of memory.");
- }
- fdata = realloc_result;
- }
- }
- if (f != stdin) {
- fclose(f);
- }
- fdata[total_read] = '\0';
- *datap = fdata;
- *lenp = total_read;
-}
-
-static void
-configtls(nng_tls_config *tls)
-{
- int rv = 0;
- if (insecure) {
- rv = nng_tls_config_auth_mode(tls, NNG_TLS_AUTH_MODE_NONE);
- }
- if ((rv == 0) && (certfile != NULL)) {
- keyfile = keyfile ? keyfile : certfile;
- rv = nng_tls_config_own_cert(tls, certfile, keyfile, NULL);
- }
- if ((rv == 0) && (cacert != NULL)) {
- rv = nng_tls_config_ca_chain(tls, cacert, NULL);
- }
- if (rv != 0) {
- fatal("Unable to configure TLS: %s", nng_strerror(rv));
- }
-}
-
-struct addr {
- struct addr *next;
- int mode;
- char * val;
-};
-
-struct addr **
-addaddr(struct addr **endp, int mode, const char *a)
-{
- struct addr *na;
-
- if (((na = malloc(sizeof(*na))) == NULL) ||
- ((na->val = malloc(strlen(a) + 1)) == NULL)) {
- fatal("Out of memory.");
- }
- na->mode = mode;
- memcpy(na->val, a, strlen(a) + 1);
- na->next = NULL;
- *endp = na;
- return (&na->next);
-}
-
-struct topic {
- struct topic *next;
- char * val;
-};
-
-struct topic **
-addtopic(struct topic **endp, const char *s)
-{
- struct topic *t;
-
- if (((t = malloc(sizeof(*t))) == NULL) ||
- ((t->val = malloc(strlen(s) + 1)) == NULL)) {
- fatal("Out of memory.");
- }
- memcpy(t->val, s, strlen(s) + 1);
- t->next = NULL;
- *endp = t;
- return (&t->next);
-}
-
-void
-printmsg(char *buf, size_t len)
-{
- switch (format) {
- case OPT_BLANK: // Suppress contents.
- return;
- case OPT_RAW: // Just emit raw contents.
- fwrite(buf, 1, len, stdout);
- break;
- case OPT_ASCII: // ASCII, but non-ASCII substituted with '.'
- for (size_t i = 0; i < len; i++) {
- if (isprint(buf[i])) {
- putchar(buf[i]);
- } else {
- putchar('.');
- }
- }
- break;
- case OPT_QUOTED: // C style quoted strings.
- putchar('"');
- for (size_t i = 0; i < len; i++) {
- switch (buf[i]) {
- case '\n':
- putchar('\\');
- putchar('n');
- break;
- case '\r':
- putchar('\\');
- putchar('r');
- break;
- case '\t':
- putchar('\\');
- putchar('t');
- break;
- case '"':
- case '\\':
- putchar('\\');
- putchar(buf[i]);
- break;
- default:
- if (isprint(buf[i])) {
- fputc(buf[i], stdout);
- } else {
- printf("\\x%02x", (uint8_t) buf[i]);
- }
- }
- }
- putchar('"');
- putchar('\n');
- break;
- case OPT_MSGPACK: // MsgPack, we just encode prefix + len, then
- // raw.
- if (len < 256) {
- putchar('\xc4');
- putchar(len & 0xff);
- } else if (len < 65536) {
- putchar('\xc5');
- putchar((len >> 8) & 0xff);
- putchar(len & 0xff);
- } else {
- putchar('\xc6');
- putchar((len >> 24) & 0xff);
- putchar((len >> 16) & 0xff);
- putchar((len >> 8) & 0xff);
- putchar(len & 0xff);
- }
- fwrite(buf, 1, len, stdout);
- break;
- case OPT_HEX: // Hex, quoted C string encoded with hex
- // literals.
- putchar('"');
- for (size_t i = 0; i < len; i++) {
- printf("\\x%02x", (uint8_t) buf[i]);
- }
- putchar('"');
- putchar('\n');
- break;
- }
- fflush(stdout);
-}
-
-void
-recvloop(nng_socket sock)
-{
- int iters = 0;
- for (;;) {
- int rv;
- nng_msg *msg;
-
- if ((count > 0) && (iters >= count)) {
- break;
- }
- rv = nng_recvmsg(sock, &msg, 0);
- iters++;
- switch (rv) {
- case NNG_ETIMEDOUT:
- case NNG_ESTATE:
- // Either a regular timeout, or we reached the
- // end of an event like a survey completing.
- return;
- case 0:
- printmsg(nng_msg_body(msg), nng_msg_len(msg));
- nng_msg_free(msg);
- continue;
- default:
- fatal("Receive error: %s", nng_strerror(rv));
- }
- }
-}
-
-void
-resploop(nng_socket sock)
-{
- int iters = 0;
- for (;;) {
- int rv;
- nng_msg *msg;
-
- rv = nng_recvmsg(sock, &msg, 0);
- if (rv != 0) {
- fatal("Receive error: %s", nng_strerror(rv));
- }
- printmsg(nng_msg_body(msg), nng_msg_len(msg));
- nng_msg_clear(msg);
- if ((rv = nng_msg_append(msg, data, datalen)) != 0) {
- fatal(nng_strerror(rv));
- }
- if ((rv = nng_sendmsg(sock, msg, 0)) != 0) {
- fatal("Send error: %s", nng_strerror(rv));
- }
-
- iters++;
- if ((count > 0) && (iters >= count)) {
- break;
- }
- }
-
- nng_msleep(200);
-}
-
-void
-sendloop(nng_socket sock)
-{
- int iters = 0;
-
- if (data == NULL) {
- fatal("No data to send (specify with --data or --file)");
- }
- if (delay > 0) {
- nng_msleep(delay);
- }
-
- for (;;) {
- int rv;
- nng_msg * msg;
- nng_time start;
- nng_time end;
- nng_duration delta;
-
- start = nng_clock();
- if (((rv = nng_msg_alloc(&msg, 0)) != 0) ||
- ((rv = nng_msg_append(msg, data, datalen)) != 0)) {
- fatal(nng_strerror(rv));
- }
- if ((rv = nng_sendmsg(sock, msg, 0)) != 0) {
- fatal("Send error: %s", nng_strerror(rv));
- }
- end = nng_clock();
- delta = (nng_duration)(end - start);
-
- iters++;
- // By default, we don't loop.
- if (((interval < 0) && (count == 0)) ||
- ((count > 0) && (iters >= count))) {
- break;
- }
-
- // We sleep, but we account for time spent, so that our
- // interval appears more or less constant. Of course
- // if we took more than the interval here, then we skip
- // the sleep altogether.
- if ((delta >= 0) && (delta < interval)) {
- nng_msleep(interval - delta);
- }
- }
- // Wait a bit to give queues a chance to drain.
- nng_msleep(200);
-}
-
-void
-sendrecv(nng_socket sock)
-{
- int iters = 0;
-
- if (data == NULL) {
- fatal("No data to send (specify with --data or --file)");
- }
- if (delay > 0) {
- nng_msleep(delay);
- }
-
- // We start by sending a message, then we receive iteratively
- // but we set a concrete timeout if interval is set, to ensure
- // that we exit the receive loop, and can continue.
- for (;;) {
- int rv;
- nng_msg * msg;
- nng_time start;
- nng_time end;
- nng_duration delta;
-
- start = nng_clock();
- if (((rv = nng_msg_alloc(&msg, 0)) != 0) ||
- ((rv = nng_msg_append(msg, data, datalen)) != 0)) {
- fatal(nng_strerror(rv));
- }
- if ((rv = nng_sendmsg(sock, msg, 0)) != 0) {
- fatal("Send error: %s", nng_strerror(rv));
- }
- if ((interval < 0) && (count == 0)) {
- // Only one iteration through.
- recvloop(sock);
- break;
- }
-
- // We would like to use recvloop, but we need to reset
- // our timeout each time, as the timer counts down
- // towards zero. Furthermore, with survey, we don't
- // want to increment the iteration count.
-
- for (;;) {
- delta = (nng_duration)(nng_clock() - start);
-
- nng_duration expire = interval - delta;
- if ((recvtimeo >= 0) && (expire > recvtimeo)) {
- expire = recvtimeo;
- }
- rv =
- nng_socket_set_ms(sock, NNG_OPT_RECVTIMEO, expire);
- if (rv != 0) {
- fatal("Cannot set recv timeout: %s",
- nng_strerror(rv));
- }
-
- rv = nng_recvmsg(sock, &msg, 0);
- switch (rv) {
- case 0:
- printmsg(nng_msg_body(msg), nng_msg_len(msg));
- nng_msg_free(msg);
- continue;
- case NNG_ETIMEDOUT:
- case NNG_ESTATE:
- // We're done receiving
- break;
- default:
- fatal("Cannot receive: %s", nng_strerror(rv));
- break;
- }
-
- // We're done receiving, break out.
- break;
- }
-
- end = nng_clock();
- delta = (nng_duration)(end - start);
-
- iters++;
- if ((count > 0) && (iters >= count)) {
- break;
- }
-
- // We sleep, but we account for time spent, so that our
- // interval appears more or less constant. Of course
- // if we took more than the interval here, then we skip
- // the sleep altogether.
- if ((delta >= 0) && (delta < interval)) {
- nng_msleep(interval - delta);
- }
- }
-}
-
-int
-main(int ac, char **av)
-{
- int idx;
- char * arg;
- int val;
- int rv;
- char scratch[512];
- struct addr * addrs = NULL;
- struct addr ** addrend;
- struct topic * topics = NULL;
- struct topic **topicend;
- nng_socket sock;
- int port;
-
- idx = 1;
- addrend = &addrs;
- topicend = &topics;
-
- while ((rv = nng_opts_parse(ac, av, opts, &val, &arg, &idx)) == 0) {
- switch (val) {
- case OPT_HELP:
- help();
- break;
- case OPT_REQ0:
- case OPT_REP0:
- case OPT_SUB0:
- case OPT_PUB0:
- case OPT_BUS0:
- case OPT_SURVEY0:
- case OPT_RESPOND0:
- case OPT_PAIR0:
- case OPT_PAIR1:
- case OPT_PUSH0:
- case OPT_PULL0:
- if (proto != 0) {
- fatal("Only one protocol may be "
- "specified.");
- }
- proto = val;
- break;
- case OPT_DIAL:
- case OPT_LISTEN:
- addrend = addaddr(addrend, val, arg);
- break;
- case OPT_DIAL_LOCAL:
- case OPT_LISTEN_LOCAL:
- port = intarg(arg, 65536);
- snprintf(scratch, sizeof(scratch),
- "tcp://127.0.0.1:%d", port);
- addrend = addaddr(addrend, val, scratch);
- break;
- case OPT_DIAL_IPC:
- case OPT_LISTEN_IPC:
- snprintf(scratch, sizeof(scratch), "ipc:///%s", arg);
- addrend = addaddr(addrend, val, scratch);
- break;
- case OPT_COUNT:
- count = intarg(arg, 0x7fffffff);
- break;
- case OPT_SUBSCRIBE:
- topicend = addtopic(topicend, arg);
- break;
- case OPT_VERBOSE:
- case OPT_SILENT:
- verbose = val;
- break;
- case OPT_DELAY:
- delay = intarg(arg, 86400) * 1000; // max 1 day
- break;
- case OPT_INTERVAL:
- interval = intarg(arg, 86400) * 1000; // max 1 day
- break;
- case OPT_SND_TIMEO:
- sendtimeo = intarg(arg, 86400) * 1000; // max 1 day
- break;
- case OPT_RCV_TIMEO:
- recvtimeo = intarg(arg, 86400) * 1000; // max 1 day
- break;
- case OPT_RECVMAXSZ:
- recvmaxsz = intarg(arg, 0x7fffffff);
- if (recvmaxsz == 0) {
- recvmaxsz = 0x7fffffff;
- }
- break;
- case OPT_COMPAT:
- compat = 1;
- break;
- case OPT_ASYNC:
- async = NNG_FLAG_NONBLOCK;
- break;
- case OPT_ASCII:
- case OPT_RAW:
- case OPT_QUOTED:
- case OPT_MSGPACK:
- case OPT_HEX:
- if (format != 0) {
- fatal("Format may be specified only "
- "once.");
- }
- format = val;
- break;
- case OPT_FORMAT:
- if (format != 0) {
- fatal("Format may be specified only "
- "once.");
- }
- if (strcmp(arg, "no") == 0) {
- format = OPT_BLANK;
- } else if (strcmp(arg, "ascii") == 0) {
- format = OPT_ASCII;
- } else if (strcmp(arg, "hex") == 0) {
- format = OPT_HEX;
- } else if (strcmp(arg, "quoted") == 0) {
- format = OPT_QUOTED;
- } else if (strcmp(arg, "raw") == 0) {
- format = OPT_RAW;
- } else if (strcmp(arg, "msgpack") == 0) {
- format = OPT_MSGPACK;
- } else {
- fatal("Invalid format specified.");
- }
- break;
- case OPT_FILE:
- if (data != NULL) {
- fatal("Data (--file, --data) may be "
- "specified "
- "only once.");
- }
- loadfile(arg, &data, &datalen);
- break;
- case OPT_DATA:
- if (data != NULL) {
- fatal("Data (--file, --data) may be "
- "specified "
- "only once.");
- }
- if ((data = malloc(strlen(arg) + 1)) == NULL) {
- fatal("Out of memory.");
- }
- memcpy(data, arg, strlen(arg) + 1);
- datalen = strlen(arg);
- break;
- case OPT_CACERT:
- if (cacert != NULL) {
- fatal("CA Certificate (--cacert) may be "
- "specified only once.");
- }
- loadfile(arg, &cacert, &cacertlen);
- break;
- case OPT_KEYFILE:
- if (keyfile != NULL) {
- fatal(
- "Key (--key) may be specified only once.");
- }
- loadfile(arg, &keyfile, &keylen);
- break;
- case OPT_CERTFILE:
- if (certfile != NULL) {
- fatal("Cert (--cert) may be specified "
- "only "
- "once.");
- }
- loadfile(arg, &certfile, &certlen);
- break;
- case OPT_ZTHOME:
- zthome = arg;
- break;
- case OPT_INSECURE:
- insecure = 1;
- break;
- case OPT_VERSION:
- printf("%s\n", nng_version());
- exit(0);
- }
- }
- switch (rv) {
- case NNG_EINVAL:
- fatal("Option %s is invalid.", av[idx]);
- break;
- case NNG_EAMBIGUOUS:
- fatal("Option %s is ambiguous (specify in full).", av[idx]);
- break;
- case NNG_ENOARG:
- fatal("Option %s requires argument.", av[idx]);
- break;
- default:
- break;
- }
-
- if (addrs == NULL) {
- fatal("No address specified.");
- }
-
- if (compat) {
- if (async != 0) {
- fatal("Options --async and --compat are "
- "incompatible.");
- }
- if (count != 0) {
- fatal("Options --count and --compat are "
- "incompatible.");
- }
- if (proto == OPT_PAIR) {
- proto = OPT_PAIR0;
- }
- if (proto == OPT_PAIR1) {
- fatal("Protocol does not support --compat.");
- }
- async = NNG_FLAG_NONBLOCK;
- } else {
- if (proto == OPT_PAIR) {
- proto = OPT_PAIR1;
- }
- }
- if (proto == OPT_SUB0) {
- if (topics == NULL) {
- (void) addtopic(topicend, ""); // subscribe to all
- }
- } else {
- if (topics != NULL) {
- fatal("Protocol does not support --subscribe.");
- }
- }
-
- switch (proto) {
- case OPT_PULL0:
- case OPT_SUB0:
- if (data != NULL) {
- fatal("Protocol does not support --file or "
- "--data.");
- }
- if (interval >= 0) {
- fatal("Protocol does not support --interval.");
- }
- break;
- case OPT_PUSH0:
- case OPT_PUB0:
- if (format != 0) {
- fatal("Protocol does not support --format "
- "options.");
- }
- if (data == NULL) {
- fatal("Protocol requires either --file or "
- "--data.");
- }
- break;
- case OPT_SURVEY0:
- case OPT_REQ0:
- if (data == NULL) {
- fatal("Protocol requires either --file or "
- "--data.");
- }
- break;
- case OPT_REP0:
- case OPT_RESPOND0:
- if (interval >= 0) {
- fatal("Protocol does not support --interval.");
- }
- break;
- case OPT_PAIR0:
- case OPT_PAIR1:
- case OPT_BUS0:
- if ((interval >= 0) && (data == NULL)) {
- fatal("Option --interval requires either "
- "--file or --data.");
- }
- break;
- default:
- // Will be caught in next switch statement.
- break;
- }
-
- switch (proto) {
- case OPT_REQ0:
-#ifdef NNG_HAVE_REQ0
- rv = nng_req0_open(&sock);
-#else
- fatal("Protocol not supported.");
-#endif
- break;
- case OPT_REP0:
-#ifdef NNG_HAVE_REP0
- rv = nng_rep0_open(&sock);
-#else
- fatal("Protocol not supported.");
-#endif
- break;
- case OPT_SUB0:
-#ifdef NNG_HAVE_SUB0
- rv = nng_sub0_open(&sock);
-#else
- fatal("Protocol not supported.");
-#endif
- break;
- case OPT_PUB0:
-#ifdef NNG_HAVE_PUB0
- rv = nng_pub0_open(&sock);
-#else
- fatal("Protocol not supported.");
-#endif
- break;
- case OPT_PAIR0:
-#ifdef NNG_HAVE_PAIR0
- rv = nng_pair0_open(&sock);
-#else
- fatal("Protocol not supported.");
-#endif
- break;
- case OPT_PAIR1:
-#ifdef NNG_HAVE_PAIR1
- rv = nng_pair1_open(&sock);
-#else
- fatal("Protocol not supported");
-#endif
- break;
- case OPT_BUS0:
-#ifdef NNG_HAVE_BUS0
- rv = nng_bus0_open(&sock);
-#else
- fatal("Protocol not supported.");
-#endif
- break;
- case OPT_PUSH0:
-#ifdef NNG_HAVE_PUSH0
- rv = nng_push0_open(&sock);
-#else
- fatal("Protocol not supported.");
-#endif
- break;
- case OPT_PULL0:
-#ifdef NNG_HAVE_PULL0
- rv = nng_pull0_open(&sock);
-#else
- fatal("Protocol not supported.");
-#endif
- break;
- case OPT_SURVEY0:
-#ifdef NNG_HAVE_SURVEYOR0
- rv = nng_surveyor0_open(&sock);
-#else
- fatal("Protocol not supported.");
-#endif
- break;
- case OPT_RESPOND0:
-#ifdef NNG_HAVE_RESPONDENT0
- rv = nng_respondent0_open(&sock);
-#else
- fatal("Protocol not supported");
-#endif
- break;
- case 0:
- default:
- fatal("No protocol specified.");
- break;
- }
- if (rv != 0) {
- fatal("Unable to open socket: %s", nng_strerror(rv));
- }
-
- for (struct topic *t = topics; t != NULL; t = t->next) {
- rv = nng_socket_set(
- sock, NNG_OPT_SUB_SUBSCRIBE, t->val, strlen(t->val));
- if (rv != 0) {
- fatal("Unable to subscribe to topic %s: %s", t->val,
- nng_strerror(rv));
- }
- }
-
- if ((sendtimeo > 0) &&
- ((rv = nng_socket_set_ms(sock, NNG_OPT_SENDTIMEO, sendtimeo)) !=
- 0)) {
- fatal("Unable to set send timeout: %s", nng_strerror(rv));
- }
- if ((recvtimeo > 0) &&
- ((rv = nng_socket_set_ms(sock, NNG_OPT_RECVTIMEO, recvtimeo)) !=
- 0)) {
- fatal("Unable to set send timeout: %s", nng_strerror(rv));
- }
-
- if ((recvmaxsz >= 0) &&
- ((rv = nng_socket_set_size(sock, NNG_OPT_RECVMAXSZ, recvmaxsz)) !=
- 0)) {
- fatal("Unable to set max receive size: %s", nng_strerror(rv));
- }
-
- for (struct addr *a = addrs; a != NULL; a = a->next) {
- char * act;
- nng_listener l;
- nng_dialer d;
- nng_tls_config *tls;
- switch (a->mode) {
- case OPT_DIAL:
- case OPT_DIAL_IPC:
- case OPT_DIAL_LOCAL:
- rv = nng_dialer_create(&d, sock, a->val);
- if (rv != 0) {
- fatal("Unable to create dialer for %s: %s",
- a->val, nng_strerror(rv));
- }
- rv = nng_dialer_getopt_ptr(
- d, NNG_OPT_TLS_CONFIG, (void **) &tls);
- if (rv == 0) {
- configtls(tls);
- } else if (rv != NNG_ENOTSUP) {
- fatal("Unable to get TLS config: %s",
- nng_strerror(rv));
- }
- if (zthome != NULL) {
- rv = nng_dialer_set(d, NNG_OPT_ZT_HOME,
- zthome, strlen(zthome) + 1);
- if ((rv != 0) && (rv != NNG_ENOTSUP)) {
- fatal("Unable to set ZT home: %s",
- nng_strerror(rv));
- }
- }
- rv = nng_dialer_start(d, async);
- act = "dial";
- if ((rv == 0) && (verbose == OPT_VERBOSE)) {
- char ustr[256];
- size_t sz;
- sz = sizeof(ustr);
- if (nng_dialer_getopt(
- d, NNG_OPT_URL, ustr, &sz) == 0) {
- printf("Connected to: %s\n", ustr);
- }
- }
- break;
- case OPT_LISTEN:
- case OPT_LISTEN_IPC:
- case OPT_LISTEN_LOCAL:
- rv = nng_listener_create(&l, sock, a->val);
- if (rv != 0) {
- fatal("Unable to create listener for %s: %s",
- a->val, nng_strerror(rv));
- }
- rv = nng_listener_getopt_ptr(
- l, NNG_OPT_TLS_CONFIG, (void **) &tls);
- if (rv == 0) {
- configtls(tls);
- } else if (rv != NNG_ENOTSUP) {
- fatal("Unable to get TLS config: %s",
- nng_strerror(rv));
- }
- if (zthome != NULL) {
- rv = nng_listener_set(l, NNG_OPT_ZT_HOME,
- zthome, strlen(zthome) + 1);
- if ((rv != 0) && (rv != NNG_ENOTSUP)) {
- fatal("Unable to set ZT home: %s",
- nng_strerror(rv));
- }
- }
- rv = nng_listener_start(l, async);
- act = "listen";
- if ((rv == 0) && (verbose == OPT_VERBOSE)) {
- char ustr[256];
- size_t sz;
- sz = sizeof(ustr);
- if (nng_listener_getopt(
- l, NNG_OPT_URL, ustr, &sz) == 0) {
- printf("Listening at: %s\n", ustr);
- }
- }
- break;
- default:
- fatal("Invalid address mode! (Bug!)");
- }
-
- if (rv != 0) {
- fatal("Unable to %s on %s: %s", act, a->val,
- nng_strerror(rv));
- }
- }
-
- switch (proto) {
- case OPT_SUB0:
- case OPT_PULL0:
- recvloop(sock);
- break;
- case OPT_REP0:
- case OPT_RESPOND0:
- if (data == NULL) {
- recvloop(sock);
- } else {
- resploop(sock);
- }
- break;
- case OPT_PUSH0:
- case OPT_PUB0:
- sendloop(sock);
- break;
- case OPT_BUS0:
- case OPT_PAIR0:
- case OPT_PAIR1:
- if (data != NULL) {
- sendrecv(sock);
- } else {
- recvloop(sock);
- }
- break;
- case OPT_REQ0:
- case OPT_SURVEY0:
- sendrecv(sock);
- break;
- default:
- fatal("Protocol handling unimplemented.");
- }
-
- exit(0);
-}
diff --git a/tools/nngcat/nngcat_ambiguous_test.sh b/tools/nngcat/nngcat_ambiguous_test.sh
deleted file mode 100755
index 414b6d19..00000000
--- a/tools/nngcat/nngcat_ambiguous_test.sh
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/bin/bash
-
-#
-# Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
-# Copyright 2018 Capitar IT Group BV <info@capitar.com>
-#
-# This software is supplied under the terms of the MIT License, a
-# copy of which should be located in the distribution where this
-# file was obtained (LICENSE.txt). A copy of the license may also be
-# found online at https://opensource.org/licenses/MIT.
-#
-
-NNGCAT=${NNGCAT:=$1}
-NNGCAT=${NNGCAT:-./nngcat}
-CMD="${NNGCAT} --re --dial=tcp://127.0.0.1:27272"
-
-echo -n "Verify ambiguous options fail: "
-if ${CMD} >/dev/null 2>&1
-then
- echo "Failed: ambigous accepted"
- exit 1
-fi
-x=$(${CMD} 2>&1)
-if [[ ${x} =~ "ambiguous" ]]
-then
- echo "pass"
- exit 0
-fi
-
-echo "Failed: error did not match"
-exit 1
diff --git a/tools/nngcat/nngcat_async_test.sh b/tools/nngcat/nngcat_async_test.sh
deleted file mode 100755
index 2b03e522..00000000
--- a/tools/nngcat/nngcat_async_test.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash
-
-#
-# Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
-# Copyright 2018 Capitar IT Group BV <info@capitar.com>
-#
-# This software is supplied under the terms of the MIT License, a
-# copy of which should be located in the distribution where this
-# file was obtained (LICENSE.txt). A copy of the license may also be
-# found online at https://opensource.org/licenses/MIT.
-#
-
-NNGCAT=${NNGCAT:=$1}
-NNGCAT=${NNGCAT:-./nngcat}
-ADDR="ipc:///tmp/nngcat_async_test"
-
-echo -n "Verify async connect: "
-
-${NNGCAT} --async -d 1 --connect ${ADDR} --req0 -D "ping" &
-
-
-answer=$( ${NNGCAT} --rep0 --recv-timeout=3 --listen ${ADDR} -D "pong" --ascii 2>/dev/null )
-
-if [[ ${answer} == "ping" ]]
-then
- echo "pass"
- exit 0
-fi
-
-echo "Failed: req did not match"
-echo "RES: $answer"
-exit 1
diff --git a/tools/nngcat/nngcat_dup_proto_test.sh b/tools/nngcat/nngcat_dup_proto_test.sh
deleted file mode 100755
index 1513d01c..00000000
--- a/tools/nngcat/nngcat_dup_proto_test.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/bash
-
-#
-# Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
-# Copyright 2018 Capitar IT Group BV <info@capitar.com>
-#
-# This software is supplied under the terms of the MIT License, a
-# copy of which should be located in the distribution where this
-# file was obtained (LICENSE.txt). A copy of the license may also be
-# found online at https://opensource.org/licenses/MIT.
-#
-
-NNGCAT=${NNGCAT:=$1}
-NNGCAT=${NNGCAT:-./nngcat}
-
-echo -n "Verify only a single protocol is allowed: "
-if ${NNGCAT} --pub0 --sub0 --dial=tcp://127.0.0.1:8989 >/dev/null 2>&1
-then
- echo "Failed: duplicate protocols accepted"
- exit 1
-fi
-echo "pass"
-exit 0
diff --git a/tools/nngcat/nngcat_help_test.sh b/tools/nngcat/nngcat_help_test.sh
deleted file mode 100755
index 95ed9e3e..00000000
--- a/tools/nngcat/nngcat_help_test.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash
-
-#
-# Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
-# Copyright 2018 Capitar IT Group BV <info@capitar.com>
-#
-# This software is supplied under the terms of the MIT License, a
-# copy of which should be located in the distribution where this
-# file was obtained (LICENSE.txt). A copy of the license may also be
-# found online at https://opensource.org/licenses/MIT.
-#
-
-NNGCAT=${NNGCAT:=$1}
-NNGCAT=${NNGCAT:-./nngcat}
-
-echo -n "Verify nngcat help: "
-if ${NNGCAT} --help >/dev/null 2>&1
-then
- echo "Failed: help didn't return 1"
- exit 1
-fi
-x=$(${NNGCAT} --help 2>&1)
-if [[ ${x} =~ "Usage:" ]]
-then
- echo "pass"
- exit 0
-fi
-
-echo "Failed: usage did not match"
-echo "Output:"
-echo "$x"
-exit 1
diff --git a/tools/nngcat/nngcat_incompat_test.sh b/tools/nngcat/nngcat_incompat_test.sh
deleted file mode 100755
index 128b57ba..00000000
--- a/tools/nngcat/nngcat_incompat_test.sh
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/bin/sh
-
-#
-# Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
-# Copyright 2018 Capitar IT Group BV <info@capitar.com>
-#
-# This software is supplied under the terms of the MIT License, a
-# copy of which should be located in the distribution where this
-# file was obtained (LICENSE.txt). A copy of the license may also be
-# found online at https://opensource.org/licenses/MIT.
-#
-
-NNGCAT=${NNGCAT:=$1}
-NNGCAT=${NNGCAT:-./nngcat}
-
-echo "Verify incompatible options: "
-
-# Just bind something to this so other ones connect
-${NNGCAT} --pull0 --ascii -X /tmp/bogusipc &
-pid=$!
-
-trap "kill $pid && wait $pid 2>/dev/null" 0
-
-echo -n " --subscribe doesn't work with non-sub"
-if ${NNGCAT} --req0 -x /tmp/bogusipc --subscribe=oops >/dev/null 2>&1
-then
- echo "fail"
- exit 1
-fi
-echo "pass"
-
-echo -n " --interval doesn't work with recv only: "
-if ${NNGCAT} --interval 1 --pull -x /tmp/bogusipc >/dev/null 2>&1
-then
- echo "fail"
- exit 1
-fi
-echo "pass"
-
-echo -n " --pair1 doesn't work with --compat: "
-if ${NNGCAT} --compat --pair1 -x /tmp/bogusipc >/dev/null 2>&1
-then
- echo "fail"
- exit 1
-fi
-echo "pass"
-
-echo -n " --count doesn't work with --compat: "
-if ${NNGCAT} --compat --count=1 --pair0 -x /tmp/bogusipc >/dev/null 2>&1
-then
- echo "fail"
- exit 1
-fi
-echo "pass"
-
-echo -n " --count fails with non-integer: "
-if ${NNGCAT} --count=xyz --pair0 -x /tmp/bogusipc >/dev/null 2>&1
-then
- echo "fail"
- exit 1
-fi
-echo "pass"
-
-echo -n " --file fails with non-existing file: "
-if ${NNGCAT} --async --file=/nosuchfilehere --push0 -x /tmp/bogusipc >/dev/null 2>&1
-then
- echo "fail"
- exit 1
-fi
-echo "pass"
-
-echo "PASS."
-exit 0
diff --git a/tools/nngcat/nngcat_need_proto_test.sh b/tools/nngcat/nngcat_need_proto_test.sh
deleted file mode 100755
index d6733cad..00000000
--- a/tools/nngcat/nngcat_need_proto_test.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/sh
-
-#
-# Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
-# Copyright 2018 Capitar IT Group BV <info@capitar.com>
-#
-# This software is supplied under the terms of the MIT License, a
-# copy of which should be located in the distribution where this
-# file was obtained (LICENSE.txt). A copy of the license may also be
-# found online at https://opensource.org/licenses/MIT.
-#
-
-NNGCAT=${NNGCAT:=$1}
-NNGCAT=${NNGCAT:-./nngcat}
-
-echo -n "Verify a protocol is needed: "
-if ${NNGCAT} --dial=tcp://127.0.0.1:8989 >/dev/null 2>&1
-then
- echo "Failed: protocol should be required"
- exit 1
-fi
-echo "pass"
-exit 0
diff --git a/tools/nngcat/nngcat_pubsub_test.sh b/tools/nngcat/nngcat_pubsub_test.sh
deleted file mode 100755
index b9ba90ed..00000000
--- a/tools/nngcat/nngcat_pubsub_test.sh
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/bin/bash
-
-#
-# Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
-# Copyright 2018 Capitar IT Group BV <info@capitar.com>
-#
-# This software is supplied under the terms of the MIT License, a
-# copy of which should be located in the distribution where this
-# file was obtained (LICENSE.txt). A copy of the license may also be
-# found online at https://opensource.org/licenses/MIT.
-#
-
-NNGCAT=${NNGCAT:=$1}
-NNGCAT=${NNGCAT:-./nngcat}
-ADDR="ipc:///tmp/nngcat_pub_sub_test"
-OUTPUT=/tmp/nngcat_pubsub_test.$$.out
-
-echo -n "Verify pub sub: "
-
-trap "rm $OUTPUT" 0
-
-${NNGCAT} --listen ${ADDR} --count=3 --recv-timeout=20 --sub0 --subscribe=one --subscribe=two --quoted > $OUTPUT 2>/dev/null &
-sleep 1
-# for speed of execution, run these in the background, they should be ignored
-${NNGCAT} -d 1 --connect ${ADDR} --pub0 --data "xyz" &
-${NNGCAT} -d 1 --connect ${ADDR} --pub0 -D "none swam" &
-# these we care about, due to ordering (checksum) so run them serially
-${NNGCAT} -d 1 --connect ${ADDR} --pub0 -D "one flew"
-${NNGCAT} -d 1 --connect ${ADDR} --pub0 --data "twofer test"
-${NNGCAT} -d 1 --connect ${ADDR} --pub0 --data "one more"
-
-wait $bgid 2>/dev/null
-
-sum=$(cksum ${OUTPUT})
-sum=${sum%% *}
-if [[ ${sum} == 3929078614 ]]
-then
- echo "pass"
- exit 0
-fi
-echo "FAIL: Checksum failed (Wanted 3929078614 got ${sum})"
-echo "OUTPUT:"
-cat ${OUTPUT}
-
-exit 1
diff --git a/tools/nngcat/nngcat_recvmaxsz_test.sh b/tools/nngcat/nngcat_recvmaxsz_test.sh
deleted file mode 100755
index b5d4ff4a..00000000
--- a/tools/nngcat/nngcat_recvmaxsz_test.sh
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/bin/bash
-
-#
-# Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
-# Copyright 2018 Capitar IT Group BV <info@capitar.com>
-#
-# This software is supplied under the terms of the MIT License, a
-# copy of which should be located in the distribution where this
-# file was obtained (LICENSE.txt). A copy of the license may also be
-# found online at https://opensource.org/licenses/MIT.
-#
-
-NNGCAT=${NNGCAT:=$1}
-NNGCAT=${NNGCAT:-./nngcat}
-ADDR="ipc:///tmp/nngcat_recvmaxsz_test"
-OUTPUT=/tmp/nngcat_recvmaxsz_test.$$.out
-
-echo -n "Verify maximum receive size: "
-
-trap "rm $OUTPUT" 0
-
-${NNGCAT} --listen ${ADDR} --count=3 --recv-maxsz=5 --pull0 --quoted > $OUTPUT 2>/dev/null &
-sleep 1
-# for speed of execution, run these in the background, they should be ignored
-${NNGCAT} --connect ${ADDR} --push0 --data "one"
-${NNGCAT} --connect ${ADDR} --push0 --data "55555"
-${NNGCAT} --connect ${ADDR} --push0 --data "666666"
-${NNGCAT} --connect ${ADDR} --push0 --data "7777777"
-${NNGCAT} --connect ${ADDR} --push0 --data "88888"
-
-wait $bgid 2>/dev/null
-
-sum=$(cksum ${OUTPUT})
-sum=${sum%% *}
-
-# This matches 3 lines of "one", "55555", "88888".
-if [[ ${sum} == 4122906158 ]]
-then
- echo "pass"
- exit 0
-fi
-echo "FAIL: Checksum failed (Wanted 3929078614 got ${sum})"
-echo "OUTPUT:"
-cat ${OUTPUT}
-
-exit 1
diff --git a/tools/nngcat/nngcat_stdin_pipe_test.sh b/tools/nngcat/nngcat_stdin_pipe_test.sh
deleted file mode 100755
index 5fec0ab7..00000000
--- a/tools/nngcat/nngcat_stdin_pipe_test.sh
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/bin/bash
-
-#
-# Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
-# Copyright 2018 Capitar IT Group BV <info@capitar.com>
-# Copyright 2020 Lager Data, Inc. <support@lagerdata.com>
-#
-# This software is supplied under the terms of the MIT License, a
-# copy of which should be located in the distribution where this
-# file was obtained (LICENSE.txt). A copy of the license may also be
-# found online at https://opensource.org/licenses/MIT.
-#
-
-NNGCAT=${NNGCAT:=$1}
-NNGCAT=${NNGCAT:-./nngcat}
-ADDR="ipc:///tmp/nngcat_stdin_pipe_test"
-OUTPUT=/tmp/nngcat_stdin_pipe_test.$$.out
-
-echo -n "Verify reading from stdin pipe: "
-
-trap "rm $OUTPUT" 0
-
-${NNGCAT} --listen ${ADDR} --count=1 --recv-timeout=3 --recv-maxsz=0 --pull0 --raw > $OUTPUT 2>/dev/null &
-bgid=$!
-
-sleep 1
-# for speed of execution, run these in the background, they should be ignored
-echo "hello world" | ${NNGCAT} --connect ${ADDR} --delay=1 --push0 --file -
-wait "$bgid" 2>/dev/null
-
-sum=$(cksum ${OUTPUT})
-sum=${sum%% *}
-
-# This matches "hello world\n" since echo adds a trailing newline
-if [[ ${sum} == 3733384285 ]]
-then
- echo "pass"
- exit 0
-fi
-echo "FAIL: Checksum failed (Wanted 3733384285 got ${sum})"
-echo "OUTPUT:"
-ls -la ${OUTPUT}
-
-exit 1
diff --git a/tools/nngcat/nngcat_unlimited_test.sh b/tools/nngcat/nngcat_unlimited_test.sh
deleted file mode 100755
index 0486b9b1..00000000
--- a/tools/nngcat/nngcat_unlimited_test.sh
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/bin/bash
-
-#
-# Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
-# Copyright 2018 Capitar IT Group BV <info@capitar.com>
-#
-# This software is supplied under the terms of the MIT License, a
-# copy of which should be located in the distribution where this
-# file was obtained (LICENSE.txt). A copy of the license may also be
-# found online at https://opensource.org/licenses/MIT.
-#
-
-NNGCAT=${NNGCAT:=$1}
-NNGCAT=${NNGCAT:-./nngcat}
-ADDR="ipc:///tmp/nngcat_unlimited_test"
-INPUT=/tmp/nngcat_unlimited_test.$$.in
-OUTPUT=/tmp/nngcat_unlimited_test.$$.out
-
-echo -n "Verify unlimited receive size: "
-
-trap "rm $OUTPUT $INPUT" 0
-
-# 4 MB
-dd if=/dev/urandom of=${INPUT} bs=1024 count=4096 >/dev/null 2>&1
-goodsum=$(cksum ${INPUT})
-goodsum=${goodsum%% *}
-
-${NNGCAT} --listen ${ADDR} --count=1 --recv-maxsz=0 --pull0 --raw > $OUTPUT 2>/dev/null &
-sleep 1
-# for speed of execution, run these in the background, they should be ignored
-${NNGCAT} --connect ${ADDR} --delay=1 --push0 --file ${INPUT}
-wait $bgid 2>/dev/null
-
-sum=$(cksum ${OUTPUT})
-sum=${sum%% *}
-
-if [[ ${sum} == ${goodsum} ]]
-then
- echo "pass"
- exit 0
-fi
-echo "FAIL: Checksum failed (Wanted ${goodsum} got ${sum})"
-echo "OUTPUT:"
-ls -la ${OUTPUT}
-
-exit 1
diff --git a/tools/pubrefman/README.adoc b/tools/pubrefman/README.adoc
deleted file mode 100644
index a8929df9..00000000
--- a/tools/pubrefman/README.adoc
+++ /dev/null
@@ -1,10 +0,0 @@
-= pubrefman
-
-This directory contains a tool to publish (update) the reference manual
-on the NNG documentation site.
-
-Run it with --help for options. You can build it with Go.
-
-It normally uploads to github, and will require a working SSH agent.
-
-If you're not a project maintainer, you probably don't need this tool.
diff --git a/tools/pubrefman/go.mod b/tools/pubrefman/go.mod
deleted file mode 100644
index b181f172..00000000
--- a/tools/pubrefman/go.mod
+++ /dev/null
@@ -1,11 +0,0 @@
-module go.nanomsg.org/nng/pubrefman
-
-go 1.14
-
-require (
- github.com/bytesparadise/libasciidoc v0.3.1-0.20200802124845-5dcda3220c31
- github.com/go-git/go-billy/v5 v5.0.0
- github.com/go-git/go-git/v5 v5.1.0
- github.com/google/uuid v1.1.1
- github.com/spf13/jwalterweatherman v1.0.0
-)
diff --git a/tools/pubrefman/go.sum b/tools/pubrefman/go.sum
deleted file mode 100644
index 3d9237e3..00000000
--- a/tools/pubrefman/go.sum
+++ /dev/null
@@ -1,277 +0,0 @@
-cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
-github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs=
-github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
-github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 h1:smF2tmSOzy2Mm+0dGI2AIUHY+w0BUc+4tn40djz7+6U=
-github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI=
-github.com/alecthomas/chroma v0.7.1 h1:G1i02OhUbRi2nJxcNkwJaY/J1gHXj9tt72qN6ZouLFQ=
-github.com/alecthomas/chroma v0.7.1/go.mod h1:gHw09mkX1Qp80JlYbmN9L3+4R5o6DJJ3GRShh+AICNc=
-github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721 h1:JHZL0hZKJ1VENNfmXvHbgYlbUOvpzYzvy2aZU5gXVeo=
-github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0=
-github.com/alecthomas/kong v0.2.1-0.20190708041108-0548c6b1afae/go.mod h1:+inYUSluD+p4L8KdviBSgzcqEjUQOfC5fQDRFuc36lI=
-github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY=
-github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ=
-github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
-github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=
-github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
-github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
-github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
-github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
-github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
-github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
-github.com/bytesparadise/libasciidoc v0.3.1-0.20200802124845-5dcda3220c31 h1:Rf+HhYMHL9wl4nKv8Jgy5ss8Pksii1TWCgZIP6Cr1qE=
-github.com/bytesparadise/libasciidoc v0.3.1-0.20200802124845-5dcda3220c31/go.mod h1:kWkgc6KJVCDUT2QlPbYIlYspvy0+3vuWriL0kV2NDig=
-github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
-github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
-github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
-github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
-github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
-github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
-github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
-github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ=
-github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk=
-github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
-github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
-github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
-github.com/dlclark/regexp2 v1.1.6 h1:CqB4MjHw0MFCDj+PHHjiESmHX+N7t0tJzKvC6M97BRg=
-github.com/dlclark/regexp2 v1.1.6/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
-github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
-github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
-github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ=
-github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
-github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
-github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0=
-github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
-github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4=
-github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E=
-github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agRrHM=
-github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
-github.com/go-git/go-git-fixtures/v4 v4.0.1 h1:q+IFMfLx200Q3scvt2hN79JsEzy4AmBTp/pqnefH+Bc=
-github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw=
-github.com/go-git/go-git/v5 v5.1.0 h1:HxJn9g/E7eYvKW3Fm7Jt4ee8LXfPOm/H1cdDu8vEssk=
-github.com/go-git/go-git/v5 v5.1.0/go.mod h1:ZKfuPUoY1ZqIG4QG9BDBh3G4gLM5zvPuSJAozQrZuyM=
-github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
-github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
-github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
-github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
-github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
-github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
-github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
-github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
-github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
-github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
-github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
-github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
-github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
-github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg=
-github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
-github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
-github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
-github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
-github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
-github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
-github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY=
-github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
-github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
-github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
-github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=
-github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
-github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
-github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
-github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
-github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
-github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
-github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
-github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
-github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
-github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
-github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
-github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/mna/pigeon v1.0.1-0.20200224192238-18953b277063 h1:V7s6vhIrNeOqocziAmRoVJh6gnPPx83ovlpT7Hf5shI=
-github.com/mna/pigeon v1.0.1-0.20200224192238-18953b277063/go.mod h1:rkFeDZ0gc+YbnrXPw0q2RlI0QRuKBBPu67fgYIyGRNg=
-github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5 h1:8Q0qkMVC/MmWkpIdlvZgcv2o2jrlF6zqVOh7W5YHdMA=
-github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8=
-github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
-github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
-github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
-github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU=
-github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
-github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
-github.com/onsi/gomega v1.9.0 h1:R1uwffexN6Pr340GtYRIdZmAiN4J+iw6WG4wog1DUXg=
-github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
-github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
-github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
-github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
-github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
-github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
-github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
-github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
-github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
-github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
-github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
-github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
-github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
-github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo=
-github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
-github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I=
-github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
-github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
-github.com/sozorogami/gover v0.0.0-20171022184752-b58185e213c5 h1:TAPeDBsd52dRWoWzf5trgBzxzMYHTYjYI+4xNyCdoCU=
-github.com/sozorogami/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:nHNlDYIQZn44RvqH0kCpl/dMMVWXkav0QIgzGxV1Ab4=
-github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
-github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
-github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
-github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
-github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
-github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
-github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
-github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
-github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
-github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
-github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
-github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
-github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
-github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70=
-github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4=
-github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
-github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
-github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
-go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
-go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
-golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073 h1:xMPOj6Pz6UipU1wXLkrtqpHbR0AVFnyPEQq/wRWz9lM=
-golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
-golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
-golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
-golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0=
-golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4=
-golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 h1:uYVVQ9WP/Ds2ROhcaGPeIdVq0RIXVLwsHlnvJ+cT1So=
-golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884=
-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
-golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
-golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190830223141-573d9926052a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6 h1:nULzSsKgihxFGLnQFv2T7lE5vIhOtg8ZPpJHapEt7o0=
-golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
-gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
-gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
-gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
-gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
-gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
-gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
-gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
-gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
-gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
-gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
-gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
-gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
-gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
-gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
diff --git a/tools/pubrefman/pubrefman.go b/tools/pubrefman/pubrefman.go
deleted file mode 100644
index 9ed3f5af..00000000
--- a/tools/pubrefman/pubrefman.go
+++ /dev/null
@@ -1,493 +0,0 @@
-// Copyright 2020 Staysail Systems, Inc.
-//
-// This software is supplied under the terms of the MIT License, a
-// copy of which should be located in the distribution where this
-// file was obtained (LICENSE.txt). A copy of the license may also be
-// found online at https://opensource.org/licenses/MIT.
-//
-
-package main
-
-import (
- "context"
- "flag"
- "fmt"
- "io/ioutil"
- "log"
- "os"
- "path"
- "sort"
- "strings"
- "time"
-
- "github.com/bytesparadise/libasciidoc"
- "github.com/bytesparadise/libasciidoc/pkg/configuration"
- "github.com/go-git/go-billy/v5"
- "github.com/go-git/go-billy/v5/memfs"
- "github.com/go-git/go-git/v5"
- "github.com/go-git/go-git/v5/plumbing"
- "github.com/go-git/go-git/v5/plumbing/object"
- "github.com/go-git/go-git/v5/storage/memory"
- "github.com/google/uuid"
- jww "github.com/spf13/jwalterweatherman"
-)
-
-type Configuration struct {
- Version string
- Debug bool
- Trace bool
- Quiet bool
- DryRun bool
- Author string
- Email string
- Url string
- Message string
-}
-
-var Config Configuration
-
-func init() {
- flag.StringVar(&Config.Version, "v", "tip", "Version to publish")
- flag.BoolVar(&Config.Debug, "d", false, "Enable debugging")
- flag.BoolVar(&Config.Trace, "t", false, "Enable tracing")
- flag.BoolVar(&Config.Quiet, "q", false, "Run quietly")
- flag.BoolVar(&Config.DryRun, "n", false, "Dry run, does not push changes")
- flag.StringVar(&Config.Url, "u", "ssh://git@github.com/nanomsg/nng.git", "URL of repo to publish from")
- flag.StringVar(&Config.Email, "E", "info@staysail.tech", "Author email for commit")
- flag.StringVar(&Config.Author, "A", "Staysail Systems, Inc.", "Author name for commit")
- flag.StringVar(&Config.Message, "m", "", "Commit message")
-}
-
-func (g *Global) CheckError(err error, prefix string, args ...interface{}) {
- if err == nil {
- g.Log.TRACE.Printf("%s: ok", fmt.Sprintf(prefix, args...))
- return
- }
- g.Log.FATAL.Fatalf("Error: %s: %v", fmt.Sprintf(prefix, args...), err)
-}
-
-func (g *Global) Fatal(format string, args ...interface{}) {
- g.Log.FATAL.Fatalf("Error: %s", fmt.Sprintf(format, args...))
-}
-
-type Section struct {
- Name string
- Synopsis string
- Description string
- Pages []*Page
-}
-
-type Page struct {
- Name string
- Section string
- Description string
- Content string
-}
-
-type Global struct {
- Config Configuration
- SrcFs billy.Filesystem
- DstFs billy.Filesystem
- DstDir string
- LaConfig configuration.Configuration
- Sections map[string]*Section
- Pages map[string]*Page
- Repo *git.Repository
- Index string
- ToC string
- Added map[string]bool
- WorkTree *git.Worktree
- Branch string
- OldHash plumbing.Hash
- NewHash plumbing.Hash
- Log *jww.Notepad
-}
-
-func (g *Global) Init() {
- g.Config = Config
- g.Sections = make(map[string]*Section)
- g.Pages = make(map[string]*Page)
- g.Added = make(map[string]bool)
- g.SrcFs = memfs.New()
- g.DstFs = memfs.New()
- g.DstDir = path.Join("man", g.Config.Version)
- g.LaConfig = configuration.Configuration{
- AttributeOverrides: map[string]string{
- "nofooter": "yes",
- "icons": "font",
- "linkcss": "yes",
- "source-highlighter": "pygments",
- },
- }
- thresh := jww.LevelInfo
- if g.Config.Quiet {
- thresh = jww.LevelError
- }
- if g.Config.Debug {
- thresh = jww.LevelDebug
- }
- if g.Config.Trace {
- thresh = jww.LevelTrace
- }
- g.Log = jww.NewNotepad(thresh, thresh, os.Stdout, ioutil.Discard, "", log.Ldate|log.Ltime)
-}
-
-func (g *Global) Destroy() {
-}
-
-func (g *Global) Debug(format string, args ...interface{}) {
- g.Log.DEBUG.Printf(format, args...)
-}
-
-func (g *Global) Print(format string, args ...interface{}) {
- g.Log.INFO.Printf(format, args...)
-}
-
-func (g *Global) CloneSource() {
- tag := g.Config.Version
- if tag == "" || tag == "tip" {
- tag = "master"
- }
- ref := plumbing.NewBranchReferenceName(tag)
- if strings.HasPrefix(tag, "v") {
- ref = plumbing.NewTagReferenceName(tag)
- }
- ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
- defer cancel()
-
- now := time.Now()
- _, err := git.CloneContext(ctx, memory.NewStorage(), g.SrcFs, &git.CloneOptions{
- URL: g.Config.Url,
- ReferenceName: ref,
- })
- g.CheckError(err, "clone source")
- g.Debug("Cloned source (%s) in %v", tag, time.Since(now))
-}
-
-func (g *Global) ClonePages() {
- ref := plumbing.NewBranchReferenceName("gh-pages")
- ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
- defer cancel()
-
- now := time.Now()
- repo, err := git.CloneContext(ctx, memory.NewStorage(), g.DstFs, &git.CloneOptions{
- URL: g.Config.Url,
- ReferenceName: ref,
- RemoteName: "origin",
- })
- g.CheckError(err, "clone gh-pages")
- g.Repo = repo
- g.Debug("Cloned pages in %v", time.Since(now))
-}
-
-func (g *Global) ProcessManPage(page os.FileInfo) {
- source := g.ReadFile(page.Name())
- // Let's look for the description
- inName := false
- desc := ""
- name := ""
- for _, line := range strings.Split(source, "\n") {
- line = strings.TrimRight(line, " \t\r")
- if line == "" {
- continue
- }
- if line == "== NAME" {
- inName = true
- continue
- }
- if inName {
- w := strings.SplitN(line, " - ", 2)
- if len(w) != 2 || w[1] == "" {
- g.Fatal("page %s NAME malformed", page.Name())
- }
- name = w[0]
- desc = w[1]
- strings.TrimSpace(name)
- strings.TrimSpace(desc)
- break
- }
- }
-
- if desc == "" {
- g.Fatal("page %s NAME missing", page.Name())
- }
-
- html := &strings.Builder{}
-
- // Emit the title, as we are not letting libasciidoc do it (stripping headers)
- cfg := g.LaConfig
- cfg.Filename = page.Name()
- cfg.LastUpdated = page.ModTime()
- metadata, err := libasciidoc.Convert(strings.NewReader(source), html, cfg)
- g.CheckError(err, "processing page %s", page.Name())
- w := strings.SplitN(metadata.Title, "(", 2)
- sect := strings.TrimSuffix(w[1], ")")
- if len(w) != 2 || name != w[0] || !strings.HasSuffix(w[1], ")") {
- g.Fatal("page %s title incorrect (%s)", page.Name(), name)
- }
- if page.Name() != name+"."+sect+".adoc" {
- g.Fatal("page %s(%s) does not match file name %s", name, sect, page.Name())
- }
- result := &strings.Builder{}
- _, _ = fmt.Fprintf(result, "---\n")
- _, _ = fmt.Fprintf(result, "version: %s\n", g.Config.Version)
- _, _ = fmt.Fprintf(result, "layout: %s\n", "manpage_v2")
- _, _ = fmt.Fprintf(result, "---\n")
- _, _ = fmt.Fprintf(result, "<h1>%s(%s)</h1>\n", name, sect)
- result.WriteString(html.String())
-
- g.Pages[page.Name()] = &Page{
- Name: name,
- Section: sect,
- Description: desc,
- Content: result.String(),
- }
- g.Log.TRACE.Printf("HTML for %s:\n%s\n", name, result.String())
-}
-
-func (g *Global) ReadFile(name string) string {
- f, err := g.SrcFs.Open(path.Join("docs/man", name))
- g.CheckError(err, "open file %s", name)
- b, err := ioutil.ReadAll(f)
- g.CheckError(err, "read file %s", name)
- return string(b)
-}
-
-func (g *Global) LoadSection(name string) {
- section := strings.TrimPrefix(name, "man")
-
- g.Sections[section] = &Section{
- Name: section,
- Synopsis: g.ReadFile(name + ".sect"),
- Description: g.ReadFile(name + ".desc"),
- }
-}
-
-func (g *Global) ProcessSource() {
- pages, err := g.SrcFs.ReadDir("docs/man")
- g.CheckError(err, "reading source directory")
- count := 0
- g.Debug("Total of %d files in man directory", len(pages))
- now := time.Now()
- for _, page := range pages {
- if page.IsDir() {
- continue
- }
- if strings.HasSuffix(page.Name(), ".sect") {
- g.LoadSection(strings.TrimSuffix(page.Name(), ".sect"))
- }
- if !strings.HasSuffix(page.Name(), ".adoc") {
- continue
- }
- g.ProcessManPage(page)
- count++
- }
- g.Debug("Processed %d pages in %v", count, time.Since(now))
-}
-
-func (g *Global) GenerateToC() {
- toc := &strings.Builder{}
- idx := &strings.Builder{}
-
- for _, page := range g.Pages {
- if sect := g.Sections[page.Section]; sect == nil {
- g.Fatal("page %s section %s not found", page.Name, page.Section)
- } else {
- sect.Pages = append(sect.Pages, page)
- }
- }
-
- var sects []string
- for name, sect := range g.Sections {
- sects = append(sects, name)
- sort.Slice(sect.Pages, func(i, j int) bool { return sect.Pages[i].Name < sect.Pages[j].Name })
- }
- sort.Strings(sects)
-
- // And also the index page.
-
- // Emit the toc leader part
- toc.WriteString("<nav id=\"toc\" class=\"toc2\">\n")
- toc.WriteString("<div id=\"toctitle\">Table of Contents</div>\n")
- toc.WriteString("<ul class=\"sectlevel1\n\">\n")
-
- idx.WriteString("= NNG Reference Manual\n")
-
- for _, sect := range sects {
- s := g.Sections[sect]
- _, _ = fmt.Fprintf(toc, "<li>%s</li>\n", s.Synopsis)
- _, _ = fmt.Fprintf(toc, "<ul class=\"sectlevel2\">\n")
-
- _, _ = fmt.Fprintf(idx, "\n== Section %s: %s\n\n", s.Name, s.Synopsis)
- _, _ = fmt.Fprintln(idx, s.Description)
- _, _ = fmt.Fprintln(idx, "\n[cols=\"3,5\"]\n|===")
-
- for _, page := range s.Pages {
- _, _ = fmt.Fprintf(toc, "<li><a href=\"%s.%s.html\">%s</a></li>\n",
- page.Name, page.Section, page.Name)
- _, _ = fmt.Fprintf(idx, "|xref:%s.%s.adoc[%s(%s)]\n", page.Name, page.Section,
- page.Name, page.Section)
- _, _ = fmt.Fprintf(idx, "|%s\n", page.Description)
- }
-
- _, _ = fmt.Fprintf(toc, "</ul>\n")
- _, _ = fmt.Fprintln(idx, "|===")
- }
- _, _ = fmt.Fprintf(toc, "</ul>\n")
- _, _ = fmt.Fprintf(toc, "</nav>\n")
-
- index := &strings.Builder{}
- _, _ = fmt.Fprintf(index, "---\n")
- _, _ = fmt.Fprintf(index, "version: %s\n", g.Config.Version)
- _, _ = fmt.Fprintf(index, "layout: %s\n", "manpage_v2")
- _, _ = fmt.Fprintf(index, "---\n")
- _, _ = fmt.Fprintf(index, "<h1>NNG Reference Manual</h1>\n")
-
- cfg := g.LaConfig
- cfg.Filename = "index.adoc"
- _, err := libasciidoc.Convert(strings.NewReader(idx.String()), index, cfg)
- g.CheckError(err, "formatting index")
- g.Index = index.String()
- g.ToC = toc.String()
-}
-
-func (g *Global) CreateBranch() {
- brName := uuid.New().String()
- var err error
-
- refName := plumbing.ReferenceName("refs/heads/" + brName)
- g.Branch = brName
-
- g.WorkTree, err = g.Repo.Worktree()
- g.CheckError(err, "getting worktree")
-
- err = g.WorkTree.Checkout(&git.CheckoutOptions{
- Branch: refName,
- Create: true,
- })
- g.CheckError(err, "creating branch")
- g.Print("Checked out branch %v", brName)
- pr, err := g.Repo.Head()
- g.CheckError(err, "getting head hash")
- g.OldHash = pr.Hash()
-}
-
-func (g *Global) WriteFile(name string, content string) {
- full := path.Join(g.DstDir, name)
- f, err := g.DstFs.Create(full)
- g.CheckError(err, "creating file %s", name)
- _, err = f.Write([]byte(content))
- g.CheckError(err, "writing file %s", name)
- err = f.Close()
- g.CheckError(err, "closing file %s", name)
- g.Add(name)
-}
-
-func (g *Global) Add(name string) {
- g.Log.TRACE.Printf("Adding file %s", name)
- g.Added[name] = true
-}
-
-func (g *Global) Delete(name string) {
- g.Debug("Removing file %s", name)
- _, err := g.WorkTree.Remove(path.Join(g.DstDir, name))
- g.CheckError(err, "removing file %s", name)
-}
-
-func (g *Global) Commit() {
- if status, err := g.WorkTree.Status(); status == nil {
- g.CheckError(err, "obtaining status")
- } else if status.IsClean() {
- g.Print("No changes to commit.")
- return
- }
- message := g.Config.Message
- if message == "" {
- message = "Manual page updates for " + g.Config.Version
- }
- var err error
- g.NewHash, err = g.WorkTree.Commit(message, &git.CommitOptions{
- Author: &object.Signature{
- Email: g.Config.Email,
- Name: g.Config.Author,
- When: time.Now(),
- },
- })
- g.CheckError(err, "committing branch")
-}
-
-func (g *Global) Push() {
- if g.NewHash.IsZero() {
- g.Print("Nothing to push.")
- return
- }
-
- ci, err := g.Repo.Log(&git.LogOptions{
- From: g.NewHash,
- })
- g.CheckError(err, "getting commit log")
- commit, err := ci.Next()
- g.CheckError(err,"getting single commit")
- if commit != nil {
- g.Print(commit.String())
- if fs, _ := commit.Stats(); fs != nil {
- g.Debug(fs.String())
- }
- }
- if g.Config.DryRun {
- g.Print("Not pushing changes (dry-run mode.)")
- } else {
- err := g.Repo.Push(&git.PushOptions{
- RemoteName: "origin",
- })
- g.CheckError(err, "pushing changes")
- g.Print("Pushed branch %v\n", g.Branch)
- }
-}
-
-func (g *Global) WriteOutput() {
-
- for _, p := range g.Pages {
- fName := fmt.Sprintf("%s.%s.html", p.Name, p.Section)
- g.WriteFile(fName, p.Content)
- }
- g.WriteFile("_toc.html", g.ToC)
- g.WriteFile("index.html", g.Index)
-
- _, err := g.WorkTree.Add(g.DstDir)
- g.CheckError(err, "adding directory")
- files, err := g.DstFs.ReadDir(g.DstDir)
- g.CheckError(err, "scanning destination directory")
- for _, file := range files {
- if file.IsDir() {
- continue
- }
- if g.Added[file.Name()] {
- continue
- }
- g.Delete(file.Name())
- }
- status, err := g.WorkTree.Status()
- g.CheckError(err, "obtaining commit status")
- if !status.IsClean() {
- g.Debug("No changes.")
- } else {
- g.Debug(status.String())
- }
-}
-
-func main() {
- g := &Global{}
- flag.Parse()
- g.Init()
- defer g.Destroy()
-
- g.CloneSource()
- g.ClonePages()
- g.ProcessSource()
- g.GenerateToC()
- g.CreateBranch()
- g.WriteOutput()
- g.Commit()
- g.Push()
-}