From 7f9ecc335473a35872eafdce76133044d5a38b3d Mon Sep 17 00:00:00 2001 From: Mike Hiretsky Date: Fri, 22 Apr 2011 10:38:22 +0400 Subject: [PATCH] XZ compression. --- i18n/cl_builder_ru.mo | Bin 15218 -> 15652 bytes pym/cl_builder.py | 19 ++++++++++++++++--- pym/cl_image_cmd.py | 24 +++++++++++++++++++++++- pym/cl_kernel.py | 23 ++++++++++++++++++++--- 4 files changed, 59 insertions(+), 7 deletions(-) diff --git a/i18n/cl_builder_ru.mo b/i18n/cl_builder_ru.mo index d92dcc6b922ea0faaa56cf2687be19acdf6da0e4..0de4d72aa83bc59e204187cf0a4c169b39f1daec 100644 GIT binary patch delta 3315 zcmZwId2Ccw6vy#X76D63Y1yIjSPHUO3Rs{ZvJ?T?q3lIvN(%+rPMK-3P|DD<#ZUzy zL?MbXqGAZK1VNNiq9H&ak~fO_k4u0UA_<}h7{#dH-Pyf2+_&B3+h{YwCwdF=9bTGqrCZ=&6LSD3&{riVe9r+Zy;vH;_Z4+bP_r_jaPej!l z#KE{3```z@SH0&Evjn=Q3VNU_%*14zgQ}nq2jY6{fpz}#OQ_6TLuH~-l37P|P~Q#5 zZa4$=JcN3G2P)GCu@CLrISNYYEz}3?>5X2<@}27&#)r7S108%9)nV87M^pnz^q!*i zLv>^%>bo3dmMnz&ZaqeZQP@X84StDj@HT2BEmF)nV-M66j6zj7ANjKq|GEafDZ+N# zKkR!B`Ll01sllI715Ke3y*I24^RLuQ=LT(BF)}T-0af94R7MV<=KMUW!#9vW>qT$0 zm`0#FT8JzM+k_<3cA_%!1~$V6?2BixAO6&q{AW@~r8`402M6FbRKq7w4S$VVJl5Xq zVd#q*Q4XrZVN{1|a4^1vkKhI5Q~MQ_i6lm)_j;n*&5BS^>VuepwWzr|iTv4DzIRX! zCo(VEnL|+{8;x4+xv13EpuT?_9Xx}yZP!o@{)sa&laGgEWGe-Y<6z3-R(Od>+T(CpcXDzZKo3V3Tkn zZbqfE?FX9A@XI{tC zzU5HR-0nqn;561^0<9{wdvOMSgkvz7JS$VPkz4j0DieoL6<ix6$1U6z}%*Kg08DB-c_dTki zcAVsBPFjpBP#vqrNIHeLC_IUuqej$~J)#k2qbjOErSwf?{n%yXRlA4dF^#>%V5|t4 zE!&COMTb!xy^M^-x=@*>EE`q->i*iIcL z!kai5)w?M$1=rvnT!bkMPg7Eg`W-li8u4{b%2X;h$6-Eds^5uFNTzTV)zDom#8if< z3b&v}auqegL^d&lw;?zW^HC$L$1V5^j>PptVvDsNH5GqgHl`1a4J3rhY-A$^_2>YO z#T%&9XAFz2+C1c2tHT|54R>P&-B-pEXFMVj-d5iP1zC;#pz|F@|7cScuRum1sod>*9Zo zR^030-!H~?8vopXy~w(=uzycmN5^!csaJ}fa)B*v&k*{ZVAFW}{sEjw`S`gL4ESXyZ)xXj57?&=o5Cbf5EMpbWTdDtllmO0__($Zk4tRUaXTjNv?tU9tM zJ}aSFNf8$rRY%+o`{M?$Di4GUmxi4s!Q#?TK{)Ib7nBtS^V6Nm)qzk+ptzvQDGsc0 z@(OgLsJtLtmA)&~>10}E(eiLvl@km(l|=zc=}uaH!O}o^QJLEEi$~Hs&uY}v>(Z|C z-Fvn^<<_|$x<{imZi8FzbtsbhLx&{q`b4yrXANG@iiRXMUQ+MB_?{E3c8|GrymdUf z-3j|WzQ2cVJry3)`;L1my1_l}o+Rq^O|;f=-{-O}y45|Z+f?z-NRCuw{T4UW9|~Wb ZaF73YIPNKW72W8yae`XvyjotczX0Qg!5jbp delta 2908 zcmYk-eN5F=9LMo5U<%4bfz%5qUQ;k0N-{0%}p1yuFxUW!Vn8fWr;J48n}oN^ajbpGx1FwA()C!-GwPzi5yK7&f=B=TpUvr!_K zQ1=ZXvti+6ulu~1g<0rVM)h=V$LCNZ>B2ZXjhd?;P!GI{(HP1``%_To({U0OI;)XC zYht4p9!9O1w^7%9i>lo3(bS)3+8EwW)h!nFz$8>f@=$ZW1(osB$e(?}CKbO&B^pdN zOuNM+MYB{?MHb>1T#w1P8B_3CoQJ&=sedM&Ar8#O1k%%s%TO=gjhd@Yyc0h|jc5p! zuxD~0p(!|*{WQD_YmiH<9T}{hL?!+)>ctmPl@IeX+&Od-QFB#}{Mjz&5!8#jQ6uU{ zt@1xnC5>jjbYB+wupD`|HKJa06icuVv(d{#G=Ngn0Q?Pfl;HvN;R{GHtQT1~b^$e4 zKcY%~)18lDr!k1CA&0D+;Vi;)n2RCYl#NSq1@1>x<~)|-zsOhRw?fiy;XobM;uTEC zO43ZjqqrE);sOlunJvRbn1^k6FP_KcIC^^E{3_Jcb)XVBgNHDbc~u2FaE-qIkLcub zz(YD2xEl4nA7n$4){S~_AMy-~pzbRD95%&RhDx9d^}?S}B_GSLm?}_#_uz5Vfco9> z5VBau`z?o#R&xjHhO@X7Z{k|apT(zzFQTsd1@)px7KU7aT5L7QyR8}T#@Da_zd;Qs zmWwsO9Mp3f(65rdN{97fmytia#%3A%_-07fwj#4)hf!b2Tc|`YBRSe+z9~&v4(bK< zsQcc)jrbMn`dPeH6{tofdMuUtt90*kKsR1<7o@OKRQgI}u(lUjXV!(h)6SqCIOxtN zFkHQ;7@1A$#trx-Zo&kz)>qMj8sJN)#Lvy9{`$cf%;-l7L?L~668<>wt^8+Q_flB0g%)?7ajux94Sgb|JA?w7W=-o47iubRpw`rUHbK}*s67y1c&h}~6Z`c2t2GdH z#71Hwp*d1pPK+n+C-hK_WGpd>P%9=j6FUhtC8nl|RuMZ0RW+JW^|Uq$hz*3wpQrcl zqC*iZgt(2+d{z^+#6!eLd%|^Ma0ao3$R|b7KJ7DhjoSmKUpQI0fysw1s}&KS4D58iNF$#y0Y8rU8F#4G71 z61l_2m^iIsHT}Zz`(vxLb4v?%{jJzuKQ*zvZCu5>;aQ%Z+?dyc+P!ff_S}do3GR6+ Re#qO?n&}DY`6v5&(EsnB5ljF8 diff --git a/pym/cl_builder.py b/pym/cl_builder.py index b6bff83..228fbdf 100644 --- a/pym/cl_builder.py +++ b/pym/cl_builder.py @@ -24,7 +24,7 @@ import traceback from os import path from cl_utils import process,pathJoin,getRunCommands,getTupleVersion,\ childMounts,_toUNICODE,isMount,typeFile, \ - removeDir, pathJoin,listDirectory + removeDir, pathJoin,listDirectory, getSquashList from subprocess import STDOUT,PIPE from cl_print import color_print from cl_datavars import DataVars @@ -92,6 +92,7 @@ class cl_builder(color_print): self.assembleIso = False self.envFile = '/etc/calculate/assemble.env' self.curProfile = None + self.compression = "gzip" def setNoColor(self): self.color = False @@ -443,7 +444,8 @@ class cl_builder(color_print): return False excludeList = self._excludeList(sourceDirectory) self.targetDistr = IsoDistributive(isoFile,bdirectory=buildDirectory, - exclude=excludeList) + exclude=excludeList, + compress=self.compression) self.sourceDistr = DirectoryDistributive(sourceDirectory, mdirectory=bindDirectory) if not force: @@ -524,7 +526,8 @@ class cl_builder(color_print): excludeList = self._excludeList(sourceDirectory) self.targetDistr = IsoDistributive(buildDirectory, bdirectory=buildDirectory, - exclude=excludeList) + exclude=excludeList, + compress=self.compression) self.sourceDistr = DirectoryDistributive(sourceDirectory, mdirectory=bindDirectory) if not force: @@ -715,3 +718,13 @@ class cl_builder(color_print): except: return False return True + + def setCompression(self,compress): + """Set compression for squashsf in iso livecd""" + compress_methods=getSquashList() + if compress in compress_methods: + self.compression = compress + return True + self.printERROR(_("'{0}' is not supported by {1}")\ + .format(compress,"squashfs")) + return False diff --git a/pym/cl_image_cmd.py b/pym/cl_image_cmd.py index ded88c5..c7d7332 100644 --- a/pym/cl_image_cmd.py +++ b/pym/cl_image_cmd.py @@ -18,7 +18,7 @@ from cl_builder import cl_builder, __app__, __version__ from cl_opt import opt from cl_share_cmd import share_cmd from cl_vars_share import varsShare -from cl_utils import _toUNICODE +from cl_utils import _toUNICODE, getSquashList import os from os import path from os import access,R_OK @@ -31,6 +31,8 @@ from cl_lang import lang lang().setLanguage(sys.modules[__name__]) OSSYSTEM_LIST=sorted(varsShare.dictNameSystem.keys()) +COMPRESS_METHODS=getSquashList() +DEFAULT_COMPRESS="xz" if "xz" in COMPRESS_METHODS else "gzip" DESCRIPTION = _("The Calculate Linux image builder") CMD_OPTIONS = [{'shortOption':"p", @@ -38,6 +40,21 @@ CMD_OPTIONS = [{'shortOption':"p", 'optVal':"PROFILE", 'help':_("system profile") }, + {'longOption':"compress", + 'optVal':"COMPRESS", + 'type':'choice', + 'choices':COMPRESS_METHODS, + 'default':DEFAULT_COMPRESS, + 'help':_("squashfs compress method. " + "{varname} may be {values}.")\ + .format(varname="COMPRESS", + values=_("{list} or {last}. %default by default")\ + .format( + list=", ".join(COMPRESS_METHODS[:-1]), + last=COMPRESS_METHODS[-1]) + if len(COMPRESS_METHODS)>1 + else _("only {0}").format(COMPRESS_METHODS[0])) + }, {'longOption':'notree', 'help':_("exclude portage tree from image") }, @@ -124,6 +141,11 @@ class image_cmd(share_cmd): if self.isScratch(False): self.optobj.error(_("'--profile' not used in scratch mode")) + # set compression for squashfs + if values.compress: + if not self.logicObj.setCompression(values.compress): + sys.exit(1) + if not self.isScratch(False) \ and self.logicObj.clVars.Get('cl_builder_distro'): if not self.logicObj.setAssembleData(values.p,values.v): diff --git a/pym/cl_kernel.py b/pym/cl_kernel.py index 9fd9a79..623a2bc 100644 --- a/pym/cl_kernel.py +++ b/pym/cl_kernel.py @@ -21,7 +21,8 @@ import sys import traceback from os import path from cl_builder import DataVarsBuilder, printNoColor, __version__, __app__ -from cl_utils import process,listDirectory,cmpVersion,reVerSplitToPV,reVerSplit +from cl_utils import process,listDirectory,cmpVersion,reVerSplitToPV, \ + reVerSplit from subprocess import STDOUT,PIPE from cl_print import color_print from shutil import copy2 as copy_with_perm @@ -32,6 +33,20 @@ from cl_lang import lang lang().setLanguage(sys.modules[__name__]) class changer: + """Reducer for change block by condition + + def up(self,y) - condition to start change + def drop(self,y) - condition to stop change + def change(self,y) - perform string change. + + Using: + class changer: + up = lambda self,y: "test" in y + drop = lambda self,y: "stop" in y + change = lambda self,y: y.replace("abc","zxc") + + listing = changer().reduce(listing) + """ initReduce = [False,[]] def __call__(self,x,y): if self.drop(y): @@ -43,6 +58,7 @@ class changer: return [x[0],x[1] + [y]] def reduce(self,obj): + """Perform reduce""" return reduce(self,obj,self.initReduce)[1] class cl_kernel(color_print): @@ -351,8 +367,8 @@ class cl_kernel(color_print): up = lambda self,y: y.startswith('kernel') and \ "root=%s"%rootdev in y def change(self,y): - y = reChangeKernel.sub("\\1-%s\\2 "%clKernelUid,y) - y = reChangeInitrd.sub("\\1initrd-%s\\2"%clKernelUid,y) + y = self.reChangeKernel.sub("\\1-%s\\2 "%clKernelUid,y) + return self.reChangeInitrd.sub("\\1initrd-%s\\2"%clKernelUid,y) class grubchangeCONSOLE(grubsetUID): up = lambda self,y: y.startswith('kernel') and \ @@ -486,3 +502,4 @@ class cl_kernel(color_print): except (OSError,IOError),e: self.printERROR(str(e)) return False +