o a @sddlZddlZddlmZddlmZmZddlmZ ddl m Z ddl m Z ddlmZmZdd d Zd d ZdddZddZddZddZddZddZdS)N)Path)PIPErun)appsget_random_string)DEFAULT_LOCALE_ENCODING) CommandError CommandParserutf-8c Csfz t|tttjdkd}Wnty"}z td|d|d}~ww|j||jjt dd|j fS)zf Friendly wrapper around Popen. Return stdout output, stderr output, and OS status code. nt)stdoutstderr close_fdszError executing %srNreplace)errors) rrosnameOSErrorr rdecoderr returncode)argsstdout_encodingperrr>/usr/lib/python3/dist-packages/django/core/management/utils.py popen_wrapper s rcCsZg}|D]}||dddqt|D]\}}|ds(d||||<qt|S)a Organize multiple extensions that are separated with commas or passed by using --extension/-e multiple times. For example: running 'django-admin makemessages -e js,txt -e xhtml -a' would result in an extension list: ['.js', '.txt', '.xhtml'] >>> handle_extensions(['.html', 'html,js,py,py,py,.py', 'py,.py']) {'.html', '.js', '.py'} >>> handle_extensions(['.html, txt,.tpl']) {'.html', '.tpl', '.txt'}  ,.z.%s)extendrsplit enumerate startswithset) extensionsext_listextirrrhandle_extensionss  r,cCs|durtjddtj}t|tr|g}|dur&tjddtj}|D] }||r4dg}nq(|D](}tj ||}tj |rJ|S|D]}||}tj |r^|SqLq7dS)NPATHr PATHEXTz.COM;.EXE;.BAT;.CMD) renvirongetr$pathsep isinstancestrendswithpathjoinisfile)cmdr5pathextr*rffextrrr find_command4s,     r<cCsd}td|S)zS Return a 50 character random string usable as a SECRET_KEY setting value. z2abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)2r)charsrrrget_random_secret_keyMs r?c Cst}t}|D]@}d|vr)zt|}Wn ty"td|w||qzt|}WntyB}ztt|d}~ww||q||fS)z Parse a list of "app_label.ModelName" or "app_label" strings into actual objects and return a two-element tuple: (set of model classes, set of app_configs). Raise a CommandError if some specified models or apps don't exist. r"zUnknown model: %sN)r'installed_apps get_model LookupErrorr addget_app_configr3)labelsrmodelslabelmodel app_configerrrparse_apps_and_model_labelsUs$     rKcCsNtddd}|j|ddz||dd\}}W|jSty&YdSw)z Return the value of a command line option (which should include leading dashes, e.g. '--testrunner') from an argument list. Return None if the option wasn't passed or if the argument list couldn't be parsed. F)add_help allow_abbrevvalue)destN)r add_argumentparse_known_argsr rN)argvoptionparseroptions_rrrget_command_line_optionps  rXcCsndd|D}dddtjhD}g}|D]}|D]}||r.||dt| nq||q|S)z9Normalize an iterable of glob style patterns based on OS.cSsg|]}tj|qSr)rr5normcase).0rrrr sz+normalize_path_patterns..cSsh|]}d|qS)z%s*r)rZpath_seprrr sz*normalize_path_patterns../N)rsepr4appendlen)patterns dir_suffixes norm_patternspattern dir_suffixrrrnormalize_path_patternss  rgcs.tfddtfddt|DS)zy Check if the given path should be ignored or not based on matching one of the glob style `ignore_patterns`. cstj|ptt|SN)fnmatch fnmatchcaserr3)re)r5rrignoreszis_ignored_path..ignorec3s|]}|VqdSrhr)rZre)rkrr sz"is_ignored_path..)ranyrg)r5ignore_patternsr)rkr5ris_ignored_paths ro)r )NN)rirpathlibr subprocessrr django.appsrr@django.utils.cryptordjango.utils.encodingrbaser r rr,r<r?rKrXrgrorrrrs