Okay, after thinking about it I did not like that the --verbose argument was ignored when a format was specified. But since, as it turns out, the --verbose argument was just a way to print all the metadata, I have added an argument for formatting the metadata too. So now we are even. In the meanwhile I have also renamed the new arguments and the format specifiers.
Again, the help page will explain the new situation:
$ gnunet-search --help
gnunet-search [OPTIONS] KEYWORD
Search GNUnet for files that were published on GNUnet
Arguments mandatory for long options are also mandatory for short options.
-a, --anonymity=LEVEL set the desired LEVEL of receiver-anonymity
-c, --config=FILENAME use configuration file FILENAME
-F, --dir-printf=FORMAT write the search results for directories
according to FORMAT, where %f is the
directory's name, %u is the directory's URI, %m
is the directory's mime type (always equal to
`application/gnunet-directory`), %n is the
search result number and %a is the complete
list of all the printable metadata available,
in which each field is displayed according to
the --prop-printf argument; if missing defaults
to the --printf argument; if the latter is
missing too defaults to `#%n:\ngnunet-download
-o "%f" -R %u\n\n`
-f, --printf=FORMAT write the search results according to FORMAT,
where %f is the file's name, %u is the file's
URI, %m is the file's mime type, %n is the
search result number and %a is the complete
list of all the printable metadata available,
in which each field is displayed according to
the --prop-printf argument; if missing defaults
to `#%n:\ngnunet-download -o "%f" %u\n\n`
-h, --help print this help
-L, --log=LOGLEVEL configure logging to use LOGLEVEL
-l, --logfile=FILENAME configure logging to write logs to FILENAME
-N, --results=VALUE automatically terminate search after VALUE
results are found
-n, --no-network only search the local peer (no P2P network
search)
-o, --output=PREFIX write search results to file starting with PREFIX
-p, --prop-printf=FORMAT when the %a format specifier appears in --printf
or --dir-printf, list each property according
to FORMAT, where %p is the property's content,
%l is the property's length in bytes, %t is the
property type, %i is the property type's unique
identifier and %w is the name of the plugin
that provided the information; if missing
defaults to `\t%t: %p\n`
-t, --timeout=DELAY automatically terminate search after DELAY
-V, --verbose be verbose
-v, --version print the version number
Report bugs to [email protected].
Home page: http://www.gnu.org/s/gnunet/
General help using GNU software: http://www.gnu.org/gethelp/
Now, besides the obvious question “Do you like the idea?”, I would like
also to ask a few other questions too:
1. What do you think about the fact that I have named the new arguments
--printf, --dir-printf and --prop-printf? Do you think that alternative
names would be better?
2. What do you think about the fact that the format specifiers for
--printf and --dir-printf use these letters? Do you think that other
letters would be more obvious?
- %f – the file's name
- %u – the file's URI
- %m – the file's mime type
- %n – the search result number
- %a – the complete list of all the printable metadata available
3. What do you think about the fact that the format specifiers for
--prop-printf use these other letters?
- %p – the property's content
- %l – the property's length in bytes
- %t – the property type
- %i – the property type's unique identifier
- %w – where the information came from
4. Do you think that the help page is clear enough?
5. Do you like the idea?
I really hope that my proposal does not sound intrusive and actually you
like this idea as much as I do. Providing printf-like arguments gives
infinite possibilities for shell scripting.
Once again, please find attached a patch, or alternatively the single file
that I have edited.
P.S. Since it is a standalone program, if you want to play with this
patched version without having to recompile the entire GNUnet, you can just
launch:
unzip gnunet-search.rev2.zip
ln -s /usr/include/gnunet/gnunet_fs_service.h gnunet_fs_service.h
ln -s /usr/include/gnunet/platform.h platform.h
gcc -lgnunetutil -lgnunetfs -I/usr/include/gnunet -o
'gnunet-search-test' gnunet-search.c
./gnunet-search-test -f '%n. %f\n' 'commons'
(if you follow these steps the program will be compiled without libextractor
and the %t specifier in --prop-printf will not be available.)
--madmurphy
On Fri, Feb 4, 2022 at 6:21 PM madmurphy <[email protected]> wrote:
> Hi GNUnet folks!
>
> I have edited the gnunet-search utility to accept a --format and a
> --dir-format parameters and produce a printf-like output. It was pretty
> easy to do, I only had to edit gnunet/src/fs/gnunet-search.c
> <https://git.gnunet.org/gnunet.git/tree/src/fs/gnunet-search.c?id=65f9e37ce036acdfab29b25b9b6f69de1b126962>.
> The new text printed by gnunet-search --help can explain the two new
> arguments in detail:
>
> $ gnunet-search --help
>
> gnunet-search [OPTIONS] KEYWORD
> Search GNUnet for files that were published on GNUnet
> Arguments mandatory for long options are also mandatory for short options.
> -a, --anonymity=LEVEL set the desired LEVEL of receiver-anonymity
> -c, --config=FILENAME use configuration file FILENAME
> -F, --dir-format=DIRFORMAT write search results for directories according to
> DIRFORMAT, where %n is the result number, %f is
> the file's name and %u is the file's URI; if
> missing defaults to FORMAT; if the latter is
> missing too defaults to '#%n:\ngnunet-download
> -o "%f" -R %u\n\n'
> -f, --format=FORMAT write search results according to FORMAT, where
> %n is the result number, %f is the file's name
> and %u is the file's URI; if missing defaults
> to '#%n:\ngnunet-download -o "%f" %u\n\n')
> -h, --help print this help
> -L, --log=LOGLEVEL configure logging to use LOGLEVEL
> -l, --logfile=FILENAME configure logging to write logs to FILENAME
> -N, --results=VALUE automatically terminate search after VALUE
> results are found
> -n, --no-network only search the local peer (no P2P network
> search)
> -o, --output=PREFIX write search results to file starting with PREFIX
> -t, --timeout=DELAY automatically terminate search after DELAY
> -V, --verbose be verbose
> -v, --version print the version number
> Report bugs to [email protected].
> Home page: http://www.gnu.org/s/gnunet/
> General help using GNU software: http://www.gnu.org/gethelp/
>
> Basically with this new patch launching
>
> gnunet-search commons
>
> and launching
>
> gnunet-search --format='#%n:\ngnunet-download -o "%f" %u\n\n' \
> --dir-format='#%n:\ngnunet-download -o "%f" -R %u\n\n' \
> commons
>
> are equivalent.
>
> What do you think? I hope you like the idea.
>
> I have done my best to stick to the coding style of the rest of the
> program. But a good code review is more than welcomed.
>
> Please find attached a patch, or alternatively the single file I have
> edited.
>
> --madmurphy
>
<<attachment: gnunet-search.patch2.zip>>
<<attachment: gnunet-search.rev2.zip>>
