Ticket #2510: mc.2510.diff

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

mcdiff use temporary files for merge

  • 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..1d025af 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 */ 
    9192    char *label[DIFF_COUNT]; 
    9293    FBUF *f[DIFF_COUNT]; 
    9394    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) 
    21942194 
    21952195    if (hunk > 0) 
    21962196    { 
    2197         int merge_file_fd; 
     2197        int merge_file_fd, temp_file_fd, 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        const char *ext; 
    22002201 
    22012202        if (!dview->merged[n_merge]) 
    22022203        { 
    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], ""); 
    22042249            if (!dview->merged[n_merge]) 
    22052250            { 
    22062251                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; 
    22092257                return; 
    22102258            } 
    22112259        } 
    dview_init (WDiff * dview, const char *args, const char *file1, const char *file 
    24262474    dview->file[DIFF_RIGHT] = file2; 
    24272475    dview->label[DIFF_LEFT] = g_strdup (label1); 
    24282476    dview->label[DIFF_RIGHT] = g_strdup (label2); 
     2477    dview->orig_file[DIFF_LEFT] = NULL; 
     2478    dview->orig_file[DIFF_RIGHT] = NULL; 
    24292479    dview->f[DIFF_LEFT] = f[0]; 
    24302480    dview->f[DIFF_RIGHT] = f[1]; 
    24312481    dview->merged[DIFF_LEFT] = FALSE; 
    dview_save (WDiff * dview) 
    29993049 
    30003050    if (dview->merged[DIFF_LEFT]) 
    30013051    { 
    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; 
    30033058        dview->merged[DIFF_LEFT] = !res; 
    30043059    } 
    30053060    if (dview->merged[DIFF_RIGHT]) 
    30063061    { 
    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; 
    30083068        dview->merged[DIFF_RIGHT] = !res; 
    30093069    } 
    30103070    return res; 
    dview_ok_to_exit (WDiff * dview) 
    31123172        res = TRUE; 
    31133173        break; 
    31143174    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        } 
    31193189        /* fall through */ 
    31203190    default: 
    31213191        res = TRUE;