Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

diff: provide more context to the consumer of the callbacks #652

Merged
merged 4 commits into from

3 participants

@nulltoken
Collaborator

Update the diff callbacks to provide some information related to the file change being processed and the range of the hunk, when applicable.

The need for this fix has been identified by @yorah while implementing the Diff API in LibGit2Sharp (cf . libgit2/libgit2sharp#136).

Additionally, I've added a tiny accessor git_buf_len() which I've always missed.
If you think it's inappropriate I'll gladly remove it from the PR and will keep on digging into the buffer code to find out if I'm supposed to use the sizeor asize property :-)

@travisbot

This pull request passes (merged 4481f983 into 8b9ec20).

@nulltoken
Collaborator

@arrbee Does this patch reflect what you had in mind?

nulltoken added some commits
@nulltoken nulltoken diff: provide more context to the consumer of the callbacks
Update the callback to provide some information related to the file change being processed and the range of the hunk, when applicable.
1d2dd86
@nulltoken nulltoken buf: deploy git_buf_len() fa6420f
@travisbot

This pull request passes (merged fa6420f into 8b9ec20).

@travisbot

This pull request passes (merged 2de0652 into 8b9ec20).

@arrbee
Owner

Looks great! :shipit:

@arrbee arrbee merged commit 0dc8e95 into libgit2:new-error-handling
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Apr 29, 2012
  1. @nulltoken
Commits on Apr 30, 2012
  1. @nulltoken

    diff: provide more context to the consumer of the callbacks

    nulltoken authored
    Update the callback to provide some information related to the file change being processed and the range of the hunk, when applicable.
  2. @nulltoken

    buf: deploy git_buf_len()

    nulltoken authored
  3. @nulltoken
This page is out of date. Refresh to see the latest.
View
37 include/git2/diff.h
@@ -154,19 +154,22 @@ typedef int (*git_diff_hunk_fn)(
* Line origin constants.
*
* These values describe where a line came from and will be passed to
- * the git_diff_line_fn when iterating over a diff. There are some
+ * the git_diff_data_fn when iterating over a diff. There are some
* special origin contants at the end that are used for the text
* output callbacks to demarcate lines that are actually part of
* the file or hunk headers.
*/
enum {
- /* these values will be sent to `git_diff_line_fn` along with the line */
+ /* these values will be sent to `git_diff_data_fn` along with the line */
GIT_DIFF_LINE_CONTEXT = ' ',
GIT_DIFF_LINE_ADDITION = '+',
GIT_DIFF_LINE_DELETION = '-',
GIT_DIFF_LINE_ADD_EOFNL = '\n', /**< LF was added at end of file */
GIT_DIFF_LINE_DEL_EOFNL = '\0', /**< LF was removed at end of file */
- /* these values will only be sent to a `git_diff_output_fn` */
+ /* these values will only be sent to a `git_diff_data_fn` when the content
+ * of a diff is being formatted (eg. through git_diff_print_patch() or
+ * git_diff_print_compact(), for instance).
+ */
GIT_DIFF_LINE_FILE_HDR = 'F',
GIT_DIFF_LINE_HUNK_HDR = 'H',
GIT_DIFF_LINE_BINARY = 'B'
@@ -174,25 +177,19 @@ enum {
/**
* When iterating over a diff, callback that will be made per text diff
- * line.
- */
-typedef int (*git_diff_line_fn)(
- void *cb_data,
- git_diff_delta *delta,
- char line_origin, /**< GIT_DIFF_LINE_... value from above */
- const char *content,
- size_t content_len);
-
-/**
+ * line. In this context, the provided range will be NULL.
+ *
* When printing a diff, callback that will be made to output each line
* of text. This uses some extra GIT_DIFF_LINE_... constants for output
* of lines of file and hunk headers.
*/
-typedef int (*git_diff_output_fn)(
+typedef int (*git_diff_data_fn)(
void *cb_data,
+ git_diff_delta *delta,
+ git_diff_range *range,
char line_origin, /**< GIT_DIFF_LINE_... value from above */
- const char *formatted_output);
-
+ const char *content,
+ size_t content_len);
/** @name Diff List Generator Functions
*
@@ -311,7 +308,7 @@ GIT_EXTERN(int) git_diff_foreach(
void *cb_data,
git_diff_file_fn file_cb,
git_diff_hunk_fn hunk_cb,
- git_diff_line_fn line_cb);
+ git_diff_data_fn line_cb);
/**
* Iterate over a diff generating text output like "git diff --name-status".
@@ -319,7 +316,7 @@ GIT_EXTERN(int) git_diff_foreach(
GIT_EXTERN(int) git_diff_print_compact(
git_diff_list *diff,
void *cb_data,
- git_diff_output_fn print_cb);
+ git_diff_data_fn print_cb);
/**
* Iterate over a diff generating text output like "git diff".
@@ -329,7 +326,7 @@ GIT_EXTERN(int) git_diff_print_compact(
GIT_EXTERN(int) git_diff_print_patch(
git_diff_list *diff,
void *cb_data,
- git_diff_output_fn print_cb);
+ git_diff_data_fn print_cb);
/**@}*/
@@ -348,7 +345,7 @@ GIT_EXTERN(int) git_diff_blobs(
git_diff_options *options,
void *cb_data,
git_diff_hunk_fn hunk_cb,
- git_diff_line_fn line_cb);
+ git_diff_data_fn line_cb);
GIT_END_DECL
View
7 src/buffer.h
@@ -93,11 +93,16 @@ GIT_INLINE(int) git_buf_joinpath(git_buf *buf, const char *a, const char *b)
return git_buf_join(buf, '/', a, b);
}
-GIT_INLINE(const char *) git_buf_cstr(git_buf *buf)
+GIT_INLINE(const char *) git_buf_cstr(const git_buf *buf)
{
return buf->ptr;
}
+GIT_INLINE(size_t) git_buf_len(const git_buf *buf)
+{
+ return buf->size;
+}
+
void git_buf_copy_cstr(char *data, size_t datasize, const git_buf *buf);
#define git_buf_PUTS(buf, str) git_buf_put(buf, str, sizeof(str) - 1)
View
2  src/config_file.c
@@ -1233,7 +1233,7 @@ static int parse_multiline_variable(diskfile_backend *cfg, git_buf *value, int i
* standard, this character **has** to be last one in the buf, with
* no whitespace after it */
assert(is_multiline_var(value->ptr));
- git_buf_truncate(value, value->size - 1);
+ git_buf_truncate(value, git_buf_len(value) - 1);
proc_line = fixup_line(line, in_quotes);
if (proc_line == NULL) {
View
4 src/crlf.c
@@ -105,7 +105,7 @@ static int crlf_load_attributes(struct crlf_attrs *ca, git_repository *repo, con
static int drop_crlf(git_buf *dest, const git_buf *source)
{
const char *scan = source->ptr, *next;
- const char *scan_end = source->ptr + source->size;
+ const char *scan_end = git_buf_cstr(source) + git_buf_len(source);
/* Main scan loop. Find the next carriage return and copy the
* whole chunk up to that point to the destination buffer.
@@ -138,7 +138,7 @@ static int crlf_apply_to_odb(git_filter *self, git_buf *dest, const git_buf *sou
assert(self && dest && source);
/* Empty file? Nothing to do */
- if (source->size == 0)
+ if (git_buf_len(source) == 0)
return 0;
/* Heuristics to see if we can skip the conversion.
View
35 src/diff_output.c
@@ -18,9 +18,10 @@ typedef struct {
git_diff_list *diff;
void *cb_data;
git_diff_hunk_fn hunk_cb;
- git_diff_line_fn line_cb;
+ git_diff_data_fn line_cb;
unsigned int index;
git_diff_delta *delta;
+ git_diff_range range;
} diff_output_info;
static int read_next_int(const char **str, int *value)
@@ -62,6 +63,8 @@ static int diff_output_cb(void *priv, mmbuffer_t *bufs, int len)
if (range.old_start < 0 || range.new_start < 0)
return -1;
+ memcpy(&info->range, &range, sizeof(git_diff_range));
+
return info->hunk_cb(
info->cb_data, info->delta, &range, bufs[0].ptr, bufs[0].size);
}
@@ -76,7 +79,7 @@ static int diff_output_cb(void *priv, mmbuffer_t *bufs, int len)
GIT_DIFF_LINE_CONTEXT;
if (info->line_cb(
- info->cb_data, info->delta, origin, bufs[1].ptr, bufs[1].size) < 0)
+ info->cb_data, info->delta, &info->range, origin, bufs[1].ptr, bufs[1].size) < 0)
return -1;
/* deal with adding and removing newline at EOF */
@@ -87,7 +90,7 @@ static int diff_output_cb(void *priv, mmbuffer_t *bufs, int len)
origin = GIT_DIFF_LINE_DEL_EOFNL;
return info->line_cb(
- info->cb_data, info->delta, origin, bufs[2].ptr, bufs[2].size);
+ info->cb_data, info->delta, &info->range, origin, bufs[2].ptr, bufs[2].size);
}
}
@@ -291,7 +294,7 @@ int git_diff_foreach(
void *data,
git_diff_file_fn file_cb,
git_diff_hunk_fn hunk_cb,
- git_diff_line_fn line_cb)
+ git_diff_data_fn line_cb)
{
int error = 0;
diff_output_info info;
@@ -433,7 +436,7 @@ int git_diff_foreach(
typedef struct {
git_diff_list *diff;
- git_diff_output_fn print_cb;
+ git_diff_data_fn print_cb;
void *cb_data;
git_buf *buf;
} diff_print_info;
@@ -491,13 +494,13 @@ static int print_compact(void *data, git_diff_delta *delta, float progress)
if (git_buf_oom(pi->buf))
return -1;
- return pi->print_cb(pi->cb_data, GIT_DIFF_LINE_FILE_HDR, pi->buf->ptr);
+ return pi->print_cb(pi->cb_data, delta, NULL, GIT_DIFF_LINE_FILE_HDR, git_buf_cstr(pi->buf), git_buf_len(pi->buf));
}
int git_diff_print_compact(
git_diff_list *diff,
void *cb_data,
- git_diff_output_fn print_cb)
+ git_diff_data_fn print_cb)
{
int error;
git_buf buf = GIT_BUF_INIT;
@@ -586,7 +589,7 @@ static int print_patch_file(void *data, git_diff_delta *delta, float progress)
if (git_buf_oom(pi->buf))
return -1;
- result = pi->print_cb(pi->cb_data, GIT_DIFF_LINE_FILE_HDR, pi->buf->ptr);
+ result = pi->print_cb(pi->cb_data, delta, NULL, GIT_DIFF_LINE_FILE_HDR, git_buf_cstr(pi->buf), git_buf_len(pi->buf));
if (result < 0)
return result;
@@ -600,7 +603,7 @@ static int print_patch_file(void *data, git_diff_delta *delta, float progress)
if (git_buf_oom(pi->buf))
return -1;
- return pi->print_cb(pi->cb_data, GIT_DIFF_LINE_BINARY, pi->buf->ptr);
+ return pi->print_cb(pi->cb_data, delta, NULL, GIT_DIFF_LINE_BINARY, git_buf_cstr(pi->buf), git_buf_len(pi->buf));
}
static int print_patch_hunk(
@@ -612,27 +615,23 @@ static int print_patch_hunk(
{
diff_print_info *pi = data;
- GIT_UNUSED(d);
- GIT_UNUSED(r);
-
git_buf_clear(pi->buf);
if (git_buf_printf(pi->buf, "%.*s", (int)header_len, header) < 0)
return -1;
- return pi->print_cb(pi->cb_data, GIT_DIFF_LINE_HUNK_HDR, pi->buf->ptr);
+ return pi->print_cb(pi->cb_data, d, r, GIT_DIFF_LINE_HUNK_HDR, git_buf_cstr(pi->buf), git_buf_len(pi->buf));
}
static int print_patch_line(
void *data,
git_diff_delta *delta,
+ git_diff_range *range,
char line_origin, /* GIT_DIFF_LINE value from above */
const char *content,
size_t content_len)
{
diff_print_info *pi = data;
- GIT_UNUSED(delta);
-
git_buf_clear(pi->buf);
if (line_origin == GIT_DIFF_LINE_ADDITION ||
@@ -645,13 +644,13 @@ static int print_patch_line(
if (git_buf_oom(pi->buf))
return -1;
- return pi->print_cb(pi->cb_data, line_origin, pi->buf->ptr);
+ return pi->print_cb(pi->cb_data, delta, range, line_origin, git_buf_cstr(pi->buf), git_buf_len(pi->buf));
}
int git_diff_print_patch(
git_diff_list *diff,
void *cb_data,
- git_diff_output_fn print_cb)
+ git_diff_data_fn print_cb)
{
int error;
git_buf buf = GIT_BUF_INIT;
@@ -678,7 +677,7 @@ int git_diff_blobs(
git_diff_options *options,
void *cb_data,
git_diff_hunk_fn hunk_cb,
- git_diff_line_fn line_cb)
+ git_diff_data_fn line_cb)
{
diff_output_info info;
git_diff_delta delta;
View
10 src/filter.c
@@ -19,13 +19,13 @@ void git_text_gather_stats(git_text_stats *stats, const git_buf *text)
memset(stats, 0, sizeof(*stats));
- for (i = 0; i < text->size; i++) {
+ for (i = 0; i < git_buf_len(text); i++) {
unsigned char c = text->ptr[i];
if (c == '\r') {
stats->cr++;
- if (i + 1 < text->size && text->ptr[i + 1] == '\n')
+ if (i + 1 < git_buf_len(text) && text->ptr[i + 1] == '\n')
stats->crlf++;
}
@@ -59,7 +59,7 @@ void git_text_gather_stats(git_text_stats *stats, const git_buf *text)
}
/* If file ends with EOF then don't count this EOF as non-printable. */
- if (text->size >= 1 && text->ptr[text->size - 1] == '\032')
+ if (git_buf_len(text) >= 1 && text->ptr[text->size - 1] == '\032')
stats->nonprintable--;
}
@@ -127,14 +127,14 @@ int git_filters_apply(git_buf *dest, git_buf *source, git_vector *filters)
src = 0;
- if (source->size == 0) {
+ if (git_buf_len(source) == 0) {
git_buf_clear(dest);
return GIT_SUCCESS;
}
/* Pre-grow the destination buffer to more or less the size
* we expect it to have */
- if (git_buf_grow(dest, source->size) < 0)
+ if (git_buf_grow(dest, git_buf_len(source)) < 0)
return GIT_ENOMEM;
for (i = 0; i < filters->length; ++i) {
View
4 src/indexer.c
@@ -401,7 +401,7 @@ static int index_path_stream(git_buf *path, git_indexer_stream *idx, const char
git_buf_truncate(path, slash);
git_buf_puts(path, prefix);
- git_oid_fmt(path->ptr + path->size, &idx->hash);
+ git_oid_fmt(path->ptr + git_buf_len(path), &idx->hash);
path->size += GIT_OID_HEXSZ;
git_buf_puts(path, suffix);
@@ -633,7 +633,7 @@ static int index_path(git_buf *path, git_indexer *idx)
git_buf_truncate(path, slash);
git_buf_puts(path, prefix);
- git_oid_fmt(path->ptr + path->size, &idx->hash);
+ git_oid_fmt(path->ptr + git_buf_len(path), &idx->hash);
path->size += GIT_OID_HEXSZ;
git_buf_puts(path, suffix);
View
16 src/odb_loose.c
@@ -61,13 +61,13 @@ static int object_file_name(git_buf *name, const char *dir, const git_oid *id)
git_buf_sets(name, dir);
/* expand length for 40 hex sha1 chars + 2 * '/' + '\0' */
- if (git_buf_grow(name, name->size + GIT_OID_HEXSZ + 3) < 0)
+ if (git_buf_grow(name, git_buf_len(name) + GIT_OID_HEXSZ + 3) < 0)
return -1;
git_path_to_dir(name);
/* loose object filename: aa/aaa... (41 bytes) */
- git_oid_pathfmt(name->ptr + name->size, id);
+ git_oid_pathfmt(name->ptr + git_buf_len(name), id);
name->size += GIT_OID_HEXSZ + 1;
name->ptr[name->size] = '\0';
@@ -81,7 +81,7 @@ static size_t get_binary_object_header(obj_hdr *hdr, git_buf *obj)
unsigned char *data = (unsigned char *)obj->ptr;
size_t shift, size, used = 0;
- if (obj->size == 0)
+ if (git_buf_len(obj) == 0)
return 0;
c = data[used++];
@@ -90,7 +90,7 @@ static size_t get_binary_object_header(obj_hdr *hdr, git_buf *obj)
size = c & 15;
shift = 4;
while (c & 0x80) {
- if (obj->size <= used)
+ if (git_buf_len(obj) <= used)
return 0;
if (sizeof(size_t) * 8 <= shift)
return 0;
@@ -182,7 +182,7 @@ static int start_inflate(z_stream *s, git_buf *obj, void *out, size_t len)
int status;
init_stream(s, out, len);
- set_stream_input(s, obj->ptr, obj->size);
+ set_stream_input(s, obj->ptr, git_buf_len(obj));
if ((status = inflateInit(s)) < Z_OK)
return status;
@@ -469,7 +469,7 @@ static int locate_object(
static int fn_locate_object_short_oid(void *state, git_buf *pathbuf) {
loose_locate_object_state *sstate = (loose_locate_object_state *)state;
- if (pathbuf->size - sstate->dir_len != GIT_OID_HEXSZ - 2) {
+ if (git_buf_len(pathbuf) - sstate->dir_len != GIT_OID_HEXSZ - 2) {
/* Entry cannot be an object. Continue to next entry */
return 0;
}
@@ -517,7 +517,7 @@ static int locate_object_short_oid(
git_path_to_dir(object_location);
/* save adjusted position at end of dir so it can be restored later */
- dir_len = object_location->size;
+ dir_len = git_buf_len(object_location);
/* Convert raw oid to hex formatted oid */
git_oid_fmt((char *)state.short_oid, short_oid);
@@ -530,7 +530,7 @@ static int locate_object_short_oid(
if (git_path_isdir(object_location->ptr) == false)
return git_odb__error_notfound("failed to locate from short oid");
- state.dir_len = object_location->size;
+ state.dir_len = git_buf_len(object_location);
state.short_oid_len = len;
state.found = 0;
View
2  src/odb_pack.c
@@ -219,7 +219,7 @@ static int packfile_load__cb(void *_data, git_buf *path)
for (i = 0; i < backend->packs.length; ++i) {
struct git_pack_file *p = git_vector_get(&backend->packs, i);
- if (memcmp(p->pack_name, path->ptr, path->size - strlen(".idx")) == 0)
+ if (memcmp(p->pack_name, git_buf_cstr(path), git_buf_len(path) - strlen(".idx")) == 0)
return 0;
}
View
14 src/path.c
@@ -221,8 +221,8 @@ int git_path_prettify_dir(git_buf *path_out, const char *path, const char *base)
int git_path_to_dir(git_buf *path)
{
if (path->asize > 0 &&
- path->size > 0 &&
- path->ptr[path->size - 1] != '/')
+ git_buf_len(path) > 0 &&
+ path->ptr[git_buf_len(path) - 1] != '/')
git_buf_putc(path, '/');
return git_buf_oom(path) ? -1 : 0;
@@ -327,12 +327,12 @@ int git_path_walk_up(
if (git__prefixcmp(path->ptr, ceiling) == 0)
stop = (ssize_t)strlen(ceiling);
else
- stop = path->size;
+ stop = git_buf_len(path);
}
- scan = path->size;
+ scan = git_buf_len(path);
iter.ptr = path->ptr;
- iter.size = path->size;
+ iter.size = git_buf_len(path);
iter.asize = path->asize;
while (scan >= stop) {
@@ -407,7 +407,7 @@ static bool _check_dir_contents(
bool (*predicate)(const char *))
{
bool result;
- size_t dir_size = dir->size;
+ size_t dir_size = git_buf_len(dir);
size_t sub_size = strlen(sub);
/* leave base valid even if we could not make space for subdir */
@@ -503,7 +503,7 @@ int git_path_direach(
if (git_path_to_dir(path) < 0)
return -1;
- wd_len = path->size;
+ wd_len = git_buf_len(path);
if ((dir = opendir(path->ptr)) == NULL) {
giterr_set(GITERR_OS, "Failed to open directory '%s'", path->ptr);
View
2  src/pkt.c
@@ -277,7 +277,7 @@ static int buffer_want_with_caps(git_remote_head *head, git_transport_caps *caps
len = (unsigned int)
(strlen("XXXXwant ") + GIT_OID_HEXSZ + 1 /* NUL */ +
strlen(capstr) + 1 /* LF */);
- git_buf_grow(buf, buf->size + len);
+ git_buf_grow(buf, git_buf_len(buf) + len);
git_oid_fmt(oid, &head->oid);
return git_buf_printf(buf, "%04xwant %s%c%s\n", len, oid, 0, capstr);
View
6 src/protocol.c
@@ -17,7 +17,7 @@ int git_protocol_store_refs(git_protocol *p, const char *data, size_t len)
const char *line_end, *ptr;
if (len == 0) { /* EOF */
- if (buf->size != 0) {
+ if (git_buf_len(buf) != 0) {
giterr_set(GITERR_NET, "Unexpected EOF");
return p->error = -1;
} else {
@@ -30,10 +30,10 @@ int git_protocol_store_refs(git_protocol *p, const char *data, size_t len)
while (1) {
git_pkt *pkt;
- if (buf->size == 0)
+ if (git_buf_len(buf) == 0)
return 0;
- error = git_pkt_parse_line(&pkt, ptr, &line_end, buf->size);
+ error = git_pkt_parse_line(&pkt, ptr, &line_end, git_buf_len(buf));
if (error == GIT_ESHORTBUFFER)
return 0; /* Ask for more */
if (error < 0)
View
4 src/refs.c
@@ -139,7 +139,7 @@ static int loose_parse_symbolic(git_reference *ref, git_buf *file_content)
refname_start = (const char *)file_content->ptr;
- if (file_content->size < header_len + 1)
+ if (git_buf_len(file_content) < header_len + 1)
goto corrupt;
/*
@@ -174,7 +174,7 @@ static int loose_parse_oid(git_oid *oid, git_buf *file_content)
buffer = (char *)file_content->ptr;
/* File format: 40 chars (OID) + newline */
- if (file_content->size < GIT_OID_HEXSZ + 1)
+ if (git_buf_len(file_content) < GIT_OID_HEXSZ + 1)
goto corrupt;
if (git_oid_fromstr(oid, buffer) < 0)
View
4 src/refspec.c
@@ -103,10 +103,10 @@ int git_refspec_transform_r(git_buf *out, const git_refspec *spec, const char *n
* No '*' at the end means that it's mapped to one specific local
* branch, so no actual transformation is needed.
*/
- if (out->size > 0 && out->ptr[out->size - 1] != '*')
+ if (git_buf_len(out) > 0 && out->ptr[git_buf_len(out) - 1] != '*')
return GIT_SUCCESS;
- git_buf_truncate(out, out->size - 1); /* remove trailing '*' */
+ git_buf_truncate(out, git_buf_len(out) - 1); /* remove trailing '*' */
git_buf_puts(out, name + strlen(spec->src) - 1);
if (git_buf_oom(out))
View
6 src/repository.c
@@ -278,7 +278,7 @@ static int find_repo(
if ((error = git_buf_joinpath(&path, path.ptr, DOT_GIT)) < 0)
return error;
- while (!error && !repo_path->size) {
+ while (!error && !git_buf_len(repo_path)) {
if (p_stat(path.ptr, &st) == 0) {
/* check that we have not crossed device boundaries */
if (initial_device == 0)
@@ -328,7 +328,7 @@ static int find_repo(
}
if (!error && parent_path != NULL) {
- if (!repo_path->size)
+ if (!git_buf_len(repo_path))
git_buf_clear(parent_path);
else {
git_path_dirname_r(parent_path, path.ptr);
@@ -340,7 +340,7 @@ static int find_repo(
git_buf_free(&path);
- if (!repo_path->size && !error) {
+ if (!git_buf_len(repo_path) && !error) {
giterr_set(GITERR_REPOSITORY,
"Could not find repository from '%s'", start_path);
error = GIT_ENOTFOUND;
View
10 src/transports/http.c
@@ -321,7 +321,7 @@ static int on_body_parse_response(http_parser *parser, const char *str, size_t l
const char *line_end, *ptr;
if (len == 0) { /* EOF */
- if (buf->size != 0) {
+ if (git_buf_len(buf) != 0) {
giterr_set(GITERR_NET, "Unexpected EOF");
return t->error = -1;
} else {
@@ -334,10 +334,10 @@ static int on_body_parse_response(http_parser *parser, const char *str, size_t l
while (1) {
git_pkt *pkt;
- if (buf->size == 0)
+ if (git_buf_len(buf) == 0)
return 0;
- error = git_pkt_parse_line(&pkt, ptr, &line_end, buf->size);
+ error = git_pkt_parse_line(&pkt, ptr, &line_end, git_buf_len(buf));
if (error == GIT_ESHORTBUFFER) {
return 0; /* Ask for more */
}
@@ -555,9 +555,9 @@ static int http_download_pack(git_transport *transport, git_repository *repo, gi
memset(&settings, 0x0, sizeof(settings));
settings.on_message_complete = on_message_complete_download_pack;
settings.on_body = on_body_download_pack;
- *bytes = oldbuf->size;
+ *bytes = git_buf_len(oldbuf);
- if (git_indexer_stream_add(idx, oldbuf->ptr, oldbuf->size, stats) < 0)
+ if (git_indexer_stream_add(idx, git_buf_cstr(oldbuf), git_buf_len(oldbuf), stats) < 0)
goto on_error;
do {
View
2  src/tree.c
@@ -711,7 +711,7 @@ static int tree_walk_post(
if (entry_is_tree(entry)) {
git_tree *subtree;
- size_t path_len = path->size;
+ size_t path_len = git_buf_len(path);
if ((error = git_tree_lookup(
&subtree, tree->object.repo, &entry->oid)) < 0)
View
22 tests-clar/diff/diff_helpers.c
@@ -27,7 +27,9 @@ int diff_file_fn(
float progress)
{
diff_expects *e = cb_data;
- (void)progress;
+
+ GIT_UNUSED(progress);
+
e->files++;
switch (delta->status) {
case GIT_DELTA_ADDED: e->file_adds++; break;
@@ -48,9 +50,11 @@ int diff_hunk_fn(
size_t header_len)
{
diff_expects *e = cb_data;
- (void)delta;
- (void)header;
- (void)header_len;
+
+ GIT_UNUSED(delta);
+ GIT_UNUSED(header);
+ GIT_UNUSED(header_len);
+
e->hunks++;
e->hunk_old_lines += range->old_lines;
e->hunk_new_lines += range->new_lines;
@@ -60,14 +64,18 @@ int diff_hunk_fn(
int diff_line_fn(
void *cb_data,
git_diff_delta *delta,
+ git_diff_range *range,
char line_origin,
const char *content,
size_t content_len)
{
diff_expects *e = cb_data;
- (void)delta;
- (void)content;
- (void)content_len;
+
+ GIT_UNUSED(delta);
+ GIT_UNUSED(range);
+ GIT_UNUSED(content);
+ GIT_UNUSED(content_len);
+
e->lines++;
switch (line_origin) {
case GIT_DIFF_LINE_CONTEXT:
View
1  tests-clar/diff/diff_helpers.h
@@ -37,6 +37,7 @@ extern int diff_hunk_fn(
extern int diff_line_fn(
void *cb_data,
git_diff_delta *delta,
+ git_diff_range *range,
char line_origin,
const char *content,
size_t content_len);
View
44 tests-clar/diff/patch.c
@@ -13,26 +13,56 @@ void test_diff_patch__cleanup(void)
cl_git_sandbox_cleanup();
}
-#define EXPECTED_OUTPUT "diff --git a/subdir.txt b/subdir.txt\n" \
+#define EXPECTED_HEADER "diff --git a/subdir.txt b/subdir.txt\n" \
"deleted file mode 100644\n" \
"index e8ee89e..0000000\n" \
"--- a/subdir.txt\n" \
"+++ /dev/null\n"
+#define EXPECTED_HUNK "@@ -1,2 +0,0 @@\n"
+
static int check_removal_cb(
void *cb_data,
+ git_diff_delta *delta,
+ git_diff_range *range,
char line_origin,
- const char *formatted_output)
+ const char *formatted_output,
+ size_t output_len)
{
GIT_UNUSED(cb_data);
- if (line_origin != 'F')
- return 0;
+ switch (line_origin) {
+ case GIT_DIFF_LINE_FILE_HDR:
+ cl_assert_equal_s(EXPECTED_HEADER, formatted_output);
+ cl_assert(range == NULL);
+ goto check_delta;
+
+ case GIT_DIFF_LINE_HUNK_HDR:
+ cl_assert_equal_s(EXPECTED_HUNK, formatted_output);
+ /* Fall through */
+
+ case GIT_DIFF_LINE_CONTEXT:
+ case GIT_DIFF_LINE_DELETION:
+ goto check_range;
+
+ default:
+ /* unexpected code path */
+ return -1;
+ }
+
+check_range:
+ cl_assert(range != NULL);
+ cl_assert_equal_i(1, range->old_start);
+ cl_assert_equal_i(2, range->old_lines);
+ cl_assert_equal_i(0, range->new_start);
+ cl_assert_equal_i(0, range->new_lines);
- if (strcmp(EXPECTED_OUTPUT, formatted_output) == 0)
- return 0;
+check_delta:
+ cl_assert_equal_s("subdir.txt", delta->old.path);
+ cl_assert_equal_s("subdir.txt", delta->new.path);
+ cl_assert_equal_i(GIT_DELTA_DELETED, delta->status);
- return -1;
+ return 0;
}
void test_diff_patch__can_properly_display_the_removal_of_a_file(void)
Something went wrong with that request. Please try again.