summaryrefslogtreecommitdiff
path: root/src/status.c
diff options
context:
space:
mode:
authorVicent Marti <tanoku@gmail.com>2012-08-06 12:41:08 +0200
committerVicent Marti <tanoku@gmail.com>2012-08-06 12:41:08 +0200
commit51e1d8084641bd36416bf6f127b31d47d64cce69 (patch)
tree1a95e6b4c664020eb4bbff843eead794f3ee3d35 /src/status.c
parent7e9f78b5fee2d8f56711a587c35fcba10d370547 (diff)
parentb0d376695e7d3f71fed97d9d08b60661faad7a5a (diff)
downloadlibgit2-51e1d8084641bd36416bf6f127b31d47d64cce69.tar.gz
Merge remote-tracking branch 'arrbee/tree-walk-fixes' into development
Conflicts: src/notes.c src/transports/git.c src/transports/http.c src/transports/local.c tests-clar/odb/foreach.c
Diffstat (limited to 'src/status.c')
-rw-r--r--src/status.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/status.c b/src/status.c
index 690c076e6..8e462552e 100644
--- a/src/status.c
+++ b/src/status.c
@@ -114,7 +114,8 @@ int git_status_foreach_ext(
if (show == GIT_STATUS_SHOW_INDEX_THEN_WORKDIR) {
for (i = 0; !err && i < idx2head->deltas.length; i++) {
i2h = GIT_VECTOR_GET(&idx2head->deltas, i);
- err = cb(i2h->old_file.path, index_delta2status(i2h->status), cbdata);
+ if (cb(i2h->old_file.path, index_delta2status(i2h->status), cbdata))
+ err = GIT_EUSER;
}
git_diff_list_free(idx2head);
idx2head = NULL;
@@ -130,14 +131,17 @@ int git_status_foreach_ext(
cmp = !w2i ? -1 : !i2h ? 1 : strcmp(i2h->old_file.path, w2i->old_file.path);
if (cmp < 0) {
- err = cb(i2h->old_file.path, index_delta2status(i2h->status), cbdata);
+ if (cb(i2h->old_file.path, index_delta2status(i2h->status), cbdata))
+ err = GIT_EUSER;
i++;
} else if (cmp > 0) {
- err = cb(w2i->old_file.path, workdir_delta2status(w2i->status), cbdata);
+ if (cb(w2i->old_file.path, workdir_delta2status(w2i->status), cbdata))
+ err = GIT_EUSER;
j++;
} else {
- err = cb(i2h->old_file.path, index_delta2status(i2h->status) |
- workdir_delta2status(w2i->status), cbdata);
+ if (cb(i2h->old_file.path, index_delta2status(i2h->status) |
+ workdir_delta2status(w2i->status), cbdata))
+ err = GIT_EUSER;
i++; j++;
}
}
@@ -146,6 +150,7 @@ cleanup:
git_tree_free(head);
git_diff_list_free(idx2head);
git_diff_list_free(wd2idx);
+
return err;
}
@@ -166,9 +171,10 @@ int git_status_foreach(
}
struct status_file_info {
+ char *expected;
unsigned int count;
unsigned int status;
- char *expected;
+ int ambiguous;
};
static int get_one_status(const char *path, unsigned int status, void *data)
@@ -183,6 +189,7 @@ static int get_one_status(const char *path, unsigned int status, void *data)
p_fnmatch(sfi->expected, path, 0) != 0)) {
giterr_set(GITERR_INVALID,
"Ambiguous path '%s' given to git_status_file", sfi->expected);
+ sfi->ambiguous = true;
return GIT_EAMBIGUOUS;
}
@@ -215,6 +222,9 @@ int git_status_file(
error = git_status_foreach_ext(repo, &opts, get_one_status, &sfi);
+ if (error < 0 && sfi.ambiguous)
+ error = GIT_EAMBIGUOUS;
+
if (!error && !sfi.count) {
giterr_set(GITERR_INVALID,
"Attempt to get status of nonexistent file '%s'", path);