Hi Martin, Thanks for your review! Your comments were all quite helpful, and I applied all of your suggested changes. On Fri, Jan 31, 2020 at 07:52:02AM +0100, Martin Ågren wrote: > On Fri, 31 Jan 2020 at 00:03, Taylor Blau <me@xxxxxxxxxxxx> wrote: > > Instead of getting rid of the 'struct object_directory *', store that > > insead of a 'char *odb' in 'struct commit_graph'. Once the 'struct > > s/insead/instead/ Typo. Thanks for noticing. I fixed this in my local copy of this branch. > > if (open_ok) > > graph = load_commit_graph_one_fd_st(fd, &st); > > - else > > - graph = read_commit_graph_one(the_repository, opts.obj_dir); > > + else { > > + struct object_directory *odb; > > + if ((odb = find_odb(the_repository, opts.obj_dir))) > > + graph = read_commit_graph_one(the_repository, odb); > > + } > > I'm a tiny bit allergic to this assignment-within-if. It's wrapped by > another pair of parentheses, which both compilers and humans know to > interpret as "trust me, this is not a mistake", but I still find this > easier to read: > > odb = find_odb(...); > if (odb) > .... To be honest, I'm not such a fan of this style myself, but it seemed odd to me to write: struct object_directory *odb; odb = ...; if (odb) { } when we were really only trying to call 'find_odb()' and do something with its result, but only if it was non-NULL. I counted 152 of these assign-if's laying around with: $ git grep 'if ((.* =[^=]' | wc -l but it seems like they are in poor style (as evidenced by your and Junio's response later in the thread). So, I removed this and instead promoted 'odb' to a local variable at the function level, since we do that promotion anyway in a couple of patches later. This reduces the churn, and avoids either an assign-if, or a define/assign/check. > > --- a/builtin/commit.c > > +++ b/builtin/commit.c > > > +#include "object-store.h" No; this is a stray left over from some development on this branch. I'll remove it. > This is the only change in this file, which looks a bit odd. I haven't > actually applied your patches, to be honest, but is this inclusion > really needed? > > > --- a/commit-graph.c > > +++ b/commit-graph.c > > > +struct object_directory *find_odb(struct repository *r, const char *obj_dir) > > This doesn't look commit-graph related -- could/should it go somewhere > else? I'll respond in more complete detail further down in the thread, but the short answer is "yes, this should go in builtin/commit-graph.c". > > +{ > > + struct object_directory *odb; > > + char *obj_dir_real = real_pathdup(obj_dir, 1); > > + int cmp = -1; > > + > > + prepare_alt_odb(r); > > + for (odb = r->objects->odb; odb; odb = odb->next) { > > + cmp = strcmp(obj_dir_real, real_path(odb->path)); > > + if (!cmp) > > + break; > > + } > > At this point, either odb is NULL or cmp is zero. Those are the only two > ways out of the loop. > > > + free(obj_dir_real); > > + > > + if (cmp) > > + odb = NULL; > > Meaning that this doesn't do much? If the most recent comparison failed, > it's because we didn't find anything, so odb will be NULL. > > > + return odb; > > +} > > I think you could drop `cmp` and that final check, and write the loop > body as "if (!strcmp(...)) break". You could also have an empty loop > body, but I wouldn't go there -- I'd find that less readable. (Maybe > that's just me.) Thanks, I changed this to remove the 'cmp' check outside of the loop, which I agree is unnecessary. > Martin Thanks, Taylor