Completed
Push — develop ( f01d35...658d0a )
by Gennady
18:18
created
future/includes/class-gv-view.php 1 patch
Spacing   +18 added lines, -19 removed lines patch added patch discarded remove patch
@@ -108,7 +108,7 @@  discard block
 block discarded – undo
108 108
 		$supports = array( 'title', 'revisions' );
109 109
 
110 110
 		if ( $is_hierarchical ) {
111
-			$supports[] = 'page-attributes';
111
+			$supports[ ] = 'page-attributes';
112 112
 		}
113 113
 
114 114
 		/**
@@ -282,7 +282,7 @@  discard block
 block discarded – undo
282 282
 		 * Editing a single entry.
283 283
 		 */
284 284
 		if ( $entry = $request->is_edit_entry() ) {
285
-			if ( $entry['status'] != 'active' ) {
285
+			if ( $entry[ 'status' ] != 'active' ) {
286 286
 				gravityview()->log->notice( 'Entry ID #{entry_id} is not active', array( 'entry_id' => $entry->ID ) );
287 287
 				return __( 'You are not allowed to view this content.', 'gravityview' );
288 288
 			}
@@ -293,7 +293,7 @@  discard block
 block discarded – undo
293 293
 			}
294 294
 
295 295
 			if ( $view->settings->get( 'show_only_approved' ) ) {
296
-				if ( ! \GravityView_Entry_Approval_Status::is_approved( gform_get_meta( $entry->ID, \GravityView_Entry_Approval::meta_key ) )  ) {
296
+				if ( ! \GravityView_Entry_Approval_Status::is_approved( gform_get_meta( $entry->ID, \GravityView_Entry_Approval::meta_key ) ) ) {
297 297
 					gravityview()->log->error( 'Entry ID #{entry_id} is not approved for viewing', array( 'entry_id' => $entry->ID ) );
298 298
 					return __( 'You are not allowed to view this content.', 'gravityview' );
299 299
 				}
@@ -306,7 +306,7 @@  discard block
 block discarded – undo
306 306
 		 * Viewing a single entry.
307 307
 		 */
308 308
 		} else if ( $entry = $request->is_entry() ) {
309
-			if ( $entry['status'] != 'active' ) {
309
+			if ( $entry[ 'status' ] != 'active' ) {
310 310
 				gravityview()->log->notice( 'Entry ID #{entry_id} is not active', array( 'entry_id' => $entry->ID ) );
311 311
 				return __( 'You are not allowed to view this content.', 'gravityview' );
312 312
 			}
@@ -317,7 +317,7 @@  discard block
 block discarded – undo
317 317
 			}
318 318
 
319 319
 			if ( $view->settings->get( 'show_only_approved' ) ) {
320
-				if ( ! \GravityView_Entry_Approval_Status::is_approved( gform_get_meta( $entry->ID, \GravityView_Entry_Approval::meta_key ) )  ) {
320
+				if ( ! \GravityView_Entry_Approval_Status::is_approved( gform_get_meta( $entry->ID, \GravityView_Entry_Approval::meta_key ) ) ) {
321 321
 					gravityview()->log->error( 'Entry ID #{entry_id} is not approved for viewing', array( 'entry_id' => $entry->ID ) );
322 322
 					return __( 'You are not allowed to view this content.', 'gravityview' );
323 323
 				}
@@ -365,11 +365,11 @@  discard block
 block discarded – undo
365 365
 		if ( ! $view->form ) {
366 366
 			gravityview()->log->error( 'View #{view_id} tried attaching non-existent Form #{form_id} to it.', array(
367 367
 				'view_id' => $view->ID,
368
-				'form_id' => $view->_gravityview_form_id ? : 0,
368
+				'form_id' => $view->_gravityview_form_id ?: 0,
369 369
 			) );
370 370
 		} else if ( gravityview()->plugin->supports( Plugin::FEATURE_JOINS ) ) {
371 371
 			/** And the connected joins. */
372
-			foreach( (array)get_post_meta( $view->ID, '_gravityview_form_joins', true ) as $_join ) {
372
+			foreach ( (array)get_post_meta( $view->ID, '_gravityview_form_joins', true ) as $_join ) {
373 373
 				if ( ! is_array( $_join ) || count( $_join ) != 4 ) {
374 374
 					continue;
375 375
 				}
@@ -381,7 +381,7 @@  discard block
 block discarded – undo
381 381
 				$join_column = is_numeric( $join_column ) ? GF_Field::by_id( $join, $join_column ) : Internal_Field( $join_column );
382 382
 				$join_on_column = is_numeric( $join_on_column ) ? GF_Field::by_id( $join_on, $join_on_column ) : Internal_Field( $join_on_column );
383 383
 
384
-				$view->joins []= new Join( $join, $join_column, $join_on, $join_on_column );
384
+				$view->joins [ ] = new Join( $join, $join_column, $join_on, $join_on_column );
385 385
 			}
386 386
 		}
387 387
 
@@ -610,21 +610,20 @@  discard block
 block discarded – undo
610 610
 			if ( $request instanceof REST\Request ) {
611 611
 				$atts = $this->settings->as_atts();
612 612
 				$paging_parameters = wp_parse_args( $request->get_paging(), array(
613
-						'paging' => array( 'page_size' => $atts['page_size'] ),
613
+						'paging' => array( 'page_size' => $atts[ 'page_size' ] ),
614 614
 					) );
615
-				$parameters['paging'] = $paging_parameters['paging'];
615
+				$parameters[ 'paging' ] = $paging_parameters[ 'paging' ];
616 616
 			}
617 617
 
618
-			$page = Utils::get( $parameters['paging'], 'current_page' ) ?
619
-				: ( ( ( $parameters['paging']['offset'] - $this->settings->get( 'offset' ) ) / $parameters['paging']['page_size'] ) + 1 );
618
+			$page = Utils::get( $parameters[ 'paging' ], 'current_page' ) ?: ( ( ( $parameters[ 'paging' ][ 'offset' ] - $this->settings->get( 'offset' ) ) / $parameters[ 'paging' ][ 'page_size' ] ) + 1 );
620 619
 
621 620
 			if ( gravityview()->plugin->supports( Plugin::FEATURE_GFQUERY ) ) {
622 621
 				/**
623 622
 				 * New \GF_Query stuff :)
624 623
 				 */
625
-				$query = new \GF_Query( $this->form->ID, $parameters['search_criteria'], $parameters['sorting'] );
624
+				$query = new \GF_Query( $this->form->ID, $parameters[ 'search_criteria' ], $parameters[ 'sorting' ] );
626 625
 
627
-				$query->limit( $parameters['paging']['page_size'] )
626
+				$query->limit( $parameters[ 'paging' ][ 'page_size' ] )
628 627
 					->page( $page );
629 628
 
630 629
 				/**
@@ -665,15 +664,15 @@  discard block
 block discarded – undo
665 664
 				} );
666 665
 			} else {
667 666
 				$entries = $this->form->entries
668
-					->filter( \GV\GF_Entry_Filter::from_search_criteria( $parameters['search_criteria'] ) )
667
+					->filter( \GV\GF_Entry_Filter::from_search_criteria( $parameters[ 'search_criteria' ] ) )
669 668
 					->offset( $this->settings->get( 'offset' ) )
670
-					->limit( $parameters['paging']['page_size'] )
669
+					->limit( $parameters[ 'paging' ][ 'page_size' ] )
671 670
 					->page( $page );
672 671
 				
673
-				if ( ! empty( $parameters['sorting'] ) && ! empty( $parameters['sorting']['key'] ) ) {
672
+				if ( ! empty( $parameters[ 'sorting' ] ) && ! empty( $parameters[ 'sorting' ][ 'key' ] ) ) {
674 673
 					$field = new \GV\Field();
675
-					$field->ID = $parameters['sorting']['key'];
676
-					$direction = strtolower( $parameters['sorting']['direction'] ) == 'asc' ? \GV\Entry_Sort::ASC : \GV\Entry_Sort::DESC;
674
+					$field->ID = $parameters[ 'sorting' ][ 'key' ];
675
+					$direction = strtolower( $parameters[ 'sorting' ][ 'direction' ] ) == 'asc' ? \GV\Entry_Sort::ASC : \GV\Entry_Sort::DESC;
677 676
 					$entries = $entries->sort( new \GV\Entry_Sort( $field, $direction ) );
678 677
 				}
679 678
 			}
Please login to merge, or discard this patch.
future/_mocks.php 1 patch
Spacing   +43 added lines, -46 removed lines patch added patch discarded remove patch
@@ -101,8 +101,7 @@  discard block
 block discarded – undo
101 101
 			$entries = $view->get_entries( gravityview()->request );
102 102
 		}
103 103
 
104
-		$page = \GV\Utils::get( $parameters['paging'], 'current_page' ) ?
105
-			: ( ( ( $parameters['paging']['offset'] - $view->settings->get( 'offset' ) ) / $parameters['paging']['page_size'] ) + 1 );
104
+		$page = \GV\Utils::get( $parameters[ 'paging' ], 'current_page' ) ?: ( ( ( $parameters[ 'paging' ][ 'offset' ] - $view->settings->get( 'offset' ) ) / $parameters[ 'paging' ][ 'page_size' ] ) + 1 );
106 105
 
107 106
 		/** Set paging, count and unwrap the entries. */
108 107
 		$paging = array(
@@ -141,16 +140,16 @@  discard block
 block discarded – undo
141 140
  * @return null|string The value of a field in an entry.
142 141
  */
143 142
 function GravityView_API_field_value( $entry, $field_settings, $format ) {
144
-	if ( empty( $entry['form_id'] ) || empty( $field_settings['id'] ) ) {
143
+	if ( empty( $entry[ 'form_id' ] ) || empty( $field_settings[ 'id' ] ) ) {
145 144
 		gravityview()->log->error( 'No entry or field_settings[id] supplied', array( 'data' => array( func_get_args() ) ) );
146 145
 		return null;
147 146
 	}
148 147
 
149
-	if ( ! empty( $entry['_multi'] ) && ! empty( $field_settings['form_id'] ) && ! empty( $entry['_multi'][ $field_settings['form_id'] ] ) ) {
150
-		$entry = $entry['_multi'][ $field_settings['form_id'] ];
148
+	if ( ! empty( $entry[ '_multi' ] ) && ! empty( $field_settings[ 'form_id' ] ) && ! empty( $entry[ '_multi' ][ $field_settings[ 'form_id' ] ] ) ) {
149
+		$entry = $entry[ '_multi' ][ $field_settings[ 'form_id' ] ];
151 150
 	}
152 151
 
153
-	if ( empty( $entry['id'] ) || ! $entry = \GV\GF_Entry::by_id( $entry['id'] ) ) {
152
+	if ( empty( $entry[ 'id' ] ) || ! $entry = \GV\GF_Entry::by_id( $entry[ 'id' ] ) ) {
154 153
 		gravityview()->log->error( 'Invalid \GV\GF_Entry supplied', array( 'data' => $entry ) );
155 154
 		return null;
156 155
 	}
@@ -160,18 +159,18 @@  discard block
 block discarded – undo
160 159
 	 *
161 160
 	 * Fields with a numeric ID are Gravity Forms ones.
162 161
 	 */
163
-	$source = is_numeric( $field_settings['id'] ) ? \GV\Source::BACKEND_GRAVITYFORMS : \GV\Source::BACKEND_INTERNAL;;
162
+	$source = is_numeric( $field_settings[ 'id' ] ) ? \GV\Source::BACKEND_GRAVITYFORMS : \GV\Source::BACKEND_INTERNAL; ;
164 163
 
165 164
 	/** Initialize the future field. */
166 165
 	switch ( $source ):
167 166
 		/** The Gravity Forms backend. */
168 167
 		case \GV\Source::BACKEND_GRAVITYFORMS:
169
-			if ( ! $form = \GV\GF_Form::by_id( $entry['form_id'] ) ) {
168
+			if ( ! $form = \GV\GF_Form::by_id( $entry[ 'form_id' ] ) ) {
170 169
 				gravityview()->log->error( 'No form Gravity Form found for entry', array( 'data' => $entry ) );
171 170
 				return null;
172 171
 			}
173 172
 
174
-			if ( ! $field = $form::get_field( $form, $field_settings['id'] ) ) {
173
+			if ( ! $field = $form::get_field( $form, $field_settings[ 'id' ] ) ) {
175 174
 				return null;
176 175
 			}
177 176
 
@@ -179,7 +178,7 @@  discard block
 block discarded – undo
179 178
 
180 179
 		/** Our internal backend. */
181 180
 		case \GV\Source::BACKEND_INTERNAL:
182
-			if ( ! $field = \GV\Internal_Source::get_field( $field_settings['id'] ) ) {
181
+			if ( ! $field = \GV\Internal_Source::get_field( $field_settings[ 'id' ] ) ) {
183 182
 				return null;
184 183
 			}
185 184
 
@@ -213,13 +212,13 @@  discard block
 block discarded – undo
213 212
 
214 213
 	/** A bail condition. */
215 214
 	$bail = function( $label, $field_settings, $entry, $force_show_label, $form ) {
216
-		if ( ! empty( $field_settings['show_label'] ) || $force_show_label ) {
215
+		if ( ! empty( $field_settings[ 'show_label' ] ) || $force_show_label ) {
217 216
 
218
-			$label = isset( $field_settings['label'] ) ? $field_settings['label'] : '';
217
+			$label = isset( $field_settings[ 'label' ] ) ? $field_settings[ 'label' ] : '';
219 218
 
220 219
 			// Use Gravity Forms label by default, but if a custom label is defined in GV, use it.
221
-			if ( ! empty( $field_settings['custom_label'] ) ) {
222
-				$label = \GravityView_API::replace_variables( $field_settings['custom_label'], $form, $entry );
220
+			if ( ! empty( $field_settings[ 'custom_label' ] ) ) {
221
+				$label = \GravityView_API::replace_variables( $field_settings[ 'custom_label' ], $form, $entry );
223 222
 			}
224 223
 
225 224
 			/**
@@ -245,19 +244,19 @@  discard block
 block discarded – undo
245 244
 
246 245
 	$label = '';
247 246
 
248
-	if ( ! empty( $entry['_multi'] ) && ! empty( $field_settings['form_id'] ) && ! empty( $entry['_multi'][ $field_settings['form_id'] ] ) ) {
249
-		$entry = $entry['_multi'][ $field_settings['form_id'] ];
250
-		if ( $_form = \GV\GF_Form::by_id( $field_settings['form_id'] ) ) {
247
+	if ( ! empty( $entry[ '_multi' ] ) && ! empty( $field_settings[ 'form_id' ] ) && ! empty( $entry[ '_multi' ][ $field_settings[ 'form_id' ] ] ) ) {
248
+		$entry = $entry[ '_multi' ][ $field_settings[ 'form_id' ] ];
249
+		if ( $_form = \GV\GF_Form::by_id( $field_settings[ 'form_id' ] ) ) {
251 250
 			$form = $_form->form;
252 251
 		}
253 252
 	}
254 253
 
255
-	if ( empty( $entry['form_id'] ) || empty( $field_settings['id'] ) ) {
254
+	if ( empty( $entry[ 'form_id' ] ) || empty( $field_settings[ 'id' ] ) ) {
256 255
 		gravityview()->log->error( 'No entry or field_settings[id] supplied', array( 'data' => array( func_get_args() ) ) );
257 256
 		return $bail( $label, $field_settings, $entry, $force_show_label, $form );
258 257
 	}
259 258
 
260
-	if ( empty( $entry['id'] ) || ! $gv_entry = \GV\GF_Entry::by_id( $entry['id'] ) ) {
259
+	if ( empty( $entry[ 'id' ] ) || ! $gv_entry = \GV\GF_Entry::by_id( $entry[ 'id' ] ) ) {
261 260
 		gravityview()->log->error( 'Invalid \GV\GF_Entry supplied', array( 'data' => $entry ) );
262 261
 		return $bail( $label, $field_settings, $entry, $force_show_label, $form );
263 262
 	}
@@ -269,31 +268,31 @@  discard block
 block discarded – undo
269 268
 	 *
270 269
 	 * Fields with a numeric ID are Gravity Forms ones.
271 270
 	 */
272
-	$source = is_numeric( $field_settings['id'] ) ? \GV\Source::BACKEND_GRAVITYFORMS : \GV\Source::BACKEND_INTERNAL;
271
+	$source = is_numeric( $field_settings[ 'id' ] ) ? \GV\Source::BACKEND_GRAVITYFORMS : \GV\Source::BACKEND_INTERNAL;
273 272
 
274 273
 	/** Initialize the future field. */
275 274
 	switch ( $source ):
276 275
 		/** The Gravity Forms backend. */
277 276
 		case \GV\Source::BACKEND_GRAVITYFORMS:
278
-			if ( ! $gf_form = \GV\GF_Form::by_id( $entry['form_id'] ) ) {
277
+			if ( ! $gf_form = \GV\GF_Form::by_id( $entry[ 'form_id' ] ) ) {
279 278
 				gravityview()->log->error( 'No form Gravity Form found for entry', array( 'data' => $entry ) );
280 279
 				return $bail( $label, $field_settings, $entry->as_entry(), $force_show_label, $form );
281 280
 			}
282 281
 
283
-			if ( ! $field = $gf_form::get_field( $gf_form, $field_settings['id'] ) ) {
284
-				gravityview()->log->error( 'No field found for specified form and field ID #{field_id}', array( 'field_id' => $field_settings['id'], 'data' => $form ) );
282
+			if ( ! $field = $gf_form::get_field( $gf_form, $field_settings[ 'id' ] ) ) {
283
+				gravityview()->log->error( 'No field found for specified form and field ID #{field_id}', array( 'field_id' => $field_settings[ 'id' ], 'data' => $form ) );
285 284
 				return $bail( $label, $field_settings, $entry->as_entry(), $force_show_label, $gf_form->form );
286 285
 			}
287
-			if ( empty( $field_settings['show_label'] ) ) {
286
+			if ( empty( $field_settings[ 'show_label' ] ) ) {
288 287
 				/** The label never wins... */
289
-				$field_settings['label'] = '';
288
+				$field_settings[ 'label' ] = '';
290 289
 			}
291 290
 
292 291
 			break;
293 292
 
294 293
 		/** Our internal backend. */
295 294
 		case \GV\Source::BACKEND_INTERNAL:
296
-			if ( ! $field = \GV\Internal_Source::get_field( $field_settings['id'] ) ) {
295
+			if ( ! $field = \GV\Internal_Source::get_field( $field_settings[ 'id' ] ) ) {
297 296
 				return $bail( $label, $field_settings, $entry->as_entry(), $force_show_label, $form );
298 297
 			}
299 298
 			break;
@@ -305,8 +304,8 @@  discard block
 block discarded – undo
305 304
 			break;
306 305
 	endswitch;
307 306
 
308
-	if( $force_show_label ) {
309
-		$field_settings['show_label'] = '1';
307
+	if ( $force_show_label ) {
308
+		$field_settings[ 'show_label' ] = '1';
310 309
 	}
311 310
 
312 311
 	/** Add the field settings. */
@@ -440,7 +439,7 @@  discard block
 block discarded – undo
440 439
 			'\GravityView_frontend::entry' => \GravityView_frontend::getInstance()->getEntry(),
441 440
 			'\GravityView_View::_current_entry' => \GravityView_View::getInstance()->getCurrentEntry(),
442 441
 			'\GravityView_View::fields' => \GravityView_View::getInstance()->getFields(),
443
-			'wp_actions[loop_start]' => empty( $wp_actions['loop_start'] ) ? 0 : $wp_actions['loop_start'],
442
+			'wp_actions[loop_start]' => empty( $wp_actions[ 'loop_start' ] ) ? 0 : $wp_actions[ 'loop_start' ],
444 443
 			'wp_query::in_the_loop' => $wp_query->in_the_loop,
445 444
 		);
446 445
 	}
@@ -522,7 +521,7 @@  discard block
 block discarded – undo
522 521
 					break;
523 522
 				case 'wp_actions[loop_start]':
524 523
 					global $wp_actions;
525
-					$wp_actions['loop_start'] = $value;
524
+					$wp_actions[ 'loop_start' ] = $value;
526 525
 					break;
527 526
 				case 'wp_query::in_the_loop':
528 527
 					global $wp_query;
@@ -600,9 +599,7 @@  discard block
 block discarded – undo
600 599
 				case 'request':
601 600
 					self::thaw( array(
602 601
 						'\GravityView_View::context' => (
603
-							$value->is_entry() ? 'single' :
604
-								( $value->is_edit_entry() ? 'edit' :
605
-									( $value->is_view() ? 'directory': null )
602
+							$value->is_entry() ? 'single' : ( $value->is_edit_entry() ? 'edit' : ( $value->is_view() ? 'directory' : null )
606 603
 								)
607 604
 						),
608 605
 						'\GravityView_frontend::is_search' => $value->is_search(),
@@ -656,14 +653,14 @@  discard block
 block discarded – undo
656 653
 		global $wp_query, $wp_actions;
657 654
 
658 655
 		$wp_query->in_the_loop = false;
659
-		$wp_actions['loop_start'] = 0;
656
+		$wp_actions[ 'loop_start' ] = 0;
660 657
 	}
661 658
 }
662 659
 
663 660
 
664 661
 /** Add some global fix for field capability discrepancies. */
665 662
 add_filter( 'gravityview/configuration/fields', function( $fields ) {
666
-	if ( empty( $fields  ) ) {
663
+	if ( empty( $fields ) ) {
667 664
 		return $fields;
668 665
 	}
669 666
 
@@ -690,11 +687,11 @@  discard block
 block discarded – undo
690 687
 		}
691 688
 
692 689
 		foreach ( $_fields as $uid => &$_field ) {
693
-			if ( ! isset( $_field['only_loggedin'] ) ) {
690
+			if ( ! isset( $_field[ 'only_loggedin' ] ) ) {
694 691
 				continue;
695 692
 			}
696 693
 			/** If we do not require login, we don't require a cap. */
697
-			$_field['only_loggedin'] != '1' && ( $_field['only_loggedin_cap'] = '' );
694
+			$_field[ 'only_loggedin' ] != '1' && ( $_field[ 'only_loggedin_cap' ] = '' );
698 695
 		}
699 696
 	}
700 697
 	return $fields;
@@ -725,8 +722,8 @@  discard block
 block discarded – undo
725 722
 		}
726 723
 
727 724
 		foreach ( $_fields as $uid => &$_field ) {
728
-			if ( ! empty( $_field['id'] ) && is_numeric( $_field['id'] ) && empty( $_field['form_id'] ) ) {
729
-				$_field['form_id'] = $view->form->ID;
725
+			if ( ! empty( $_field[ 'id' ] ) && is_numeric( $_field[ 'id' ] ) && empty( $_field[ 'form_id' ] ) ) {
726
+				$_field[ 'form_id' ] = $view->form->ID;
730 727
 			}
731 728
 		}
732 729
 	}
@@ -740,25 +737,25 @@  discard block
 block discarded – undo
740 737
 	if ( class_exists( '\GravityView_frontend' ) ) {
741 738
 		global $wp_filter;
742 739
 
743
-		if ( empty( $wp_filter['gravityview_after'] ) ) {
740
+		if ( empty( $wp_filter[ 'gravityview_after' ] ) ) {
744 741
 			return;
745 742
 		}
746 743
 
747 744
 		/** WordPress 4.6 and lower compatibility, when WP_Hook classes were still absent. */
748
-		if ( is_array( $wp_filter['gravityview_after'] ) ) {
749
-			if ( ! empty( $wp_filter['gravityview_after'][10] ) ) {
750
-				foreach ( $wp_filter['gravityview_after'][10] as $function_key => $callback ) {
745
+		if ( is_array( $wp_filter[ 'gravityview_after' ] ) ) {
746
+			if ( ! empty( $wp_filter[ 'gravityview_after' ][ 10 ] ) ) {
747
+				foreach ( $wp_filter[ 'gravityview_after' ][ 10 ] as $function_key => $callback ) {
751 748
 					if ( strpos( $function_key, 'context_not_configured_warning' ) ) {
752
-						unset( $wp_filter['gravityview_after'][10][ $function_key ] );
749
+						unset( $wp_filter[ 'gravityview_after' ][ 10 ][ $function_key ] );
753 750
 					}
754 751
 				}
755 752
 			}
756 753
 			return;
757 754
 		}
758 755
 
759
-		foreach ( $wp_filter['gravityview_after']->callbacks[10] as $function_key => $callback ) {
756
+		foreach ( $wp_filter[ 'gravityview_after' ]->callbacks[ 10 ] as $function_key => $callback ) {
760 757
 			if ( strpos( $function_key, 'context_not_configured_warning' ) ) {
761
-				unset( $wp_filter['gravityview_after']->callbacks[10][ $function_key ] );
758
+				unset( $wp_filter[ 'gravityview_after' ]->callbacks[ 10 ][ $function_key ] );
762 759
 			}
763 760
 		}
764 761
 	}
Please login to merge, or discard this patch.