@@ -116,7 +116,7 @@ void setup_traverse_info(struct traverse_info *info, const char *base)
116116
117117char * make_traverse_path (char * path , const struct traverse_info * info , const struct name_entry * n )
118118{
119- int len = tree_entry_len (n -> path , n -> sha1 );
119+ int len = tree_entry_len (n );
120120 int pathlen = info -> pathlen ;
121121
122122 path [pathlen + len ] = 0 ;
@@ -126,7 +126,7 @@ char *make_traverse_path(char *path, const struct traverse_info *info, const str
126126 break ;
127127 path [-- pathlen ] = '/' ;
128128 n = & info -> name ;
129- len = tree_entry_len (n -> path , n -> sha1 );
129+ len = tree_entry_len (n );
130130 info = info -> prev ;
131131 pathlen -= len ;
132132 }
@@ -253,7 +253,7 @@ static void extended_entry_extract(struct tree_desc_x *t,
253253 * The caller wants "first" from this tree, or nothing.
254254 */
255255 path = a -> path ;
256- len = tree_entry_len (a -> path , a -> sha1 );
256+ len = tree_entry_len (a );
257257 switch (check_entry_match (first , first_len , path , len )) {
258258 case -1 :
259259 entry_clear (a );
@@ -271,7 +271,7 @@ static void extended_entry_extract(struct tree_desc_x *t,
271271 while (probe .size ) {
272272 entry_extract (& probe , a );
273273 path = a -> path ;
274- len = tree_entry_len (a -> path , a -> sha1 );
274+ len = tree_entry_len (a );
275275 switch (check_entry_match (first , first_len , path , len )) {
276276 case -1 :
277277 entry_clear (a );
@@ -362,7 +362,7 @@ int traverse_trees(int n, struct tree_desc *t, struct traverse_info *info)
362362 e = entry + i ;
363363 if (!e -> path )
364364 continue ;
365- len = tree_entry_len (e -> path , e -> sha1 );
365+ len = tree_entry_len (e );
366366 if (!first ) {
367367 first = e -> path ;
368368 first_len = len ;
@@ -381,7 +381,7 @@ int traverse_trees(int n, struct tree_desc *t, struct traverse_info *info)
381381 /* Cull the ones that are not the earliest */
382382 if (!e -> path )
383383 continue ;
384- len = tree_entry_len (e -> path , e -> sha1 );
384+ len = tree_entry_len (e );
385385 if (name_compare (e -> path , len , first , first_len ))
386386 entry_clear (e );
387387 }
@@ -434,8 +434,8 @@ static int find_tree_entry(struct tree_desc *t, const char *name, unsigned char
434434 int entrylen , cmp ;
435435
436436 sha1 = tree_entry_extract (t , & entry , mode );
437+ entrylen = tree_entry_len (& t -> entry );
437438 update_tree_entry (t );
438- entrylen = tree_entry_len (entry , sha1 );
439439 if (entrylen > namelen )
440440 continue ;
441441 cmp = memcmp (name , entry , entrylen );
@@ -465,7 +465,6 @@ int get_tree_entry(const unsigned char *tree_sha1, const char *name, unsigned ch
465465 int retval ;
466466 void * tree ;
467467 unsigned long size ;
468- struct tree_desc t ;
469468 unsigned char root [20 ];
470469
471470 tree = read_object_with_reference (tree_sha1 , tree_type , & size , root );
@@ -478,8 +477,13 @@ int get_tree_entry(const unsigned char *tree_sha1, const char *name, unsigned ch
478477 return 0 ;
479478 }
480479
481- init_tree_desc (& t , tree , size );
482- retval = find_tree_entry (& t , name , sha1 , mode );
480+ if (!size ) {
481+ retval = -1 ;
482+ } else {
483+ struct tree_desc t ;
484+ init_tree_desc (& t , tree , size );
485+ retval = find_tree_entry (& t , name , sha1 , mode );
486+ }
483487 free (tree );
484488 return retval ;
485489}
@@ -573,30 +577,26 @@ static int match_dir_prefix(const char *base,
573577 *
574578 * Pre-condition: either baselen == base_offset (i.e. empty path)
575579 * or base[baselen-1] == '/' (i.e. with trailing slash).
576- *
577- * Return:
578- * - 2 for "yes, and all subsequent entries will be"
579- * - 1 for yes
580- * - zero for no
581- * - negative for "no, and no subsequent entries will be either"
582580 */
583- int tree_entry_interesting (const struct name_entry * entry ,
584- struct strbuf * base , int base_offset ,
585- const struct pathspec * ps )
581+ enum interesting tree_entry_interesting (const struct name_entry * entry ,
582+ struct strbuf * base , int base_offset ,
583+ const struct pathspec * ps )
586584{
587585 int i ;
588586 int pathlen , baselen = base -> len - base_offset ;
589- int never_interesting = ps -> has_wildcard ? 0 : -1 ;
587+ int never_interesting = ps -> has_wildcard ?
588+ entry_not_interesting : all_entries_not_interesting ;
590589
591590 if (!ps -> nr ) {
592591 if (!ps -> recursive || ps -> max_depth == -1 )
593- return 2 ;
594- return !!within_depth (base -> buf + base_offset , baselen ,
595- !!S_ISDIR (entry -> mode ),
596- ps -> max_depth );
592+ return all_entries_interesting ;
593+ return within_depth (base -> buf + base_offset , baselen ,
594+ !!S_ISDIR (entry -> mode ),
595+ ps -> max_depth ) ?
596+ entry_interesting : entry_not_interesting ;
597597 }
598598
599- pathlen = tree_entry_len (entry -> path , entry -> sha1 );
599+ pathlen = tree_entry_len (entry );
600600
601601 for (i = ps -> nr - 1 ; i >= 0 ; i -- ) {
602602 const struct pathspec_item * item = ps -> items + i ;
@@ -610,38 +610,39 @@ int tree_entry_interesting(const struct name_entry *entry,
610610 goto match_wildcards ;
611611
612612 if (!ps -> recursive || ps -> max_depth == -1 )
613- return 2 ;
613+ return all_entries_interesting ;
614614
615- return !!within_depth (base_str + matchlen + 1 ,
616- baselen - matchlen - 1 ,
617- !!S_ISDIR (entry -> mode ),
618- ps -> max_depth );
615+ return within_depth (base_str + matchlen + 1 ,
616+ baselen - matchlen - 1 ,
617+ !!S_ISDIR (entry -> mode ),
618+ ps -> max_depth ) ?
619+ entry_interesting : entry_not_interesting ;
619620 }
620621
621622 /* Either there must be no base, or the base must match. */
622623 if (baselen == 0 || !strncmp (base_str , match , baselen )) {
623624 if (match_entry (entry , pathlen ,
624625 match + baselen , matchlen - baselen ,
625626 & never_interesting ))
626- return 1 ;
627+ return entry_interesting ;
627628
628- if (ps -> items [ i ]. use_wildcard ) {
629+ if (item -> use_wildcard ) {
629630 if (!fnmatch (match + baselen , entry -> path , 0 ))
630- return 1 ;
631+ return entry_interesting ;
631632
632633 /*
633634 * Match all directories. We'll try to
634635 * match files later on.
635636 */
636637 if (ps -> recursive && S_ISDIR (entry -> mode ))
637- return 1 ;
638+ return entry_interesting ;
638639 }
639640
640641 continue ;
641642 }
642643
643644match_wildcards :
644- if (!ps -> items [ i ]. use_wildcard )
645+ if (!item -> use_wildcard )
645646 continue ;
646647
647648 /*
@@ -653,7 +654,7 @@ int tree_entry_interesting(const struct name_entry *entry,
653654
654655 if (!fnmatch (match , base -> buf + base_offset , 0 )) {
655656 strbuf_setlen (base , base_offset + baselen );
656- return 1 ;
657+ return entry_interesting ;
657658 }
658659 strbuf_setlen (base , base_offset + baselen );
659660
@@ -662,7 +663,7 @@ int tree_entry_interesting(const struct name_entry *entry,
662663 * later on.
663664 */
664665 if (ps -> recursive && S_ISDIR (entry -> mode ))
665- return 1 ;
666+ return entry_interesting ;
666667 }
667668 return never_interesting ; /* No matches */
668669}
0 commit comments