diff options
| author | Russell Belfer <rb@github.com> | 2013-06-12 14:18:09 -0700 | 
|---|---|---|
| committer | Russell Belfer <rb@github.com> | 2013-06-12 14:18:09 -0700 | 
| commit | 360f42f4b3f5de31270416220bd799b951202b2d (patch) | |
| tree | 75ce2285f6346e178e1a239f0412eb4597774883 | |
| parent | ef3374a8a81786a7b544ed7eded53c95766eb02f (diff) | |
| download | libgit2-360f42f4b3f5de31270416220bd799b951202b2d.tar.gz | |
Fix diff header naming issues
This makes the git_diff_patch definition private to diff_patch.c
and fixes a number of other header file naming inconsistencies to
use `git_` prefixes on functions and structures that are shared
between files.
| -rw-r--r-- | src/diff_file.c | 14 | ||||
| -rw-r--r-- | src/diff_file.h | 12 | ||||
| -rw-r--r-- | src/diff_patch.c | 133 | ||||
| -rw-r--r-- | src/diff_patch.h | 49 | ||||
| -rw-r--r-- | src/diff_print.c | 22 | ||||
| -rw-r--r-- | src/diff_xdiff.c | 19 | 
6 files changed, 154 insertions, 95 deletions
diff --git a/src/diff_file.c b/src/diff_file.c index 5bdb9e4bf..4fd1177ae 100644 --- a/src/diff_file.c +++ b/src/diff_file.c @@ -85,7 +85,7 @@ static int diff_file_content_init_common(  	return 0;  } -int diff_file_content_init_from_diff( +int git_diff_file_content__init_from_diff(  	git_diff_file_content *fc,  	git_diff_list *diff,  	size_t delta_index, @@ -127,7 +127,7 @@ int diff_file_content_init_from_diff(  	return diff_file_content_init_common(fc, &diff->opts);  } -int diff_file_content_init_from_blob( +int git_diff_file_content__init_from_blob(  	git_diff_file_content *fc,  	git_repository *repo,  	const git_diff_options *opts, @@ -152,7 +152,7 @@ int diff_file_content_init_from_blob(  	return diff_file_content_init_common(fc, opts);  } -int diff_file_content_init_from_raw( +int git_diff_file_content__init_from_raw(  	git_diff_file_content *fc,  	git_repository *repo,  	const git_diff_options *opts, @@ -385,7 +385,7 @@ static int diff_file_content_load_workdir(git_diff_file_content *fc)  	return error;  } -int diff_file_content_load(git_diff_file_content *fc) +int git_diff_file_content__load(git_diff_file_content *fc)  {  	int error = 0; @@ -409,7 +409,7 @@ int diff_file_content_load(git_diff_file_content *fc)  	return 0;  } -void diff_file_content_unload(git_diff_file_content *fc) +void git_diff_file_content__unload(git_diff_file_content *fc)  {  	if (fc->file.flags & GIT_DIFF_FLAG__FREE_DATA) {  		git__free(fc->map.data); @@ -433,9 +433,9 @@ void diff_file_content_unload(git_diff_file_content *fc)  	fc->file.flags &= ~GIT_DIFF_FLAG__LOADED;  } -void diff_file_content_clear(git_diff_file_content *fc) +void git_diff_file_content__clear(git_diff_file_content *fc)  { -	diff_file_content_unload(fc); +	git_diff_file_content__unload(fc);  	/* for now, nothing else to do */  } diff --git a/src/diff_file.h b/src/diff_file.h index ab7b1dc1f..afad8510b 100644 --- a/src/diff_file.h +++ b/src/diff_file.h @@ -24,19 +24,19 @@ typedef struct {  	git_map map;  } git_diff_file_content; -extern int diff_file_content_init_from_diff( +extern int git_diff_file_content__init_from_diff(  	git_diff_file_content *fc,  	git_diff_list *diff,  	size_t delta_index,  	bool use_old); -extern int diff_file_content_init_from_blob( +extern int git_diff_file_content__init_from_blob(  	git_diff_file_content *fc,  	git_repository *repo,  	const git_diff_options *opts,  	const git_blob *blob); -extern int diff_file_content_init_from_raw( +extern int git_diff_file_content__init_from_raw(  	git_diff_file_content *fc,  	git_repository *repo,  	const git_diff_options *opts, @@ -44,12 +44,12 @@ extern int diff_file_content_init_from_raw(  	size_t buflen);  /* this loads the blob/file-on-disk as needed */ -extern int diff_file_content_load(git_diff_file_content *fc); +extern int git_diff_file_content__load(git_diff_file_content *fc);  /* this releases the blob/file-in-memory */ -extern void diff_file_content_unload(git_diff_file_content *fc); +extern void git_diff_file_content__unload(git_diff_file_content *fc);  /* this unloads and also releases any other resources */ -extern void diff_file_content_clear(git_diff_file_content *fc); +extern void git_diff_file_content__clear(git_diff_file_content *fc);  #endif diff --git a/src/diff_patch.c b/src/diff_patch.c index 05dee5ef7..a1e1fe84c 100644 --- a/src/diff_patch.c +++ b/src/diff_patch.c @@ -11,6 +11,49 @@  #include "diff_patch.h"  #include "diff_xdiff.h" +/* cached information about a single span in a diff */ +typedef struct diff_patch_line diff_patch_line; +struct diff_patch_line { +	const char *ptr; +	size_t len; +	size_t lines, oldno, newno; +	char origin; +}; + +/* cached information about a hunk in a diff */ +typedef struct diff_patch_hunk diff_patch_hunk; +struct diff_patch_hunk { +	git_diff_range range; +	char   header[128]; +	size_t header_len; +	size_t line_start; +	size_t line_count; +}; + +struct git_diff_patch { +	git_refcount rc; +	git_diff_list *diff; /* for refcount purposes, maybe NULL for blob diffs */ +	git_diff_delta *delta; +	size_t delta_index; +	git_diff_file_content ofile; +	git_diff_file_content nfile; +	uint32_t flags; +	git_array_t(diff_patch_hunk) hunks; +	git_array_t(diff_patch_line) lines; +	size_t oldno, newno; +	size_t content_size; +	git_pool flattened; +}; + +enum { +	GIT_DIFF_PATCH_ALLOCATED   = (1 << 0), +	GIT_DIFF_PATCH_INITIALIZED = (1 << 1), +	GIT_DIFF_PATCH_LOADED      = (1 << 2), +	GIT_DIFF_PATCH_DIFFABLE    = (1 << 3), +	GIT_DIFF_PATCH_DIFFED      = (1 << 4), +	GIT_DIFF_PATCH_FLATTENED   = (1 << 5), +}; +  static void diff_output_init(git_diff_output*, const git_diff_options*,  	git_diff_file_cb, git_diff_hunk_cb, git_diff_data_cb, void*); @@ -53,9 +96,9 @@ static int diff_patch_init_from_diff(  	patch->delta = git_vector_get(&diff->deltas, delta_index);  	patch->delta_index = delta_index; -	if ((error = diff_file_content_init_from_diff( +	if ((error = git_diff_file_content__init_from_diff(  			&patch->ofile, diff, delta_index, true)) < 0 || -		(error = diff_file_content_init_from_diff( +		(error = git_diff_file_content__init_from_diff(  			&patch->nfile, diff, delta_index, false)) < 0)  		return error; @@ -110,24 +153,24 @@ static int diff_patch_load(git_diff_patch *patch, git_diff_output *output)  	 * need 2x data size and this minimizes peak memory footprint  	 */  	if (patch->ofile.src == GIT_ITERATOR_TYPE_WORKDIR) { -		if ((error = diff_file_content_load(&patch->ofile)) < 0 || +		if ((error = git_diff_file_content__load(&patch->ofile)) < 0 ||  			(patch->ofile.file.flags & GIT_DIFF_FLAG_BINARY) != 0)  			goto cleanup;  	}  	if (patch->nfile.src == GIT_ITERATOR_TYPE_WORKDIR) { -		if ((error = diff_file_content_load(&patch->nfile)) < 0 || +		if ((error = git_diff_file_content__load(&patch->nfile)) < 0 ||  			(patch->nfile.file.flags & GIT_DIFF_FLAG_BINARY) != 0)  			goto cleanup;  	}  	/* once workdir has been tried, load other data as needed */  	if (patch->ofile.src != GIT_ITERATOR_TYPE_WORKDIR) { -		if ((error = diff_file_content_load(&patch->ofile)) < 0 || +		if ((error = git_diff_file_content__load(&patch->ofile)) < 0 ||  			(patch->ofile.file.flags & GIT_DIFF_FLAG_BINARY) != 0)  			goto cleanup;  	}  	if (patch->nfile.src != GIT_ITERATOR_TYPE_WORKDIR) { -		if ((error = diff_file_content_load(&patch->nfile)) < 0 || +		if ((error = git_diff_file_content__load(&patch->nfile)) < 0 ||  			(patch->nfile.file.flags & GIT_DIFF_FLAG_BINARY) != 0)  			goto cleanup;  	} @@ -198,8 +241,8 @@ static int diff_patch_generate(git_diff_patch *patch, git_diff_output *output)  static void diff_patch_free(git_diff_patch *patch)  { -	diff_file_content_clear(&patch->ofile); -	diff_file_content_clear(&patch->nfile); +	git_diff_file_content__clear(&patch->ofile); +	git_diff_file_content__clear(&patch->nfile);  	git_array_clear(patch->lines);  	git_array_clear(patch->hunks); @@ -323,9 +366,9 @@ static int diff_patch_from_blobs(  		new_blob = swap;  	} -	if ((error = diff_file_content_init_from_blob( +	if ((error = git_diff_file_content__init_from_blob(  			&pd->patch.ofile, repo, opts, old_blob)) < 0 || -		(error = diff_file_content_init_from_blob( +		(error = git_diff_file_content__init_from_blob(  			&pd->patch.nfile, repo, opts, new_blob)) < 0)  		return error; @@ -409,14 +452,14 @@ static int diff_patch_from_blob_and_buffer(  		return 0;  	if (opts && (opts->flags & GIT_DIFF_REVERSE) != 0) { -		if (!(error = diff_file_content_init_from_raw( +		if (!(error = git_diff_file_content__init_from_raw(  				&pd->patch.ofile, repo, opts, buf, buflen))) -			error = diff_file_content_init_from_blob( +			error = git_diff_file_content__init_from_blob(  				&pd->patch.nfile, repo, opts, old_blob);  	} else { -		if (!(error = diff_file_content_init_from_blob( +		if (!(error = git_diff_file_content__init_from_blob(  				&pd->patch.ofile, repo, opts, old_blob))) -			error = diff_file_content_init_from_raw( +			error = git_diff_file_content__init_from_raw(  				&pd->patch.nfile, repo, opts, buf, buflen);  	} @@ -690,6 +733,68 @@ notfound:  	return diff_error_outofrange(thing);  } +git_diff_list *git_diff_patch__diff(git_diff_patch *patch) +{ +	return patch->diff; +} + +git_diff_driver *git_diff_patch__driver(git_diff_patch *patch) +{ +	/* ofile driver is representative for whole patch */ +	return patch->ofile.driver; +} + +void git_diff_patch__old_data( +	char **ptr, size_t *len, git_diff_patch *patch) +{ +	*ptr = patch->ofile.map.data; +	*len = patch->ofile.map.len; +} + +void git_diff_patch__new_data( +	char **ptr, size_t *len, git_diff_patch *patch) +{ +	*ptr = patch->nfile.map.data; +	*len = patch->nfile.map.len; +} + +int git_diff_patch__invoke_callbacks( +	git_diff_patch *patch, +	git_diff_file_cb file_cb, +	git_diff_hunk_cb hunk_cb, +	git_diff_data_cb line_cb, +	void *payload) +{ +	int error = 0; +	uint32_t i, j; + +	if (file_cb) +		error = file_cb(patch->delta, 0, payload); + +	if (!hunk_cb && !line_cb) +		return error; + +	for (i = 0; !error && i < git_array_size(patch->hunks); ++i) { +		diff_patch_hunk *h = git_array_get(patch->hunks, i); + +		error = hunk_cb( +			patch->delta, &h->range, h->header, h->header_len, payload); + +		if (!line_cb) +			continue; + +		for (j = 0; !error && j < h->line_count; ++j) { +			diff_patch_line *l = +				git_array_get(patch->lines, h->line_start + j); + +			error = line_cb( +				patch->delta, &h->range, l->origin, l->ptr, l->len, payload); +		} +	} + +	return error; +} +  static int diff_patch_file_cb(  	const git_diff_delta *delta, diff --git a/src/diff_patch.h b/src/diff_patch.h index 7de6e1e5b..56af14600 100644 --- a/src/diff_patch.h +++ b/src/diff_patch.h @@ -12,48 +12,19 @@  #include "diff_file.h"  #include "array.h" -/* cached information about a single span in a diff */ -typedef struct diff_patch_line diff_patch_line; -struct diff_patch_line { -	const char *ptr; -	size_t len; -	size_t lines, oldno, newno; -	char origin; -}; +extern git_diff_list *git_diff_patch__diff(git_diff_patch *); -/* cached information about a hunk in a diff */ -typedef struct diff_patch_hunk diff_patch_hunk; -struct diff_patch_hunk { -	git_diff_range range; -	char   header[128]; -	size_t header_len; -	size_t line_start; -	size_t line_count; -}; +extern git_diff_driver *git_diff_patch__driver(git_diff_patch *); -struct git_diff_patch { -	git_refcount rc; -	git_diff_list *diff; /* for refcount purposes, maybe NULL for blob diffs */ -	git_diff_delta *delta; -	size_t delta_index; -	git_diff_file_content ofile; -	git_diff_file_content nfile; -	uint32_t flags; -	git_array_t(diff_patch_hunk) hunks; -	git_array_t(diff_patch_line) lines; -	size_t oldno, newno; -	size_t content_size; -	git_pool flattened; -}; +extern void git_diff_patch__old_data(char **, size_t *, git_diff_patch *); +extern void git_diff_patch__new_data(char **, size_t *, git_diff_patch *); -enum { -	GIT_DIFF_PATCH_ALLOCATED   = (1 << 0), -	GIT_DIFF_PATCH_INITIALIZED = (1 << 1), -	GIT_DIFF_PATCH_LOADED      = (1 << 2), -	GIT_DIFF_PATCH_DIFFABLE    = (1 << 3), -	GIT_DIFF_PATCH_DIFFED      = (1 << 4), -	GIT_DIFF_PATCH_FLATTENED   = (1 << 5), -}; +extern int git_diff_patch__invoke_callbacks( +	git_diff_patch *patch, +	git_diff_file_cb file_cb, +	git_diff_hunk_cb hunk_cb, +	git_diff_data_cb line_cb, +	void *payload);  typedef struct git_diff_output git_diff_output;  struct git_diff_output { diff --git a/src/diff_print.c b/src/diff_print.c index 860876531..244aa6e1d 100644 --- a/src/diff_print.c +++ b/src/diff_print.c @@ -383,29 +383,13 @@ int git_diff_patch_print(  	int error;  	git_buf temp = GIT_BUF_INIT;  	diff_print_info pi; -	size_t h, l;  	assert(patch && print_cb);  	if (!(error = diff_print_info_init( -			&pi, &temp, patch->diff, print_cb, payload))) -		error = print_patch_file(patch->delta, 0, &pi); - -	for (h = 0; h < git_array_size(patch->hunks) && !error; ++h) { -		diff_patch_hunk *hunk = git_array_get(patch->hunks, h); - -		error = print_patch_hunk( -			patch->delta, &hunk->range, hunk->header, hunk->header_len, &pi); - -		for (l = 0; l < hunk->line_count && !error; ++l) { -			diff_patch_line *line = -				git_array_get(patch->lines, hunk->line_start + l); - -			error = print_patch_line( -				patch->delta, &hunk->range, -				line->origin, line->ptr, line->len, &pi); -		} -	} +			&pi, &temp, git_diff_patch__diff(patch), print_cb, payload))) +		error = git_diff_patch__invoke_callbacks( +			patch, print_patch_file, print_patch_hunk, print_patch_line, &pi);  	git_buf_free(&temp); diff --git a/src/diff_xdiff.c b/src/diff_xdiff.c index 91c56f727..7694fb996 100644 --- a/src/diff_xdiff.c +++ b/src/diff_xdiff.c @@ -59,6 +59,7 @@ static int git_xdiff_cb(void *priv, mmbuffer_t *bufs, int len)  {  	git_xdiff_info *info = priv;  	git_diff_patch *patch = info->patch; +	const git_diff_delta *delta = git_diff_patch_delta(patch);  	git_diff_output *output = &info->xo->output;  	if (len == 1) { @@ -67,7 +68,7 @@ static int git_xdiff_cb(void *priv, mmbuffer_t *bufs, int len)  			return output->error;  		if (output->hunk_cb != NULL && -			output->hunk_cb(patch->delta, &info->range, +			output->hunk_cb(delta, &info->range,  				bufs[0].ptr, bufs[0].size, output->payload))  			output->error = GIT_EUSER;  	} @@ -80,7 +81,7 @@ static int git_xdiff_cb(void *priv, mmbuffer_t *bufs, int len)  			GIT_DIFF_LINE_CONTEXT;  		if (output->data_cb != NULL && -			output->data_cb(patch->delta, &info->range, +			output->data_cb(delta, &info->range,  				origin, bufs[1].ptr, bufs[1].size, output->payload))  			output->error = GIT_EUSER;  	} @@ -97,7 +98,7 @@ static int git_xdiff_cb(void *priv, mmbuffer_t *bufs, int len)  			GIT_DIFF_LINE_CONTEXT_EOFNL;  		if (output->data_cb != NULL && -			output->data_cb(patch->delta, &info->range, +			output->data_cb(delta, &info->range,  				origin, bufs[2].ptr, bufs[2].size, output->payload))  			output->error = GIT_EUSER;  	} @@ -110,7 +111,7 @@ static int git_xdiff(git_diff_output *output, git_diff_patch *patch)  	git_xdiff_output *xo = (git_xdiff_output *)output;  	git_xdiff_info info;  	git_diff_find_context_payload findctxt; -	mmfile_t old_xdiff_data, new_xdiff_data; +	mmfile_t xd_old_data, xd_new_data;  	memset(&info, 0, sizeof(info));  	info.patch = patch; @@ -119,7 +120,7 @@ static int git_xdiff(git_diff_output *output, git_diff_patch *patch)  	xo->callback.priv = &info;  	git_diff_find_context_init( -		&xo->config.find_func, &findctxt, patch->ofile.driver); +		&xo->config.find_func, &findctxt, git_diff_patch__driver(patch));  	xo->config.find_func_priv = &findctxt;  	if (xo->config.find_func != NULL) @@ -131,12 +132,10 @@ static int git_xdiff(git_diff_output *output, git_diff_patch *patch)  	 * updates are needed to xo->params.flags  	 */ -	old_xdiff_data.ptr  = patch->ofile.map.data; -	old_xdiff_data.size = patch->ofile.map.len; -	new_xdiff_data.ptr  = patch->nfile.map.data; -	new_xdiff_data.size = patch->nfile.map.len; +	git_diff_patch__old_data(&xd_old_data.ptr, &xd_old_data.size, patch); +	git_diff_patch__new_data(&xd_new_data.ptr, &xd_new_data.size, patch); -	xdl_diff(&old_xdiff_data, &new_xdiff_data, +	xdl_diff(&xd_old_data, &xd_new_data,  		&xo->params, &xo->config, &xo->callback);  	git_diff_find_context_clear(&findctxt);  | 
