From: Elijah Newren Date: Mon, 02 Aug 2010 04:21:17 GMT Subject: Re: [PATCH 02/16] list-objects: limit traversing within the given subtree if core.subtree is set Message-ID: In-Reply-To: <1280593105-22015-3-git-send-email-pclouds@gmail.com> Hi, 2010/7/31 Nguyễn Thái Ngọc Duy : > > Signed-off-by: Nguyễn Thái Ngọc Duy > --- >  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. > >        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.