Commit ff9a4c130d09629af86a90ac64a89198faf4ffd8

Romain Geissler 2011-06-06T17:14:30

Tree: Added a function that returns the type of a tree entry.

diff --git a/include/git2/tree.h b/include/git2/tree.h
index 0caf60a..7b682b3 100644
--- a/include/git2/tree.h
+++ b/include/git2/tree.h
@@ -129,6 +129,14 @@ GIT_EXTERN(const char *) git_tree_entry_name(const git_tree_entry *entry);
 GIT_EXTERN(const git_oid *) git_tree_entry_id(const git_tree_entry *entry);
 
 /**
+ * Get the type of the object pointed by the entry
+ *
+ * @param entry a tree entry
+ * @return the type of the pointed object
+ */
+GIT_EXTERN(git_otype) git_tree_entry_type(const git_tree_entry *entry);
+
+/**
  * Convert a tree entry to the git_object it points too.
  *
  * @param object pointer to the converted object
diff --git a/src/fileops.h b/src/fileops.h
index 4a86e1c..c114508 100644
--- a/src/fileops.h
+++ b/src/fileops.h
@@ -20,6 +20,9 @@
 #define GIT_PLATFORM_PATH_SEP '/'
 #endif
 
+#define S_IFGITLINK 0160000
+#define S_ISGITLINK(m) (((m) & S_IFMT) == S_IFGITLINK)
+
 #ifdef GIT_WIN32
 GIT_INLINE(int) link(const char *GIT_UNUSED(old), const char *GIT_UNUSED(new))
 {
diff --git a/src/tree.c b/src/tree.c
index 60413e2..d539f83 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -100,6 +100,18 @@ const git_oid *git_tree_entry_id(const git_tree_entry *entry)
 	return &entry->oid;
 }
 
+git_otype git_tree_entry_type(const git_tree_entry *entry)
+{
+	assert(entry);
+
+	if (S_ISGITLINK(entry->attr))
+		return GIT_OBJ_COMMIT;
+	else if (S_ISDIR(entry->attr))
+		return GIT_OBJ_TREE;
+	else
+		return GIT_OBJ_BLOB;
+}
+
 int git_tree_entry_2object(git_object **object_out, git_repository *repo, const git_tree_entry *entry)
 {
 	assert(entry && object_out);