commit cca5682ee944c46413628161f13e2779718f0536 from: Stefan Sperling date: Wed Nov 18 16:34:28 2020 UTC allow for configuring a custom file atomizer with got_diff_get_config() commit - 24e87ea36353362f676afa722d0b7361a7223cbc commit + cca5682ee944c46413628161f13e2779718f0536 blob - 0d4400c94065902d33850e15657291c27011c982 blob + 6d0ab279e0da6c13e651b072c3cc470271db4145 --- lib/blame.c +++ lib/blame.c @@ -53,7 +53,7 @@ struct got_blame_line { struct got_blame { FILE *f; off_t size; - const struct diff_config *cfg; + struct diff_config *cfg; size_t filesize; int nlines; int nannotated; @@ -273,6 +273,7 @@ blame_close(struct got_blame *blame) err = got_error_from_errno("fclose"); free(blame->lines); free(blame->linemap2); + free(blame->cfg); free(blame); return err; } @@ -327,7 +328,10 @@ blame_open(struct got_blame **blamep, const char *path if (err || blame->nlines == 0) goto done; - blame->cfg = got_diff_get_config(GOT_DIFF_ALGORITHM_PATIENCE); + err = got_diff_get_config(&blame->cfg, GOT_DIFF_ALGORITHM_PATIENCE, + NULL, NULL); + if (err) + goto done; /* Don't include \n at EOF in the blame line count. */ if (blame->line_offsets[blame->nlines - 1] == blame->filesize) blob - 8dbab6f2166e74d05f55fa057f00e1e8602740fc blob + e22e81b5097ae6ae7772a348e7f8f31f7b2c6421 --- lib/diffreg.c +++ lib/diffreg.c @@ -105,16 +105,35 @@ got_diffreg_close(FILE *f1, char *p1, size_t size1, return err; } -const struct diff_config * -got_diff_get_config(enum got_diff_algorithm algorithm) +const struct got_error * +got_diff_get_config(struct diff_config **cfg, + enum got_diff_algorithm algorithm, + diff_atomize_func_t atomize_func, void *atomize_func_data) { + *cfg = calloc(1, sizeof(**cfg)); + if (*cfg == NULL) + return got_error_from_errno("calloc"); + switch (algorithm) { case GOT_DIFF_ALGORITHM_PATIENCE: - return &diff_config_patience; + (*cfg)->algo = &patience; + break; case GOT_DIFF_ALGORITHM_MYERS: - return &diff_config_myers_then_myers_divide; + (*cfg)->algo = &myers_then_myers_divide; + break; + default: + return got_error_msg(GOT_ERR_NOT_IMPL, "bad diff algorithm"); } - return NULL; /* should not happen */ + + if (atomize_func) { + (*cfg)->atomize_func = atomize_func; + (*cfg)->atomize_func_data = atomize_func_data; + } else + (*cfg)->atomize_func = diff_atomize_text_by_line; + + (*cfg)->max_recursion_depth = 0; /* use default recursion depth */ + + return NULL; } const struct got_error * @@ -161,7 +180,7 @@ got_diffreg(struct got_diffreg_result **diffreg_result enum got_diff_algorithm algorithm, int ignore_whitespace) { const struct got_error *err = NULL; - const struct diff_config *cfg; + struct diff_config *cfg = NULL; char *p1 = NULL, *p2 = NULL; int f1_created = 0, f2_created = 0; size_t size1, size2; @@ -182,11 +201,9 @@ got_diffreg(struct got_diffreg_result **diffreg_result right = &d_right; } - cfg = got_diff_get_config(algorithm); - if (cfg == NULL) { - err = got_error(GOT_ERR_NOT_IMPL); + err = got_diff_get_config(&cfg, algorithm, NULL, NULL); + if (err) goto done; - } if (f1 == NULL) { f1_created = 1; @@ -237,6 +254,7 @@ got_diffreg(struct got_diffreg_result **diffreg_result (*diffreg_result)->size2 = size2; } done: + free(cfg); if (diffreg_result == NULL) { diff_data_free(left); diff_data_free(right); blob - 569cb201c391ea456cd142edbaf9f85ae5d91ba7 blob + 3a995c48e676b6b3ef159bad68c8c69a070427d5 --- lib/got_lib_diff.h +++ lib/got_lib_diff.h @@ -45,7 +45,8 @@ struct got_diffreg_result { #define GOT_DIFF_CONFLICT_MARKER_SEP "=======" #define GOT_DIFF_CONFLICT_MARKER_END ">>>>>>>" -const struct diff_config *got_diff_get_config(enum got_diff_algorithm); +const struct got_error *got_diff_get_config(struct diff_config **, + enum got_diff_algorithm, diff_atomize_func_t, void *); const struct got_error *got_diff_prepare_file(FILE *, char **, size_t *, struct diff_data *, const struct diff_config *, int); const struct got_error *got_diffreg(struct got_diffreg_result **, FILE *, FILE *,