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

Re: [PATCH 1/2] tree.c: allow read_tree_recursive() to traverse gitlink entries

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Jan 25, 2009, 11:43 UTC
Message-ID
<alpine.DEB.1.00.0901251225250.14855@racer>
In-Reply-To
<1232844726-14902-2-git-send-email-hjemli@gmail.com>
Hi,
On Sun, 25 Jan 2009, Lars Hjemli wrote:
> When the callback function invoked from read_tree_recursive() returns
> the value `READ_TREE_RECURSIVE` for a gitlink entry, the traversal will
> now continue into the tree connected to the gitlinked commit.
\n
Show 5 quoted lines
> This functionality can be used to allow inter-repository operations, but 
> since the current users of read_tree_recursive() does not yet support 
> such operations, they have been modified where necessary to make sure 
> that they never return READ_TREE_RECURSIVE for gitlink entries (hence no 
> change in behaviour should be introduces by this patch alone).
s/\(introduce\)s/\1d/
Show 10 quoted lines
> diff --git a/archive.c b/archive.c
> index 9ac455d..e6de039 100644
> --- a/archive.c
> +++ b/archive.c
> @@ -132,7 +132,7 @@ static int write_archive_entry(const unsigned char *sha1, const char *base,
>  		err = write_entry(args, sha1, path.buf, path.len, mode, NULL, 0);
>  		if (err)
>  			return err;
> -		return READ_TREE_RECURSIVE;
> +		return (S_ISDIR(mode) ? READ_TREE_RECURSIVE : 0);
You do not need the parentheses around the conditional:
	$ git grep 'return (.*?' *.c | wc -l
	14
	gene099@racer:~/git (rebase-i-p)$ git grep 'return [^(]*?' *.c | wc -l
	41
Note that the 14 matches include 9 false positives.
Show 13 quoted lines
> diff --git a/builtin-ls-tree.c b/builtin-ls-tree.c
> index 5b63e6e..fca4631 100644
> --- a/builtin-ls-tree.c
> +++ b/builtin-ls-tree.c
> @@ -68,13 +68,8 @@ static int show_tree(const unsigned char *sha1, const char *base, int baselen,
>  		 *
>  		 * Something similar to this incomplete example:
>  		 *
> -		if (show_subprojects(base, baselen, pathname)) {
> -			struct child_process ls_tree;
> -
> -			ls_tree.dir = base;
> -			ls_tree.argv = ls-tree;
I wondered how that could ever have compiled...

Until I inspected the file (which is different in junio/next from what you based your patch on; your patch is vs junio/master).

Show 7 quoted lines
> @@ -131,6 +131,34 @@ int read_tree_recursive(struct tree *tree,
>  			if (retval)
>  				return -1;
>  			continue;
> +		} else if (S_ISGITLINK(entry.mode)) {
> +			int retval;
> +			struct strbuf path;
s/;/ = STRBUF_INIT;/
Show 8 quoted lines
> +			unsigned int entrylen;
> +			struct commit *commit;
> +
> +			entrylen = tree_entry_len(entry.path, entry.sha1);
> +			strbuf_init(&path, baselen + entrylen + 1);
> +			strbuf_add(&path, base, baselen);
> +			strbuf_add(&path, entry.path, entrylen);
> +			strbuf_addch(&path, '/');
Why not
			strbuf_addf(&path, "%.*s%.*s/", baselen, base, 
				entrylen, entry.path);
Show 17 quoted lines
> +
> +			commit = lookup_commit(entry.sha1);
> +			if (!commit)
> +				die("Commit %s in submodule path %s not found",
> +				    sha1_to_hex(entry.sha1), path.buf);
> +
> +			if (parse_commit(commit))
> +				die("Invalid commit %s in submodule path %s",
> +				    sha1_to_hex(entry.sha1), path.buf);
> +
> +			retval = read_tree_recursive(commit->tree,
> +						     path.buf, path.len,
> +						     stage, match, fn, context);
> +			strbuf_release(&path);
> +			if (retval)
> +				return -1;
> +			continue;

I'd also place a comment above read_tree_recursive() stating that this function tries to traverse into submodules when READ_TREE_RECURSIVE is returned for submodule entries, but no attempt is made at including alternate object directories. (And it must be that way: think bare repositories -- they cannot just try to include a subdirectory's .git/objects/..)

Ciao, Dscho

Previous: Johannes SchindelinNext: Lars Hjemli
Message 7 of 14 in “Add submodule-support to git archive”
  1. 0/2 Add submodule-support to git archiveLars Hjemli, Jan 25, 2009
  2. 1/2 tree.c: allow read_tree_recursive() to traverse gitlink entriesLars Hjemli, Jan 25, 2009
  3. 2/2 archive.c: add support for --submodules[=(all|checkedout)]Lars Hjemli, Jan 25, 2009
  4. Johannes SchindelinJan 25, 2009
  5. Lars HjemliJan 25, 2009
  6. Johannes SchindelinJan 25, 2009
  7. Johannes SchindelinJan 25, 2009
  8. Lars HjemliJan 25, 2009
  9. Nanako ShiraishiJan 25, 2009
  10. Lars HjemliJan 25, 2009
  11. Junio C HamanoJan 25, 2009
  12. Lars HjemliJan 25, 2009
  13. Johannes SchindelinJan 25, 2009
  14. Junio C HamanoJan 26, 2009

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.