def generate_source(self): """ generate a deb of version 'version', with or without 'changelog', with or without a rpm (in the current folder) return a list of generated files """ if not sum([len(i) for i in self.__files.values()])>0: raise PyPackagerException("no files are defined") if not self.changelog: self.changelog=" * no changelog" if self.section not in PyPackager.SECTIONS: raise PyPackagerException("section '%s' is unknown (%s)" % (self.section,str(PyPackager.SECTIONS))) if self.arch not in PyPackager.ARCHS: raise PyPackagerException("arch '%s' is unknown (%s)"% (self.arch,str(PyPackager.ARCHS))) if self.license not in PyPackager.LICENSES: raise PyPackagerException("License '%s' is unknown (%s)" % (license,str(PyPackager.LICENSES))) # create dates (buildDate,buildDateYear) d=datetime.now() self.buildDate=d.strftime("%a, %d %b %Y %H:%M:%S +0000") self.buildDateYear=str(d.year) #clean description (add a space before each next lines) self.description=self.description.replace("\r","").strip() self.description = "\n ".join(self.description.split("\n")) #clean upgrade_description (add a space before each next lines) self.upgrade_description=self.upgrade_description.replace("\r","").strip() self.upgrade_description = "\n ".join(self.upgrade_description.split("\n")) #clean changelog (add 2 spaces before each next lines) # self.changelog=self.changelog.replace('\r','').strip() # self.changelog='\n '.join(self.changelog.split('\n')) #sad !!! self.changelog=self.changelog.replace('\r','').strip() changeslog = '' for line in self.changelog.split('\n'): changeslog = changeslog + ' '+line+'\n' self.changelog = changeslog # print '---' # print self.changelog # print '---' self.TEMP = ".pypackager_build_folder" DEST = os.path.join(self.TEMP,self.name) DEBIAN = os.path.join(DEST,"debian") # let's start the process try: shutil.rmtree(self.TEMP) except: pass os.makedirs(DEBIAN) try: rules=[] dirs=[] for path in self.__files: for ofile,nfile in self.__files[path]: if os.path.isfile(ofile): # it's a file if ofile.startswith("/"): # if absolute path # we need to change dest dest=os.path.join(DEST,nfile) else: dest=os.path.join(DEST,ofile) # copy file to be packaged destDir = os.path.dirname(dest) if not os.path.isdir(destDir): os.makedirs(destDir) shutil.copy2(ofile,dest) ndir = os.path.join(path,os.path.dirname(nfile)) nname = os.path.basename(nfile) # make a line RULES to be sure the destination folder is created # and one for copying the file fpath = "/".join(["$(CURDIR)","debian",self.name+ndir]) rules.append('mkdir -p "%s"' % fpath) rules.append('cp -a "%s" "%s"' % (ofile,os.path.join(fpath,nname))) # append a dir dirs.append(ndir) else: raise PyPackagerException("unknown file '' "%ofile) # shouldn't be raised (because controlled before) # make rules right self.rules= "\n\t".join(rules) + "\n" # make dirs right dirs= [ i[1:] for i in set(dirs)] dirs.sort() #========================================================================== # CREATE debian/dirs #========================================================================== open(os.path.join(DEBIAN,"dirs"),"w").write("\n".join(dirs)) #========================================================================== # CREATE debian/changelog #========================================================================== clog="""%(name)s (%(version)s-%(buildversion)s) stable; urgency=low %(changelog)s -- %(author)s <%(email)s> %(buildDate)s """ % self.__dict__ open(os.path.join(DEBIAN,"changelog"),"w").write(clog) #========================================================================== #Create pre/post install/remove #========================================================================== def mkscript( name , dest ): if name and name.strip()!="": if (os.path.isfile(name)):# or (os.path.isfile(os.path.join(CURRENT,name))): # it's a file content = file(name).read() else: # it's a script content = name print os.path.join(DEBIAN,dest) open(os.path.join(DEBIAN,dest),"w").write(content) mkscript(self.preinstall ,"preinst") mkscript(self.postinstall,"postinst") mkscript(self.preremove ,"prerm") mkscript(self.postremove ,"postrm") #========================================================================== # CREATE debian/compat #========================================================================== open(os.path.join(DEBIAN,"compat"),"w").write("5\n") #========================================================================== # CREATE icon #========================================================================== self.iconstr = "" if self.icon is not None and os.path.exists(self.icon): try: import base64 iconb64 = "".join(base64.encodestring(open(self.icon).read()).split("\n")[0:-1]) self.iconstr = "XB-Maemo-Icon-26: %s" % ( iconb64 ) except: pass #========================================================================== # CREATE bugtracker #========================================================================== self.bugtrackerstr = "XSBC-Bugtracker: %s" % ( self.bugtracker ) #========================================================================== # CREATE debian/control #========================================================================== txt="""Source: %(name)s Section: %(section)s Priority: extra Maintainer: %(author)s <%(email)s> Build-Depends: debhelper (>= 5)""" % self.__dict__ txt = txt + ", aegis-builder" if (self.aegisManifest) else '' txt = txt + """ Standards-Version: 3.7.2 Package: %(name)s XB-Maemo-Display-Name: %(display_name)s Architecture: %(arch)s Depends: %(depends)s Suggests: %(suggests)s Description: %(description)s XB-Maemo-Upgrade-Description: %(upgrade_description)s XB-Maemo-Flags: %(maemo_flags)s XB-MeeGo-Desktop-Entry-Filename: %(meego_desktop_entry_filename)s %(bugtrackerstr)s %(iconstr)s""" % self.__dict__ open(os.path.join(DEBIAN,"control"),"w").write(txt) #========================================================================== # CREATE debian/copyright #========================================================================== copy={} copy["gpl"]=""" This package is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this package; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA On Debian systems, the complete text of the GNU General Public License can be found in `/usr/share/common-licenses/GPL'. """ copy["lgpl"]=""" This package is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this package; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA On Debian systems, the complete text of the GNU Lesser General Public License can be found in `/usr/share/common-licenses/LGPL'. """ copy["bsd"]=""" Redistribution and use in source and binary forms, with or without modification, are permitted under the terms of the BSD License. THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. On Debian systems, the complete text of the BSD License can be found in `/usr/share/common-licenses/BSD'. """ copy["shareware"]=""" This product is copyrighted shareware, not public-domain software. You may use the unregistered version at no charge for an evaluation period. To continue to use the software beyond evaluation period, you must register it. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. """ copy["artistic"]=""" This program is free software; you can redistribute it and/or modify it under the terms of the "Artistic License" which comes with Debian. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. On Debian systems, the complete text of the Artistic License can be found in `/usr/share/common-licenses/Artistic'. """ self.txtLicense = copy[self.license] self.pv=__version__ txt="""This package was pypackaged(%(pv)s) by %(author)s <%(email)s> on %(buildDate)s. It was downloaded from %(url)s Upstream Author: %(author)s <%(email)s> Copyright: %(buildDateYear)s by %(author)s License: %(txtLicense)s The Debian packaging is (C) %(buildDateYear)s, %(author)s <%(email)s> and is licensed under the GPL, see above. # Please also look if there are files or directories which have a # different copyright/license attached and list them here. """ % self.__dict__ open(os.path.join(DEBIAN,"copyright"),"w").write(txt) #========================================================================== # CREATE debian/rules #========================================================================== txt="""#!/usr/bin/make -f # -*- makefile -*- # Sample debian/rules that uses debhelper. # This file was originally written by Joey Hess and Craig Small. # As a special exception, when this file is copied by dh-make into a # dh-make output file, you may use that output file without restriction. # This special exception was added by Craig Small in version 0.37 of dh-make. # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 CFLAGS = -Wall -g ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) CFLAGS += -O0 else CFLAGS += -O2 endif configure: configure-stamp configure-stamp: dh_testdir # Add here commands to configure the package. touch configure-stamp build: build-stamp build-stamp: configure-stamp dh_testdir touch build-stamp clean: dh_testdir dh_testroot rm -f build-stamp configure-stamp dh_clean install: build dh_testdir dh_testroot dh_clean -k dh_installdirs # ====================================================== #$(MAKE) DESTDIR="$(CURDIR)/debian/%(name)s" install mkdir -p "$(CURDIR)/debian/%(name)s" %(rules)s # ====================================================== # Build architecture-independent files here. binary-indep: build install # We have nothing to do by default. # Build architecture-dependent files here. binary-arch: build install dh_testdir dh_testroot dh_installchangelogs debian/changelog dh_installdocs dh_installexamples # dh_install # dh_installmenu # dh_installdebconf # dh_installlogrotate # dh_installemacsen # dh_installpam # dh_installmime # dh_python # dh_installinit # dh_installcron # dh_installinfo dh_installman dh_link dh_strip dh_compress dh_fixperms # dh_perl # dh_makeshlibs dh_installdeb dh_shlibdeps dh_gencontrol dh_md5sums dh_builddeb aegis-deb-add -control debian/%(name)s/DEBIAN/control .. debian/%(name)s.aegis=_aegis binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install configure """ % self.__dict__ open(os.path.join(DEBIAN,"rules"),"w").write(txt) os.chmod(os.path.join(DEBIAN,"rules"),0755) ########################################################################### ########################################################################### ########################################################################### #http://www.debian.org/doc/manuals/maint-guide/ch-build.fr.html #ret=os.system('cd "%(DEST)s"; dpkg-buildpackage -tc -rfakeroot -us -uc' % locals()) #if ret!=0: # raise Py2debException("buildpackage failed (see output)") #========================================================================== # CREATE debian/digsigsums #========================================================================== if self.createDigsigsums: from ppkg_digsigsums import generate_digsigsums open(os.path.join(DEBIAN,"digsigsums"),"w").write(generate_digsigsums(self.name, self.__files)) #========================================================================== # CREATE debian/_aegis manifest # <aegis name="..."> # <provide> ... </provide> # <constraint> ... </constraint> # <account> ... </account> # <request> ... </request> # <domain> ... </domain> # <docstring> ... </docstring> #</aegis>''' #========================================================================== if self.aegisManifest: mkscript(self.aegisManifest, '%s.aegis' % self.__dict__['name']) #Tar import ppkg_py2tar tarcontent= ppkg_py2tar.py2tar("%(DEST)s" % locals() ) open("%(TEMP)s/%(name)s_%(version)s-%(buildversion)s.tar.gz"%self.__dict__,"wb").write(tarcontent.packed()) #Dsc import ppkg_py2dsc import locale import commands # from subprocess import * try: old_locale,iso=locale.getlocale(locale.LC_TIME) locale.setlocale(locale.LC_TIME,'en_US') except: pass dsccontent = ppkg_py2dsc.py2dsc("%(version)s-%(buildversion)s"%self.__dict__, "%(depends)s"%self.__dict__, ("%(TEMP)s/%(name)s_%(version)s-%(buildversion)s.tar.gz"%self.__dict__,), Format='1.0', Source="%(name)s"%self.__dict__, Version="%(version)s-%(buildversion)s"%self.__dict__, Maintainer="%(author)s <%(email)s>"%self.__dict__, Architecture="%(arch)s"%self.__dict__, ) f = open("%(TEMP)s/%(name)s_%(version)s-%(buildversion)s.dsc"%self.__dict__,"wb") f.write(dsccontent._getContent()) f.close() #Changes import ppkg_py2changes changescontent = ppkg_py2changes.py2changes( "%(author)s <%(email)s>"%self.__dict__, "%(description)s"%self.__dict__, "%(changelog)s"%self.__dict__, ( "%(TEMP)s/%(name)s_%(version)s-%(buildversion)s.tar.gz"%self.__dict__, "%(TEMP)s/%(name)s_%(version)s-%(buildversion)s.dsc"%self.__dict__, ), "%(section)s"%self.__dict__, "%(repository)s"%self.__dict__, Format='1.7', Date=time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime()), Source="%(name)s"%self.__dict__, Architecture="%(arch)s"%self.__dict__, Version="%(version)s-%(buildversion)s"%self.__dict__, Distribution="%(distribution)s"%self.__dict__, Urgency="%(urgency)s"%self.__dict__, Maintainer="%(maintainer)s <%(email)s>"%self.__dict__ ) f = open("%(TEMP)s/%(name)s_%(version)s-%(buildversion)s.changes"%self.__dict__,"wb") f.write(changescontent.getContent()) f.close() try: locale.setlocale(locale.LC_TIME,old_locale) except: pass ret = [] l=glob("%(TEMP)s/%(name)s*.tar.gz"%self.__dict__) if len(l)!=1: raise PyPackagerException("don't find source package tar.gz") tar = os.path.basename(l[0]) shutil.move(l[0],tar) ret.append(tar) l=glob("%(TEMP)s/%(name)s*.dsc"%self.__dict__) if len(l)!=1: raise PyPackagerException("don't find source package dsc") tar = os.path.basename(l[0]) shutil.move(l[0],tar) ret.append(tar) l=glob("%(TEMP)s/%(name)s*.changes"%self.__dict__) if len(l)!=1: raise PyPackagerException("don't find source package changes") tar = os.path.basename(l[0]) shutil.move(l[0],tar) ret.append(tar) return ret finally: shutil.rmtree(self.TEMP)
def generate_binary(self): from ppkg_debfile import MaemoPackage, ControlFile import base64 try: iconb64 = "".join(base64.encodestring(open(self.icon).read()).split("\n")[0:-1]) except: iconb64= '' theMaemoPackage = MaemoPackage( ControlFile(Icon=str(iconb64), BugTracker=self.bugtracker, DisplayName=self.display_name, PreInst=self.preinstall, PostInst=self.postinstall, PreRm=self.preremove, PostRm=self.postremove, Package=self.name, Version=self.version+'-'+self.buildversion, Section=self.section, Priority='low', Architecture=self.arch, Maintainer=self.maintainer, Depends=self.depends, Suggest=self.suggests, Description=self.description, UpgradeDescription=self.upgrade_description, MaemoFlags=self.maemo_flags, MeegoDesktopEntryFilename=self.meego_desktop_entry_filename, createDigsigsums=self.createDigsigsums, aegisManifest = self.aegisManifest), self.__files) open(self.name+'_'+self.version+'-'+self.buildversion+'_'+self.arch+ '.deb',"wb").write(theMaemoPackage.packed()) #Dsc import ppkg_py2dsc import locale import commands # from subprocess import * try: old_locale,iso=locale.getlocale(locale.LC_TIME) locale.setlocale(locale.LC_TIME,'en_US') except: pass dsccontent = ppkg_py2dsc.py2dsc("%(version)s-%(buildversion)s"%self.__dict__, "%(depends)s"%self.__dict__, ("%(name)s_%(version)s-%(buildversion)s_%(arch)s.deb"%self.__dict__,), Format='1.0', Source="%(name)s"%self.__dict__, Version="%(version)s-%(buildversion)s"%self.__dict__, Maintainer="%(author)s <%(email)s>"%self.__dict__, Architecture="%(arch)s"%self.__dict__, ) f = open("%(name)s_%(version)s-%(buildversion)s.dsc"%self.__dict__,"wb") f.write(dsccontent._getContent()) f.close() #Changes import ppkg_py2changes changescontent = ppkg_py2changes.py2changes( "%(author)s <%(email)s>"%self.__dict__, "%(description)s"%self.__dict__, "%(changelog)s"%self.__dict__, ( "%(name)s_%(version)s-%(buildversion)s_%(arch)s.deb"%self.__dict__, "%(name)s_%(version)s-%(buildversion)s.dsc"%self.__dict__, ), "%(section)s"%self.__dict__, "%(repository)s"%self.__dict__, Format='1.7', Date=time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime()), Source="%(name)s"%self.__dict__, Architecture="%(arch)s"%self.__dict__, Version="%(version)s-%(buildversion)s"%self.__dict__, Distribution="%(distribution)s"%self.__dict__, Urgency="%(urgency)s"%self.__dict__, Maintainer="%(maintainer)s <%(email)s>"%self.__dict__ ) f = open("%(name)s_%(version)s-%(buildversion)s.changes"%self.__dict__,"wb") f.write(changescontent.getContent()) f.close() try: locale.setlocale(locale.LC_TIME,old_locale) except: pass