From ccef0f89820b6a6613fd587d00c6bab48e6f45ff Mon Sep 17 00:00:00 2001 From: Magesh Umasankar Date: Wed, 24 Apr 2002 03:09:06 +0000 Subject: [PATCH] Implement and document a compression attribute for the tar and untar tasks. Submitted by: Curt Arnold git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272562 13f79535-47bb-0310-9956-ffa450edef68 --- WHATSNEW | 5 + docs/manual/CoreTasks/tar.html | 11 +- docs/manual/CoreTasks/unzip.html | 10 +- .../taskdefs/expected/asf-logo.gif.tar.bz2 | Bin 0 -> 7543 bytes .../taskdefs/expected/asf-logo.gif.tar.gz | Bin 0 -> 7116 bytes src/etc/testcases/taskdefs/tar.xml | 35 ++++++ src/etc/testcases/taskdefs/untar.xml | 21 ++++ .../org/apache/tools/ant/taskdefs/Tar.java | 110 +++++++++++++++--- .../org/apache/tools/ant/taskdefs/Untar.java | 102 +++++++++++++++- .../apache/tools/bzip2/CBZip2InputStream.java | 10 +- .../apache/tools/ant/taskdefs/TarTest.java | 23 ++++ .../apache/tools/ant/taskdefs/UntarTest.java | 30 ++++- 12 files changed, 337 insertions(+), 20 deletions(-) create mode 100644 src/etc/testcases/taskdefs/expected/asf-logo.gif.tar.bz2 create mode 100644 src/etc/testcases/taskdefs/expected/asf-logo.gif.tar.gz diff --git a/WHATSNEW b/WHATSNEW index 0c25ab4dc..166269275 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -109,6 +109,11 @@ Fixed bugs: Other changes: -------------- +* Gzip and Bzip2 files can now be constructed in the fly when using + the tar task without having to create the intermediate tar file on + disk. The Untar task can also untar GZip and BZip2 files on the fly + without creating the intermediate tar file. + * New optional type, added. * now allows control over which additional classes and interfaces diff --git a/docs/manual/CoreTasks/tar.html b/docs/manual/CoreTasks/tar.html index d846ec01e..60511f10a 100644 --- a/docs/manual/CoreTasks/tar.html +++ b/docs/manual/CoreTasks/tar.html @@ -41,8 +41,8 @@ attribute is warn which behaves just like the gnu option except that it produces a warning for each file path encountered that does not match the limit.

-

Note that this task does not perform compression. You might want to use the -GZip task to prepare a .tar.gz package.

+

This task can perform compression by setting the compression attribute to "gzip" +or "bzip2".

Parameters

@@ -99,6 +99,13 @@ the limit.

("yes"/"no"). Default excludes are used when omitted. + + + + +
No
compressioncompression method. Allowable values are + "none", "gzip" and "bzip2". Default is + "none".No

Nested Elements

diff --git a/docs/manual/CoreTasks/unzip.html b/docs/manual/CoreTasks/unzip.html index 4dd756c5c..fb8bb6bbb 100644 --- a/docs/manual/CoreTasks/unzip.html +++ b/docs/manual/CoreTasks/unzip.html @@ -44,6 +44,14 @@ to perform unarchival upon. true). No + + compression + compression method for untar. Allowable values are + "none", "gzip" and "bzip2". Default is + "none". + No + +

Examples

@@ -82,7 +90,7 @@ to perform unarchival upon.


-

Copyright © 2001 Apache Software Foundation. All rights +

Copyright © 2001-2002 Apache Software Foundation. All rights Reserved.

diff --git a/src/etc/testcases/taskdefs/expected/asf-logo.gif.tar.bz2 b/src/etc/testcases/taskdefs/expected/asf-logo.gif.tar.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..99a91fc46f00478c76d54fe4f75fa3ad18231214 GIT binary patch literal 7543 zcmV--9f;yWT4*^jL0KkKSr>h$cmM`ifB*mg|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0 z|NsC0|Nr0--v`~d({t~c?|aSbz4f!Z+g-QcPiEEi@3(u$w)fv{cfI!e-R|}-);!K! z^X)yYp8LDsZQED7t&Q#B)lcw^G?`D-z?e);qI#IoHkCh2n5M%-U`z>vNveBH69#|* z8k^K)#)UkmgxVStB-8W-PiZHaGfho2#Xmq#DU)PqO);T8CTJAifltuYL@D4*(w@}x zr-eOF4JL*N^bHWnl>IaVLs63gV?^~dPgBiJq|u|$6HL)HJf4$J5J#lRvYvxeG{Ry4 z$Ql|5U{6u0;xuYx_NJbRG#e90glt4T27sF=^qDhBk>wdZH9V$FAZdbP4^!09v>}9K zG;cr&pbU*nVj3o%qY!#SCQn4#hSbsN9-4-mP5gFp>2G#L#H)B~!1QRLMVBFU6UnMPQ)!I?o+eY;G}S*)ZBx|trlZrspOt1=$j}fK?Hc7IYVTjPvO){P&{Ssn$lQJN*a3g6(000kTMG71&Py&*R6f52=P@oDf%Yo7?(JP4(4-8`E4}|qe>Ora7 zuNKGD#gqUb)0sBIr(ARfc_4U_`$kUA2kj&1sl4-r-pk14P&_JUe25{-hRL`#Y}pRu z)a5-ufcPM<=xY20yBKpbYY=f}+Jn|VqBXLI=cNb&u%~6&6sj?pSv$EALV%WnGTHi2 zWfdi@7LSF;s|J-iO`v}8Q z4V_{JB`D+%Ilj5ds~$~KF!P~htPf=351OUim*B`Wz?ouh%H;%+2y#knlmo1R zdzL|Nv%?W+D_1uo!c5jnz!PqC{~rIu?7vd>$YY=ZvQGU{@IwfA&#c%5rs|5NPa!0_ z0I+7qK(8712#J$pKEHy37KE1zJt0gT>ZqG`-#czycUQEq37ewZVta9Vnv++d zN#qP*dIlZN(^uN`66E1HoshI)jl6Xs?Fd)TQ#Cr=D(ge zRX1rcn8DAL$cG=sHr_)-r12H}Xnu7Yt6G-^*V}o}+|PCoPgVr(DrP*rC#zUDL&q>r zviY+hCmV-|nxt!NKozKeXlGrm)J0AXg|DFNnrmjE`B9`W&9*2oAO_PI?VL6c?n7m8kX_?k_F(F3Cjhqw~zK zaodMkc6U#SH1||^SokJ1qrtZCn3Pu?@(SoCkR~n_04LKxcl}EU*`2fUjg|T7j;G9_ ziN2~{hG<1dkmK$GU{RbViyeHV5qRYbOnSo7VIBtpXG-@5Rr2{Uk6>>Q_Fk!4sxIaJ z*w{`LcMtj9PJYYruCmLhiRw)oW+C7)E+@8QZOw=5GLO%qQybT(@C}%Nll+52aaG=J zr4%wO15bvp*sgX+#FDToZ*NJ5Mbs}`>~=i44O1G0$=WG)Qg~p{*cLeCmOA8E5_Q8@ z7baT#AIMk(A#Wzny^$^Kht$m(ja#r`k|jlF4%iLD;_|xjX$z{e=?mDWF4Ou#X1|Ry zIf|pg06>eumo(VBzqp=!Ar(O5B7W59MY^$J6sc2McI`^7E1Q)#%x2b$f+Y+a$?$?u zWaO(z;s8%(?I#yAgvssWhFbP3{GK|}jK;e%7~=k$c0Ck!B|_N^(;xpWbAl?6k;+yI zhWAPD8>Dl~?fD)%{59q(oE9<};>&3meYUhVY_n+uRP3gd6LuXdjdUye=(8v8uloy_<{mE*rMMS3`tY7Io`#kQn zVD;OtE8E3kSk$k^a~vk{3IQu4-%2VBjx1A@X^h+eHL(+6Gs8aqO5;6Nd@_3a2_J2h zGvAbWy~)W0q}T90@63#6e;C;*yk>jpHl+)#Pd4L!F~#oR>ki;L$4nyMW>-+;4IjSz z0oO?;E@h_oPPUBUFC&7Mza2RuoC7w*(u%rvpYEVyL~G9ekR<`O2!Nwrx^T4!bsCNu zbBm3coU6_l(^jmstBMzN%~Uzhn~wm3$K%fa>WoQA`>xNU#D}xN=Q_E+Hk8;bo-dK_bwLiGNmz> zBVk7VW%W&*13cFG+Kl5ENlp~z)-CYAJ-)B}?*ZsYiAL{j##)Q}^t%stEho%h!yMEJR#Ilx2iJ08*BudS0^YPi8)4RB9C6apBblH!v{MGuD#5c)pEN~Oi- zXbQTu+JneJ-+HOj)#OujXDzcV*Yn_KK9;fr#jySh?gpi29kLpkv^kRC6>kX-eDSvL zyd3Xo@GBvxpYDX7h-B#03R}+da5WH>v&JFB6xuh`#T~~@A{mUP;7~OoDUd_UaL2Oh zo)(5XxjQ25#@1nE=sszaeL?WgvWf`0CBfo*50QE^1VoC_mBY&KklwKCTd#8w%Z9tD z@XUdjX9HUTGAvC#fCMI82>$kD02J~mA2eVh^3QK+Db{=sNOyFezCxd6qwW#W4*ijs zE%70=)tkX(oPO7fyn)zZPUyYnM4x^hrToH!zN)zMqaaDP{~DMRq^$h|eIQmBhBn!pw7j{1*6Sp38JeM@qNKezJFqD=7MYJ(e;JL@2rQ8M?|5vqWG`Yk z2Ny|OqbMNplS4Vk(r4WSI0!0X>n^}dRzo>)~X~D{Eg!E|b{#8Jrwv}im6>`_o$N-RC=;L+WGQXx9nq}AoB@sDR6F2-1 zS{6S%T3(@!W{#YH&Z{_P0A_yzjcf`MGElo#nYFG+oOfCzJFx|3cd(d*^_^4N<4hPe z-;ZghM+Y8d$qPW|zt*?nfgha*__IR~>_BmU&21W9fu@Tb$JB{(peRL%UdMUR29{ zC^Hb>()+9RrEE@C<3gX0BuC5p{aWUf0hgr;mxd|?7YAhM~L5s$u%p)i1!V?pf z6jEgUtw50Uxx&YNe_YQGWktn*FZWE4d1|?_U?LR#eKP)g`I$xnz_8%GJqJ`=zLa-0 z>cUrN;+G)`ks?I;a@9^$65MPxG|x>$Dz4FS?7`J1Tq=e4nHOv|V03fLUFd+s7Tu+R zQhdiGnnxJTqFPi9iRv*+G#L~>H#6(Ch|{KnC80}$vZq=fo86=*a-!{^>#N*18L|K! zK`&7bgOb8X@0lFFqqKFzF8C@ac2Qm_iKF+BhfjP>?)S`9q8!o~Ne5S>LJ&wyEW~jL z^I!bYd2g5V)aX)9kV4-$f=b5(WDC`Im)>r3S8})~Yhm6o#dD%c?RC z!`D`^ahd%gLH+lk=p@Y{VDsA~&^H(?R+oNU++LL`wmJ zj525_#t0;DX_;Y;yGhGWfU11mf@YCdW9EuhAB*dl$im84uitG`sp1&yt2FgDpQL}u zN9oeJW2y4%#cjofs5@&w(JWZjS9ExZ zaOSP>*7Adqy|9ldOnIztHVSuH3VG)sl6qtIbWbFgSmW-wCA`LGYBN?pNy!OqGLvzs zhHIeBVqbUD*v{@ranfew@x>3wpQ8EFX>R#B5 zhlyWqot5&}bWw|sZyMAmt?ObVUFOxD{!%(*B-N2?)s{H-Z0!mV<|OJ;n+jwp@QW`H zcw&f&MKBG(*`ecmLieV?vR8UGofKXA2ptFVvM*Zz>M?2`t6p{e0gP`+<2|@vz&peH zj?7q#dgx}12$RCnw!HG{sbl0gmId!qe<)oVm*z=sEr47%V36>#TdUz&b%6pUE7E&q zH>I)KM)$MOZMyQ)z_plhcGs&-T^4UR#UWIwUG=-%2)%LB3@WA3Oq2P=MjKsERT68) z>~WHVArGhBYHB%ONQvINAGlVL+*;&KHx)=P7SVwG0z5o|{n3H-i zyzmS{0k8+>@D!(h#IUGR^}4Tn3v^IMEqY*%>hauv#_vy_SI&(sPb-G$*U~&BX;LQ8 zic>*??uCK#$*gn9SpJ8%0BOUrFm_U+E|`uPHDvKu7_X0aBF3+_Z4fiXImwvL02s7t zYdFsZOMioCTnn!iMOh7Slx7AeT_a9Q!m!;(m@-!_@EU7VAwSj~5{ivBbb>;|s)1pP zS?Y9loH13lk@}dMb&~)Ri9o2YD-Ag79^E}Yu0ab1JZ@3eodY8{+Cvk{l1`d=bz8;O2@q1OlD~oy%FE~l)B+bc2Fo>tb;k1Qr~aqZ z;%Isd<~MK&s-d=0u3*6>q52NQYQYls+ER8T%r>*_@$`~XUZ{!{!G__>EOGdNCz2uE z$7(2wpiJU6ZmKGA5o|b(%Tb*_W8s?^7QmcHj-|WHH)?Es?OOLT)S0nb8R)Lg|AY%C6@Rydy1WXrr~y#U`7)bC?DUw@d`tGL`Ed3DO$Xx6n4j_BCX zyUaGXlypdW3A=j+p&Q=ex5TKX8U*cfBABc4sKRmJn($xKLM*zpO#4oNNS-w+Yw2U$yX)HKfLn*4a<)L{1lhNGo{!E%OFRWfwP_9u! z$nf1z>33howS=+epzz{H@!9)!V4I*k&4y@-muPL_wqMF&h1iU`i`tq1PJdbV0Wn^W z6AY%5v$tGZ8-8_VX)DEHGXH$D*2*J|s|R9?gUn?zhqL9HNg>}f-kuD_Wd_|sPg*@) zjpxUAe?u`LnL0DCh`$PoM=PF<#j7VZYCQA-^3)VC#&!MiNU!I^E!a0+{jzCKIO%yF zr-1o`Bx#3FTW?=w!+hZr?;Iu0Wmh>J?ZnXJ{jyUgWg3!Be+K_m5${}?IaBd&MQ}V8 zCYZ)7S&9Ft1)n1oWAj~;;4h~6jmiFYdw*Qe=L~wJ7A|Y1ZhO(|WuUf=_vwL9Q4Mw( z3>$f76~dm}JGNwq^-EIXf1fRL>$$xLi155?QwlO>DV?lo3t9+dqvR3mOBLz-mypSX z2&j8z=4FmbcL3X|!F9zmR9;LrUpr2rvMB5q#Ip+V+yE>AM)Hc*d($#rc8rL~fj`ZK z`}A`uq9w9rjZhD&QH;^e7q|p@!Hlp6uEDrEp+8g%C$X(=V;R8v+PkFxs;U`za#ven zO;hAvkmbrWKe4kN&S$NyQEce^XzG#6#}v3hf(fk%%sB^i*bt^cCx{6fMhU$RI)Z1m zlb``QLz1E4Zc8;bI7c!kNv9V?PJdEl?0O{|zeEyoyCGt{g#U(XC~ddUW+ZOe+s;j{z04|KpxT@WchT_ zW8cFGv}aZ_P_2KkA`cRz0lmbi54lP2*F=#s?AWr*cap+Eu3F@Xq;Xv;bGGo;Q3*Ht z?by1+=1&|DcGLQpHl`+dRKy^(+$Hy)#-kva#4<|3e7tegSH9nHio)dq|DxH8xLv+O z7;_O1NWoLkY4m_vTfL&`(jC-|e^)J^P{cKdX#7wlvYQ9>eL}1%-_SyCfMt-Mvu8ET zXVlWbR+np{VTrM5Kh`Bf267NZ`T#D`AxqM zeEH^KGZ$)@^0Ts??vI^i9E)4yX~qD1r!2B5NBT!=)sY{=@Clpc#(S*_nCt~j8n?L+FjZ8m)xw`>)>RK5 z2PN(^$!LH*KwBt;6cWW1*R|)2i1xuSF{gCr8`+nRbws>!rua_D8=P!-9&*5x|2-it zN)KznRSrJZl)f?+>MZ{xkPp8e6C*y#Sbr5cb3e&fJ_y*XUw0Xfe@R$UZ^d^ZLFE(Dof0P33F4xAw2mMT(@%C_ z!$l+44P^5#(I6Ee-nQsF>URbHZQ>MQ_j%aX0tBk3Be7;b9e3qcX|G(^>o6&$V36h{Rc#Fjex&ql&0_X#)!$pC+X#}uTj-rpQ>iBDi1?~yR= zhb){3aFs z-Y$qFdRTLkX}bx?m=Ab2uIk~0BJ~WP50WNa|J+vrqT{Mu#ig_Z<71gzbi)lQ*4xkR zhz36=rofgx_;?$3FkZ0hKer?~Vb^ToT&K=-I^b=X7}B+?RU{bXplJWCC6$!NSXaNr z2*p#C)1S$T2LA{xWfpwoG88Gcaf60$xAt*7mm9C!18nH58YL0d2Snpyu=BrLfQYz` z4%l>7ID9Pv|B^mb9~d9t!)m7K+)`V0QNsl0s(_6E)CpG?eTB%_zcgkpz{CYw=@!rX zmvt7oBHSvR>WTq=YUOnez+FB+oW$+uWd%XERP(Z3t=(AB{#{>J)3>N zg-EnhyDwUEXq*4Y+!x1eJ&7=qOXnGGfm-z@8Ec=oII zpwuAp7U?k~SbMf+nWqK1NWnLrq`RY~=oaNb5ch=oJRRwKxae4Dq(!dZ11z6jv(}+ZdF6E!!+e;<6gfr1@WhCM00DQV^uS0Nc|?jgEsf2xq)#; zRKIa(jRs1~NNdd?t*v#h#Vfe_bHe@SR&J{M`~&{~-jEo(0C`)}lmHx8sxrQwR&=2Q z%=q!iaB(}bblk|PaHLQ!4Q3a z-t5{jP#u)W2Y&64qEBs2SaaUYtWFrFu!)BHmb&frK56x=3|CCcqe0xa(Z_fa$6X!t zIxYEswl|$Ec+>z}4C2jBfHGe+-aR@lfSOy3OcmypeLZ%ArD6J{?>TWX1ieY-C_lk! z3G~d0DhsR{QT0e?f08>03h$q}P0JwFEhW@ECB3|hmb$YM;Z(x zARq`xLXc()q4&^1r9>crfQF9L0HL?gi+~^(yt^SloQ6BFeCsXP08TcA0ePHM9;+WQ-)m+$TEwO?VE z=i5vG^a+5p^CG54+lB;?N}77hfxjK-R4TQcPP$fBKq8SQCg|2=qsPgv<>mBsb(a;u zVFWNwNJ!`&dfW>*{2i~U=RO^vhbLz5P0-6pbUHw4HxF8U710TJ@0HUh=>M6J<4)A1 z+=@ISn?=B>%=)Ymzv)Cd{raVbm6esXwY7@a_>PW_POpeP5`DPS`)g0&OuIiFVph|6 zCqgu=oJ8^sWA^s;#D?j|7{{h#Vrr^b+G-Njah6F%4efH2#w#6n`g?D5o$YRqs%ho? zUGyAaa~WjOo90w4WrT&`K2|0ZKvFXYsqMg78z;AT$luK%U2TrB;&ZwRm@nTBPD;;p zh1;|X8uSZUuA-gvtz6&pIZgw%0|0df8+jcU6DMKH>AA7ExEO?tPZVR`?DAMzT9Sgw zu8W0z?h0ua2$U8RdJlIvW@7tfVSPk2s#Pp@!}|1c*SQ!S+xL^<*4Ea&H*W zvt}R}fj)S8q_cJ?4Y}XE(zNUH{VW{m?8_)3kew$6Q(f*d<$}e)6I3xBd=3N-m7K(H zE)2nu#~4afZgSn@OXOreDf8}T+iblRr79A4X}AebL+Ehuyi#cAH9ricR)wcs1koL} zw!p{35j1A&TL7$w7omu`Zi?qHv(F@f&K$!Ur}M~?1wZm1?pRD^38^?Kd8RW#bj72h z!DrITL6LUcF!BI2UoYIUj7|Q&Uz*qD`t!-?S(Oyx)s*aT@`Heh(%#@xU1H9PIYMCp zcX;%f`FT)Yq{syd-Xc#b&xr5Uhh9%loEYplX4HV8zsA>s-TU-NyKiuMm0v>Sl632j zCek8GC~-d_3a*wH8Ld?z`gMQ_ z$6oenDE4zt1W5!aGN&B*)s}Y(_*&wWP6xRy8Ux@Fg@q)3vL?!SpNa?-5R`kx^V;^i zD{?U3^zAoy{R}Bhav@~VS*9>>(EA!0A!2aw@Fy(@HIAbk;Z zKJd{OQBd%-?h}iEMdPPI`$TnaxmAYvgO5GXkCsWpHL#a8AQv0Tki(JNaGodfP6H|6hP9_~6A z3-bS(xhLYm>Wopmxn4yEZ>D?zZ&X>ni4aeKO2^CA3Cyzdq`W~MoF3n5dzt&H$e1hc zx(#H}1d(p?(LPJ+18Bp`?$PODfnpx$D}mz2MnhEULzrva)--7dK0EpjC4achCQs_H zhl7NIJ8%qB^d*+R=-A}EOw~rWzT$yB&E6?UzHem5r=T2?MOs$eSADQIH@L)$RP=R< zf8v<8N3iy6WKlkPStY{L0P_tDiTaINl#p-_X!q-Qru$*PI#c_VMsIHPhSdA^pP%}_ zed?p-?*Fq{D8w(~5@jK6V+-VITm6V6d?^A6iM5?PMwu8te*5XYBVxzKW=`$(8(3vD zaU!C%)tNkRFPzwo`zQQyB+N9mv(#`vJ?{9}!$QHKcRycD|BNr~`{fE%=hMf75-5E< z>%PEwgLJS|8CjRQnS`6DfhB0DHUN$4AmFhig#iY!J;BCIiX(D13EiNeErc7WZoMx7 z-guxW)Xaryj|@rg5pC5vq;)+LOu= zilj;u*LW<$BGieQ{My#U=T5Z1!5NNOP8RPf;dCb%Ep_|0y8yO2IeSdoFQb zjf2%(3BN#RiW&m0e{d{EE4Yr;u9QeA-pF=VnlY7aX7b}M&zjue@|a{8XL_T+0jq2Y zE!1#f<3=(Zn!i`c{|f+rKciovImv|0)j|X|GZtok6oH-wdFpf2 zD$A|$v{SovBT?1p@9^h<#Ks76jrJtjK7rYo%ppUh{J^dFMg>`nO_J&ESwk2%d3TH4 zW^mKuH>J~ny=@I=qbLWn?XRd8@+e_RB(wN>Od1P3g zf$JGP+#YnH?8^N>gipgTu(J@@+L&Iwkh ziG0iF*;Y&Vt6G#=a8GoxfmUSol(Lf0uOr6DWFJsH7%-@2!jcc1c(LRW(yE^W=9~QMnva zP}=!#DE@TAfvfx4=W+bQH*KS?2}V55A_lUv%;EQ~rwPGANlTdhs9fl{$ElQ3*E@~(qZpp4dlnLU7T>BUmr4dKHeMC7L>2hGfe&GPT%^QZ^F}6 zDhlYm5mPk1{a&msbM;d@6%UPr%8TdAxnY0Hd| zs+K|H@DhyjnECNPa<86Q$Lv0-=^1h7d&veBEg(5d13pEP>rQ>Uv;1X4Qg8da1PzQe zjPd%sR1RQNnF4lZFeQ?5B(x`ZFJe{)_@bF0#i8B#Nktdr@lFZS zaT0Ewv^65sQ?BZi0PCTS8wkm)0sKV8YS+?M@;_eqf#Wh@!oQ0$7p3*vT~arWJCdk5L@Nz>eV>rdWbFM^zHJy=^?6p9bM@D{d#6T9S9A!+R?Pv+yvB&L_0?mU1m~l)`CBKgY(}5+YX`5 z-VApdLtWO|4F#{;hJ?>4(-@E+ApngFwdBHWf`NSu5YH^g=2;bGsheIs9sh1S%Kz!K_uYZzh_@?V9j78N&fT_8velYh;9)q|FDT{QDnWmS%Eu- zrbliLHgsie+nyKkF2W5IbI*mq6_6LztW9x3pe``m$lN&a?NZ-y;sG#s`}-3(kyR&A%tBhYh9{n za4j*AjmZ3bnB%XNVaBpEi!HlJYdjzwwM62d^>Y#{Z&gMPx1i4ZyV;{F9)GP!yy>3# z!($X$Y*6MqTwY@77d<=gp0>AI5z(Xf%>Uw(t%ISiG9PZb%cmBLHdrpMmA@FpiBXF0 zwq&gO$?ybMuGMP)@wo_%%7s+;ZZ?Ex&KG~qFkTfa7Tm2tnv0auJp+wulX)wvlP{t8 zQ0V8*)jW0;ib(CD1iLAxiew)f`&xxM?;c;bKxgg!jef6a(hB?Ove&TM&(Ew7>msz$ zc|>uev!vi1!cn9~ZVECHr2$sd>e9IU8m$?lg_=Xjt5sWpAVyE)m2LTR;;47EpS?!ut(MB?E!Dd%HM?h1#9Ql6 zwq_?^tiLZMYN*%vytO^k*Xt=V1Ru#MRMh~aA)ROl0Rrs=AFTn7)gU_b+DcnZ_^*5N z%0d)8VH#914KjwmM$Fw*v_mIfq6Tm`Z+p&XXHE=YtzrHBK?jzhAOh$>4TX;>_pU_Z zUaC=Q*o7tsD5eIe?Y+A5++XhN)r1}(N*hk9^>-Y6Q`)wdt%6$>1cSc?oiw*@Fu zjlbP$xrk|rduJ(aVhQSmc}$|65;27=r2}@1%9(bz)ph}2gR^+VQWC=Voq^dG?3aj( z4aC-%hQheL`vsP?6Ad&3WU@;dEKw}deZnV6+c~RyDpY9F9*P9L4FO@u7J|!;GbqaE z6{(Y{m-j7RYUT~l`ruFU??Tk^6o`b{8YZ^ugXE(^4^Fq|X&=xu1ajEQ$K`khHKXBr zIw!Mg&E{A&Pp@ARNwoRoA*fFQveOVW}( zy`3u3UzP%I^}3ueBZ4~-N+`gC4DQi`vXS^ITUj+{@#d`?VfZK+VQcQ3n6r|ontWRJ zUa8gK6p!mwluG7u_onq#4n8>(4QTq}{>`cq6tp(WfWn)Rj&`Lp+u|K9M$BEOUW zkYXjDVDaCovm^;-C<@0(_fIX59ENAf4{8Ev1^~}8jB5ylB&12R<)Rj6WUmq>Qk;`2 zYprCDn3L+`oss86CLd@IUfDJY?ysZ$Lpt4euXjne>ROC^U!Uzg0aU+cY>3yyUDpOE z2_7vH0I7xOY^wGL8z4e>&Tqn|o#SS(;@*C;E^TAEZ-d;3j78CN+g}Xdvg8~r%~cDs z)HNJpz=vQ=P!fW8GQ%Tlsc$^2{JL}5O4-no&qV(qb<2qOOftZ{3!^rfzn@nETP*~@0)3Onta~W~NLk-gx+OlbbE8N-~qux2Z zs8TA0@koC>zK#aY9#krL`}{Oli4g;;6o&d~P^C7N@4Rw|b2*5m_6z5a!002q$7ZtK z&iEGhA?%CR7KiE_GfI_bW<%v6iq$8=RKZ*zp&8`wi8f*@R)O!}xuB6PaG&gb=;o}O zlB5uK0B;GqdjpO`1gaEd?Mgo895Yh8e7kwkv?K(W8iB@va!R)mSZbO+1C+O^tW8FJ zA4XpHjp&#@W8ZTA_#Af1ZDu!OaxbIf!DZDWNGz6|X+*&0u@zORhbn*DrOv=o>)GMc zNiSFuQPvPzn;gN`$Wv-nFwMSwZ)(NDXCc84UY7*c_f)hZsEcu-Qj-8n3dOf`Qm|_+ zw*uGsZP*X9Ze#0tFK5K`HZ4@Q>*@Vq%HAk6H@1i;7ku}u(V}DOG5#fnf z)p$Y8me(|zb#<#uCG$u5d-Mul^3Mk12l0W$YiadHZM2qfmyUNXkN(kl337LWOJDkY zci=vSF8SBYhPXMBFTwmLo%G*EFo z{bFa&yq{Q@85egU{Qk{5HaoKuUNy`jnp#%>x;+m&k@@{Z^ zQR~vLzW$A#8nXk~Dluc``>CO!aPG;#}8hJ9IFEsTt@YbhBds|&Tb$R0T!ZZ8Z zkE1VSJ-qt`+^yEqse#mxe@(YP$V7%*JUpwMo zjV6tNhrzha-sU^|`A0s?^_!YK(fVL>>{+(M*%5Z9s^9pb&xT!>4@o?q8WCW#>>oUR zw6r&MSO#+qeLypuGI3n-V!iEUMAh`)n^&yQcB~5qY!7@~dC71{Mtmt~mMX98v`@}1 z;?&z%iL_5Uru_VT?~zWB2zfQ>wwjAzoP5um$JgXT^PF^_r!F*1*3LY=^m@?q=ea3Q zPoC}jx^s##g!%j489)5(bl4L|OQy$rgEjkGn-;21DWS=v7-o6!L*h|WX?z&sLsOq!;RZm{$o$DS?s8;ps_1mfl7Oi@ zzkKHKK|jNb6GsIV-U_z*_gql8Bc>podilq5Qh>0XgF8q?c}?6a_4~6FEFqVi7Wrq- zrLOtF`uBz?HR(@hGpO!dI*YG;>j3*CoqeWjR5~W$MHy`UO2M#rRC{fJNWglb>cYdo z7Y?zpDL3{5u5WAsP8%puT|9%xUk_Yf>BO zYn{m%U+8#s(PJ*U>FV&E$TVn~_V;JERru(`3b*5|mK}K{-f!K1l*za;dV=x#Wlob8 z6J_*{u)4)e^HD?dt~B=E>@w|8H7ywXdim{%`ScBWf!GX)KCHLOh3r7=D?Dl4U@7u+ zU?0=mwc2{OiFB>T#{!!@W-SQgK+KI|V?gfjzeF0mnYB4N%70NXcuwu@?@kZj#pyM@ zMzXA;ZH9&S8FbZmLnUL|OnXgtG5{R;pZnYS*T4StuYdjPU;p~ofB6p^q;v8BC;$LV C?*%OY literal 0 HcmV?d00001 diff --git a/src/etc/testcases/taskdefs/tar.xml b/src/etc/testcases/taskdefs/tar.xml index 58b56be07..6eb075ac3 100644 --- a/src/etc/testcases/taskdefs/tar.xml +++ b/src/etc/testcases/taskdefs/tar.xml @@ -53,6 +53,28 @@ + + + + + + + + + + + + + + + + + + + + + + @@ -63,12 +85,25 @@ + + + + + + + diff --git a/src/etc/testcases/taskdefs/untar.xml b/src/etc/testcases/taskdefs/untar.xml index 575240d6c..801045c2a 100644 --- a/src/etc/testcases/taskdefs/untar.xml +++ b/src/etc/testcases/taskdefs/untar.xml @@ -12,10 +12,31 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/org/apache/tools/ant/taskdefs/Tar.java b/src/main/org/apache/tools/ant/taskdefs/Tar.java index 597951fa9..3f01ae147 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Tar.java +++ b/src/main/org/apache/tools/ant/taskdefs/Tar.java @@ -57,7 +57,9 @@ package org.apache.tools.ant.taskdefs; import java.io.File; import java.io.IOException; import java.io.FileOutputStream; +import java.io.OutputStream; import java.io.FileInputStream; +import java.io.BufferedOutputStream; import java.util.Vector; import java.util.Enumeration; import org.apache.tools.ant.BuildException; @@ -70,11 +72,15 @@ import org.apache.tools.ant.util.MergingMapper; import org.apache.tools.tar.TarOutputStream; import org.apache.tools.tar.TarConstants; import org.apache.tools.tar.TarEntry; +import java.util.zip.GZIPOutputStream; +import org.apache.tools.bzip2.CBZip2OutputStream; + + /** * Creates a TAR archive. * - * @author Stefano Mazzocchi + * @author Stefano Mazzocchi * stefano@apache.org * @author Stefan Bodewig * @author Magesh Umasankar @@ -125,6 +131,8 @@ public class Tar extends MatchingTask { */ private boolean longWarningGiven = false; + private TarCompressionMethod compression = new TarCompressionMethod(); + public TarFileSet createTarFileSet() { TarFileSet fileset = new TarFileSet(); filesets.addElement(fileset); @@ -191,6 +199,18 @@ public class Tar extends MatchingTask { this.longFileMode = mode; } + /** + * Set compression method. + * + * Allowable values are + * none - no compression + * gzip - Gzip compression + * bzip2 - Bzip2 compression + */ + public void setCompression(TarCompressionMethod mode) { + this.compression = mode; + } + public void execute() throws BuildException { if (tarFile == null) { throw new BuildException("tarfile attribute must be set!", @@ -211,7 +231,7 @@ public class Tar extends MatchingTask { try { if (baseDir != null) { if (!baseDir.exists()) { - throw new BuildException("basedir does not exist!", + throw new BuildException("basedir does not exist!", location); } @@ -226,7 +246,7 @@ public class Tar extends MatchingTask { + "attribute or some nested filesets.", location); } - + // check if tar is out of date with respect to each // fileset boolean upToDate = true; @@ -239,7 +259,7 @@ public class Tar extends MatchingTask { } for (int i = 0; i < files.length; ++i) { - if (tarFile.equals(new File(fs.getDir(project), + if (tarFile.equals(new File(fs.getDir(project), files[i]))) { throw new BuildException("A tar file cannot include " + "itself", location); @@ -257,7 +277,10 @@ public class Tar extends MatchingTask { TarOutputStream tOut = null; try { - tOut = new TarOutputStream(new FileOutputStream(tarFile)); + tOut = new TarOutputStream( + compression.compress( + new BufferedOutputStream( + new FileOutputStream(tarFile)))); tOut.setDebug(true); if (longFileMode.isTruncateMode()) { tOut.setLongFileMode(TarOutputStream.LONGFILE_TRUNCATE); @@ -270,13 +293,13 @@ public class Tar extends MatchingTask { } longWarningGiven = false; - for (Enumeration e = filesets.elements(); + for (Enumeration e = filesets.elements(); e.hasMoreElements();) { TarFileSet fs = (TarFileSet) e.nextElement(); String[] files = fs.getFiles(project); if (files.length > 1 && fs.getFullpath().length() > 0) { throw new BuildException("fullpath attribute may only " - + "be specified for " + + "be specified for " + "filesets that specify a " + "single file."); } @@ -315,11 +338,11 @@ public class Tar extends MatchingTask { if (vPath.length() <= 0) { return; } - + if (file.isDirectory() && !vPath.endsWith("/")) { vPath += "/"; } - + String prefix = tarFileSet.getPrefix(); // '/' is appended for compatibility with the zip task. if (prefix.length() > 0 && !prefix.endsWith("/")) { @@ -333,7 +356,7 @@ public class Tar extends MatchingTask { if (l <= 1) { // we would end up adding "" to the archive return; - } + } vPath = vPath.substring(1, l); } @@ -344,11 +367,11 @@ public class Tar extends MatchingTask { return; } else if (longFileMode.isWarnMode()) { log("Entry: " + vPath + " longer than " + - TarConstants.NAMELEN + " characters.", + TarConstants.NAMELEN + " characters.", Project.MSG_WARN); if (!longWarningGiven) { log("Resulting tar file can only be processed " - + "successfully by GNU compatible tar commands", + + "successfully by GNU compatible tar commands", Project.MSG_WARN); longWarningGiven = true; } @@ -406,7 +429,7 @@ public class Tar extends MatchingTask { private String prefix = ""; private String fullpath = ""; private boolean preserveLeadingSlashes = false; - + public TarFileSet(FileSet fileset) { super(fileset); } @@ -528,4 +551,65 @@ public class Tar extends MatchingTask { return OMIT.equalsIgnoreCase(getValue()); } } + + /** + * Valid Modes for Compression attribute to Tar Task + * + */ + public static final class TarCompressionMethod extends EnumeratedAttribute { + + // permissable values for compression attribute + /** + * No compression + */ + private static final String NONE = "none"; + /** + * GZIP compression + */ + private static final String GZIP = "gzip"; + /** + * BZIP2 compression + */ + private static final String BZIP2 = "bzip2"; + + + /** + * Default constructor + */ + public TarCompressionMethod() { + super(); + setValue(NONE); + } + + /** + * Get valid enumeration values. + * @return valid enumeration values + */ + public String[] getValues() { + return new String[] { NONE, GZIP, BZIP2 }; + } + + /** + * This method wraps the output stream with the + * corresponding compression method + * + * @param ostream output stream + * @return output stream with on-the-fly compression + * @exception IOException thrown if file is not writable + */ + private OutputStream compress(final OutputStream ostream) + throws IOException { + final String value = getValue(); + if (GZIP.equals(value)) { + return new GZIPOutputStream(ostream); + } else { + if (BZIP2.equals(value)) { + ostream.write('B'); + ostream.write('Z'); + return new CBZip2OutputStream(ostream); + } + } + return ostream; + } + } } diff --git a/src/main/org/apache/tools/ant/taskdefs/Untar.java b/src/main/org/apache/tools/ant/taskdefs/Untar.java index 8a332092e..dbc520e65 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Untar.java +++ b/src/main/org/apache/tools/ant/taskdefs/Untar.java @@ -61,7 +61,13 @@ import org.apache.tools.tar.TarEntry; import org.apache.tools.ant.util.FileUtils; import java.io.File; import java.io.FileInputStream; +import java.io.BufferedInputStream; +import java.io.InputStream; import java.io.IOException; +import java.util.zip.GZIPInputStream; +import org.apache.tools.bzip2.CBZip2InputStream; +import org.apache.tools.ant.types.EnumeratedAttribute; + /** @@ -75,13 +81,33 @@ import java.io.IOException; * @ant.task category="packaging" */ public class Untar extends Expand { + /** + * compression method + */ + private UntarCompressionMethod compression = new UntarCompressionMethod(); + + /** + * Set compression method. + * + * Allowable values are + * none - no compression + * gzip - Gzip compression + * bzip2 - Bzip2 compression + * + * @param method compression method + */ + public void setCompression(UntarCompressionMethod method) { + compression = method; + } protected void expandFile(FileUtils fileUtils, File srcF, File dir) { TarInputStream tis = null; try { log("Expanding: " + srcF + " into " + dir, Project.MSG_INFO); - - tis = new TarInputStream(new FileInputStream(srcF)); + tis = new TarInputStream( + compression.decompress(srcF, + new BufferedInputStream( + new FileInputStream(srcF)))); TarEntry te = null; while ((te = tis.getNextEntry()) != null) { @@ -101,4 +127,76 @@ public class Untar extends Expand { } } } + + /** + * Valid Modes for Compression attribute to Untar Task + * + */ + public static final class UntarCompressionMethod + extends EnumeratedAttribute { + + // permissable values for compression attribute + /** + * No compression + */ + private static final String NONE = "none"; + /** + * GZIP compression + */ + private static final String GZIP = "gzip"; + /** + * BZIP2 compression + */ + private static final String BZIP2 = "bzip2"; + + + /** + * Constructor + */ + public UntarCompressionMethod() { + super(); + setValue(NONE); + } + + /** + * Get valid enumeration values + * + * @return valid values + */ + public String[] getValues() { + return new String[] { NONE, GZIP, BZIP2 }; + } + + /** + * This method wraps the input stream with the + * corresponding decompression method + * + * @param file provides location information for BuildException + * @param istream input stream + * @return input stream with on-the-fly decompression + * @exception IOException thrown by GZIPInputStream constructor + * @exception BuildException thrown if bzip stream does not + * start with expected magic values + */ + private InputStream decompress(final File file, + final InputStream istream) + throws IOException, BuildException { + final String value = getValue(); + if (GZIP.equals(value)) { + return new GZIPInputStream(istream); + } else { + if (BZIP2.equals(value)) { + final char[] magic = new char[] { 'B', 'Z' }; + for (int i = 0; i < magic.length; i++) { + if (istream.read() != magic[i]) { + throw new BuildException( + "Invalid bz2 file." + file.toString()); + } + } + return new CBZip2InputStream(istream); + } + } + return istream; + } + } } diff --git a/src/main/org/apache/tools/bzip2/CBZip2InputStream.java b/src/main/org/apache/tools/bzip2/CBZip2InputStream.java index 9691bdb53..ef6404ad5 100644 --- a/src/main/org/apache/tools/bzip2/CBZip2InputStream.java +++ b/src/main/org/apache/tools/bzip2/CBZip2InputStream.java @@ -298,7 +298,15 @@ public class CBZip2InputStream extends InputStream implements BZip2Constants { } private void bsFinishedWithStream() { - bsStream = null; + try { + if (this.bsStream != null) { + if (this.bsStream != System.in) { + this.bsStream.close(); + this.bsStream= null; + } + } + } catch (IOException ioe) { + } } private void bsSetStream(InputStream f) { diff --git a/src/testcases/org/apache/tools/ant/taskdefs/TarTest.java b/src/testcases/org/apache/tools/ant/taskdefs/TarTest.java index 76b9d7210..05be9e8e2 100644 --- a/src/testcases/org/apache/tools/ant/taskdefs/TarTest.java +++ b/src/testcases/org/apache/tools/ant/taskdefs/TarTest.java @@ -124,6 +124,29 @@ public class TarTest extends BuildFileTest { } } + public void test9() { + expectBuildException("test9", "Invalid value specified for compression attribute."); + } + + public void test10() { + executeTarget("test10"); + java.io.File f1 + = new java.io.File("src/etc/testcases/taskdefs/test10.xml"); + if (! f1.exists()) { + fail("The fullpath attribute or the preserveLeadingSlashes attribute does not work propertly"); + } + } + + public void test11() { + executeTarget("test11"); + java.io.File f1 + = new java.io.File("src/etc/testcases/taskdefs/test11.xml"); + if (! f1.exists()) { + fail("The fullpath attribute or the preserveLeadingSlashes attribute does not work propertly"); + } + } + + public void tearDown() { executeTarget("cleanup"); } diff --git a/src/testcases/org/apache/tools/ant/taskdefs/UntarTest.java b/src/testcases/org/apache/tools/ant/taskdefs/UntarTest.java index a180314a3..b93877975 100644 --- a/src/testcases/org/apache/tools/ant/taskdefs/UntarTest.java +++ b/src/testcases/org/apache/tools/ant/taskdefs/UntarTest.java @@ -1,7 +1,7 @@ /* * The Apache Software License, Version 1.1 * - * Copyright (c) 2001 The Apache Software Foundation. All rights + * Copyright (c) 2001-2002 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -82,6 +82,20 @@ public class UntarTest extends BuildFileTest { project.resolveFile("asf-logo.gif"))); } + public void testRealGzipTest() throws java.io.IOException { + FileUtils fileUtils = FileUtils.newFileUtils(); + executeTarget("realGzipTest"); + assertTrue(fileUtils.contentEquals(project.resolveFile("../asf-logo.gif"), + project.resolveFile("asf-logo.gif"))); + } + + public void testRealBzip2Test() throws java.io.IOException { + FileUtils fileUtils = FileUtils.newFileUtils(); + executeTarget("realBzip2Test"); + assertTrue(fileUtils.contentEquals(project.resolveFile("../asf-logo.gif"), + project.resolveFile("asf-logo.gif"))); + } + public void testTestTarTask() throws java.io.IOException { FileUtils fileUtils = FileUtils.newFileUtils(); executeTarget("testTarTask"); @@ -89,6 +103,20 @@ public class UntarTest extends BuildFileTest { project.resolveFile("asf-logo.gif"))); } + public void testTestGzipTarTask() throws java.io.IOException { + FileUtils fileUtils = FileUtils.newFileUtils(); + executeTarget("testGzipTarTask"); + assertTrue(fileUtils.contentEquals(project.resolveFile("../asf-logo.gif"), + project.resolveFile("asf-logo.gif"))); + } + + public void testTestBzip2TarTask() throws java.io.IOException { + FileUtils fileUtils = FileUtils.newFileUtils(); + executeTarget("testBzip2TarTask"); + assertTrue(fileUtils.contentEquals(project.resolveFile("../asf-logo.gif"), + project.resolveFile("asf-logo.gif"))); + } + public void testSrcDirTest() throws java.io.IOException { FileUtils fileUtils = FileUtils.newFileUtils(); expectBuildException("srcDirTest", "Src cannot be a directory.");