From 2c0a75b466c3335acec284287b43d1d1430f0df1 Mon Sep 17 00:00:00 2001 From: Amber Date: Tue, 14 May 2024 14:45:00 +0200 Subject: [PATCH] testing and other --- src/iface/__pycache__/snap.cpython-39.pyc | Bin 2985 -> 3538 bytes src/iface/snap.py | 36 +++++- src/lib/diff/__pycache__/fdiff.cpython-39.pyc | Bin 0 -> 2060 bytes src/lib/diff/__pycache__/mdiff.cpython-39.pyc | Bin 1489 -> 1871 bytes src/lib/diff/fdiff.py | 118 ++++++++++++++++++ .../__pycache__/remote.cpython-39.pyc | Bin 3079 -> 3114 bytes src/lib/snapshot/generate/remote.py | 8 +- .../__pycache__/diff_snap.cpython-39.pyc | Bin 0 -> 2716 bytes src/testing/diff_snap.py | 90 +++++++++++++ 9 files changed, 243 insertions(+), 9 deletions(-) create mode 100644 src/lib/diff/__pycache__/fdiff.cpython-39.pyc create mode 100644 src/lib/diff/fdiff.py create mode 100644 src/testing/__pycache__/diff_snap.cpython-39.pyc create mode 100644 src/testing/diff_snap.py diff --git a/src/iface/__pycache__/snap.cpython-39.pyc b/src/iface/__pycache__/snap.cpython-39.pyc index 7669ffdd61dc5e6b7faad8a82a39f21a996eda64..4a458a5283b680f763824b308b0bd2286806e59c 100644 GIT binary patch delta 1442 zcmah{OK%)S5bo-EY|mpK-nG|WCrE>(1lCH(0VH1>1PYu$5eR|A@^Ch(*?8jJS*K^# zLC~ueSznQWkvP~JlVtInI$AH+}%G>RBhUPt0h(`MSI6tLmzHu>AN; zrCTn$jGkZDuk^lO_^NVtvP~;w2z}Pkf8K`y?--!D(KiQH$1b?pFAYS;0T#Mw%>ZpI z?VBAB1v>kz3+}u|}+l@D6J?{?Ng%wjnohG}xv8Pv7hT zh^)+ihI;mhzsMQS{^qZ~{5+5-pZm zQ!YQjQp{1zchH%c*=I&;^6`g!?2bJJM?$&xVeFHSSJ?kDw;z|4t2nwdK6aFk-iUn( zlHwLoU5e@}jpch*5!*R(R9SggneqEN7xTzgj%K$HNZHrQJVoUT;f_wX3<)?0E~Kd{qd@wd}IEwIMH(*eZQVOu&Q>^zs#Mf`CQN zHG=(@ZTq|qF0UIL_&>JoX1|LMCW0KUXx9URh>fZFM=XU~)Z%1Sam|+5m{aE%jTcu2 zg1-DsMvQOjF*ML*?Ce*m@h6(<^u3>|yf=w@{_K1?t z9VItRQA)nLmyoL=8=d-)+yS0LUPU}P$oRzXa-KCa3Z-ZPq@vF&~ pXq7d*H&!nYkqr%t8uV<+O${4a;+#3rGgY{bKqBI&76 zs9gl1siZf(DfJ}cAE6hCe}VsiUZnUY32JBHx9`1q@ArOhcD|f_I~i7jz+<$&E$k-0 z!WZGW$})M#5bCS}F$Zn)y3sIWYhW97yOE0>V2O)n7tlg`+l)QTp|j0mAKe1>8%gL z{LMglilf`*lrPY0GkKC4gI*r>@|8w$Xbn2LJy!+F$DqqKt1|!c?~@jxb?ku*N6caB zDZc}Rq62FNoh<)j-oj9Y2W<kT}Hrh}b$s?5F;KxT}06)(pA-_d2w==rjinai(hw z13l_iprsj;)S@ zHOgvD5HKr(h)2}hBOL|q5OR=nbaJ}{a-6=UFq;n+$FGnn$21f*T+=X@y$WU`L8hKT K@X&Ld@a`XGHP9mf diff --git a/src/iface/snap.py b/src/iface/snap.py index 3024323..4c3c77e 100644 --- a/src/iface/snap.py +++ b/src/iface/snap.py @@ -1,3 +1,5 @@ +import os + from lib.snapshot import dump as _dump from lib.snapshot.generate import local as _genlocal @@ -21,7 +23,7 @@ def decode_snap(): return _dump.decode_snapshot(path=snap_path, dump_file_name = filename) -def diff_snap(last_tree, current_tree, path='./', bres={}): +def recursive_diff_snap(last_tree, current_tree, path='./', bres={}): ''' snapshot is a tree represented by dictionary {k, val} when k can be folder or file name and val can be a dictionary or an hash @@ -40,7 +42,7 @@ def diff_snap(last_tree, current_tree, path='./', bres={}): print(f'file {path}{key_added} subtree added in current snapshot') item = { 'name' : key_added, - # 'path' : '%s%s' % (path, name_last), + 'path' : '%s' % (path,), 'type' : 'dir' if isinstance(current_tree[key_added], dict) else 'file', 'hash' : current_tree[key_added], } @@ -96,16 +98,40 @@ def diff_snap(last_tree, current_tree, path='./', bres={}): print(f'file {path}{name_last} subtree changed in current snapshot') - diffsnap(hsh_last, hsh_current, path='%s%s/' % (path,name_last), bres = { + recursive_diff_snap(hsh_last, hsh_current, path='%s%s/' % (path,name_last), bres = { 'removed' : removed, 'added' : added, 'changed' : changed, }) +def diff_snap(last_tree, current_tree, path='./'): + res = {} + if not path.endswith(os.sep): path = path + os.sep + recursive_diff_snap(last_tree, current_tree, path=path, bres=res) + # compute moved could save bandwidth + res['moved'] = [] + for n, r in enumerate(res['removed']): + found, path = find_subtree(current_tree, { + r['name'] : r['hash'], + }) + if not found: continue + res['moved'].append({ + 'name' : r['name'], + 'old_path' : r['path'], + 'new_path' : path, + 'hash' : r['hash'], + }) + + del res['removed'][n] + + return res + def find_subtree(snapshot, subtree, path='./'): ''' @param subtree dict - find the exact subtree in snapshot + find the exact subtree in snapshot, subtree can be + - a node representing a file + - a node representing a folder ''' subtree_key = list(subtree.keys())[0] subtree_val = list(subtree.values())[0] @@ -114,7 +140,7 @@ def find_subtree(snapshot, subtree, path='./'): if snap_key != subtree_key: if isinstance(snap_val, dict): path = '%s%s/' % (path, snap_key) - return findsubtree(snap_val, subtree, path) + return find_subtree(snap_val, subtree, path) else: if snap_val == subtree_val: return (True, path) diff --git a/src/lib/diff/__pycache__/fdiff.cpython-39.pyc b/src/lib/diff/__pycache__/fdiff.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9df97cbc911a605e75899d1241026eb3f6a8578f GIT binary patch literal 2060 zcmZ`)PjB2r6rUN7|E%rZtV&DL3M8vitD34TMHO61ibNHOOH@&$3JYX;cV-heyY^;0 z+t6q%AyOnRh&$qta09*pXO4V=xpK;tBNBo)+!u5y%nL=JH4D<8g=Y-%i0Pt$tAE8P>k zV6(E~jrLhNozBW}=G_N@3r%NbBeg%N=Ziw{G|=I+obe)Gz%Dy^+{t8GWL{yjWMm2n z#+~e$j9g@a;7xAipOJ{+4F0}0+OFq(G+R!J(Y$D$jv6r;!O|n+G@2Uz_Ts6I&C*NB zZ7ek>H~@xljIWzP0zAaRm^LQn7Efsif)B%LV6F;#BcSAILF?pT`(wteM+ zEdX0$Z64UZ-QB1zSj`9R2Ntw_)@uifh+kC1LKb~PE~7S5ar3(h;m-Oh+QMqU;vbzO zsKwn46{?u^*ARHEs1-K2j8uQe5r4hHdxfoBMvx~ujfR^a?*AGlKv!=iSIulLDOpzK z?vf|6PR!-r?i_Bu(&63C0g^n=0GBkcE0bYd%Wa#c>Adcp^Qvl@ET9f}C6lsBcqzBJ z0158bh9tMvO^RlxTqLE0`2FB+N6CH^UTZ$+DBKU$J4*J+Ef_ap+=G!M+UveVqho`> z&D7EHcveq#@}^#j3D;4lb=AJoDSM(=Yof+UI zY-Ay1vj?BAynnSxM3zIA|sLk!}8Ux{qXTw=>YRb!s@h|N@b?+>1 zc;;ad+OfXbQ8cZ^ypT4z!CLbG81e%g5D$AK#<3G(8X7$$6nprDV`?P|wwM@Bz(W2B zTtZ@qI;T5BBHo0Y!T@(-aDGZ=z31IigJQa;!iq5bozqfAT32F44=|wf$>*f?pvQTD zT(B@_4eb!|9-|duZW}0{d4QcB%s$K^%z;H*B)(RG*aj3L*0U&#E2<*ExC@AbPO8Eq zJjJi0_fhNaUQy8VJ6oqik97|)M#^b^V(1}~&~I4?{rw8`fc~Key%*lT)UW?I->*$v z8f~UnT!B5>V-S}>`gG&0AjL&69RCZX@m}iN1JgZTEulOMsIpaft?A>sthBojWhI3< zNbT;4Qu1_gR-$%|%&(Wyl$h>y*DE=*w!D!-<4WUc=9f)w%0hc5_;GEOi8ml`Mh#{( zu3xN{(5`KZp|!>M1{QCDXNoscvSCjEeo?;p t)4*@RLQ#0|-XgIp7UOVVnX5xgein5#7+<_?Cq@#LHFlR$bL6j$*#m-rSb#;8&4r#!CtIv z?Yx7PlTCsk7J2M4v+&-VH~a3tg&_+9&mz3~Pk81&hmUs4K5fhLfWS4>sPF1Z!ID?3 z-oT3IIS5`M++sa6G6&sA$hkljPclvlrg+AL*Z?D<(x3~bA(NG6yi%uz32+2UA+s9= z2R%m}Lep|x5EntQ63qzpmrEo2AS$MWSVChIl)+elXXr_iL*Dc#%J`Tk&}BmhVTD#4p#kUSYxHf<>!cIa(;ib t+jTx{|K-csaRNV=b;`t`PQ+!_XDh|l579~ delta 197 zcmX@lcafVfk(ZZ?0SM&SXQ%FB+sHSKvA!yoO92RU6%xU;0))%}0thP;2q3I1Ab_w^ zQ&YKs0IV%Z0nAWP$O8h1bPf<8v>@wIP`Jfd to skip it + ''' + filea_obj = Path(filea_path) + fileb_obj = Path(fileb_path) + + filea_name = filea_obj.name + fileb_name = fileb_obj.name + + filea_group_wrap_tmpl = '<<<<<<< '+ filea_name + '\n%s=======\n' + fileb_group_wrap_tmpl = '>>>>>>> ' + fileb_name + '\n%s=======\n' + + + lines_diff = compute_diff(filea_path, fileb_path) + list_blocks = [] + + ''' + list blocks contains object like this + { + 'block_source' : `filea_name|fileb_name|common` + 'block_lines' : `lines of that block` + } + ''' + + for line in lines_diff: + last_block_index = len(list_blocks) + + if line.startswith('- '): + ## line in filea + block_source = filea_name + wrap_tmpl = filea_group_wrap_tmpl + elif line.startswith('+ '): + ## line in fileb + block_source = fileb_name + wrap_tmpl = fileb_group_wrap_tmpl + elif line.startswith('? '): + continue + elif line.startswith(' '): + ## common line for both files + block_source = 'common' + wrap_tmpl = '' + + if remove_diff_letters_code: + line = line[2:] + + if not last_block_index: + # add a block + list_blocks.append({ + 'block_source' : block_source, + 'block_lines' : [line], + 'block_wrap_tmpl' : wrap_tmpl, + }) + continue + + last_block = list_blocks[last_block_index-1] + + if last_block['block_source'] != block_source: + list_blocks.append({ + 'block_source' : block_source, + 'block_lines' : [line], + 'block_wrap_tmpl' : wrap_tmpl, + }) + continue + + ## block already exists, append the line + last_block['block_lines'].append(line) + + return list_blocks + +def print_diff(filea_path, fileb_path, remove_diff_letters_code=False, outfile=''): + formatted = format_diff(filea_path, fileb_path, remove_diff_letters_code=remove_diff_letters_code) + + out_str = '' + + for n,f in enumerate(formatted): + is_last = True if n == len(formatted) -1 else False + + source = f['block_source'] + lines = f['block_lines'] + + wrap_tmpl = f['block_wrap_tmpl'] + if wrap_tmpl: + if is_last: + ## strip the last \n in template + tmpl = wrap_tmpl[:-1] + else: + tmpl = wrap_tmpl + + out_str += tmpl % (''.join(lines),) + continue + + out_str += ''.join(lines) + + print(out_str) + if not outfile: return + + with open(outfile, 'w') as o: + o.write(out_str) + return + + diff --git a/src/lib/snapshot/generate/__pycache__/remote.cpython-39.pyc b/src/lib/snapshot/generate/__pycache__/remote.cpython-39.pyc index a3ca73e452400492f83162133b01d09fb50f349b..3da282022c56ed955e36e0cfeedcdbf9c03c7940 100644 GIT binary patch delta 455 zcmZpdSS7)m$ji&c00b(L&S~Kjd1V=AOw!V<-s zB9g+H!UYuPgNk#f@Bqd6Q$$nvQuu-50x4oC0x5z(mSBodlu!y|FoUM}#v|g462|%& z`MIh3Ii<;o`nie4mHNd+$@)2&Nt@p@E@9XHB@L0z%P&dHOUzA5Ez$=vQ;XwMQp@y{ z89@$&0+z`OImK-lOBhoan;97yN|qz*@DZn-U-M+wE`%>0>sWhTx=^2#z!nW!D$DU`yJ!rH~lEmWds>yRWWhP5Y7cPAf#pEulGR9>jVV7;8VA@^ za^uQB$c3ZN{F}LQ;sJC+W`*4dYjQ zDL)pxd=4%95`-{>IWorPfoU4T5|tl~14~pz4f=|xiw)?jq9K~l*F;NfLSGkKq7D6q z=!h=#4bgjQ^tXS5)r`KGSF;H_=J;~;RAJD7_5@n?6$oLT>&L-jujz>gpgGNML#8FB};t)^95g~CLNuEZY6Uy9nBnw?h z0_ypW?**>UiBE-e9oOM9rZl%xDwxYskAOW%!hp#zl9VLGWeMStliM_ad6zn2z&$UF z31wjz#4HXxU!-pAEt;p(31@q=A7-#z6el7UDGB_TBoU{MANkT1T>3POIh|XJW;z^6 zislC!>2xHd0yh#$oj74&>G+Q0hjHwM9t{%VIRuW7%51YJzg{#DC%vs6 z9rCfr>&1%2CQjkg9c$Ah40+#DNW9aIKF9JfbD+dAn;p$9h0M#FxZNR=WL{OTY0Zd1 zv}Q`me2bqbB`23}6(zH|p&p^fk4w=Vv+TtnQ(T96IC(x;F1dI7B5&*9Ga(KUAtYa> zFN9e&ADWM>o~dlm-C$@Fl$xR6z~G-URCIu&-L*XJEqS`Vuh1h^Ls3Vufda3GLJu^A zY7<9WC^{&*DDHy*VmLs%WIfO3R&LVVbO3EUblzG8L%oX2JV5a}3WT)~Z^0<2oMKo_;4a1MY!Q z=^&Z`AA;`2LH-{G6vtUIK)sDV>nQYZ@qXto-s?c%aZCQ|Kzwwk|Ic9dCWA#&w1A#BzeOi5}R#SV&BP+-*N6}5}w_fVkaytdZ1#O~X0?Py$=oWNz5nC_Yy(>>6w z=fpFZEn^BO>B@zuicP3rWlXPTHm@ofSYvi5Z2lh86>1vYk74g3V_bt6ulTiO0hoS( z+I5%~A@~GMR{7vI#EN@VAf|bUUR=j)0J`;IBWn+Ahr@phCxZH(1cX85k6jw4G3Qa@Qkf74kB*Gy{fhF)_S{O-QcP~k z(GRqT8T`$Ga>*uHI#pvf8%`%ae4jZWjB3@gO#QPgtNPOVqguCquXitXCMcn4{Yz_6 z--e`4;j8_AGp`L(#-%ROx