Re: [PATCH v3 8/9] bugreport: list contents of $OBJDIR/info
- From
Johannes Schindelin <johannes.schindelin@gmx.de>
- Date
- Oct 28, 2019, 15:51 UTC
- Message-ID
- <nycvar.QRO.7.76.6.1910281645580.46@tvgsbejvaqbjf.bet>
- In-Reply-To
- <20191025025129.250049-9-emilyshaffer@google.com>
Hi Emily,
On Thu, 24 Oct 2019, Emily Shaffer wrote:
Show 7 quoted lines
> Miscellaneous information used about the object store can end up in > .git/objects/info; this can help us understand what may be going on with > the object store when the user is reporting a bug. Otherwise, it could > be difficult to track down what is going wrong with an object which > isn't kept locally to .git/objects/ or .git/objects/pack. Having some > understanding of where the user's objects may be kept can save us some > hops during the bug reporting process.
Makes sense.
Show 33 quoted lines
>
> Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
> ---
> bugreport.c | 58 +++++++++++++++++++++++++++++++++++++++++++++
> bugreport.h | 6 +++++
> builtin/bugreport.c | 7 ++++++
> 3 files changed, 71 insertions(+)
>
> diff --git a/bugreport.c b/bugreport.c
> index 79ddb8baaa..ce15904fec 100644
> --- a/bugreport.c
> +++ b/bugreport.c
> @@ -6,6 +6,7 @@
> #include "help.h"
> #include "run-command.h"
> #include "strbuf.h"
> +#include "string-list.h"
> #include "version.h"
>
> #include "dirent.h"
> @@ -171,6 +172,41 @@ void list_contents_of_dir(struct string_list *contents, struct strbuf *dirpath,
> }
> }
>
> +/**
> + * Fills 'contents' with a list of all directories within the provided
> + * directory, recursing into each directory.
> + */
> +void list_contents_of_dir_recursively(struct string_list *contents,
> + struct strbuf *dirpath)
> +{
> + struct string_list current_contents = STRING_LIST_INIT_DUP;
> + struct string_list current_subdirs = STRING_LIST_INIT_DUP;Rather than populating those string lists, why not write into the `contents` directly, _while_ traversing the directories?
But if you really, really want to use string lists (hey, I'm a fan, I introduced them to Git's source code, after all), then please make sure to release them in the end, too.
Show 9 quoted lines
> + struct string_list_item *it;
> + struct strbuf buf = STRBUF_INIT;
> +
> + list_contents_of_dir(¤t_contents, dirpath, 0, 0);
> + for_each_string_list_item(it, ¤t_contents) {
> + strbuf_reset(&buf);
> + strbuf_addbuf(&buf, dirpath);
> + strbuf_complete(&buf, '/');
> + strbuf_addstr(&buf, it->string);You don't need a separate `strbuf` for that: just complete `dirpath` with a trailing slash, remember the length, then in each iteration reset the length and append the current subdirectory name.
Show 45 quoted lines
> +
> + string_list_append(contents, buf.buf);
> + }
> +
> + list_contents_of_dir(¤t_subdirs, dirpath, 1, DT_DIR);
> + for_each_string_list_item(it, ¤t_subdirs) {
> + if (strcmp(it->string, ".") == 0
> + || strcmp(it->string, "..") == 0)
> + continue;
> + strbuf_reset(&buf);
> + strbuf_addbuf(&buf, dirpath);
> + strbuf_complete(&buf, '/');
> + strbuf_addstr(&buf, it->string);
> +
> + list_contents_of_dir_recursively(contents, &buf);
> + }
> +}
>
> void get_object_counts(struct strbuf *obj_info)
> {
> @@ -240,3 +276,25 @@ void get_packed_object_summary(struct strbuf *obj_info)
> strbuf_complete_line(obj_info);
> }
> }
> +
> +void get_object_info_summary(struct strbuf *obj_info)
> +{
> + // strbuf += GITDIR/info/:
> + // recursively list contents of $GIT_OBJECT_DIRECTORY/info
> + struct strbuf dirpath = STRBUF_INIT;
> + struct string_list contents = STRING_LIST_INIT_DUP;
> + struct string_list_item *entry;
> +
> + strbuf_reset(obj_info);
> +
> + strbuf_addstr(&dirpath, get_object_directory());
> + strbuf_complete(&dirpath, '/');
> + strbuf_addstr(&dirpath, "info/");
> +
> + list_contents_of_dir_recursively(&contents, &dirpath);
> +
> + for_each_string_list_item(entry, &contents) {
> + strbuf_addstr(obj_info, entry->string);
> + strbuf_complete_line(obj_info);
> + }As mentioned earlier, I would rather write things into `obj_info` directly, without detouring to a string list.
Or, if you decide that you want to write to a `FILE *` anyway, I'd rather avoid the detour to the `strbuf` altogether.
Ciao, Dscho
Show 37 quoted lines
> +} > diff --git a/bugreport.h b/bugreport.h > index 11ff7df41b..4f5e2d1b9a 100644 > --- a/bugreport.h > +++ b/bugreport.h > @@ -30,3 +30,9 @@ void get_loose_object_summary(struct strbuf *obj_info); > * hook_info will be discarded. > */ > void get_packed_object_summary(struct strbuf *obj_info); > + > +/** > + * Adds a list of all contents (recursively) of '.git/objects/info'. The > + * previous contents of hook_info will be discarded. > + */ > +void get_object_info_summary(struct strbuf *obj_info); > diff --git a/builtin/bugreport.c b/builtin/bugreport.c > index da91a3944e..8aad33a9b0 100644 > --- a/builtin/bugreport.c > +++ b/builtin/bugreport.c > @@ -72,6 +72,13 @@ int cmd_bugreport(int argc, const char **argv, const char *prefix) > get_packed_object_summary(&buffer); > strbuf_write(&buffer, report); > > + add_header(report, "Object Info Data"); > + get_object_info_summary(&buffer); > + strbuf_write(&buffer, report); > + > + // Close file > + // open file in editor > + launch_editor(report_path, NULL, NULL); > fclose(report); > > launch_editor(report_path.buf, NULL, NULL); > -- > 2.24.0.rc0.303.g954a862665-goog > >