Download raw body.
match committed patches with got log -p -S
Stefan Sperling <stsp@stsp.name> wrote: > On Wed, Jun 08, 2022 at 12:06:21PM +0200, Omar Polo wrote: > > my only complaint is that doing a got_opentemp per inspected commit is > > quite a lot, maybe we can re-use the same fd and truncate it before > > usage. > > Like this? yes! it's even better than what i was thinking actually; ok for me > diff 7c115ff11cb012b171cd245c340398bce925b6df 06651924351e8d3f70588651a87a27ee938418e7 > blob - 9c71b5d3bdb6aaff2b375c0955d89bb66bb9d325 > blob + 28ba9a46f202c773426d431a909c5dec6304d3ca > --- got/got.c > +++ got/got.c > @@ -3776,10 +3776,9 @@ match_changed_paths(int *have_match, struct got_pathli > static const struct got_error * > match_patch(int *have_match, struct got_commit_object *commit, > struct got_object_id *id, const char *path, int diff_context, > - struct got_repository *repo, regex_t *regex) > + struct got_repository *repo, regex_t *regex, FILE *f) > { > const struct got_error *err = NULL; > - FILE *f; > char *line = NULL; > size_t linesize = 0; > ssize_t linelen; > @@ -3787,9 +3786,9 @@ match_patch(int *have_match, struct got_commit_object > > *have_match = 0; > > - f = got_opentemp(); > - if (f == NULL) > - return got_error_from_errno("got_opentemp"); > + err = got_opentemp_truncate(f); > + if (err) > + return err; > > err = print_patch(commit, id, path, diff_context, repo, f); > if (err) > @@ -3808,8 +3807,6 @@ match_patch(int *have_match, struct got_commit_object > } > done: > free(line); > - if (fclose(f) == EOF && err == NULL) > - err = got_error_from_errno("fclose"); > return err; > } > > @@ -4016,7 +4013,8 @@ print_commits(struct got_object_id *root_id, struct go > struct got_repository *repo, const char *path, int show_changed_paths, > int show_patch, const char *search_pattern, int diff_context, int limit, > int log_branches, int reverse_display_order, > - struct got_reflist_object_id_map *refs_idmap, int one_line) > + struct got_reflist_object_id_map *refs_idmap, int one_line, > + FILE *tmpfile) > { > const struct got_error *err; > struct got_commit_graph *graph; > @@ -4079,7 +4077,8 @@ print_commits(struct got_object_id *root_id, struct go > &changed_paths, ®ex); > if (have_match == 0 && show_patch) { > err = match_patch(&have_match, commit, id, > - path, diff_context, repo, ®ex); > + path, diff_context, repo, ®ex, > + tmpfile); > if (err) > break; > } > @@ -4207,6 +4206,7 @@ cmd_log(int argc, char *argv[]) > const char *errstr; > struct got_reflist_head refs; > struct got_reflist_object_id_map *refs_idmap = NULL; > + FILE *tmpfile = NULL; > > TAILQ_INIT(&refs); > > @@ -4398,9 +4398,18 @@ cmd_log(int argc, char *argv[]) > worktree = NULL; > } > > + if (search_pattern && show_patch) { > + tmpfile = got_opentemp(); > + if (tmpfile == NULL) { > + error = got_error_from_errno("got_opentemp"); > + goto done; > + } > + } > + > error = print_commits(start_id, end_id, repo, path ? path : "", > show_changed_paths, show_patch, search_pattern, diff_context, > - limit, log_branches, reverse_display_order, refs_idmap, one_line); > + limit, log_branches, reverse_display_order, refs_idmap, one_line, > + tmpfile); > done: > free(path); > free(repo_path); > @@ -4414,6 +4423,8 @@ done: > } > if (refs_idmap) > got_reflist_object_id_map_free(refs_idmap); > + if (tmpfile && fclose(tmpfile) == EOF && error == NULL) > + error = got_error_from_errno("fclose"); > got_ref_list_free(&refs); > return error; > } > blob - 82d4fbdc322a75119d06855ff7c5d7879bcb9648 > blob + 5df60c352cb02c68869dfd77742c78669f368df6 > --- include/got_opentemp.h > +++ include/got_opentemp.h > @@ -37,3 +37,6 @@ const struct got_error *got_opentemp_named(char **, FI > > /* Like got_opentemp_named() but returns a file descriptor instead of a FILE. */ > const struct got_error *got_opentemp_named_fd(char **, int *, const char *); > + > +/* Truncate a file. This is useful for re-using open temporary files. */ > +const struct got_error *got_opentemp_truncate(FILE *); > blob - 1c12d8425dd6f7aa30fb805c6ff288d3b84161c0 > blob + 63194824b5e659ee7b68160c5975355726baf8d1 > --- lib/diff.c > +++ lib/diff.c > @@ -31,6 +31,7 @@ > #include "got_path.h" > #include "got_cancel.h" > #include "got_worktree.h" > +#include "got_opentemp.h" > > #include "got_lib_diff.h" > #include "got_lib_delta.h" > @@ -52,18 +53,6 @@ add_line_offset(off_t **line_offsets, size_t *nlines, > } > > static const struct got_error * > -reset_file(FILE *f) > -{ > - if (fpurge(f) == EOF) > - return got_error_from_errno("fpurge"); > - if (ftruncate(fileno(f), 0L) == -1) > - return got_error_from_errno("ftruncate"); > - if (fseeko(f, 0L, SEEK_SET) == -1) > - return got_error_from_errno("fseeko"); > - return NULL; > -} > - > -static const struct got_error * > diff_blobs(off_t **line_offsets, size_t *nlines, > struct got_diffreg_result **resultp, struct got_blob_object *blob1, > struct got_blob_object *blob2, FILE *f1, FILE *f2, > @@ -91,12 +80,12 @@ diff_blobs(off_t **line_offsets, size_t *nlines, > *resultp = NULL; > > if (f1) { > - err = reset_file(f1); > + err = got_opentemp_truncate(f1); > if (err) > goto done; > } > if (f2) { > - err = reset_file(f2); > + err = got_opentemp_truncate(f2); > if (err) > goto done; > } > blob - e998f5bc48549bbbbbffb5ff88ae18e3e21c8c6f > blob + 4c4e3bbe901a58b588c927fbd65dd7620b43e919 > --- lib/opentemp.c > +++ lib/opentemp.c > @@ -113,3 +113,15 @@ got_opentemp_named_fd(char **path, int *outfd, const c > *outfd = fd; > return err; > } > + > +const struct got_error * > +got_opentemp_truncate(FILE *f) > +{ > + if (fpurge(f) == EOF) > + return got_error_from_errno("fpurge"); > + if (ftruncate(fileno(f), 0L) == -1) > + return got_error_from_errno("ftruncate"); > + if (fseeko(f, 0L, SEEK_SET) == -1) > + return got_error_from_errno("fseeko"); > + return NULL; > +}
match committed patches with got log -p -S