Ticket #2510: mc.2510_2.diff

File mc.2510_2.diff, 10.1 KB (added by szaszg, 9 years ago)

use tmp dir for temp files with original filename

  • lib/util.c

    diff --git a/lib/util.c b/lib/util.c
    index b7787ab..3077fb4 100644
    a b Q_ (const char *s) 
    12911291/* --------------------------------------------------------------------------------------------- */ 
    12921292 
    12931293gboolean 
    1294 mc_util_make_backup_if_possible (const char *file_name, const char *backup_suffix) 
     1294mc_util_make_backup_if_possible_from (const char *file_name, const char *backup_name, const char *backup_suffix) 
    12951295{ 
    1296     struct stat stat_buf; 
    12971296    char *backup_path; 
     1297    struct stat stat_buf; 
    12981298    gboolean ret; 
     1299 
    12991300    if (!exist_file (file_name)) 
    13001301        return FALSE; 
    13011302 
    1302     backup_path = g_strdup_printf ("%s%s", file_name, backup_suffix); 
     1303    backup_path = g_strdup_printf ("%s%s", backup_name, backup_suffix); 
    13031304 
    13041305    if (backup_path == NULL) 
    13051306        return FALSE; 
    mc_util_make_backup_if_possible (const char *file_name, const char *backup_suffi 
    13141315        else 
    13151316            chmod (backup_path, S_IRUSR | S_IWUSR); 
    13161317    } 
    1317  
    13181318    g_free (backup_path); 
    13191319 
    13201320    return ret; 
    mc_util_make_backup_if_possible (const char *file_name, const char *backup_suffi 
    13231323/* --------------------------------------------------------------------------------------------- */ 
    13241324 
    13251325gboolean 
    1326 mc_util_restore_from_backup_if_possible (const char *file_name, const char *backup_suffix) 
     1326mc_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 
     1333gboolean 
     1334mc_util_restore_from_backup_if_possible_to (const char *file_name, const char *backup_name, const char *backup_suffix) 
    13271335{ 
    13281336    gboolean ret; 
    13291337    char *backup_path; 
    13301338 
    1331     backup_path = g_strdup_printf ("%s%s", file_name, backup_suffix); 
     1339    backup_path = g_strdup_printf ("%s%s", backup_name, backup_suffix); 
    13321340    if (backup_path == NULL) 
    13331341        return FALSE; 
    13341342 
    mc_util_restore_from_backup_if_possible (const char *file_name, const char *back 
    13411349/* --------------------------------------------------------------------------------------------- */ 
    13421350 
    13431351gboolean 
     1352mc_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 
     1359gboolean 
    13441360mc_util_unlink_backup_if_possible (const char *file_name, const char *backup_suffix) 
    13451361{ 
    13461362    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); 
    192192const char *Q_ (const char *s); 
    193193 
    194194gboolean mc_util_make_backup_if_possible (const char *, const char *); 
     195gboolean mc_util_make_backup_if_possible_from (const char *, const char *, const char *); 
    195196gboolean mc_util_restore_from_backup_if_possible (const char *, const char *); 
     197gboolean mc_util_restore_from_backup_if_possible_to (const char *, const char *, const char *); 
    196198gboolean mc_util_unlink_backup_if_possible (const char *, const char *); 
    197199 
    198200char *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 
    8888 
    8989    const char *args;           /* Args passed to diff */ 
    9090    const char *file[DIFF_COUNT];       /* filenames */ 
     91    char *orig_file[DIFF_COUNT];        /* original filenames */ 
     92    char *tempdir;                      /* temporary directory */ 
    9193    char *label[DIFF_COUNT]; 
    9294    FBUF *f[DIFF_COUNT]; 
    9395    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) 
    21942194 
    21952195    if (hunk > 0) 
    21962196    { 
    2197         int merge_file_fd; 
     2197        int merge_file_fd, temp_file_fd; 
    21982198        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; 
    22002201 
    22012202        if (!dview->merged[n_merge]) 
    22022203        { 
    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], ""); 
    22042253            if (!dview->merged[n_merge]) 
    22052254            { 
    22062255                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; 
    22092261                return; 
    22102262            } 
    22112263        } 
    dview_init (WDiff * dview, const char *args, const char *file1, const char *file 
    24262478    dview->file[DIFF_RIGHT] = file2; 
    24272479    dview->label[DIFF_LEFT] = g_strdup (label1); 
    24282480    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; 
    24292484    dview->f[DIFF_LEFT] = f[0]; 
    24302485    dview->f[DIFF_RIGHT] = f[1]; 
    24312486    dview->merged[DIFF_LEFT] = FALSE; 
    dview_fini (WDiff * dview) 
    25072562        g_array_free (dview->a[DIFF_RIGHT], TRUE); 
    25082563        dview->a[DIFF_RIGHT] = NULL; 
    25092564    } 
     2565    if (dview->tempdir) 
     2566    { 
     2567        rmdir (dview->tempdir); 
     2568        g_free (dview->tempdir); 
     2569    } 
    25102570 
    25112571    g_free (dview->label[DIFF_LEFT]); 
    25122572    g_free (dview->label[DIFF_RIGHT]); 
    dview_save (WDiff * dview) 
    29993059 
    30003060    if (dview->merged[DIFF_LEFT]) 
    30013061    { 
    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; 
    30033068        dview->merged[DIFF_LEFT] = !res; 
    30043069    } 
    30053070    if (dview->merged[DIFF_RIGHT]) 
    30063071    { 
    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; 
    30083078        dview->merged[DIFF_RIGHT] = !res; 
    30093079    } 
    30103080    return res; 
    dview_ok_to_exit (WDiff * dview) 
    31123182        res = TRUE; 
    31133183        break; 
    31143184    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        } 
    31193199        /* fall through */ 
    31203200    default: 
    31213201        res = TRUE;