X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/agedu/blobdiff_plain/522edd92f2bbef89ccd1dd0a3e874516fb47e2ef..14557c012b37d65790a693213a684f3f87097e6a:/agedu.c?ds=sidebyside diff --git a/agedu.c b/agedu.c index f823121..7f36956 100644 --- a/agedu.c +++ b/agedu.c @@ -90,7 +90,7 @@ static int gotdata(void *vctx, const char *pathname, const STRUCT_STAT *st) if (ctx->usemtime || (ctx->fakeatimes && S_ISDIR(st->st_mode))) file.atime = st->st_mtime; else - file.atime = st->st_atime; + file.atime = max(st->st_mtime, st->st_atime); /* * Filter based on wildcards. @@ -949,7 +949,9 @@ int main(int argc, char **argv) ctx->progress = progress; { struct winsize ws; - if (progress && ioctl(2, TIOCGWINSZ, &ws) == 0) + if (progress && + ioctl(2, TIOCGWINSZ, &ws) == 0 && + ws.ws_col > 0) ctx->progwidth = ws.ws_col - 1; else ctx->progwidth = 79; @@ -1088,6 +1090,9 @@ int main(int argc, char **argv) int i; if (totalsize - indexbuild_realsize(ib) < delta) { + const void *oldfile = mappedfile; + ptrdiff_t diff; + /* * Unmap the file, grow it, and remap it. */ @@ -1113,6 +1118,14 @@ int main(int argc, char **argv) indexbuild_rebase(ib, mappedfile); triewalk_rebase(tw, mappedfile); + diff = (const unsigned char *)mappedfile - + (const unsigned char *)oldfile; + if (prevtf) + prevtf = (const struct trie_file *) + (((const unsigned char *)prevtf) + diff); + if (tf) + tf = (const struct trie_file *) + (((const unsigned char *)tf) + diff); } /* @@ -1215,7 +1228,8 @@ int main(int argc, char **argv) munmap(mappedfile, totalsize); } else if (mode == HTML) { char *querydir = actions[action].arg; - size_t pathlen; + size_t pathlen, maxpathlen; + char *pathbuf; struct html_config cfg; unsigned long xi; char *html; @@ -1238,6 +1252,9 @@ int main(int argc, char **argv) } pathsep = trie_pathsep(mappedfile); + maxpathlen = trie_maxpathlen(mappedfile); + pathbuf = snewn(maxpathlen, char); + /* * Trim trailing slash, just in case. */ @@ -1246,14 +1263,29 @@ int main(int argc, char **argv) querydir[--pathlen] = '\0'; xi = trie_before(mappedfile, querydir); - cfg.format = NULL; - cfg.autoage = htmlautoagerange; - cfg.oldest = htmloldest; - cfg.newest = htmlnewest; - html = html_query(mappedfile, xi, &cfg); - fputs(html, stdout); + if (xi >= trie_count(mappedfile) || + (trie_getpath(mappedfile, xi, pathbuf), + strcmp(pathbuf, querydir))) { + fprintf(stderr, "%s: pathname '%s' does not exist in index\n" + "%*s(check it is spelled exactly as it is in the " + "index, including\n%*sany leading './')\n", + PNAME, querydir, + (int)(1+sizeof(PNAME)), "", + (int)(1+sizeof(PNAME)), ""); + } else if (!index_has_root(mappedfile, xi)) { + fprintf(stderr, "%s: pathname '%s' is" + " a file, not a directory\n", PNAME, querydir); + } else { + cfg.format = NULL; + cfg.autoage = htmlautoagerange; + cfg.oldest = htmloldest; + cfg.newest = htmlnewest; + html = html_query(mappedfile, xi, &cfg); + fputs(html, stdout); + } munmap(mappedfile, totalsize); + sfree(pathbuf); } else if (mode == DUMP) { size_t maxpathlen; char *buf;