git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v2 10/12] attr: convert git_all_attrs() to use "struct git_attr_check"

From
Junio C Hamano <gitster@pobox.com>
Date
May 17, 2016, 17:00 UTC
Message-ID
<xmqqeg90y5yz.fsf@gitster.mtv.corp.google.com>
In-Reply-To
<20160516210545.6591-11-gitster@pobox.com>
Junio C Hamano <gitster@pobox.com> writes:
Show 18 quoted lines
> +struct git_attr_check *git_attr_check_alloc(void)
> +{
> +	return xcalloc(1, sizeof(struct git_attr_check));
> +}
> +
> +void git_attr_check_append(struct git_attr_check *check, const char *name)
> +{
> +	struct git_attr *attr;
> +
> +	if (check->finalized)
> +		die("BUG: append after git_attr_check structure is finalized");
> +
> +	attr = git_attr(name);
> +	if (!attr)
> +		die("%s: not a valid attribute name", name);
> +	ALLOC_GROW(check->check, check->check_nr + 1, check->check_alloc);
> +	check->check[check->check_nr++].attr = attr;
> +}

Given that one of the two expected callers, namely, "check-attr" and Stefan's pathspec label magic, of this "alloc and then append" side of the API wants to have an access to git_attr(name), I think the function signature for this one should be updated to take not "const char *name" but instead take "struct git_attr *attr", i.e.

void git_attr_check_append(struct git_attr_check *check,
			   struct git_attr *attr);
Then the loop in check-attr below
> +		check = git_attr_check_alloc();
> +		for (i = 0; i < cnt; i++)
> +			git_attr_check_append(check, argv[i]);
would become
		check = git_attr_check_alloc();
		for (i = 0; i < cnt; i++)
			git_attr_check_append(check, git_attr(argv[i]));
And this part in $gmane/294855
    Then while parsing ":(attr:VAR1=VAL1 -VAR2 VAR3...)path/to/dir/",
    you would first do:
            p->attr_check = git_attr_check_alloc();
    once, and then send each of VAR1=VAL2, -VAR2, VAR3... to your
    parse_one_item() helper function which would:
     * parse the match-mode like your code does;
     * parse out the attribute name (i.e. VAR1, VAR2 and VAR3), and
       instead of keeping it as a "(const) char *", call git_attr()
       to intern it (and keep it in local variable "attr"), and save
       it in p->attr_match[p->attr_nr].attr;
     * call git_attr_check_append(p->attr_check, git_attr_name(attr))
would look like
	... saw ":(attr:", expect "VAR1=VAL1 -VAR2...)" to follow;
        ... char *scan points at byte after attr: now.
	item->attr_check = git_attr_check_alloc();
	while (scan) {
		const char *var, *val;
                enum attr_match_mode mode;
		struct git_attr *attr;
		struct attr_match *match;
        	scan = parse_attr_match(scan, &var, &val, &mode);
                ... var points at VAR1, val points at VAL,
                ... mode becomes MATCH_VALUE; scan skips
                ... forward to pint at -VAR2.  parse_attr_match()
                ... would return NULL once input runs out.
                ALLOC_GROW(item->attr_match, ...);
                match = &item->attr_match[item->attr_match_nr++];
        	attr = git_attr(var);
		match->attr = attr;
                match->value = val;
                match->match_mode = mode;
                
                git_attr_check_append(item->attr_check, attr);
	}
Then matching part would get the "item" and would do:
	... after making sure that the path matches
        ... the pathspec the magic is attached to ...
	git_check_attr(path, item->attr_check);
	for (i = 0; i < item->attr_match_nr; i++) {
		struct git_attr *attr = item->attr_check->check[i].attr;
		const char *value = item->attr_check->check[i].value;
                struct attr_match *match = &item->attr_match[i];
                ... compare what "match" expects with <attr, value> ...
        }
Previous: Junio C HamanoNext: Junio C Hamano
Message 21 of 27 in “revamping git_check_attr() API”
  1. 00/12 revamping git_check_attr() APIJunio C Hamano, May 16, 2016
  2. 01/12 commit.c: use strchrnul() to scan for one lineJunio C Hamano, May 16, 2016
  3. Stefan BellerMay 16, 2016
  4. Junio C HamanoMay 16, 2016
  5. Stefan BellerMay 16, 2016
  6. 02/12 attr.c: use strchrnul() to scan for one lineJunio C Hamano, May 16, 2016
  7. Stefan BellerMay 16, 2016
  8. Junio C HamanoMay 16, 2016
  9. 03/12 attr.c: update a stale comment on "struct match_attr"Junio C Hamano, May 16, 2016
  10. Stefan BellerMay 16, 2016
  11. Junio C HamanoMay 16, 2016
  12. 04/12 attr.c: explain the lack of attr-name syntax check in parse_attr()Junio C Hamano, May 16, 2016
  13. 05/12 attr.c: complete a sentence in a commentJunio C Hamano, May 16, 2016
  14. 06/12 attr.c: mark where #if DEBUG ends more clearlyJunio C Hamano, May 16, 2016
  15. 07/12 attr.c: simplify macroexpand_one()Junio C Hamano, May 16, 2016
  16. 08/12 attr: rename function and struct related to checking attributesJunio C Hamano, May 16, 2016
  17. 09/12 attr: (re)introduce git_check_attr() and struct git_attr_checkJunio C Hamano, May 16, 2016
  18. Eric SunshineMay 17, 2016
  19. Junio C HamanoMay 17, 2016
  20. 10/12 attr: convert git_all_attrs() to use "struct git_attr_check"Junio C Hamano, May 16, 2016
  21. Junio C HamanoMay 17, 2016
  22. Junio C HamanoMay 17, 2016
  23. Stefan BellerMay 18, 2016
  24. 11/12 attr: convert git_check_attrs() callers to use the new APIJunio C Hamano, May 16, 2016
  25. 12/12 attr: retire git_check_attrs() APIJunio C Hamano, May 16, 2016
  26. Stefan BellerMay 18, 2016
  27. Junio C HamanoMay 18, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.