[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37098] trunk/blender/source/blender: fix for [#27410] Manual save kills actual .blend file if disk space is low

Andrea Weikert elubie at gmx.net
Thu Jun 2 14:44:59 CEST 2011


Revision: 37098
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37098
Author:   elubie
Date:     2011-06-02 12:44:59 +0000 (Thu, 02 Jun 2011)
Log Message:
-----------
fix for [#27410] Manual save kills actual .blend file if disk space is low
- moved do_history into WM_write_file after successful write of .blend@ temporary file
- Added new file flag, to avoid writing history on writing the startup.blend, autosave files and undo.

Thanks Campbell, Brecht for review!

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_global.h
    trunk/blender/source/blender/blenkernel/intern/blender.c
    trunk/blender/source/blender/blenloader/intern/writefile.c
    trunk/blender/source/blender/windowmanager/intern/wm_files.c

Modified: trunk/blender/source/blender/blenkernel/BKE_global.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_global.h	2011-06-02 12:21:55 UTC (rev 37097)
+++ trunk/blender/source/blender/blenkernel/BKE_global.h	2011-06-02 12:44:59 UTC (rev 37098)
@@ -145,6 +145,7 @@
 #define G_FILE_IGNORE_DEPRECATION_WARNINGS	(1 << 22)	/* deprecated */
 #define G_FILE_RECOVER			 (1 << 23)
 #define G_FILE_RELATIVE_REMAP	 (1 << 24)
+#define G_FILE_HISTORY			 (1 << 25)
 
 /* G.windowstate */
 #define G_WINDOWSTATE_USERDEF		0

Modified: trunk/blender/source/blender/blenkernel/intern/blender.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/blender.c	2011-06-02 12:21:55 UTC (rev 37097)
+++ trunk/blender/source/blender/blenkernel/intern/blender.c	2011-06-02 12:44:59 UTC (rev 37098)
@@ -523,7 +523,8 @@
 		static int counter= 0;
 		char filepath[FILE_MAXDIR+FILE_MAXFILE];
 		char numstr[32];
-		
+		int fileflags = G.fileflags & ~(G_FILE_HISTORY); /* don't do file history on undo */
+
 		/* calculate current filepath */
 		counter++;
 		counter= counter % U.undosteps;	
@@ -531,7 +532,7 @@
 		BLI_snprintf(numstr, sizeof(numstr), "%d.blend", counter);
 		BLI_make_file_string("/", filepath, btempdir, numstr);
 	
-		success= BLO_write_file(CTX_data_main(C), filepath, G.fileflags, NULL, NULL);
+		success= BLO_write_file(CTX_data_main(C), filepath, fileflags, NULL, NULL);
 		
 		BLI_strncpy(curundo->str, filepath, sizeof(curundo->str));
 	}

Modified: trunk/blender/source/blender/blenloader/intern/writefile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/writefile.c	2011-06-02 12:21:55 UTC (rev 37097)
+++ trunk/blender/source/blender/blenloader/intern/writefile.c	2011-06-02 12:44:59 UTC (rev 37098)
@@ -2520,6 +2520,41 @@
 	return endwrite(wd);
 }
 
+/* do reverse file history: .blend1 -> .blend2, .blend -> .blend1 */
+/* return: success(0), failure(1) */
+static int do_history(const char *name, ReportList *reports)
+{
+	char tempname1[FILE_MAXDIR+FILE_MAXFILE], tempname2[FILE_MAXDIR+FILE_MAXFILE];
+	int hisnr= U.versions;
+	
+	if(U.versions==0) return 0;
+	if(strlen(name)<2) {
+		BKE_report(reports, RPT_ERROR, "Unable to make version backup: filename too short");
+		return 1;
+	}
+		
+	while(hisnr > 1) {
+		BLI_snprintf(tempname1, sizeof(tempname1), "%s%d", name, hisnr-1);
+		BLI_snprintf(tempname2, sizeof(tempname2), "%s%d", name, hisnr);
+	
+		if(BLI_rename(tempname1, tempname2)) {
+			BKE_report(reports, RPT_ERROR, "Unable to make version backup");
+			return 1;
+		}	
+		hisnr--;
+	}
+
+	/* is needed when hisnr==1 */
+	BLI_snprintf(tempname1, sizeof(tempname1), "%s%d", name, hisnr);
+
+	if(BLI_rename(name, tempname1)) {
+		BKE_report(reports, RPT_ERROR, "Unable to make version backup");
+		return 1;
+	}
+
+	return 0;
+}
+
 /* return: success (1) */
 int BLO_write_file(Main *mainvar, const char *filepath, int write_flags, ReportList *reports, int *thumb)
 {
@@ -2571,45 +2606,52 @@
 	err= write_file_handle(mainvar, file, NULL,NULL, write_user_block, write_flags, thumb);
 	close(file);
 
-	/* rename/compress */
-	if(!err) {
-		if(write_flags & G_FILE_COMPRESS) {
-			/* compressed files have the same ending as regular files... only from 2.4!!! */
-			char gzname[FILE_MAXDIR+FILE_MAXFILE+4];
-			int ret;
+	if (err) {
+		BKE_report(reports, RPT_ERROR, strerror(errno));
+		remove(tempname);
 
-			/* first write compressed to separate @.gz */
-			BLI_snprintf(gzname, sizeof(gzname), "%s at .gz", filepath);
-			ret = BLI_gzip(tempname, gzname);
-			
-			if(0==ret) {
-				/* now rename to real file name, and delete temp @ file too */
-				if(BLI_rename(gzname, filepath) != 0) {
-					BKE_report(reports, RPT_ERROR, "Can't change old file. File saved with @.");
-					return 0;
-				}
+		return 0;
+	}
 
-				BLI_delete(tempname, 0, 0);
-			}
-			else if(-1==ret) {
-				BKE_report(reports, RPT_ERROR, "Failed opening .gz file.");
+	/* file save to temporary file was successful */
+	/* now do reverse file history (move .blend1 -> .blend2, .blend -> .blend1) */
+	if (write_flags & G_FILE_HISTORY) { 
+		int err_hist = do_history(filepath, reports);
+		if (err_hist) {
+			BKE_report(reports, RPT_ERROR, "Version backup failed. File saved with @");
+			return 0;
+		}
+	}
+
+	if(write_flags & G_FILE_COMPRESS) {
+		/* compressed files have the same ending as regular files... only from 2.4!!! */
+		char gzname[FILE_MAXDIR+FILE_MAXFILE+4];
+		int ret;
+
+		/* first write compressed to separate @.gz */
+		BLI_snprintf(gzname, sizeof(gzname), "%s at .gz", filepath);
+		ret = BLI_gzip(tempname, gzname);
+		
+		if(0==ret) {
+			/* now rename to real file name, and delete temp @ file too */
+			if(BLI_rename(gzname, filepath) != 0) {
+				BKE_report(reports, RPT_ERROR, "Can't change old file. File saved with @.");
 				return 0;
 			}
-			else if(-2==ret) {
-				BKE_report(reports, RPT_ERROR, "Failed opening .blend file for compression.");
-				return 0;
-			}
+
+			BLI_delete(tempname, 0, 0);
 		}
-		else if(BLI_rename(tempname, filepath) != 0) {
-			BKE_report(reports, RPT_ERROR, "Can't change old file. File saved with @");
+		else if(-1==ret) {
+			BKE_report(reports, RPT_ERROR, "Failed opening .gz file.");
 			return 0;
 		}
-		
+		else if(-2==ret) {
+			BKE_report(reports, RPT_ERROR, "Failed opening .blend file for compression.");
+			return 0;
+		}
 	}
-	else {
-		BKE_report(reports, RPT_ERROR, strerror(errno));
-		remove(tempname);
-
+	else if(BLI_rename(tempname, filepath) != 0) {
+		BKE_report(reports, RPT_ERROR, "Can't change old file. File saved with @");
 		return 0;
 	}
 

Modified: trunk/blender/source/blender/windowmanager/intern/wm_files.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_files.c	2011-06-02 12:21:55 UTC (rev 37097)
+++ trunk/blender/source/blender/windowmanager/intern/wm_files.c	2011-06-02 12:44:59 UTC (rev 37098)
@@ -620,31 +620,6 @@
 	}
 }
 
-static void do_history(char *name, ReportList *reports)
-{
-	char tempname1[FILE_MAXDIR+FILE_MAXFILE], tempname2[FILE_MAXDIR+FILE_MAXFILE];
-	int hisnr= U.versions;
-	
-	if(U.versions==0) return;
-	if(strlen(name)<2) return;
-		
-	while(hisnr > 1) {
-		BLI_snprintf(tempname1, sizeof(tempname1), "%s%d", name, hisnr-1);
-		BLI_snprintf(tempname2, sizeof(tempname2), "%s%d", name, hisnr);
-	
-		if(BLI_rename(tempname1, tempname2))
-			BKE_report(reports, RPT_ERROR, "Unable to make version backup");
-			
-		hisnr--;
-	}
-
-	/* is needed when hisnr==1 */
-	BLI_snprintf(tempname1, sizeof(tempname1), "%s%d", name, hisnr);
-
-	if(BLI_rename(name, tempname1))
-		BKE_report(reports, RPT_ERROR, "Unable to make version backup");
-}
-
 static ImBuf *blend_file_thumb(Scene *scene, int **thumb_pt)
 {
 	/* will be scaled down, but gives some nice oversampling */
@@ -693,9 +668,11 @@
 int write_crash_blend(void)
 {
 	char path[FILE_MAX];
+	int fileflags = G.fileflags & ~(G_FILE_HISTORY); /* don't do file history on crash file */
+
 	BLI_strncpy(path, G.main->name, sizeof(path));
 	BLI_replace_extension(path, sizeof(path), "_crash.blend");
-	if(BLO_write_file(G.main, path, G.fileflags, NULL, NULL)) {
+	if(BLO_write_file(G.main, path, fileflags, NULL, NULL)) {
 		printf("written: %s\n", path);
 		return 1;
 	}
@@ -753,8 +730,7 @@
 	/* blend file thumbnail */
 	ibuf_thumb= blend_file_thumb(CTX_data_scene(C), &thumb);
 
-	/* rename to .blend1, do this as last before write */
-	do_history(filepath, reports);
+	fileflags |= G_FILE_HISTORY; /* write file history */
 
 	if (BLO_write_file(CTX_data_main(C), filepath, fileflags, reports, thumb)) {
 		if(!copy) {
@@ -809,7 +785,7 @@
 	printf("trying to save homefile at %s ", filepath);
 	
 	/*  force save as regular blend file */
-	fileflags = G.fileflags & ~(G_FILE_COMPRESS | G_FILE_AUTOPLAY | G_FILE_LOCK | G_FILE_SIGN);
+	fileflags = G.fileflags & ~(G_FILE_COMPRESS | G_FILE_AUTOPLAY | G_FILE_LOCK | G_FILE_SIGN | G_FILE_HISTORY);
 
 	if(BLO_write_file(CTX_data_main(C), filepath, fileflags, op->reports, NULL) == 0) {
 		printf("fail\n");
@@ -883,7 +859,7 @@
 	wm_autosave_location(filepath);
 
 	/*  force save as regular blend file */
-	fileflags = G.fileflags & ~(G_FILE_COMPRESS|G_FILE_AUTOPLAY |G_FILE_LOCK|G_FILE_SIGN);
+	fileflags = G.fileflags & ~(G_FILE_COMPRESS|G_FILE_AUTOPLAY |G_FILE_LOCK|G_FILE_SIGN|G_FILE_HISTORY);
 
 	/* no error reporting to console */
 	BLO_write_file(CTX_data_main(C), filepath, fileflags, NULL, NULL);




More information about the Bf-blender-cvs mailing list