@@ -804,7 +804,96 @@ int get_sha1(const char *name, unsigned char *sha1)
804
804
return get_sha1_with_mode (name , sha1 , & unused );
805
805
}
806
806
807
- int get_sha1_with_mode (const char * name , unsigned char * sha1 , unsigned * mode )
807
+ /* Must be called only when object_name:filename doesn't exist. */
808
+ static void diagnose_invalid_sha1_path (const char * prefix ,
809
+ const char * filename ,
810
+ const unsigned char * tree_sha1 ,
811
+ const char * object_name )
812
+ {
813
+ struct stat st ;
814
+ unsigned char sha1 [20 ];
815
+ unsigned mode ;
816
+
817
+ if (!prefix )
818
+ prefix = "" ;
819
+
820
+ if (!lstat (filename , & st ))
821
+ die ("Path '%s' exists on disk, but not in '%s'." ,
822
+ filename , object_name );
823
+ if (errno == ENOENT || errno == ENOTDIR ) {
824
+ char * fullname = xmalloc (strlen (filename )
825
+ + strlen (prefix ) + 1 );
826
+ strcpy (fullname , prefix );
827
+ strcat (fullname , filename );
828
+
829
+ if (!get_tree_entry (tree_sha1 , fullname ,
830
+ sha1 , & mode )) {
831
+ die ("Path '%s' exists, but not '%s'.\n"
832
+ "Did you mean '%s:%s'?" ,
833
+ fullname ,
834
+ filename ,
835
+ object_name ,
836
+ fullname );
837
+ }
838
+ die ("Path '%s' does not exist in '%s'" ,
839
+ filename , object_name );
840
+ }
841
+ }
842
+
843
+ /* Must be called only when :stage:filename doesn't exist. */
844
+ static void diagnose_invalid_index_path (int stage ,
845
+ const char * prefix ,
846
+ const char * filename )
847
+ {
848
+ struct stat st ;
849
+ struct cache_entry * ce ;
850
+ int pos ;
851
+ unsigned namelen = strlen (filename );
852
+ unsigned fullnamelen ;
853
+ char * fullname ;
854
+
855
+ if (!prefix )
856
+ prefix = "" ;
857
+
858
+ /* Wrong stage number? */
859
+ pos = cache_name_pos (filename , namelen );
860
+ if (pos < 0 )
861
+ pos = - pos - 1 ;
862
+ ce = active_cache [pos ];
863
+ if (ce_namelen (ce ) == namelen &&
864
+ !memcmp (ce -> name , filename , namelen ))
865
+ die ("Path '%s' is in the index, but not at stage %d.\n"
866
+ "Did you mean ':%d:%s'?" ,
867
+ filename , stage ,
868
+ ce_stage (ce ), filename );
869
+
870
+ /* Confusion between relative and absolute filenames? */
871
+ fullnamelen = namelen + strlen (prefix );
872
+ fullname = xmalloc (fullnamelen + 1 );
873
+ strcpy (fullname , prefix );
874
+ strcat (fullname , filename );
875
+ pos = cache_name_pos (fullname , fullnamelen );
876
+ if (pos < 0 )
877
+ pos = - pos - 1 ;
878
+ ce = active_cache [pos ];
879
+ if (ce_namelen (ce ) == fullnamelen &&
880
+ !memcmp (ce -> name , fullname , fullnamelen ))
881
+ die ("Path '%s' is in the index, but not '%s'.\n"
882
+ "Did you mean ':%d:%s'?" ,
883
+ fullname , filename ,
884
+ ce_stage (ce ), fullname );
885
+
886
+ if (!lstat (filename , & st ))
887
+ die ("Path '%s' exists on disk, but not in the index." , filename );
888
+ if (errno == ENOENT || errno == ENOTDIR )
889
+ die ("Path '%s' does not exist (neither on disk nor in the index)." ,
890
+ filename );
891
+
892
+ free (fullname );
893
+ }
894
+
895
+
896
+ int get_sha1_with_mode_1 (const char * name , unsigned char * sha1 , unsigned * mode , int gently , const char * prefix )
808
897
{
809
898
int ret , bracket_depth ;
810
899
int namelen = strlen (name );
@@ -850,6 +939,8 @@ int get_sha1_with_mode(const char *name, unsigned char *sha1, unsigned *mode)
850
939
}
851
940
pos ++ ;
852
941
}
942
+ if (!gently )
943
+ diagnose_invalid_index_path (stage , prefix , cp );
853
944
return -1 ;
854
945
}
855
946
for (cp = name , bracket_depth = 0 ; * cp ; cp ++ ) {
@@ -862,9 +953,25 @@ int get_sha1_with_mode(const char *name, unsigned char *sha1, unsigned *mode)
862
953
}
863
954
if (* cp == ':' ) {
864
955
unsigned char tree_sha1 [20 ];
865
- if (!get_sha1_1 (name , cp - name , tree_sha1 ))
866
- return get_tree_entry (tree_sha1 , cp + 1 , sha1 ,
867
- mode );
956
+ char * object_name = NULL ;
957
+ if (!gently ) {
958
+ object_name = xmalloc (cp - name + 1 );
959
+ strncpy (object_name , name , cp - name );
960
+ object_name [cp - name ] = '\0' ;
961
+ }
962
+ if (!get_sha1_1 (name , cp - name , tree_sha1 )) {
963
+ const char * filename = cp + 1 ;
964
+ ret = get_tree_entry (tree_sha1 , filename , sha1 , mode );
965
+ if (!gently ) {
966
+ diagnose_invalid_sha1_path (prefix , filename ,
967
+ tree_sha1 , object_name );
968
+ free (object_name );
969
+ }
970
+ return ret ;
971
+ } else {
972
+ if (!gently )
973
+ die ("Invalid object name '%s'." , object_name );
974
+ }
868
975
}
869
976
return ret ;
870
977
}
0 commit comments