~ubuntu-branches/ubuntu/feisty/aptoncd/feisty

« back to all changes in this revision

Viewing changes to CreateAptOncd.py

  • Committer: Bazaar Package Importer
  • Author(s): Rafael Proença
  • Date: 2007-03-13 17:29:35 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20070313172935-o9bsldf7qbau69o0
Tags: 0.1~rc-0ubuntu1
* Improvements in performance of the create treeview (+60% faster while mounting the list of packages);
* Added a call method for Download Repository (--download, just like --create) calling frmDownload without shown frmMainWindow;
* Now shows the number of downloaded files/to download in the Download Repository window;
* Placed a window when download susessful finished, asking if user want do remove the temp files;
* Improved the auto-select dependencies recursively, it's smarter now;
* locking unsuported characters to aptoncd iso fileaname;
* Hidding Cancel button while reading packages (we doesn't need this anymore, sice it's a faster process);
* Hidding the main window when using parameters (such --download, -i, --restore, etc);
* Moving the way APTonCD handle the destination of .iso images - Closes LP#89320;
* Do not close the window when user hasn't enought right in the destination folder - Closes LP#89325;
* Avoiding the user to select a destination folder that doesn't have writting permissions;
* Do not permit the user to restore an aptoncd media created in a version that differs from your running system;
* Correcting some grammar mistakes, applying Bruce's patch. Closes LP#89733;
* Now old packages in the Create list has a different pango markup to differ from the new ones;
* Changing the window type of frmCreate and frmRestore to show minimize and maximize buttons;
* Fixed bug while cancel the creation of APTonCD copy/iso
* Auto-select dependencies in create actived by default;
* Now we have a README.diskdefines inside the media, to make APT happy;
* Documentation update

Show diffs side-by-side

added added

removed removed

Lines of Context:
36
36
import re
37
37
import shutil
38
38
import utils
39
 
import msg
 
39
import msg
40
40
import gzip
 
41
#from mediaInfo import mediaInfo
 
42
import mediaInfo
 
43
from mediaInfo import aptDiskInfo
 
44
from mediaInfo import aptDiskDefines
41
45
 
42
46
(LOAD_DEFAULT, LOAD_DOWNLOAD, LOAD_FILE) = range(3)
43
47
class createAptOnCd:
52
56
        self.checkOld = False
53
57
        self.AllowedChars = re.compile('[^0-9A-Za-z_\s\+\.-]+')
54
58
        self.type = loadfrom
 
59
        self.isError = False
55
60
                
56
61
    def run(self):
57
62
        """This function will show the Create APTonCD Dialog"""
69
74
        # ---- dictionary ----
70
75
        dic = { 'on_btnCreateGo_clicked' : self.on_btnCreateGo_clicked,'on_btnAddDeb_clicked':self.on_btnAddDeb_clicked}
71
76
        
72
 
        self.gladeFile.signal_autoconnect(dic)        
 
77
        self.gladeFile.signal_autoconnect(dic)       
 
78
        self.frmCreateCD.connect('response', self.onResponse) 
73
79
        self.cmdCreateGo = self.gladeFile.get_widget("btnCreateGo")
 
80
        
74
81
        self.cmdAddDeb = self.gladeFile.get_widget("btnAddDeb")
75
82
        self.cmdCancel = self.gladeFile.get_widget("btnCancel")
 
83
        self.cmdCancel.connect('clicked',self.onCancel)
 
84
        
76
85
        self.lblMediaNumber = self.gladeFile.get_widget("lblMediaNumber")
77
86
        self.cboMediaCreate = self.gladeFile.get_widget("cboMediaCreate")
78
87
        self.cboMediaCreate.connect("changed", self.on_cboMediaCreate)
79
88
 
 
89
        self.txtFileName = self.gladeFile.get_widget('entryIsoFilename')
 
90
        self.txtFileName.connect('insert-text',self.on_insert_text)
 
91
        
80
92
        self.ckbtnOldVersions = self.gladeFile.get_widget("ckbtnOldVersions")
81
93
        self.ckbtnOldVersions.connect("toggled", self.on_ckbtnOldVersion_check)
82
94
 
83
95
        self.ckbtnMetaPackage = self.gladeFile.get_widget("ckbtnMetaPackage")
84
96
        self.ckbtnMetaPackage.connect("toggled", self.on_ckbtnMetaPackage_check)
85
97
        
 
98
        self.cmbIsoFileName = self.gladeFile.get_widget("fileIsoTo")
 
99
        self.cmbIsoFileName.connect('selection_changed', self.on_cmbIsoFileName_change)
 
100
        
86
101
        self.ckbtnAutoSelectDepends = self.gladeFile.get_widget("ckbtnAutoSelectDepends")
87
102
        
88
103
        ret = metaPackage.updatePackageCount(None,False)
97
112
        result = self.frmCreateCD.run()
98
113
 
99
114
        #we are done with the dialog, destory it
100
 
        self.frmCreateCD.destroy()
 
115
        if result == gtk.RESPONSE_CANCEL :
 
116
            self.frmCreateCD.destroy()
 
117
        if result == gtk.RESPONSE_OK and not self.isError :
 
118
            self.frmCreateCD.destroy()
101
119
 
102
120
        #return the result
103
121
        return     result
104
122
    
 
123
    def on_cmbIsoFileName_change(self, widget):
 
124
        toMainDir = widget.get_filename()
 
125
        #print toMainDir
 
126
        if not self.util.checkAccess(toMainDir):
 
127
            widget.set_current_folder(os.path.expanduser('~/'))
 
128
            widget.emit_stop_by_name('selection_changed')
 
129
            #
 
130
 
 
131
        
 
132
    def package_tree_sort_func(self, model, iter1, iter2):
 
133
       statecmp = cmp(model.get_value(iter1, config.C_TITLE), model.get_value(iter2, config.C_TITLE))
 
134
       #if statecmp == 0:
 
135
       try:
 
136
           descr1 = model.get_value(iter1, config.C_PKG).get_pkg_Name()
 
137
       except:
 
138
           descr1 = None
 
139
       if descr1:
 
140
           descr1 = descr1.decode('utf-8')
 
141
       try:
 
142
           descr2 = model.get_value(iter2, config.C_PKG).get_pkg_Name()
 
143
       except:
 
144
           descr2 = None
 
145
       if descr2:
 
146
           descr2 = descr2.decode('utf-8')
 
147
       
 
148
       return cmp(descr1, descr2)
 
149
 
 
150
        
 
151
    def onCancel(self,widget,*args):
 
152
        self.frmCreateCD.destroy()
 
153
        
 
154
    def onResponse(self, response_id ,value):
 
155
        if response_id == gtk.RESPONSE_OK and self.isError:
 
156
            print 'Onresponse:', response_id
 
157
            self.isError = False
 
158
            self.frmCreateCD.emit_stop_by_name('response')
 
159
        elif response_id == gtk.RESPONSE_OK and not self.isError:
 
160
            self.wProgress.destroy()
 
161
        
 
162
    def on_insert_text (self, entry, text, length, position):
 
163
        """Stop garbage input."""
 
164
        for c in text[:length]:
 
165
            if c in r"(){}[]<>?*&%$#@!';:|\/^ ":
 
166
                entry.emit_stop_by_name ('insert-text')
 
167
                
 
168
            
105
169
    def on_cboMediaCreate(self,*args):
106
170
        ret = metaPackage.updatePackageCount(self.packageList)
107
171
        self.updateCountView(ret)
149
213
            #column = gtk.TreeViewColumn(title, cell, text = columnId)            
150
214
 
151
215
        column.set_resizable(True)
152
 
        column.set_sort_column_id(columnId)
 
216
        #column.set_sort_column_id(columnId)
 
217
        
153
218
        self.packageView.append_column(column)
154
219
        
155
220
        return
163
228
        self.packageView.set_sensitive(False)
164
229
        
165
230
        self.wProgress = ProgressWindow.AptOnCDProgressDialog(self.frmCreateCD)
166
 
        self.wProgress.Title("APTonCD")
 
231
        self.wProgress.Title("Selecting Packages")
167
232
        self.wProgress.TaskTitle(msg.MESSAGE_0001)
168
233
        self.wProgress.Task(msg.MESSAGE_0002)
169
234
        self.wProgress.Description(msg.MESSAGE_0003)
201
266
        
202
267
        # this will start the list sorted by name
203
268
        self.packageList.set_sort_column_id(1, gtk.SORT_ASCENDING)
 
269
        
 
270
        self.createDebFileList()
 
271
        
204
272
        # this will create the main list and store it in the view
 
273
        self.packageList.set_sort_func(config.C_TITLE, self.package_tree_sort_func)
 
274
        self.packageList.set_sort_column_id(config.C_TITLE, gtk.SORT_ASCENDING)
 
275
        
205
276
        self.packageView.set_model(self.packageList)
206
277
        
207
 
        self.createDebFileList()
208
278
        
209
279
        self.wProgress.destroy()
210
280
        
230
300
        if mediaCount > 1 :
231
301
            self.gladeFile.get_widget("lblMediaNumber")   .set_text("<span foreground='gray'><big><b>%s %ss</b></big></span>" % ( mediaCount,mediaType))
232
302
        else:
233
 
             #self.gladeFile.get_widget("lblMediaNumber")   .set_text("%s %s" % ( mediaCount,mediaType))
234
 
             self.gladeFile.get_widget("lblMediaNumber")   .set_text("<span foreground='gray'><big><b>%s %s</b></big></span>" % ( mediaCount,mediaType))
 
303
            self.gladeFile.get_widget("lblMediaNumber")   .set_text("<span foreground='gray'><big><b>%s %s</b></big></span>" % ( mediaCount,mediaType))
235
304
             
236
305
        self.gladeFile.get_widget("lblMediaNumber").set_use_markup(True)
237
306
        
274
343
                    self.updateCountView(ret)
275
344
                else:
276
345
                    from messageBox import MessageBox
277
 
                    MessageBox().ShowError(msg.MESSAGE_0005 % (filename,self.frmCreateCD))
 
346
                    MessageBox().ShowError(msg.MESSAGE_0005 %filename,self.frmCreateCD)
278
347
 
279
348
                self.cursorManager.setBusy(self.frmCreateCD,False)
280
349
                
355
424
    
356
425
        
357
426
    # Create APTonCD
358
 
    def on_btnCreateGo_clicked(self,*args):
359
 
        isError = False
 
427
    def on_btnCreateGo_clicked(self,widget, *args):
 
428
        self.isError = False
360
429
        self.entryIsoFilename = self.gladeFile.get_widget("entryIsoFilename").get_text()
361
430
        
362
431
        if self.entryIsoFilename !="":
363
432
            if not self.util.isValidFileName(self.entryIsoFilename):
364
433
                mReturn = MessageBox().ShowError((msg.MESSAGE_0024  % ( self.entryIsoFilename)),self.frmCreateCD)
365
 
                isError = True
366
 
        if not isError:
 
434
                self.isError = True
 
435
        
 
436
        if not self.isError:
367
437
            self.cmdCreateGo.set_sensitive(False)
368
438
            self.cmdCancel.set_sensitive(False)
369
 
       
370
 
            self.wProgress = ProgressWindow.AptOnCDProgressDialog(self.frmCreateCD)
371
 
            self.wProgress.Title("APTonCD")
372
 
            self.wProgress.TaskTitle(msg.MESSAGE_0013)
373
 
            self.wProgress.Task(msg.MESSAGE_0002)
374
 
            self.wProgress.Description(msg.MESSAGE_0014)
375
 
            self.createAptOnCD()
 
439
             
 
440
            toMainDir = self.gladeFile.get_widget("fileIsoTo").get_filename()
376
441
        
377
 
            self.wProgress.destroy()
 
442
            if self.util.checkAccess(toMainDir):
 
443
 
 
444
                self.wProgress = ProgressWindow.AptOnCDProgressDialog(self.frmCreateCD)
 
445
                self.wProgress.Title("APTonCD")
 
446
                self.wProgress.TaskTitle(msg.MESSAGE_0013)
 
447
                self.wProgress.Task(msg.MESSAGE_0002)
 
448
                self.wProgress.Description(msg.MESSAGE_0014)
 
449
    
 
450
                if not self.createAptOnCD():
 
451
                    self.isError = True
 
452
            else:
 
453
                    MessageBox().ShowError(msg.MESSAGE_0015,self.frmCreateCD)
 
454
                    self.isError = True
 
455
            
378
456
        
379
457
        self.cmdCreateGo.set_sensitive(True)
380
458
        self.cmdCancel.set_sensitive(True)
381
459
        
 
460
        #return self.isError
 
461
        
382
462
    def createAptOnCD(self):
383
463
 
384
464
        import datetime        
390
470
        
391
471
        if not self.util.checkAccess(toMainDir):
392
472
            MessageBox().ShowError(msg.MESSAGE_0015,self.frmCreateCD)
393
 
            return
394
 
        
395
 
        to = toMainDir + "/aptoncd/"
396
 
        packages = to + "packages/"
397
 
        metapackageDir = to + "metapackage/"
 
473
            return False
 
474
 
398
475
        media = self.cboMediaCreate.get_active_text()       
399
 
                
400
 
        config.set("cache", "to", to)
401
 
        config.set("cache", "packages", packages)        
 
476
     
402
477
        config.set("cache", "media", media)
403
478
                
404
479
        config.write(config.CONFIG_FILE)
405
 
 
 
480
        
406
481
        metaPackActive = self.ckbtnMetaPackage.get_active()
 
482
        tmpdir = "/tmp/aptoncd-c/"
 
483
        tmpmetapackageDir = tmpdir +"metapackage/"
 
484
        tmppackages = tmpdir + "packages/"
407
485
        
408
 
        self.util.mkdir(to,True)
409
 
        self.util.mkdir(packages ,True)
 
486
        self.util.mkdir(tmpdir,True)
410
487
        
411
488
        if metaPackActive:
412
 
            self.util.mkdir(metapackageDir + 'DEBIAN/',True)
 
489
            self.util.mkdir(tmpmetapackageDir + 'DEBIAN/',True)
413
490
        else:
414
 
            self.util.removePath(metapackageDir )    
 
491
            self.util.removePath(tmpmetapackageDir )    
415
492
        
416
493
        self.wProgress.show()
417
494
        
431
508
        for cds in isoFileList.keys():
432
509
            self.wProgress.Task(msg.MESSAGE_0002)            
433
510
            # --- some meta-package configs ---
434
 
            controlFile =  metapackageDir + 'DEBIAN/control'
 
511
            controlFile =  tmpmetapackageDir + 'DEBIAN/control'
435
512
            self.util.delFile(controlFile)
436
513
        
437
514
            mPack = metaPackage.MetaPackage(controlFile)
438
515
        
439
 
            destination = packages+ media +"_" + cds.__str__() + "/"
 
516
            destination = tmppackages+ media +"_" + cds.__str__() + "/"
440
517
            pkgdest = destination + 'packages/'
441
518
            
442
 
            self.util.mkdir(destination,True)
 
519
            self.util.mkdir(destination,True)
443
520
            self.util.mkdir(pkgdest,True)            
444
521
            
445
522
            for pkg in isoFileList[cds]:
462
539
                if not mPack.write():
463
540
                    errorMsg = msg.MESSAGE_0018
464
541
 
465
 
                result = os.system('dpkg-deb -b ' + metapackageDir.replace(' ','\ ') + ' ' + pkgdest.replace(' ','\ ')  + mPack.get_mtFileName() + ' > /dev/null 2> /dev/null')
 
542
                result = os.system('dpkg-deb -b ' + tmpmetapackageDir.replace(' ','\ ') + ' ' + pkgdest.replace(' ','\ ')  + mPack.get_mtFileName() + ' > /dev/null 2> /dev/null')
466
543
                self.util.delFile(controlFile)
467
544
                
468
545
            # --- Scan the packages ---
471
548
                break
472
549
            
473
550
            self.wProgress.Task(msg.MESSAGE_0019)
474
 
            while gtk.events_pending():    gtk.main_iteration()
475
 
            
476
 
            curdir = os.getcwd()
477
 
            os.chdir(destination)
 
551
            while gtk.events_pending():    gtk.main_iteration()
 
552
            
 
553
            curdir = os.getcwd()
 
554
            os.chdir(destination)
478
555
            PackagesFile = destination.replace(' ','\ ') + 'Packages'      
479
 
            os.system('apt-ftparchive packages packages/ > ' + PackagesFile)
480
 
 
481
 
            utils.compress(PackagesFile, PackagesFile)
482
 
            
 
556
            os.system('apt-ftparchive packages packages/ > ' + PackagesFile)
 
557
 
 
558
            utils.compress(PackagesFile, PackagesFile)
 
559
            
483
560
            fileObj = gzip.GzipFile(os.path.join(destination +'Packages.gz' ), 'wb');
484
561
            fileObj.write(file(os.path.join(destination +'Packages' ), 'rb').read())
485
 
            fileObj.close()
486
 
            
487
 
            os.system('apt-ftparchive release  ./ > ./Release')
488
 
                       
489
 
            os.chdir(curdir)
490
 
            
491
 
            #Write aptoncd.info
492
 
            from mediaInfo import mediaInfo
493
 
            infoFile = destination + 'aptoncd.info'
494
 
            info = mediaInfo(infoFile)
495
 
            info.write()
496
 
            
497
 
            #write .disk/info
498
 
            from mediaInfo import aptDiskInfo
499
 
            diskinfodir = os.path.join(destination +'.disk')
500
 
            self.util.mkdir(diskinfodir,True)
501
 
            infoDiskFile = os.path.join(diskinfodir,'info')
502
 
            infoDisk = aptDiskInfo(infoDiskFile,media + cds.__str__())
 
562
            fileObj.close()
 
563
            
 
564
            os.system('apt-ftparchive release  ./ > ./Release')
 
565
                       
 
566
            os.chdir(curdir)
 
567
            
 
568
            #Write aptoncd.inf
 
569
            infoFile = destination + 'aptoncd.info'
 
570
            info = mediaInfo.mediaInfo(infoFile)
 
571
            info.write()
 
572
            
 
573
            #write .disk/info
 
574
            diskinfodir = os.path.join(destination +'.disk')
 
575
            self.util.mkdir(diskinfodir,True)
 
576
            infoDiskFile = os.path.join(diskinfodir,'info')
 
577
            infoDisk = mediaInfo.aptDiskInfo(infoDiskFile,media + cds.__str__())
503
578
            infoDisk.write()
 
579
 
 
580
            #write README.diskdefines
 
581
            infoDiskDefinesFile = os.path.join(destination,'README.diskdefines')
 
582
            infoDiskDefines = mediaInfo.aptDiskDefines(infoDiskDefinesFile,cds.__str__(),cds.__str__())
 
583
            infoDiskDefines.write()
 
584
 
 
585
 
 
586
 
 
587
            #write README.diskdefines
 
588
#           infoDiskDefinesFile = os.path.join(destination,'README.diskdefines')
 
589
#           print infoDiskDefinesFile
 
590
#           infoDiskDefines = aptDiskDefines(infoDiskFile,cds.__str__(),cds.__str__())
 
591
#           print infoDiskDefines
 
592
#           infoDiskDefines.write()         
504
593
            
505
594
            # --- Make the .iso image ---
506
595
            if self.wProgress.cancel_status:
508
597
                break
509
598
        
510
599
        
511
 
            today = datetime.date.today().strftime('%Y%m%d')    
512
 
            folderDestiny = to
 
600
            today = datetime.date.today().strftime('%Y%m%d') 
 
601
 
 
602
#
513
603
            if self.entryIsoFilename == "":
514
 
                fileDestiny = 'aptoncd-' + today +"-" + media + cds.__str__() +'.iso'
 
604
                fileNames = [nFile for nFile in os.listdir(toMainDir) if ( 'aptoncd-' + today +"-" + media + cds.__str__() in nFile  )]
 
605
                if len(fileNames) >0:
 
606
                    fileDestiny = 'aptoncd-' + today +"-" + media + cds.__str__() +'-'+str(len(fileNames)) +'.iso'
 
607
                else:
 
608
                    fileDestiny = 'aptoncd-' + today +"-" + media + cds.__str__() +'.iso'
515
609
            else:
516
 
                fileDestiny = self.entryIsoFilename + "-" + media + cds.__str__() +'.iso'
 
610
                fileNames = [nFile for nFile in os.listdir(toMainDir) if ( self.entryIsoFilename + "-" + media + cds.__str__() in  nFile)]
 
611
                if len(fileNames) >0:
 
612
                    fileDestiny = self.entryIsoFilename + "-" + media + cds.__str__() +'-' +str( len(fileNames)) +'.iso'
 
613
                else:
 
614
                    fileDestiny = self.entryIsoFilename + "-" + media + cds.__str__() +'.iso'
517
615
                
518
 
            finalDestiny = folderDestiny + fileDestiny
 
616
            finalDestiny = os.path.join(toMainDir, fileDestiny)
519
617
            isos.append(finalDestiny)
520
618
            
521
619
            self.wProgress.Task(msg.MESSAGE_0020)
528
626
            self.wProgress.Task(msg.MESSAGE_0021)
529
627
        
530
628
        #clean folders created previously    
531
 
        self.util.removePath(packages)
532
 
        self.util.removePath(metapackageDir)
533
 
        
 
629
        self.util.removePath(tmpdir)
534
630
       
535
631
        self.wProgress.hide()
536
632
        if len(errorMsg) > 0 :
537
 
            mReturn = MessageBox().ShowInfo((msg.MESSAGE_0022  % ( finalDestiny,errorMsg)),self.frmCreateCD)
 
633
            #mReturn = MessageBox().ShowInfo((msg.MESSAGE_0022  % ( finalDestiny,errorMsg)),self.frmCreateCD)
 
634
            return False
538
635
        else :
539
636
            if MessageBox().ShowQuestion((msg.MESSAGE_0023 % finalDestiny),self.frmCreateCD):
540
637
                for finalDestiny in isos:
541
 
                    os.system('/usr/bin/nautilus-cd-burner --source-iso=' + finalDestiny.replace(' ','\ ') + ' &')        
542
 
                    
 
638
                    os.system('/usr/bin/nautilus-cd-burner --source-iso=' + finalDestiny.replace(' ','\ ') + ' &')   
 
639
        
 
640
        self.frmCreateCD.destroy()     
 
641
        return True            
543
642
                                
544
643
    def CreateIsoList(self,size,packList = []):
545
644
        
546
645
        cds = {}
 
646
        currentCD = 1
547
647
        actualSize = 0
548
 
        currentCD = 1
 
648
        
549
649
        
550
650
        for n in packList:
551
651
            pkg = n[config.C_PKG]