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

Re: [PATCH 01/24] dir.c: optionally compute sha-1 of a .gitignore file

From
Duy Nguyen <pclouds@gmail.com>
Date
Feb 16, 2015, 09:45 UTC
Message-ID
<CACsJy8AyAeNa0CoUA-jAYGN5S8yJ1wRzdZe==z-xbT-f2j0HaQ@mail.gmail.com>
In-Reply-To
<xmqqiof8ta6f.fsf@gitster.dls.corp.google.com>
On Thu, Feb 12, 2015 at 4:23 AM, Junio C Hamano <gitster@pobox.com> wrote:
Show 51 quoted lines
> Nguyễn Thái Ngọc Duy  <pclouds@gmail.com> writes:
>
>> -int add_excludes_from_file_to_list(const char *fname,
>> -                                const char *base,
>> -                                int baselen,
>> -                                struct exclude_list *el,
>> -                                int check_index)
>> +/*
>> + * Given a file with name "fname", read it (either from disk, or from
>> + * the index if "check_index" is non-zero), parse it and store the
>> + * exclude rules in "el".
>> + *
>> + * If "ss" is not NULL, compute SHA-1 of the exclude file and fill
>> + * stat data from disk (only valid if add_excludes returns zero). If
>> + * ss_valid is non-zero, "ss" must contain good value as input.
>> + */
>> +static int add_excludes(const char *fname, const char *base, int baselen,
>> +                     struct exclude_list *el, int check_index,
>> +                     struct sha1_stat *sha1_stat)
>> ...
>> @@ -571,6 +588,21 @@ int add_excludes_from_file_to_list(const char *fname,
>>               }
>>               buf[size++] = '\n';
>>               close(fd);
>> +             if (sha1_stat) {
>> +                     int pos;
>> +                     if (sha1_stat->valid &&
>> +                         !match_stat_data(&sha1_stat->stat, &st))
>> +                             ; /* no content change, ss->sha1 still good */
>> +                     else if (check_index &&
>> +                              (pos = cache_name_pos(fname, strlen(fname))) >= 0 &&
>> +                              !ce_stage(active_cache[pos]) &&
>> +                              ce_uptodate(active_cache[pos]))
>> +                             hashcpy(sha1_stat->sha1, active_cache[pos]->sha1);
>> +                     else
>> +                             hash_sha1_file(buf, size, "blob", sha1_stat->sha1);
>
> I do not think this would work well on DOS.
>
> This helper function originally is meant to work *only* on the
> checked out representation of the file and that is what is read by
> read_in_full(), and that is the reason why it handles the case where
> the contents of buf[] happens to be CRLF terminated in the function.
>
> If you want to detect the content changes across working tree, index
> and the tree objects by reusing hash_sha1_file(), however, you must
> not feed the checked out (aka "smudged") representation to it.
> You'd need to turn it into "cleaned" representation by doing the
> equivalent of calling index_path().  Some helpers in the callchain
> that originates from index_path() might directly be reusable for
> your purpose.

Urgh.. you're right this test would fail when some filters are involved. I'm not sure if we want to check the cleaned version though. What matters to exclude machinery is the checkout version. I think for now we fall back to hashing .gitignore content. Perhaps later we could make an exception for cr/lf conversion (and just that, not generic filters, doing content conversion here sounds like a bad idea).

-- 
Duy
Previous: Junio C HamanoNext: Junio C Hamano
Message 4 of 30 in “nd/untracked-cache updates”
  1. 00/24 nd/untracked-cache updatesNguyễn Thái Ngọc Duy, Feb 8, 2015
  2. 01/24 dir.c: optionally compute sha-1 of a .gitignore fileNguyễn Thái Ngọc Duy, Feb 8, 2015
  3. Junio C HamanoFeb 11, 2015
  4. Duy NguyenFeb 16, 2015
  5. Junio C HamanoFeb 16, 2015
  6. 02/24 untracked cache: record .gitignore information and dir hierarchyNguyễn Thái Ngọc Duy, Feb 8, 2015
  7. 03/24 untracked cache: initial untracked cache validationNguyễn Thái Ngọc Duy, Feb 8, 2015
  8. 04/24 untracked cache: invalidate dirs recursively if .gitignore changesNguyễn Thái Ngọc Duy, Feb 8, 2015
  9. 05/24 untracked cache: make a wrapper around {open,read,close}dir()Nguyễn Thái Ngọc Duy, Feb 8, 2015
  10. 06/24 untracked cache: record/validate dir mtime and reuse cached outputNguyễn Thái Ngọc Duy, Feb 8, 2015
  11. 07/24 untracked cache: mark what dirs should be recursed/savedNguyễn Thái Ngọc Duy, Feb 8, 2015
  12. 08/24 untracked cache: don't open non-existent .gitignoreNguyễn Thái Ngọc Duy, Feb 8, 2015
  13. 09/24 ewah: add convenient wrapper ewah_serialize_strbuf()Nguyễn Thái Ngọc Duy, Feb 8, 2015
  14. 10/24 untracked cache: save to an index extensionNguyễn Thái Ngọc Duy, Feb 8, 2015
  15. Stefan BellerMar 7, 2015
  16. 11/24 untracked cache: load from UNTR index extensionNguyễn Thái Ngọc Duy, Feb 8, 2015
  17. Junio C HamanoFeb 9, 2015
  18. 12/24 untracked cache: invalidate at index addition or removalNguyễn Thái Ngọc Duy, Feb 8, 2015
  19. 13/24 read-cache.c: split racy stat test to a separate functionNguyễn Thái Ngọc Duy, Feb 8, 2015
  20. 14/24 untracked cache: avoid racy timestampsNguyễn Thái Ngọc Duy, Feb 8, 2015
  21. 15/24 untracked cache: print stats with $GIT_TRACE_UNTRACKED_STATSNguyễn Thái Ngọc Duy, Feb 8, 2015
  22. 16/24 untracked cache: mark index dirty if untracked cache is updatedNguyễn Thái Ngọc Duy, Feb 8, 2015
  23. 17/24 untracked-cache: temporarily disable with $GIT_DISABLE_UNTRACKED_CACHENguyễn Thái Ngọc Duy, Feb 8, 2015
  24. 18/24 status: enable untracked cacheNguyễn Thái Ngọc Duy, Feb 8, 2015
  25. 19/24 update-index: manually enable or disable untracked cacheNguyễn Thái Ngọc Duy, Feb 8, 2015
  26. 20/24 update-index: test the system before enabling untracked cacheNguyễn Thái Ngọc Duy, Feb 8, 2015
  27. 21/24 t7063: tests for untracked cacheNguyễn Thái Ngọc Duy, Feb 8, 2015
  28. 22/24 mingw32: add uname()Nguyễn Thái Ngọc Duy, Feb 8, 2015
  29. 23/24 untracked cache: guard and disable on system changesNguyễn Thái Ngọc Duy, Feb 8, 2015
  30. 24/24 git-status.txt: advertisement for untracked cacheNguyễn Thái Ngọc Duy, Feb 8, 2015

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.