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

Re: [PATCH/RFC] Teach fast-import to import subtrees named by tree id

From
Ramkumar Ramachandra <artagnon@gmail.com>
Date
Jul 2, 2010, 12:44 UTC
Message-ID
<20100702124431.GB2306@debian>
In-Reply-To
<20100701031819.GA12524@burratino>
Hi Jonathan,
Jonathan Nieder writes:
Show 9 quoted lines
> To simulate the svn cp command, it would be very useful to be
> replace an arbitrary file in the current revision by an
> arbitrary directory from a previous one.  Modify the filemodify
> command to allow that:
> 
>  M 040000 <tree id> pathname
> 
> This would be most useful in combination with a facility to
> print the commit ids for new revisions as they are written.

Thanks for this patch! I applied and tested it: works as expected. It's ready for inclusion, yes?

Reviewed-by: Ramkumar Ramachandra <artagnon@gmail.com>
Show 64 quoted lines
> ---
> I actually thought fast-import already did this until David
> mentioned that no, it does not.  Well, live and learn.
> 
> This and Sverre’s --print-marks command would allow svn-fe
> to be simplified a great deal.
> 
> I was not sure whether to add a "feature" specification for
> this, so I’ll try that as a separate patch.
> 
> Thoughts?
> Jonathan
> 
>  Documentation/git-fast-import.txt |    8 ++++-
>  fast-import.c                     |   24 ++++++++++------
>  t/t9300-fast-import.sh            |   54 +++++++++++++++++++++++++++++++++++++
>  3 files changed, 75 insertions(+), 11 deletions(-)
> 
> diff --git a/Documentation/git-fast-import.txt b/Documentation/git-fast-import.txt
> index 19082b0..f4d9aeb 100644
> --- a/Documentation/git-fast-import.txt
> +++ b/Documentation/git-fast-import.txt
> @@ -482,9 +482,11 @@ External data format::
>  	'M' SP <mode> SP <dataref> SP <path> LF
>  ....
>  +
> -Here `<dataref>` can be either a mark reference (`:<idnum>`)
> +Here usually `<dataref>` must be either a mark reference (`:<idnum>`)
>  set by a prior `blob` command, or a full 40-byte SHA-1 of an
> -existing Git blob object.
> +existing Git blob object.  If `<mode>` is `040000`` then
> +`<dataref>` must be the full 40-byte SHA-1 of an existing
> +Git tree object or a mark reference set with `--import-marks`.
>  
>  Inline data format::
>  	The data content for the file has not been supplied yet.
> @@ -509,6 +511,8 @@ in octal.  Git only supports the following modes:
>  * `160000`: A gitlink, SHA-1 of the object refers to a commit in
>    another repository. Git links can only be specified by SHA or through
>    a commit mark. They are used to implement submodules.
> +* `040000`: A subdirectory.  Subdirectories can only be specified by
> +  SHA or through a tree mark set with `--import-marks`.
>  
>  In both formats `<path>` is the complete path of the file to be added
>  (if not already existing) or modified (if already existing).
> diff --git a/fast-import.c b/fast-import.c
> index 1e5d66e..ad6843a 100644
> --- a/fast-import.c
> +++ b/fast-import.c
> @@ -2131,6 +2131,7 @@ static void file_change_m(struct branch *b)
>  	case S_IFREG | 0644:
>  	case S_IFREG | 0755:
>  	case S_IFLNK:
> +	case S_IFDIR:
>  	case S_IFGITLINK:
>  		/* ok */
>  		break;
> @@ -2176,23 +2177,28 @@ static void file_change_m(struct branch *b)
>  		 * another repository.
>  		 */
>  	} else if (inline_data) {
> +		if (S_ISDIR(mode))
> +			die("Directories cannot be specified 'inline': %s",
> +				command_buf.buf);

Okay. Since you've passed S_IFDIR in the earlier switch-case, you've made sure that directories aren't specified inline here.

Show 16 quoted lines
>  		if (p != uq.buf) {
>  			strbuf_addstr(&uq, p);
>  			p = uq.buf;
>  		}
>  		read_next_command();
>  		parse_and_store_blob(&last_blob, sha1, 0);
> -	} else if (oe) {
> -		if (oe->type != OBJ_BLOB)
> -			die("Not a blob (actually a %s): %s",
> -				typename(oe->type), command_buf.buf);
>  	} else {
> -		enum object_type type = sha1_object_info(sha1, NULL);
> +		enum object_type expected = S_ISDIR(mode) ?
> +						OBJ_TREE: OBJ_BLOB;
> +		enum object_type type = oe ? oe->type :
> +					sha1_object_info(sha1, NULL);

Instead allowing just blobs, you've allowed both blob and tree objects to be specified here. I don't see any tree writing code in your change, so I'm assuming blob and tree writing is just handled transparently in Git.

Show 14 quoted lines
>  		if (type < 0)
> -			die("Blob not found: %s", command_buf.buf);
> -		if (type != OBJ_BLOB)
> -			die("Not a blob (actually a %s): %s",
> -			    typename(type), command_buf.buf);
> +			die("%s not found: %s",
> +					S_ISDIR(mode) ?  "Tree" : "Blob",
> +					command_buf.buf);
> +		if (type != expected)
> +			die("Not a %s (actually a %s): %s",
> +				typename(expected), typename(type),
> +				command_buf.buf);
>  	}
>  	tree_content_set(&b->branch_tree, p, sha1, mode, NULL);
Conditionally printing either "blob" or "tree" in the error message. Okay.
> diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh
> index 131f032..50d5913 100755
> --- a/t/t9300-fast-import.sh
> +++ b/t/t9300-fast-import.sh
Okay. Test passes.
-- Ram
Previous: Jonathan Nieder
Message 75 of 75 in “Teach fast-import to import subtrees named by tree id”
  1. Teach fast-import to import subtrees named by tree idJonathan Nieder, Jul 1, 2010
  2. Teach fast-import to print the id of each imported commitJonathan Nieder, Jul 1, 2010
  3. Sverre RabbelierJul 2, 2010
  4. Jonathan NiederJul 2, 2010
  5. Sverre RabbelierJul 2, 2010
  6. Jonathan NiederJul 2, 2010
  7. Sverre RabbelierJul 2, 2010
  8. Jonathan NiederJul 2, 2010
  9. Sverre RabbelierJul 2, 2010
  10. Sam VilainJul 4, 2010
  11. Jonathan NiederJul 4, 2010
  12. Sam VilainJul 4, 2010
  13. Jonathan NiederJul 4, 2010
  14. Ramkumar RamachandraAug 17, 2010
  15. 0/3 fast-import: give importers access to the object storeJonathan Nieder, Sep 5, 2010
  16. 1/3 t9300 (fast-import): style tweaksJonathan Nieder, Sep 5, 2010
  17. 00/24 Re: [PATCH 1/3] t9300 (fast-import): style tweaksJonathan Nieder, Sep 24, 2010
  18. 01/24 t9300 (fast-import): avoid exiting early on failureJonathan Nieder, Sep 24, 2010
  19. 02/24 t9300 (fast-import): avoid hard-coded object namesJonathan Nieder, Sep 24, 2010
  20. 03/24 t9300 (fast-import): guard "export large marks" test setupJonathan Nieder, Sep 24, 2010
  21. Ramkumar RamachandraSep 24, 2010
  22. Raja R HarinathSep 24, 2010
  23. Ramkumar RamachandraSep 24, 2010
  24. Raja R HarinathSep 24, 2010
  25. 04/24 t9300 (fast-import): check exit status from upstream of pipesJonathan Nieder, Sep 24, 2010
  26. 05/24 t9300 (fast-import): check exit status from command substitutionsJonathan Nieder, Sep 24, 2010
  27. 06/24 t9300 (fast-import): use test_cmp in place of test $(foo) = $(bar)Jonathan Nieder, Sep 24, 2010
  28. 07/24 t9300 (fast-import): use tabs to indentJonathan Nieder, Sep 24, 2010
  29. Ramkumar RamachandraSep 24, 2010
  30. Jonathan NiederSep 24, 2010
  31. 08/24 t9300 (fast-import), series A: re-indentJonathan Nieder, Sep 24, 2010
  32. Sverre RabbelierSep 24, 2010
  33. Jonathan NiederSep 24, 2010
  34. 09/24 t9300 (fast-import), series B: re-indentJonathan Nieder, Sep 24, 2010
  35. 10/24 t9300 (fast-import), series C: re-indentJonathan Nieder, Sep 24, 2010
  36. 11/24 t9300 (fast-import), series D: re-indentJonathan Nieder, Sep 24, 2010
  37. 12/24 t9300 (fast-import), series E: re-indentJonathan Nieder, Sep 24, 2010
  38. 13/24 t9300 (fast-import), series F: re-indentJonathan Nieder, Sep 24, 2010
  39. 14/24 t9300 (fast-import), series H: re-indentJonathan Nieder, Sep 24, 2010
  40. 15/24 t9300 (fast-import), series I: re-indentJonathan Nieder, Sep 24, 2010
  41. 16/24 t9300 (fast-import), series J: re-indentJonathan Nieder, Sep 24, 2010
  42. 17/24 t9300 (fast-import), series K: re-indentJonathan Nieder, Sep 24, 2010
  43. 18/24 t9300 (fast-import), series L: re-indentJonathan Nieder, Sep 24, 2010
  44. 19/24 t9300 (fast-import), series M: re-indentJonathan Nieder, Sep 24, 2010
  45. 20/24 t9300 (fast-import), series N: re-indentJonathan Nieder, Sep 24, 2010
  46. 21/24 t9300 (fast-import), series O: re-indentJonathan Nieder, Sep 24, 2010
  47. 22/24 t9300 (fast-import), series P: re-indentJonathan Nieder, Sep 24, 2010
  48. 23/24 t9300 (fast-import), series Q: re-indentJonathan Nieder, Sep 24, 2010
  49. 24/24 t9300 (fast-import), series R: re-indentJonathan Nieder, Sep 24, 2010
  50. svn-fe statusJonathan Nieder, Sep 25, 2010
  51. Sverre RabbelierSep 25, 2010
  52. Jonathan NiederSep 27, 2010
  53. Sverre RabbelierSep 27, 2010
  54. 2/3 Teach fast-import to print the id of each imported commitJonathan Nieder, Sep 5, 2010
  55. 3/3 fast-import: Let importers retrieve the objects being writtenJonathan Nieder, Sep 5, 2010
  56. Ramkumar RamachandraSep 5, 2010
  57. Sverre RabbelierSep 5, 2010
  58. Ramkumar RamachandraSep 5, 2010
  59. Sverre RabbelierSep 5, 2010
  60. Jonathan NiederSep 5, 2010
  61. 4/3 fast-import: typofixJonathan Nieder, Sep 8, 2010
  62. 5/3 fast-import: allow cat command with empty pathJonathan Nieder, Sep 8, 2010
  63. 6/3 fast-import: Allow cat requests at arbitrary points in streamJonathan Nieder, Sep 8, 2010
  64. Sverre RabbelierSep 8, 2010
  65. Jonathan NiederSep 8, 2010
  66. Ramkumar RamachandraSep 8, 2010
  67. Sam VilainSep 16, 2010
  68. Sverre RabbelierSep 17, 2010
  69. Jonathan NiederSep 24, 2010
  70. Sverre RabbelierSep 24, 2010
  71. Jonathan NiederSep 25, 2010
  72. Sverre RabbelierSep 25, 2010
  73. Sverre RabbelierJul 2, 2010
  74. Jonathan NiederJul 2, 2010
  75. Ramkumar RamachandraJul 2, 2010

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.