Re: [PATCH 02/16] list-objects: limit traversing within the given subtree if core.subtree is set
- From
Elijah Newren <newren@gmail.com>
- Date
- Aug 2, 2010, 04:21 UTC
- Message-ID
- <AANLkTikZrD+RRMnae0OOPU_keuu97LditFZnekcpkrYZ@mail.gmail.com>
- In-Reply-To
- <1280593105-22015-3-git-send-email-pclouds@gmail.com>
Hi,
2010/7/31 Nguyễn Thái Ngọc Duy <pclouds@gmail.com>:
Show 24 quoted lines
>
> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
> ---
> list-objects.c | 23 +++++++++++++++++------
> 1 files changed, 17 insertions(+), 6 deletions(-)
>
> diff --git a/list-objects.c b/list-objects.c
> index 8953548..1b25b54 100644
> --- a/list-objects.c
> +++ b/list-objects.c
> @@ -61,12 +61,15 @@ static void process_tree(struct rev_info *revs,
> struct tree *tree,
> show_object_fn show,
> struct name_path *path,
> - const char *name)
> + const char *name,
> + const char *subtree)
> {
> struct object *obj = &tree->object;
> struct tree_desc desc;
> struct name_entry entry;
> struct name_path me;
> + const char *slash;
> + int subtree_len;Perhaps slash should be initialized to NULL? Otherwise I think it will be used uninitialized.
Show 21 quoted lines
>
> if (!revs->tree_objects)
> return;
> @@ -82,13 +85,21 @@ static void process_tree(struct rev_info *revs,
> me.elem = name;
> me.elem_len = strlen(name);
>
> + if (subtree) {
> + slash = strchr(subtree, '/');
> + subtree_len = slash ? slash - subtree : strlen(subtree);
> + }
> +
> init_tree_desc(&desc, tree->buffer, tree->size);
>
> while (tree_entry(&desc, &entry)) {
> - if (S_ISDIR(entry.mode))
> - process_tree(revs,
> - lookup_tree(entry.sha1),
> - show, &me, entry.path);
> + if (S_ISDIR(entry.mode)) {
> + if (!subtree || !strncmp(entry.path, subtree, subtree_len))Only one subdirectory allowed? What if someone wants a sparse clone containing two or more directories? (Actually, that's not so much of a "what if" -- it's exactly what I want in about half my usecases for sparse clones.)
> + process_tree(revs, > + lookup_tree(entry.sha1), > + show, &me, entry.path, > + slash && slash[1] ? slash+1 : NULL);
If I read correctly, slash will be used uninitialized here whenever subtree == NULL.