diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-10-22 07:08:26 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-10-22 07:08:26 +0300 |
commit | 24162c977c2aac79690fa421289a146c0f2677c8 (patch) | |
tree | 5b2d8914569f148ffb203373988e9464cd8fcfed | |
parent | 64a6c78a9a2a789b5be6ba5e3162a10f90a2ac5c (diff) |
Prevent G.fileflags changes when WM_OT_save_mainfile() is called from script
This is to solve an issue where a blend file could be compressed
unbeknownst to the artist. This happened in the following situtation:
- Artist edits an uncompressed blend file.
- Some script saves a compressed blendfile to a separate location.
- When the artist saves the file (s)he is editing (File>Save, or Ctrl+S),
it was silently compressed.
Cherry pick from: cd3b313d5f44a10a1150bf1ddb560775d1bcd827
-rw-r--r-- | source/blender/windowmanager/intern/wm_files.c | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index 6182a8c5ec6..87ca7310971 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -1128,12 +1128,12 @@ bool write_crash_blend(void) /** * \see #wm_homefile_write_exec wraps #BLO_write_file in a similar way. */ -static int wm_file_write(bContext *C, const char *filepath, int fileflags, ReportList *reports) +static bool wm_file_write(bContext *C, const char *filepath, int fileflags, ReportList *reports) { Main *bmain = CTX_data_main(C); Library *li; int len; - int ret = -1; + int ok = false; BlendThumbnail *thumb, *main_thumb; ImBuf *ibuf_thumb = NULL; @@ -1141,18 +1141,18 @@ static int wm_file_write(bContext *C, const char *filepath, int fileflags, Repor if (len == 0) { BKE_report(reports, RPT_ERROR, "Path is empty, cannot save"); - return ret; + return ok; } if (len >= FILE_MAX) { BKE_report(reports, RPT_ERROR, "Path too long, cannot save"); - return ret; + return ok; } /* Check if file write permission is ok */ if (BLI_exists(filepath) && !BLI_file_is_writable(filepath)) { BKE_reportf(reports, RPT_ERROR, "Cannot save blend file, path '%s' is not writable", filepath); - return ret; + return ok; } /* note: used to replace the file extension (to ensure '.blend'), @@ -1163,7 +1163,7 @@ static int wm_file_write(bContext *C, const char *filepath, int fileflags, Repor for (li = bmain->library.first; li; li = li->id.next) { if (BLI_path_cmp(li->filepath, filepath) == 0) { BKE_reportf(reports, RPT_ERROR, "Cannot overwrite used library '%.240s'", filepath); - return ret; + return ok; } } @@ -1226,7 +1226,8 @@ static int wm_file_write(bContext *C, const char *filepath, int fileflags, Repor ibuf_thumb = IMB_thumb_create(filepath, THB_LARGE, THB_SOURCE_BLEND, ibuf_thumb); } - ret = 0; /* Success. */ + /* Success. */ + ok = true; } if (ibuf_thumb) { @@ -1238,7 +1239,7 @@ static int wm_file_write(bContext *C, const char *filepath, int fileflags, Repor WM_cursor_wait(0); - return ret; + return ok; } /************************ autosave ****************************/ @@ -1415,6 +1416,7 @@ void WM_file_tag_modified(void) /** * \see #wm_file_write wraps #BLO_write_file in a similar way. + * \return success. */ static int wm_homefile_write_exec(bContext *C, wmOperator *op) { @@ -2092,7 +2094,6 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op) { Main *bmain = CTX_data_main(C); char path[FILE_MAX]; - int fileflags; const bool is_save_as = (op->type->invoke == wm_save_as_mainfile_invoke); save_set_compress(op); @@ -2105,7 +2106,8 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op) wm_filepath_default(path); } - fileflags = G.fileflags & ~G_FILE_USERPREFS; + const int fileflags_orig = G.fileflags; + int fileflags = G.fileflags & ~G_FILE_USERPREFS; /* set compression flag */ SET_FLAG_FROM_TEST( @@ -2120,8 +2122,18 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op) RNA_boolean_get(op->ptr, "copy")), G_FILE_SAVE_COPY); - if (wm_file_write(C, path, fileflags, op->reports) != 0) + const bool ok = wm_file_write(C, path, fileflags, op->reports); + + if ((op->flag & OP_IS_INVOKE) == 0) { + /* OP_IS_INVOKE is set when the operator is called from the GUI. + * If it is not set, the operator is called from a script and + * shouldn't influence G.fileflags. */ + G.fileflags = fileflags_orig; + } + + if (ok == false) { return OPERATOR_CANCELLED; + } WM_event_add_notifier(C, NC_WM | ND_FILESAVE, NULL); |