Browse Source

Allow querying all attributes on a file

Add a function, git_all_attrs(), that reports on all attributes that
are set on a path.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Michael Haggerty 14 years ago committed by Junio C Hamano
parent
commit
ee548df300
  1. 44
      Documentation/technical/api-gitattributes.txt
  2. 28
      attr.c
  3. 9
      attr.h

44
Documentation/technical/api-gitattributes.txt

@ -22,19 +22,6 @@ Data Structure @@ -22,19 +22,6 @@ Data Structure
to `git_checkattr()` function, and receives the results.


Calling Sequence
----------------

* Prepare an array of `struct git_attr_check` to define the list of
attributes you would want to check. To populate this array, you would
need to define necessary attributes by calling `git_attr()` function.

* Call git_checkattr() to check the attributes for the path.

* Inspect `git_attr_check` structure to see how each of the attribute in
the array is defined for the path.


Attribute Values
----------------

@ -58,6 +45,19 @@ If none of the above returns true, `.value` member points at a string @@ -58,6 +45,19 @@ If none of the above returns true, `.value` member points at a string
value of the attribute for the path.


Querying Specific Attributes
----------------------------

* Prepare an array of `struct git_attr_check` to define the list of
attributes you would want to check. To populate this array, you would
need to define necessary attributes by calling `git_attr()` function.

* Call `git_checkattr()` to check the attributes for the path.

* Inspect `git_attr_check` structure to see how each of the attribute in
the array is defined for the path.


Example
-------

@ -109,4 +109,20 @@ static void setup_check(void) @@ -109,4 +109,20 @@ static void setup_check(void)
}
------------

(JC)

Querying All Attributes
-----------------------

To get the values of all attributes associated with a file:

* Call `git_all_attrs()`, which returns an array of `git_attr_check`
structures.

* Iterate over the `git_attr_check` array to examine the attribute
names and values. The name of the attribute described by a
`git_attr_check` object can be retrieved via
`git_attr_name(check[i].attr)`. (Please note that no items will be
returned for unset attributes, so `ATTR_UNSET()` will return false
for all returned `git_array_check` objects.)

* Free the `git_array_check` array.

28
attr.c

@ -747,6 +747,34 @@ int git_checkattr(const char *path, int num, struct git_attr_check *check) @@ -747,6 +747,34 @@ int git_checkattr(const char *path, int num, struct git_attr_check *check)
return 0;
}

int git_all_attrs(const char *path, int *num, struct git_attr_check **check)
{
int i, count, j;

collect_all_attrs(path);

/* Count the number of attributes that are set. */
count = 0;
for (i = 0; i < attr_nr; i++) {
const char *value = check_all_attr[i].value;
if (value != ATTR__UNSET && value != ATTR__UNKNOWN)
++count;
}
*num = count;
*check = xmalloc(sizeof(**check) * count);
j = 0;
for (i = 0; i < attr_nr; i++) {
const char *value = check_all_attr[i].value;
if (value != ATTR__UNSET && value != ATTR__UNKNOWN) {
(*check)[j].attr = check_all_attr[i].attr;
(*check)[j].value = value;
++j;
}
}

return 0;
}

void git_attr_set_direction(enum git_attr_direction new, struct index_state *istate)
{
enum git_attr_direction old = direction;

9
attr.h

@ -38,6 +38,15 @@ char *git_attr_name(struct git_attr *); @@ -38,6 +38,15 @@ char *git_attr_name(struct git_attr *);

int git_checkattr(const char *path, int, struct git_attr_check *);

/*
* Retrieve all attributes that apply to the specified path. *num
* will be set the the number of attributes on the path; **check will
* be set to point at a newly-allocated array of git_attr_check
* objects describing the attributes and their values. *check must be
* free()ed by the caller.
*/
int git_all_attrs(const char *path, int *num, struct git_attr_check **check);

enum git_attr_direction {
GIT_ATTR_CHECKIN,
GIT_ATTR_CHECKOUT,

Loading…
Cancel
Save