mirror of
				https://git.proxmox.com/git/libgit2
				synced 2025-10-31 19:49:16 +00:00 
			
		
		
		
	Diff iterators
This refactors the diff output code so that an iterator object can be used to traverse and generate the diffs, instead of just the `foreach()` style with callbacks. The code has been rearranged so that the two styles can still share most functions. This also replaces `GIT_REVWALKOVER` with `GIT_ITEROVER` and uses that as a common error code for marking the end of iteration when using a iterator style of object.
This commit is contained in:
		
							parent
							
								
									4d3834038b
								
							
						
					
					
						commit
						f335ecd6e1
					
				| @ -169,7 +169,7 @@ enum { | ||||
| 	GIT_DIFF_LINE_CONTEXT   = ' ', | ||||
| 	GIT_DIFF_LINE_ADDITION  = '+', | ||||
| 	GIT_DIFF_LINE_DELETION  = '-', | ||||
| 	GIT_DIFF_LINE_ADD_EOFNL = '\n', /**< DEPRECATED */ | ||||
| 	GIT_DIFF_LINE_ADD_EOFNL = '\n', /**< DEPRECATED - will not be returned */ | ||||
| 	GIT_DIFF_LINE_DEL_EOFNL = '\0', /**< LF was removed at end of file */ | ||||
| 
 | ||||
| 	/* The following values will only be sent to a `git_diff_data_fn` when
 | ||||
| @ -197,6 +197,11 @@ typedef int (*git_diff_data_fn)( | ||||
| 	const char *content, | ||||
| 	size_t content_len); | ||||
| 
 | ||||
| /**
 | ||||
|  * The diff iterator object is used to scan a diff list. | ||||
|  */ | ||||
| typedef struct git_diff_iterator git_diff_iterator; | ||||
| 
 | ||||
| /** @name Diff List Generator Functions
 | ||||
|  * | ||||
|  * These are the functions you would use to create (or destroy) a | ||||
| @ -321,6 +326,60 @@ GIT_EXTERN(int) git_diff_merge( | ||||
|  */ | ||||
| /**@{*/ | ||||
| 
 | ||||
| /**
 | ||||
|  * Create a diff iterator object that can be used to traverse a diff. | ||||
|  */ | ||||
| GIT_EXTERN(int) git_diff_iterator_new( | ||||
| 	git_diff_iterator **iterator, | ||||
| 	git_diff_list *diff); | ||||
| 
 | ||||
| GIT_EXTERN(void) git_diff_iterator_free(git_diff_iterator *iter); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the number of files in the diff. | ||||
|  */ | ||||
| GIT_EXTERN(int) git_diff_iterator_num_files(git_diff_iterator *iterator); | ||||
| 
 | ||||
| GIT_EXTERN(int) git_diff_iterator_num_hunks_in_file(git_diff_iterator *iterator); | ||||
| 
 | ||||
| GIT_EXTERN(int) git_diff_iterator_num_lines_in_hunk(git_diff_iterator *iterator); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the delta information for the next file in the diff. | ||||
|  * | ||||
|  * This will return a pointer to the next git_diff_delta` to be processed or | ||||
|  * NULL if the iterator is at the end of the diff, then advance. | ||||
|  */ | ||||
| GIT_EXTERN(int) git_diff_iterator_next_file( | ||||
| 	git_diff_delta **delta, | ||||
| 	git_diff_iterator *iterator); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the hunk information for the next hunk in the current file. | ||||
|  * | ||||
|  * It is recommended that you not call this if the file is a binary | ||||
|  * file, but it is allowed to do so. | ||||
|  * | ||||
|  * Warning! Call this function for the first time on a file is when the | ||||
|  * actual text diff will be computed (it cannot be computed incrementally) | ||||
|  * so the first call for a new file is expensive (at least in relative | ||||
|  * terms - in reality, it is still pretty darn fast). | ||||
|  */ | ||||
| GIT_EXTERN(int) git_diff_iterator_next_hunk( | ||||
| 	git_diff_range **range, | ||||
| 	const char **header, | ||||
| 	size_t *header_len, | ||||
| 	git_diff_iterator *iterator); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the next line of the current hunk of diffs. | ||||
|  */ | ||||
| GIT_EXTERN(int) git_diff_iterator_next_line( | ||||
| 	char *line_origin, /**< GIT_DIFF_LINE_... value from above */ | ||||
| 	const char **content, | ||||
| 	size_t *content_len, | ||||
| 	git_diff_iterator *iterator); | ||||
| 
 | ||||
| /**
 | ||||
|  * Iterate over a diff list issuing callbacks. | ||||
|  * | ||||
|  | ||||
| @ -28,7 +28,7 @@ enum { | ||||
| 	GIT_EUSER = -7, | ||||
| 
 | ||||
| 	GIT_PASSTHROUGH = -30, | ||||
| 	GIT_REVWALKOVER = -31, | ||||
| 	GIT_ITEROVER = -31, | ||||
| }; | ||||
| 
 | ||||
| typedef struct { | ||||
|  | ||||
| @ -201,7 +201,7 @@ GIT_EXTERN(int) git_revwalk_hide_ref(git_revwalk *walk, const char *refname); | ||||
|  * @param oid Pointer where to store the oid of the next commit | ||||
|  * @param walk the walker to pop the commit from. | ||||
|  * @return 0 if the next commit was found; | ||||
|  *	GIT_REVWALKOVER if there are no commits left to iterate | ||||
|  *	GIT_ITEROVER if there are no commits left to iterate | ||||
|  */ | ||||
| GIT_EXTERN(int) git_revwalk_next(git_oid *oid, git_revwalk *walk); | ||||
| 
 | ||||
|  | ||||
| @ -188,6 +188,7 @@ int git_attr_foreach( | ||||
| 
 | ||||
| 				error = callback(assign->name, assign->value, payload); | ||||
| 				if (error) { | ||||
| 					giterr_clear(); | ||||
| 					error = GIT_EUSER; | ||||
| 					goto cleanup; | ||||
| 				} | ||||
|  | ||||
| @ -221,6 +221,7 @@ static int file_foreach( | ||||
| 
 | ||||
| 			/* abort iterator on non-zero return value */ | ||||
| 			if (fn(key, var->value, data)) { | ||||
| 				giterr_clear(); | ||||
| 				result = GIT_EUSER; | ||||
| 				goto cleanup; | ||||
| 			} | ||||
|  | ||||
							
								
								
									
										14
									
								
								src/diff.c
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								src/diff.c
									
									
									
									
									
								
							| @ -316,6 +316,7 @@ static git_diff_list *git_diff_list_alloc( | ||||
| 	if (diff == NULL) | ||||
| 		return NULL; | ||||
| 
 | ||||
| 	GIT_REFCOUNT_INC(diff); | ||||
| 	diff->repo = repo; | ||||
| 
 | ||||
| 	if (git_vector_init(&diff->deltas, 0, diff_delta__cmp) < 0 || | ||||
| @ -391,15 +392,12 @@ fail: | ||||
| 	return NULL; | ||||
| } | ||||
| 
 | ||||
| void git_diff_list_free(git_diff_list *diff) | ||||
| static void diff_list_free(git_diff_list *diff) | ||||
| { | ||||
| 	git_diff_delta *delta; | ||||
| 	git_attr_fnmatch *match; | ||||
| 	unsigned int i; | ||||
| 
 | ||||
| 	if (!diff) | ||||
| 		return; | ||||
| 
 | ||||
| 	git_vector_foreach(&diff->deltas, i, delta) { | ||||
| 		git__free(delta); | ||||
| 		diff->deltas.contents[i] = NULL; | ||||
| @ -416,6 +414,14 @@ void git_diff_list_free(git_diff_list *diff) | ||||
| 	git__free(diff); | ||||
| } | ||||
| 
 | ||||
| void git_diff_list_free(git_diff_list *diff) | ||||
| { | ||||
| 	if (!diff) | ||||
| 		return; | ||||
| 
 | ||||
| 	GIT_REFCOUNT_DEC(diff, diff_list_free); | ||||
| } | ||||
| 
 | ||||
| static int oid_for_workdir_item( | ||||
| 	git_repository *repo, | ||||
| 	const git_index_entry *item, | ||||
|  | ||||
| @ -26,6 +26,7 @@ enum { | ||||
| }; | ||||
| 
 | ||||
| struct git_diff_list { | ||||
| 	git_refcount     rc; | ||||
| 	git_repository   *repo; | ||||
| 	git_diff_options opts; | ||||
| 	git_vector       pathspec; | ||||
|  | ||||
							
								
								
									
										1040
									
								
								src/diff_output.c
									
									
									
									
									
								
							
							
						
						
									
										1040
									
								
								src/diff_output.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -221,7 +221,7 @@ int git_fetch_negotiate(git_remote *remote) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (error < 0 && error != GIT_REVWALKOVER) | ||||
| 	if (error < 0 && error != GIT_ITEROVER) | ||||
| 		goto on_error; | ||||
| 
 | ||||
| 	/* Tell the other end that we're done negotiating */ | ||||
|  | ||||
							
								
								
									
										11
									
								
								src/pool.h
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								src/pool.h
									
									
									
									
									
								
							| @ -75,6 +75,17 @@ extern void git_pool_swap(git_pool *a, git_pool *b); | ||||
|  */ | ||||
| extern void *git_pool_malloc(git_pool *pool, uint32_t items); | ||||
| 
 | ||||
| /**
 | ||||
|  * Allocate space and zero it out. | ||||
|  */ | ||||
| GIT_INLINE(void *) git_pool_mallocz(git_pool *pool, uint32_t items) | ||||
| { | ||||
| 	void *ptr = git_pool_malloc(pool, items); | ||||
| 	if (ptr) | ||||
| 		memset(ptr, 0, (size_t)items * (size_t)pool->item_size); | ||||
| 	return ptr; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Allocate space and duplicate string data into it. | ||||
|  * | ||||
|  | ||||
| @ -1643,7 +1643,6 @@ int git_reference_normalize_name( | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 
 | ||||
| 		*buffer_out++ = *current++; | ||||
| 		buffer_size--; | ||||
| 	} | ||||
|  | ||||
| @ -493,7 +493,7 @@ static int walk_and_search(git_object **out, git_revwalk *walk, regex_t *regex) | ||||
| 		git_object_free(obj); | ||||
| 	} | ||||
| 
 | ||||
| 	if (error < 0 && error == GIT_REVWALKOVER) | ||||
| 	if (error < 0 && error == GIT_ITEROVER) | ||||
| 		error = GIT_ENOTFOUND; | ||||
| 
 | ||||
| 	return error; | ||||
|  | ||||
| @ -449,6 +449,7 @@ int git_merge_base(git_oid *out, git_repository *repo, git_oid *one, git_oid *tw | ||||
| 
 | ||||
| 	if (!result) { | ||||
| 		git_revwalk_free(walk); | ||||
| 		giterr_clear(); | ||||
| 		return GIT_ENOTFOUND; | ||||
| 	} | ||||
| 
 | ||||
| @ -682,7 +683,8 @@ static int revwalk_next_timesort(commit_object **object_out, git_revwalk *walk) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return GIT_REVWALKOVER; | ||||
| 	giterr_clear(); | ||||
| 	return GIT_ITEROVER; | ||||
| } | ||||
| 
 | ||||
| static int revwalk_next_unsorted(commit_object **object_out, git_revwalk *walk) | ||||
| @ -700,7 +702,8 @@ static int revwalk_next_unsorted(commit_object **object_out, git_revwalk *walk) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return GIT_REVWALKOVER; | ||||
| 	giterr_clear(); | ||||
| 	return GIT_ITEROVER; | ||||
| } | ||||
| 
 | ||||
| static int revwalk_next_toposort(commit_object **object_out, git_revwalk *walk) | ||||
| @ -710,8 +713,10 @@ static int revwalk_next_toposort(commit_object **object_out, git_revwalk *walk) | ||||
| 
 | ||||
| 	for (;;) { | ||||
| 		next = commit_list_pop(&walk->iterator_topo); | ||||
| 		if (next == NULL) | ||||
| 			return GIT_REVWALKOVER; | ||||
| 		if (next == NULL) { | ||||
| 			giterr_clear(); | ||||
| 			return GIT_ITEROVER; | ||||
| 		} | ||||
| 
 | ||||
| 		if (next->in_degree > 0) { | ||||
| 			next->topo_delay = 1; | ||||
| @ -736,7 +741,7 @@ static int revwalk_next_toposort(commit_object **object_out, git_revwalk *walk) | ||||
| static int revwalk_next_reverse(commit_object **object_out, git_revwalk *walk) | ||||
| { | ||||
| 	*object_out = commit_list_pop(&walk->iterator_reverse); | ||||
| 	return *object_out ? 0 : GIT_REVWALKOVER; | ||||
| 	return *object_out ? 0 : GIT_ITEROVER; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| @ -751,8 +756,10 @@ static int prepare_walk(git_revwalk *walk) | ||||
| 	 * If walk->one is NULL, there were no positive references, | ||||
| 	 * so we know that the walk is already over. | ||||
| 	 */ | ||||
| 	if (walk->one == NULL) | ||||
| 		return GIT_REVWALKOVER; | ||||
| 	if (walk->one == NULL) { | ||||
| 		giterr_clear(); | ||||
| 		return GIT_ITEROVER; | ||||
| 	} | ||||
| 
 | ||||
| 	/* first figure out what the merge bases are */ | ||||
| 	if (merge_bases_many(&bases, walk, walk->one, &walk->twos) < 0) | ||||
| @ -780,7 +787,7 @@ static int prepare_walk(git_revwalk *walk) | ||||
| 				return -1; | ||||
| 		} | ||||
| 
 | ||||
| 		if (error != GIT_REVWALKOVER) | ||||
| 		if (error != GIT_ITEROVER) | ||||
| 			return error; | ||||
| 
 | ||||
| 		walk->get_next = &revwalk_next_toposort; | ||||
| @ -792,7 +799,7 @@ static int prepare_walk(git_revwalk *walk) | ||||
| 			if (commit_list_insert(next, &walk->iterator_reverse) == NULL) | ||||
| 				return -1; | ||||
| 
 | ||||
| 		if (error != GIT_REVWALKOVER) | ||||
| 		if (error != GIT_ITEROVER) | ||||
| 			return error; | ||||
| 
 | ||||
| 		walk->get_next = &revwalk_next_reverse; | ||||
| @ -891,9 +898,10 @@ int git_revwalk_next(git_oid *oid, git_revwalk *walk) | ||||
| 
 | ||||
| 	error = walk->get_next(&next, walk); | ||||
| 
 | ||||
| 	if (error == GIT_REVWALKOVER) { | ||||
| 	if (error == GIT_ITEROVER) { | ||||
| 		git_revwalk_reset(walk); | ||||
| 		return GIT_REVWALKOVER; | ||||
| 		giterr_clear(); | ||||
| 		return GIT_ITEROVER; | ||||
| 	} | ||||
| 
 | ||||
| 	if (!error) | ||||
|  | ||||
| @ -151,6 +151,9 @@ cleanup: | ||||
| 	git_diff_list_free(idx2head); | ||||
| 	git_diff_list_free(wd2idx); | ||||
| 
 | ||||
| 	if (err == GIT_EUSER) | ||||
| 		giterr_clear(); | ||||
| 
 | ||||
| 	return err; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -163,6 +163,7 @@ int git_submodule_foreach( | ||||
| 		} | ||||
| 
 | ||||
| 		if (callback(sm, sm->name, payload)) { | ||||
| 			giterr_clear(); | ||||
| 			error = GIT_EUSER; | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| @ -58,59 +58,59 @@ void test_diff_blob__can_compare_text_blobs(void) | ||||
| 	cl_git_pass(git_diff_blobs( | ||||
| 		a, b, &opts, &expected, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 	cl_assert(expected.files == 1); | ||||
| 	cl_assert(expected.file_mods == 1); | ||||
| 	cl_assert_equal_i(1, expected.files); | ||||
| 	cl_assert_equal_i(1, expected.file_mods); | ||||
| 	cl_assert(expected.at_least_one_of_them_is_binary == false); | ||||
| 
 | ||||
| 	cl_assert(expected.hunks == 1); | ||||
| 	cl_assert(expected.lines == 6); | ||||
| 	cl_assert(expected.line_ctxt == 1); | ||||
| 	cl_assert(expected.line_adds == 5); | ||||
| 	cl_assert(expected.line_dels == 0); | ||||
| 	cl_assert_equal_i(1, expected.hunks); | ||||
| 	cl_assert_equal_i(6, expected.lines); | ||||
| 	cl_assert_equal_i(1, expected.line_ctxt); | ||||
| 	cl_assert_equal_i(5, expected.line_adds); | ||||
| 	cl_assert_equal_i(0, expected.line_dels); | ||||
| 
 | ||||
| 	/* diff on tests/resources/attr/root_test2 */ | ||||
| 	memset(&expected, 0, sizeof(expected)); | ||||
| 	cl_git_pass(git_diff_blobs( | ||||
| 		b, c, &opts, &expected, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 	cl_assert(expected.files == 1); | ||||
| 	cl_assert(expected.file_mods == 1); | ||||
| 	cl_assert_equal_i(1, expected.files); | ||||
| 	cl_assert_equal_i(1, expected.file_mods); | ||||
| 	cl_assert(expected.at_least_one_of_them_is_binary == false); | ||||
| 
 | ||||
| 	cl_assert(expected.hunks == 1); | ||||
| 	cl_assert(expected.lines == 15); | ||||
| 	cl_assert(expected.line_ctxt == 3); | ||||
| 	cl_assert(expected.line_adds == 9); | ||||
| 	cl_assert(expected.line_dels == 3); | ||||
| 	cl_assert_equal_i(1, expected.hunks); | ||||
| 	cl_assert_equal_i(15, expected.lines); | ||||
| 	cl_assert_equal_i(3, expected.line_ctxt); | ||||
| 	cl_assert_equal_i(9, expected.line_adds); | ||||
| 	cl_assert_equal_i(3, expected.line_dels); | ||||
| 
 | ||||
| 	/* diff on tests/resources/attr/root_test3 */ | ||||
| 	memset(&expected, 0, sizeof(expected)); | ||||
| 	cl_git_pass(git_diff_blobs( | ||||
| 		a, c, &opts, &expected, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 	cl_assert(expected.files == 1); | ||||
| 	cl_assert(expected.file_mods == 1); | ||||
| 	cl_assert_equal_i(1, expected.files); | ||||
| 	cl_assert_equal_i(1, expected.file_mods); | ||||
| 	cl_assert(expected.at_least_one_of_them_is_binary == false); | ||||
| 
 | ||||
| 	cl_assert(expected.hunks == 1); | ||||
| 	cl_assert(expected.lines == 13); | ||||
| 	cl_assert(expected.line_ctxt == 0); | ||||
| 	cl_assert(expected.line_adds == 12); | ||||
| 	cl_assert(expected.line_dels == 1); | ||||
| 	cl_assert_equal_i(1, expected.hunks); | ||||
| 	cl_assert_equal_i(13, expected.lines); | ||||
| 	cl_assert_equal_i(0, expected.line_ctxt); | ||||
| 	cl_assert_equal_i(12, expected.line_adds); | ||||
| 	cl_assert_equal_i(1, expected.line_dels); | ||||
| 
 | ||||
| 	memset(&expected, 0, sizeof(expected)); | ||||
| 	cl_git_pass(git_diff_blobs( | ||||
| 		c, d, &opts, &expected, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 	cl_assert(expected.files == 1); | ||||
| 	cl_assert(expected.file_mods == 1); | ||||
| 	cl_assert_equal_i(1, expected.files); | ||||
| 	cl_assert_equal_i(1, expected.file_mods); | ||||
| 	cl_assert(expected.at_least_one_of_them_is_binary == false); | ||||
| 
 | ||||
| 	cl_assert(expected.hunks == 2); | ||||
| 	cl_assert(expected.lines == 14); | ||||
| 	cl_assert(expected.line_ctxt == 4); | ||||
| 	cl_assert(expected.line_adds == 6); | ||||
| 	cl_assert(expected.line_dels == 4); | ||||
| 	cl_assert_equal_i(2, expected.hunks); | ||||
| 	cl_assert_equal_i(14, expected.lines); | ||||
| 	cl_assert_equal_i(4, expected.line_ctxt); | ||||
| 	cl_assert_equal_i(6, expected.line_adds); | ||||
| 	cl_assert_equal_i(4, expected.line_dels); | ||||
| 
 | ||||
| 	git_blob_free(a); | ||||
| 	git_blob_free(b); | ||||
| @ -124,14 +124,14 @@ void test_diff_blob__can_compare_against_null_blobs(void) | ||||
| 	cl_git_pass(git_diff_blobs( | ||||
| 		d, e, &opts, &expected, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 	cl_assert(expected.files == 1); | ||||
| 	cl_assert(expected.file_dels == 1); | ||||
| 	cl_assert_equal_i(1, expected.files); | ||||
| 	cl_assert_equal_i(1, expected.file_dels); | ||||
| 	cl_assert(expected.at_least_one_of_them_is_binary == false); | ||||
| 
 | ||||
| 	cl_assert(expected.hunks == 1); | ||||
| 	cl_assert(expected.hunk_old_lines == 14); | ||||
| 	cl_assert(expected.lines == 14); | ||||
| 	cl_assert(expected.line_dels == 14); | ||||
| 	cl_assert_equal_i(1, expected.hunks); | ||||
| 	cl_assert_equal_i(14, expected.hunk_old_lines); | ||||
| 	cl_assert_equal_i(14, expected.lines); | ||||
| 	cl_assert_equal_i(14, expected.line_dels); | ||||
| 
 | ||||
| 	opts.flags |= GIT_DIFF_REVERSE; | ||||
| 	memset(&expected, 0, sizeof(expected)); | ||||
| @ -139,14 +139,14 @@ void test_diff_blob__can_compare_against_null_blobs(void) | ||||
| 	cl_git_pass(git_diff_blobs( | ||||
| 		d, e, &opts, &expected, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 	cl_assert(expected.files == 1); | ||||
| 	cl_assert(expected.file_adds == 1); | ||||
| 	cl_assert_equal_i(1, expected.files); | ||||
| 	cl_assert_equal_i(1, expected.file_adds); | ||||
| 	cl_assert(expected.at_least_one_of_them_is_binary == false); | ||||
| 
 | ||||
| 	cl_assert(expected.hunks == 1); | ||||
| 	cl_assert(expected.hunk_new_lines == 14); | ||||
| 	cl_assert(expected.lines == 14); | ||||
| 	cl_assert(expected.line_adds == 14); | ||||
| 	cl_assert_equal_i(1, expected.hunks); | ||||
| 	cl_assert_equal_i(14, expected.hunk_new_lines); | ||||
| 	cl_assert_equal_i(14, expected.lines); | ||||
| 	cl_assert_equal_i(14, expected.line_adds); | ||||
| 
 | ||||
| 	opts.flags ^= GIT_DIFF_REVERSE; | ||||
| 	memset(&expected, 0, sizeof(expected)); | ||||
| @ -156,10 +156,10 @@ void test_diff_blob__can_compare_against_null_blobs(void) | ||||
| 
 | ||||
| 	cl_assert(expected.at_least_one_of_them_is_binary == true); | ||||
| 
 | ||||
| 	cl_assert(expected.files == 1); | ||||
| 	cl_assert(expected.file_dels == 1); | ||||
| 	cl_assert(expected.hunks == 0); | ||||
| 	cl_assert(expected.lines == 0); | ||||
| 	cl_assert_equal_i(1, expected.files); | ||||
| 	cl_assert_equal_i(1, expected.file_dels); | ||||
| 	cl_assert_equal_i(0, expected.hunks); | ||||
| 	cl_assert_equal_i(0, expected.lines); | ||||
| 
 | ||||
| 	memset(&expected, 0, sizeof(expected)); | ||||
| 
 | ||||
| @ -168,18 +168,18 @@ void test_diff_blob__can_compare_against_null_blobs(void) | ||||
| 
 | ||||
| 	cl_assert(expected.at_least_one_of_them_is_binary == true); | ||||
| 
 | ||||
| 	cl_assert(expected.files == 1); | ||||
| 	cl_assert(expected.file_adds == 1); | ||||
| 	cl_assert(expected.hunks == 0); | ||||
| 	cl_assert(expected.lines == 0); | ||||
| 	cl_assert_equal_i(1, expected.files); | ||||
| 	cl_assert_equal_i(1, expected.file_adds); | ||||
| 	cl_assert_equal_i(0, expected.hunks); | ||||
| 	cl_assert_equal_i(0, expected.lines); | ||||
| } | ||||
| 
 | ||||
| static void assert_identical_blobs_comparison(diff_expects expected) | ||||
| { | ||||
| 	cl_assert(expected.files == 1); | ||||
| 	cl_assert(expected.file_unmodified == 1); | ||||
| 	cl_assert(expected.hunks == 0); | ||||
| 	cl_assert(expected.lines == 0); | ||||
| 	cl_assert_equal_i(1, expected.files); | ||||
| 	cl_assert_equal_i(1, expected.file_unmodified); | ||||
| 	cl_assert_equal_i(0, expected.hunks); | ||||
| 	cl_assert_equal_i(0, expected.lines); | ||||
| } | ||||
| 
 | ||||
| void test_diff_blob__can_compare_identical_blobs(void) | ||||
| @ -209,10 +209,10 @@ static void assert_binary_blobs_comparison(diff_expects expected) | ||||
| { | ||||
| 	cl_assert(expected.at_least_one_of_them_is_binary == true); | ||||
| 
 | ||||
| 	cl_assert(expected.files == 1); | ||||
| 	cl_assert(expected.file_mods == 1); | ||||
| 	cl_assert(expected.hunks == 0); | ||||
| 	cl_assert(expected.lines == 0); | ||||
| 	cl_assert_equal_i(1, expected.files); | ||||
| 	cl_assert_equal_i(1, expected.file_mods); | ||||
| 	cl_assert_equal_i(0, expected.hunks); | ||||
| 	cl_assert_equal_i(0, expected.lines); | ||||
| } | ||||
| 
 | ||||
| void test_diff_blob__can_compare_two_binary_blobs(void) | ||||
| @ -292,7 +292,7 @@ void test_diff_blob__comparing_two_text_blobs_honors_interhunkcontext(void) | ||||
| 	cl_git_pass(git_diff_blobs( | ||||
| 		old_d, d, &opts, &expected, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 	cl_assert(expected.hunks == 2); | ||||
| 	cl_assert_equal_i(2, expected.hunks); | ||||
| 
 | ||||
| 	/* Test with inter-hunk-context explicitly set to 0 */ | ||||
| 	opts.interhunk_lines = 0; | ||||
| @ -300,7 +300,7 @@ void test_diff_blob__comparing_two_text_blobs_honors_interhunkcontext(void) | ||||
| 	cl_git_pass(git_diff_blobs( | ||||
| 		old_d, d, &opts, &expected, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 	cl_assert(expected.hunks == 2); | ||||
| 	cl_assert_equal_i(2, expected.hunks); | ||||
| 
 | ||||
| 	/* Test with inter-hunk-context explicitly set to 1 */ | ||||
| 	opts.interhunk_lines = 1; | ||||
| @ -308,7 +308,7 @@ void test_diff_blob__comparing_two_text_blobs_honors_interhunkcontext(void) | ||||
| 	cl_git_pass(git_diff_blobs( | ||||
| 		old_d, d, &opts, &expected, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 	cl_assert(expected.hunks == 1); | ||||
| 	cl_assert_equal_i(1, expected.hunks); | ||||
| 
 | ||||
| 	git_blob_free(old_d); | ||||
| } | ||||
|  | ||||
| @ -103,3 +103,74 @@ int diff_line_fn( | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| int diff_foreach_via_iterator( | ||||
| 	git_diff_list *diff, | ||||
| 	void *data, | ||||
| 	git_diff_file_fn file_cb, | ||||
| 	git_diff_hunk_fn hunk_cb, | ||||
| 	git_diff_data_fn line_cb) | ||||
| { | ||||
| 	int error, curr, total; | ||||
| 	git_diff_iterator *iter; | ||||
| 	git_diff_delta *delta; | ||||
| 
 | ||||
| 	if ((error = git_diff_iterator_new(&iter, diff)) < 0) | ||||
| 		return error; | ||||
| 
 | ||||
| 	curr  = 0; | ||||
| 	total = git_diff_iterator_num_files(iter); | ||||
| 
 | ||||
| 	while (!(error = git_diff_iterator_next_file(&delta, iter))) { | ||||
| 		git_diff_range *range; | ||||
| 		const char *hdr; | ||||
| 		size_t hdr_len; | ||||
| 
 | ||||
| 		/* call file_cb for this file */ | ||||
| 		if (file_cb != NULL && file_cb(data, delta, (float)curr / total) != 0) | ||||
| 			goto abort; | ||||
| 
 | ||||
| 		if (!hunk_cb && !line_cb) | ||||
| 			continue; | ||||
| 
 | ||||
| 		while (!(error = git_diff_iterator_next_hunk( | ||||
| 				&range, &hdr, &hdr_len, iter))) { | ||||
| 			char origin; | ||||
| 			const char *line; | ||||
| 			size_t line_len; | ||||
| 
 | ||||
| 			if (hunk_cb && hunk_cb(data, delta, range, hdr, hdr_len) != 0) | ||||
| 				goto abort; | ||||
| 
 | ||||
| 			if (!line_cb) | ||||
| 				continue; | ||||
| 
 | ||||
| 			while (!(error = git_diff_iterator_next_line( | ||||
| 				&origin, &line, &line_len, iter))) { | ||||
| 
 | ||||
| 				if (line_cb(data, delta, range, origin, line, line_len) != 0) | ||||
| 					goto abort; | ||||
| 			} | ||||
| 
 | ||||
| 			if (error && error != GIT_ITEROVER) | ||||
| 				goto done; | ||||
| 		} | ||||
| 
 | ||||
| 		if (error && error != GIT_ITEROVER) | ||||
| 			goto done; | ||||
| 	} | ||||
| 
 | ||||
| done: | ||||
| 	git_diff_iterator_free(iter); | ||||
| 
 | ||||
| 	if (error == GIT_ITEROVER) | ||||
| 		error = 0; | ||||
| 
 | ||||
| 	return error; | ||||
| 
 | ||||
| abort: | ||||
| 	git_diff_iterator_free(iter); | ||||
| 	giterr_clear(); | ||||
| 
 | ||||
| 	return GIT_EUSER; | ||||
| } | ||||
|  | ||||
| @ -45,3 +45,9 @@ extern int diff_line_fn( | ||||
| 	const char *content, | ||||
| 	size_t content_len); | ||||
| 
 | ||||
| extern int diff_foreach_via_iterator( | ||||
| 	git_diff_list *diff, | ||||
| 	void *data, | ||||
| 	git_diff_file_fn file_cb, | ||||
| 	git_diff_hunk_fn hunk_cb, | ||||
| 	git_diff_data_fn line_cb); | ||||
|  | ||||
							
								
								
									
										116
									
								
								tests-clar/diff/diffiter.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								tests-clar/diff/diffiter.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,116 @@ | ||||
| #include "clar_libgit2.h" | ||||
| #include "diff_helpers.h" | ||||
| 
 | ||||
| void test_diff_diffiter__initialize(void) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| void test_diff_diffiter__cleanup(void) | ||||
| { | ||||
| 	cl_git_sandbox_cleanup(); | ||||
| } | ||||
| 
 | ||||
| void test_diff_diffiter__create(void) | ||||
| { | ||||
| 	git_repository *repo = cl_git_sandbox_init("attr"); | ||||
| 	git_diff_list *diff; | ||||
| 	git_diff_iterator *iter; | ||||
| 
 | ||||
| 	cl_git_pass(git_diff_workdir_to_index(repo, NULL, &diff)); | ||||
| 	cl_git_pass(git_diff_iterator_new(&iter, diff)); | ||||
| 	git_diff_iterator_free(iter); | ||||
| 	git_diff_list_free(diff); | ||||
| } | ||||
| 
 | ||||
| void test_diff_diffiter__iterate_files(void) | ||||
| { | ||||
| 	git_repository *repo = cl_git_sandbox_init("attr"); | ||||
| 	git_diff_list *diff; | ||||
| 	git_diff_iterator *iter; | ||||
| 	git_diff_delta *delta; | ||||
| 	int error, count = 0; | ||||
| 
 | ||||
| 	cl_git_pass(git_diff_workdir_to_index(repo, NULL, &diff)); | ||||
| 	cl_git_pass(git_diff_iterator_new(&iter, diff)); | ||||
| 
 | ||||
| 	while ((error = git_diff_iterator_next_file(&delta, iter)) != GIT_ITEROVER) { | ||||
| 		cl_assert_equal_i(0, error); | ||||
| 		cl_assert(delta != NULL); | ||||
| 		count++; | ||||
| 	} | ||||
| 
 | ||||
| 	cl_assert_equal_i(GIT_ITEROVER, error); | ||||
| 	cl_assert(delta == NULL); | ||||
| 	cl_assert_equal_i(6, count); | ||||
| 
 | ||||
| 	git_diff_iterator_free(iter); | ||||
| 	git_diff_list_free(diff); | ||||
| } | ||||
| 
 | ||||
| void test_diff_diffiter__iterate_files_2(void) | ||||
| { | ||||
| 	git_repository *repo = cl_git_sandbox_init("status"); | ||||
| 	git_diff_list *diff; | ||||
| 	git_diff_iterator *iter; | ||||
| 	git_diff_delta *delta; | ||||
| 	int error, count = 0; | ||||
| 
 | ||||
| 	cl_git_pass(git_diff_workdir_to_index(repo, NULL, &diff)); | ||||
| 	cl_git_pass(git_diff_iterator_new(&iter, diff)); | ||||
| 
 | ||||
| 	while ((error = git_diff_iterator_next_file(&delta, iter)) != GIT_ITEROVER) { | ||||
| 		cl_assert_equal_i(0, error); | ||||
| 		cl_assert(delta != NULL); | ||||
| 		count++; | ||||
| 	} | ||||
| 
 | ||||
| 	cl_assert_equal_i(GIT_ITEROVER, error); | ||||
| 	cl_assert(delta == NULL); | ||||
| 	cl_assert_equal_i(8, count); | ||||
| 
 | ||||
| 	git_diff_iterator_free(iter); | ||||
| 	git_diff_list_free(diff); | ||||
| } | ||||
| 
 | ||||
| void test_diff_diffiter__iterate_files_and_hunks(void) | ||||
| { | ||||
| 	git_repository *repo = cl_git_sandbox_init("status"); | ||||
| 	git_diff_options opts = {0}; | ||||
| 	git_diff_list *diff = NULL; | ||||
| 	git_diff_iterator *iter; | ||||
| 	git_diff_delta *delta; | ||||
| 	git_diff_range *range; | ||||
| 	const char *header; | ||||
| 	size_t header_len; | ||||
| 	int error, file_count = 0, hunk_count = 0; | ||||
| 
 | ||||
| 	opts.context_lines = 3; | ||||
| 	opts.interhunk_lines = 1; | ||||
| 	opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED; | ||||
| 
 | ||||
| 	cl_git_pass(git_diff_workdir_to_index(repo, &opts, &diff)); | ||||
| 
 | ||||
| 	cl_git_pass(git_diff_iterator_new(&iter, diff)); | ||||
| 
 | ||||
| 	while ((error = git_diff_iterator_next_file(&delta, iter)) != GIT_ITEROVER) { | ||||
| 		cl_assert_equal_i(0, error); | ||||
| 		cl_assert(delta); | ||||
| 
 | ||||
| 		file_count++; | ||||
| 
 | ||||
| 		while ((error = git_diff_iterator_next_hunk( | ||||
| 				&range, &header, &header_len, iter)) != GIT_ITEROVER) { | ||||
| 			cl_assert_equal_i(0, error); | ||||
| 			cl_assert(range); | ||||
| 			hunk_count++; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	cl_assert_equal_i(GIT_ITEROVER, error); | ||||
| 	cl_assert(delta == NULL); | ||||
| 	cl_assert_equal_i(13, file_count); | ||||
| 	cl_assert_equal_i(8, hunk_count); | ||||
| 
 | ||||
| 	git_diff_iterator_free(iter); | ||||
| 	git_diff_list_free(diff); | ||||
| } | ||||
| @ -44,17 +44,17 @@ void test_diff_index__0(void) | ||||
| 	 * - git diff -U1 --cached 26a125ee1bf | ||||
| 	 * - mv .git .gitted | ||||
| 	 */ | ||||
| 	cl_assert(exp.files == 8); | ||||
| 	cl_assert(exp.file_adds == 3); | ||||
| 	cl_assert(exp.file_dels == 2); | ||||
| 	cl_assert(exp.file_mods == 3); | ||||
| 	cl_assert_equal_i(8, exp.files); | ||||
| 	cl_assert_equal_i(3, exp.file_adds); | ||||
| 	cl_assert_equal_i(2, exp.file_dels); | ||||
| 	cl_assert_equal_i(3, exp.file_mods); | ||||
| 
 | ||||
| 	cl_assert(exp.hunks == 8); | ||||
| 	cl_assert_equal_i(8, exp.hunks); | ||||
| 
 | ||||
| 	cl_assert(exp.lines == 11); | ||||
| 	cl_assert(exp.line_ctxt == 3); | ||||
| 	cl_assert(exp.line_adds == 6); | ||||
| 	cl_assert(exp.line_dels == 2); | ||||
| 	cl_assert_equal_i(11, exp.lines); | ||||
| 	cl_assert_equal_i(3, exp.line_ctxt); | ||||
| 	cl_assert_equal_i(6, exp.line_adds); | ||||
| 	cl_assert_equal_i(2, exp.line_dels); | ||||
| 
 | ||||
| 	git_diff_list_free(diff); | ||||
| 	diff = NULL; | ||||
| @ -72,17 +72,17 @@ void test_diff_index__0(void) | ||||
| 	 * - git diff -U1 --cached 0017bd4ab1ec3 | ||||
| 	 * - mv .git .gitted | ||||
| 	 */ | ||||
| 	cl_assert(exp.files == 12); | ||||
| 	cl_assert(exp.file_adds == 7); | ||||
| 	cl_assert(exp.file_dels == 2); | ||||
| 	cl_assert(exp.file_mods == 3); | ||||
| 	cl_assert_equal_i(12, exp.files); | ||||
| 	cl_assert_equal_i(7, exp.file_adds); | ||||
| 	cl_assert_equal_i(2, exp.file_dels); | ||||
| 	cl_assert_equal_i(3, exp.file_mods); | ||||
| 
 | ||||
| 	cl_assert(exp.hunks == 12); | ||||
| 	cl_assert_equal_i(12, exp.hunks); | ||||
| 
 | ||||
| 	cl_assert(exp.lines == 16); | ||||
| 	cl_assert(exp.line_ctxt == 3); | ||||
| 	cl_assert(exp.line_adds == 11); | ||||
| 	cl_assert(exp.line_dels == 2); | ||||
| 	cl_assert_equal_i(16, exp.lines); | ||||
| 	cl_assert_equal_i(3, exp.line_ctxt); | ||||
| 	cl_assert_equal_i(11, exp.line_adds); | ||||
| 	cl_assert_equal_i(2, exp.line_dels); | ||||
| 
 | ||||
| 	git_diff_list_free(diff); | ||||
| 	diff = NULL; | ||||
| @ -132,7 +132,7 @@ void test_diff_index__1(void) | ||||
| 		git_diff_foreach(diff, &exp, diff_stop_after_2_files, NULL, NULL) | ||||
| 	); | ||||
| 
 | ||||
| 	cl_assert(exp.files == 2); | ||||
| 	cl_assert_equal_i(2, exp.files); | ||||
| 
 | ||||
| 	git_diff_list_free(diff); | ||||
| 	diff = NULL; | ||||
|  | ||||
| @ -39,17 +39,17 @@ void test_diff_tree__0(void) | ||||
| 	cl_git_pass(git_diff_foreach( | ||||
| 		diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 	cl_assert(exp.files == 5); | ||||
| 	cl_assert(exp.file_adds == 2); | ||||
| 	cl_assert(exp.file_dels == 1); | ||||
| 	cl_assert(exp.file_mods == 2); | ||||
| 	cl_assert_equal_i(5, exp.files); | ||||
| 	cl_assert_equal_i(2, exp.file_adds); | ||||
| 	cl_assert_equal_i(1, exp.file_dels); | ||||
| 	cl_assert_equal_i(2, exp.file_mods); | ||||
| 
 | ||||
| 	cl_assert(exp.hunks == 5); | ||||
| 	cl_assert_equal_i(5, exp.hunks); | ||||
| 
 | ||||
| 	cl_assert(exp.lines == 7 + 24 + 1 + 6 + 6); | ||||
| 	cl_assert(exp.line_ctxt == 1); | ||||
| 	cl_assert(exp.line_adds == 24 + 1 + 5 + 5); | ||||
| 	cl_assert(exp.line_dels == 7 + 1); | ||||
| 	cl_assert_equal_i(7 + 24 + 1 + 6 + 6, exp.lines); | ||||
| 	cl_assert_equal_i(1, exp.line_ctxt); | ||||
| 	cl_assert_equal_i(24 + 1 + 5 + 5, exp.line_adds); | ||||
| 	cl_assert_equal_i(7 + 1, exp.line_dels); | ||||
| 
 | ||||
| 	git_diff_list_free(diff); | ||||
| 	diff = NULL; | ||||
| @ -61,17 +61,17 @@ void test_diff_tree__0(void) | ||||
| 	cl_git_pass(git_diff_foreach( | ||||
| 		diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 	cl_assert(exp.files == 2); | ||||
| 	cl_assert(exp.file_adds == 0); | ||||
| 	cl_assert(exp.file_dels == 0); | ||||
| 	cl_assert(exp.file_mods == 2); | ||||
| 	cl_assert_equal_i(2, exp.files); | ||||
| 	cl_assert_equal_i(0, exp.file_adds); | ||||
| 	cl_assert_equal_i(0, exp.file_dels); | ||||
| 	cl_assert_equal_i(2, exp.file_mods); | ||||
| 
 | ||||
| 	cl_assert(exp.hunks == 2); | ||||
| 	cl_assert_equal_i(2, exp.hunks); | ||||
| 
 | ||||
| 	cl_assert(exp.lines == 8 + 15); | ||||
| 	cl_assert(exp.line_ctxt == 1); | ||||
| 	cl_assert(exp.line_adds == 1); | ||||
| 	cl_assert(exp.line_dels == 7 + 14); | ||||
| 	cl_assert_equal_i(8 + 15, exp.lines); | ||||
| 	cl_assert_equal_i(1, exp.line_ctxt); | ||||
| 	cl_assert_equal_i(1, exp.line_adds); | ||||
| 	cl_assert_equal_i(7 + 14, exp.line_dels); | ||||
| 
 | ||||
| 	git_diff_list_free(diff); | ||||
| 
 | ||||
| @ -192,17 +192,17 @@ void test_diff_tree__bare(void) | ||||
| 	cl_git_pass(git_diff_foreach( | ||||
| 		diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 	cl_assert(exp.files == 3); | ||||
| 	cl_assert(exp.file_adds == 2); | ||||
| 	cl_assert(exp.file_dels == 0); | ||||
| 	cl_assert(exp.file_mods == 1); | ||||
| 	cl_assert_equal_i(3, exp.files); | ||||
| 	cl_assert_equal_i(2, exp.file_adds); | ||||
| 	cl_assert_equal_i(0, exp.file_dels); | ||||
| 	cl_assert_equal_i(1, exp.file_mods); | ||||
| 
 | ||||
| 	cl_assert(exp.hunks == 3); | ||||
| 	cl_assert_equal_i(3, exp.hunks); | ||||
| 
 | ||||
| 	cl_assert(exp.lines == 4); | ||||
| 	cl_assert(exp.line_ctxt == 0); | ||||
| 	cl_assert(exp.line_adds == 3); | ||||
| 	cl_assert(exp.line_dels == 1); | ||||
| 	cl_assert_equal_i(4, exp.lines); | ||||
| 	cl_assert_equal_i(0, exp.line_ctxt); | ||||
| 	cl_assert_equal_i(3, exp.line_adds); | ||||
| 	cl_assert_equal_i(1, exp.line_dels); | ||||
| 
 | ||||
| 	git_diff_list_free(diff); | ||||
| 	git_tree_free(a); | ||||
| @ -242,17 +242,17 @@ void test_diff_tree__merge(void) | ||||
| 	cl_git_pass(git_diff_foreach( | ||||
| 		diff1, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 	cl_assert(exp.files == 6); | ||||
| 	cl_assert(exp.file_adds == 2); | ||||
| 	cl_assert(exp.file_dels == 1); | ||||
| 	cl_assert(exp.file_mods == 3); | ||||
| 	cl_assert_equal_i(6, exp.files); | ||||
| 	cl_assert_equal_i(2, exp.file_adds); | ||||
| 	cl_assert_equal_i(1, exp.file_dels); | ||||
| 	cl_assert_equal_i(3, exp.file_mods); | ||||
| 
 | ||||
| 	cl_assert(exp.hunks == 6); | ||||
| 	cl_assert_equal_i(6, exp.hunks); | ||||
| 
 | ||||
| 	cl_assert(exp.lines == 59); | ||||
| 	cl_assert(exp.line_ctxt == 1); | ||||
| 	cl_assert(exp.line_adds == 36); | ||||
| 	cl_assert(exp.line_dels == 22); | ||||
| 	cl_assert_equal_i(59, exp.lines); | ||||
| 	cl_assert_equal_i(1, exp.line_ctxt); | ||||
| 	cl_assert_equal_i(36, exp.line_adds); | ||||
| 	cl_assert_equal_i(22, exp.line_dels); | ||||
| 
 | ||||
| 	git_diff_list_free(diff1); | ||||
| } | ||||
|  | ||||
| @ -17,6 +17,7 @@ void test_diff_workdir__to_index(void) | ||||
| 	git_diff_options opts = {0}; | ||||
| 	git_diff_list *diff = NULL; | ||||
| 	diff_expects exp; | ||||
| 	int use_iterator; | ||||
| 
 | ||||
| 	g_repo = cl_git_sandbox_init("status"); | ||||
| 
 | ||||
| @ -24,33 +25,39 @@ void test_diff_workdir__to_index(void) | ||||
| 	opts.interhunk_lines = 1; | ||||
| 	opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED; | ||||
| 
 | ||||
| 	memset(&exp, 0, sizeof(exp)); | ||||
| 
 | ||||
| 	cl_git_pass(git_diff_workdir_to_index(g_repo, &opts, &diff)); | ||||
| 
 | ||||
| 	cl_git_pass(git_diff_foreach( | ||||
| 		diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 	for (use_iterator = 0; use_iterator <= 1; use_iterator++) { | ||||
| 		memset(&exp, 0, sizeof(exp)); | ||||
| 
 | ||||
| 	/* to generate these values:
 | ||||
| 	 * - cd to tests/resources/status, | ||||
| 	 * - mv .gitted .git | ||||
| 	 * - git diff --name-status | ||||
| 	 * - git diff | ||||
| 	 * - mv .git .gitted | ||||
| 	 */ | ||||
| 	cl_assert_equal_i(13, exp.files); | ||||
| 	cl_assert_equal_i(0, exp.file_adds); | ||||
| 	cl_assert_equal_i(4, exp.file_dels); | ||||
| 	cl_assert_equal_i(4, exp.file_mods); | ||||
| 	cl_assert_equal_i(1, exp.file_ignored); | ||||
| 	cl_assert_equal_i(4, exp.file_untracked); | ||||
| 		if (use_iterator) | ||||
| 			cl_git_pass(diff_foreach_via_iterator( | ||||
| 				diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 		else | ||||
| 			cl_git_pass(git_diff_foreach( | ||||
| 				diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 	cl_assert_equal_i(8, exp.hunks); | ||||
| 		/* to generate these values:
 | ||||
| 		 * - cd to tests/resources/status, | ||||
| 		 * - mv .gitted .git | ||||
| 		 * - git diff --name-status | ||||
| 		 * - git diff | ||||
| 		 * - mv .git .gitted | ||||
| 		 */ | ||||
| 		cl_assert_equal_i(13, exp.files); | ||||
| 		cl_assert_equal_i(0, exp.file_adds); | ||||
| 		cl_assert_equal_i(4, exp.file_dels); | ||||
| 		cl_assert_equal_i(4, exp.file_mods); | ||||
| 		cl_assert_equal_i(1, exp.file_ignored); | ||||
| 		cl_assert_equal_i(4, exp.file_untracked); | ||||
| 
 | ||||
| 	cl_assert_equal_i(14, exp.lines); | ||||
| 	cl_assert_equal_i(5, exp.line_ctxt); | ||||
| 	cl_assert_equal_i(4, exp.line_adds); | ||||
| 	cl_assert_equal_i(5, exp.line_dels); | ||||
| 		cl_assert_equal_i(8, exp.hunks); | ||||
| 
 | ||||
| 		cl_assert_equal_i(14, exp.lines); | ||||
| 		cl_assert_equal_i(5, exp.line_ctxt); | ||||
| 		cl_assert_equal_i(4, exp.line_adds); | ||||
| 		cl_assert_equal_i(5, exp.line_dels); | ||||
| 	} | ||||
| 
 | ||||
| 	git_diff_list_free(diff); | ||||
| } | ||||
| @ -65,6 +72,7 @@ void test_diff_workdir__to_tree(void) | ||||
| 	git_diff_list *diff = NULL; | ||||
| 	git_diff_list *diff2 = NULL; | ||||
| 	diff_expects exp; | ||||
| 	int use_iterator; | ||||
| 
 | ||||
| 	g_repo = cl_git_sandbox_init("status"); | ||||
| 
 | ||||
| @ -75,8 +83,6 @@ void test_diff_workdir__to_tree(void) | ||||
| 	opts.interhunk_lines = 1; | ||||
| 	opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED; | ||||
| 
 | ||||
| 	memset(&exp, 0, sizeof(exp)); | ||||
| 
 | ||||
| 	/* You can't really generate the equivalent of git_diff_workdir_to_tree()
 | ||||
| 	 * using C git.  It really wants to interpose the index into the diff. | ||||
| 	 * | ||||
| @ -89,15 +95,23 @@ void test_diff_workdir__to_tree(void) | ||||
| 	 */ | ||||
| 	cl_git_pass(git_diff_workdir_to_tree(g_repo, &opts, a, &diff)); | ||||
| 
 | ||||
| 	cl_git_pass(git_diff_foreach( | ||||
| 		diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 	for (use_iterator = 0; use_iterator <= 1; use_iterator++) { | ||||
| 		memset(&exp, 0, sizeof(exp)); | ||||
| 
 | ||||
| 	cl_assert_equal_i(14, exp.files); | ||||
| 	cl_assert_equal_i(0, exp.file_adds); | ||||
| 	cl_assert_equal_i(4, exp.file_dels); | ||||
| 	cl_assert_equal_i(4, exp.file_mods); | ||||
| 	cl_assert_equal_i(1, exp.file_ignored); | ||||
| 	cl_assert_equal_i(5, exp.file_untracked); | ||||
| 		if (use_iterator) | ||||
| 			cl_git_pass(diff_foreach_via_iterator( | ||||
| 				diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 		else | ||||
| 			cl_git_pass(git_diff_foreach( | ||||
| 				diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 		cl_assert_equal_i(14, exp.files); | ||||
| 		cl_assert_equal_i(0, exp.file_adds); | ||||
| 		cl_assert_equal_i(4, exp.file_dels); | ||||
| 		cl_assert_equal_i(4, exp.file_mods); | ||||
| 		cl_assert_equal_i(1, exp.file_ignored); | ||||
| 		cl_assert_equal_i(5, exp.file_untracked); | ||||
| 	} | ||||
| 
 | ||||
| 	/* Since there is no git diff equivalent, let's just assume that the
 | ||||
| 	 * text diffs produced by git_diff_foreach are accurate here.  We will | ||||
| @ -117,22 +131,30 @@ void test_diff_workdir__to_tree(void) | ||||
| 	cl_git_pass(git_diff_merge(diff, diff2)); | ||||
| 	git_diff_list_free(diff2); | ||||
| 
 | ||||
| 	cl_git_pass(git_diff_foreach( | ||||
| 		diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 	for (use_iterator = 0; use_iterator <= 1; use_iterator++) { | ||||
| 		memset(&exp, 0, sizeof(exp)); | ||||
| 
 | ||||
| 	cl_assert_equal_i(15, exp.files); | ||||
| 	cl_assert_equal_i(2, exp.file_adds); | ||||
| 	cl_assert_equal_i(5, exp.file_dels); | ||||
| 	cl_assert_equal_i(4, exp.file_mods); | ||||
| 	cl_assert_equal_i(1, exp.file_ignored); | ||||
| 	cl_assert_equal_i(3, exp.file_untracked); | ||||
| 		if (use_iterator) | ||||
| 			cl_git_pass(diff_foreach_via_iterator( | ||||
| 				diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 		else | ||||
| 			cl_git_pass(git_diff_foreach( | ||||
| 				diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 	cl_assert_equal_i(11, exp.hunks); | ||||
| 		cl_assert_equal_i(15, exp.files); | ||||
| 		cl_assert_equal_i(2, exp.file_adds); | ||||
| 		cl_assert_equal_i(5, exp.file_dels); | ||||
| 		cl_assert_equal_i(4, exp.file_mods); | ||||
| 		cl_assert_equal_i(1, exp.file_ignored); | ||||
| 		cl_assert_equal_i(3, exp.file_untracked); | ||||
| 
 | ||||
| 	cl_assert_equal_i(17, exp.lines); | ||||
| 	cl_assert_equal_i(4, exp.line_ctxt); | ||||
| 	cl_assert_equal_i(8, exp.line_adds); | ||||
| 	cl_assert_equal_i(5, exp.line_dels); | ||||
| 		cl_assert_equal_i(11, exp.hunks); | ||||
| 
 | ||||
| 		cl_assert_equal_i(17, exp.lines); | ||||
| 		cl_assert_equal_i(4, exp.line_ctxt); | ||||
| 		cl_assert_equal_i(8, exp.line_adds); | ||||
| 		cl_assert_equal_i(5, exp.line_dels); | ||||
| 	} | ||||
| 
 | ||||
| 	git_diff_list_free(diff); | ||||
| 	diff = NULL; | ||||
| @ -146,22 +168,30 @@ void test_diff_workdir__to_tree(void) | ||||
| 	cl_git_pass(git_diff_merge(diff, diff2)); | ||||
| 	git_diff_list_free(diff2); | ||||
| 
 | ||||
| 	cl_git_pass(git_diff_foreach( | ||||
| 		diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 	for (use_iterator = 0; use_iterator <= 1; use_iterator++) { | ||||
| 		memset(&exp, 0, sizeof(exp)); | ||||
| 
 | ||||
| 	cl_assert_equal_i(16, exp.files); | ||||
| 	cl_assert_equal_i(5, exp.file_adds); | ||||
| 	cl_assert_equal_i(4, exp.file_dels); | ||||
| 	cl_assert_equal_i(3, exp.file_mods); | ||||
| 	cl_assert_equal_i(1, exp.file_ignored); | ||||
| 	cl_assert_equal_i(3, exp.file_untracked); | ||||
| 		if (use_iterator) | ||||
| 			cl_git_pass(diff_foreach_via_iterator( | ||||
| 				diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 		else | ||||
| 			cl_git_pass(git_diff_foreach( | ||||
| 				diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 	cl_assert_equal_i(12, exp.hunks); | ||||
| 		cl_assert_equal_i(16, exp.files); | ||||
| 		cl_assert_equal_i(5, exp.file_adds); | ||||
| 		cl_assert_equal_i(4, exp.file_dels); | ||||
| 		cl_assert_equal_i(3, exp.file_mods); | ||||
| 		cl_assert_equal_i(1, exp.file_ignored); | ||||
| 		cl_assert_equal_i(3, exp.file_untracked); | ||||
| 
 | ||||
| 	cl_assert_equal_i(19, exp.lines); | ||||
| 	cl_assert_equal_i(3, exp.line_ctxt); | ||||
| 	cl_assert_equal_i(12, exp.line_adds); | ||||
| 	cl_assert_equal_i(4, exp.line_dels); | ||||
| 		cl_assert_equal_i(12, exp.hunks); | ||||
| 
 | ||||
| 		cl_assert_equal_i(19, exp.lines); | ||||
| 		cl_assert_equal_i(3, exp.line_ctxt); | ||||
| 		cl_assert_equal_i(12, exp.line_adds); | ||||
| 		cl_assert_equal_i(4, exp.line_dels); | ||||
| 	} | ||||
| 
 | ||||
| 	git_diff_list_free(diff); | ||||
| 
 | ||||
| @ -175,6 +205,7 @@ void test_diff_workdir__to_index_with_pathspec(void) | ||||
| 	git_diff_list *diff = NULL; | ||||
| 	diff_expects exp; | ||||
| 	char *pathspec = NULL; | ||||
| 	int use_iterator; | ||||
| 
 | ||||
| 	g_repo = cl_git_sandbox_init("status"); | ||||
| 
 | ||||
| @ -184,62 +215,93 @@ void test_diff_workdir__to_index_with_pathspec(void) | ||||
| 	opts.pathspec.strings = &pathspec; | ||||
| 	opts.pathspec.count   = 1; | ||||
| 
 | ||||
| 	memset(&exp, 0, sizeof(exp)); | ||||
| 
 | ||||
| 	cl_git_pass(git_diff_workdir_to_index(g_repo, &opts, &diff)); | ||||
| 	cl_git_pass(git_diff_foreach(diff, &exp, diff_file_fn, NULL, NULL)); | ||||
| 
 | ||||
| 	cl_assert_equal_i(13, exp.files); | ||||
| 	cl_assert_equal_i(0, exp.file_adds); | ||||
| 	cl_assert_equal_i(4, exp.file_dels); | ||||
| 	cl_assert_equal_i(4, exp.file_mods); | ||||
| 	cl_assert_equal_i(1, exp.file_ignored); | ||||
| 	cl_assert_equal_i(4, exp.file_untracked); | ||||
| 	for (use_iterator = 0; use_iterator <= 1; use_iterator++) { | ||||
| 		memset(&exp, 0, sizeof(exp)); | ||||
| 
 | ||||
| 		if (use_iterator) | ||||
| 			cl_git_pass(diff_foreach_via_iterator( | ||||
| 				diff, &exp, diff_file_fn, NULL, NULL)); | ||||
| 		else | ||||
| 			cl_git_pass(git_diff_foreach(diff, &exp, diff_file_fn, NULL, NULL)); | ||||
| 
 | ||||
| 		cl_assert_equal_i(13, exp.files); | ||||
| 		cl_assert_equal_i(0, exp.file_adds); | ||||
| 		cl_assert_equal_i(4, exp.file_dels); | ||||
| 		cl_assert_equal_i(4, exp.file_mods); | ||||
| 		cl_assert_equal_i(1, exp.file_ignored); | ||||
| 		cl_assert_equal_i(4, exp.file_untracked); | ||||
| 	} | ||||
| 
 | ||||
| 	git_diff_list_free(diff); | ||||
| 
 | ||||
| 	memset(&exp, 0, sizeof(exp)); | ||||
| 	pathspec = "modified_file"; | ||||
| 
 | ||||
| 	cl_git_pass(git_diff_workdir_to_index(g_repo, &opts, &diff)); | ||||
| 	cl_git_pass(git_diff_foreach(diff, &exp, diff_file_fn, NULL, NULL)); | ||||
| 
 | ||||
| 	cl_assert_equal_i(1, exp.files); | ||||
| 	cl_assert_equal_i(0, exp.file_adds); | ||||
| 	cl_assert_equal_i(0, exp.file_dels); | ||||
| 	cl_assert_equal_i(1, exp.file_mods); | ||||
| 	cl_assert_equal_i(0, exp.file_ignored); | ||||
| 	cl_assert_equal_i(0, exp.file_untracked); | ||||
| 	for (use_iterator = 0; use_iterator <= 1; use_iterator++) { | ||||
| 		memset(&exp, 0, sizeof(exp)); | ||||
| 
 | ||||
| 		if (use_iterator) | ||||
| 			cl_git_pass(diff_foreach_via_iterator( | ||||
| 				diff, &exp, diff_file_fn, NULL, NULL)); | ||||
| 		else | ||||
| 			cl_git_pass(git_diff_foreach(diff, &exp, diff_file_fn, NULL, NULL)); | ||||
| 
 | ||||
| 		cl_assert_equal_i(1, exp.files); | ||||
| 		cl_assert_equal_i(0, exp.file_adds); | ||||
| 		cl_assert_equal_i(0, exp.file_dels); | ||||
| 		cl_assert_equal_i(1, exp.file_mods); | ||||
| 		cl_assert_equal_i(0, exp.file_ignored); | ||||
| 		cl_assert_equal_i(0, exp.file_untracked); | ||||
| 	} | ||||
| 
 | ||||
| 	git_diff_list_free(diff); | ||||
| 
 | ||||
| 	memset(&exp, 0, sizeof(exp)); | ||||
| 	pathspec = "subdir"; | ||||
| 
 | ||||
| 	cl_git_pass(git_diff_workdir_to_index(g_repo, &opts, &diff)); | ||||
| 	cl_git_pass(git_diff_foreach(diff, &exp, diff_file_fn, NULL, NULL)); | ||||
| 
 | ||||
| 	cl_assert_equal_i(3, exp.files); | ||||
| 	cl_assert_equal_i(0, exp.file_adds); | ||||
| 	cl_assert_equal_i(1, exp.file_dels); | ||||
| 	cl_assert_equal_i(1, exp.file_mods); | ||||
| 	cl_assert_equal_i(0, exp.file_ignored); | ||||
| 	cl_assert_equal_i(1, exp.file_untracked); | ||||
| 	for (use_iterator = 0; use_iterator <= 1; use_iterator++) { | ||||
| 		memset(&exp, 0, sizeof(exp)); | ||||
| 
 | ||||
| 		if (use_iterator) | ||||
| 			cl_git_pass(diff_foreach_via_iterator( | ||||
| 				diff, &exp, diff_file_fn, NULL, NULL)); | ||||
| 		else | ||||
| 			cl_git_pass(git_diff_foreach(diff, &exp, diff_file_fn, NULL, NULL)); | ||||
| 
 | ||||
| 		cl_assert_equal_i(3, exp.files); | ||||
| 		cl_assert_equal_i(0, exp.file_adds); | ||||
| 		cl_assert_equal_i(1, exp.file_dels); | ||||
| 		cl_assert_equal_i(1, exp.file_mods); | ||||
| 		cl_assert_equal_i(0, exp.file_ignored); | ||||
| 		cl_assert_equal_i(1, exp.file_untracked); | ||||
| 	} | ||||
| 
 | ||||
| 	git_diff_list_free(diff); | ||||
| 
 | ||||
| 	memset(&exp, 0, sizeof(exp)); | ||||
| 	pathspec = "*_deleted"; | ||||
| 
 | ||||
| 	cl_git_pass(git_diff_workdir_to_index(g_repo, &opts, &diff)); | ||||
| 	cl_git_pass(git_diff_foreach(diff, &exp, diff_file_fn, NULL, NULL)); | ||||
| 
 | ||||
| 	cl_assert_equal_i(2, exp.files); | ||||
| 	cl_assert_equal_i(0, exp.file_adds); | ||||
| 	cl_assert_equal_i(2, exp.file_dels); | ||||
| 	cl_assert_equal_i(0, exp.file_mods); | ||||
| 	cl_assert_equal_i(0, exp.file_ignored); | ||||
| 	cl_assert_equal_i(0, exp.file_untracked); | ||||
| 	for (use_iterator = 0; use_iterator <= 1; use_iterator++) { | ||||
| 		memset(&exp, 0, sizeof(exp)); | ||||
| 
 | ||||
| 		if (use_iterator) | ||||
| 			cl_git_pass(diff_foreach_via_iterator( | ||||
| 				diff, &exp, diff_file_fn, NULL, NULL)); | ||||
| 		else | ||||
| 			cl_git_pass(git_diff_foreach(diff, &exp, diff_file_fn, NULL, NULL)); | ||||
| 
 | ||||
| 		cl_assert_equal_i(2, exp.files); | ||||
| 		cl_assert_equal_i(0, exp.file_adds); | ||||
| 		cl_assert_equal_i(2, exp.file_dels); | ||||
| 		cl_assert_equal_i(0, exp.file_mods); | ||||
| 		cl_assert_equal_i(0, exp.file_ignored); | ||||
| 		cl_assert_equal_i(0, exp.file_untracked); | ||||
| 	} | ||||
| 
 | ||||
| 	git_diff_list_free(diff); | ||||
| } | ||||
| @ -249,6 +311,7 @@ void test_diff_workdir__filemode_changes(void) | ||||
| 	git_config *cfg; | ||||
| 	git_diff_list *diff = NULL; | ||||
| 	diff_expects exp; | ||||
| 	int use_iterator; | ||||
| 
 | ||||
| 	if (!cl_is_chmod_supported()) | ||||
| 		return; | ||||
| @ -262,13 +325,20 @@ void test_diff_workdir__filemode_changes(void) | ||||
| 
 | ||||
| 	cl_git_pass(git_diff_workdir_to_index(g_repo, NULL, &diff)); | ||||
| 
 | ||||
| 	memset(&exp, 0, sizeof(exp)); | ||||
| 	cl_git_pass(git_diff_foreach( | ||||
| 		diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 	for (use_iterator = 0; use_iterator <= 1; use_iterator++) { | ||||
| 		memset(&exp, 0, sizeof(exp)); | ||||
| 
 | ||||
| 	cl_assert_equal_i(0, exp.files); | ||||
| 	cl_assert_equal_i(0, exp.file_mods); | ||||
| 	cl_assert_equal_i(0, exp.hunks); | ||||
| 		if (use_iterator) | ||||
| 			cl_git_pass(diff_foreach_via_iterator( | ||||
| 				diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 		else | ||||
| 			cl_git_pass(git_diff_foreach( | ||||
| 				diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 		cl_assert_equal_i(0, exp.files); | ||||
| 		cl_assert_equal_i(0, exp.file_mods); | ||||
| 		cl_assert_equal_i(0, exp.hunks); | ||||
| 	} | ||||
| 
 | ||||
| 	git_diff_list_free(diff); | ||||
| 
 | ||||
| @ -278,13 +348,20 @@ void test_diff_workdir__filemode_changes(void) | ||||
| 
 | ||||
| 	cl_git_pass(git_diff_workdir_to_index(g_repo, NULL, &diff)); | ||||
| 
 | ||||
| 	memset(&exp, 0, sizeof(exp)); | ||||
| 	cl_git_pass(git_diff_foreach( | ||||
| 		diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 	for (use_iterator = 0; use_iterator <= 1; use_iterator++) { | ||||
| 		memset(&exp, 0, sizeof(exp)); | ||||
| 
 | ||||
| 	cl_assert_equal_i(1, exp.files); | ||||
| 	cl_assert_equal_i(1, exp.file_mods); | ||||
| 	cl_assert_equal_i(0, exp.hunks); | ||||
| 		if (use_iterator) | ||||
| 			cl_git_pass(diff_foreach_via_iterator( | ||||
| 				diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 		else | ||||
| 			cl_git_pass(git_diff_foreach( | ||||
| 				diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 		cl_assert_equal_i(1, exp.files); | ||||
| 		cl_assert_equal_i(1, exp.file_mods); | ||||
| 		cl_assert_equal_i(0, exp.hunks); | ||||
| 	} | ||||
| 
 | ||||
| 	git_diff_list_free(diff); | ||||
| 
 | ||||
| @ -347,6 +424,7 @@ void test_diff_workdir__head_index_and_workdir_all_differ(void) | ||||
| 	diff_expects exp; | ||||
| 	char *pathspec = "staged_changes_modified_file"; | ||||
| 	git_tree *tree; | ||||
| 	int use_iterator; | ||||
| 
 | ||||
| 	/* For this file,
 | ||||
| 	 * - head->index diff has 1 line of context, 1 line of diff | ||||
| @ -366,46 +444,70 @@ void test_diff_workdir__head_index_and_workdir_all_differ(void) | ||||
| 	cl_git_pass(git_diff_index_to_tree(g_repo, &opts, tree, &diff_i2t)); | ||||
| 	cl_git_pass(git_diff_workdir_to_index(g_repo, &opts, &diff_w2i)); | ||||
| 
 | ||||
| 	memset(&exp, 0, sizeof(exp)); | ||||
| 	cl_git_pass(git_diff_foreach( | ||||
| 		diff_i2t, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 	cl_assert_equal_i(1, exp.files); | ||||
| 	cl_assert_equal_i(0, exp.file_adds); | ||||
| 	cl_assert_equal_i(0, exp.file_dels); | ||||
| 	cl_assert_equal_i(1, exp.file_mods); | ||||
| 	cl_assert_equal_i(1, exp.hunks); | ||||
| 	cl_assert_equal_i(2, exp.lines); | ||||
| 	cl_assert_equal_i(1, exp.line_ctxt); | ||||
| 	cl_assert_equal_i(1, exp.line_adds); | ||||
| 	cl_assert_equal_i(0, exp.line_dels); | ||||
| 	for (use_iterator = 0; use_iterator <= 1; use_iterator++) { | ||||
| 		memset(&exp, 0, sizeof(exp)); | ||||
| 
 | ||||
| 	memset(&exp, 0, sizeof(exp)); | ||||
| 	cl_git_pass(git_diff_foreach( | ||||
| 		diff_w2i, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 	cl_assert_equal_i(1, exp.files); | ||||
| 	cl_assert_equal_i(0, exp.file_adds); | ||||
| 	cl_assert_equal_i(0, exp.file_dels); | ||||
| 	cl_assert_equal_i(1, exp.file_mods); | ||||
| 	cl_assert_equal_i(1, exp.hunks); | ||||
| 	cl_assert_equal_i(3, exp.lines); | ||||
| 	cl_assert_equal_i(2, exp.line_ctxt); | ||||
| 	cl_assert_equal_i(1, exp.line_adds); | ||||
| 	cl_assert_equal_i(0, exp.line_dels); | ||||
| 		if (use_iterator) | ||||
| 			cl_git_pass(diff_foreach_via_iterator( | ||||
| 				diff_i2t, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 		else | ||||
| 			cl_git_pass(git_diff_foreach( | ||||
| 				diff_i2t, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 		cl_assert_equal_i(1, exp.files); | ||||
| 		cl_assert_equal_i(0, exp.file_adds); | ||||
| 		cl_assert_equal_i(0, exp.file_dels); | ||||
| 		cl_assert_equal_i(1, exp.file_mods); | ||||
| 		cl_assert_equal_i(1, exp.hunks); | ||||
| 		cl_assert_equal_i(2, exp.lines); | ||||
| 		cl_assert_equal_i(1, exp.line_ctxt); | ||||
| 		cl_assert_equal_i(1, exp.line_adds); | ||||
| 		cl_assert_equal_i(0, exp.line_dels); | ||||
| 	} | ||||
| 
 | ||||
| 	for (use_iterator = 0; use_iterator <= 1; use_iterator++) { | ||||
| 		memset(&exp, 0, sizeof(exp)); | ||||
| 
 | ||||
| 		if (use_iterator) | ||||
| 			cl_git_pass(diff_foreach_via_iterator( | ||||
| 				diff_w2i, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 		else | ||||
| 			cl_git_pass(git_diff_foreach( | ||||
| 				diff_w2i, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 		cl_assert_equal_i(1, exp.files); | ||||
| 		cl_assert_equal_i(0, exp.file_adds); | ||||
| 		cl_assert_equal_i(0, exp.file_dels); | ||||
| 		cl_assert_equal_i(1, exp.file_mods); | ||||
| 		cl_assert_equal_i(1, exp.hunks); | ||||
| 		cl_assert_equal_i(3, exp.lines); | ||||
| 		cl_assert_equal_i(2, exp.line_ctxt); | ||||
| 		cl_assert_equal_i(1, exp.line_adds); | ||||
| 		cl_assert_equal_i(0, exp.line_dels); | ||||
| 	} | ||||
| 
 | ||||
| 	cl_git_pass(git_diff_merge(diff_i2t, diff_w2i)); | ||||
| 
 | ||||
| 	memset(&exp, 0, sizeof(exp)); | ||||
| 	cl_git_pass(git_diff_foreach( | ||||
| 		diff_i2t, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 	cl_assert_equal_i(1, exp.files); | ||||
| 	cl_assert_equal_i(0, exp.file_adds); | ||||
| 	cl_assert_equal_i(0, exp.file_dels); | ||||
| 	cl_assert_equal_i(1, exp.file_mods); | ||||
| 	cl_assert_equal_i(1, exp.hunks); | ||||
| 	cl_assert_equal_i(3, exp.lines); | ||||
| 	cl_assert_equal_i(1, exp.line_ctxt); | ||||
| 	cl_assert_equal_i(2, exp.line_adds); | ||||
| 	cl_assert_equal_i(0, exp.line_dels); | ||||
| 	for (use_iterator = 0; use_iterator <= 1; use_iterator++) { | ||||
| 		memset(&exp, 0, sizeof(exp)); | ||||
| 
 | ||||
| 		if (use_iterator) | ||||
| 			cl_git_pass(diff_foreach_via_iterator( | ||||
| 				diff_i2t, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 		else | ||||
| 			cl_git_pass(git_diff_foreach( | ||||
| 				diff_i2t, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 		cl_assert_equal_i(1, exp.files); | ||||
| 		cl_assert_equal_i(0, exp.file_adds); | ||||
| 		cl_assert_equal_i(0, exp.file_dels); | ||||
| 		cl_assert_equal_i(1, exp.file_mods); | ||||
| 		cl_assert_equal_i(1, exp.hunks); | ||||
| 		cl_assert_equal_i(3, exp.lines); | ||||
| 		cl_assert_equal_i(1, exp.line_ctxt); | ||||
| 		cl_assert_equal_i(2, exp.line_adds); | ||||
| 		cl_assert_equal_i(0, exp.line_dels); | ||||
| 	} | ||||
| 
 | ||||
| 	git_diff_list_free(diff_i2t); | ||||
| 	git_diff_list_free(diff_w2i); | ||||
| @ -419,6 +521,7 @@ void test_diff_workdir__eof_newline_changes(void) | ||||
| 	git_diff_list *diff = NULL; | ||||
| 	diff_expects exp; | ||||
| 	char *pathspec = "current_file"; | ||||
| 	int use_iterator; | ||||
| 
 | ||||
| 	g_repo = cl_git_sandbox_init("status"); | ||||
| 
 | ||||
| @ -427,18 +530,26 @@ void test_diff_workdir__eof_newline_changes(void) | ||||
| 
 | ||||
| 	cl_git_pass(git_diff_workdir_to_index(g_repo, &opts, &diff)); | ||||
| 
 | ||||
| 	memset(&exp, 0, sizeof(exp)); | ||||
| 	cl_git_pass(git_diff_foreach( | ||||
| 		diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 	cl_assert_equal_i(0, exp.files); | ||||
| 	cl_assert_equal_i(0, exp.file_adds); | ||||
| 	cl_assert_equal_i(0, exp.file_dels); | ||||
| 	cl_assert_equal_i(0, exp.file_mods); | ||||
| 	cl_assert_equal_i(0, exp.hunks); | ||||
| 	cl_assert_equal_i(0, exp.lines); | ||||
| 	cl_assert_equal_i(0, exp.line_ctxt); | ||||
| 	cl_assert_equal_i(0, exp.line_adds); | ||||
| 	cl_assert_equal_i(0, exp.line_dels); | ||||
| 	for (use_iterator = 0; use_iterator <= 1; use_iterator++) { | ||||
| 		memset(&exp, 0, sizeof(exp)); | ||||
| 
 | ||||
| 		if (use_iterator) | ||||
| 			cl_git_pass(diff_foreach_via_iterator( | ||||
| 				diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 		else | ||||
| 			cl_git_pass(git_diff_foreach( | ||||
| 				diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 		cl_assert_equal_i(0, exp.files); | ||||
| 		cl_assert_equal_i(0, exp.file_adds); | ||||
| 		cl_assert_equal_i(0, exp.file_dels); | ||||
| 		cl_assert_equal_i(0, exp.file_mods); | ||||
| 		cl_assert_equal_i(0, exp.hunks); | ||||
| 		cl_assert_equal_i(0, exp.lines); | ||||
| 		cl_assert_equal_i(0, exp.line_ctxt); | ||||
| 		cl_assert_equal_i(0, exp.line_adds); | ||||
| 		cl_assert_equal_i(0, exp.line_dels); | ||||
| 	} | ||||
| 
 | ||||
| 	git_diff_list_free(diff); | ||||
| 
 | ||||
| @ -446,18 +557,26 @@ void test_diff_workdir__eof_newline_changes(void) | ||||
| 
 | ||||
| 	cl_git_pass(git_diff_workdir_to_index(g_repo, &opts, &diff)); | ||||
| 
 | ||||
| 	memset(&exp, 0, sizeof(exp)); | ||||
| 	cl_git_pass(git_diff_foreach( | ||||
| 		diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 	cl_assert_equal_i(1, exp.files); | ||||
| 	cl_assert_equal_i(0, exp.file_adds); | ||||
| 	cl_assert_equal_i(0, exp.file_dels); | ||||
| 	cl_assert_equal_i(1, exp.file_mods); | ||||
| 	cl_assert_equal_i(1, exp.hunks); | ||||
| 	cl_assert_equal_i(2, exp.lines); | ||||
| 	cl_assert_equal_i(1, exp.line_ctxt); | ||||
| 	cl_assert_equal_i(1, exp.line_adds); | ||||
| 	cl_assert_equal_i(0, exp.line_dels); | ||||
| 	for (use_iterator = 0; use_iterator <= 1; use_iterator++) { | ||||
| 		memset(&exp, 0, sizeof(exp)); | ||||
| 
 | ||||
| 		if (use_iterator) | ||||
| 			cl_git_pass(diff_foreach_via_iterator( | ||||
| 				diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 		else | ||||
| 			cl_git_pass(git_diff_foreach( | ||||
| 				diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 		cl_assert_equal_i(1, exp.files); | ||||
| 		cl_assert_equal_i(0, exp.file_adds); | ||||
| 		cl_assert_equal_i(0, exp.file_dels); | ||||
| 		cl_assert_equal_i(1, exp.file_mods); | ||||
| 		cl_assert_equal_i(1, exp.hunks); | ||||
| 		cl_assert_equal_i(2, exp.lines); | ||||
| 		cl_assert_equal_i(1, exp.line_ctxt); | ||||
| 		cl_assert_equal_i(1, exp.line_adds); | ||||
| 		cl_assert_equal_i(0, exp.line_dels); | ||||
| 	} | ||||
| 
 | ||||
| 	git_diff_list_free(diff); | ||||
| 
 | ||||
| @ -465,18 +584,26 @@ void test_diff_workdir__eof_newline_changes(void) | ||||
| 
 | ||||
| 	cl_git_pass(git_diff_workdir_to_index(g_repo, &opts, &diff)); | ||||
| 
 | ||||
| 	memset(&exp, 0, sizeof(exp)); | ||||
| 	cl_git_pass(git_diff_foreach( | ||||
| 		diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 	cl_assert_equal_i(1, exp.files); | ||||
| 	cl_assert_equal_i(0, exp.file_adds); | ||||
| 	cl_assert_equal_i(0, exp.file_dels); | ||||
| 	cl_assert_equal_i(1, exp.file_mods); | ||||
| 	cl_assert_equal_i(1, exp.hunks); | ||||
| 	cl_assert_equal_i(3, exp.lines); | ||||
| 	cl_assert_equal_i(0, exp.line_ctxt); | ||||
| 	cl_assert_equal_i(1, exp.line_adds); | ||||
| 	cl_assert_equal_i(2, exp.line_dels); | ||||
| 	for (use_iterator = 0; use_iterator <= 1; use_iterator++) { | ||||
| 		memset(&exp, 0, sizeof(exp)); | ||||
| 
 | ||||
| 		if (use_iterator) | ||||
| 			cl_git_pass(diff_foreach_via_iterator( | ||||
| 				diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 		else | ||||
| 			cl_git_pass(git_diff_foreach( | ||||
| 				diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); | ||||
| 
 | ||||
| 		cl_assert_equal_i(1, exp.files); | ||||
| 		cl_assert_equal_i(0, exp.file_adds); | ||||
| 		cl_assert_equal_i(0, exp.file_dels); | ||||
| 		cl_assert_equal_i(1, exp.file_mods); | ||||
| 		cl_assert_equal_i(1, exp.hunks); | ||||
| 		cl_assert_equal_i(3, exp.lines); | ||||
| 		cl_assert_equal_i(0, exp.line_ctxt); | ||||
| 		cl_assert_equal_i(1, exp.line_adds); | ||||
| 		cl_assert_equal_i(2, exp.line_dels); | ||||
| 	} | ||||
| 
 | ||||
| 	git_diff_list_free(diff); | ||||
| } | ||||
|  | ||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Russell Belfer
						Russell Belfer