Ticket #2510: mc.2510.diff
File mc.2510.diff, 9.5 KB (added by szaszg, 11 years ago) |
---|
-
lib/util.c
diff --git a/lib/util.c b/lib/util.c index b7787ab..3077fb4 100644
a b Q_ (const char *s) 1291 1291 /* --------------------------------------------------------------------------------------------- */ 1292 1292 1293 1293 gboolean 1294 mc_util_make_backup_if_possible (const char *file_name, const char *backup_suffix)1294 mc_util_make_backup_if_possible_from (const char *file_name, const char *backup_name, const char *backup_suffix) 1295 1295 { 1296 struct stat stat_buf;1297 1296 char *backup_path; 1297 struct stat stat_buf; 1298 1298 gboolean ret; 1299 1299 1300 if (!exist_file (file_name)) 1300 1301 return FALSE; 1301 1302 1302 backup_path = g_strdup_printf ("%s%s", file_name, backup_suffix);1303 backup_path = g_strdup_printf ("%s%s", backup_name, backup_suffix); 1303 1304 1304 1305 if (backup_path == NULL) 1305 1306 return FALSE; … … mc_util_make_backup_if_possible (const char *file_name, const char *backup_suffi 1314 1315 else 1315 1316 chmod (backup_path, S_IRUSR | S_IWUSR); 1316 1317 } 1317 1318 1318 g_free (backup_path); 1319 1319 1320 1320 return ret; … … mc_util_make_backup_if_possible (const char *file_name, const char *backup_suffi 1323 1323 /* --------------------------------------------------------------------------------------------- */ 1324 1324 1325 1325 gboolean 1326 mc_util_restore_from_backup_if_possible (const char *file_name, const char *backup_suffix) 1326 mc_util_make_backup_if_possible (const char *file_name, const char *backup_suffix) 1327 { 1328 return mc_util_make_backup_if_possible_from (file_name, file_name, backup_suffix); 1329 } 1330 1331 /* --------------------------------------------------------------------------------------------- */ 1332 1333 gboolean 1334 mc_util_restore_from_backup_if_possible_to (const char *file_name, const char *backup_name, const char *backup_suffix) 1327 1335 { 1328 1336 gboolean ret; 1329 1337 char *backup_path; 1330 1338 1331 backup_path = g_strdup_printf ("%s%s", file_name, backup_suffix);1339 backup_path = g_strdup_printf ("%s%s", backup_name, backup_suffix); 1332 1340 if (backup_path == NULL) 1333 1341 return FALSE; 1334 1342 … … mc_util_restore_from_backup_if_possible (const char *file_name, const char *back 1341 1349 /* --------------------------------------------------------------------------------------------- */ 1342 1350 1343 1351 gboolean 1352 mc_util_restore_from_backup_if_possible (const char *file_name, const char *backup_suffix) 1353 { 1354 return mc_util_restore_from_backup_if_possible_to (file_name, file_name, backup_suffix); 1355 } 1356 1357 /* --------------------------------------------------------------------------------------------- */ 1358 1359 gboolean 1344 1360 mc_util_unlink_backup_if_possible (const char *file_name, const char *backup_suffix) 1345 1361 { 1346 1362 char *backup_path; -
lib/util.h
diff --git a/lib/util.h b/lib/util.h index f0c0ee2..e8ec8af 100644
a b extern int ascii_alpha_to_cntrl (int ch); 192 192 const char *Q_ (const char *s); 193 193 194 194 gboolean mc_util_make_backup_if_possible (const char *, const char *); 195 gboolean mc_util_make_backup_if_possible_from (const char *, const char *, const char *); 195 196 gboolean mc_util_restore_from_backup_if_possible (const char *, const char *); 197 gboolean mc_util_restore_from_backup_if_possible_to (const char *, const char *, const char *); 196 198 gboolean mc_util_unlink_backup_if_possible (const char *, const char *); 197 199 198 200 char *guess_message_value (void); -
src/diffviewer/internal.h
diff --git a/src/diffviewer/internal.h b/src/diffviewer/internal.h index 778ce14..1d025af 100644
a b typedef struct WDiff 88 88 89 89 const char *args; /* Args passed to diff */ 90 90 const char *file[DIFF_COUNT]; /* filenames */ 91 char *orig_file[DIFF_COUNT]; /* original filenames */ 91 92 char *label[DIFF_COUNT]; 92 93 FBUF *f[DIFF_COUNT]; 93 94 const char *backup_sufix; -
src/diffviewer/ydiff.c
diff --git a/src/diffviewer/ydiff.c b/src/diffviewer/ydiff.c index 59e1dd8..f30faa9 100644
a b do_merge_hunk (WDiff * dview, action_direction_t merge_direction) 2194 2194 2195 2195 if (hunk > 0) 2196 2196 { 2197 int merge_file_fd ;2197 int merge_file_fd, temp_file_fd, file_fd; 2198 2198 FILE *merge_file; 2199 vfs_path_t *merge_file_name_vpath = NULL; 2199 vfs_path_t *merge_file_name_vpath = NULL, *temp_file_vpath = NULL; 2200 const char *ext; 2200 2201 2201 2202 if (!dview->merged[n_merge]) 2202 2203 { 2203 dview->merged[n_merge] = mc_util_make_backup_if_possible (dview->file[n_merge], "~~~"); 2204 GString *buff; 2205 2206 buff = g_string_new(""); 2207 temp_file_vpath = vfs_path_from_str (dview->file[n_merge]); 2208 file_fd = mc_open (temp_file_vpath, O_RDONLY); 2209 vfs_path_free (temp_file_vpath); 2210 temp_file_vpath = NULL; 2211 if (file_fd == -1) 2212 { 2213 message (D_ERROR, MSG_ERROR, _("Cannot open file\n%s"), 2214 unix_error_string (errno)); 2215 return; 2216 } 2217 temp_file_fd = mc_mkstemps (&temp_file_vpath, (n_merge ? "mcdiff1" : "mcdiff2"), NULL); 2218 if (temp_file_fd == -1) 2219 { 2220 message (D_ERROR, MSG_ERROR, _("Cannot create temporary file\n%s"), 2221 unix_error_string (errno)); 2222 vfs_path_free (temp_file_vpath); 2223 return; 2224 } 2225 mc_close (temp_file_fd); 2226 2227 /* save original file */ 2228 dview->orig_file[n_merge] = (char *) dview->file[n_merge]; 2229 dview->file[n_merge] = vfs_path_to_str (temp_file_vpath); 2230 vfs_path_free (temp_file_vpath); 2231 ext = extension(dview->orig_file[n_merge]); 2232 /* if no extension extension() return "" not NULL */ 2233 if (ext[0] != '\0') 2234 { 2235 g_string_printf (buff, "%s.%s", dview->file[n_merge], ext); 2236 if (!rename (dview->file[n_merge], buff->str)) 2237 { 2238 g_free ((char *)dview->file[n_merge]); 2239 dview->file[n_merge] = g_string_free (buff, FALSE); 2240 } 2241 else 2242 { 2243 g_string_free (buff, TRUE); 2244 } 2245 } 2246 2247 dview->merged[n_merge] = mc_util_make_backup_if_possible_from (dview->orig_file[n_merge], 2248 dview->file[n_merge], ""); 2204 2249 if (!dview->merged[n_merge]) 2205 2250 { 2206 2251 message (D_ERROR, MSG_ERROR, 2207 _("Cannot create backup file\n%s%s\n%s"), 2208 dview->file[n_merge], "~~~", unix_error_string (errno)); 2252 _("Cannot create backup file\n%s\n%s"), 2253 dview->file[n_merge], unix_error_string (errno)); 2254 g_free ((char *) dview->file[n_merge]); 2255 dview->file[n_merge] = dview->orig_file[n_merge]; 2256 dview->orig_file[n_merge] = NULL; 2209 2257 return; 2210 2258 } 2211 2259 } … … dview_init (WDiff * dview, const char *args, const char *file1, const char *file 2426 2474 dview->file[DIFF_RIGHT] = file2; 2427 2475 dview->label[DIFF_LEFT] = g_strdup (label1); 2428 2476 dview->label[DIFF_RIGHT] = g_strdup (label2); 2477 dview->orig_file[DIFF_LEFT] = NULL; 2478 dview->orig_file[DIFF_RIGHT] = NULL; 2429 2479 dview->f[DIFF_LEFT] = f[0]; 2430 2480 dview->f[DIFF_RIGHT] = f[1]; 2431 2481 dview->merged[DIFF_LEFT] = FALSE; … … dview_save (WDiff * dview) 2999 3049 3000 3050 if (dview->merged[DIFF_LEFT]) 3001 3051 { 3002 res = mc_util_unlink_backup_if_possible (dview->file[DIFF_LEFT], "~~~"); 3052 res = mc_util_restore_from_backup_if_possible_to (dview->orig_file[DIFF_LEFT], 3053 dview->file[DIFF_LEFT], ""); 3054 mc_util_unlink_backup_if_possible (dview->file[DIFF_LEFT], ""); 3055 g_free ((char *) dview->file[DIFF_LEFT]); 3056 dview->file[DIFF_LEFT] = dview->orig_file[DIFF_LEFT]; 3057 dview->orig_file[DIFF_LEFT] = NULL; 3003 3058 dview->merged[DIFF_LEFT] = !res; 3004 3059 } 3005 3060 if (dview->merged[DIFF_RIGHT]) 3006 3061 { 3007 res = mc_util_unlink_backup_if_possible (dview->file[DIFF_RIGHT], "~~~"); 3062 res = mc_util_restore_from_backup_if_possible_to (dview->orig_file[DIFF_RIGHT], 3063 dview->file[DIFF_RIGHT], ""); 3064 mc_util_unlink_backup_if_possible (dview->file[DIFF_RIGHT], ""); 3065 g_free ((char *) dview->file[DIFF_RIGHT]); 3066 dview->file[DIFF_RIGHT] = dview->orig_file[DIFF_RIGHT]; 3067 dview->orig_file[DIFF_RIGHT] = NULL; 3008 3068 dview->merged[DIFF_RIGHT] = !res; 3009 3069 } 3010 3070 return res; … … dview_ok_to_exit (WDiff * dview) 3112 3172 res = TRUE; 3113 3173 break; 3114 3174 case 1: /* No */ 3115 if (mc_util_restore_from_backup_if_possible (dview->file[DIFF_LEFT], "~~~")) 3116 res = mc_util_unlink_backup_if_possible (dview->file[DIFF_LEFT], "~~~"); 3117 if (mc_util_restore_from_backup_if_possible (dview->file[DIFF_RIGHT], "~~~")) 3118 res = mc_util_unlink_backup_if_possible (dview->file[DIFF_RIGHT], "~~~"); 3175 if (dview->merged[DIFF_LEFT]) 3176 { 3177 mc_util_unlink_backup_if_possible (dview->file[DIFF_LEFT], ""); 3178 g_free ((char *) dview->file[DIFF_LEFT]); 3179 dview->file[DIFF_LEFT] = dview->orig_file[DIFF_LEFT]; 3180 dview->orig_file[DIFF_LEFT] = NULL; 3181 } 3182 if (dview->merged[DIFF_RIGHT]) 3183 { 3184 mc_util_unlink_backup_if_possible (dview->file[DIFF_RIGHT], ""); 3185 g_free ((char *) dview->file[DIFF_RIGHT]); 3186 dview->file[DIFF_RIGHT] = dview->orig_file[DIFF_RIGHT]; 3187 dview->orig_file[DIFF_RIGHT] = NULL; 3188 } 3119 3189 /* fall through */ 3120 3190 default: 3121 3191 res = TRUE;