summaryrefslogtreecommitdiff
path: root/src/status.c
diff options
context:
space:
mode:
authorRussell Belfer <rb@github.com>2012-05-03 16:37:25 -0700
committerRussell Belfer <rb@github.com>2012-05-03 16:37:25 -0700
commitf917481ee84cbba481c1854cccdedb2d98377d43 (patch)
treeb6276158b43f8d54358df5609fd0e508928306b2 /src/status.c
parent3fbcac89c47cb66ea193f66da6d93d1c36ed0f5e (diff)
downloadlibgit2-f917481ee84cbba481c1854cccdedb2d98377d43.tar.gz
Support reading attributes from index
Depending on the operation, we need to consider gitattributes in both the work dir and the index. This adds a parameter to all of the gitattributes related functions that allows user control of attribute reading behavior (i.e. prefer workdir, prefer index, only use index). This fix also covers allowing us to check attributes (and hence do diff and status) on bare repositories. This was a somewhat larger change that I hoped because it had to change the cache key used for gitattributes files.
Diffstat (limited to 'src/status.c')
-rw-r--r--src/status.c44
1 files changed, 3 insertions, 41 deletions
diff --git a/src/status.c b/src/status.c
index 356cbeb98..ff8535c66 100644
--- a/src/status.c
+++ b/src/status.c
@@ -18,41 +18,6 @@
#include "git2/diff.h"
#include "diff.h"
-static int resolve_head_to_tree(git_tree **tree, git_repository *repo)
-{
- git_oid head_oid;
- git_object *obj = NULL;
-
- if (git_reference_name_to_oid(&head_oid, repo, GIT_HEAD_FILE) < 0) {
- /* cannot resolve HEAD - probably brand new repo */
- giterr_clear();
- *tree = NULL;
- return 0;
- }
-
- if (git_object_lookup(&obj, repo, &head_oid, GIT_OBJ_ANY) < 0)
- goto fail;
-
- switch (git_object_type(obj)) {
- case GIT_OBJ_TREE:
- *tree = (git_tree *)obj;
- break;
- case GIT_OBJ_COMMIT:
- if (git_commit_tree(tree, (git_commit *)obj) < 0)
- goto fail;
- git_object_free(obj);
- break;
- default:
- goto fail;
- }
-
- return 0;
-
-fail:
- git_object_free(obj);
- return -1;
-}
-
static unsigned int index_delta2status(git_delta_t index_status)
{
unsigned int st = GIT_STATUS_CURRENT;
@@ -120,11 +85,8 @@ int git_status_foreach_ext(
assert(show <= GIT_STATUS_SHOW_INDEX_THEN_WORKDIR);
- switch (resolve_head_to_tree(&head, repo)) {
- case 0: break;
- case GIT_ENOTFOUND: return 0;
- default: return -1;
- }
+ if ((err = git_repository_head_tree(&head, repo)) < 0)
+ return err;
memset(&diffopt, 0, sizeof(diffopt));
memcpy(&diffopt.pathspec, &opts->pathspec, sizeof(diffopt.pathspec));
@@ -405,7 +367,7 @@ int git_status_file(
status_entry_update_from_index(e, index);
/* Try to find file in HEAD */
- if ((error = resolve_head_to_tree(&tree, repo)) < 0)
+ if ((error = git_repository_head_tree(&tree, repo)) < 0)
goto cleanup;
if (tree != NULL) {