Re: Bug Report: git add
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Apr 7, 2011, 07:28 UTC
- Message-ID
- <7vlizmfrl1.fsf@alter.siamese.dyndns.org>
- In-Reply-To
- <20110407014819.GA12730@sigill.intra.peff.net>
Jeff King <peff@peff.net> writes:
Show 20 quoted lines
> @@ -139,8 +138,21 @@ static int lstat_cache_matchlen(struct cache_def *cache,
> if (errno == ENOENT)
> *ret_flags |= FL_NOENT;
> } else if (S_ISDIR(st.st_mode)) {
> - last_slash_dir = last_slash;
> - continue;
> + struct stat junk;
> + struct strbuf gitdir = STRBUF_INIT;
> + strbuf_add(&gitdir, cache->path, match_len);
> + strbuf_addstr(&gitdir, "/.git");
> + if (lstat(gitdir.buf, &junk) < 0) {
> + if (errno == ENOENT) {
> + last_slash_dir = last_slash;
> + strbuf_release(&gitdir);
> + continue;
> + }
> + *ret_flags = FL_LSTATERR;
> + }
> + else
> + *ret_flags = FL_GITREPO;This only checks "does the directory have .git in it?".
It probably is sufficient, but setup.c:is_git_directory() may do a more appropriate check, I think. That ".git" thing could be a regular file (i.e. "gitdir: path"), so depending on the junk.st_mode, you may have to call read_gitfile_gently() on it before checking with is_git_directory().
Alternatively, resolve_gitlink_ref() might be usable, but because it is primarily meant to deal with a submodule, there is a slight impedance mismatch with the test we are trying to do. In this codepath, all we care about is if the subdirectory is controlled by a separate git repository, and it does not matter if that is an untracked directory from the superproject's point of view, or if it is bound to the superproject as a submodule.
Also I suspect resolve_gitlink_ref() may not work for a submodule that does not have an initial commit but that is a separate issue.