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

Re: [GSoC][PATCH] submodule: port submodule subcommand 'add' from shell to C

From
Kaartic Sivaraam <kaartic.sivaraam@gmail.com>
Date
Sep 1, 2020, 20:35 UTC
Message-ID
<31e40c63bbac03d261ac6f46a0d2f6ae90a21038.camel@gmail.com>
In-Reply-To
<20200831130448.GA119147@konoha>
On Mon, 2020-08-31 at 18:34 +0530, Shourya Shukla wrote:
Show 26 quoted lines
> On 31/08 01:28, Kaartic Sivaraam wrote:
> 
> This is what I have done finally:
> ---
> 	if (read_cache() < 0)
> 		die(_("index file corrupt"));
> 
> 	if (!force) {
> 		if (cache_file_exists(path, strlen(path), ignore_case) ||
> 		    cache_dir_exists(path, strlen(path)))
> 			die(_("'%s' already exists in the index"), path);
> 	} else {
> 		int cache_pos = cache_name_pos(path, strlen(path));
> 		struct cache_entry *ce = the_index.cache[cache_pos];
> 		if (cache_pos >= 0 && !S_ISGITLINK(ce->ce_mode))
> 			die(_("'%s' already exists in the index and is not a "
> 			      "submodule"), path);
> 	}
> ---
> 
> I did not put the 'cache_pos >= 0' at the start since I thought that it
> will unnecessarily increase an indentation level. Since we are using
> 'cache_{file,dir}_exists' in the first check and 'cache_name_pos()' in
> the second, the placement of check at another indentation level would be
> unnecessary. What do you think about this?
> 

Interestingly. 'cache_dir_exists' seems to work as expected only when the global ignore_case whose value seems to depend on core.ignorecase. So, we can't just rely on 'cache_dir_exists to identify a directory that has tracked contents. Apparently, the 'directory_exists_in_index' in 'dir.c' seems to have the code that we want here (which is also the only user of 'index_dir_exists'; the function for which 'cache_dir_exists' is a convenience wrapper.

The best idea I could think of is to expose that method and re-use it here. Given that my kowledge about index and caching is primitive, I'm not sure if there's a better approach. If others have a better idea for handling this directory case, do enlighten us.

Show 32 quoted lines
> > This is more close to what the shell version did but misses one case
> > which might or might not be covered by the test suite[1]. The case when
> > path is a directory that has tracked contents. In the shell version we
> > would get:
> > 
> >    $ git submodule add ../git-crypt/ builtin
> >    'builtin' already exists in the index
> >    $ git submodule add --force ../git-crypt/ builtin
> >    'builtin' already exists in the index and is not a submodule
> > 
> >    In the C version with the above snippet we get:
> > 
> >    $ git submodule add --force ../git-crypt/ builtin
> >    fatal: 'builtin' does not have a commit checked out
> >    $ git submodule add ../git-crypt/ builtin
> >    fatal: 'builtin' does not have a commit checked out
> > 
> >    That's not appropriate and should be fixed. I believe we could do
> >    something with `cache_dir_exists` to fix this.
> > 
> > 
> >    Footnote
> >    ===
> > 
> >    [1]: If it's not covered already, it might be a good idea to add a test
> >    for the above case.
> 
> Like Junio said, we do not care if it is a file or a directory of any
> sorts, we will give the error if it already exists. Therefore, even if
> it is an untracked or a tracked one, it should not matter to us. Hence
> testing for it may not be necessary is what I feel. Why should we test
> it?
I'm guessing you misunderstood. A few things:
- We only care about tracked contents for the case in hand.
- Identifying whether a given path corresponds to a directory
  which has tracked contents is tricky. Neither 'cache_name_pos'
  nor 'cache_file_exists' handle this. 'cache_dir_exists' is also
  not very useful as mentioned above.

So, we do have to take care when handling that case as Junio pointed out.

-- 
Sivaraam
Previous: Shourya ShuklaNext: Shourya Shukla
Message 10 of 12 in “submodule: port submodule subcommand 'add' from shell to C”
  1. Shourya ShuklaAug 24, 2020
  2. Junio C HamanoAug 24, 2020
  3. Kaartic SivaraamAug 24, 2020
  4. Junio C HamanoAug 24, 2020
  5. Shourya ShuklaAug 26, 2020
  6. Kaartic SivaraamAug 26, 2020
  7. Shourya ShuklaAug 26, 2020
  8. Kaartic SivaraamAug 30, 2020
  9. Shourya ShuklaAug 31, 2020
  10. Kaartic SivaraamSep 1, 2020
  11. Shourya ShuklaSep 2, 2020
  12. Kaartic SivaraamSep 3, 2020

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.