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

Re: [PATCH] fast-import: Allow filemodify to set the root

From
Jonathan Nieder <jrnieder@gmail.com>
Date
Oct 11, 2010, 06:34 UTC
Message-ID
<20101011063429.GA32034@burratino>
In-Reply-To
<1286681415-1831-1-git-send-email-david.barr@cordelta.com>
David Barr wrote:
Show 9 quoted lines
> --- a/Documentation/git-fast-import.txt
> +++ b/Documentation/git-fast-import.txt
> @@ -524,6 +524,9 @@ start with double quote (`"`).
>  If an `LF` or double quote must be encoded into `<path>` shell-style
>  quoting should be used, e.g. `"path/with\n and \" in it"`.
>  
> +Additionally, in `040000` mode, `<path>` may also be an empty string
> +(`""`) to specify the root of the tree.
> +

Ideally this would be not so much "Additionally" as "For example". Maybe just:

	An empty path ("") refers to the toplevel directory of
	the tracked tree.
Show 17 quoted lines
> --- a/fast-import.c
> +++ b/fast-import.c
> @@ -1454,6 +1454,15 @@ static int tree_content_set(
>  		n = slash1 - p;
>  	else
>  		n = strlen(p);
> +	if (!slash1 && !n) {
> +		if (!S_ISDIR(mode))
> +			die("Root cannot be a non-directory");
> +		hashcpy(root->versions[1].sha1, sha1);
> +		if (root->tree)
> +			release_tree_content_recursive(root->tree);
> +		root->tree = subtree;
> +		return 1;
> +	}
>  	if (!n)
>  		die("Empty path component found in input");

Background for the curious: tree_content_set() is a recursive function to modify a tree-in-the-making by changing the entry at path p to refer to some specified content with a given mode. The recursion works as one might expect:

	tree_content_set(root, "foo/bar/baz", ...) ->
	 tree_content_set(root:foo, "bar/baz", ...) ->
	  et c

The "if (!n)" check introduced in v1.5.1.3~11^2~1 (Don't allow empty pathnames in fast-import, 2007-04-28) ensures fast-import doesn't end up creating a subdirectory corresponding to an empty path component in a pathname like "foo//bar/baz".

With this patch, an empty path component is allowed again, but only as the last path component. It is used to modify directories. So, for example,

	tree_content_set(root, "foo/bar/", sha1, S_IFDIR)
becomes an almost-synonym for
	tree_content_set(root, "foo/bar", sha1, S_IFDIR)
and
	tree_content_set(root, "foo/bar/", sha1, S_IFREG | 0644)
is rejected.

Why do I say almost-synonym? Because as Ram pointed out, you are not invalidating the parent tree hash, because there may not even _be_ a parent tree.

In other words, with this patch, I worry that a
	M 040000 ...sha1... "foo/bar/"
line would be sometimes ignored and sometimes not.  Confusing.

Would it make sense to just handle the empty-path case in the callers (file_change_m(), file_change_cr()) to avoid this?

Previous: David BarrNext: Jonathan Nieder
Message 20 of 31 in “fast-import: Allow filemodify to set the root”
  1. fast-import: Allow filemodify to set the rootDavid Barr, Oct 7, 2010
  2. Sverre RabbelierOct 7, 2010
  3. Jonathan NiederOct 7, 2010
  4. Sverre RabbelierOct 7, 2010
  5. David BarrOct 7, 2010
  6. fast-import: Allow filemodify to set the rootDavid Barr, Oct 7, 2010
  7. Sverre RabbelierOct 7, 2010
  8. Johannes SixtOct 8, 2010
  9. Jonathan NiederOct 8, 2010
  10. Johannes SixtOct 8, 2010
  11. Jonathan NiederOct 8, 2010
  12. Ramkumar RamachandraOct 8, 2010
  13. Gabriel FilionOct 8, 2010
  14. David Michael BarrOct 8, 2010
  15. Sverre RabbelierOct 8, 2010
  16. Jonathan NiederOct 8, 2010
  17. David Michael BarrOct 9, 2010
  18. Sverre RabbelierOct 9, 2010
  19. fast-import: Allow filemodify to set the rootDavid Barr, Oct 10, 2010
  20. Jonathan NiederOct 11, 2010
  21. 0/2 Re: fast-import: Allow filemodify to set the rootJonathan Nieder, Oct 18, 2010
  22. 1/2 fast-import: filemodify after M 040000 <tree> "" crashesJonathan Nieder, Oct 18, 2010
  23. Sverre RabbelierOct 18, 2010
  24. Jonathan NiederOct 18, 2010
  25. fast-import: do not clear notes in do_change_note_fanout()Jonathan Nieder, Oct 20, 2010
  26. 2/2 fast-import: tighten M 040000 syntaxJonathan Nieder, Oct 18, 2010
  27. Documentation/fast-import: put explanation of M 040000 <dataref> "" in contextJonathan Nieder, Jan 16, 2011
  28. Junio C HamanoJan 18, 2011
  29. Jonathan NiederJan 18, 2011
  30. Junio C HamanoJan 18, 2011
  31. Jonathan NiederJan 18, 2011

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.