nnn

mirror of https://github.com/jarun/nnn
Log | Files | Refs | README | LICENSE

commit 8a013d965d41a1a0c68ca11e173a88b6ffa58afe
parent c5e1b205174338c1e98a50be87a2f33b9069aa0f
Author: Arun Prakash Jana <engineerarun@gmail.com>
Date:   Sun, 22 Feb 2026 12:02:33 +0530

Fix patch build error

Diffstat:
Mpatches/gitstatus/namefirst.diff | 69+++++++++++++++++++++++++++++----------------------------------------
Mpatches/namefirst/mainline.diff | 177++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------
2 files changed, 173 insertions(+), 73 deletions(-)

diff --git a/patches/gitstatus/namefirst.diff b/patches/gitstatus/namefirst.diff @@ -5,15 +5,12 @@ # Compatibility patch for the namefirst patch. # # Authors: Luuk van Baal - -diff --git a/src/nnn.c b/src/nnn.c -index 88538787..d4af7c43 100644 --- a/src/nnn.c +++ b/src/nnn.c -@@ -270,6 +270,25 @@ +@@ -298,6 +298,25 @@ #define VFS_USED 1 #define VFS_SIZE 2 - + +/* Git icons */ +#ifdef NERD +#define GIT_ADD "" @@ -36,26 +33,26 @@ index 88538787..d4af7c43 100644 /* TYPE DEFINITIONS */ typedef unsigned int uint_t; typedef unsigned char uchar_t; -@@ -294,6 +313,7 @@ typedef struct entry { +@@ -322,6 +341,7 @@ uid_t uid; /* 4 bytes */ gid_t gid; /* 4 bytes */ #endif + char git_status[2][5]; } *pEntry; - + /* Selection marker */ -@@ -349,6 +369,7 @@ typedef struct { +@@ -378,6 +398,7 @@ uint_t cliopener : 1; /* All-CLI app opener */ uint_t waitedit : 1; /* For ops that can't be detached, used EDITOR */ uint_t rollover : 1; /* Roll over at edges */ + uint_t normalgit : 1; /* Show git status in normal mode */ } settings; - + /* Non-persistent program-internal states (alphabeical order) */ -@@ -404,7 +425,17 @@ static struct { +@@ -434,7 +455,17 @@ ushort_t maxnameln, maxsizeln, maxuidln, maxgidln, maxentln, uidln, gidln, printguid; } dtls; - + +typedef struct { + char status[2]; + char path[PATH_MAX]; @@ -67,13 +64,13 @@ index 88538787..d4af7c43 100644 + size_t len; + git_status_t *statuses; +} git_statuses; - + /* Configuration, contexts */ static settings cfg = { -@@ -3804,6 +3835,47 @@ static int get_kv_key(kv *kvarr, char *val, uchar_t max, uchar_t id) +@@ -4341,6 +4372,47 @@ return -1; } - + +static size_t get_git_statuses(const char *path) +{ + static char gst[] = "git -c core.quotePath= status -s --no-renames --ignored=matching -unormal . 2>/dev/null"; @@ -118,20 +115,21 @@ index 88538787..d4af7c43 100644 static void resetdircolor(int flags) { /* Directories are always shown on top, clear the color when moving to first file */ -@@ -4104,6 +4176,9 @@ static void printent(const struct entry *ent, uint_t namecols, bool sel) - int attrs = 0, namelen; +@@ -4765,6 +4837,10 @@ + uchar_t color_pair = get_color_pair_name_ind(ent, &ind, &attrs); - + + if (git_statuses.show && (cfg.showdetail || cfg.normalgit)) -+ printw(" %s%s", ent->git_status[0], ent->git_status[1]); ++ printw("%*s%s%s", (cfg.normalgit && !cfg.showdetail) ? 1 : 0, "", ++ ent->git_status[0], ent->git_status[1]); + addch((ent->flags & FILE_SELECTED) ? '+' | A_REVERSE | A_BOLD : ' '); - + if (g_state.oldcolor) -@@ -5598,6 +5673,11 @@ static int dentfill(char *path, struct entry **ppdents) +@@ -6917,6 +6993,11 @@ attron(COLOR_PAIR(cfg.curctx + 1)); } - + + char linkpath[PATH_MAX]; + if ((git_statuses.len = get_git_statuses(path))) + if (!realpath(path, linkpath)) @@ -140,10 +138,10 @@ index 88538787..d4af7c43 100644 #if _POSIX_C_SOURCE >= 200112L posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL); #endif -@@ -5798,6 +5878,29 @@ static int dentfill(char *path, struct entry **ppdents) +@@ -7141,6 +7222,29 @@ #endif } - + + if (git_statuses.len) { + char dentpath[PATH_MAX]; + size_t pathlen = mkpath(linkpath, dentp->name, dentpath); @@ -169,27 +167,18 @@ index 88538787..d4af7c43 100644 + ++ndents; } while ((dp = readdir(dirp))); - -@@ -6362,7 +6465,8 @@ static int adjust_cols(int n) + +@@ -7715,7 +7819,8 @@ cfg.showdetail ^= 1; else /* 2 more accounted for below */ n -= (dtls.maxentln - 2 - dtls.maxnameln); - } + } else if (cfg.normalgit && git_statuses.show) + n -= 3; - + /* 2 columns for preceding space and indicator */ return (n - 2); -@@ -6517,7 +6621,7 @@ static void redraw(char *path) - } - #endif - } -- dtls.maxentln = dtls.maxnameln + dtls.maxsizeln + (dtls.printguid ? (dtls.maxuidln + dtls.maxgidln + 29) : 26); -+ dtls.maxentln = dtls.maxnameln + dtls.maxsizeln + (dtls.printguid ? (dtls.maxuidln + dtls.maxgidln + 3) : 0) + (git_statuses.show ? 29 : 26); - } - - ncols = adjust_cols(ncols); -@@ -8153,6 +8257,7 @@ static void usage(void) +@@ -9576,6 +9681,7 @@ " -F val fifo mode [0:preview 1:explore]\n" #endif " -g regex filters\n" @@ -197,7 +186,7 @@ index 88538787..d4af7c43 100644 " -H show hidden files\n" " -i show current file info\n" " -J no auto-advance on selection\n" -@@ -8292,6 +8397,7 @@ static void cleanup(void) +@@ -9720,6 +9826,7 @@ fflush(stdout); } #endif @@ -205,8 +194,8 @@ index 88538787..d4af7c43 100644 free(selpath); free(plgpath); free(cfgpath); -@@ -8336,7 +8442,7 @@ int main(int argc, char *argv[]) - +@@ -9765,7 +9872,7 @@ + while ((opt = (env_opts_id > 0 ? env_opts[--env_opts_id] - : getopt(argc, argv, "aAb:BcCdDeEfF:gHiJKl:nNop:P:QrRs:St:T:uUVxz0h"))) != -1) { @@ -214,7 +203,7 @@ index 88538787..d4af7c43 100644 switch (opt) { #ifndef NOFIFO case 'a': -@@ -8390,6 +8496,9 @@ int main(int argc, char *argv[]) +@@ -9819,6 +9926,9 @@ cfg.regex = 1; filterfn = &visible_re; break; diff --git a/patches/namefirst/mainline.diff b/patches/namefirst/mainline.diff @@ -4,10 +4,10 @@ # Author: Luuk van Baal diff --git a/src/nnn.c b/src/nnn.c -index f8a2c58..9802a1f 100644 +index 19ebc2cf..42a0a6b0 100644 --- a/src/nnn.c +++ b/src/nnn.c -@@ -394,6 +394,10 @@ typedef struct { +@@ -430,6 +430,10 @@ typedef struct { } session_header_t; #endif @@ -18,11 +18,12 @@ index f8a2c58..9802a1f 100644 /* GLOBALS */ /* Configuration, contexts */ -@@ -1070,10 +1074,12 @@ static char *getpwname(uid_t uid) +@@ -1175,10 +1179,13 @@ static char *getpwname(uid_t uid) static char *namecache; if (uidcache != uid) { -+ if (dtls.maxuidln && !dtls.printguid) dtls.printguid = 1; ++ if (dtls.maxuidln && !dtls.printguid) ++ dtls.printguid = 1; struct passwd *pw = getpwuid(uid); uidcache = uid; @@ -31,11 +32,12 @@ index f8a2c58..9802a1f 100644 } return namecache ? namecache : xitoa(uid); -@@ -1085,10 +1091,12 @@ static char *getgrname(gid_t gid) +@@ -1190,10 +1197,13 @@ static char *getgrname(gid_t gid) static char *grpcache; if (gidcache != gid) { -+ if (dtls.maxgidln && !dtls.printguid) dtls.printguid = 1; ++ if (dtls.maxgidln && !dtls.printguid) ++ dtls.printguid = 1; struct group *gr = getgrgid(gid); gidcache = gid; @@ -44,7 +46,7 @@ index f8a2c58..9802a1f 100644 } return grpcache ? grpcache : xitoa(gid); -@@ -3834,14 +3842,13 @@ static void resetdircolor(int flags) +@@ -4346,14 +4356,13 @@ static void resetdircolor(int flags) * Max supported str length: NAME_MAX; */ #ifdef NOLC @@ -62,7 +64,7 @@ index f8a2c58..9802a1f 100644 { wchar_t * const wbuf = (wchar_t *)g_buf; wchar_t *buf = wbuf; -@@ -3866,7 +3873,7 @@ static wchar_t *unescape(const char *str, uint_t maxcols) +@@ -4378,7 +4387,7 @@ static wchar_t *unescape(const char *str, uint_t maxcols) ++buf; } @@ -71,7 +73,107 @@ index f8a2c58..9802a1f 100644 } static off_t get_size(off_t size, off_t *pval, int comp) -@@ -4228,38 +4235,13 @@ static void printent(int pdents_index, uint_t namecols, bool sel) +@@ -4627,9 +4636,10 @@ static uchar_t get_color_pair_name_ind(const struct entry *ent, char *pind, int + } + + #ifndef NOHIGHLIGHT_FILTER +-static void printent_name(const struct entry *ent, uint_t namecols, bool sel) ++static size_t printent_name(const struct entry *ent, uint_t namecols, bool sel) + { + char * const fltr = g_ctx[cfg.curctx].c_fltr; ++ size_t namelen; + + /* If there's a filter string, highlight matches */ + if (fltr[1]) { +@@ -4644,15 +4654,18 @@ static void printent_name(const struct entry *ent, uint_t namecols, bool sel) + if (cfg.regex) { + /* For regex, we don't highlight - just print normally */ + #ifndef NOLC +- addwstr(unescape(ent->name, namecols)); ++ namelen = unescape(ent->name, namecols); ++ addwstr((wchar_t *)g_buf); + #else +- addstr(unescape(ent->name, MIN(namecols, ent->nlen) + 1)); ++ namelen = unescape(ent->name, MIN(namecols, ent->nlen) + 1); ++ addstr((char *)g_buf); + #endif + } else if (cfg.fuzzy) { + /* Get fuzzy match positions */ + fuzzy_match_positions(fltr + 1, ent->name, matched); + #ifndef NOLC +- wchar_t * const wbuf = unescape(ent->name, namecols); ++ namelen = unescape(ent->name, namecols); ++ wchar_t * const wbuf = (wchar_t *)g_buf; + uint_t col = 0; + for (wchar_t *p = wbuf; *p && col < namecols; ++p, ++col) { + if (matched[col]) { +@@ -4665,7 +4678,8 @@ static void printent_name(const struct entry *ent, uint_t namecols, bool sel) + } + #else + /* Non-wide character version for fuzzy highlighting */ +- const char *name = unescape(ent->name, MIN(namecols, ent->nlen) + 1); ++ namelen = unescape(ent->name, MIN(namecols, ent->nlen) + 1); ++ const char *name = (char *)g_buf; + for (uint_t i = 0; (i < namecols) && name[i]; ++i) { + if (matched[i]) { + attron(match_attrs); +@@ -4680,7 +4694,8 @@ static void printent_name(const struct entry *ent, uint_t namecols, bool sel) + /* String match - highlight the substring */ + string_match_positions(fltr + 1, ent->name, matched); + #ifndef NOLC +- wchar_t * const wbuf = unescape(ent->name, namecols); ++ namelen = unescape(ent->name, namecols); ++ wchar_t * const wbuf = (wchar_t *)g_buf; + uint_t col = 0; + for (wchar_t *p = wbuf; *p && col < namecols; ++p, ++col) { + if (matched[col]) { +@@ -4693,7 +4708,8 @@ static void printent_name(const struct entry *ent, uint_t namecols, bool sel) + } + #else + /* Non-wide character version for string highlighting */ +- const char *name = unescape(ent->name, MIN(namecols, ent->nlen) + 1); ++ namelen = unescape(ent->name, MIN(namecols, ent->nlen) + 1); ++ const char *name = (char *)g_buf; + for (uint_t i = 0; (i < namecols) && name[i]; ++i) { + if (matched[i]) { + attron(match_attrs); +@@ -4708,22 +4724,30 @@ static void printent_name(const struct entry *ent, uint_t namecols, bool sel) + } else { + /* No filter or filter not active - print normally */ + #ifndef NOLC +- addwstr(unescape(ent->name, namecols)); ++ namelen = unescape(ent->name, namecols); ++ addwstr((wchar_t *)g_buf); + #else +- addstr(unescape(ent->name, MIN(namecols, ent->nlen) + 1)); ++ namelen = unescape(ent->name, MIN(namecols, ent->nlen) + 1); ++ addstr((char *)g_buf); + #endif + } ++ ++ return namelen; + } + #else + /* Without highlight support, just print the name normally */ +-static inline void printent_name(const struct entry *ent, uint_t namecols, bool sel) ++static inline size_t printent_name(const struct entry *ent, uint_t namecols, bool sel) + { + (void)sel; /* Suppress unused parameter warning */ + #ifndef NOLC +- addwstr(unescape(ent->name, namecols)); ++ size_t namelen = unescape(ent->name, namecols); ++ addwstr((wchar_t *)g_buf); + #else +- addstr(unescape(ent->name, MIN(namecols, ent->nlen) + 1)); ++ size_t namelen = unescape(ent->name, MIN(namecols, ent->nlen) + 1); ++ addstr((char *)g_buf); + #endif ++ ++ return namelen; + } + #endif + +@@ -4731,38 +4755,14 @@ static void printent(int pdents_index, uint_t namecols, bool sel) { const struct entry *ent = &pdents[pdents_index]; char ind = '\0'; @@ -99,7 +201,8 @@ index f8a2c58..9802a1f 100644 - if (attrs) - attroff(attrs); - } -+ int attrs = 0, namelen; ++ int attrs = 0; ++ size_t namelen; if (g_state.showlines) { ptrdiff_t rel_num = pdents_index - cur; @@ -111,16 +214,12 @@ index f8a2c58..9802a1f 100644 uchar_t color_pair = get_color_pair_name_ind(ent, &ind, &attrs); addch((ent->flags & FILE_SELECTED) ? '+' | A_REVERSE | A_BOLD : ' '); -@@ -4284,15 +4266,40 @@ static void printent(int pdents_index, uint_t namecols, bool sel) +@@ -4786,12 +4786,44 @@ static void printent(int pdents_index, uint_t namecols, bool sel) + if (!ind) ++namecols; - #ifndef NOLC -- addwstr(unescape(ent->name, namecols)); -+ addwstr((namelen = unescape(ent->name, namecols), (wchar_t *)g_buf)); - #else -- addstr(unescape(ent->name, MIN(namecols, ent->nlen) + 1)); -+ addstr((namelen = unescape(ent->name, MIN(namecols, ent->nlen) + 1), (char *)g_buf)); - #endif +- printent_name(ent, namecols, sel); ++ namelen = printent_name(ent, namecols, sel); - if (attrs) + if (!sel && attrs) @@ -137,9 +236,16 @@ index f8a2c58..9802a1f 100644 + attron(attrs); + if (!g_state.oldcolor && (type == S_IFDIR || (type == S_IFLNK && ent->flags & DIR_OR_DIRLNK))) + attroff(A_BOLD); -+ int sizelen = (type == S_IFREG || type == S_IFDIR) ? xstrlen(size = coolsize(cfg.blkorder ? ent->blocks << blk_shift : ent->size)) : 1; -+ printw("%*c%*s%s%s", 1 + MIN(namecols, dtls.maxnameln + (uint_t)(ind ? 0 : 1)) - namelen, ' ', -+ dtls.maxsizeln - sizelen, "", size ? size : (type = (uchar_t)get_detail_ind(ent->mode), (char *)&type), " "); ++ int sizelen; ++ if (type == S_IFREG || type == S_IFDIR) { ++ size = coolsize(cfg.blkorder ? ent->blocks << blk_shift : ent->size); ++ sizelen = xstrlen(size); ++ } else ++ sizelen = 1; ++ printw("%*c%*s%s%s", ++ 1 + MIN(namecols, dtls.maxnameln + (uint_t)(ind ? 0 : 1)) - (int)namelen, ' ', ++ dtls.maxsizeln - sizelen, "", size ? size ++ : (type = (uchar_t)get_detail_ind(ent->mode), (char *)&type), " "); +#ifndef NOUG + if (g_state.uidgid && dtls.printguid) { + addstr(getpwname(ent->uid)); @@ -155,7 +261,7 @@ index f8a2c58..9802a1f 100644 } /** -@@ -6527,26 +6534,19 @@ static void statusbar(char *path) +@@ -7670,26 +7702,19 @@ static void statusbar(char *path) tocursor(); } @@ -185,7 +291,7 @@ index f8a2c58..9802a1f 100644 } /* 2 columns for preceding space and indicator */ -@@ -6412,8 +6411,6 @@ static void draw_line(int ncols) +@@ -7728,8 +7753,6 @@ static void draw_line(int ncols) /* Must reset e.g. no files in dir */ if (dir) attroff(COLOR_PAIR(cfg.curctx + 1) | A_BOLD); @@ -194,29 +300,34 @@ index f8a2c58..9802a1f 100644 } static void redraw(char *path) -@@ -6521,6 +6518,21 @@ static void redraw(char *path) - - onscreen = MIN(onscreen + curscroll, ndents); +@@ -7837,6 +7860,26 @@ static void redraw(char *path) + int onscreen = MIN(ONSCREEN + curscroll, ndents); + int len = scanselforpath(path, FALSE); + if (cfg.showdetail) { + ushort_t lenbuf = dtls.maxnameln = dtls.maxsizeln = dtls.maxuidln = dtls.maxgidln = dtls.printguid = 0; + for (i = curscroll; i < onscreen; ++i) { -+ if ((lenbuf = pdents[i].nlen - 1) > dtls.maxnameln) dtls.maxnameln = lenbuf; -+ if ((lenbuf = xstrlen(coolsize(cfg.blkorder ? pdents[i].blocks << blk_shift : pdents[i].size))) > dtls.maxsizeln) dtls.maxsizeln = lenbuf; ++ if ((lenbuf = pdents[i].nlen - 1) > dtls.maxnameln) ++ dtls.maxnameln = lenbuf; ++ if ((lenbuf = xstrlen(coolsize(cfg.blkorder ? pdents[i].blocks << blk_shift : pdents[i].size))) > dtls.maxsizeln) ++ dtls.maxsizeln = lenbuf; +#ifndef NOUG + if (g_state.uidgid) { -+ if ((getpwname(pdents[i].uid), dtls.uidln) > dtls.maxuidln) dtls.maxuidln = dtls.uidln; -+ if ((getgrname(pdents[i].gid), dtls.gidln) > dtls.maxgidln) dtls.maxgidln = dtls.gidln; ++ if ((getpwname(pdents[i].uid), dtls.uidln) > dtls.maxuidln) ++ dtls.maxuidln = dtls.uidln; ++ if ((getgrname(pdents[i].gid), dtls.gidln) > dtls.maxgidln) ++ dtls.maxgidln = dtls.gidln; + } +#endif + } -+ dtls.maxentln = dtls.maxnameln + dtls.maxsizeln + (dtls.printguid ? (dtls.maxuidln + dtls.maxgidln + 29) : 26); ++ dtls.maxentln = dtls.maxnameln + dtls.maxsizeln ++ + (dtls.printguid ? (dtls.maxuidln + dtls.maxgidln + 29) : 26); + } + ncols = adjust_cols(ncols); - int len = scanselforpath(path, FALSE); -@@ -6551,7 +6563,7 @@ static void redraw(char *path) + /* Print listing */ +@@ -7865,7 +7908,7 @@ static void redraw(char *path) #endif }