Ë
    §!f@+  ã                   óÒ   — d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	Z	ddl
Z
ddlZ
 G d„ d«      Z ed¬	«       G d
„ d«      «       Z G d„ de
j                  j                  «      Zy)z)Crash database implementation for Github.é    N)ÚCallable)Ú	dataclass)ÚAnyc                   óÀ   — e Zd ZU dZ ej                  «       Zeed<   d„ Ze	de
defd„«       Zdededefd„Zdede
defd	„Zd
edede
defd„Zd„ Zdeddfd„Zdefd„Zy)ÚGithubz:Wrapper around Github API, used to log in and post issues.Ú_Github__last_requestc                 óX   — || _         d | _        d | _        d | _        d | _        || _        y ©N)Ú_Github__client_idÚ_Github__authentication_dataÚ_Github__access_tokenÚ_Github__cooldownÚ_Github__expiryÚmessage_callback)ÚselfÚ	client_idr   s      ú</usr/lib/python3/dist-packages/apport/crashdb_impl/github.pyÚ__init__zGithub.__init__   s0   € Ø$ˆÔØ%)ˆÔ"Ø"ˆÔØˆŒØˆŒØ 0ˆÕó    ÚdataÚreturnc                 óN   — d}| j                  «       D ]  \  }}|› d|› d|› �}Œ |S )z4Takes a dict and returns it as a string for POSTing.Ú ú&ú=)Úitems)r   ÚstringÚkeyÚvalues       r   Ú
_stringifyzGithub._stringify%   s=   € ð ˆØŸ*™*›,ò 	/‰JˆC�Ø�x˜q   Q u gÐ.‰Fð	/àˆr   Úurlc                 ó´  — ddi}| j                   rd| j                   › �|d<   	 t        j                  |||d¬«      }	 t        j
                  «       | _        |j                  «        t        j                  |j                  «      S # t        j                  $ r }| j	                  dd|› d	�d
z   «       |‚d}~ww xY w# t        j
                  «       | _        w xY w)zKPosts the given data to the given URL.
        Uses auth token if availableÚAcceptzapplication/vnd.github.v3+jsonztoken ÚAuthorizationg      @)Úheadersr   ÚtimeoutzFailed connectionzFailed connection to z.
z4Please check your internet connection and try again.N)r   ÚrequestsÚpostÚRequestExceptionr   Útimer   Úraise_for_statusÚjsonÚloadsÚtext)r   r!   r   r%   ÚresultÚerrs         r   Ú_postzGithub._post-   sÎ   € ð Ð=Ð>ˆØ×ÒØ)/°×0CÑ0CÐ/DÐ'EˆG�OÑ$ð
	.Ü—]‘] 3°¸dÈCÔP‰Fô #'§)¡)£+ˆDÔà×ÑÔ!Ü�z‰z˜&Ÿ+™+Ó&Ð&øô ×(Ñ(ò 	Ø×!Ñ!Ø#Ø'¨ u¨CÐ0ØHñIôð
 ˆIûð	ûô #'§)¡)£+ˆDÕús#   ¤B ÂB9ÂB4Â4B9Â9B< Â<Cc                 óD   — | j                  || j                  |«      «      S )z$Authenticate against the GitHub API.)r1   r    )r   r!   r   s      r   Úapi_authenticationzGithub.api_authenticationB   s   € à�z‰z˜#˜tŸ™¨tÓ4Ó5Ð5r   ÚownerÚrepoc                 ó^   — d|› d|› d�}| j                  |t        j                  |«      «      S )z'Open a new issue on the GitHub project.zhttps://api.github.com/repos/ú/z/issues)r1   r,   Údumps)r   r4   r5   r   r!   s        r   Úapi_open_issuezGithub.api_open_issueF   s0   € à-¨e¨W°A°d°V¸7ÐCˆØ�z‰z˜#œtŸz™z¨$Ó/Ó0Ð0r   c                 ó@  — | j                   ddœ}d}| j                  ||«      }d}|d   }|d   }| j                  d|j                  ||¬«      «       | j                   |d	   › d
dœ| _        |d   | _        t        |d   «      t        j                  «       z   | _        | S )z2Enters login process. At exit, login process ends.Úpublic_repo)r   Úscopez$https://github.com/login/device/codezÖPosting an issue requires a Github account. If you have one, please follow these steps to log in.

Open the following URL. When requested, write this code to enable apport to open an issue.
URL:  {url}
Code: {code}Úverification_uriÚ	user_codezLogin required)r!   ÚcodeÚdevice_codez,urn:ietf:params:oauth:grant-type:device_code)r   r@   Ú
grant_typeÚintervalÚ
expires_in)	r   r3   r   Úformatr   r   Úintr*   r   )r   r   r!   ÚresponseÚpromptr?   s         r   Ú	__enter__zGithub.__enter__K   sº   € à!×-Ñ-¸ÑFˆØ4ˆØ×*Ñ*¨3°Ó5ˆðð 	ð Ð)Ñ*ˆØ˜Ñ$ˆà×ÑÐ.°·±À#ÈD°Ó0QÔRð ×)Ñ)Ø& }Ñ5Ð6ØHñ&
ˆÔ"ð
 # :Ñ.ˆŒÜ˜H \Ñ2Ó3´d·i±i³kÑAˆŒàˆr   Ú_Nc                 ó.   — d | _         d| _        d| _        y )Nr   )r   r   r   )r   rI   s     r   Ú__exit__zGithub.__exit__j   s   € Ø%)ˆÔ"ØˆŒØˆ�r   c                 ó  — | j                   st        d«      ‚t        j                  «       }| j                  || j                  z
  z
  }||z   | j
                  kD  r| j                  dd«       t        d«      ‚|dkD  rt        j                  |«       d}| j                  || j                   «      }d|v r3|d   dk(  ry	|d   d
k(  rt        |d   «      | _        y	t        d|› �«      ‚d|v r|d   | _
        yt        d|› �«      ‚)znAsks Github if the user has logged in already.
        It respects the wait-time requested by Github.
        z9Authentication not started. Use a with statement to do sozFailed loginz0Github authentication expired. Please try again.zGithub authentication expiredr   z+https://github.com/login/oauth/access_tokenÚerrorÚauthorization_pendingFÚ	slow_downrB   zUnknown error from Github: Úaccess_tokenTzUnknown response from Github: )r   ÚRuntimeErrorr*   r   r   r   r   Úsleepr3   rE   r   )r   Úcurrent_timeÚwaittimer!   rF   s        r   Úauthentication_completezGithub.authentication_completeo   s  € ð ×)Ò)ÜØKóð ô —y‘y“{ˆØ—?‘? l°T×5HÑ5HÑ&HÑIˆØ˜(Ñ" T§]¡]Ò2Ø×!Ñ!ØÐ Rôô Ð>Ó?Ð?Ø�aŠ<Ü�J‰J�xÔ à;ˆØ×*Ñ*¨3°×0JÑ0JÓKˆà�hÑØ˜Ñ Ð$;Ò;ØØ˜Ñ  KÒ/Ü"% h¨zÑ&:Ó";�”ØÜÐ!<¸X¸JÐGÓHÐHØ˜XÑ%Ø"*¨>Ñ":ˆDÔØÜÐ;¸H¸:ÐFÓGÐGr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r*   r   ÚfloatÚ__annotations__r   ÚstaticmethodÚdictÚstrr    r   r1   r3   r9   rH   rK   ÚboolrU   © r   r   r   r      s¹   … ÙDà%˜DŸI™I›K€N�EÓ'ò1ð ð˜ð  #ò ó ðð'˜ð ' Cð '¨Có 'ð*6 cð 6°ð 6¸#ó 6ð1 Cð 1¨sð 1¸$ð 1À3ó 1ò
ð>˜3ð  4ó ð
 H¨ô  Hr   r   T)Úfrozenc                   ó   — e Zd ZU eed<   y)ÚIssueHandler!   N)rV   rW   rX   r^   r[   r`   r   r   rc   rc   ’   s   … à	„Hr   rc   c            	       ó  — e Zd ZdZd„ Zdej                  defd„Zd„ Z		 	 ddej                  de
dz  d	e
dz  defd
„Zdej                  dedefd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zd„ Z	 	 	 d d„Zy)!ÚCrashDatabasezjGithub crash database.
    This is a Apport CrashDB implementation for interacting with Github issues
    c                 óØ   — t         j                  j                  j                  | ||«       |d   | _        |d   | _        |d   | _        t        |d   «      | _        d| _	        d| _
        y)z<Initialize some variables. Login is delayed until necessary.Úrepository_ownerÚrepository_nameÚgithub_app_idÚlabelsN)ÚapportÚcrashdbre   r   rg   rh   Úapp_idÚsetrj   Ú	issue_urlÚgithub)r   Ú	auth_fileÚoptionss      r   r   zCrashDatabase.__init__œ   se   € ä�‰×$Ñ$×-Ñ-¨d°I¸wÔGØ 'Ð(:Ñ ;ˆÔØ&Ð'8Ñ9ˆÔØ˜oÑ.ˆŒÜ˜' (Ñ+Ó,ˆŒØˆŒØˆ�r   Úreportr   c                 ó€   — d}|j                  «       D ]  \  }}|d|› d|› d�z  }Œ d|t        | j                  «      dœS )z>Formats report info as markdown and creates Github issue JSON.r   z**z**
z

zIssue submitted via apport)ÚtitleÚbodyrj   )r   Úlistrj   )r   rs   Úbody_markdownr   r   s        r   Ú_format_reportzCrashDatabase._format_report¦   sW   € àˆØ Ÿ,™,›.ò 	7‰JˆC�Ø˜r #  d¨5¨'°Ð6Ñ6‰Mð	7ð 2Ø!Ü˜4Ÿ;™;Ó'ñ
ð 	
r   c                 ó¢   — t        | j                  |«      5 }|j                  «       s	 |j                  «       sŒ|cd d d «       S # 1 sw Y   y xY wr
   )r   rm   rU   )r   Úuser_message_callbackrp   s      r   Ú_github_loginzCrashDatabase._github_login²   sH   € Ü�D—K‘KÐ!6Ó7ð 	¸6Ø×4Ñ4Ô6Øð ×4Ñ4Õ6à÷	÷ 	ò 	ús   —"AºAÁANÚprogress_callbackr{   c                 óÄ  — | j                  |«      sJ ‚| j                  |«      | _        | j                  €t        d«      ‚| j	                  |«      }| j
                  €| j                  �2| j                  j                  | j                  | j
                  |«      }n7d|v r(d|v r$| j                  j                  |d   |d   |«      }nt        d«      ‚t        |d   ¬«      S )zaUpload given problem report return a handle for it.
        In Github, we open an issue.
        zFailed to login to GithubÚSnapGitOwnerÚSnapGitNamez9Couldn't determine which repository to file the report inÚhtml_url©r!   )	Úacceptsr|   rp   rQ   ry   rh   rg   r9   rc   )r   rs   r}   r{   r   rF   s         r   ÚuploadzCrashDatabase.upload¸   sç   € ð �|‰|˜FÔ#Ð#Ð#à×(Ñ(Ð)>Ó?ˆŒà�;‰;ÐÜÐ:Ó;Ð;à×"Ñ" 6Ó*ˆØ×$Ñ$Ð,°×1FÑ1FÐ1NØ—{‘{×1Ñ1Ø×%Ñ% t×';Ñ';¸Tó‰Hð ˜vÑ%¨-¸6Ñ*AØ—{‘{×1Ñ1Ø�~Ñ&¨¨}Ñ(=¸tó‰Hô ØKóð ô ˜x¨
Ñ3Ô4Ð4r   Úhandlec                 ó   — |j                   S )zpReturn a URL that should be opened after report has been uploaded
        and upload() returned handle.
        r‚   )r   rs   r…   s      r   Úget_comment_urlzCrashDatabase.get_comment_urlØ   s   € ð �z‰zÐr   c                 ó   — t        d«      ‚©Nz?This method is not relevant for Github database implementation.©ÚNotImplementedError)r   Úcrash_idrs   s      r   Ú_mark_dup_checkedzCrashDatabase._mark_dup_checkedÞ   ó   € Ü!ØMó
ð 	
r   c                 ó   — t        d«      ‚r‰   rŠ   ©r   rŒ   s     r   Ú
can_updatezCrashDatabase.can_updateã   rŽ   r   c                 ó   — t        d«      ‚r‰   rŠ   )r   rs   rŒ   Ú	master_ids       r   Úclose_duplicatezCrashDatabase.close_duplicateè   rŽ   r   c                 ó   — t        d«      ‚r‰   rŠ   r�   s     r   ÚdownloadzCrashDatabase.downloadí   rŽ   r   c                 ó   — t        d«      ‚r‰   rŠ   r�   s     r   Úduplicate_ofzCrashDatabase.duplicate_ofò   rŽ   r   c                 ó   — t        d«      ‚r‰   rŠ   r�   s     r   Úget_affected_packagesz#CrashDatabase.get_affected_packages÷   rŽ   r   c                 ó   — t        d«      ‚r‰   rŠ   r�   s     r   Úget_distro_releasez CrashDatabase.get_distro_releaseü   rŽ   r   c                 ó   — t        d«      ‚r‰   rŠ   ©r   s    r   Úget_dup_uncheckedzCrashDatabase.get_dup_unchecked  rŽ   r   c                 ó   — t        d«      ‚r‰   rŠ   r�   s     r   Úget_fixed_versionzCrashDatabase.get_fixed_version  rŽ   r   c                 ó   — t        d«      ‚r‰   rŠ   )r   rs   rŒ   s      r   Ú
get_id_urlzCrashDatabase.get_id_url  rŽ   r   c                 ó   — t        d«      ‚r‰   rŠ   rž   s    r   Úget_unfixedzCrashDatabase.get_unfixed  rŽ   r   c                 ó   — t        d«      ‚r‰   rŠ   rž   s    r   Úget_unretracedzCrashDatabase.get_unretraced  rŽ   r   c                 ó   — t        d«      ‚r‰   rŠ   r�   s     r   Úis_reporterzCrashDatabase.is_reporter  rŽ   r   c                 ó   — t        d«      ‚r‰   rŠ   )r   rŒ   Úmasters      r   Úmark_regressionzCrashDatabase.mark_regression  rŽ   r   c                 ó   — t        d«      ‚r‰   rŠ   )r   rŒ   Úinvalid_msgs      r   Úmark_retrace_failedz!CrashDatabase.mark_retrace_failed$  rŽ   r   c                 ó   — t        d«      ‚r‰   rŠ   r�   s     r   Úmark_retracedzCrashDatabase.mark_retraced)  rŽ   r   c                 ó   — t        d«      ‚r‰   rŠ   )r   rŒ   rs   ÚcommentÚchange_descriptionÚattachment_commentÚ
key_filters          r   ÚupdatezCrashDatabase.update.  s   € ô "ØMó
ð 	
r   )NNr
   )FNN) rV   rW   rX   rY   r   rk   ÚReportr]   ry   r|   r   rc   r„   r^   r‡   r�   r‘   r”   r–   r˜   rš   rœ   rŸ   r¡   r£   r¥   r§   r©   r¬   r¯   r±   r·   r`   r   r   re   re   —   sæ   „ ñòð

 V§]¡]ð 

°tó 

òð .2Ø15ñ	5à—‘ð5ð $ d™?ð5ð  (¨$™ð	5ð
 
ó5ð@ f§m¡mð ¸[ð ÈSó ò
ò

ò

ò

ò

ò

ò

ò

ò

ò

ò

ò

ò

ò

ó

ò

ð !ØØô
r   re   )rY   r,   r*   Úcollections.abcr   Údataclassesr   Útypingr   r'   rk   Úapport.crashdbr   rc   rl   re   r`   r   r   ú<module>r½      sg   ðÙ /ó Û Ý $Ý !Ý ã ã Û ÷wHñ wHñt �$Ô÷ð ó ðôb
�F—N‘N×0Ñ0õ b
r   