QKfmMddlmZddlmZmZddlmZddlmZm Z m Z m Z m Z ddl mZmZmZmZmZmZmZmZmZddlmZddlmZddlmZdd lmZdd lZdd l Z Gd d e Z!Gd dejDZ#GddeeZ$e%dk(rUdd l&Z&e&jNZ(dZ)ddl*m+Z+e+e)e(Z,e$e,d Z-e-j]dgggej^y y ))Gtk)clienterrors)inline_callbacks)AptCancelButtonAptConfigFileConflictDialogAptDetailsExpanderAptMediumRequiredDialogAptProgressBar) EXIT_SUCCESS EXIT_FAILEDSTATUS_COMMITTINGSTATUS_DOWNLOADINGSTATUS_DOWNLOADING_REPOSTATUS_FINISHEDget_error_description_from_enumget_error_string_from_enumget_status_string_from_enum)InstallBackend) UnitySupport) BuilderDialog)gettextNc*eZdZdZdfd ZdZxZS)UpdateManagerExpandera:An AptDetailsExpander which can be used with multiple terminals. The default AptDetailsExpander will shrink/hide when its transaction finishes. But here we want to support "chaining" transactions. So we override the status-changed handler to only do that when we are running the final transaction.c4t|||||_yN)super__init__final)self transactionterminalr __class__s O/usr/lib/python3/dist-packages/UpdateManager/backend/InstallBackendAptdaemon.pyrzUpdateManagerExpander.__init__/s h/ c|ttfvrS|jd|jj |j r|j j yy|tk(r|jj |j r,|j j |jdy|jr#|jd|jdyy|jrm|tk(rc|jj |j r|j j |jd|jdyyyNTF) rr set_sensitivedownload_scrolledshowr"hiderr set_expandedr)r transstatuss r$_on_status_changedz(UpdateManagerExpander._on_status_changed3s (*AB B   t $  " " ' ' )}} ""$ ( (  " " ' ' )}} ""$""4(!!%(""5)ZZFo5  " " ' ' )}} ""$   u %   e $ 6Zr%)TF)__name__ __module__ __qualname____doc__rr/ __classcell__r#s@r$rr's&%r%rc4eZdZdZfdZdZdZdZxZS)AptStackedProgressBarapA GtkProgressBar which represents the state of many aptdaemon transactions. aptdaemon provides AptProgressBar for the state of *one* transaction to be represented in a progress bar. This widget creates one of those per containing transaction, and scales its progress to the given ratio, so one progress bar can show the state of many transactions.cLd|_g|_||_t|y)Nr)current_max_progress progress_barsunityrr)r r;r#s r$rzAptStackedProgressBar.__init__Rs%$%!  r%czd|cxkrdksJJt|}|jj||j|_|xj|z c_|jdkDrd|_|j|_|j d|j|j d|jy)Nrznotify::fractionz notify::text) r r:appendr9minmaxconnect_update_progress _update_text)r r- max_progressprogresss r$add_transactionz%AptStackedProgressBar.add_transactionYsL%A%%%%%!%( !!(+00  !!\1!  $ $q (()D %00 +T-B-BC):):;r%c|j|jz }||jz}|j|z}|j||jj |dzy)Nd)r@r? get_fraction set_fractionr; set_progress)r inner_progressdatadeltaposition_in_delta new_progresss r$rBz&AptStackedProgressBar._update_progresshsb""^%7%77!N$?$?$AA%)),==  ,'  s 23r%cB|j|jyr)set_textget_text)r rLrMs r$rCz"AptStackedProgressBar._update_textos n--/0r%) r0r1r2r3rrFrBrCr4r5s@r$r7r7IsA <41r%r7ceZdZdZdZdZedZdZdZ edZ dZ ed Z ed Z d Zd Ze ddZdZdZdZdZdZy )InstallBackendAptdaemonzCMakes use of aptdaemon to refresh the cache and to install updates.cZtj|||tjj |j d}t j|||dtj|_t|_ d|_ d|_ d|_ d|_d|_d|_y)Nzgtkbuilder/UpdateProgress.uipane_update_progress)rrospathjoindatadirrr AptClientrr;_expanded_size button_canceltrans_failed_msg progressbar_active_transaction _expander)r window_mainactionui_paths r$rz InstallBackendAptdaemon.__init__vsk6:'',,   !?   +w(> &&( !^ "! $#' r%c|jr6|jjr |jjyy#t$rYywxYwr')r^ get_sensitiveclicked Exception)r s r$closezInstallBackendAptdaemon.closesT   $"4"4"B"B"D ""**,     sA AAc#`K |jjd}|j||jt ddy#t j $r#|j|jddddYyt$r"|j|jddddwxYww)zRefresh the package listTdeferuChecking for updates…FN authorizedsuccess error_string error_desc) r update_cache_show_transaction ACTION_UPDATE_rNotAuthorizedError _action_doneri)r r-s r$updatezInstallBackendAptdaemon.updates ++222>>E((t))1-F+G ((    "" !      ""!    s)B.AA B. 3B+?B.*B++B.ct|jj}t|jj}|jrd}|dz|jz}nd}|j |dd|||y)NT Frorprqrr trans_failed)rerrorcoderr_rx)r r-rdrqrrr}s r$_show_transaction_errorz/InstallBackendAptdaemon._show_transaction_errorsw1%++2B2BC 4U[[5E5EF  L#d*T-B-BBJL  %!%  r%c\|tk(r|j||y|jyr)r r_apt_update_oem)r r-r.rds r$_update_next_packagez,InstallBackendAptdaemon._update_next_packages) [  ( ( 7  r%c #ZK|jsJ|jj}d|d} tjj |r}|j j |}|jr |j}n |j}|j||jtdd|d|jz yy#tj$r#|j|jdddd Yytj $r}t#||_Yd}~yd}~wt&j($r>}|j+d k7r|j|jdddd Yd}~yd}~wt,$r"|j|jdddd wxYww) Nz/etc/apt/sources.list.d/z.list) sources_listInstalling updates…T皙?on_finished_handlerprogress_bar_maxFrn"org.freedesktop.DBus.Error.NoReply)_oem_packages_to_updatepoprXrYexistsrrsr _on_finishedrtACTION_PRE_INSTALLrv_len_oem_updatesrrwrxTransactionFailedstrr_dbus DBusException get_dbus_nameri)r elemsources_list_filer-finished_handleres r$rz'InstallBackendAptdaemon._apt_update_oems++++++//16tfEB. ww~~/0"kk66!27//'+'@'@$'+'8'8$,,++-.(8%(4+@+@%@ -1"((    '' !  '' +$'FD ! !!!  $HH   '' !       ''!    sM/F+BC F+3F(F+F(D+&F++F(4E:5F+:.F((F+c|tk(r|j||y|j\}}}}}}t||_t ||_|jyr)r rpackagessetrlenrr)r r-r.rdinstallrvs r$ _update_oemz#InstallBackendAptdaemon._update_oemsY [  ( ( 7 #(>> !Q1a'*7|$ #G  r%c#Kt|t|z|_ |s$|s"|j|jdddddy|rV|jj |d}|j ||jtdd|jdyy#tj$r#|j|jddddYytj$r}t||_ Yd}~yd}~wtj$r>}|j!d k7r|j|jddddYd}~yd}~wt"$r"|j|jddddwxYww) NTr|rlrrrFrnr)rall_oem_packagesrxrrinstall_packagesrtrvrrrwrrr_rrrri)r pkgs_install_oempkgs_upgrade_oemr-rs r$ commit_oemz"InstallBackendAptdaemon.commit_oem s #$4 5}|jdk7r|j|jddddYd}~yd}~wt$r"|j|jddddwxYww)z)Commit a list of package adds and removesTrlrFNrnr)rcommit_packagesrtACTION_INSTALLrvrrwrxrrr_rrrri) r pkgs_install pkgs_upgrade pkgs_remove reinstallpurge downgrader-rs r$commitzInstallBackendAptdaemon.commitEs[+ ,. .I . ++556E((t**A.E,F ((    ## !  '' +$'FD ! !!!  $HH   ## !       ##!    sMD4AAD43D1 D4 D1B4/D44D1 4D>D4.D11D4c&|j|yr) set_label)r r-details label_detailss r$_on_details_changedz+InstallBackendAptdaemon._on_details_changedus(r%c|jt||tk(rN|jrA|jjj r|j |jyyyyr)rrrrbr" get_visible_resize_to_show_details)r r-r.rs r$r/z*InstallBackendAptdaemon._on_status_changedxs_ ;F CD ' '''335  ( ( 86 (r%Nc#K| |j}|jj||jsYt |j |_|jj |jj|j|jj|||jr|jj|nOt||_ |jj |jj|j||jk(r)|jjtj |r |j"st%||_|j"j'd|j"j)d|j"j+|j"j-d|j.|j0j|j"|j0j n|j"j|||j2k7|j"_n&|j"r|j6j9|j-d|j:|j<|j-d|j>|j<|j-d|||j-d|j@|j-d|jB|jEd|jGyw) NTznotify::expandedzstatus-details-changedzstatus-changedfinishedzmedium-requiredzconfig-file-conflictgnome)$r label_headerrr`r7r;r*progressbar_slotaddrFr^set_transactionrbutton_cancel_slotrur STOCK_STOPrbr set_vexpand set_hexpandshow_allrA _on_expanded expander_slotrr_expander_slotr+rrr/_on_medium_required_on_config_file_conflictset_debconf_frontendrun)r r-rdheader show_detailsrrs r$rtz)InstallBackendAptdaemon._show_transactionst  &"&"3"3  ##F+4TZZ@D     ! ! #  ! ! % %d&6&6 7 ((0@A       . .u 5!0!7D     # # %  # # ' '(:(: ; T'' '    ( ( 8 >>!6u!=**40**40'')&&'94;L;LM""&&t~~6""'')..u5#)T-D-D#DDNN ^^    $ $ & $  $ $     d55t7I7I   j"5v> ')A)AB ,d.K.KL((11iiksMMc|jsT|jj|jj f|_|jj y|j r^|j \}\}}||jjk7r|j|y|jj||y|j|yr) get_expandedr"rrcget_sizer]end_user_resizablerbegin_user_resizable)r expanderparam term_visible stored_width stored_heights r$rz$InstallBackendAptdaemon._on_expandeds$$&!!--/  ))+#D     / / 1  :>:M:M 7L7<x00<<>>,,X6  55 -  ( ( 2r%c|jr|jj\}}|jj}|jj }|j jrK|j jdz}|j jdz}||z |z}||z |z} n |dz}|dz} |jj|| yy)aResize the window to show the expanded details. Unfortunately the expander only expands to the preferred size of the child widget (e.g showing all 80x24 chars of the Vte terminal) if the window is rendered the first time and the terminal is also visible. If the expander is expanded afterwards the window won't change its size anymore. So we have to do this manually. See LP#840942 PrHN) rrcrget_allocationwidthheightr"rget_char_widthget_char_heightr) r r win_width win_height exp_width exp_heightterminal_widthterminal_height new_width new_heights r$rz/InstallBackendAptdaemon._resize_to_show_detailss  "$($4$4$=$=$? !Iz //177I!00299J  ,,.!)!2!2!A!A!Cb!H"*"3"3"C"C"E"J*Y6B ,z9JF %O '#-    1 1)Z H #r%ct|||j}|j}|j|tj j k(r|j|y|jyr) r rcrr+r ResponseTypeOKprovide_mediumcancel)r r!mediumdrivedialogress r$rz+InstallBackendAptdaemon._on_medium_requiredsX(8H8HIjjl #""%% %  & &v .    r%ct|||j}|j}|j|tj j k(r|j|dy|j|dy)Nreplacekeep)rrcrr+rrYESresolve_config_file_conflict)r r!oldnewrrs r$rz0InstallBackendAptdaemon._on_config_file_conflicts^,S#t7G7GHjjl #""&& &  4 4S) D  4 4S& Ar%cd}d}d}|tk(r^t|jj}t |jj}|j rd}|dz|j z}|j jd|tk(} |j|d||||y#t$r|j|d|||YywxYw)NFTr{r|rn) r rr~rrr_r;rKr rx TypeError)r r-r.rdrqrrr} is_successs r$rz$InstallBackendAptdaemon._on_finisheds   [ 5ekk6F6FGL89I9IJJ$$# '$.1F1FF  #|+     ")%)      ")%   sB++C  C )r=N)r0r1r2r3rrjrryrrrrrrrr/rtrrrrrr%r$rUrUssM$ 2 " 33j 77r--^) 9 <<|30I.!B r%rU__main__z/usr/share/update-manager) UpdateManager2vcard)0 gi.repositoryr aptdaemonrrrmraptdaemon.gtk3widgetsrrr r r aptdaemon.enumsr r rrrrrrrUpdateManager.backendrUpdateManager.UnitySupportrUpdateManager.DialogsrrrvrrXr ProgressBarr7rUr0mockMockoptionsdata_dirUpdateManager.UpdateManagerrappbrmainrr%r$rs $"   13/ %.%D'1COO'1Tpnmpf  zdiikG*H9 ' *CT*AHHhZR  CHHJr%