git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [RFC/PATCH 04/48] builtin/apply: extract line_by_line_fuzzy_match() from match_fragment()

From
Stefan Beller <sbeller@google.com>
Date
Mar 9, 2016, 22:55 UTC
Message-ID
<CAGZ79kbKCZGrBw8OOJzMES0BpMm1V8KQ6Xh2oS5ARB9KNMo+dA@mail.gmail.com>
In-Reply-To
<1457545756-20616-5-git-send-email-chriscool@tuxfamily.org>

On Wed, Mar 9, 2016 at 9:48 AM, Christian Couder <christian.couder@gmail.com> wrote:

Some words in the commit message would be nice here as this is one of the patches, which isn't "obviously" a good thing to to. This comment also applies to "builtin/apply: introduce 'struct apply_state' to start libifying" where you lay out the plan for the next ~40 patches.

I have only skimmed quickly over the other patches.
Show 165 quoted lines
> Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
> ---
>  builtin/apply.c | 125 ++++++++++++++++++++++++++++++++------------------------
>  1 file changed, 71 insertions(+), 54 deletions(-)
>
> diff --git a/builtin/apply.c b/builtin/apply.c
> index c99c859..7d7a8ab 100644
> --- a/builtin/apply.c
> +++ b/builtin/apply.c
> @@ -2244,6 +2244,74 @@ static void update_pre_post_images(struct image *preimage,
>         postimage->nr -= reduced;
>  }
>
> +static int line_by_line_fuzzy_match(struct image *img,
> +                                   struct image *preimage,
> +                                   struct image *postimage,
> +                                   unsigned long try,
> +                                   int try_lno,
> +                                   int preimage_limit)
> +{
> +       int i;
> +       size_t imgoff = 0;
> +       size_t preoff = 0;
> +       size_t postlen = postimage->len;
> +       size_t extra_chars;
> +       char *buf;
> +       char *preimage_eof;
> +       char *preimage_end;
> +       struct strbuf fixed;
> +       char *fixed_buf;
> +       size_t fixed_len;
> +
> +       for (i = 0; i < preimage_limit; i++) {
> +               size_t prelen = preimage->line[i].len;
> +               size_t imglen = img->line[try_lno+i].len;
> +
> +               if (!fuzzy_matchlines(img->buf + try + imgoff, imglen,
> +                                     preimage->buf + preoff, prelen))
> +                       return 0;
> +               if (preimage->line[i].flag & LINE_COMMON)
> +                       postlen += imglen - prelen;
> +               imgoff += imglen;
> +               preoff += prelen;
> +       }
> +
> +       /*
> +        * Ok, the preimage matches with whitespace fuzz.
> +        *
> +        * imgoff now holds the true length of the target that
> +        * matches the preimage before the end of the file.
> +        *
> +        * Count the number of characters in the preimage that fall
> +        * beyond the end of the file and make sure that all of them
> +        * are whitespace characters. (This can only happen if
> +        * we are removing blank lines at the end of the file.)
> +        */
> +       buf = preimage_eof = preimage->buf + preoff;
> +       for ( ; i < preimage->nr; i++)
> +               preoff += preimage->line[i].len;
> +       preimage_end = preimage->buf + preoff;
> +       for ( ; buf < preimage_end; buf++)
> +               if (!isspace(*buf))
> +                       return 0;
> +
> +       /*
> +        * Update the preimage and the common postimage context
> +        * lines to use the same whitespace as the target.
> +        * If whitespace is missing in the target (i.e.
> +        * if the preimage extends beyond the end of the file),
> +        * use the whitespace from the preimage.
> +        */
> +       extra_chars = preimage_end - preimage_eof;
> +       strbuf_init(&fixed, imgoff + extra_chars);
> +       strbuf_add(&fixed, img->buf + try, imgoff);
> +       strbuf_add(&fixed, preimage_eof, extra_chars);
> +       fixed_buf = strbuf_detach(&fixed, &fixed_len);
> +       update_pre_post_images(preimage, postimage,
> +                              fixed_buf, fixed_len, postlen);
> +       return 1;
> +}
> +
>  static int match_fragment(struct image *img,
>                           struct image *preimage,
>                           struct image *postimage,
> @@ -2253,7 +2321,7 @@ static int match_fragment(struct image *img,
>                           int match_beginning, int match_end)
>  {
>         int i;
> -       char *fixed_buf, *buf, *orig, *target;
> +       char *fixed_buf, *orig, *target;
>         struct strbuf fixed;
>         size_t fixed_len, postlen;
>         int preimage_limit;
> @@ -2314,6 +2382,7 @@ static int match_fragment(struct image *img,
>                  * There must be one non-blank context line that match
>                  * a line before the end of img.
>                  */
> +               char *buf;
>                 char *buf_end;
>
>                 buf = preimage->buf;
> @@ -2334,59 +2403,7 @@ static int match_fragment(struct image *img,
>          * we need it to adjust whitespace if we match.
>          */
>         if (ws_ignore_action == ignore_ws_change) {
> -               size_t imgoff = 0;
> -               size_t preoff = 0;
> -               size_t postlen = postimage->len;
> -               size_t extra_chars;
> -               char *preimage_eof;
> -               char *preimage_end;
> -               for (i = 0; i < preimage_limit; i++) {
> -                       size_t prelen = preimage->line[i].len;
> -                       size_t imglen = img->line[try_lno+i].len;
> -
> -                       if (!fuzzy_matchlines(img->buf + try + imgoff, imglen,
> -                                             preimage->buf + preoff, prelen))
> -                               return 0;
> -                       if (preimage->line[i].flag & LINE_COMMON)
> -                               postlen += imglen - prelen;
> -                       imgoff += imglen;
> -                       preoff += prelen;
> -               }
> -
> -               /*
> -                * Ok, the preimage matches with whitespace fuzz.
> -                *
> -                * imgoff now holds the true length of the target that
> -                * matches the preimage before the end of the file.
> -                *
> -                * Count the number of characters in the preimage that fall
> -                * beyond the end of the file and make sure that all of them
> -                * are whitespace characters. (This can only happen if
> -                * we are removing blank lines at the end of the file.)
> -                */
> -               buf = preimage_eof = preimage->buf + preoff;
> -               for ( ; i < preimage->nr; i++)
> -                       preoff += preimage->line[i].len;
> -               preimage_end = preimage->buf + preoff;
> -               for ( ; buf < preimage_end; buf++)
> -                       if (!isspace(*buf))
> -                               return 0;
> -
> -               /*
> -                * Update the preimage and the common postimage context
> -                * lines to use the same whitespace as the target.
> -                * If whitespace is missing in the target (i.e.
> -                * if the preimage extends beyond the end of the file),
> -                * use the whitespace from the preimage.
> -                */
> -               extra_chars = preimage_end - preimage_eof;
> -               strbuf_init(&fixed, imgoff + extra_chars);
> -               strbuf_add(&fixed, img->buf + try, imgoff);
> -               strbuf_add(&fixed, preimage_eof, extra_chars);
> -               fixed_buf = strbuf_detach(&fixed, &fixed_len);
> -               update_pre_post_images(preimage, postimage,
> -                               fixed_buf, fixed_len, postlen);
> -               return 1;
> +               return line_by_line_fuzzy_match(img, preimage, postimage, try, try_lno, preimage_limit);
>         }
>
>         if (ws_error_action != correct_ws_error)
> --
> 2.8.0.rc1.49.gca61272
>
Previous: Christian CouderNext: Christian Couder
Message 9 of 58 in “Libifying git apply”
  1. 00/48 Libifying git applyChristian Couder, Mar 9, 2016
  2. 01/48 builtin/apply: avoid parameter shadowing 'p_value' globalChristian Couder, Mar 9, 2016
  3. Junio C HamanoMar 9, 2016
  4. Duy NguyenMar 10, 2016
  5. Christian CouderMar 10, 2016
  6. 02/48 builtin/apply: avoid parameter shadowing 'linenr' globalChristian Couder, Mar 9, 2016
  7. 03/48 builtin/apply: avoid local variable shadowing 'len' parameterChristian Couder, Mar 9, 2016
  8. 04/48 builtin/apply: extract line_by_line_fuzzy_match() from match_fragment()Christian Couder, Mar 9, 2016
  9. Stefan BellerMar 9, 2016
  10. Christian CouderMar 10, 2016
  11. 05/48 builtin/apply: move 'options' variable into cmd_apply()Christian Couder, Mar 9, 2016
  12. 06/48 builtin/apply: introduce 'struct apply_state' to start libifyingChristian Couder, Mar 9, 2016
  13. 07/48 builtin/apply: move 'newfd' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  14. 08/48 builtin/apply: move 'unidiff_zero' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  15. 09/48 builtin/apply: move 'check' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  16. 10/48 builtin/apply: move 'check_index' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  17. 11/48 builtin/apply: move 'apply_in_reverse' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  18. 12/48 builtin/apply: move 'apply_with_reject' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  19. 13/48 builtin/apply: move 'apply_verbosely' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  20. 14/48 builtin/apply: move 'update_index' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  21. 15/48 builtin/apply: move 'allow_overlap' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  22. 16/48 builtin/apply: move 'cached' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  23. 17/48 builtin/apply: move 'diffstat' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  24. 18/48 builtin/apply: move 'numstat' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  25. 19/48 builtin/apply: move 'summary' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  26. 20/48 builtin/apply: move 'threeway' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  27. 21/48 builtin/apply: move 'no-add' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  28. 22/48 builtin/apply: move 'unsafe_paths' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  29. 23/48 builtin/apply: move 'line_termination' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  30. 24/48 builtin/apply: move 'fake_ancestor' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  31. 25/48 builtin/apply: move 'p_context' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  32. 26/48 builtin/apply: move 'apply' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  33. 27/48 builtin/apply: move 'read_stdin' global into cmd_apply()Christian Couder, Mar 9, 2016
  34. 28/48 builtin/apply: move 'lock_file' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  35. 29/48 builtin/apply: move 'patch_input_file' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  36. 30/48 builtin/apply: move 'limit_by_name' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  37. 31/48 builtin/apply: move 'has_include' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  38. 32/48 builtin/apply: move 'p_value' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  39. 33/48 builtin/apply: move 'p_value_known' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  40. 34/48 builtin/apply: move 'root' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  41. 35/48 builtin/apply: move 'whitespace_error' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  42. 36/48 builtin/apply: move 'whitespace_option' into 'struct apply_state'Christian Couder, Mar 9, 2016
  43. 37/48 builtin/apply: remove whitespace_option arg from set_default_whitespace_mode()Christian Couder, Mar 9, 2016
  44. 38/48 builtin/apply: move 'squelch_whitespace_errors' into 'struct apply_state'Christian Couder, Mar 9, 2016
  45. 39/48 builtin/apply: move 'applied_after_fixing_ws' into 'struct apply_state'Christian Couder, Mar 9, 2016
  46. 40/48 builtin/apply: move 'ws_error_action' into 'struct apply_state'Christian Couder, Mar 9, 2016
  47. 41/48 builtin/apply: move 'ws_ignore_action' into 'struct apply_state'Christian Couder, Mar 9, 2016
  48. 42/48 builtin/apply: move 'max_change' and 'max_len' into 'struct apply_state'Christian Couder, Mar 9, 2016
  49. 43/48 builtin/apply: move 'linenr' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  50. 44/48 builtin/apply: move 'fn_table' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  51. 45/48 builtin/apply: move 'symlink_changes' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  52. 46/48 builtin/apply: move 'state' init into init_apply_state()Christian Couder, Mar 9, 2016
  53. 47/48 builtin/apply: move 'state' check into check_apply_state()Christian Couder, Mar 9, 2016
  54. 48/48 builtin/apply: move applying patches into apply_all_patches()Christian Couder, Mar 9, 2016
  55. Junio C HamanoMar 9, 2016
  56. Christian CouderMar 11, 2016
  57. Duy NguyenMar 10, 2016
  58. Christian CouderMar 11, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.