Re: [PATCH 2/2] archive.c: add support for --submodules[=(all|checkedout)]
- From
Johannes Schindelin <johannes.schindelin@gmx.de>
- Date
- Jan 25, 2009, 11:57 UTC
- Message-ID
- <alpine.DEB.1.00.0901251247040.14855@racer>
- In-Reply-To
- <1232844726-14902-3-git-send-email-hjemli@gmail.com>
Hi,
On Sun, 25 Jan 2009, Lars Hjemli wrote:
Show 7 quoted lines
> The --submodules option uses the enhanced read_tree_recursive() to > enable inclusion of submodules in the generated archive. > > When invoked with `--submodules=all` all gitlink entries will be > traversed, and when invoked with --submodules=checkedout (the default > option) only gitlink entries with a git repo (i.e. checked out sub- > modules) will be traversed.
In bare repositories, this means: none.
My reasoning for "*" instead of "all" and "" instead for "checkedout" was that you could allow "<name1>,<name2>" at some stage, where <name> would first be interpreted as a submodule group, and if that fails, as submodule name.
Thinking about that more, "" seems illogical, that should rather mean "none", i.e. the same as --no-submodules. The "checkedout" could be "." then, perhaps? As in "what we have checked out in ./, the current directory"?
Show 5 quoted lines
> When a gitlink has been selected for traversal, it is required that all > objects necessary to perform this traversal are available in either the > primary odb or through an alternate odb. To this end, git archive will > insert the object database of the selected gitlink (when checked out) > as an alternate odb, using the new function add_alt_odb().
> And since alternates now can be added after parsing of > objects/info/alternates, the error message in link_alt_odb_entry() has > been updated to not mention this file.
Could you split that part into its own patch again, please?
Show 16 quoted lines
> @@ -91,6 +92,70 @@ static void setup_archive_check(struct git_attr_check *check)
> check[1].attr = attr_export_subst;
> }
>
> +static int include_repository(const char *path)
> +{
> + struct stat st;
> + const char *tmp;
> +
> + /* Return early if the path does not exist since it is OK to not
> + * checkout submodules.
> + */
> + if (stat(path, &st) && errno == ENOENT)
> + return 1;
> +
> + tmp = read_gitfile_gently(path);This will leak memory, no?
Show 16 quoted lines
> + if (tmp) {
> + path = tmp;
> + if (stat(path, &st))
> + die("Unable to stat submodule gitdir %s: %s (%d)",
> + path, strerror(errno), errno);
> + }
> +
> + if (!S_ISDIR(st.st_mode))
> + die("Submodule gitdir %s is not a directory", path);
> +
> + if (add_alt_odb(mkpath("%s/objects", path)))
> + die("submodule odb %s could not be added as an alternate",
> + path);
> +
> + return 0;
> +}Ciao, Dscho