[Patchew-devel] [PATCH 2/2] testing: Fix bugs that new reviewed-by tags trigger retest

Fam Zheng famz at redhat.com
Fri Nov 16 06:09:48 UTC 2018


New rev-by tags should only initiate a git apply, but the testing
results are still valid, we don't want to rerun all tests and especially
get the same error reports a second time.

Signed-off-by: Fam Zheng <famz at redhat.com>
---
 mods/testing.py                              |  17 +++++----
 tests/data/0025-foo-patch-review.mbox.gz     | Bin 0 -> 1417 bytes
 tests/data/0026-bar-patch-standalone.mbox.gz | Bin 0 -> 1558 bytes
 tests/data/0027-foo-patch-based-on.mbox.gz   | Bin 0 -> 1421 bytes
 tests/patchewtest.py                         |   5 ++-
 tests/test_testing.py                        |  38 +++++++++++++------
 6 files changed, 40 insertions(+), 20 deletions(-)
 create mode 100644 tests/data/0025-foo-patch-review.mbox.gz
 create mode 100644 tests/data/0026-bar-patch-standalone.mbox.gz
 create mode 100644 tests/data/0027-foo-patch-based-on.mbox.gz

diff --git a/mods/testing.py b/mods/testing.py
index b3e4b07..66e86b1 100644
--- a/mods/testing.py
+++ b/mods/testing.py
@@ -119,19 +119,16 @@ class TestingModule(PatchewModule):
         register_handler("ResultUpdate", self.on_result_update)
 
     def on_set_property(self, evt, obj, name, value, old_value):
-        if ((isinstance(obj, Message) and obj.is_series_head) \
-            or isinstance(obj, Project)) \
-            and name in ("git.tag", "git.repo") \
-            and old_value is None \
-            and obj.get_property("git.tag") and obj.get_property("git.repo"):
-                self.clear_and_start_testing(obj)
-        elif isinstance(obj, Project) and name == "git.head" \
+        if isinstance(obj, Project) and name == "git.head" \
             and old_value != value:
             self.clear_and_start_testing(obj)
         elif isinstance(obj, Project) and name.startswith("testing.tests.") \
             and old_value != value:
             self.project_recalc_pending_tests(obj)
 
+    def get_msg_base_tags(self, msg):
+        return [t for t in msg.tags if t.lower().startswith("based-on:")]
+
     def on_result_update(self, evt, obj, old_status, result):
         if result.name.startswith("testing.") and result.status != old_status:
             if 'tester' in result.data:
@@ -141,14 +138,18 @@ class TestingModule(PatchewModule):
                            status__in=(Result.PENDING, Result.RUNNING)).exists():
                 obj.set_property("testing.done", True)
                 obj.set_property("testing.tested-head", result.data["head"])
+                if isinstance(obj, Message):
+                    obj.set_property("testing.tested-base",
+                                     self.get_msg_base_tags(obj))
 
         if result.name != "git":
             return
         if isinstance(obj, Message) \
             and obj.is_series_head \
-            and old_status != Result.SUCCESS \
             and result.status == result.SUCCESS \
             and result.data.get("tag") and result.data.get("repo"):
+            tested_base = obj.get_property("testing.tested-base")
+            if tested_base is None or tested_base != self.get_msg_base_tags(obj):
                 self.clear_and_start_testing(obj)
 
     def filter_testing_results(self, queryset, *args, **kwargs):
diff --git a/tests/data/0025-foo-patch-review.mbox.gz b/tests/data/0025-foo-patch-review.mbox.gz
new file mode 100644
index 0000000000000000000000000000000000000000..32171bb3179ce3fdd04c3acb15062b72beca9311
GIT binary patch
literal 1417
zcmV;41$O!$iwFq4Iqq8k128Z$H7#auZ!K_PbYo~Oa%FaDWp^%ZVsCf=rB-WK;z$tv
zEWe`8e1bF6q4OXKQD=Ps>aHkjaMq)T!wI1wy-OaGP88<XZ#6+7f^!__gJ42+*S)u@
zZg-2#_#;c%nDk=@c$ma##?qt2%lv>nDRDZj+%TVE%$T^njsrbU2&n#ugIMw7(1CFr
zdOU)70^eDflQDZ_Gct<v$Y<gxilb?i%Uxj11fND;#sp~8R#eqiG`*py7I*>@mWDjb
z*cb$h#w>*zfIs6b$_P)KR|{SNO5OzYq13f?;=^+EKClSM#R(&mG!759`F?)Z?{GuE
z4H5Ps!1aeSE;6A!ze74%o<^kSWq|_+zrO3&7eO45z at W50RLhSKWm1D0j1~~i6)7MJ
zH<Kb(_MUhafZOf&T;O9+4b!5Q-LzCgGi*~+?51YfcC*oJP^+;I-8lLJngxI65h|>j
zpxREubW{}xwJ3#Zuhp+ at p^SZR7Q`Zh>VxB`14q|QySYQ5T4fI*mRT(EF%f17RNHeN
zf}vO{23AWY`jDEqi=;d{=S_o9O3lk2x&E)RH;L1o^Ra`zraA^HU?Y8l($~b<bh=R;
ztOu3hI(1ataCDS{4xEOrS at d^^PrUHQ5sr1>WwN4QYp^0^w<Rg<G9-W96r|P~m0I-;
zR at B<fs>Md!iwKjL5Os;<60}IXkO<$4BAm4kVsA<8cHbaZ)`zg0yRnCJRaxg-)}*PZ
zx~8bMu4wkaF|4Mg73J6__K|A5^q6ffDY;kV;{FZX)|;Kg(WVePRq&tX>?UbEmJdo2
z%(V?li0Iw1 at PI*R4JtasKyt|ikEYPSbRY3mLD}a?fG*uWZJoEtjeAUv+pg9y$=PX_
zxaY^ZZ9o;D>-YyFo{5^==PF)VEBGwU_=Njt$&j+|ITPr=g}kpz(L;ln at OiDs+kUa6
zlhz5PR)^a5er2zpGnCC<%SH>?EclG#qW|3XPq+NX8!NeBsaS|o!g1gyL~RgN*Okay
zlth%un5LqlI{H!@1pIzotLVFiV$_STO-9RZ$Q!OY6QWNwqe<<zd!e!Fg-$9 at yN(ya
zeZa6lTTNDxC;H9-skBge2exHv$_$2-&BhE}CWJR-<N_r-kO9=xY^oZTVJSEvmP%A2
zlaiD at mJ(k?<c1})#qv(^vz4V)cf>8+ft)NH=w5W&EjICxnWmUF#1X9f5 at XL&wvg87
zfLmM{E_(13 at QlfqZ2SeHIKz{F<}J`}WMlCe8aJ7)mJvhlWnx>t>bU3br;26{YVU5Y
zI}|x%K4vC3_NkZQ%n<CYjA4;p*@gpWSGV;`9_4f7rYUoxD|2|5vWTVJAK+duH=Lr#
zWjm_4`RHFv<-iRV@!{{63J>6+cicZcAHerKPIFv%9nBVitP(zBs1A!j<jL{~8)KFe
z#-cvXF?*{`?noCqIz(IlhJ(W62%#vbzgp>~h;YpCKy{V}ROM1?x@?s7R?6lbWf^cA
ziF_pdl#g)TL6BvMaO(Bqgj)yK!y;=vPBKg?>gz4PeyQvo$e**=**M!*CbEJ34^fD8
zn6Fc=Kpdxjfa0zI?8@&I5%nMoXB)}us|}<l;p#0IM_YW)*(})=`7^+H0ZLZO-Cq$)
z{=lP2{99^mXw^>BI2EL9BJaILRf?f>;M2N2KYi?Sdq?i^YAPF%Tt7u}&-XgY=O1A_
zq{H9M`b_236s{w15Z%s at 0^AQxt=ZHXTB8YWuRm0u-<VCRuHJy_;-}l`wd6++ZvW8?
zw71)n<=1_uL)s at 8aC+@_0Ipk?fGf^!^r1S`kPF at l4RhGgSJ}xop5}tMnV01P5mxY!
Xd*tj1ony54`Qh+Ce1Awo`3(R7w&=^b

literal 0
HcmV?d00001

diff --git a/tests/data/0026-bar-patch-standalone.mbox.gz b/tests/data/0026-bar-patch-standalone.mbox.gz
new file mode 100644
index 0000000000000000000000000000000000000000..c8f80ebd8a32aa51a3e14efcf93a50005dac9f51
GIT binary patch
literal 1558
zcmV+x2I=`9iwFoOTJBo_128Z$HZ5XdaxHLSbYo~Ob97;DWMOP?Ze=cQVsCf=rB_{3
z;z|&GHou~4pP+C;CJFgc_o4#oT~V&V-7PK33Sl5~H(#3sMeF|f+e1)5aLaWcNJ!|J
z?sK~P^w44<zh at a6k$&O;kJ2P7Sk_Fv!VlPkoMaQ}iunv}M#SxP9O!v at 4wa`QNMt{W
z92g~$$74vw at RLPTGGg~EB*SDH`z&w9Nj!<CViy>(oKIq}U^%FYB~xn2s at 9OH30@8<
z%OYMBYy>%rM=XOXfFE)e7lfzIs|BwDO5Y6VL$0e!#|P`yd%$7 at m!yo0vm`p$#9Mpj
z?_h<$6%zI!!1V_q&x>4seur?1X%>^7R|F31|NgF at UkGtP1O{vSLuLK(b{*893d2W;
zX0jj<i3<gZ(#``f0&u(io(p^gR5wh;v}}{=s%{yoY}u-5S$4y2C}v|1x=FkXstJEj
zV`P{bKrN?XIFtfWOhti8uhp+^M49+r7$kWCm0QQ514q*g%ih9JRocN2*HO&lV|i4h
zP-)M21iEZeG_0(p=tFGcE&}rKl-oK{6va62k;@;_&N#`o_Qw|ZDs^;Zz(V-CqPzyq
zCX<!yU_KOKt|<=HbVoxfl!4RGR8#pA;A1a(YGPXlULi92xe5zVR$G8l&m;2Xssy#<
zXsuM=K&6=5QMK5Rdof`mCX9Lw<UHs+^&*n{UL0eueK7Wxh~4Vz<ih+=?8f%kqZyT#
z{^mKcWvZz%wKQ3^299pprdp<B6WB+x at ls=!F^A+{kh7aN;x^x`B#ttLu`4ounfGp*
zB_r`5r@>5JfrJsg+ZJxo2&I9dLJS0!Y0l#b^v~UUd{sjBc^aTfw~t$=ZF1!vlEb#E
zHVkrd+$HYmp=Rk&!RI=DV91NSD)zZZ7Sakn%L+c`K1woV?B|r_sJ|t>uT#-Off(~y
zwe;J5k))&6k)oI##j^IKo&J;|ZPt=DrKHV-8j_3pbKO7Q&>wFkPji;#kNKLzQQ)V9
zHVD-;IrbjcNEFN%hD?ziZO#n_{C-|5sJptX*UQ@~qIoq;8!ip=ysxObtypi at LSs=2
zolH!-ju*jAz%W4 at MJ9=fzO_N57BcU^CT+IxpbOe8^w4E_?oAjuL(2ArfnunZLUmI&
zW$X}>5|wN?{Z8Dn$H~#71KqQ3yT!&H#;3}L1xXCc>O$L-j6Dj0bHFVJ|5*<n0$woj
zl8tsDP70jgq4$WQA<Bb?D8FQ~SVnZQmx0Cgs&1ZZSdmp at P<?lad`GGZ=A&nV&6{}z
zRzATBDHu}ys`(u_xwx*M^LRQ#Y^ppXnmmKs35!|A{Q>Uva!x5zwJs`>J01Rut{k}i
z=Osr2xa}SGk530M^fH(a8QkZHvAB=@#@<Tjchbemi%@>QVnOpHMrSfIOr>6iF^m`v
zK4(5iq;tXAJfX|2<khpp+~7LSr^DRO_z>6a2St(QPQ6}EqNQ;?D!tZ|v_PkMeYxf5
zU1?`u{9Gi?$_!pK`%3J8<s}UV)1}Kr5Qmu`AbpDfw)yu;i+WH*;fnM6VgsQaxOyXu
z<_6wV7N*-Qe-$tuRMN$A_jkw=Kk#^*{1IC#Tpjxkd|~%^<o%X}W7z-kfVb6_+=at%
zh>DxQ2@=LV*q=W&`NRvkSDHvWbH778l>J!ow+mfw23L$1PsmOt?rY87&ax!S$-2<I
z_oOA2E$_gmWdnTr*a7%ExxwSBXaaKi5Q{yx>lNM5tJ+hP+$nc|>h&4Qs~%rkIB?~5
z?i7HVJ43Z?wV^g_aC`kb`uxVQ6}or>u8UW<(`$)K53awdI*RA@(foGP>5%pj8XRA`
z9e~T$IpB(uEA5WnsfYznj=FKz&=%gwSDsCC;uc;p%`rkrLT!;G7yl9onH!JE at bTAk
zL?VPpb4B_ODAXjpjCshw4^Y>INK>4GxtQrmT&YzhX~f54AY{S|@akgSP+TRB9L<0k
z_K2yrjDI4As?K~I2#TTW!bxc@)oQiHie?js-L3*P3eBce3wg|dq9sU3u_kNM|7tD~
I%D)Z(0Cyt-umAu6

literal 0
HcmV?d00001

diff --git a/tests/data/0027-foo-patch-based-on.mbox.gz b/tests/data/0027-foo-patch-based-on.mbox.gz
new file mode 100644
index 0000000000000000000000000000000000000000..5553b2a939e46a276479b9f56f6d485a584157dd
GIT binary patch
literal 1421
zcmV;81#<cyiwFp^Tkcx`128Z$H!WswZ!K_PbYo~OVqtS-WG!!QE^T6OcmSnVU032r
z5Pg<kQD>gu%yj5{kc6nSqXO!#AFRPyj~)&ugogAk>15K$2=nW=nxKH-9LISOOsMX<
z_g2;IZm}u<&N4P4y~G0^r%9Hx>`NNtVZ<J_B%4%jSjaGDMEq{YgKi)tRDUE<qJ>H9
z!6=CXE+84hHx?IU#J;mB8774YnfxLWF%gB at 1x8Hri3oBg!Jw|D>#k;)4NZ3-kdU%0
z=6TLWAek7k3~B)3lrxbNo_a49ya1HG3g}&_YpcYEo6-Bg1d>ZqM#fnZA8zyg_ at v+A
zntp2{>_dd>52sw_QhR!bbn+q-q#NXs2M52t>*r at dJW#-3V}Gb_K0a)c>epa6hj^wb
z0a3WA60x%P$nyyN%U;(9J_6mc9qPDEN4E^iwGGW}8jkBW8_foF8vAgWh)-ZR at Mj@V
zVciDZ^%}OP>p-YODO9_yUTq6y5(d*KkvUW!JWua?rfIv)9SYSddkArp#R4Cbah^i8
zJ>xN0nxkW2b)!V at QWJMkl!s@$X%R}PebFV?|5f(JNw#x7cF;F;&q4)Uq;FCBk~o`8
z)~bW`peo#?o^D#6iBizM*Dwu-{toeR5dZjsV;u##s_5q$EJ?X-MasB{$zL}msg*_>
zt@;Wp>g;CKVnZGX!W1S%y+LvTTBbovWEcp6v-VExErs3fS>(!j7j}C$_IRdit9*-^
zG&S8cG~G2d!|i*P({zlo9NWa+Q;p{ybL|Bs|B9U7zk=I&wUap76k?|u{<E0fG)qS6
zK}(~Vu|^3Iy*U;hFbJ(dM~CPuE`{V`0=*0WJH9F at hdhnYrQ0X1vo^W$kH}HmHySoM
zJ-H<Q*^%j5P{rpu{=tyvvZnUAN|x3NA<J?;<{?@#Wb9kPB>HbD at 5@qj(ICcrRx9(i
zpDpRQbxf(#p{~1M+3OVyWph`u(NZ=CKBBnjKexS;E&mBdS|M2`=W-+AC<;@eH;8VU
znh53_A}VEUThmb;bD<3ae!H$!^j%A{>gCruqeV9q4PT#1*`tQlr0(mz&{+0DCsU_g
zCy3!bVpyQ9Cab6uedmBwTBy7S+p;xP22082Vunj5WiVmn93?wY0n|2Js#}ibXgDE`
zPIRJ at l3^h6G)}}u_H#jQSUR0AE*3vqzOm|#_ at zaV<GBZy=a=mk8wW_w&}<hH0juW3
z*wc*7l|Opmm-mMAE<8p&XX+&zeFBl>c>GU;IeL!jE<Q!~CX?kdVyV4s?9CT#_cQ`j
zGwgot%^h}!O6M%hl^A%h2yz at 8f(@24tketd at Zj|7wtm4yF+*;KHY27sgNF$dEaPDx
z_j<nOl$GA}q>5h*|HV`u++Zai{(dfVA0E0#y_2&(d at GWyz=hXhItOHx at +m`gm;hO%
zi*sy*S&kVKJsf8CTCd!ZOKj^Hz5Odr3r_?>(NKTA(#;Uzh~cT~El#P*h0=7<Evv1x
z^^3|P;8w_DD8q~oaos_b=c)AS_41fo1=r&;YduMGOe*WEEkA#%>>a3|^Tb;_;FnIa
zhW!s&igZ}4QZ7LpWnqNkE&=SyACwXGD37OW$?MAvlriDzEf`<6_ at 1$8x-0T$fbkZT
zE|>eiB9{7ri*fQ>YOQJ2&axzvWYbCBdX=h_L+QbXReOGT-wpSU+~fUJH6pow6l%}6
zI?Bf%aWbHT-_80&<;4`PB5)A>&VT~k4{W2^G#W;u34XUX(4XGeO{y>7fbZj{-|4p0
zM;C7YF)XyV+vCO8eWyd(#~5&O?RNmKTNi*UPH)VCJ}{6AUJWgK&@h+T$yc5glK6R$
b7ZMRxD#uGdeoZA~+jsv5U0&>@2o3-M@@};e

literal 0
HcmV?d00001

diff --git a/tests/patchewtest.py b/tests/patchewtest.py
index d41793e..fc6de3e 100644
--- a/tests/patchewtest.py
+++ b/tests/patchewtest.py
@@ -101,7 +101,10 @@ class PatchewTestCase(django.test.LiveServerTestCase):
         self.check_cli(["import", self.get_data_path(mbox)], rc)
 
     def do_apply(self):
-        self.cli(["apply", "--applier-mode"])
+        while True:
+            r, out, err = self.cli(["apply", "--applier-mode"])
+            if r != 0:
+                break
         for s in Message.objects.series_heads():
             self.assertNotEqual(s.git_result.status, Result.PENDING)
 
diff --git a/tests/test_testing.py b/tests/test_testing.py
index 6e960f1..6f2808c 100755
--- a/tests/test_testing.py
+++ b/tests/test_testing.py
@@ -260,20 +260,36 @@ class TesterTest(PatchewTestCase):
         self.assertNotIn("Project: DENY\n", out)
         self.cli_logout()
 
-    def test_tester_single(self):
-        self.cli_login()
-        out, err = self.check_cli(["tester", "-p", "QEMU,UMEQ,ALLOW,DENY",
-                                   "--no-wait", "-N", "1"])
-        self.assertIn("Project: QEMU\n", out)
-        out, err = self.check_cli(["tester", "-p", "QEMU,UMEQ,ALLOW,DENY",
-                                   "--no-wait", "-N", "1"])
-        self.assertIn("Project: UMEQ\n", out)
-        out, err = self.check_cli(["tester", "-p", "QEMU,UMEQ,ALLOW,DENY",
-                                   "--no-wait", "-N", "1"])
-        self.assertIn("Project: ALLOW\n", out)
+    def verify_tests(self, projects):
+        if projects:
+            out, err = self.check_cli(["tester", "-p", "QEMU,UMEQ,ALLOW,DENY",
+                                       "--no-wait", "-N", str(len(projects))])
+            for p in projects:
+                self.assertIn("Project: %s" % p, out)
         out, err = self.check_cli(["tester", "-p", "QEMU,UMEQ,ALLOW,DENY",
                                    "--no-wait", "-N", "1"])
         self.assertIn("Nothing to test", out)
+
+    def test_tester_single(self):
+        self.cli_login()
+
+        self.verify_tests(["QEMU", "UMEQ", "ALLOW"])
+        self.do_apply()
+        self.verify_tests(["QEMU", "UMEQ", "ALLOW"])
+        # Getting a new reviewed-by shouldn't trigger re-test
+        self.cli_import('0025-foo-patch-review.mbox.gz')
+        self.do_apply()
+        self.verify_tests([])
+
+        # Import a new series to rebase onto
+        self.cli_import('0026-bar-patch-standalone.mbox.gz')
+        self.do_apply()
+        self.verify_tests(["QEMU", "UMEQ", "ALLOW"])
+
+        self.cli_import('0027-foo-patch-based-on.mbox.gz')
+        self.do_apply()
+        self.verify_tests(["QEMU", "UMEQ", "ALLOW"])
+
         self.cli_logout()
 
     def test_tester_project(self):
-- 
2.17.2




More information about the Patchew-devel mailing list