linux-qubasis

linux oasis port as a qubes template

git clone https://9o.is/git/linux-qubasis.git

commit a45b955c3f74f85fed4be9d552595ef5db42073e
parent 6731828b2b69a83a4e182660e6dedad43b1b753d
Author: Jul <jul@9o.is>
Date:   Sat,  8 Nov 2025 07:01:08 -0500

remove dvtm

Diffstat:
M.gitmodules | 4----
Dpkg/dvtm/build | 25-------------------------
Dpkg/dvtm/config.h | 171-------------------------------------------------------------------------------
Dpkg/dvtm/config.mk | 10----------
Dpkg/dvtm/patches/0001-customize-personal-UI.patch | 284-------------------------------------------------------------------------------
Dpkg/dvtm/patches/0002-allow-focusing-left-right-fullscreen.patch | 25-------------------------
Dpkg/dvtm/patches/0003-add-client-child-process-count-to-status-bar.patch | 84-------------------------------------------------------------------------------
Dpkg/dvtm/repo | 1-
8 files changed, 0 insertions(+), 604 deletions(-)

diff --git a/.gitmodules b/.gitmodules @@ -7,10 +7,6 @@ path = pkg/yash/repo url = https://github.com/magicant/yash.git ignore = all -[submodule "dvtm"] - path = pkg/dvtm/repo - url = https://github.com/martanne/dvtm.git - ignore = all [submodule "abduco"] path = pkg/abduco/repo url = https://github.com/martanne/abduco.git diff --git a/pkg/dvtm/build b/pkg/dvtm/build @@ -1,25 +0,0 @@ -#!/bin/sh -set -euo pipefail - -gitref="7bcf43f" -repodir="$srcdir/repo" - -if [ "$skip_clean" != "true" ]; then - git -C "$repodir" clean -dx - git -C "$repodir" reset --hard "$gitref" - - for patch in $srcdir/patches/*.patch; do - git -C "$repodir" am --no-gpg-sign "$patch" - done -fi - -rm -rf "$outdir" -cp "$srcdir/config.h" "$repodir" -cp "$srcdir/config.mk" "$repodir" - -make -C "$repodir" -make DESTDIR="$outdir" -C "$repodir" install - -if [ "$local_install" == "true" ]; then - sudo make -C "$repodir" install -fi diff --git a/pkg/dvtm/config.h b/pkg/dvtm/config.h @@ -1,171 +0,0 @@ -/* valid curses attributes are listed below they can be ORed - * - * A_NORMAL Normal display (no highlight) - * A_STANDOUT Best highlighting mode of the terminal. - * A_UNDERLINE Underlining - * A_REVERSE Reverse video - * A_BLINK Blinking - * A_DIM Half bright - * A_BOLD Extra bright or bold - * A_PROTECT Protected mode - * A_INVIS Invisible or blank mode - */ - -enum { - DEFAULT, - BLUE, -}; - -static Color colors[] = { - [DEFAULT] = { .fg = -1, .bg = -1, .fg256 = -1, .bg256 = -1, }, - [BLUE] = { .fg = COLOR_BLUE, .bg = -1, .fg256 = 4, .bg256 = -1, }, -}; - -#define COLOR(c) COLOR_PAIR(colors[c].pair) -/* curses attributes for the currently focused window */ -#define SELECTED_ATTR (COLOR(BLUE) | A_NORMAL) -/* curses attributes for normal (not selected) windows */ -#define NORMAL_ATTR (COLOR(DEFAULT) | A_NORMAL) -/* curses attributes for a window with pending urgent flag */ -#define URGENT_ATTR NORMAL_ATTR -/* status bar (command line option -s) position */ -#define BAR_POS BAR_TOP /* BAR_BOTTOM, BAR_OFF */ -/* whether status bar should be hidden if only one client exists */ -#define BAR_AUTOHIDE true -/* master width factor [0.1 .. 0.9] */ -#define MFACT 0.6 -/* number of clients in master area */ -#define NMASTER 1 -/* scroll back buffer size in lines */ -#define SCROLL_HISTORY 10000 -/* curses attributes for the currently selected tags */ -#define TAG_SEL (COLOR(BLUE) | A_NORMAL) -/* curses attributes for not selected tags which contain windows */ -#define TAG_OCCUPIED (COLOR(DEFAULT) | A_NORMAL) -/* curses attributes for not selected tags which with urgent windows */ -#define TAG_URGENT (COLOR(DEFAULT) | A_NORMAL | A_BLINK) -/* curses attributes for the keybinding in status bar */ -#define KEYS_STATUS_ATTR (COLOR(BLUE) | A_BOLD | A_REVERSE) - -const char tags[][8] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; - -#include "tile.c" -#include "grid.c" -#include "bstack.c" -#include "fullscreen.c" - -/* by default the first layout entry is used */ -static Layout layouts[] = { - { "[ ]", fullscreen }, - { "[]=", tile }, - { "TTT", bstack }, - { "+++", grid }, -}; - -#define MOD CTRL('b') -#define TAGKEYS(KEY,TAG) \ - { { MOD, 's', KEY, }, { view, { tags[TAG] } } }, \ - { { MOD, 't', KEY, }, { tag, { tags[TAG] } } }, \ - { { MOD, 'S', KEY, }, { toggleview, { tags[TAG] } } }, \ - { { MOD, 'T', KEY, }, { toggletag, { tags[TAG] } } }, - -/* you can specifiy at most 3 arguments */ -static KeyBinding bindings[] = { - { { MOD, 'c', }, { create, { NULL, NULL, "$CWD" } } }, - { { MOD, 'C', }, { create, { NULL } } }, - { { MOD, 'q', }, { killclient, { NULL } } }, - { { MOD, 'Q', }, { quit, { NULL } } }, - { { MOD, 'h', }, { focusleft, { NULL } } }, - { { MOD, 'l', }, { focusright, { NULL } } }, - { { MOD, 'j', }, { focusdown, { NULL } } }, - { { MOD, 'k', }, { focusup, { NULL } } }, - { { MOD, '=', ' ', }, { setlayout, { NULL } } }, - { { MOD, '=', 'f', }, { setlayout, { "[]=" } } }, - { { MOD, '=', 'g', }, { setlayout, { "+++" } } }, - { { MOD, '=', 'b', }, { setlayout, { "TTT" } } }, - { { MOD, '=', 'm', }, { setlayout, { "[ ]" } } }, - { { MOD, 'm', KEY_UP, }, { incnmaster, { "+1" } } }, - { { MOD, 'm', KEY_DOWN,}, { incnmaster, { "-1" } } }, - { { MOD, 'm', KEY_LEFT,}, { setmfact, { "-0.05" } } }, - { { MOD, 'm', KEY_RIGHT}, { setmfact, { "+0.05" } } }, - { { MOD, '.', }, { toggleminimize, { NULL } } }, - { { MOD, ' ', }, { zoom , { NULL } } }, - { { MOD, 'b', }, { togglebar, { NULL } } }, - { { MOD, '1', }, { focusn, { "1" } } }, - { { MOD, '2', }, { focusn, { "2" } } }, - { { MOD, '3', }, { focusn, { "3" } } }, - { { MOD, '4', }, { focusn, { "4" } } }, - { { MOD, '5', }, { focusn, { "5" } } }, - { { MOD, '6', }, { focusn, { "6" } } }, - { { MOD, '7', }, { focusn, { "7" } } }, - { { MOD, '8', }, { focusn, { "8" } } }, - { { MOD, '9', }, { focusn, { "9" } } }, - { { MOD, 'n', }, { focuslast, { NULL } } }, - { { MOD, 'a', }, { togglerunall, { NULL } } }, - { { MOD, 'r', }, { redraw, { NULL } } }, - { { MOD, 'e', }, { copymode, { "dvtm-editor" } } }, - { { MOD, 'p', }, { copymode, { "dvtm-pager" } } }, - { { MOD, '/', }, { copymode, { "dvtm-pager", "/" } } }, - { { MOD, KEY_PPAGE, }, { scrollback, { "-1" } } }, - { { MOD, KEY_NPAGE, }, { scrollback, { "1" } } }, - { { MOD, '?', }, { create, { "man dvtm", "dvtm help" } } }, - { { MOD, MOD, }, { send, { (const char []){MOD, 0} } } }, - { { MOD, '0', }, { view, { NULL } } }, - { { MOD, KEY_F(1), }, { view, { tags[0] } } }, - { { MOD, KEY_F(2), }, { view, { tags[1] } } }, - { { MOD, KEY_F(3), }, { view, { tags[2] } } }, - { { MOD, KEY_F(4), }, { view, { tags[3] } } }, - { { MOD, KEY_F(5), }, { view, { tags[4] } } }, - { { MOD, KEY_F(6), }, { view, { tags[5] } } }, - { { MOD, KEY_F(7), }, { view, { tags[6] } } }, - { { MOD, KEY_F(8), }, { view, { tags[7] } } }, - { { MOD, KEY_F(9), }, { view, { tags[8] } } }, - { { MOD, 's', 't', }, { viewprevtag, { NULL } } }, - { { MOD, 't', '0' }, { tag, { NULL } } }, - TAGKEYS( '1', 0) - TAGKEYS( '2', 1) - TAGKEYS( '3', 2) - TAGKEYS( '4', 3) - TAGKEYS( '5', 4) - TAGKEYS( '6', 5) - TAGKEYS( '7', 6) - TAGKEYS( '8', 7) - TAGKEYS( '9', 8) -}; - -static const ColorRule colorrules[] = { - { "", A_NORMAL, &colors[DEFAULT] }, /* default */ -}; - -#ifdef NCURSES_MOUSE_VERSION -# define CONFIG_MOUSE - -static Button buttons[] = { - { BUTTON1_CLICKED, { mouse_focus, { NULL } } }, - { BUTTON1_DOUBLE_CLICKED, { mouse_fullscreen, { "[ ]" } } }, - { BUTTON2_CLICKED, { mouse_zoom, { NULL } } }, - { BUTTON3_CLICKED, { mouse_minimize, { NULL } } }, - { BUTTON4_PRESSED, { scrollback, { "-1" } } }, - { BUTTON5_PRESSED, { scrollback, { "1" } } }, -}; -#endif - -#define ENABLE_MOUSE true - -static Cmd commands[] = { - /* create [cmd]: create a new window, run `cmd` in the shell if specified */ - { "create", { create, { NULL } } }, - /* focus <win_id>: focus the window whose `DVTM_WINDOW_ID` is `win_id` */ - { "focus", { focusid, { NULL } } }, - /* tag <win_id> <tag> [tag ...]: add +tag, remove -tag or set tag of the window with the given identifier */ - { "tag", { tagid, { NULL } } }, -}; - -/* gets executed when dvtm is started */ -static Action actions[] = { - { create, { NULL } }, -}; - -static char const * const keytable[] = { - /* add your custom key escape sequences */ -}; diff --git a/pkg/dvtm/config.mk b/pkg/dvtm/config.mk @@ -1,10 +0,0 @@ -PREFIX ?= /usr -MANPREFIX = ${PREFIX}/share/man -TERMINFO := ${DESTDIR}${PREFIX}/share/terminfo - -INCS = -I. -LIBS = -lc -lutil -lncursesw -CPPFLAGS = -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700 -D_XOPEN_SOURCE_EXTENDED -CFLAGS += -std=c99 ${INCS} -DNDEBUG ${CPPFLAGS} - -CC ?= cc diff --git a/pkg/dvtm/patches/0001-customize-personal-UI.patch b/pkg/dvtm/patches/0001-customize-personal-UI.patch @@ -1,284 +0,0 @@ -From 176d3cb3131cc82afdc595a0c5877cc81fd7e292 Mon Sep 17 00:00:00 2001 -From: Jul <jul@qh.is> -Date: Sat, 19 Jul 2025 14:05:33 -0400 -Subject: [PATCH 1/3] customize personal UI - ---- - dvtm.c | 232 +++++++++++++++++++++++++++++++++++---------------------- - 1 file changed, 142 insertions(+), 90 deletions(-) - -diff --git a/dvtm.c b/dvtm.c -index 8382c83..f367d3f 100644 ---- a/dvtm.c -+++ b/dvtm.c -@@ -322,87 +322,154 @@ showbar(void) { - bar.pos = bar.lastpos; - } - --static void --drawbar(void) { -- int sx, sy, x, y, width; -- unsigned int occupied = 0, urgent = 0; -- if (bar.pos == BAR_OFF) -- return; -- -- for (Client *c = clients; c; c = c->next) { -- occupied |= c->tags; -- if (c->urgent) -- urgent |= c->tags; -- } -- -- getyx(stdscr, sy, sx); -- attrset(BAR_ATTR); -- move(bar.y, 0); -- -- for (unsigned int i = 0; i < LENGTH(tags); i++){ -- if (tagset[seltags] & (1 << i)) -- attrset(TAG_SEL); -- else if (urgent & (1 << i)) -- attrset(TAG_URGENT); -- else if (occupied & (1 << i)) -- attrset(TAG_OCCUPIED); -- else -- attrset(TAG_NORMAL); -- printw(TAG_SYMBOL, tags[i]); -- } -- -- attrset(runinall ? TAG_SEL : TAG_NORMAL); -- addstr(layout->symbol); -- attrset(TAG_NORMAL); -- -- for (unsigned int i = 0; i < MAX_KEYS && keys[i]; i++) { -- if (keys[i] < ' ') -- printw("^%c", 'A' - 1 + keys[i]); -- else -- printw("%c", keys[i]); -- } -- -- getyx(stdscr, y, x); -- (void)y; -- int maxwidth = screen.w - x - 2; -- -- addch(BAR_BEGIN); -- attrset(BAR_ATTR); -- -- wchar_t wbuf[sizeof bar.text]; -- size_t numchars = mbstowcs(wbuf, bar.text, sizeof bar.text); -- -- if (numchars != (size_t)-1 && (width = wcswidth(wbuf, maxwidth)) != -1) { -- int pos; -- for (pos = 0; pos + width < maxwidth; pos++) -- addch(' '); -- -- for (size_t i = 0; i < numchars; i++) { -- pos += wcwidth(wbuf[i]); -- if (pos > maxwidth) -- break; -- addnwstr(wbuf+i, 1); -- } -- -- clrtoeol(); -- } -- -- attrset(TAG_NORMAL); -- mvaddch(bar.y, screen.w - 1, BAR_END); -- attrset(NORMAL_ATTR); -- move(sy, sx); -- wnoutrefresh(stdscr); -+static unsigned int -+total_visible_clients(void) { -+ unsigned int total = 0; -+ for (Client *c = clients; c; c = c->next) { -+ if (isvisible(c)) -+ total++; -+ } -+ return total; - } - - static int - show_border(void) { -- return (bar.pos != BAR_OFF) || (clients && clients->next); -+ return !isarrange(fullscreen) && total_visible_clients() > 1; -+} -+ -+static void -+drawbar(void) { -+ int sx, sy, x, y, width, len_lhs = 0, len_rhs = 0; -+ unsigned int occupied = 0, urgent = 0; -+ -+ if (bar.pos == BAR_OFF) -+ return; -+ -+ for (Client *c = clients; c; c = c->next) { -+ occupied |= c->tags; -+ -+ if (c->urgent) -+ urgent |= c->tags; -+ } -+ -+ getyx(stdscr, sy, sx); -+ move(bar.y, 0); -+ -+ for (unsigned int i = 0; i < screen.w; ++i) { -+ addch(' '); -+ } -+ -+ unsigned int len_actual_title = sel ? strlen(sel->title) : 0; -+ unsigned int maxlen_title = screen.w / 2; -+ move(bar.y, 0); -+ -+ if (!show_border()) -+ attrset(TAG_SEL); -+ -+ unsigned int len_title = 0; -+ for (unsigned int i = 0; i < len_actual_title; i++){ -+ if (i >= maxlen_title) break; -+ printw("%c", sel->title[i]); -+ len_title++; -+ } -+ -+ attrset(NORMAL_ATTR); -+ len_lhs += len_title; -+ -+ const char *abduco_env = getenv("ABDUCO_SESSION"); -+ if (abduco_env != NULL && strcmp(abduco_env, "default") != 0) { -+ unsigned int len_env = strlen(abduco_env) + 1; -+ move(bar.y, screen.w - len_rhs - len_env); -+ len_rhs += len_env + 1; -+ printw("~%s", abduco_env); -+ } -+ -+ char hostname[256]; -+ if (gethostname(hostname, sizeof(hostname)) == 0) { -+ unsigned int len_hostname = strlen(hostname) + 2; -+ move(bar.y, screen.w - len_rhs - len_hostname); -+ len_rhs += len_hostname + 1; -+ printw("[%s]", hostname); -+ } -+ -+ unsigned int len_tags = 0; -+ for (int i = LENGTH(tags); i >= 0; i--) { -+ move(bar.y, screen.w - len_rhs - len_tags - 1); -+ -+ if (tagset[seltags] & (1 << i)) { -+ attrset(TAG_SEL); -+ printw("%s", tags[i]); -+ len_tags++; -+ } else if (urgent & (1 << i)) { -+ attrset(TAG_URGENT); -+ printw("%s", tags[i]); -+ len_tags++; -+ } else if (occupied & (1 << i)) { -+ attrset(TAG_OCCUPIED); -+ printw("%s", tags[i]); -+ len_tags++; -+ } -+ } -+ -+ len_rhs += len_tags; -+ attrset(NORMAL_ATTR); -+ -+ char buffer_clients[8]; -+ unsigned int total_clients = total_visible_clients(); -+ unsigned int len_clients = !sel && total_clients == 0 -+ ? 0 : snprintf(buffer_clients, sizeof(buffer_clients), "[%d/%d]", sel->order, total_clients); -+ -+ if (len_clients) { -+ move(bar.y, screen.w - len_rhs - len_clients - 1); -+ len_rhs += len_clients + 1; -+ printw("%s", buffer_clients); -+ } -+ -+ unsigned int len_keys = keys[0] ? MAX_KEYS : 0; -+ if (len_keys) { -+ move(bar.y, screen.w - MAX_KEYS); -+ attrset(KEYS_STATUS_ATTR); -+ -+ for (unsigned int i = 0; i < MAX_KEYS - 1; i++) { -+ if (!keys[i]) -+ printw(" "); -+ else if (keys[i] < ' ') -+ printw("^%c", 'A' - 1 + keys[i]); -+ else if (keys[i] <= '~') -+ printw("%c", keys[i]); -+ } -+ -+ attrset(NORMAL_ATTR); -+ } -+ -+ move(bar.y, len_lhs + 1); -+ getyx(stdscr, y, x); -+ (void)y; -+ -+ int maxwidth = screen.w - len_lhs - len_rhs - 2; -+ wchar_t wbuf[sizeof bar.text]; -+ size_t numchars = mbstowcs(wbuf, bar.text, sizeof bar.text); -+ -+ if (numchars != (size_t)-1 && (width = wcswidth(wbuf, maxwidth)) != -1) { -+ int pos; -+ for (pos = 0; pos + width < maxwidth; pos++) -+ addch(' '); -+ -+ for (size_t i = 0; i < numchars; i++) { -+ pos += wcwidth(wbuf[i]); -+ if (pos > maxwidth) -+ break; -+ addnwstr(wbuf+i, 1); -+ } -+ } -+ -+ move(sy, sx); -+ wnoutrefresh(stdscr); - } - - static void - draw_border(Client *c) { -- char t = '\0'; -- int x, y, maxlen, attrs = NORMAL_ATTR; -+ int x, y, attrs = NORMAL_ATTR; - - if (!show_border()) - return; -@@ -414,20 +481,6 @@ draw_border(Client *c) { - wattrset(c->window, attrs); - getyx(c->window, y, x); - mvwhline(c->window, 0, 0, ACS_HLINE, c->w); -- maxlen = c->w - 10; -- if (maxlen < 0) -- maxlen = 0; -- if ((size_t)maxlen < sizeof(c->title)) { -- t = c->title[maxlen]; -- c->title[maxlen] = '\0'; -- } -- -- mvwprintw(c->window, 0, 2, "[%s%s#%d]", -- *c->title ? c->title : "", -- *c->title ? " | " : "", -- c->order); -- if (t) -- c->title[maxlen] = t; - wmove(c->window, y, x); - } - -@@ -482,7 +535,7 @@ arrange(void) { - } - erase(); - attrset(NORMAL_ATTR); -- if (bar.fd == -1 && bar.autohide) { -+ if (bar.autohide) { - if ((!clients || !clients->next) && n == 1) - hidebar(); - else -@@ -634,8 +687,7 @@ term_title_handler(Vt *term, const char *title) { - strncpy(c->title, title, sizeof(c->title) - 1); - c->title[title ? sizeof(c->title) - 1 : 0] = '\0'; - settitle(c); -- if (!isarrange(fullscreen) || sel == c) -- draw_border(c); -+ drawbar(); - applycolorrules(c); - } - --- -2.50.1 - diff --git a/pkg/dvtm/patches/0002-allow-focusing-left-right-fullscreen.patch b/pkg/dvtm/patches/0002-allow-focusing-left-right-fullscreen.patch @@ -1,25 +0,0 @@ -From d01acf6a1be82d81217ff7455c07689edcd8f87e Mon Sep 17 00:00:00 2001 -From: Jul <jul@qh.is> -Date: Sat, 19 Jul 2025 20:49:03 -0400 -Subject: [PATCH 2/3] allow focusing left/right fullscreen - ---- - dvtm.c | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/dvtm.c b/dvtm.c -index f367d3f..6e62fbc 100644 ---- a/dvtm.c -+++ b/dvtm.c -@@ -746,8 +746,6 @@ static Client* - get_client_by_coord(unsigned int x, unsigned int y) { - if (y < way || y >= way+wah) - return NULL; -- if (isarrange(fullscreen)) -- return sel; - for (Client *c = nextvisible(clients); c; c = nextvisible(c->next)) { - if (x >= c->x && x < c->x + c->w && y >= c->y && y < c->y + c->h) { - debug("mouse event, x: %d y: %d client: %d\n", x, y, c->order); --- -2.50.1 - diff --git a/pkg/dvtm/patches/0003-add-client-child-process-count-to-status-bar.patch b/pkg/dvtm/patches/0003-add-client-child-process-count-to-status-bar.patch @@ -1,84 +0,0 @@ -From 9cab05ef89c66124832644ab847f85a53f2c5d3f Mon Sep 17 00:00:00 2001 -From: Jul <jul@qh.is> -Date: Wed, 30 Jul 2025 00:02:37 -0400 -Subject: [PATCH 3/3] add client child process count to status bar - ---- - dvtm.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 47 insertions(+) - -diff --git a/dvtm.c b/dvtm.c -index 6e62fbc..0ad2dba 100644 ---- a/dvtm.c -+++ b/dvtm.c -@@ -33,6 +33,8 @@ - #include <stdbool.h> - #include <errno.h> - #include <pwd.h> -+#include <dirent.h> -+#include <ctype.h> - #if defined __CYGWIN__ || defined __sun - # include <termios.h> - #endif -@@ -322,6 +324,41 @@ showbar(void) { - bar.pos = bar.lastpos; - } - -+ -+int count_child_processes(pid_t parent_pid) { -+ int count = 0; -+ DIR *proc_dir = opendir("/proc"); -+ struct dirent *entry; -+ -+ if (proc_dir == NULL) { -+ perror("opendir"); -+ return -1; -+ } -+ -+ while ((entry = readdir(proc_dir)) != NULL) { -+ if (isdigit(entry->d_name[0])) { -+ pid_t pid = atoi(entry->d_name); -+ char path[256]; -+ snprintf(path, sizeof(path), "/proc/%d/stat", pid); -+ FILE *stat_file = fopen(path, "r"); -+ -+ if (stat_file) { -+ int ppid; -+ fscanf(stat_file, "%*d %*s %*s %d", &ppid); -+ fclose(stat_file); -+ -+ if (ppid == parent_pid) { -+ count++; -+ count += count_child_processes(pid); -+ } -+ } -+ } -+ } -+ -+ closedir(proc_dir); -+ return count; -+} -+ - static unsigned int - total_visible_clients(void) { - unsigned int total = 0; -@@ -424,6 +461,16 @@ drawbar(void) { - len_rhs += len_clients + 1; - printw("%s", buffer_clients); - } -+ -+ if (sel) { -+ int count = 1 + count_child_processes(sel->pid); -+ if (count > 1) { -+ unsigned int len_procs = count >= 10 ? 3 : 2; -+ move(bar.y, screen.w - len_rhs - len_procs - 1); -+ len_rhs += len_procs + 1; -+ printw("P%d", count); -+ } -+ } - - unsigned int len_keys = keys[0] ? MAX_KEYS : 0; - if (len_keys) { --- -2.50.1 - diff --git a/pkg/dvtm/repo b/pkg/dvtm/repo @@ -1 +0,0 @@ -Subproject commit 9cab05ef89c66124832644ab847f85a53f2c5d3f