/* Parse hunks from APR_FILE and store them in PATCH->HUNKS. * Parsing stops if no valid next hunk can be found. * If IGNORE_WHITESPACE is TRUE, lines without * leading spaces will be treated as context lines. * Allocate results in RESULT_POOL. * Use SCRATCH_POOL for temporary allocations. */ static svn_error_t * parse_hunks(svn_patch_t *patch, apr_file_t *apr_file, svn_boolean_t ignore_whitespace, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { svn_diff_hunk_t *hunk; svn_boolean_t is_property; const char *last_prop_name; const char *prop_name; svn_diff_operation_kind_t prop_operation; apr_pool_t *iterpool; last_prop_name = NULL; patch->hunks = apr_array_make(result_pool, 10, sizeof(svn_diff_hunk_t *)); patch->prop_patches = apr_hash_make(result_pool); iterpool = svn_pool_create(scratch_pool); do { svn_pool_clear(iterpool); SVN_ERR(parse_next_hunk(&hunk, &is_property, &prop_name, &prop_operation, patch, apr_file, ignore_whitespace, result_pool, iterpool)); if (hunk && is_property) { if (! prop_name) prop_name = last_prop_name; else last_prop_name = prop_name; /* Skip svn:mergeinfo properties. * Mergeinfo data cannot be represented as a hunk and * is therefore stored in PATCH itself. */ if (strcmp(prop_name, SVN_PROP_MERGEINFO) == 0) continue; SVN_ERR(add_property_hunk(patch, prop_name, hunk, prop_operation, result_pool)); } else if (hunk) { APR_ARRAY_PUSH(patch->hunks, svn_diff_hunk_t *) = hunk; last_prop_name = NULL; } } while (hunk); svn_pool_destroy(iterpool); return SVN_NO_ERROR; }
/* Parse hunks from APR_FILE and store them in PATCH->HUNKS. * Parsing stops if no valid next hunk can be found. * If IGNORE_WHITESPACE is TRUE, lines without * leading spaces will be treated as context lines. * Allocate results in RESULT_POOL. * Use SCRATCH_POOL for temporary allocations. */ static svn_error_t * parse_hunks(svn_patch_t *patch, apr_file_t *apr_file, svn_boolean_t ignore_whitespace, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { svn_diff_hunk_t *hunk; svn_boolean_t is_property; const char *last_prop_name; const char *prop_name; svn_diff_operation_kind_t prop_operation; apr_pool_t *iterpool; last_prop_name = NULL; patch->hunks = apr_array_make(result_pool, 10, sizeof(svn_diff_hunk_t *)); patch->prop_patches = apr_hash_make(result_pool); iterpool = svn_pool_create(scratch_pool); do { svn_pool_clear(iterpool); SVN_ERR(parse_next_hunk(&hunk, &is_property, &prop_name, &prop_operation, patch, apr_file, ignore_whitespace, result_pool, iterpool)); if (hunk && is_property) { if (! prop_name) prop_name = last_prop_name; else last_prop_name = prop_name; SVN_ERR(add_property_hunk(patch, prop_name, hunk, prop_operation, result_pool)); } else if (hunk) { APR_ARRAY_PUSH(patch->hunks, svn_diff_hunk_t *) = hunk; last_prop_name = NULL; } } while (hunk); svn_pool_destroy(iterpool); return SVN_NO_ERROR; }