Ticket #2510: mc.2510_2.diff
File mc.2510_2.diff, 10.1 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..1ee0e38 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 */ 92 char *tempdir; /* temporary directory */ 91 93 char *label[DIFF_COUNT]; 92 94 FBUF *f[DIFF_COUNT]; 93 95 const char *backup_sufix; -
src/diffviewer/ydiff.c
diff --git a/src/diffviewer/ydiff.c b/src/diffviewer/ydiff.c index 59e1dd8..5e076bf 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; 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 char *tmp_filename; 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 temp_file_fd = mc_mkstemps (&temp_file_vpath, "mcdiff", NULL); 2205 if (temp_file_fd == -1) 2206 { 2207 message (D_ERROR, MSG_ERROR, _("Cannot create temporary file\n%s"), 2208 unix_error_string (errno)); 2209 vfs_path_free (temp_file_vpath); 2210 return; 2211 } 2212 mc_close (temp_file_fd); 2213 2214 /* save original file */ 2215 dview->orig_file[n_merge] = (char *) dview->file[n_merge]; 2216 dview->file[n_merge] = vfs_path_to_str (temp_file_vpath); 2217 vfs_path_free (temp_file_vpath); 2218 2219 if (dview->tempdir == NULL) 2220 { 2221 dview->tempdir = g_build_filename (mc_tmpdir (), "mcdiffXXXXXX", (char *) NULL); 2222 if (dview->tempdir == NULL || g_mkdtemp (dview->tempdir) == NULL) 2223 { 2224 message (D_ERROR, MSG_ERROR, _("Cannot create temp directory\n%s"), 2225 unix_error_string (errno)); 2226 if (dview->tempdir) 2227 { 2228 g_free (dview->tempdir); 2229 dview->tempdir = NULL; 2230 } 2231 } 2232 } 2233 if (dview->tempdir) 2234 { 2235 char *base; 2236 2237 base = g_path_get_basename (dview->orig_file[n_merge]); 2238 tmp_filename = g_build_filename (dview->tempdir, base, (char *) NULL); 2239 g_free (base); 2240 if (!rename (dview->file[n_merge], tmp_filename)) 2241 { 2242 g_free ((char *)dview->file[n_merge]); 2243 dview->file[n_merge] = tmp_filename; 2244 } 2245 else 2246 { 2247 g_free (tmp_filename); 2248 } 2249 } 2250 2251 dview->merged[n_merge] = mc_util_make_backup_if_possible_from (dview->orig_file[n_merge], 2252 dview->file[n_merge], ""); 2204 2253 if (!dview->merged[n_merge]) 2205 2254 { 2206 2255 message (D_ERROR, MSG_ERROR, 2207 _("Cannot create backup file\n%s%s\n%s"), 2208 dview->file[n_merge], "~~~", unix_error_string (errno)); 2256 _("Cannot create backup file\n%s\n%s"), 2257 dview->file[n_merge], unix_error_string (errno)); 2258 g_free ((char *) dview->file[n_merge]); 2259 dview->file[n_merge] = dview->orig_file[n_merge]; 2260 dview->orig_file[n_merge] = NULL; 2209 2261 return; 2210 2262 } 2211 2263 } … … dview_init (WDiff * dview, const char *args, const char *file1, const char *file 2426 2478 dview->file[DIFF_RIGHT] = file2; 2427 2479 dview->label[DIFF_LEFT] = g_strdup (label1); 2428 2480 dview->label[DIFF_RIGHT] = g_strdup (label2); 2481 dview->orig_file[DIFF_LEFT] = NULL; 2482 dview->orig_file[DIFF_RIGHT] = NULL; 2483 dview->tempdir = NULL; 2429 2484 dview->f[DIFF_LEFT] = f[0]; 2430 2485 dview->f[DIFF_RIGHT] = f[1]; 2431 2486 dview->merged[DIFF_LEFT] = FALSE; … … dview_fini (WDiff * dview) 2507 2562 g_array_free (dview->a[DIFF_RIGHT], TRUE); 2508 2563 dview->a[DIFF_RIGHT] = NULL; 2509 2564 } 2565 if (dview->tempdir) 2566 { 2567 rmdir (dview->tempdir); 2568 g_free (dview->tempdir); 2569 } 2510 2570 2511 2571 g_free (dview->label[DIFF_LEFT]); 2512 2572 g_free (dview->label[DIFF_RIGHT]); … … dview_save (WDiff * dview) 2999 3059 3000 3060 if (dview->merged[DIFF_LEFT]) 3001 3061 { 3002 res = mc_util_unlink_backup_if_possible (dview->file[DIFF_LEFT], "~~~"); 3062 res = mc_util_restore_from_backup_if_possible_to (dview->orig_file[DIFF_LEFT], 3063 dview->file[DIFF_LEFT], ""); 3064 mc_util_unlink_backup_if_possible (dview->file[DIFF_LEFT], ""); 3065 g_free ((char *) dview->file[DIFF_LEFT]); 3066 dview->file[DIFF_LEFT] = dview->orig_file[DIFF_LEFT]; 3067 dview->orig_file[DIFF_LEFT] = NULL; 3003 3068 dview->merged[DIFF_LEFT] = !res; 3004 3069 } 3005 3070 if (dview->merged[DIFF_RIGHT]) 3006 3071 { 3007 res = mc_util_unlink_backup_if_possible (dview->file[DIFF_RIGHT], "~~~"); 3072 res = mc_util_restore_from_backup_if_possible_to (dview->orig_file[DIFF_RIGHT], 3073 dview->file[DIFF_RIGHT], ""); 3074 mc_util_unlink_backup_if_possible (dview->file[DIFF_RIGHT], ""); 3075 g_free ((char *) dview->file[DIFF_RIGHT]); 3076 dview->file[DIFF_RIGHT] = dview->orig_file[DIFF_RIGHT]; 3077 dview->orig_file[DIFF_RIGHT] = NULL; 3008 3078 dview->merged[DIFF_RIGHT] = !res; 3009 3079 } 3010 3080 return res; … … dview_ok_to_exit (WDiff * dview) 3112 3182 res = TRUE; 3113 3183 break; 3114 3184 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], "~~~"); 3185 if (dview->merged[DIFF_LEFT]) 3186 { 3187 mc_util_unlink_backup_if_possible (dview->file[DIFF_LEFT], ""); 3188 g_free ((char *) dview->file[DIFF_LEFT]); 3189 dview->file[DIFF_LEFT] = dview->orig_file[DIFF_LEFT]; 3190 dview->orig_file[DIFF_LEFT] = NULL; 3191 } 3192 if (dview->merged[DIFF_RIGHT]) 3193 { 3194 mc_util_unlink_backup_if_possible (dview->file[DIFF_RIGHT], ""); 3195 g_free ((char *) dview->file[DIFF_RIGHT]); 3196 dview->file[DIFF_RIGHT] = dview->orig_file[DIFF_RIGHT]; 3197 dview->orig_file[DIFF_RIGHT] = NULL; 3198 } 3119 3199 /* fall through */ 3120 3200 default: 3121 3201 res = TRUE;