X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=plocate-build.cpp;h=227eae50b1165a5b4bb469bfaf0a42e5e9fee811;hb=7f39444852308224240ebfb75e0bf8f39403afa0;hp=02b18d0e42e00dc577ad9d7160d2f53d05433bfb;hpb=a73ad8311c5b272888c17829f390e1c35a5d624d;p=plocate diff --git a/plocate-build.cpp b/plocate-build.cpp index 02b18d0..227eae5 100644 --- a/plocate-build.cpp +++ b/plocate-build.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -83,10 +84,10 @@ void handle_directory(FILE *fp, DatabaseReceiver *receiver) int type = getc(fp); if (type == DBE_NORMAL) { string filename = read_cstr(fp); - receiver->add_file(dir_path + "/" + filename); + receiver->add_file(dir_path + "/" + filename, unknown_dir_time); } else if (type == DBE_DIRECTORY) { string dirname = read_cstr(fp); - receiver->add_file(dir_path + "/" + dirname); + receiver->add_file(dir_path + "/" + dirname, unknown_dir_time); } else { return; // Probably end. } @@ -116,7 +117,7 @@ void read_plaintext(FILE *fp, DatabaseReceiver *receiver) } if (!s.empty() && s.back() == '\n') s.pop_back(); - receiver->add_file(move(s)); + receiver->add_file(move(s), unknown_dir_time); } } @@ -146,7 +147,7 @@ void read_mlocate(FILE *fp, DatabaseReceiver *receiver) } } -void do_build(const char *infile, const char *outfile, int block_size, bool plaintext) +void do_build(const char *infile, const char *outfile, int block_size, bool plaintext, bool check_visibility) { FILE *infp = fopen(infile, "rb"); if (infp == nullptr) { @@ -166,8 +167,8 @@ void do_build(const char *infile, const char *outfile, int block_size, bool plai } string dictionary = builder.train(1024); - DatabaseBuilder db(outfile, block_size, dictionary); - Corpus *corpus = db.start_corpus(); + DatabaseBuilder db(outfile, /*owner=*/-1, block_size, dictionary, check_visibility); + DatabaseReceiver *corpus = db.start_corpus(/*store_dir_times=*/false); if (plaintext) { read_plaintext(infp, corpus); } else { @@ -175,7 +176,7 @@ void do_build(const char *infile, const char *outfile, int block_size, bool plai } fclose(infp); - dprintf("Read %zu files from %s\n", corpus->num_files, infile); + dprintf("Read %zu files from %s\n", corpus->num_files_seen(), infile); db.finish_corpus(); } @@ -189,24 +190,39 @@ void usage() "\n" " -b, --block-size SIZE number of filenames to store in each block (default 32)\n" " -p, --plaintext input is a plaintext file, not an mlocate database\n" + " -l, --require-visibility FLAG check visibility before reporting files\n" " --help print this help\n" " --version print version information\n"); } void version() { - printf("plocate-build %s\n", PLOCATE_VERSION); + printf("plocate-build %s\n", PACKAGE_VERSION); printf("Copyright 2020 Steinar H. Gunderson\n"); printf("License GPLv2+: GNU GPL version 2 or later .\n"); printf("This is free software: you are free to change and redistribute it.\n"); printf("There is NO WARRANTY, to the extent permitted by law.\n"); } +bool parse_bool(const string &str, bool *result) +{ + if (str == "0" || str == "no") { + *result = false; + return true; + } + if (str == "1" || str == "yes") { + *result = true; + return true; + } + return false; +} + int main(int argc, char **argv) { static const struct option long_options[] = { { "block-size", required_argument, 0, 'b' }, { "plaintext", no_argument, 0, 'p' }, + { "require-visibility", required_argument, 0, 'l' }, { "help", no_argument, 0, 'h' }, { "version", no_argument, 0, 'V' }, { "debug", no_argument, 0, 'D' }, // Not documented. @@ -215,11 +231,12 @@ int main(int argc, char **argv) int block_size = 32; bool plaintext = false; + bool check_visibility = true; setlocale(LC_ALL, ""); for (;;) { int option_index = 0; - int c = getopt_long(argc, argv, "b:hpVD", long_options, &option_index); + int c = getopt_long(argc, argv, "b:hpl:VD", long_options, &option_index); if (c == -1) { break; } @@ -230,6 +247,13 @@ int main(int argc, char **argv) case 'p': plaintext = true; break; + case 'l': + if (!parse_bool(optarg, &check_visibility) != 0) { + fprintf(stderr, "plocate-build: invalid value `%s' for --%s\n", + optarg, "require-visibility"); + exit(EXIT_FAILURE); + } + break; case 'h': usage(); exit(0); @@ -249,6 +273,6 @@ int main(int argc, char **argv) exit(1); } - do_build(argv[optind], argv[optind + 1], block_size, plaintext); + do_build(argv[optind], argv[optind + 1], block_size, plaintext, check_visibility); exit(EXIT_SUCCESS); }