U V&@sddlmZddlZddlmZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl m Z d'ddZd d Zd d Zd dZddZd(ddZddZddZddZd)ddZddZd*ddZd d!Zdejjddfd"d#Zdd$efd%d&ZdS)+)unicode_literalsN)log)optionsFTc Cs|rtj}tj}nd}d}tj}|r2||tj||||d}|}|jrl|rlt j d||jft |dks|dr|d sdS|d ddS)N)stdoutstderrenvz%s returned %drutf-8replace) subprocessPIPEosenvironcopyupdatePopen communicate returncode distutilserrorsDistutilsErrorlenstripdecode) cmdthrow_on_errorbufferr out_location err_locationnewenvoutputoutr"8/opt/alt/python38/lib/python3.8/site-packages/pbr/git.py_run_shell_command!s*     r$cKs,t|ttfs|g}tdd|g|f|S)Ngitz --git-dir=%s) isinstancelisttupler$)rgit_dirkwargsr"r"r#_run_git_command<sr+c CsPztdddgWStk rJ}z|jtjkr8WY dSW5d}~XYnXdS)Nr%z rev-parsez --git-dirr)r$OSErrorerrnoENOENT)er"r"r#_get_git_directoryCs   r0cCs,ztddgWntk r&YdSXdS)Nr%z --versionFT)r$r,r"r"r"r#_git_is_installedMs r1cCst|tjdS)zFind the highest tag from a list. Pass in a list of tag strings and this will return the highest (latest) as sorted by the pkg_resources version parser. )key)max pkg_resources parse_version)tagsr"r"r#_get_highest_tagXsr7rcCsLg}|dkrt}|r>tdtddg|}|dd}dd|DS) zBehave like a file finder entrypoint plugin. We don't actually use the entrypoints system for this because it runs at absurd times. We only want to do this when we are building an sdist. Nz2[pbr] In git context, generating filelist from gitzls-filesz-zr cSsg|] }|r|qSr"r").0fr"r"r# psz#_find_git_files..)_run_git_functionsrinfor+splitr)dirnamer) file_listr"r"r#_find_git_filesas rAcCs6tddg|}d|kr&|dddSd|kr2dSdS)Ndescribez--always-.r)r+rsplit)r)rBr"r"r#_get_raw_tag_infoss rHcCs t|dkS)Nr)rHr)r"r"r#get_is_release|srJcCsd}trt}|pdS)N)r1r0rIr"r"r#r<sr<cCs"|s t}|rtdddg|SdS)z1Return the short sha for this repo, if it exists.rz-n1z--pretty=format:%hN)r<r+rIr"r"r#get_git_short_shasrKccsd}d}|dfV|D]~\}}}|r\t|}t|d}|sF|dfV|dt||dfV|ds|d r||dd }|d t|d fVd }qdS)zConvert a oneline log iterator to formatted strings. :param changelog: An iterator of one line log entries like that given by _iter_log_oneline. :return: An iterator over (release, formatted changelog) tuples. TNzCHANGES ======= rC z%(tag)s %(underline)s )tag underlinezMerge rFz * %(msg)s )msgF)r7rdict startswithendswith) changelog first_linecurrent_releasehashr6rPrNr"r"r#_iter_changelogs&       rXcCs|dkrt}|sgSt|S)aQIterate over --oneline log entries if possible. This parses the output into a structured form but does not apply presentation logic to the output - making it suitable for different uses. :return: An iterator of (hash, tags_set, 1st_line) tuples, or None if changelog generation is disabled / not available. N)r0_iter_log_innerrIr"r"r#_iter_log_onelines rZccstddddg}t||}|dD]}|}t|dkrBq(|ddrld |krl|d d}nd |dd }d |krtd d|d dddd D}nt}|d||fVq(d S)aIterate over --oneline log entries. This parses the output intro a structured form but does not apply presentation logic to the output - making it suitable for different uses. :return: An iterator of (hash, tags_set, 1st_line) tuples. z[pbr] Generating ChangeLogrz --onelinez --decoraterLrD() Nztag:cSsg|]}|ddqS),r)r>)r9rMr"r"r#r;sz#_iter_log_inner..rztag: ) rr=r+r>rrRrjoinset)r)log_cmdrTline line_partsrPr6r"r"r#rYs     rYc Cst}|si}t|dd}|r&dS|s@t|d}|r@t|}|sHdStdtj |d}tj |r~t |tj s~dSt j|ddd }|D]\}} || qW5QRXt} td | |dS) z-Write a changelog based on the git changelog.skip_changelogSKIP_WRITE_GIT_CHANGELOGNrIz[pbr] Writing ChangeLog ChangeLogwr )encodingz![pbr] ChangeLog complete (%0.1fs))timerget_boolean_optionrZrXrr=r pathr`existsaccessW_OKioopenwrite) r)dest_dir option_dictrTstart should_skip new_changelogchangelog_filereleasecontentstopr"r"r#write_git_changelogs2     r|rFc sht|dd}|rdSt}tj|d}tj|d}tj|rXt|tjsXdSt dd|dkrtt }|rJg}dd g}|t || d 7}fd d |D}t d|} td | tj} dd | D} || 7}tt|}t|dR} tj|r&t|d} | | W5QRX| d |d dW5QRXt} t d| |dS)z&Create AUTHORS file using git commits. skip_authorsSKIP_GENERATE_AUTHORSNz AUTHORS.inAUTHORSz[pbr] Generating AUTHORSz.(jenkins@review|infra@lists|jenkins@openstack)rz--format=%aN <%aE>rLcsg|]}t|s|qSr")research)r9a ignore_emailsr"r#r;s z$generate_authors..zCo-authored-by:.+cSs$g|]}|r|dddqS):r[)r>r)r9signedr"r"r#r;swbrbr z[pbr] AUTHORS complete (%0.1fs))rrkrjr rlr`rmrnrorr=r0r+r>rfindall MULTILINEsortedrarqrrreadencode)r)rsrtrvru old_authors new_authorsauthors git_log_cmdco_authors_out co_authorsnew_authors_fhold_authors_fhr{r"rr#generate_authorssN       r)FTN)rN)N)N) __future__rdistutils.errorsrrr-rpr rr rjr4pbrrr$r+r0r1r7rArHrJr<rKrXrZrYrlcurdirr|rQrr"r"r"r#s8          "