a `§»e8 ã@sTddlmZddlmZddlZddlZdd„Zdd„Zdd „Zd d „Z d d „Z dS)é)Úlog)Ú _find_unsafeNcCs,|sdSt|ƒdur|Sd| dd¡dS)z1Return a shell-escaped version of the string *s*.z""Nú"z\")rÚreplace)Ús©rú/code/opendm/arghelpers.pyÚ double_quotes  r cCsXt|ƒ}i}t| ¡ƒD]:}| d¡r(q|dkrF||durFd||<q||||<q|S)NZ_is_setZ sm_clusterT)ÚvarsÚsortedÚkeysÚendswith)ÚargsÚ args_dictÚresultÚkrrrÚ args_to_dicts  rc Cs†zFt|ddd$}| t t|ƒ¡¡Wdƒn1s:0YWn:ty€}z"t d|t|ƒf¡WYd}~n d}~00dS)NÚwúutf-8©ÚencodingzCannot save options to %s: %s) ÚopenÚwriteÚjsonÚdumpsrÚ ExceptionrÚ ODM_WARNINGÚstr)Ú opts_jsonrÚfÚerrrÚ save_opts!s 6r!c Cs¶tj |¡siSzi}t|ddd}t | ¡¡}Wdƒn1sH0Yt|ƒ}|D]<}||}| |d¡} | |d¡} | dur^|| kr^| ||<q^|WSiYS0dS)NÚrrr) ÚosÚpathÚisfilerrÚloadsÚreadrÚget) rrÚ rerun_stagesZdiffrZ prev_argsZcur_argsÚoptZ cur_valueZ prev_valueZstagerrrÚ compare_args(s  ,   r+c s®d|vs¦d|vs¦d|vs¦t||ˆƒ}|r¦d|vrFˆˆ d¡d…|fSz.‡‡fdd„| ¡Dƒ}ˆt|ƒd…|fWSty¤}ztt|ƒƒWYd}~n d}~00difS)NZ rerun_is_setZrerun_from_is_setZrerun_all_is_setZ split_is_setZdatasetcs&g|]}ˆ|durˆ ˆ|¡‘qS)N)Úindex)Ú.0r*©Ú processoptsr)rrÚ Hóz$find_rerun_stage..)r+r,r ÚminÚ ValueErrorÚprintr)rrr)r/Z args_diffZ stage_idxsr rr.rÚfind_rerun_stage?s "r5) ÚopendmrÚshlexrrr#r rr!r+r5rrrrÚs