# (c) Copyright 2010-2013. CodeWeavers, Inc.
import os
import traceback
import getpass
import gtk
import gobject
import cxwhich
import distversion
import pyop
import bottlemanagement
import cxguitools
from cxutils import cxgettext as _
class PackageBottleController(object):
def __init__(self, bottleobj):
self.bottle = bottleobj
self.xml = gtk.Builder()
self.xml.set_translation_domain("crossover")
self.xml.add_from_file(cxguitools.get_ui_path("packagedlg"))
self.xml.connect_signals(self)
self.progbar = self.xml.get_object("progbar")
# fill in dialog defaults
self.xml.get_object("release_entry").set_text("1")
self.xml.get_object("packager_entry").set_text(_("Bottle Packager <%s>") % getpass.getuser())
self.xml.get_object("product_id_entry").set_text(distversion.BUILTIN_PRODUCT_ID)
liststore = gtk.ListStore(gobject.TYPE_STRING)
combo_widget = self.xml.get_object("package_type_combo")
combo_widget.set_model(liststore)
liststore.set_value(liststore.append(), 0, "deb")
liststore.set_value(liststore.append(), 0, "rpm")
liststore.set_value(liststore.append(), 0, "sunpkg")
# Try to select a reasonable default for the package type
dpkg = cxwhich.which(os.environ["PATH"], "dpkg")
rpm = cxwhich.which(os.environ["PATH"], "rpm")
if dpkg != "":
combo_widget.set_active(0)
elif rpm != "":
combo_widget.set_active(1)
else:
combo_widget.set_active(2)
cell = gtk.CellRendererText()
combo_widget.pack_start(cell, True)
combo_widget.add_attribute(cell, "text", 0)
self.xml.get_object("package_bottle_dialog").set_title(_("Create Package From %s") % self.bottle.name)
self.xml.get_object("package_bottle_dialog").show()
def cancel_clicked(self, caller):
self.xml.get_object("package_bottle_dialog").destroy()
self.quit_requested(caller)
def progbar_pulse(self):
self.progbar.pulse()
return True
def create_clicked(self, _widget):
self.animateEvent = gobject.timeout_add(100, self.progbar_pulse)
release = self.xml.get_object("release_entry").get_text()
packager = self.xml.get_object("packager_entry").get_text()
productID = self.xml.get_object("product_id_entry").get_text()
pkg_type = self.xml.get_object("package_type_combo").get_active_text()
outdir = self.xml.get_object("location_chooser").get_filename()
self.packageOp = PackageBottleOperation(self, pkg_type, self.bottle.name, packager, release, productID, outdir)
self.xml.get_object("package_details").set_sensitive(False)
self.xml.get_object("package_type_combo").set_sensitive(False)
self.xml.get_object("dialog-action_area").set_sensitive(False)
self.progbar.show()
pyop.sharedOperationQueue.enqueue(self.packageOp)
def quit_requested(self, _caller):
# pylint: disable=R0201
cxguitools.toplevel_quit()
def package_command_finished(self, _caller, retcode, err):
if retcode:
self.xml.get_object("package_bottle_dialog").destroy()
self.quit_requested(None)
else:
self.xml.get_object("package_details").set_sensitive(True)
self.xml.get_object("package_type_combo").set_sensitive(True)
self.xml.get_object("dialog-action_area").set_sensitive(True)
self.progbar.hide()
title = _("Packaging failed")
cxguitools.CXMessageDlg(primary=title, secondary=err, message_type=gtk.MESSAGE_ERROR, parent=self.xml.get_object("package_bottle_dialog"))
class PackageBottleOperation(pyop.PythonOperation):
def __init__(self, inPackageController, inType, inBottleName, inPackager, inRelease, inProductID, inOutDir):
pyop.PythonOperation.__init__(self)
self.bottlename = inBottleName
self.packageController = inPackageController
self.type = inType
self.packager = inPackager
self.release = inRelease
self.productID = inProductID
self.outDir = inOutDir
def __unicode__(self):
return "PackageBottleOperation for " + self.bottlename
def main(self):
try:
self.retcode, self.err = bottlemanagement.package_bottle(self.bottlename, self.type, self.release, self.productID, self.packager, self.outDir)
except:
traceback.print_exc()
def finish(self):
self.packageController.package_command_finished(self, self.retcode, self.err)
pyop.PythonOperation.finish(self)