From 0d2a3a612316e34b471d92a0c21b8a79a0f956a4 Mon Sep 17 00:00:00 2001 From: Nico von Geyso Date: Thu, 1 Nov 2012 15:35:53 +0100 Subject: [PATCH 1/6] added Repository.is_detached A repository's HEAD is detached when it points directly to a commit instead of branch. You can use repo.is_detached to check this. --- src/pygit2/repository.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/pygit2/repository.c b/src/pygit2/repository.c index 8ba3704..bd346ce 100644 --- a/src/pygit2/repository.c +++ b/src/pygit2/repository.c @@ -185,6 +185,22 @@ Repository_head(Repository *self) } +PyDoc_STRVAR( + Repository_is_detached_doc, + "A repository's HEAD is detached when it points directly to a commit\n" + "instead of a branch.\n" +); + +PyObject * +Repository_is_detached(Repository *self) +{ + if(git_repository_head_detached(self->repo) > 0) + return Py_True; + + return Py_False; +} + + PyObject * Repository_getitem(Repository *self, PyObject *value) { @@ -852,6 +868,8 @@ PyGetSetDef Repository_getseters[] = { "The normalized path to the git repository.", NULL}, {"head", (getter)Repository_head, NULL, "Current head reference of the repository.", NULL}, + {"is_detached", (getter)Repository_is_detached, NULL, + Repository_is_detached_doc}, {"config", (getter)Repository_get_config, NULL, "Get the configuration file for this repository.\n\n" "If a configuration file has not been set, the default " From 1bbb7b549f3c06aaeea87edbf138b0a6738753b7 Mon Sep 17 00:00:00 2001 From: Nico von Geyso Date: Thu, 1 Nov 2012 16:17:29 +0100 Subject: [PATCH 2/6] Added empty test repository --- test/data/emptyrepo.tar | Bin 0 -> 30720 bytes test/utils.py | 5 +++++ 2 files changed, 5 insertions(+) create mode 100644 test/data/emptyrepo.tar diff --git a/test/data/emptyrepo.tar b/test/data/emptyrepo.tar new file mode 100644 index 0000000000000000000000000000000000000000..8584ee7a1f2ca2c341e266e7483c8d16e07293a6 GIT binary patch literal 30720 zcmeHQ`*+h;w&qv+uQ+vbn>dZ1d9`5@CWOwEdpqr26z;6MAb@Pkv5GAjNhV}~`P=XJ z?R}0cD^5bdfv#R>0kNg?*k`|A68>nMp2z+;YTUWCpC*3xc6RRIS8H#l$=}V^_O|@y zXZ+l0wVT`9JI&o)d~UYd?Y;ILvvX?@iq6^(`2!HaC7=^@9b_b>Hih!AB6qIS%jO@ ze`lw)x1|49r2p9KzFL?P_!Rm#m-hclkpE6W|97LXADk|DXVQOH{k^&VUu$c-;QwuJ zwOe;gbHQ-TUGD$6|M#>T#r{dT#1J3}(kMRfNAbu@-@w}qqRPPtq9pUN32kyd?GG@|=;&OMgZT6y(1XdtrCrFE#+Yx&ODl z*KRKT|1ZIB1^V~=q#Fn06sCW1yI-gOTdh_>|L<%u|F`u27Dt22R(cYK-pKF41UUci zuJL<8YSKZF7&?AtEyomVCXEbd;J%-mR9{+*%P{=MzFv_3h30+S$v;8=qY$vv{|v$MUujQ2PfV>AL9xgDV7Z{y zkE79n6o*7P*vsV=^K%elMmq3P!x~y@&VqDc)>hUGvjg2|H1fkVsbl2dqS$z597ilJ zm{F9Z!*dga=6F-gNIx15qq879HD}Re*fSj;qfeu#XA(a(Q6DSVUCr1_5uSvJS)YV< z2QD!(LEoH56LaQ;FkO*BwN9>A_c3{+{xtGV_~GA6GgV-Qg8UDn=+$DKf9&@O`oGQi ze_8)65bGAc&ZYkt-XLVSMhOej+9)}#C*Ej0{6v#*4gK3&#r#hj-2jOHmj3@O5WKMD z$~TQp5H^xQc?AmcD1@dJN*ihdqro5*s$~h$*UAp$;TdpkJc$w9_yz$DPGX}QwNODioh{K0W zQ5E~Xqfugy*$?7G5l(|^q6wonqO@|1a?UV7L4Usj(+Lv|#CgD0eCoiqu;LhrkK#`c zW;xr+=Tc*=hFL<>UeNEuGvEn4qDe%-1;;yDU+i zf+(0z6asb<+wXcb-r%5KtCd1hpD=28?hg#Mek(PrPK{_v{LRcpLaa+9Q6A zdk#~^>-9h$^ILEl`n_7z@7KVm==Z_60^q`xT`$BkNg51?^hU@sAS;;)6v3Yu+7T{{ z^-_YK?}1=l4{%pj+ncLf6=0-n6w#Yid@`mnNn#PTu^$gjEvR?ASEdF4){@5a#)@fd z8hltWD~*)~y_v@IjCc)GuNz#x3n>Jq*RV;eV(#80k8HkAp~8nKyI`M{OZNc=*W@-v z$ReilEUcKic}ZEdbnSXb{q-&o_+@#eq!0nJZ@)FG!f)SwXAV#t$^m1{MwL+ciPt4) zzx{guV0E4Azd?u9-yc4HarETzPrp8T@$kWqzdSbY!Ex9u6a+k5uWuYatJXJG8#6T8 zH_uv)@fweI3ZrCduM<;wzKW$QiiP*@jgQtXe35I1hjMx8<`vZZrC;aTf7NK8ZTH=# z*Vz9Sd;Vto|Mqsac9!rVm4Xl3zE$79j6RLQP_=>&?Z| zIFstUi>Wm?$v{Fx|1H#t*Z^mgv4k~AULPSMv~)6INa=;f8zc0D)`OCC28#NODF1#408AF>r0K;P8zPX$da{*!!A3(JE|xh1UE#~3f{ zZXQHDv?Om4V0+empzZ5;Fz&Ea47^YM(2u?0rs=4!;M}{M$B(t#;YT#$z$Wc8pb1hv z=GWBkfKF_&^H#fF%CeQ|O~&wdNaz_eBBmaxh%&kpQd6m*L!koGM2oWad}idnu@>!p zxddktF4KE634_{@InpiN!Dq#O)Lqx;|K@IMcUJ$S7o7FKW&C%WnqSxcSpAQFprC(l z&Y10k1B^(Anj@ljtV#^Z0YV9{ddfJ4sY5DYzcxY~GPY%WH}L_cCIs1T1y5sBqb+f)g-mI&?EG0A3S{2;AxTuWk)emfwK&i@Ye5MIcW7= z>$}S8Un?KV`(HsD%$5Hs2^Zo6UMK&1%|iblZgJ_3m^hOn{O3`NYErBu65YhPbNdSdpW@EHb|*=h5=Kr1{qOyjl)5**ABRA znaV>qK47-8jCfmPuhkVsU+pqb5SB{_yMyjQCD(wu+OCv+X)D)zlAuh^M;$z#*#)ol z4SSSdBH*HLg&4kR?yi_K)CbU*6cJjGGoFmoDYkols+mpBEcb&fRVzD4t~Lk2y?c#~ zYPp0&CVySMg%-=}GTNm*e*wV&4vB(j8#!iWR7Bviog>E#qkwGawa0y?+O-9j*>U8W zQ}gS8(a%nKcLZ6r*Kj`VISVmrkCf$L9 z$PTk-W^js~0E6z)pKyyQb19Vf%E0-HAbg=;4}@9};TpIjg=m0n)AalR86ZivKi6Ry zNG~(KsQn8UXV$7%7Rh32dk%&l^MSbwZf1J`kTr_lu!c~txYJlB=}PuUm>svX{0C@- zRYR1ypqG%|AdlqE4wV$=j!p)@Cv~DElCA?A!jSzC4`ou$L`f75&tGuDi&g+&^mAV`pn*EqwfWWCRTJ#IO3%eobZkb3a__ADb zYv(DaV<6Td+|zVOj&x3gOvbe|s_}Ud&Ex61pqI^!+>Br)RT)-X`NWDV@ON~ttDH;NGGvelzUfB&DS&6B(KI?CnDFKxIHEODyq#yp~^=^Qf& z$(=^uM^VNuv;H4B(5qN*|sIHC=>o_&CV!NHifN>5{W5&V|9k?TXW{EwdyV=K!<}K>7{c_oCm|w## zTdDH9hyw!!%FIl~9(*(VBwCQ#jwMU0>!r2}lj5Cv@C4Ra>W?J&LvF4em0L+$PgeN1H1X%e7KY-%wv99Quq8)4#n z-;0L^0?a2Z-qe%lX$NcDk%awq^J8(E- z6xV@-(C@MlB0d+3VoxyQ&OD0mB?JZ_zVeZAMxR>j+$NI*?5k0<{S#VKObt8P+*!qI z0+KB==-*R=18`;+ z5BsTu;kLC-BnvlXED1BGtEvfAdI1}60&hsDcy=CLpC_Hf(g%T?q5nif%(l3P(*n zCz(A*un~{t&j`*!irHFGdjgrNB0=^c($StFf(^1$epT+l7gEpwYl||2hYA>!nC=wl z!a#*9r*8U_m=rfwzIEn0^OL*1eD9=qfH!v_Ul-pyu4BIS!9IeJ%Yre6AOj!e()Ab-ijnM2v+c+ zH>NsC=G>P#{Q%k!fi*;YBcEUD~sEUQuj zSWq%J$ZCjm*kYd<*M-Z6L$;R;nMuCMl4?-|J&SZnhM$doK2$3Z-?ZaCq$Qj0bH*#i3O* z(57X0PI%Wxy)2V3N2b_@PV2l&#k)Q;pvuJABlJiy6m$K<;GZPzAuU@kOF6uS78#B^ zj-v!V8C*3uP$T62jpN>e>)yV;1J&GdjL?Jb9!MbSP{XJ932UH^heuDg?L~1hBqQ1XOG|r)8G!OxkCuA zRRzSOKowZzDbflv2&tHFkPIR!E9OLMdn@Lb2v*Q-Ezc?;?TZMj`^pF7dNBihMm5M} z3MjBU@BqFBTV94N0&pn8LbOneYb~H5^(_Ia_W923 zBW9uzvch|O$PCCkI5J2Yt~!oqr!SIp zN;Ed}DdEbGaU8|_<_IZY7-iuX>64q~7kTbL^1x^lMmAWQg&)(OW`v^6=3qSZ>5mYs z&&mtKP-c*2ju2V{Ev6o9P-1yExv+!yNlFkr0sx-Fj$ZFgkT~he9tEI}h#?4O?Otxj zhYAe?UTwT##3XeEY4XdWEVm{Ol|ifZ`U&WKx?fn~M-*uM)^bh8 zA+_39=#07AZvI*B&h`KFJx&Yp{fMWl>;KKYCSLYA>;LVd0bp7G{}Md*vHo9Y7=QkmD3V+rydW6#fe!^1Up(rWeHuv2 zJ6sIOtzxLGlXo=C{c{+~zQ^J@?xSlm;&V(Lwuk3o(cn1s*a&eIBr=Yw6hrB7=tD_U zFu2Jl1A+Itp|SINAmEO8c-{}$H^l!kDF6<%*Iv@-cx6mIcX9y;3jWHoYgYMVkFTTQ zn=B3mJwH6xBEUz1!oqUOC%^Q>Ajt)oup$tnr&pipa@K%LK(9cbEg>AhQM84a=;y79oA?__OYr@~j;c2*)mhu23J3Hqc?EqJ>e4(A zzGT0S`2O~3PZ4Phlla7eQLh*}?RFx((5a`SnOv=`Clj`f%fnu1iIvR^)}NhhR-5K8 zIM$*0i=GD`^e~6$q}OexUI%u9GsyM;i;0SYPrauSIjOBo!J}0d&N{?!Au?5iJ4}& zZeli2f*#`&potTw&5KwVMTfP55@G>YgTAo4|Q&QrRtuj%uSSLoyx_R7NOey z9?x~KVMmKw52}J0SCz{s zxpZvcw(}QLf{3y_8`LuzQGDVO__ki=gTn_E4*i%PX_#Ux=~$W%tZ<1ObL*`aDL^~W zy6|r&BeZeQHXgXCmY9<@39ET{EdkoMi+~}=h+b3QX+_txg2SQn zq(mN?!JCpt@n+cqixyC!H*o!0L_A<&oDP8+)#@csVrvDlNY^~UGGU*A5{ZpM zcFbvOb7%^gv65>K%99p&UvpFN0vTK2(^irkmNQ=Xhqx^_z(H=2`AE?BU(WKlbqX?; zbp~fDjbN3^YEkn_hm}qF%wyzZwjC(!y2DMF_G;+oa9Z&YIc2Z6W+*ui-W;e=VZ!t`8X|7^Hk>K*@c}9+7|}ITe#Fz4 zF}A7kU35zg_4zzfkbiO1KY!KP6|R$i+%L%gc60gvf6e0Xw!Y1yKjWQ+{pT+L{O0uE zX>Kjw|9x8|pILVv{WTJr8TMIUK7szN<@+B$3+2nnOAIVAu*AR;14|5CiGlwEWVqD3 literal 0 HcmV?d00001 diff --git a/test/utils.py b/test/utils.py index 56f84ea..36eb238 100644 --- a/test/utils.py +++ b/test/utils.py @@ -128,3 +128,8 @@ class RepoTestCase(NoRepoTestCase): class DirtyRepoTestCase(RepoTestCase): repo_dir = 'dirtyrepo' + + +class EmptyRepoTestCase(RepoTestCase): + + repo_dir = 'emptyrepo' From 7dbd08edc2fbd5eb5039a6e25be67441db11da05 Mon Sep 17 00:00:00 2001 From: Nico von Geyso Date: Thu, 1 Nov 2012 16:17:51 +0100 Subject: [PATCH 3/6] added in Repository: is_empty, is_bare, head_is_orphaned and head_is_detached --- src/pygit2/repository.c | 60 ++++++++++++++++++++++++++++++++++++++--- test/test_repository.py | 27 +++++++++++++++++++ 2 files changed, 83 insertions(+), 4 deletions(-) diff --git a/src/pygit2/repository.c b/src/pygit2/repository.c index bd346ce..6182897 100644 --- a/src/pygit2/repository.c +++ b/src/pygit2/repository.c @@ -186,13 +186,13 @@ Repository_head(Repository *self) PyDoc_STRVAR( - Repository_is_detached_doc, + Repository_head_is_detached_doc, "A repository's HEAD is detached when it points directly to a commit\n" "instead of a branch.\n" ); PyObject * -Repository_is_detached(Repository *self) +Repository_head_is_detached(Repository *self) { if(git_repository_head_detached(self->repo) > 0) return Py_True; @@ -201,6 +201,52 @@ Repository_is_detached(Repository *self) } +PyDoc_STRVAR( + Repository_head_is_orphaned_doc, + "An orphan branch is one named from HEAD but which doesn't exist in\n" + "the refs namespace, because it doesn't have any commit to point to.\n" +); + +PyObject * +Repository_head_is_orphaned(Repository *self) +{ + if(git_repository_head_orphan(self->repo) > 0) + return Py_True; + + return Py_False; +} + + +PyDoc_STRVAR( + Repository_is_empty_doc, + "Check if a repository is empty\n" +); + +PyObject * +Repository_is_empty(Repository *self) +{ + if(git_repository_is_empty(self->repo) > 0) + return Py_True; + + return Py_False; +} + + +PyDoc_STRVAR( + Repository_is_bare_doc, + "Check if a repository is a bare repository.\n" +); + +PyObject * +Repository_is_bare(Repository *self) +{ + if(git_repository_is_bare(self->repo) > 0) + return Py_True; + + return Py_False; +} + + PyObject * Repository_getitem(Repository *self, PyObject *value) { @@ -868,8 +914,14 @@ PyGetSetDef Repository_getseters[] = { "The normalized path to the git repository.", NULL}, {"head", (getter)Repository_head, NULL, "Current head reference of the repository.", NULL}, - {"is_detached", (getter)Repository_is_detached, NULL, - Repository_is_detached_doc}, + {"head_is_detached", (getter)Repository_head_is_detached, NULL, + Repository_head_is_detached_doc}, + {"head_is_orphaned", (getter)Repository_head_is_orphaned, NULL, + Repository_head_is_orphaned_doc}, + {"is_empty", (getter)Repository_is_empty, NULL, + Repository_is_empty_doc}, + {"is_bare", (getter)Repository_is_bare, NULL, + Repository_is_bare_doc}, {"config", (getter)Repository_get_config, NULL, "Get the configuration file for this repository.\n\n" "If a configuration file has not been set, the default " diff --git a/test/test_repository.py b/test/test_repository.py index fa3a932..b3b71b6 100644 --- a/test/test_repository.py +++ b/test/test_repository.py @@ -47,10 +47,18 @@ A_BIN_SHA = binascii.unhexlify(A_HEX_SHA.encode('ascii')) class RepositoryTest(utils.BareRepoTestCase): + def test_is_empty(self): + self.assertFalse(self.repo.is_empty) + + def test_is_bare(self): + self.assertTrue(self.repo.is_bare) + def test_head(self): head = self.repo.head self.assertEqual(HEAD_SHA, head.hex) self.assertEqual(type(head), Commit) + self.assertFalse(self.repo.head_is_orphaned) + self.assertFalse(self.repo.head_is_detached) def test_read(self): self.assertRaises(TypeError, self.repo.read, 123) @@ -135,6 +143,12 @@ class RepositoryTest(utils.BareRepoTestCase): class RepositoryTest_II(utils.RepoTestCase): + def test_is_empty(self): + self.assertFalse(self.repo.is_empty) + + def test_is_bare(self): + self.assertFalse(self.repo.is_bare) + def test_get_path(self): directory = realpath(self.repo.path) expected = realpath(join(self._temp_dir, 'testrepo', '.git')) @@ -163,5 +177,18 @@ class DiscoverRepositoryTest(utils.NoRepoTestCase): os.makedirs(subdir) self.assertEqual(repo.path, discover_repository(subdir)) +class EmptyRepositoryTest(utils.EmptyRepoTestCase): + + def test_is_empty(self): + self.assertTrue(self.repo.is_empty) + + def test_is_base(self): + self.assertFalse(self.repo.is_bare) + + def test_head(self): + self.assertTrue(self.repo.head_is_orphaned) + self.assertFalse(self.repo.head_is_detached) + + if __name__ == '__main__': unittest.main() From 225f7bd1758c25825302e61527c4472241bf5504 Mon Sep 17 00:00:00 2001 From: Nico von Geyso Date: Sun, 4 Nov 2012 01:05:04 +0100 Subject: [PATCH 4/6] added Index_remove --- src/pygit2/index.c | 33 ++++++++++++++++++++++++++++++--- test/test_index.py | 8 ++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/pygit2/index.c b/src/pygit2/index.c index b200b0e..812e277 100644 --- a/src/pygit2/index.c +++ b/src/pygit2/index.c @@ -289,12 +289,37 @@ Index_getitem(Index *self, PyObject *value) return wrap_index_entry(index_entry, self); } +PyObject * +Index_remove(Index *self, PyObject *args) +{ + int err; + const char *path; + + if (!PyArg_ParseTuple(args, "s", &path)) + return NULL; + + err = git_index_remove(self->index, path, 0); + if (err < 0) { + Error_set(err); + return NULL; + } + + Py_RETURN_NONE; +} + int Index_setitem(Index *self, PyObject *key, PyObject *value) { - PyErr_SetString(PyExc_NotImplementedError, - "set item on index not yet implemented"); - return -1; + if (value != NULL) { + PyErr_SetString(PyExc_NotImplementedError, + "set item on index not yet implemented"); + return -1; + } + + if(Index_remove(self, Py_BuildValue("(N)", key)) == NULL) + return -1; + + return 0; } PyObject * @@ -336,6 +361,8 @@ Index_write_tree(Index *self) PyMethodDef Index_methods[] = { {"add", (PyCFunction)Index_add, METH_VARARGS, "Add or update an index entry from a file in disk."}, + {"remove", (PyCFunction)Index_remove, METH_VARARGS, + "Removes an entry from index."}, {"clear", (PyCFunction)Index_clear, METH_NOARGS, "Clear the contents (all the entries) of an index object."}, {"diff", (PyCFunction)Index_diff_tree, METH_VARARGS, diff --git a/test/test_index.py b/test/test_index.py index a4123ec..8950cbc 100644 --- a/test/test_index.py +++ b/test/test_index.py @@ -135,5 +135,13 @@ class IndexTest(utils.RepoTestCase): self.assertRaises(pygit2.GitError, lambda: index.add('bye.txt')) + def test_del(self): + index = self.repo.index + del index['hello.txt'] + + def test_remove(self): + index = self.repo.index + index.remove('hello.txt') + if __name__ == '__main__': unittest.main() From c615ca29cd7b13961e07fb58b8ead8d4c4d7f442 Mon Sep 17 00:00:00 2001 From: Nico von Geyso Date: Thu, 15 Nov 2012 19:32:25 +0100 Subject: [PATCH 5/6] fixed refcount error use Py_RETURN_TRUE instead of return Py_True and Py_RETURN_FALSE instead of return Py_False. Otherwise there will be refcount errors. --- src/pygit2/repository.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/pygit2/repository.c b/src/pygit2/repository.c index 6182897..7c011a5 100644 --- a/src/pygit2/repository.c +++ b/src/pygit2/repository.c @@ -195,9 +195,9 @@ PyObject * Repository_head_is_detached(Repository *self) { if(git_repository_head_detached(self->repo) > 0) - return Py_True; + Py_RETURN_TRUE; - return Py_False; + Py_RETURN_FALSE; } @@ -211,9 +211,9 @@ PyObject * Repository_head_is_orphaned(Repository *self) { if(git_repository_head_orphan(self->repo) > 0) - return Py_True; + Py_RETURN_TRUE; - return Py_False; + Py_RETURN_FALSE; } @@ -226,9 +226,9 @@ PyObject * Repository_is_empty(Repository *self) { if(git_repository_is_empty(self->repo) > 0) - return Py_True; + Py_RETURN_TRUE; - return Py_False; + Py_RETURN_FALSE; } @@ -241,9 +241,9 @@ PyObject * Repository_is_bare(Repository *self) { if(git_repository_is_bare(self->repo) > 0) - return Py_True; + Py_RETURN_TRUE; - return Py_False; + Py_RETURN_FALSE; } From 88de08288c1513e756bf03c9b371d03c2c45b506 Mon Sep 17 00:00:00 2001 From: Nico von Geyso Date: Thu, 15 Nov 2012 19:34:52 +0100 Subject: [PATCH 6/6] coding style - use 4 spaces for intendation and a space before keywords --- src/pygit2/repository.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/pygit2/repository.c b/src/pygit2/repository.c index 7c011a5..2f4da6e 100644 --- a/src/pygit2/repository.c +++ b/src/pygit2/repository.c @@ -194,10 +194,10 @@ PyDoc_STRVAR( PyObject * Repository_head_is_detached(Repository *self) { - if(git_repository_head_detached(self->repo) > 0) - Py_RETURN_TRUE; + if (git_repository_head_detached(self->repo) > 0) + Py_RETURN_TRUE; - Py_RETURN_FALSE; + Py_RETURN_FALSE; } @@ -210,10 +210,10 @@ PyDoc_STRVAR( PyObject * Repository_head_is_orphaned(Repository *self) { - if(git_repository_head_orphan(self->repo) > 0) - Py_RETURN_TRUE; + if (git_repository_head_orphan(self->repo) > 0) + Py_RETURN_TRUE; - Py_RETURN_FALSE; + Py_RETURN_FALSE; } @@ -225,10 +225,10 @@ PyDoc_STRVAR( PyObject * Repository_is_empty(Repository *self) { - if(git_repository_is_empty(self->repo) > 0) - Py_RETURN_TRUE; + if (git_repository_is_empty(self->repo) > 0) + Py_RETURN_TRUE; - Py_RETURN_FALSE; + Py_RETURN_FALSE; } @@ -240,10 +240,10 @@ PyDoc_STRVAR( PyObject * Repository_is_bare(Repository *self) { - if(git_repository_is_bare(self->repo) > 0) - Py_RETURN_TRUE; + if (git_repository_is_bare(self->repo) > 0) + Py_RETURN_TRUE; - Py_RETURN_FALSE; + Py_RETURN_FALSE; }