mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-23 23:31:37 +00:00
Merge pull request #652 from nulltoken/topic/diff-callbacks
diff: provide more context to the consumer of the callbacks
This commit is contained in:
commit
0dc8e95e19
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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) {
|
||||
|
@ -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.
|
||||
|
@ -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 @@ cleanup:
|
||||
|
||||
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;
|
||||
|
10
src/filter.c
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) {
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
14
src/path.c
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);
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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))
|
||||
|
@ -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;
|
||||
|
@ -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 {
|
||||
|
@ -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)
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
if (strcmp(EXPECTED_OUTPUT, formatted_output) == 0)
|
||||
return 0;
|
||||
case GIT_DIFF_LINE_HUNK_HDR:
|
||||
cl_assert_equal_s(EXPECTED_HUNK, formatted_output);
|
||||
/* Fall through */
|
||||
|
||||
return -1;
|
||||
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);
|
||||
|
||||
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 0;
|
||||
}
|
||||
|
||||
void test_diff_patch__can_properly_display_the_removal_of_a_file(void)
|
||||
|
Loading…
Reference in New Issue
Block a user