@@ -263,6 +263,10 @@ def _parser_add_bz_fields(rootp, command):
263263 "the raw name used by the bugzilla instance. For example, if your "
264264 "bugzilla instance has a custom field cf_my_field, do:\n "
265265 " --field cf_my_field=VALUE" )
266+ p .add_argument ('--field-json' ,
267+ metavar = "JSONSTRING" , action = "append" , dest = "field_jsons" ,
268+ help = "Specify --field data as a JSON string. Example: --field-json "
269+ '\' {"cf_my_field": "VALUE", "cf_array_field": [1, 2]}\' ' )
266270
267271 if not cmd_modify :
268272 _parser_add_output_options (rootp )
@@ -436,15 +440,28 @@ def setup_parser():
436440# Command routines #
437441####################
438442
439- def _merge_field_opts (query , fields , parser ):
443+ def _merge_field_opts (query , fields , field_jsons , parser ):
444+ values = {}
445+
440446 # Add any custom fields if specified
441- for f in fields :
447+ for f in ( fields or []) :
442448 try :
443449 f , v = f .split ('=' , 1 )
444- query [f ] = v
450+ values [f ] = v
445451 except Exception :
446452 parser .error ("Invalid field argument provided: %s" % (f ))
447453
454+ for j in (field_jsons or []):
455+ try :
456+ jvalues = json .loads (j )
457+ values .update (jvalues )
458+ except Exception as e :
459+ parser .error ("Invalid field-json value=%s: %s" % (j , e ))
460+
461+ if values :
462+ log .debug ("parsed --field* values: %s" , values )
463+ query .update (values )
464+
448465
449466def _do_query (bz , opt , parser ):
450467 q = {}
@@ -599,8 +616,7 @@ def _do_query(bz, opt, parser):
599616 kwopts ["tags" ] = opt .tags
600617
601618 built_query = bz .build_query (** kwopts )
602- if opt .fields :
603- _merge_field_opts (built_query , opt .fields , parser )
619+ _merge_field_opts (built_query , opt .fields , opt .field_jsons , parser )
604620
605621 built_query .update (q )
606622 q = built_query
@@ -907,8 +923,7 @@ def parse_multi(val):
907923 kwopts ["comment_private" ] = opt .private
908924
909925 ret = bz .build_createbug (** kwopts )
910- if opt .fields :
911- _merge_field_opts (ret , opt .fields , parser )
926+ _merge_field_opts (ret , opt .fields , opt .field_jsons , parser )
912927
913928 b = bz .createbug (ret )
914929 b .refresh ()
@@ -1049,8 +1064,7 @@ def _do_modify(bz, parser, opt):
10491064 if not v [0 ] and not v [1 ]:
10501065 del wbmap [k ]
10511066
1052- if opt .fields :
1053- _merge_field_opts (update , opt .fields , parser )
1067+ _merge_field_opts (update , opt .fields , opt .field_jsons , parser )
10541068
10551069 log .debug ("update bug dict=%s" , update )
10561070 log .debug ("update whiteboard dict=%s" , wbmap )
0 commit comments