| 1011 | } |
| 1012 | |
| 1013 | static void show_patch_diff(struct combine_diff_path *elem, int num_parent, |
| 1014 | int working_tree_file, |
| 1015 | struct rev_info *rev) |
| 1016 | { |
| 1017 | struct diff_options *opt = &rev->diffopt; |
| 1018 | unsigned long result_size, cnt, lno; |
| 1019 | int result_deleted = 0; |
| 1020 | char *result, *cp; |
| 1021 | struct sline *sline; /* survived lines */ |
| 1022 | int mode_differs = 0; |
| 1023 | int i, show_hunks; |
| 1024 | mmfile_t result_file; |
| 1025 | struct userdiff_driver *userdiff; |
| 1026 | struct userdiff_driver *textconv = NULL; |
| 1027 | int is_binary; |
| 1028 | const char *line_prefix = diff_line_prefix(opt); |
| 1029 | |
| 1030 | context = opt->context; |
| 1031 | userdiff = userdiff_find_by_path(opt->repo->index, elem->path); |
| 1032 | if (!userdiff) |
| 1033 | userdiff = userdiff_find_by_name("default"); |
| 1034 | if (opt->flags.allow_textconv) |
| 1035 | textconv = userdiff_get_textconv(opt->repo, userdiff); |
| 1036 | |
| 1037 | /* Read the result of merge first */ |
| 1038 | if (!working_tree_file) |
| 1039 | result = grab_blob(opt->repo, &elem->oid, elem->mode, &result_size, |
| 1040 | textconv, elem->path); |
| 1041 | else { |
| 1042 | /* Used by diff-tree to read from the working tree */ |
| 1043 | struct stat st; |
| 1044 | int fd = -1; |
| 1045 | |
| 1046 | if (lstat(elem->path, &st) < 0) |
| 1047 | goto deleted_file; |
| 1048 | |
| 1049 | if (S_ISLNK(st.st_mode)) { |
| 1050 | struct strbuf buf = STRBUF_INIT; |
| 1051 | |
| 1052 | if (strbuf_readlink(&buf, elem->path, st.st_size) < 0) { |
| 1053 | error_errno("readlink(%s)", elem->path); |
| 1054 | return; |
| 1055 | } |
| 1056 | result_size = buf.len; |
| 1057 | result = strbuf_detach(&buf, NULL); |
| 1058 | elem->mode = canon_mode(st.st_mode); |
| 1059 | } else if (S_ISDIR(st.st_mode)) { |
| 1060 | struct object_id oid; |
| 1061 | if (repo_resolve_gitlink_ref(the_repository, elem->path, |
| 1062 | "HEAD", &oid) < 0) |
| 1063 | result = grab_blob(opt->repo, &elem->oid, |
| 1064 | elem->mode, &result_size, |
| 1065 | NULL, NULL); |
| 1066 | else |
| 1067 | result = grab_blob(opt->repo, &oid, elem->mode, |
| 1068 | &result_size, NULL, NULL); |
| 1069 | } else if (textconv) { |
| 1070 | struct diff_filespec *df = alloc_filespec(elem->path); |
no test coverage detected