Fix reports printing twice when called from Python in background-mode
Calling operators in background-mode always printed with the assumption that output should never be hidden. However operators called from `bpy.ops` were also printing reports to the `stdout` (needed for the Python console and generally useful). Resolve by adding a flag to signal that the owner of the ReportList is responsible for printing to the `stdout`.
This commit is contained in:
		@@ -258,10 +258,20 @@ char *BKE_reports_string(ReportList *reports, eReportType level)
 | 
			
		||||
 | 
			
		||||
bool BKE_reports_print_test(const ReportList *reports, eReportType type)
 | 
			
		||||
{
 | 
			
		||||
  if (reports == NULL) {
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
  if (reports->flag & RPT_PRINT_HANDLED_BY_OWNER) {
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
  /* In background mode always print otherwise there are cases the errors won't be displayed,
 | 
			
		||||
   * but still add to the report list since this is used for python exception handling. */
 | 
			
		||||
  return (G.background || (reports == NULL) ||
 | 
			
		||||
          ((reports->flag & RPT_PRINT) && (type >= reports->printlevel)));
 | 
			
		||||
   * but still add to the report list since this is used for Python exception handling. */
 | 
			
		||||
  if (G.background) {
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Common case. */
 | 
			
		||||
  return (reports->flag & RPT_PRINT) && (type >= reports->printlevel);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void BKE_reports_print(ReportList *reports, eReportType level)
 | 
			
		||||
 
 | 
			
		||||
@@ -70,6 +70,8 @@ enum ReportListFlags {
 | 
			
		||||
  RPT_STORE = (1 << 1),
 | 
			
		||||
  RPT_FREE = (1 << 2),
 | 
			
		||||
  RPT_OP_HOLD = (1 << 3), /* don't move them into the operator global list (caller will use) */
 | 
			
		||||
  /** Don't print (the owner of the #ReportList will handle printing to the `stdout`). */
 | 
			
		||||
  RPT_PRINT_HANDLED_BY_OWNER = (1 << 4),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* These two Lines with # tell makesdna this struct can be excluded. */
 | 
			
		||||
 
 | 
			
		||||
@@ -289,7 +289,7 @@ static PyObject *pyop_call(PyObject *UNUSED(self), PyObject *args)
 | 
			
		||||
      reports = MEM_mallocN(sizeof(ReportList), "wmOperatorReportList");
 | 
			
		||||
 | 
			
		||||
      /* Own so these don't move into global reports. */
 | 
			
		||||
      BKE_reports_init(reports, RPT_STORE | RPT_OP_HOLD);
 | 
			
		||||
      BKE_reports_init(reports, RPT_STORE | RPT_OP_HOLD | RPT_PRINT_HANDLED_BY_OWNER);
 | 
			
		||||
 | 
			
		||||
#ifdef BPY_RELEASE_GIL
 | 
			
		||||
      /* release GIL, since a thread could be started from an operator
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user