@@ -577,81 +577,6 @@ static int show_modified(struct rev_info *revs,
577
577
return 0 ;
578
578
}
579
579
580
- static int diff_cache (struct rev_info * revs ,
581
- struct cache_entry * * ac , int entries ,
582
- const char * * pathspec ,
583
- int cached , int match_missing )
584
- {
585
- while (entries ) {
586
- struct cache_entry * ce = * ac ;
587
- int same = (entries > 1 ) && ce_same_name (ce , ac [1 ]);
588
-
589
- if (DIFF_OPT_TST (& revs -> diffopt , QUIET ) &&
590
- DIFF_OPT_TST (& revs -> diffopt , HAS_CHANGES ))
591
- break ;
592
-
593
- if (!ce_path_match (ce , pathspec ))
594
- goto skip_entry ;
595
-
596
- switch (ce_stage (ce )) {
597
- case 0 :
598
- /* No stage 1 entry? That means it's a new file */
599
- if (!same ) {
600
- show_new_file (revs , ce , cached , match_missing );
601
- break ;
602
- }
603
- /* Show difference between old and new */
604
- show_modified (revs , ac [1 ], ce , 1 ,
605
- cached , match_missing );
606
- break ;
607
- case 1 :
608
- /* No stage 3 (merge) entry?
609
- * That means it's been deleted.
610
- */
611
- if (!same ) {
612
- diff_index_show_file (revs , "-" , ce ,
613
- ce -> sha1 , ce -> ce_mode );
614
- break ;
615
- }
616
- /* We come here with ce pointing at stage 1
617
- * (original tree) and ac[1] pointing at stage
618
- * 3 (unmerged). show-modified with
619
- * report-missing set to false does not say the
620
- * file is deleted but reports true if work
621
- * tree does not have it, in which case we
622
- * fall through to report the unmerged state.
623
- * Otherwise, we show the differences between
624
- * the original tree and the work tree.
625
- */
626
- if (!cached &&
627
- !show_modified (revs , ce , ac [1 ], 0 ,
628
- cached , match_missing ))
629
- break ;
630
- diff_unmerge (& revs -> diffopt , ce -> name ,
631
- ce -> ce_mode , ce -> sha1 );
632
- break ;
633
- case 3 :
634
- diff_unmerge (& revs -> diffopt , ce -> name ,
635
- 0 , null_sha1 );
636
- break ;
637
-
638
- default :
639
- die ("impossible cache entry stage" );
640
- }
641
-
642
- skip_entry :
643
- /*
644
- * Ignore all the different stages for this file,
645
- * we've handled the relevant cases now.
646
- */
647
- do {
648
- ac ++ ;
649
- entries -- ;
650
- } while (entries && ce_same_name (ce , ac [0 ]));
651
- }
652
- return 0 ;
653
- }
654
-
655
580
/*
656
581
* This turns all merge entries into "stage 3". That guarantees that
657
582
* when we read in the new tree (into "stage 1"), we won't lose sight
@@ -826,6 +751,8 @@ int do_diff_cache(const unsigned char *tree_sha1, struct diff_options *opt)
826
751
int i ;
827
752
struct cache_entry * * dst ;
828
753
struct cache_entry * last = NULL ;
754
+ struct unpack_trees_options opts ;
755
+ struct tree_desc t ;
829
756
830
757
/*
831
758
* This is used by git-blame to run diff-cache internally;
@@ -853,8 +780,15 @@ int do_diff_cache(const unsigned char *tree_sha1, struct diff_options *opt)
853
780
tree = parse_tree_indirect (tree_sha1 );
854
781
if (!tree )
855
782
die ("bad tree object %s" , sha1_to_hex (tree_sha1 ));
856
- if (read_tree (tree , 1 , opt -> paths ))
857
- return error ("unable to read tree %s" , sha1_to_hex (tree_sha1 ));
858
- return diff_cache (& revs , active_cache , active_nr , revs .prune_data ,
859
- 1 , 0 );
783
+
784
+ memset (& opts , 0 , sizeof (opts ));
785
+ opts .head_idx = 1 ;
786
+ opts .index_only = 1 ;
787
+ opts .merge = 1 ;
788
+ opts .fn = oneway_diff ;
789
+ opts .unpack_data = & revs ;
790
+
791
+ init_tree_desc (& t , tree -> buffer , tree -> size );
792
+ unpack_trees (1 , & t , & opts );
793
+ return 0 ;
860
794
}
0 commit comments