On Thu, Jan 28, 2010 at 04:03:01PM +0100, Daniel Näslund wrote: > @@ -588,18 +592,19 @@ > return SVN_NO_ERROR; > } > > -/* Indicate in *MATCHED whether the original text of HUNK > - * matches the patch TARGET at its current line. > - * When this function returns, neither TARGET->CURRENT_LINE nor the > - * file offset in the target file will have changed. > - * HUNK->ORIGINAL_TEXT will be reset. > - * Do temporary allocations in POOL. */ > +/* Indicate in *MATCHED whether the original text of HUNK matches the patch > + * TARGET at its current line. Lines within FUZZ lines of the start or end > + * of hunk will always match. When this function returns, neither
s/of hunk will/of HUNK will/ > + * TARGET->CURRENT_LINE nor the file offset in the target file will have > + * changed. HUNK->ORIGINAL_TEXT will be reset. Do temporary allocations in > + * POOL. */ > static svn_error_t * > match_hunk(svn_boolean_t *matched, patch_target_t *target, > - const svn_hunk_t *hunk, apr_pool_t *pool) > + const svn_hunk_t *hunk, int fuzz, apr_pool_t *pool) > { > svn_stringbuf_t *hunk_line; > const char *target_line; > + svn_linenum_t lines_read = 0; > svn_linenum_t saved_line; > svn_boolean_t hunk_eof; > svn_boolean_t lines_matched; > @@ -630,9 +635,20 @@ > eol_str, FALSE, > target->keywords, FALSE, > iterpool)); > + lines_read++; > + > SVN_ERR(read_line(target, &target_line, iterpool, iterpool)); > + Another extra line here. Do we really need to add it? > if (! hunk_eof) > - lines_matched = ! strcmp(hunk_line_translated, target_line); > + { > + if (lines_read <= fuzz && hunk->leading_context > fuzz) > + lines_matched = TRUE; > + else if (lines_read > hunk->original_length - fuzz && > + hunk->trailing_context > fuzz) > + lines_matched = TRUE; > + else > + lines_matched = ! strcmp(hunk_line_translated, target_line); > + } > } > while (lines_matched && ! (hunk_eof || target->eof)); > > @@ -720,14 +736,15 @@ > > /* Determine the line at which a HUNK applies to the TARGET file, > * and return an appropriate hunk_info object in *HI, allocated from > - * RESULT_POOL. If no correct line can be determined, > - * set HI->MATCHED_LINE to zero. > + * RESULT_POOL. Always set lines at start and end of HUNK text that is within > + * FUZZ offset to be matching. Set HI->FUZZ to FUZZ. If no correct line can s/Always set [blah blah] to be matching./Use fuzz factor FUZZ./ > + * be determined, set HI->MATCHED_LINE to zero. > * When this function returns, neither TARGET->CURRENT_LINE nor the > * file offset in the target file will have changed. > * Do temporary allocations in POOL. */ > static svn_error_t * > get_hunk_info(hunk_info_t **hi, patch_target_t *target, > - const svn_hunk_t *hunk, apr_pool_t *result_pool, > + const svn_hunk_t *hunk, int fuzz, apr_pool_t *result_pool, > apr_pool_t *scratch_pool) > { > svn_linenum_t matched_line; > @@ -778,6 +795,7 @@ > (*hi)->hunk = hunk; > (*hi)->matched_line = matched_line; > (*hi)->rejected = FALSE; > + (*hi)->fuzz = fuzz; > > return SVN_NO_ERROR; > } > @@ -833,13 +851,17 @@ > /* Copy HUNK_TEXT into TARGET, line by line, such that the line filter > * and transformation callbacks set on HUNK_TEXT by the diff parsing > * code in libsvn_diff will trigger. ABSPATH is the absolute path to the > - * file underlying TARGET. */ > + * file underlying TARGET. Do not copy the lines that is within FUZZ offset > + * from the beginning or end of hunk. N represents the number of lines in > + * HUNK_TEXT. It is ignored if FUZZ is zero. */ > static svn_error_t * > -copy_hunk_text(svn_stream_t *hunk_text, svn_stream_t *target, > - const char *abspath, apr_pool_t *scratch_pool) > +copy_hunk_lines(svn_stream_t *hunk_text, svn_stream_t *target, > + const char *abspath, int fuzz, int n, > + apr_pool_t *scratch_pool) Looking at the places where copy_hunk_lines() is called, it seems we can simplify the parameter list of this function a lot by passing a hunk_info_t *hi into copy_hunk_lines(). Then we won't need the n and fuzz parameters, and special cases around n and fuzz can be handled within the function. And we could rename the function to copy_hunk() which is even shorter. Stefan