o ` 5@sdZddlmZddlmZddlmZddlmZddlmZddlZddl Z ddl Z ddl m Z Gd d d e ZGd d d eZGd ddeZdS)z&Generate and process backup statistics)division)zip)map)str)objectN)dup_timec@s eZdZdS)StatsExceptionN)__name__ __module__ __qualname__r r 6/usr/lib/python3/dist-packages/duplicity/statistics.pyr%src@seZdZdZedZdZdZdZ de eeZ dZ dZ d d Z d d Zd dZddZddZd1ddZddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0S)2StatsObjz@Contains various statistics, provide string conversion functions ) SourceFilesSourceFileSizeNewFiles NewFileSize DeletedFiles ChangedFilesChangedFileSizeChangedDeltaSize DeltaEntries RawDeltaSize)ErrorsTotalDestinationSizeChange) StartTimeEndTime ElapsedTime)Filename) )rF)rT)rF)rT)rF)rF)rT)rT)rF)rT))lTB)i@GB)iMB)iKBcCs|jD]}d|j|<qdS)zSet attributes to NoneN) stat_attrs__dict__selfattrr r r __init__Ss  zStatsObj.__init__cCs |j|S)zGet a statisticr%)r' attributer r r get_statXs zStatsObj.get_statcCs||j|<dS)zSet attribute to given valueNr*)r'r(valuer r r set_stat\zStatsObj.set_statcCs|j|d7<dS)zAdd 1 to value of attributeNr*r&r r r increment_stat`szStatsObj.increment_statcCsdS)zReturn total destination size change This represents the total increase in the size of the duplicity destination directory, or None if not available. rr r'r r r get_total_dest_size_changedsz#StatsObj.get_total_dest_size_changer0cspfddjD}|sd}n!tjj|}|r0jdt|}d}|ddkr*d}||d }d |g|S) z8Return one line abbreviated version of full stats stringcsg|] }t|qSr )rr,).0ar2r r osz+StatsObj.get_stats_line...z\\x20r0rur)stat_file_attrsospathjoin space_regexsubrepr)r'indexuse_repr file_attrsfilenamenr r2r get_stats_linems   zStatsObj.get_stats_linec sfdd}ddkrddd}t|t|jkr#|t|j|t|j dD]-\}}zt|}WntyWzt|}Wn tyT|YnwYnw|||q1|S)zSet statistics from given linecs tdNz Bad line '%s'rr liner r error z+StatsObj.set_stats_from_line..errorr: Nr)splitlenr;rint ValueErrorfloatr.)r'rKrL linepartsr( val_stringvalr rJr set_stats_from_line~s*          zStatsObj.set_stats_from_linecCsd|||fS)z.Return extended string printing out statisticsz%s%s%s)get_timestats_stringget_filestats_stringget_miscstats_stringr2r r r get_stats_stringszStatsObj.get_stats_stringcCsg}|jdur|d|jt|jf|jdur(|d|jt|jf|js5|jdurO|jdurO|jdurA|j|j|_|d|jt|jfd|S)z5Return portion of statistics string dealing with timeNzStartTime %.2f (%s) zEndTime %.2f (%s) zElapsedTime %.2f (%s) )rappendr timetoprettyrr inttoprettyr>)r'timelistr r r rXs"     zStatsObj.get_timestats_stringcsfdd}dt|jS)z9Return portion of statistics string about files and bytescsB|\}}|}|durdS|rd|||fSd||fS)z%Return zero or one line of the stringNr\z %s %s (%s) z%s %s )r,get_byte_summary_string)stat_file_pairr(in_bytesrVr2r r filelines  z/StatsObj.get_filestats_string..fileliner\)r>rstat_file_pairs)r'rdr r2r rYs  zStatsObj.get_filestats_stringcCsDd}|j}|dur|d|||f7}|jdur |d|j7}|S)zInitialize attributes from string, return self for conveniencecSs td|rHrIrJr r r rLrMz-StatsObj.set_stats_from_string..errorrNr9N)rOrPr$rQrRrSr.) r'srLrK line_partsr( value_stringval1val2r r r set_stats_from_strings2       zStatsObj.set_stats_from_stringcCs(|d}|||rJdS)z%Write statistics string to given pathwN)openwriter[close)r'r=finr r r write_stats_to_paths zStatsObj.write_stats_to_pathcCs(|d}|||rJ|S)z5Set statistics from path, return self for conveniencer)r~r|readr)r'r=fpr r r read_stats_from_paths  zStatsObj.read_stats_from_pathcCs8t|tsJ|jD]}||||krdSq dS)z,Return true if s has same statistics as selfNr0) isinstancerr;r,r'rwr(r r r stats_equals  zStatsObj.stats_equalc Cs|jD]}||dq|D]+}|jD]%}||dur#||dq||dur8||||||qqd|_d|_|jD]}||dur[||||tt|qC|S)z9Set self's attributes to average of those in statobj_listrN)r$r.r,rrrSrP)r' statobj_listr(statobjr r r set_to_averages*   zStatsObj.set_to_averagecCs(t}|jD] }||||q|S)z2Return new StatsObj object with same stats as self)rr$r.r,rr r r get_statsobj_copy,s zStatsObj.get_statsobj_copyN)r0) r r r __doc__recompiler?r;stat_misc_attrsstat_time_attrsr$rerkr)r,r.r1r3rGrWr[rXrYrZrarvr|rrrrrr r r r r)s@      rc@sPeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ dS)StatsDeltaProcessz0Keep track of statistics during DirDelta processcCs:t|tjD]}d|j|<qd|_t|_g|_dS)z4StatsDeltaProcess initializer - zero file attributesrN)rr)r;r%rtimer files_changedr&r r r r)6s     zStatsDeltaProcess.__init__cCP|}|jd7_|jd7_|j|7_|jd7_||ddS)z(Add stats of new file path to statisticsr0snewN)getsizerrrradd_delta_entries_filer'r=filesizer r r add_new_file? zStatsDeltaProcess.add_new_filecCr)z4Add stats of file that has changed since last backupr0schangedN)rrrrrrrr r r add_changed_fileIrz"StatsDeltaProcess.add_changed_filecCs,|jd7_|jd7_||ddS)z/Add stats of file no longer in source directoryr0sdeletedN)rrr)r'r=r r r add_deleted_fileSsz"StatsDeltaProcess.add_deleted_filecCs(|}|jd7_|j|7_dS)z7Add stats of file that hasn't changed since last backupr0N)rrrrr r r add_unchanged_fileYsz$StatsDeltaProcess.add_unchanged_filecCst|_dS)z#End collection of data, set EndTimeN)rrr2r r r r_r/zStatsDeltaProcess.closecCs$|r|j||fdSdSN)isregrr]get_relative_path)r'r= action_typer r r rcsz(StatsDeltaProcess.add_delta_entries_filecCs|jSr)rr2r r r get_delta_entries_filegsz(StatsDeltaProcess.get_delta_entries_fileN) r r r rr)rrrrrrrr r r r r4s    r)r __future__rbuiltinsrrrrrrr< duplicityr Exceptionrrrr r r r s