diff options
| author | Michael Vogt <michael.vogt@ubuntu.com> | 2006-02-27 19:47:44 +0100 |
|---|---|---|
| committer | Michael Vogt <michael.vogt@ubuntu.com> | 2006-02-27 19:47:44 +0100 |
| commit | 9fab3e0069ee2f9b05084787ce114a67ae65c13f (patch) | |
| tree | a1d3680ffb37fac0550959de618d1640428eaf8c | |
| parent | eadf5eaff85bec1548298ce14874cac070f44454 (diff) | |
| parent | 67389517a2f4c58ee03b3ba6ee540df4f8f073f7 (diff) | |
| download | python-apt-9fab3e0069ee2f9b05084787ce114a67ae65c13f.tar.gz | |
* merged with main
34 files changed, 3253 insertions, 482 deletions
diff --git a/DistUpgrade/DistUpgrade.glade b/DistUpgrade/DistUpgrade.glade index c28b20ad..e50476e2 100644 --- a/DistUpgrade/DistUpgrade.glade +++ b/DistUpgrade/DistUpgrade.glade @@ -586,12 +586,13 @@ <child> <widget class="GtkLabel" id="label_summary"> <property name="visible">True</property> + <property name="can_focus">True</property> <property name="label" translatable="yes"></property> <property name="use_underline">False</property> <property name="use_markup">True</property> <property name="justify">GTK_JUSTIFY_LEFT</property> <property name="wrap">True</property> - <property name="selectable">False</property> + <property name="selectable">True</property> <property name="xalign">0</property> <property name="yalign">0.5</property> <property name="xpad">0</property> diff --git a/DistUpgrade/DistUpgradeView.py b/DistUpgrade/DistUpgradeView.py index 4c9103ba..8e9a3d3f 100644 --- a/DistUpgrade/DistUpgradeView.py +++ b/DistUpgrade/DistUpgradeView.py @@ -65,9 +65,9 @@ class DistUpgradeView(object): def confirmRestart(self): " generic ask about the restart, can be overriden " summary = _("Reboot required") - msg = _("The upgrade is finished now. " - "A reboot is required to " - "now, do you want to do this " + msg = _("The upgrade is finished and " + "a reboot is required. " + "Do you want to do this " "now?") return self.askYesNoQuestion(summary, msg) def error(self, summary, msg, extended_msg=None): diff --git a/DistUpgrade/DistUpgradeViewGtk.py b/DistUpgrade/DistUpgradeViewGtk.py index 3697a49e..2f7e3fed 100644 --- a/DistUpgrade/DistUpgradeViewGtk.py +++ b/DistUpgrade/DistUpgradeViewGtk.py @@ -126,6 +126,7 @@ class GtkInstallProgressAdapter(InstallProgress): reaper.connect("child-exited", self.child_exited) # some options for dpkg to make it die less easily apt_pkg.Config.Set("DPkg::Options::","--force-overwrite") + def startUpdate(self): self.finished = False # FIXME: add support for the timeout @@ -161,15 +162,19 @@ class GtkInstallProgressAdapter(InstallProgress): def fork(self): pid = self.term.forkpty(envv=self.env) return pid + def child_exited(self, term, pid, status): self.apt_status = os.WEXITSTATUS(status) self.finished = True + def waitChild(self): while not self.finished: self.updateInterface() return self.apt_status + def finishUpdate(self): self.label_status.set_text("") + def updateInterface(self): InstallProgress.updateInterface(self) self.progress.set_fraction(self.percent/100.0) @@ -181,9 +186,6 @@ class GtkInstallProgressAdapter(InstallProgress): class DistUpgradeViewGtk(DistUpgradeView,SimpleGladeApp): " gtk frontend of the distUpgrade tool " - - - def __init__(self): # FIXME: i18n must be somewhere relative do this dir bindtextdomain("update-manager",os.path.join(os.getcwd(),"mo")) @@ -228,6 +230,7 @@ class DistUpgradeViewGtk(DistUpgradeView,SimpleGladeApp): "files ~/dist-upgrade.log and ~/dist-upgrade-apt.log " "in your report. The upgrade aborts now. "), "\n".join(lines)) + sys.exit(1) def create_terminal(self, arg1,arg2,arg3,arg4): " helper to create a vte terminal " @@ -237,6 +240,7 @@ class DistUpgradeViewGtk(DistUpgradeView,SimpleGladeApp): self._terminal_lines = [] self._terminal_log = open("/var/log/dist-upgrade-term.log","w") return self._term + def _term_content_changed(self, term): " called when the *visible* part of the terminal changes " @@ -277,7 +281,6 @@ class DistUpgradeViewGtk(DistUpgradeView,SimpleGladeApp): attrlist.insert(attr) label.set_property("attributes",attrlist) - def error(self, summary, msg, extended_msg=None): self.dialog_error.set_transient_for(self.window_main) #self.expander_terminal.set_expanded(True) @@ -309,30 +312,41 @@ class DistUpgradeViewGtk(DistUpgradeView,SimpleGladeApp): pkgs_remove, "%s packages are going to be removed." %\ pkgs_remove, pkgs_remove) - msg +=" " + msg += " " if pkgs_inst > 0: msg += gettext.ngettext("%s new package is going to be "\ "installed." % pkgs_inst, "%s new packages are going to be "\ "installed." % pkgs_inst, pkgs_inst) - msg +=" " + msg += " " if pkgs_upgrade > 0: msg += gettext.ngettext("%s package is going to be upgraded." %\ pkgs_upgrade, "%s packages are going to be upgraded." %\ pkgs_upgrade, pkgs_upgrade) msg +=" " - if msg == "": + + if downloadSize > 0: + msg += _("You have to download a total of %s." %\ + apt_pkg.SizeToStr(downloadSize)) + + if (pkgs_upgrade + pkgs_inst + pkgs_remove) > 100: + msg += "\n\n%s" % _("The upgrade can take several hours and "\ + "cannot be canceled at any time later.") + + msg += "\n\n<b>%s</b>" % _("To prevent data loss close all open "\ + "applications and documents.") + + # Show an error if no actions are planned + if (pkgs_upgrade + pkgs_inst + pkgs_remove) < 1: # FIXME: this should go into DistUpgradeController summary = _("Could not find any upgrades") msg = _("Your system has already been upgraded.") self.error(summary, msg) return False - else: - msg += _("You have to download a total of %s." %\ - apt_pkg.SizeToStr(downloadSize)) + self.label_summary.set_markup("<big><b>%s</b></big>" % summary) - self.label_changes.set_text(msg) + self.label_changes.set_markup(msg) # fill in the details self.details_list.clear() for rm in self.toRemove: diff --git a/DistUpgrade/TODO b/DistUpgrade/TODO index df64b54b..fb6895f9 100644 --- a/DistUpgrade/TODO +++ b/DistUpgrade/TODO @@ -1,3 +1,17 @@ +MUSTFIX: +-------- +* debconf gnome dosn't work (can't connect to the session) +* display a message that all applications should be closed for the + dist-upgrade (and that strange things like a crashing panel can + happen) + + + +breezy->dapper +-------------- +- gnome-icon-theme changes a lot, icons move from hicolor to gnome. + this might have caused a specatular crash during a upgrade + hoary->breezy ------------- @@ -13,12 +27,8 @@ breezy->dapper general ------- - CDROM upgrades !!! -- display a message that all applications should be closed for the - dist-upgrade (and that strange things like a crashing panel can - happen) - whitelist removal (pattern? e.g. c102 -> c2a etc)? -- logging for the dpkg install run - check authentication and don't upgrade anything that is not authenticated (maybe just comment unauthenticated stuff out?) diff --git a/SoftwareProperties/SoftwareProperties.py b/SoftwareProperties/SoftwareProperties.py index 690b30dd..d3fef36a 100644 --- a/SoftwareProperties/SoftwareProperties.py +++ b/SoftwareProperties/SoftwareProperties.py @@ -37,6 +37,7 @@ from UpdateManager.Common.SimpleGladeApp import SimpleGladeApp import aptsources import dialog_add import dialog_edit +import dialog_sources_list from dialog_apt_key import apt_key from utils import * @@ -50,11 +51,22 @@ CONF_MAP = { "max_size" : "APT::Archives::MaxSize", "max_age" : "APT::Archives::MaxAge" } - +( + COLUMN_ACTIVE, + COLUMN_DESC +) = range(2) class SoftwareProperties(SimpleGladeApp): - def __init__(self, datadir=None, options=None, parent=None): + def __init__(self, datadir=None, options=None, file=None, parent=None): + + # set a default window icon + icons = gtk.icon_theme_get_default() + try: + logo=icons.load_icon("update-manager", 48, 0) + gtk.window_set_default_icon_list(logo) + except: + pass # FIXME: some saner way is needed here if datadir == None: @@ -64,6 +76,8 @@ class SoftwareProperties(SimpleGladeApp): None, domain="update-manager") self.modified = False + self.file = file + #self.gnome_program = gnome.init("Software Properties", "0.41") #self.gconfclient = gconf.client_get_default() @@ -74,7 +88,8 @@ class SoftwareProperties(SimpleGladeApp): if options and options.toplevel != None: toplevel = gtk.gdk.window_foreign_new(int(options.toplevel)) self.window_main.window.set_transient_for(toplevel) - + + self.button_revert.set_sensitive(False) self.init_sourceslist() self.reload_sourceslist() @@ -165,30 +180,97 @@ class SoftwareProperties(SimpleGladeApp): else: self.checkbutton_unattended.set_active(False) + # Backup the source list + self.sourceslist.clearBackup(".save") + self.sourceslist.backup(".save") + # apt-key stuff self.apt_key = apt_key() self.init_keyslist() self.reload_keyslist() + # drag and drop support for sources.list + self.treeview_sources.drag_dest_set(gtk.DEST_DEFAULT_ALL, \ + [('text/uri-list',0, 0)], \ + gtk.gdk.ACTION_COPY) + self.treeview_sources.connect("drag_data_received",\ + self.on_sources_drag_data_received) + + + # call the add sources.list dialog if we got a file from the cli + if self.file != None: + self.open_file(file) + + def open_file(self, file): + """Show an confirmation for adding the channels of the specified file""" + dialog = dialog_sources_list.AddSourcesList(self.window_main, + self.sourceslist, + self.render_source, + self.datadir, + file) + res = dialog.run() + if res == gtk.RESPONSE_OK: + self.modified_sourceslist() + + def on_sources_drag_data_received(self, widget, context, x, y, + selection, target_type, timestamp): + """Extract the dropped file pathes and open the first file, only""" + uri = selection.data.strip() + uri_splitted = uri.split() + if len(uri_splitted)>0: + self.open_file(uri_splitted[0]) + def hide(self): self.window_main.hide() def init_sourceslist(self): - self.source_store = gtk.ListStore(str, bool, gobject.TYPE_PYOBJECT) + self.source_store = gtk.ListStore(gobject.TYPE_BOOLEAN, + gobject.TYPE_STRING, + gobject.TYPE_PYOBJECT) self.treeview_sources.set_model(self.source_store) - tr = gtk.CellRendererText() - tr.set_property("xpad", 10) - tr.set_property("ypad", 10) - - source_col = gtk.TreeViewColumn("Description", tr, markup=LIST_MARKUP) - source_col.set_max_width(500) - - self.treeview_sources.append_column(source_col) + cell_desc = gtk.CellRendererText() + cell_desc.set_property("xpad", 2) + cell_desc.set_property("ypad", 2) + col_desc = gtk.TreeViewColumn(_("Software Channel"), cell_desc, + markup=COLUMN_DESC) + col_desc.set_max_width(1000) + + cell_toggle = gtk.CellRendererToggle() + cell_toggle.set_property("xpad", 2) + cell_toggle.set_property("ypad", 2) + cell_toggle.connect('toggled', self.on_channel_toggled) + col_active = gtk.TreeViewColumn(_("Active"), cell_toggle, + active=COLUMN_ACTIVE) + + self.treeview_sources.append_column(col_active) + self.treeview_sources.append_column(col_desc) self.sourceslist = aptsources.SourcesList() self.matcher = aptsources.SourceEntryMatcher() + def on_channel_activate(self, treeview, path, column): + """Open the edit dialog if a channel was double clicked""" + self.on_edit_clicked(treeview) + + def on_treeview_sources_cursor_changed(self, treeview): + """Enable the buttons remove and edit if a channel is selected""" + sel = self.treeview_sources.get_selection() + (model, iter) = sel.get_selected() + if iter: + self.button_edit.set_sensitive(True) + self.button_remove.set_sensitive(True) + else: + self.button_edit.set_sensitive(False) + self.button_remove.set_sensitive(False) + + def on_channel_toggled(self, cell_toggle, path): + """Enable or disable the selected channel""" + iter = self.source_store.get_iter((int(path),)) + source_entry = self.source_store.get_value(iter, LIST_ENTRY_OBJ) + source_entry.disabled = not source_entry.disabled + self.modified_sourceslist() + def init_keyslist(self): self.keys_store = gtk.ListStore(str) self.treeview2.set_model(self.keys_store) @@ -198,20 +280,62 @@ class SoftwareProperties(SimpleGladeApp): keys_col = gtk.TreeViewColumn("Key", tr, text=0) self.treeview2.append_column(keys_col) + def on_button_revert_clicked(self, button): + """Restore the source list from the startup of the dialog""" + self.sourceslist.restoreBackup(".save") + self.sourceslist.clearBackup(".save") + self.sourceslist.backup(".save") + self.sourceslist.refresh() + self.reload_sourceslist() + self.button_revert.set_sensitive(False) + self.modified = False + + def modified_sourceslist(self): + """The sources list was changed and now needs to be saved and reloaded""" + self.button_revert.set_sensitive(True) + self.save_sourceslist() + self.reload_sourceslist() + self.modified = True + + def render_source(self, source): + """Render a nice output to show the source in a treeview""" + (nice_type, nice_dist, nice_comps, special) = self.matcher.match(source) + + # FIXME: add this back when it's more consistent + #if special in (aptsources.SOURCE_UPDATES, + # aptsources.SOURCE_BACKPORTS, + # aptsources.SOURCE_SECURITY): + # contents = "<b>%s</b>" % nice_dist + #elif special == aptsources.SOURCE_SYSTEM: + if special in (aptsources.SOURCE_UPDATES, + aptsources.SOURCE_BACKPORTS, + aptsources.SOURCE_SECURITY, + aptsources.SOURCE_SYSTEM): + contents = "<b>%s</b>" % nice_dist + if source.type in ("deb-src", "rpm-src"): + contents += " (%s)" % nice_type + for comp in nice_comps: + contents += "\n%s" % comp + else: + contents = "<b>%s</b>" % nice_dist + if source.type in ("deb-src", "rpm-src"): + contents += " (%s)" % nice_type + for comp in nice_comps: + contents += "%s" % comp + return contents + def reload_sourceslist(self): self.source_store.clear() + # FIXME: this happens with way too much magic, we need to either + # ask the user or provide a different way to present this + # )maybe some sort of configuration is enough?) + self.sourceslist.check_for_endangered_dists() for source in self.sourceslist.list: - if source.invalid or source.disabled: + if source.invalid: continue - (a_type, dist, comps) = self.matcher.match(source) - - contents = "" - if source.comment != "": - contents += "<i>%s</i>\n\n" % (source.comment) - contents +="<big><b>%s </b></big> (%s) <small>\n%s</small>" % (dist,a_type, comps) - - self.source_store.append([contents, not source.disabled, source]) - + contents = self.render_source(source) + self.source_store.append([not source.disabled, contents, source]) + def reload_keyslist(self): self.keys_store.clear() for key in self.apt_key.list(): @@ -220,11 +344,11 @@ class SoftwareProperties(SimpleGladeApp): def on_combobox_update_interval_changed(self, widget): i = self.combobox_update_interval.get_active() if i != -1: - value = self.combobox_interval_mapping[i] - # Only write the key if it has changed - if not value == apt_pkg.Config.FindI(CONF_MAP["autoupdate"]): - apt_pkg.Config.Set(CONF_MAP["autoupdate"], str(value)) - self.write_config() + value = self.combobox_interval_mapping[i] + # Only write the key if it has changed + if not value == apt_pkg.Config.FindI(CONF_MAP["autoupdate"]): + apt_pkg.Config.Set(CONF_MAP["autoupdate"], str(value)) + self.write_config() def on_opt_autoupdate_toggled(self, widget): if self.checkbutton_auto_update.get_active(): @@ -319,17 +443,17 @@ class SoftwareProperties(SimpleGladeApp): def save_sourceslist(self): #location = "/etc/apt/sources.list" #shutil.copy(location, location + ".save") - self.sourceslist.backup(".save") self.sourceslist.save() - + def on_add_clicked(self, widget): + """Open a dialog to add new channels""" dialog = dialog_add.dialog_add(self.window_main, self.sourceslist, self.datadir) if dialog.run() == gtk.RESPONSE_OK: - self.reload_sourceslist() - self.modified = True - + self.modified_sourceslist() + def on_edit_clicked(self, widget): + """Open a dialog to edit the currently selected dialog""" sel = self.treeview_sources.get_selection() (model, iter) = sel.get_selected() if not iter: @@ -338,17 +462,17 @@ class SoftwareProperties(SimpleGladeApp): dialog = dialog_edit.dialog_edit(self.window_main, self.sourceslist, source_entry, self.datadir) if dialog.run() == gtk.RESPONSE_OK: - self.reload_sourceslist() - self.modified = True - + self.modified_sourceslist() + def on_remove_clicked(self, widget): sel = self.treeview_sources.get_selection() (model, iter) = sel.get_selected() if iter: source = model.get_value(iter, LIST_ENTRY_OBJ) self.sourceslist.remove(source) - self.reload_sourceslist() - self.modified = True + self.modified_sourceslist() + self.button_edit.set_sensitive(False) + self.button_remove.set_sensitive(False) def add_key_clicked(self, widget): chooser = gtk.FileChooserDialog(title=_("Import key"), @@ -364,7 +488,7 @@ class SoftwareProperties(SimpleGladeApp): _("Error importing selected file"), _("The selected file may not be a GPG key file " \ "or it might be corrupt.")) - self.reload_keyslist() + self.reload_keyslist() def remove_key_clicked(self, widget): selection = self.treeview2.get_selection() @@ -418,7 +542,7 @@ class SoftwareProperties(SimpleGladeApp): type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_OK, message_format=None) - dialog.set_markup(_("<big><b>Error scaning the CD</b></big>\n\n%s"%msg)) + dialog.set_markup(_("<big><b>Error scanning the CD</b></big>\n\n%s"%msg)) res = dialog.run() dialog.destroy() return @@ -433,8 +557,7 @@ class SoftwareProperties(SimpleGladeApp): if line != "": full_path = "%s%s" % (apt_pkg.Config.FindDir("Dir::Etc"),saved_entry) self.sourceslist.list.append(aptsources.SourceEntry(line,full_path)) - self.reload_sourceslist() - self.modified = True + self.modified_sourceslist() # FIXME: move this into a different file diff --git a/SoftwareProperties/aptsources.py b/SoftwareProperties/aptsources.py index 03459adf..820e6e77 100644 --- a/SoftwareProperties/aptsources.py +++ b/SoftwareProperties/aptsources.py @@ -32,6 +32,8 @@ import os.path from UpdateManager.Common.DistInfo import DistInfo +(SOURCE_SECURITY, SOURCE_UPDATES, SOURCE_SYSTEM, SOURCE_BACKPORTS) = range(4) + # actual source.list entries class SourceEntry: @@ -102,8 +104,16 @@ class SourceEntry: line = line[:i] # source is ok, split it and see what we have pieces = self.mysplit(line) + # Sanity check + if len(pieces) < 3: + self.invalid = True + return # Type, deb or deb-src self.type = string.strip(pieces[0]) + # Sanity check + if self.type not in ("deb", "deb-src"): + self.invalid = True + return # URI self.uri = string.strip(pieces[1]) # distro and components (optional) @@ -226,9 +236,76 @@ class SourcesList: line = line + "\n" self.list.insert(pos, SourceEntry(line)) + def disable_components(self, comps, source_entry): + """Disable components of a source""" + comps_remove = set(comps) & set(source_entry.comps) + if len(comps_remove) >= len(source_entry.comps): + # disable the whole source + source_entry.disabled = True + elif len(comps_remove) > 0: + # Remove the sections from the original source + comps_new = set(source_entry.comps) - comps_remove + comps_write="" + for comp in comps_new: + comps_write += " %s" % comp + line = "%s %s %s %s" % (source.type, source.uri, source.dist, + comps_write) + if source.comment: + line += "# %s" % source.comment + line += "\n" + index = self.list.index(source_entry) + file = self.list[index].file + self.list[index] = SourceEntry(line, file) + + # Add a disabled line with the disabled comps after the + # original line + comps_write="" + for comp in comps_remove: + comps_write = " %s" % comp + line_disabled = "#%s %s %s %s" % (source.type, source.uri, source.dist, + comps_remove) + if source.comment: + line_disabled += "# %s" % source.comment + line_disabled += "\n" + self.list.insert[index+1](SourceEntry(line_disabled, file)) + + def remove_components(self, comps, source_entry): + """ Remove components of a source""" + # The components that need to be removed from the source + comps_remove = set(comps) & set(source_entry.comps) + if len(comps_remove) >= len(source_entry.comps): + # Delete the whole source if there are no comps left + self.list.remove(source_entry) + elif len(comps_remove) > 0: + # Remove the sections from the original source + comps_new = set(source_entry.comps) - comps_remove + comps_write = "" + for comp in comps_new: + comps_write += " %s" % comp + line = "%s %s %s %s" % (source.type, source.uri, source.dist, + comps_write) + if source.comment: + line += "# %s" % source.comment + line += "\n" + index = self.list.index(source_entry) + file = self.list[index].file + self.list[index] = SourceEntry(line, file) + def remove(self, source_entry): self.list.remove(source_entry) + def clearBackup(self, backup_ext): + " remove backuped sources.list files based on the backup extension " + dir = apt_pkg.Config.FindDir("Dir::Etc") + file = apt_pkg.Config.Find("Dir::Etc::sourcelist") + if os.path.exists(dir+file+backup_ext): + os.remove(dir+file+backup_ext) + # now sources.list.d + partsdir = apt_pkg.Config.FindDir("Dir::Etc::sourceparts") + for file in glob.glob("%s/*.list" % partsdir): + if os.path.exists(file+backup_ext): + os.remove(file+backup_ext) + def restoreBackup(self, backup_ext): " restore sources.list files based on the backup extension " dir = apt_pkg.Config.FindDir("Dir::Etc") @@ -270,10 +347,92 @@ class SourcesList: files[source.file].write(source.str()) for f in files: files[f].close() + + def check_for_endangered_dists(self): + # To store the sources that provide updates + self.sources_updates = [] + # To store the sources that provide backports + self.sources_backports = [] + # To store the sources that provide securtiy fixes + self.sources_security = [] + # To store the activated components of each dist + self.system_comps = {} + + # The matcher searches sets the required special tags + self.matcher = SourceEntryMatcher() + + for source in self.list: + if source.invalid or source.type != "deb": + continue + (nice_type, nice_dist, nice_comps, special) = self.matcher.match(source) + #print "match: %s %s" % (source.dist, special) + + # Collect the components of an activated system dist + if special == SOURCE_SYSTEM and source.disabled != True: + if self.system_comps.has_key(source.dist): + current = self.system_comps[source.dist] + self.system_comps[source.dist] = (current | set(source.comps)) + else: + self.system_comps[source.dist] = set(source.comps) + + # Collect sources that provide updates + elif special == SOURCE_UPDATES: + self.sources_updates.append(source) + elif special == SOURCE_SECURITY: + self.sources_security.append(source) + elif special == SOURCE_BACKPORTS: + self.sources_backports.append(source) + + #print "\nSystem Compos: %s " % self.system_comps + + # Check if each security source contains all components of + # the same dist + res = False + res |= self.check_updates(self.sources_security) + res |= self.check_updates(self.sources_updates) + res |= self.check_updates(self.sources_backports) + return res + + def check_updates(self, updates): + modified = False + for source in updates: + #print "SecSource: %s" % source.dist + # Skip the "-security" and "-updates" from the dist + i = source.dist.find("-") + dist = source.dist[:i] + # Are there any active components for the dist? + if self.system_comps.has_key(dist): + comps_sys = self.system_comps[dist] + comps_sec = set(source.comps) + # Are there components without updates? + comps_endangered = comps_sys - comps_sec + #print "In Danger: %s - %s = %s " % (comps_sys, comps_sec, comps_endangered) + if len(comps_endangered) > 0: + # convert the set into a list + comps_write="" + for comp in comps_sys: + comps_write += " %s" % comp + # add all system components to the securtiy line + line = "%s %s %s %s" % (source.type, source.uri, source.dist, + comps_write) + if source.comment: + line += "# %s" % source.comment + line += "\n" + index = self.list.index(source) + file = self.list[index].file + self.list[index] = SourceEntry(line, file) + modified = True + else: + # FIXME: What to do if there are no system sources? + # To disable the security updates would be the best + # option, but what about people with a local mirror + # that fetch sec updates from the ubuntu servers + pass + return modified # templates for the add dialog class SourceEntryTemplate(SourceEntry): - def __init__(self,a_type,uri,dist,description,comps): + def __init__(self, a_type, uri, dist, description, comps): self.comps = [] self.comps_descriptions = [] self.type = a_type @@ -289,12 +448,14 @@ class SourceCompTemplate: self.on_by_default = on_by_default class SourceEntryTemplates: - def __init__(self,datadir): + def __init__(self, datadir): _ = gettext.gettext self.templates = [] dinfo = DistInfo (base_dir=datadir+"channels/") + self.dist = dinfo.dist + for suite in dinfo.suites: comps = [] for comp in suite.components: @@ -315,108 +476,159 @@ class SourceEntryMatcher: self.description = a_descr class MatchDist: - def __init__(self,a_uri,a_dist, a_descr,l_comps, l_comps_descr): + def __init__(self, a_uri, a_dist, a_descr, l_comps, + l_comps_descr, special=None): self.uri = a_uri self.dist = a_dist self.description = a_descr self.comps = l_comps self.comps_descriptions = l_comps_descr + self.special = special def __init__(self): _ = gettext.gettext self.type_list = [] self.type_list.append(self.MatchType("^deb$",_("Binary"))) - self.type_list.append(self.MatchType("^deb-src$",_("Source"))) + self.type_list.append(self.MatchType("^deb-src$",_("Source Code"))) self.dist_list = [] + #UBUNTU ubuntu_comps = ["^main$","^restricted$","^universe$","^multiverse$"] ubuntu_comps_descr = [_("Officially supported"), _("Restricted copyright"), _("Community maintained (Universe)"), _("Non-free (Multiverse)")] # CDs + self.dist_list.append(self.MatchDist("cdrom:\[Ubuntu.*6.04", + ".*", + _("Cdrom with Ubuntu 6.04 'Dapper "\ + "Drake'"), + ubuntu_comps, ubuntu_comps_descr, + SOURCE_SYSTEM)) self.dist_list.append(self.MatchDist("cdrom:\[Ubuntu.*5.10", ".*", - _("CD disk with Ubuntu 5.10 \"Breezy Badger\""), - ubuntu_comps, ubuntu_comps_descr)) + _("Cdrom with Ubuntu 5.10 'Breezy "\ + "Badger'"), + ubuntu_comps, ubuntu_comps_descr, + SOURCE_SYSTEM)) self.dist_list.append(self.MatchDist("cdrom:\[Ubuntu.*5.04", ".*", - _("CD disk with Ubuntu 5.04 \"Hoary Hedgehog\""), - ubuntu_comps, ubuntu_comps_descr)) + _("Cdrom with Ubuntu 5.04 'Hoary "\ + "Hedgehog'"), + ubuntu_comps, ubuntu_comps_descr, + SOURCE_SYSTEM)) self.dist_list.append(self.MatchDist("cdrom:\[Ubuntu.*4.10", ".*", - _("CD disk with Ubuntu 4.10 \"Warty Warthog\""), - ubuntu_comps, ubuntu_comps_descr)) + _("Cdrom with Ubuntu 4.10 'Warty "\ + "Warthog'"), + ubuntu_comps, ubuntu_comps_descr, + SOURCE_SYSTEM)) # URIs # Warty self.dist_list.append(self.MatchDist(".*archive.ubuntu.com/ubuntu", "^warty$", - "Ubuntu 4.10 \"Warty Warthog\"", - ubuntu_comps, ubuntu_comps_descr)) + "Ubuntu 4.10 'Warty Warthog'", + ubuntu_comps, ubuntu_comps_descr, + SOURCE_SYSTEM)) self.dist_list.append(self.MatchDist(".*security.ubuntu.com/ubuntu", "^warty-security$", _("Ubuntu 4.10 Security Updates"), - ubuntu_comps, ubuntu_comps_descr)) + ubuntu_comps, ubuntu_comps_descr, + SOURCE_SECURITY)) self.dist_list.append(self.MatchDist(".*archive.ubuntu.com/ubuntu", "^warty-security$", _("Ubuntu 4.10 Security Updates"), - ubuntu_comps, ubuntu_comps_descr)) + ubuntu_comps, ubuntu_comps_descr, + SOURCE_SECURITY)) + self.dist_list.append(self.MatchDist(".*archive.ubuntu.com/ubuntu", + "^warty-backports$", + _("Ubuntu 4.10 Backports"), + ubuntu_comps, ubuntu_comps_descr, + SOURCE_BACKPORTS)) self.dist_list.append(self.MatchDist(".*archive.ubuntu.com/ubuntu", "^warty-updates$", _("Ubuntu 4.10 Updates"), - ubuntu_comps, ubuntu_comps_descr)) + ubuntu_comps, ubuntu_comps_descr, + SOURCE_UPDATES)) # Hoary self.dist_list.append(self.MatchDist(".*archive.ubuntu.com/ubuntu", "^hoary-security$", _("Ubuntu 5.04 Security Updates"), - ubuntu_comps, ubuntu_comps_descr)) + ubuntu_comps, ubuntu_comps_descr, + SOURCE_SECURITY)) self.dist_list.append(self.MatchDist(".*security.ubuntu.com/ubuntu", "^hoary-security$", _("Ubuntu 5.04 Security Updates"), - ubuntu_comps, ubuntu_comps_descr)) + ubuntu_comps, ubuntu_comps_descr, + SOURCE_SECURITY)) self.dist_list.append(self.MatchDist(".*archive.ubuntu.com/ubuntu", "^hoary$", - "Ubuntu 5.04 \"Hoary Hedgehog\"", - ubuntu_comps, ubuntu_comps_descr)) + "Ubuntu 5.04 'Hoary Hedgehog'", + ubuntu_comps, ubuntu_comps_descr, + SOURCE_SYSTEM)) + self.dist_list.append(self.MatchDist(".*archive.ubuntu.com/ubuntu", + "^hoary-backports$", + _("Ubuntu 5.04 Backports"), + ubuntu_comps, ubuntu_comps_descr, + SOURCE_BACKPORTS)) self.dist_list.append(self.MatchDist(".*archive.ubuntu.com/ubuntu", "^hoary-updates$", _("Ubuntu 5.04 Updates"), - ubuntu_comps, ubuntu_comps_descr)) + ubuntu_comps, ubuntu_comps_descr, + SOURCE_UPDATES)) # Breezy self.dist_list.append(self.MatchDist(".*archive.ubuntu.com/ubuntu", "^breezy-security$", _("Ubuntu 5.10 Security Updates"), - ubuntu_comps, ubuntu_comps_descr)) + ubuntu_comps, ubuntu_comps_descr, + SOURCE_SECURITY)) self.dist_list.append(self.MatchDist(".*security.ubuntu.com/ubuntu", "^breezy-security$", _("Ubuntu 5.10 Security Updates"), - ubuntu_comps, ubuntu_comps_descr)) + ubuntu_comps, ubuntu_comps_descr, + SOURCE_SECURITY)) self.dist_list.append(self.MatchDist(".*archive.ubuntu.com/ubuntu", "^breezy$", - "Ubuntu 5.10 \"Breezy Badger\"", - ubuntu_comps, ubuntu_comps_descr)) + "Ubuntu 5.10 'Breezy Badger'", + ubuntu_comps, ubuntu_comps_descr, + SOURCE_SYSTEM)) + self.dist_list.append(self.MatchDist(".*archive.ubuntu.com/ubuntu", + "^breezy-backports$", + _("Ubuntu 5.10 Backports"), + ubuntu_comps, ubuntu_comps_descr, + SOURCE_BACKPORTS)) self.dist_list.append(self.MatchDist(".*archive.ubuntu.com/ubuntu", "^breezy-updates$", _("Ubuntu 5.10 Updates"), - ubuntu_comps, ubuntu_comps_descr)) + ubuntu_comps, ubuntu_comps_descr, + SOURCE_UPDATES)) # dapper self.dist_list.append(self.MatchDist(".*archive.ubuntu.com/ubuntu", "^dapper-security$", _("Ubuntu 6.04 Security Updates"), - ubuntu_comps, ubuntu_comps_descr)) + ubuntu_comps, ubuntu_comps_descr, + SOURCE_SECURITY)) self.dist_list.append(self.MatchDist(".*security.ubuntu.com/ubuntu", "^dapper-security$", _("Ubuntu 6.04 Security Updates"), - ubuntu_comps, ubuntu_comps_descr)) + ubuntu_comps, ubuntu_comps_descr, + SOURCE_SECURITY)) self.dist_list.append(self.MatchDist(".*archive.ubuntu.com/ubuntu", "^dapper$", - "Ubuntu 6.04 \"Dapper Drake\"", - ubuntu_comps, ubuntu_comps_descr)) + "Ubuntu 6.04 'Dapper Drake'", + ubuntu_comps, ubuntu_comps_descr, + SOURCE_SYSTEM)) + self.dist_list.append(self.MatchDist(".*archive.ubuntu.com/ubuntu", + "^dapper-backports$", + _("Ubuntu 6.04 Backports"), + ubuntu_comps, ubuntu_comps_descr, + SOURCE_BACKPORTS)) self.dist_list.append(self.MatchDist(".*archive.ubuntu.com/ubuntu", "^dapper-updates$", _("Ubuntu 6.04 Updates"), - ubuntu_comps, ubuntu_comps_descr)) + ubuntu_comps, ubuntu_comps_descr, + SOURCE_UPDATES)) # DEBIAN @@ -430,53 +642,64 @@ class SourceEntryMatcher: # dists by name self.dist_list.append(self.MatchDist(".*debian.org/debian", "^sarge$", - _("Debian 3.1 \"Sarge\""), - debian_comps, debian_comps_descr)) + _("Debian 3.1 'Sarge'"), + debian_comps, debian_comps_descr, + SOURCE_SYSTEM)) self.dist_list.append(self.MatchDist(".*debian.org/debian", "^woody$", - _("Debian 3.0 \"Woody\""), - debian_comps, debian_comps_descr)) + _("Debian 3.0 'Woody'"), + debian_comps, debian_comps_descr, + SOURCE_SYSTEM)) # securtiy self.dist_list.append(self.MatchDist(".*security.debian.org", "^stable.*$", _("Debian Stable Security Updates"), - debian_comps, debian_comps_descr)) + debian_comps, debian_comps_descr, + SOURCE_SECURITY)) # dists by status self.dist_list.append(self.MatchDist(".*debian.org/debian", "^stable$", _("Debian Stable"), - debian_comps, debian_comps_descr)) + debian_comps, debian_comps_descr, + SOURCE_SYSTEM)) self.dist_list.append(self.MatchDist(".*debian.org/debian", "^testing$", _("Debian Testing"), - debian_comps, debian_comps_descr)) + debian_comps, debian_comps_descr, + SOURCE_SYSTEM)) self.dist_list.append(self.MatchDist(".*debian.org/debian", "^unstable$", - _("Debian Unstable \"Sid\""), - debian_comps, debian_comps_descr)) + _("Debian Unstable 'Sid'"), + debian_comps, debian_comps_descr, + SOURCE_SYSTEM)) # non-us self.dist_list.append(self.MatchDist(".*debian.org/debian-non-US", "^stable.*$", _("Debian Non-US (Stable)"), - debian_comps, debian_comps_descr)) + debian_comps, debian_comps_descr, + SOURCE_SYSTEM)) self.dist_list.append(self.MatchDist(".*debian.org/debian-non-US", "^testing.*$", _("Debian Non-US (Testing)"), - debian_comps, debian_comps_descr)) + debian_comps, debian_comps_descr, + SOURCE_SYSTEM)) self.dist_list.append(self.MatchDist(".*debian.org/debian-non-US", "^unstable.*$", _("Debian Non-US (Unstable)"), - debian_comps, debian_comps_descr)) - + debian_comps, debian_comps_descr, + SOURCE_SYSTEM)) - - def match(self,source): _ = gettext.gettext # some sane defaults first + special = None type_description = source.type dist_description = source.uri + " " + source.dist + # if there is a comment use it instead of the url + if source.comment: + dist_description = source.comment + comp_description = "" for c in source.comps: comp_description = comp_description + " " + c @@ -486,23 +709,24 @@ class SourceEntryMatcher: type_description = _(t.description) break + comp_descriptions = [] for d in self.dist_list: #print "'%s'" %source.uri - if re.match(d.uri, source.uri) and re.match(d.dist,source.dist): + if re.match(d.uri, source.uri) and re.match(d.dist, source.dist): dist_description = d.description - comp_description = "" + comp_descriptions = [] + special = d.special for c in source.comps: found = False for i in range(len(d.comps)): if re.match(d.comps[i], c): - comp_description = comp_description+"\n"+d.comps_descriptions[i] + comp_descriptions.append(d.comps_descriptions[i]) found = True if found == False: - comp_description = comp_description+" "+c + comp_descriptions.append(c) break - - - return (type_description,dist_description,comp_description) + + return (type_description, dist_description, comp_descriptions, special) # some simple tests diff --git a/SoftwareProperties/dialog_add.py b/SoftwareProperties/dialog_add.py index 9b384623..05737769 100644 --- a/SoftwareProperties/dialog_add.py +++ b/SoftwareProperties/dialog_add.py @@ -26,6 +26,7 @@ import os import gobject import gtk import gtk.glade +from gettext import gettext as _ import aptsources @@ -44,17 +45,66 @@ class dialog_add: self.main = widget = self.gladexml.get_widget("dialog_add") self.main.set_transient_for(self.parent) - - combo = self.gladexml.get_widget("combobox_what") + + self.vbox = self.gladexml.get_widget("vbox_comps") + + # Setup the official channel widgets + self.combo = self.gladexml.get_widget("combobox_what") self.gladexml.signal_connect("on_combobox_what_changed", self.on_combobox_what_changed, None) - # combox box needs cell = gtk.CellRendererText() - combo.pack_start(cell, True) - combo.add_attribute(cell, 'text', 0) - self.fill_combo(combo) - self.gladexml.signal_connect("on_button_custom_clicked", - self.on_button_custom_clicked, None) + self.combo.pack_start(cell, True) + self.combo.add_attribute(cell, 'text', 0) + self.fill_combo(self.combo) + self.label_dist = self.gladexml.get_widget("label_dist") + if self.templatelist.dist != "": + # TRANSLATORS: %s is the distribution name, eg. Ubuntu or Debian + self.label_dist.set_markup("<b>%s</b>" % \ + _("%s channels" % self.templatelist.dist)) + + # Setup the custom channel widgets + self.entry = self.gladexml.get_widget("entry_source_line") + self.gladexml.signal_connect("on_entry_source_line_changed", + self.check_line) + + # Setup the toggle action + self.radio_official = self.gladexml.get_widget("radiobutton_official") + self.radio_custom = self.gladexml.get_widget("radiobutton_custom") + self.button_add = self.gladexml.get_widget("button_add_channel") + self.gladexml.signal_connect("on_radiobutton_custom_toggled", + self.on_radio_custom_toggled) + self.gladexml.signal_connect("on_radiobutton_official_toggled", + self.on_radio_official_toggled) + + # We start with the official channels: + self.official = True + self.radio_custom.toggled() + + def check_line(self, *args): + """Check for a valid apt line""" + if self.official == True: + self.button_add.set_sensitive(True) + return + line = self.entry.get_text() + "\n" + source_entry = aptsources.SourceEntry(line) + if source_entry.invalid == True or source_entry.disabled == True: + self.button_add.set_sensitive(False) + else: + self.button_add.set_sensitive(True) + + + def on_radio_custom_toggled(self, radio): + state = radio.get_active() + self.entry.set_sensitive(state) + self.check_line() + + def on_radio_official_toggled(self, radio): + state = radio.get_active() + self.combo.set_sensitive(state) + for check in self.comps: + check.set_sensitive(state) + self.official = state + self.count_comps() def fill_combo(self,combo): liststore = gtk.ListStore(gobject.TYPE_STRING,gobject.TYPE_PYOBJECT) @@ -65,47 +115,63 @@ class dialog_add: def on_combobox_what_changed(self, combobox, user): #print "on_combobox_what_changed" - vbox = self.gladexml.get_widget("vbox_comps") - vbox.foreach(lambda widget,vbox: vbox.remove(widget), vbox) + self.vbox.foreach(lambda widget,vbox: self.vbox.remove(widget), self.vbox) liststore = combobox.get_model() a_iter = liststore.iter_nth_child(None, combobox.get_active()) (name, template) = liststore.get(a_iter, 0,1) self.selected = template + + # figure what is currently active in the sources.list + already_enabled_comps = [] + for entry in self.sourceslist: + if entry.disabled or entry.invalid or entry.type != "deb": + continue + if template.dist == entry.dist and \ + self.sourceslist.is_mirror(template.uri, entry.uri): + already_enabled_comps = entry.comps + comps = template.comps + self.comps=[] for c in comps: checkbox = gtk.CheckButton(c.description) - checkbox.set_active(c.on_by_default) + # show what should be enabled by default if the source was not found + # else show the already enabled ones + if len(already_enabled_comps) == 0: + checkbox.set_active(c.on_by_default) + else: + checkbox.set_active(c.name in already_enabled_comps) checkbox.set_data("name",c.name) - vbox.pack_start(checkbox) + checkbox.connect("toggled", self.count_comps) + self.vbox.pack_start(checkbox) checkbox.show() - - def on_button_custom_clicked(self, widget, data): - #print "on_button_custom_clicked()" - # this hide here is ugly :/ - self.main.hide() - dialog = self.gladexml.get_widget("dialog_add_custom") - dialog.set_transient_for(self.parent) - res = dialog.run() - dialog.hide() - entry = self.gladexml.get_widget("entry_source_line") - line = entry.get_text() + "\n" - self.sourceslist.list.append(aptsources.SourceEntry(line)) - self.main.response(res) + self.comps.append(checkbox) + self.count_comps() def get_enabled_comps(self, checkbutton): if checkbutton.get_active(): self.selected_comps.append(checkbutton.get_data("name")) + def count_comps(self, *args): + button_add = self.gladexml.get_widget("button_add_channel") + self.selected_comps=[] + self.vbox.foreach(self.get_enabled_comps) + if len(self.selected_comps) > 0: + button_add.set_sensitive(True) + else: + button_add.set_sensitive(False) + def run(self): res = self.main.run() if res == gtk.RESPONSE_OK: # add repository - self.selected_comps = [] - vbox = self.gladexml.get_widget("vbox_comps") - vbox.foreach(self.get_enabled_comps) - self.sourceslist.add(self.selected.type, - self.selected.uri, - self.selected.dist, - self.selected_comps) + if self.official == True: + #self.selected_comps = [] + self.sourceslist.add(self.selected.type, + self.selected.uri, + self.selected.dist, + self.selected_comps) + else: + line = self.entry.get_text() + "\n" + self.sourceslist.list.append(aptsources.SourceEntry(line)) self.main.hide() return res diff --git a/SoftwareProperties/dialog_sources_list.py b/SoftwareProperties/dialog_sources_list.py new file mode 100644 index 00000000..d35b9b51 --- /dev/null +++ b/SoftwareProperties/dialog_sources_list.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python +import pygtk +import gtk +import gtk.glade +import gobject +import os +from optparse import OptionParser +from aptsources import SourcesList, SourceEntryMatcher +from gettext import gettext as _ +import gettext +import urllib +from utils import * + +class AddSourcesList: + def __init__(self, parent, sourceslist, source_renderer, datadir, file): + print file + self.parent = parent + self.source_renderer = source_renderer + self.sources_old = sourceslist + self.file = self.format_uri(file) + self.glade = gtk.glade.XML(os.path.join(datadir, + "glade/SoftwarePropertiesDialogs.glade")) + self.glade.signal_autoconnect(self) + self.dialog = self.glade.get_widget("dialog_sources_list") + self.label = self.glade.get_widget("label_sources") + self.button_add = self.glade.get_widget("button_add") + self.button_cancel = self.glade.get_widget("button_cancel") + self.treeview = self.glade.get_widget("treeview_sources") + self.button_close = self.glade.get_widget("button_close") + self.scrolled = self.glade.get_widget("scrolled_window") + self.image = self.glade.get_widget("image_sources_list") + + self.dialog.realize() + if self.parent != None: + self.dialog.set_transient_for(parent) + else: + self.dialog.set_title(_("Add Software Channels")) + self.dialog.window.set_functions(gtk.gdk.FUNC_MOVE) + + # Setup the treeview + self.store = gtk.ListStore(gobject.TYPE_STRING) + self.treeview.set_model(self.store) + cell = gtk.CellRendererText() + cell.set_property("xpad", 2) + cell.set_property("ypad", 2) + column = gtk.TreeViewColumn("Software Channel", cell, markup=0) + column.set_max_width(500) + self.treeview.append_column(column) + + # Parse the source.list file + try: + self.sources = SingleSourcesList(self.file) + except: + self.error() + return + + # show the found channels or an error message + if len(self.sources.list) > 0: + self.button_close.hide() + counter = 0 + for source in self.sources.list: + if source.invalid or source.disabled: + continue + counter = counter +1 + line = self.source_renderer(source) + self.store.append([line]) + if counter == 0: + self.error() + return + + header = gettext.ngettext("Add the following software channel?", + "Add the following software channels?", + counter) + body = _("You can install software from a channel. Use "\ + "trusted channels, only.") + self.label.set_markup("<big><b>%s</b></big>\n\n%s" % (header, body)) + self.button_add.set_use_underline(True) + self.button_add.set_label(gettext.ngettext("_Add Channel", + "_Add Channels", + counter)) + else: + self.error() + return + + def error(self): + self.button_add.hide() + self.button_cancel.hide() + self.scrolled.hide() + self.button_close.show() + self.image.set_from_stock(gtk.STOCK_DIALOG_ERROR, gtk.ICON_SIZE_DIALOG) + header = _("Could not add any software channels") + body = _("The file '%s' does not contain any valid " + "software channels." % self.file) + self.label.set_markup("<big><b>%s</b></big>\n\n%s" % (header, body)) + + def run(self): + res = self.dialog.run() + if res == gtk.RESPONSE_OK: + for source in self.sources: + self.sources_old.add(source.type, + source.uri, + source.dist, + source.comps, + source.comment) + self.dialog.destroy() + return res + + def format_uri(self, uri): + path = urllib.url2pathname(uri) # escape special chars + path = path.strip('\r\n\x00') # remove \r\n and NULL + if path.startswith('file:\\\\\\'): # windows + path = path[8:] # 8 is len('file:///') + elif path.startswith('file://'): #nautilus, rox + path = path[7:] # 7 is len('file://') + elif path.startswith('file:'): # xffm + path = path[5:] # 5 is len('file:') + return path + +class SingleSourcesList(SourcesList): + def __init__(self, file): + self.matcher = SourceEntryMatcher() + self.list = [] + self.load(file) diff --git a/SoftwareProperties/utils.py b/SoftwareProperties/utils.py index cf9a3343..2886507f 100644 --- a/SoftwareProperties/utils.py +++ b/SoftwareProperties/utils.py @@ -1,5 +1,7 @@ import gtk + + def dialog_error(parent, primary, secondary): p = "<span weight=\"bold\" size=\"larger\">%s</span>" % primary dialog = gtk.MessageDialog(parent,gtk.DIALOG_MODAL, @@ -3,4 +3,8 @@ - add download size to treeview - add /etc/apt/software-properties.d dir where the user can install matchers and templates -- handle cases like "deb http://bla/ dist sec1 sec2 # comment"
\ No newline at end of file +- handle cases like "deb http://bla/ dist sec1 sec2 # comment" +- rework the add channel/cdrom dialogs +- d'n'd for key files +- use one row per section and not one per channel in the treeview +- sort the sources by dist diff --git a/UpdateManager/Common/DistInfo.py b/UpdateManager/Common/DistInfo.py index df244a51..102b981c 100644 --- a/UpdateManager/Common/DistInfo.py +++ b/UpdateManager/Common/DistInfo.py @@ -22,6 +22,7 @@ import os import gettext +from os import getenv import ConfigParser _ = gettext.gettext @@ -51,6 +52,8 @@ class DistInfo: pipe.close() del pipe + self.dist = dist + dist_fname = "%s/%s.info" % (base_dir, dist) dist_file = open (dist_fname) if not dist_file: @@ -100,7 +103,7 @@ class DistInfo: if __name__ == "__main__": - d = DistInfo ("Debian", "../distribution-data") + d = DistInfo ("Debian", "../../channels") print d.changelogs_uri for suite in d.suites: print suite.name diff --git a/UpdateManager/DistUpgradeFetcher.py b/UpdateManager/DistUpgradeFetcher.py index b6d9161b..676f064b 100644 --- a/UpdateManager/DistUpgradeFetcher.py +++ b/UpdateManager/DistUpgradeFetcher.py @@ -91,7 +91,19 @@ class DistUpgradeFetcher(object): return False return True - def authenticate(self, file, signature, keyring='/etc/apt/trusted.gpg'): + def authenticate(self): + if self.new_dist.upgradeToolSig: + f = self.tmpdir+"/"+os.path.basename(self.new_dist.upgradeTool) + sig = self.tmpdir+"/"+os.path.basename(self.new_dist.upgradeToolSig) + print "authenticate '%s' against '%s' " % (f,sig) + if not self.gpgauthenticate(f, sig): + return False + + # we may return False here by default if we want to make a sig + # mandatory + return True + + def gpgauthenticate(self, file, signature, keyring='/etc/apt/trusted.gpg'): """ authenticated a file against a given signature, if no keyring is given use the apt default keyring """ @@ -101,6 +113,7 @@ class DistUpgradeFetcher(object): proc = gpg.run(['--verify', signature, file], create_fhs=['status','logger','stderr']) gpgres = proc.handles['status'].read() + proc.wait() if "VALIDSIG" in gpgres: return True return False @@ -140,19 +153,28 @@ class DistUpgradeFetcher(object): # now download the tarball with the upgrade script self.tmpdir = tmpdir = tempfile.mkdtemp() os.chdir(tmpdir) + + # turn debugging on here (if required) + #apt_pkg.Config.Set("Debug::Acquire::http","1") + + progress = GtkProgress.GtkFetchProgress(self.parent, + _("Downloading the upgrade " + "tool"), + _("The upgrade tool will " + "guide you through the " + "upgrade process.")) + fetcher = apt_pkg.GetAcquire(progress) + + if self.new_dist.upgradeToolSig != None: + uri = self.new_dist.upgradeToolSig + af = apt_pkg.GetPkgAcqFile(fetcher,uri, descr=_("Upgrade tool signature")) if self.new_dist.upgradeTool != None: - progress = GtkProgress.GtkFetchProgress(self.parent, - _("Downloading the upgrade " - "tool"), - _("The upgrade tool will " - "guide you through the " - "upgrade process.")) - fetcher = apt_pkg.GetAcquire(progress) self.uri = self.new_dist.upgradeTool af = apt_pkg.GetPkgAcqFile(fetcher,self.uri, descr=_("Upgrade tool")) if fetcher.Run() != fetcher.ResultContinue: return False return True + return False def runDistUpgrader(self): #print "runing: %s" % script @@ -185,10 +207,10 @@ class DistUpgradeFetcher(object): print "verify failed" self.cleanup() return - #if not self.authenticate(distUpgradeTar, distUpgradeSig): - # print "authenticate failed" - # self.cleanup() - # return + if not self.authenticate(): + print "authenticate failed" + self.cleanup() + return self.runDistUpgrader() diff --git a/UpdateManager/MetaRelease.py b/UpdateManager/MetaRelease.py index cd56970f..fde705bb 100644 --- a/UpdateManager/MetaRelease.py +++ b/UpdateManager/MetaRelease.py @@ -38,12 +38,13 @@ class Dist(object): self.supported = supported self.releaseNotesURI = None self.upgradeTool = None + self.upgradeToolSig = None class MetaRelease(gobject.GObject): # some constants - #METARELEASE_URI = "http://changelogs.ubuntu.com/meta-release" - METARELEASE_URI = "http://people.ubuntu.com/~mvo/dist-upgrader/meta-release-test.save" + METARELEASE_URI = "http://changelogs.ubuntu.com/meta-release" + #METARELEASE_URI = "http://people.ubuntu.com/~mvo/dist-upgrader/meta-release-test2" METARELEASE_FILE = "/var/lib/update-manager/meta-release" __gsignals__ = { @@ -73,6 +74,7 @@ class MetaRelease(gobject.GObject): if res != 0: sys.stderr.write("lsb_release returned exitcode: %i\n" % res) dist = string.strip(p.stdout.readline()) + #dist = "breezy" return dist def check(self): @@ -107,6 +109,8 @@ class MetaRelease(gobject.GObject): dist.releaseNotesURI = index_tag.Section["ReleaseNotes"] if index_tag.Section.has_key("UpgradeTool"): dist.upgradeTool = index_tag.Section["UpgradeTool"] + if index_tag.Section.has_key("UpgradeToolSignature"): + dist.upgradeToolSig = index_tag.Section["UpgradeToolSignature"] dists.append(dist) if name == current_dist_name: current_dist = dist diff --git a/UpdateManager/UpdateManager.py b/UpdateManager/UpdateManager.py index 8549f1c3..590391b9 100644 --- a/UpdateManager/UpdateManager.py +++ b/UpdateManager/UpdateManager.py @@ -28,6 +28,7 @@ pygtk.require('2.0') import gtk import gtk.gdk import gtk.glade +import gconf import gobject import apt import apt_pkg @@ -40,7 +41,6 @@ import os.path import urllib2 import re import tempfile -import gconf import pango import subprocess import pwd @@ -177,7 +177,7 @@ class UpdateList: #print "WARNING, keeping packages" msg = ("<big><b>%s</b></big>\n\n%s" % \ (_("Cannot install all available updates"), - _("Some updates require to remove further software. " + _("Some updates require the removal of further software. " "Use the function \"Smart Upgrade\" of the package manager " "\"Synaptic\" or run \"sudo apt-get dist-upgrade\" in a " "terminal to update your system completely."))) @@ -288,6 +288,10 @@ class UpdateManager(SimpleGladeApp): self.restore_state() + def on_checkbutton_reminder_toggled(self, checkbutton): + self.gconfclient.set_bool("/apps/update-manager/remind_reload", + not checkbutton.get_active()) + def close(self, widget, data=None): if self.window_main.get_property("sensitive") is False: return True @@ -702,6 +706,10 @@ class UpdateManager(SimpleGladeApp): def check_auto_update(self): # Check if automatic update is enabled. If not show a dialog to inform # the user about the need of manual "reloads" + remind = self.gconfclient.get_bool("/apps/update-manager/remind_reload") + if remind == False: + return + update_days = apt_pkg.Config.FindI("APT::Periodic::Update-Package-Lists") if update_days < 1: self.dialog_manual_update.set_transient_for(self.window_main) diff --git a/channels/Ubuntu.info.in b/channels/Ubuntu.info.in index 6422cbdb..f3316390 100644 --- a/channels/Ubuntu.info.in +++ b/channels/Ubuntu.info.in @@ -3,7 +3,7 @@ _ChangelogURI: http://changelogs.ubuntu.com/changelogs/pool/%s/%s/%s/%s_%s/chang Suite: dapper RepositoryType: deb BaseURI: http://archive.ubuntu.com/ubuntu/ -_Description: Ubuntu 6.04 "Dapper Drake" +_Description: Ubuntu 6.04 'Dapper Drake' Component: main Enabled: 1 _CompDescription: Oficially supported @@ -17,10 +17,10 @@ Component: multiverse Enabled: 0 _CompDescription: Non-free (Multiverse) -Suite: breezy +Suite: dapper-security RepositoryType: deb -BaseURI: http://archive.ubuntu.com/ubuntu/ -_Description: Ubuntu 5.10 "Breezy Badger" +BaseURI: http://security.ubuntu.com/ubuntu/ +_Description: Ubuntu 6.04 Security Updates Component: main Enabled: 1 _CompDescription: Oficially supported @@ -34,10 +34,10 @@ Component: multiverse Enabled: 0 _CompDescription: Non-free (Multiverse) -Suite: breezy-security +Suite: dapper-updates RepositoryType: deb -BaseURI: http://security.ubuntu.com/ubuntu/ -_Description: Ubuntu 5.10 Security Updates +BaseURI: http://archive.ubuntu.com/ubuntu/ +_Description: Ubuntu 6.04 Updates Component: main Enabled: 1 _CompDescription: Oficially supported @@ -51,10 +51,10 @@ Component: multiverse Enabled: 0 _CompDescription: Non-free (Multiverse) -Suite: breezy-updates +Suite: breezy RepositoryType: deb BaseURI: http://archive.ubuntu.com/ubuntu/ -_Description: Ubuntu 5.10 Updates +_Description: Ubuntu 5.10 'Breezy Badger' Component: main Enabled: 1 _CompDescription: Oficially supported @@ -68,10 +68,10 @@ Component: multiverse Enabled: 0 _CompDescription: Non-free (Multiverse) -Suite: hoary +Suite: breezy-security RepositoryType: deb -BaseURI: http://archive.ubuntu.com/ubuntu/ -_Description: Ubuntu 5.04 "Hoary Hedgehog" +BaseURI: http://security.ubuntu.com/ubuntu/ +_Description: Ubuntu 5.10 Security Updates Component: main Enabled: 1 _CompDescription: Oficially supported @@ -85,10 +85,10 @@ Component: multiverse Enabled: 0 _CompDescription: Non-free (Multiverse) -Suite: hoary-security +Suite: breezy-updates RepositoryType: deb -BaseURI: http://security.ubuntu.com/ubuntu/ -_Description: Ubuntu 5.04 Security Updates +BaseURI: http://archive.ubuntu.com/ubuntu/ +_Description: Ubuntu 5.10 Updates Component: main Enabled: 1 _CompDescription: Oficially supported diff --git a/data/SoftwareProperties.glade b/data/SoftwareProperties.glade index 89a56f11..5e5c2b7a 100644 --- a/data/SoftwareProperties.glade +++ b/data/SoftwareProperties.glade @@ -5,7 +5,6 @@ <widget class="GtkWindow" id="window_main"> <property name="border_width">6</property> - <property name="width_request">580</property> <property name="height_request">400</property> <property name="visible">True</property> <property name="title" translatable="yes">Software Preferences</property> @@ -68,7 +67,7 @@ <property name="right_padding">0</property> <child> - <widget class="GtkHBox" id="hbox1"> + <widget class="GtkVBox" id="vbox5"> <property name="visible">True</property> <property name="homogeneous">False</property> <property name="spacing">6</property> @@ -93,6 +92,8 @@ <property name="fixed_height_mode">False</property> <property name="hover_selection">False</property> <property name="hover_expand">False</property> + <signal name="row_activated" handler="on_channel_activate" last_modification_time="Sun, 26 Feb 2006 11:19:36 GMT"/> + <signal name="cursor_changed" handler="on_treeview_sources_cursor_changed" last_modification_time="Sun, 26 Feb 2006 11:49:45 GMT"/> </widget> </child> </widget> @@ -104,123 +105,175 @@ </child> <child> - <widget class="GtkVButtonBox" id="vbuttonbox1"> + <widget class="GtkHBox" id="hbox6"> <property name="visible">True</property> - <property name="layout_style">GTK_BUTTONBOX_START</property> - <property name="spacing">6</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> <child> - <widget class="GtkButton" id="button_add"> + <widget class="GtkHBox" id="hbox6"> <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-add</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="focus_on_click">True</property> - <signal name="clicked" handler="on_add_clicked" last_modification_time="Tue, 05 Jul 2005 01:31:37 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkButton" id="button_remove"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-remove</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="focus_on_click">True</property> - <signal name="clicked" handler="on_remove_clicked" last_modification_time="Tue, 05 Jul 2005 02:21:36 GMT"/> - </widget> - </child> + <property name="homogeneous">False</property> + <property name="spacing">6</property> - <child> - <widget class="GtkButton" id="button_edit"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-edit</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="focus_on_click">True</property> - <signal name="clicked" handler="on_edit_clicked" last_modification_time="Tue, 05 Jul 2005 02:18:34 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkButton" id="button_add_cdrom"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="focus_on_click">True</property> - <signal name="clicked" handler="on_button_add_cdrom_clicked" last_modification_time="Fri, 09 Dec 2005 17:39:58 GMT"/> + <child> + <widget class="GtkButton" id="button_add"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-add</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <signal name="clicked" handler="on_add_clicked" last_modification_time="Tue, 05 Jul 2005 01:31:37 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> <child> - <widget class="GtkAlignment" id="alignment4"> + <widget class="GtkButton" id="button_add_cdrom"> <property name="visible">True</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <property name="top_padding">0</property> - <property name="bottom_padding">0</property> - <property name="left_padding">0</property> - <property name="right_padding">0</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <signal name="clicked" handler="on_button_add_cdrom_clicked" last_modification_time="Fri, 09 Dec 2005 17:39:58 GMT"/> <child> - <widget class="GtkHBox" id="hbox4"> + <widget class="GtkAlignment" id="alignment4"> <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">2</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">0</property> + <property name="right_padding">0</property> <child> - <widget class="GtkImage" id="image1"> + <widget class="GtkHBox" id="hbox4"> <property name="visible">True</property> - <property name="stock">gtk-cdrom</property> - <property name="icon_size">4</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> + <property name="homogeneous">False</property> + <property name="spacing">2</property> + + <child> + <widget class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="stock">gtk-cdrom</property> + <property name="icon_size">4</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label7"> + <property name="visible">True</property> + <property name="label" translatable="yes">Add _Cdrom</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label7"> - <property name="visible">True</property> - <property name="label" translatable="yes">Add _Cdrom</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> </child> </widget> </child> </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkButton" id="button_remove"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-remove</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <signal name="clicked" handler="on_remove_clicked" last_modification_time="Tue, 05 Jul 2005 02:21:36 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkButton" id="button_edit"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-edit</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <signal name="clicked" handler="on_edit_clicked" last_modification_time="Tue, 05 Jul 2005 02:18:34 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> </child> </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkButton" id="button_revert"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-revert-to-saved</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <signal name="clicked" handler="on_button_revert_clicked" last_modification_time="Sun, 26 Feb 2006 09:39:55 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> </child> </widget> <packing> @@ -371,7 +424,7 @@ <widget class="GtkCheckButton" id="checkbutton_auto_download"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="label" translatable="yes">_Download updates in the backgound, but do not install them</property> + <property name="label" translatable="yes">_Download updates in the background, but do not install them</property> <property name="use_underline">True</property> <property name="relief">GTK_RELIEF_NORMAL</property> <property name="focus_on_click">True</property> @@ -588,43 +641,42 @@ <property name="padding">0</property> <property name="expand">False</property> <property name="fill">False</property> + <property name="pack_type">GTK_PACK_END</property> </packing> </child> <child> - <widget class="GtkButton" id="button_auth_remove"> + <widget class="GtkButton" id="button_auth_add"> <property name="visible">True</property> + <property name="tooltip" translatable="yes">Import the public key from a trusted software provider</property> <property name="can_focus">True</property> - <property name="label">gtk-remove</property> - <property name="use_stock">True</property> + <property name="label">_Import Key File</property> + <property name="use_underline">True</property> <property name="relief">GTK_RELIEF_NORMAL</property> <property name="focus_on_click">True</property> - <signal name="clicked" handler="remove_key_clicked" last_modification_time="Tue, 05 Jul 2005 04:19:25 GMT"/> + <signal name="clicked" handler="add_key_clicked" last_modification_time="Tue, 05 Jul 2005 04:09:24 GMT"/> </widget> <packing> <property name="padding">0</property> <property name="expand">False</property> <property name="fill">False</property> - <property name="pack_type">GTK_PACK_END</property> </packing> </child> <child> - <widget class="GtkButton" id="button_auth_add"> + <widget class="GtkButton" id="button_auth_remove"> <property name="visible">True</property> - <property name="tooltip" translatable="yes">Import the public key from a trusted software provider</property> <property name="can_focus">True</property> - <property name="label">_Import Key File</property> - <property name="use_underline">True</property> + <property name="label">gtk-remove</property> + <property name="use_stock">True</property> <property name="relief">GTK_RELIEF_NORMAL</property> <property name="focus_on_click">True</property> - <signal name="clicked" handler="add_key_clicked" last_modification_time="Tue, 05 Jul 2005 04:09:24 GMT"/> + <signal name="clicked" handler="remove_key_clicked" last_modification_time="Tue, 05 Jul 2005 04:19:25 GMT"/> </widget> <packing> <property name="padding">0</property> <property name="expand">False</property> <property name="fill">False</property> - <property name="pack_type">GTK_PACK_END</property> </packing> </child> </widget> diff --git a/data/SoftwareProperties.gladep b/data/SoftwareProperties.gladep deleted file mode 100644 index 183077ba..00000000 --- a/data/SoftwareProperties.gladep +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> -<!DOCTYPE glade-project SYSTEM "http://glade.gnome.org/glade-project-2.0.dtd"> - -<glade-project> - <name></name> - <program_name></program_name> - <gnome_support>FALSE</gnome_support> -</glade-project> diff --git a/data/SoftwarePropertiesDialogs.glade b/data/SoftwarePropertiesDialogs.glade index a9e13d5e..ed350003 100644 --- a/data/SoftwarePropertiesDialogs.glade +++ b/data/SoftwarePropertiesDialogs.glade @@ -5,7 +5,7 @@ <widget class="GtkDialog" id="dialog_add"> <property name="border_width">6</property> - <property name="title" translatable="yes">Add repository...</property> + <property name="title" translatable="yes">Add Channel</property> <property name="type">GTK_WINDOW_TOPLEVEL</property> <property name="window_position">GTK_WIN_POS_NONE</property> <property name="modal">True</property> @@ -18,13 +18,13 @@ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> <property name="focus_on_map">True</property> <property name="urgency_hint">False</property> - <property name="has_separator">True</property> + <property name="has_separator">False</property> <child internal-child="vbox"> <widget class="GtkVBox" id="vbox2"> <property name="visible">True</property> <property name="homogeneous">False</property> - <property name="spacing">6</property> + <property name="spacing">12</property> <child internal-child="action_area"> <widget class="GtkHButtonBox" id="hbuttonbox2"> @@ -32,20 +32,6 @@ <property name="layout_style">GTK_BUTTONBOX_END</property> <child> - <widget class="GtkButton" id="button_custom"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">_Custom</property> - <property name="use_underline">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="focus_on_click">True</property> - <property name="response_id">-6</property> - <signal name="clicked" handler="on_button_custom_clicked" last_modification_time="Mon, 29 Nov 2004 11:06:40 GMT"/> - </widget> - </child> - - <child> <widget class="GtkButton" id="button2"> <property name="visible">True</property> <property name="can_default">True</property> @@ -59,13 +45,13 @@ </child> <child> - <widget class="GtkButton" id="button3"> + <widget class="GtkButton" id="button_add_channel"> <property name="visible">True</property> <property name="can_default">True</property> <property name="has_default">True</property> <property name="can_focus">True</property> <property name="has_focus">True</property> - <property name="label">gtk-ok</property> + <property name="label">gtk-add</property> <property name="use_stock">True</property> <property name="relief">GTK_RELIEF_NORMAL</property> <property name="focus_on_click">True</property> @@ -82,42 +68,161 @@ </child> <child> - <widget class="GtkVBox" id="vbox3"> + <widget class="GtkVBox" id="vbox21"> + <property name="border_width">6</property> <property name="visible">True</property> <property name="homogeneous">False</property> <property name="spacing">12</property> <child> - <widget class="GtkLabel" id="label31"> + <widget class="GtkVBox" id="vbox19"> <property name="visible">True</property> - <property name="label" translatable="yes"><b>Repository</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> + <property name="homogeneous">False</property> + <property name="spacing">6</property> - <child> - <widget class="GtkComboBox" id="combobox_what"> - <property name="visible">True</property> - <property name="add_tearoffs">False</property> - <property name="focus_on_click">True</property> - <signal name="changed" handler="on_combobox_what_changed" last_modification_time="Thu, 25 Nov 2004 13:35:11 GMT"/> + <child> + <widget class="GtkRadioButton" id="radiobutton_official"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_radiobutton_official_toggled" last_modification_time="Thu, 23 Feb 2006 10:03:57 GMT"/> + + <child> + <widget class="GtkLabel" id="label_dist"> + <property name="visible">True</property> + <property name="label" translatable="yes"></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox33"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkLabel" id="label69"> + <property name="visible">True</property> + <property name="label" translatable="yes"> </property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox_official"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkComboBox" id="combobox_what"> + <property name="visible">True</property> + <property name="add_tearoffs">False</property> + <property name="focus_on_click">True</property> + <signal name="changed" handler="on_combobox_what_changed" last_modification_time="Thu, 25 Nov 2004 13:35:11 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkHSeparator" id="hseparator1"> + <property name="visible">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox22"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkVBox" id="vbox_comps"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <placeholder/> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> </widget> <packing> <property name="padding">0</property> @@ -127,46 +232,145 @@ </child> <child> - <widget class="GtkLabel" id="label32"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Components</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="vbox_comps"> + <widget class="GtkVBox" id="vbox20"> <property name="visible">True</property> <property name="homogeneous">False</property> <property name="spacing">6</property> <child> - <placeholder/> - </child> + <widget class="GtkRadioButton" id="radiobutton_custom"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <property name="group">radiobutton_official</property> + <signal name="toggled" handler="on_radiobutton_custom_toggled" last_modification_time="Thu, 23 Feb 2006 10:03:31 GMT"/> - <child> - <placeholder/> + <child> + <widget class="GtkLabel" id="label70"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Custom channel</b></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> </child> <child> - <placeholder/> + <widget class="GtkHBox" id="hbox_customasd"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkLabel" id="label68"> + <property name="visible">True</property> + <property name="label" translatable="yes"> </property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox_custom"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">10</property> + + <child> + <widget class="GtkLabel" id="label34"> + <property name="visible">True</property> + <property name="label" translatable="yes">APT line:</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkEntry" id="entry_source_line"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">The APT line contains the type, location and components of a channel, for example 'deb http://ftp.debian.org sarge main'</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">True</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">True</property> + <signal name="changed" handler="on_entry_source_line_changed" last_modification_time="Thu, 23 Feb 2006 10:45:14 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> </child> </widget> <packing> @@ -182,10 +386,6 @@ <property name="fill">True</property> </packing> </child> - - <child> - <placeholder/> - </child> </widget> </child> </widget> @@ -374,60 +574,7 @@ The APT line contains the type, location and content of a repository, for exampl </child> <child> - <widget class="GtkHBox" id="hbox8"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">10</property> - - <child> - <widget class="GtkLabel" id="label34"> - <property name="visible">True</property> - <property name="label" translatable="yes">APT line:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry_source_line"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char">*</property> - <property name="activates_default">True</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> + <placeholder/> </child> </widget> <packing> @@ -449,7 +596,7 @@ The APT line contains the type, location and content of a repository, for exampl <widget class="GtkDialog" id="dialog_edit"> <property name="border_width">6</property> - <property name="title" translatable="yes">Edit Repository...</property> + <property name="title" translatable="yes">Edit Channel</property> <property name="type">GTK_WINDOW_TOPLEVEL</property> <property name="window_position">GTK_WIN_POS_NONE</property> <property name="modal">True</property> @@ -463,7 +610,7 @@ The APT line contains the type, location and content of a repository, for exampl <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> <property name="focus_on_map">True</property> <property name="urgency_hint">False</property> - <property name="has_separator">True</property> + <property name="has_separator">False</property> <child internal-child="vbox"> <widget class="GtkVBox" id="vbox6"> @@ -1803,7 +1950,7 @@ You can add and remove authentication keys in this dialog. A key makes it possib </widget> <widget class="GtkDialog" id="dialog_cdrom_progress"> - <property name="border_width">12</property> + <property name="border_width">6</property> <property name="title" translatable="yes">Scanning CD-ROM</property> <property name="type">GTK_WINDOW_TOPLEVEL</property> <property name="window_position">GTK_WIN_POS_NONE</property> @@ -1913,4 +2060,192 @@ You can add and remove authentication keys in this dialog. A key makes it possib </child> </widget> +<widget class="GtkDialog" id="dialog_sources_list"> + <property name="border_width">6</property> + <property name="title" translatable="yes"></property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_NONE</property> + <property name="modal">False</property> + <property name="resizable">False</property> + <property name="destroy_with_parent">False</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> + <property name="focus_on_map">True</property> + <property name="urgency_hint">False</property> + <property name="has_separator">False</property> + + <child internal-child="vbox"> + <widget class="GtkVBox" id="dialog-vbox1"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child internal-child="action_area"> + <widget class="GtkHButtonBox" id="dialog-action_area1"> + <property name="visible">True</property> + <property name="layout_style">GTK_BUTTONBOX_END</property> + + <child> + <widget class="GtkButton" id="button_cancel"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-cancel</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-6</property> + </widget> + </child> + + <child> + <widget class="GtkButton" id="button_add"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-5</property> + + <child> + <widget class="GtkImage" id="image2"> + <property name="visible">True</property> + <property name="stock">gtk-add</property> + <property name="icon_size">4</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkButton" id="button_close"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-close</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-7</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">GTK_PACK_END</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox1"> + <property name="border_width">6</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child> + <widget class="GtkImage" id="image_sources_list"> + <property name="visible">True</property> + <property name="stock">gtk-dialog-question</property> + <property name="icon_size">6</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox1"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child> + <widget class="GtkLabel" id="label_sources"> + <property name="visible">True</property> + <property name="label" translatable="yes"></property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">True</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkScrolledWindow" id="scrolled_window"> + <property name="height_request">200</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property> + <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> + <property name="shadow_type">GTK_SHADOW_IN</property> + <property name="window_placement">GTK_CORNER_TOP_LEFT</property> + + <child> + <widget class="GtkTreeView" id="treeview_sources"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="headers_visible">False</property> + <property name="rules_hint">True</property> + <property name="reorderable">False</property> + <property name="enable_search">True</property> + <property name="fixed_height_mode">False</property> + <property name="hover_selection">False</property> + <property name="hover_expand">False</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> +</widget> + </glade-interface> diff --git a/data/UpdateManager.glade b/data/UpdateManager.glade index 400a4f75..c94edff6 100644 --- a/data/UpdateManager.glade +++ b/data/UpdateManager.glade @@ -1388,25 +1388,58 @@ Need to get the changes from the central server</property> </child> <child> - <widget class="GtkLabel" id="label27"> + <widget class="GtkVBox" id="vbox17"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes"><b><big>You need to manually reload the latest information about updates</big></b> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child> + <widget class="GtkLabel" id="label27"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes"><b><big>You need to manually reload the latest information about updates</big></b> Your system does not check for updates automatically. You can configure this behavior in "System" -> "Administration" -> "Software Properties".</property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">True</property> - <property name="selectable">True</property> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">True</property> + <property name="selectable">True</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkCheckButton" id="checkbutton_reminder"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_Hide this information in the future</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_checkbutton_reminder_toggled" last_modification_time="Thu, 23 Feb 2006 06:54:08 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> </widget> <packing> <property name="padding">0</property> diff --git a/data/dialog_add_channels.glade b/data/dialog_add_channels.glade new file mode 100644 index 00000000..a0e00a53 --- /dev/null +++ b/data/dialog_add_channels.glade @@ -0,0 +1,180 @@ +<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> +<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> + +<glade-interface> + +<widget class="GtkDialog" id="dialog_add_channel"> + <property name="border_width">6</property> + <property name="title" translatable="yes">Add Software Channel</property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_NONE</property> + <property name="modal">False</property> + <property name="resizable">False</property> + <property name="destroy_with_parent">False</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> + <property name="focus_on_map">True</property> + <property name="urgency_hint">False</property> + <property name="has_separator">False</property> + + <child internal-child="vbox"> + <widget class="GtkVBox" id="dialog-vbox1"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child internal-child="action_area"> + <widget class="GtkHButtonBox" id="dialog-action_area1"> + <property name="visible">True</property> + <property name="layout_style">GTK_BUTTONBOX_END</property> + + <child> + <widget class="GtkButton" id="cancelbutton1"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-cancel</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-6</property> + </widget> + </child> + + <child> + <widget class="GtkButton" id="button_add"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-5</property> + + <child> + <widget class="GtkImage" id="image2"> + <property name="visible">True</property> + <property name="stock">gtk-add</property> + <property name="icon_size">4</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">GTK_PACK_END</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox1"> + <property name="border_width">6</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child> + <widget class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="stock">gtk-dialog-question</property> + <property name="icon_size">6</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox1"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child> + <widget class="GtkLabel" id="label_sources"> + <property name="visible">True</property> + <property name="label" translatable="yes"></property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkScrolledWindow" id="scrolledwindow1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property> + <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> + <property name="shadow_type">GTK_SHADOW_IN</property> + <property name="window_placement">GTK_CORNER_TOP_LEFT</property> + + <child> + <widget class="GtkTreeView" id="treeview_sources"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="headers_visible">False</property> + <property name="rules_hint">True</property> + <property name="reorderable">False</property> + <property name="enable_search">True</property> + <property name="fixed_height_mode">False</property> + <property name="hover_selection">False</property> + <property name="hover_expand">False</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> +</widget> + +</glade-interface> diff --git a/data/gnome-software-properties.desktop.in b/data/gnome-software-properties.desktop.in index 781e2eb9..6a193a40 100644 --- a/data/gnome-software-properties.desktop.in +++ b/data/gnome-software-properties.desktop.in @@ -1,13 +1,14 @@ [Desktop Entry] _Name=Software Properties _GenericName=Software Properties -_Comment=Edit software sources and settings +_Comment=Configure software channels and internet updates Exec=gksu /usr/bin/gnome-software-properties Icon=update-manager.png Terminal=false MultipleArgs=false Type=Application Encoding=UTF-8 +MimeType=text/x-apt-sources-list Categories=Application;System;Settings; X-KDE-SubstituteUID=true X-Ubuntu-Gettext-Domain=update-manager
\ No newline at end of file diff --git a/data/gnome-software-properties.gladep b/data/gnome-software-properties.gladep deleted file mode 100644 index 183077ba..00000000 --- a/data/gnome-software-properties.gladep +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> -<!DOCTYPE glade-project SYSTEM "http://glade.gnome.org/glade-project-2.0.dtd"> - -<glade-project> - <name></name> - <program_name></program_name> - <gnome_support>FALSE</gnome_support> -</glade-project> diff --git a/data/mime/apt.xml b/data/mime/apt.xml new file mode 100644 index 00000000..d7332632 --- /dev/null +++ b/data/mime/apt.xml @@ -0,0 +1,7 @@ +<?xml version="1.0"?> +<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'> + <mime-type type="text/x-apt-sources-list"> + <comment>Software Channel List</comment> + <glob pattern="sources.list"/> + </mime-type> +</mime-info> diff --git a/data/update-manager.gladep b/data/update-manager.gladep deleted file mode 100644 index 183077ba..00000000 --- a/data/update-manager.gladep +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> -<!DOCTYPE glade-project SYSTEM "http://glade.gnome.org/glade-project-2.0.dtd"> - -<glade-project> - <name></name> - <program_name></program_name> - <gnome_support>FALSE</gnome_support> -</glade-project> diff --git a/data/update-manager.schemas.in b/data/update-manager.schemas.in new file mode 100644 index 00000000..06308871 --- /dev/null +++ b/data/update-manager.schemas.in @@ -0,0 +1,52 @@ +<?xml version="1.0" ?> +<gconfschemafile> + <schemalist> + <schema> + <key>/schemas/apps/update-manager/remind_reload</key> + <applyto>/apps/update-manager/remind_reload</applyto> + <owner>update-manager</owner> + <type>bool</type> + <default>True</default> + + <locale name="C"> + <short>Remind to reload the channel list</short> + <long> + If automatic checking for updates is disabeld, you have + to reload the channel list manually. This option allows + to hide the reminder shown in this case. + </long> + </locale> + </schema> + <schema> + <key>/schemas/apps/update-manager/show_details</key> + <applyto>/apps/update-manager/show_details</applyto> + <owner>update-manager</owner> + <type>bool</type> + <default>False</default> + + <locale name="C"> + <short>Show details of an update</short> + <long> + Stores the state of the expander that contains the + list of changs and the description + </long> + </locale> + </schema> + <schema> + <key>/schemas/apps/update-manager/window_size</key> + <applyto>/apps/update-manager/window_size</applyto> + <owner>update-manager</owner> + <type>pair</type> + <car_type>int</car_type> + <cdr_type>int</cdr_type> + + <locale name="C"> + <short>The window size</short> + <long> + Stores the size of the update-manager dialog + </long> + </locale> + </schema> + </schemalist> +</gconfschemafile> + diff --git a/debian/changelog b/debian/changelog index 5b847b61..e5c87e50 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,11 +1,16 @@ update-manager (0.42.2ubuntu6) dapper; urgency=low + * SoftwareProperties/: + - fix some UI problems (thanks to Sebastian Heinlein) + - add breezy-updates, breezy-security to the Add dialog + * po/pt_BR.po: updated translation + (thanks to Carlos Eduardo Pedroza Santiviago) + * po/pt.po: updated Portugise translation (thanks to Rui Azevedo) * debian/control: arch: all now - * po/pt_BR.po: updated translation (thanks to - Carlos Eduardo Pedroza Santiviago) - * data/gnome-software-properties.desktop.in, update-manager.desktop.in, - debian/rules: undo the detection in favour of the simpler update of + * debian/rules: undo the detection in favour of the simpler update of the desktop files + * data/gnome-software-properties.desktop.in, update-manager.desktop.in: + - added X-Ubuntu-Gettext-Domain -- Michael Vogt <michael.vogt@ubuntu.com> Mon, 20 Feb 2006 15:58:09 +0100 diff --git a/debian/rules b/debian/rules index dbeb3dc4..3753e9f7 100755 --- a/debian/rules +++ b/debian/rules @@ -62,6 +62,9 @@ binary-arch: build install dh_installchangelogs ChangeLog dh_installdocs dh_scrollkeeper + dh_installmime + dh_desktop + dh_gconf dh_installexamples # dh_install # dh_installmenu diff --git a/gnome-software-properties b/gnome-software-properties index a8074f7e..2e1d5da6 100644 --- a/gnome-software-properties +++ b/gnome-software-properties @@ -73,6 +73,9 @@ if __name__ == "__main__": data_dir="/usr/share/update-manager/" #data_dir="/tmp/xxx/share/update-manager/" - app = SoftwareProperties.SoftwareProperties(data_dir, options) + file = None + if len(args) > 0: + file = args[0] + app = SoftwareProperties.SoftwareProperties(data_dir, options, file) app.run() - sys.exit(app.modified)
\ No newline at end of file + sys.exit(app.modified) diff --git a/help/C/update-manager-C.omf b/help/C/update-manager-C.omf index a4e6aabc..3d0f8909 100644 --- a/help/C/update-manager-C.omf +++ b/help/C/update-manager-C.omf @@ -1,15 +1,16 @@ <?xml version="1.0" standalone="no"?> <omf> <resource> - <creator>sean@inwords.co.za (Sean Wheller) </creator> - <title>Update Manager Manual </title> + <creator>sean@inwords.co.za (Sean Wheller)</creator> + <title>Update Manager Manual</title> <date>2005-03-04 </date> <version identifier="0.0.1" date="2005-03-04" description="First Release"/> - <subject category="System|Administration"/> - <description> This document explains how to use the Update Manager. </description> + <subject category="Applications"/> + <description> Keep the software on your system up-to-date.</description> <type>manual </type> <format mime="text/xml" dtd="-//OASIS//DTD DocBook XML V4.1.2//EN"/> - <identifier url=""/> + <identifier + url="file:/usr/share/gnome/help/update-manager/C/update-manager.xml"/> <language code="C"/> <relation seriesid="e7ae3bcc-8ce0-11d9-8fa9-d1fb3a9076bb"/> <rights type="GNU FDL" license.version="1.1" license="http://www.gnu.org/licenses/fdl.html" diff --git a/help/Makefile.am b/help/Makefile.am deleted file mode 100644 index 42ffacc2..00000000 --- a/help/Makefile.am +++ /dev/null @@ -1 +0,0 @@ -SUBDIRS = C diff --git a/po/POTFILES.in b/po/POTFILES.in index 12a33a6d..fc588621 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -1,6 +1,7 @@ [encoding: UTF-8] data/SoftwareProperties.glade SoftwareProperties/SoftwareProperties.py +SoftwareProperties/dialog_sources_list.py DistUpgrade/DistUpgradeCache.py DistUpgrade/DistUpgradeControler.py DistUpgrade/DistUpgradeViewGtk.py @@ -9,6 +10,7 @@ DistUpgrade/dist-upgrade.py DistUpgrade/DistUpgrade.glade data/UpdateManager.glade data/update-manager.desktop.in +data/update-manager.schemas.in [type: gettext/rfc822deb] channels/Ubuntu.info.in [type: gettext/rfc822deb] channels/Debian.info.in [type: python] src/update-manager diff --git a/po/pt.po b/po/pt.po new file mode 100644 index 00000000..f35b3b33 --- /dev/null +++ b/po/pt.po @@ -0,0 +1,737 @@ +# Portuguese translation of update-manager. +# Copyright (C) 2005 Free Software Foundation, Inc. +# This file is distributed under the same license as the update-manager package. +# +msgid "" +msgstr "" +"Project-Id-Version: update-manager\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2006-02-09 17:05+0100\n" +"PO-Revision-Date: 2005-03-29 13:36-0300\n" +"Last-Translator: Rui Az. <astronomy@mail.pt>\n" +"Language-Team: Ubuntu Portuguese Team <ubuntu-pt.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../data/SoftwareProperties.glade.h:1 +msgid "<b>Channels</b>" +msgstr "" + +#: ../data/SoftwareProperties.glade.h:2 +msgid "<b>Internet updates</b>" +msgstr "" + +#: ../data/SoftwareProperties.glade.h:3 +msgid "<b>Keys</b>" +msgstr "" + +#: ../data/SoftwareProperties.glade.h:4 +msgid "Add _Cdrom" +msgstr "Adicionar _CD" + +#: ../data/SoftwareProperties.glade.h:5 +msgid "Authentication" +msgstr "Autenticação" + +#: ../data/SoftwareProperties.glade.h:6 +msgid "D_elete downloaded software files:" +msgstr "Apagar ficheiros descarregados:" + +#: ../data/SoftwareProperties.glade.h:7 +msgid "Import the public key from a trusted software provider" +msgstr "Importar a chave pública de um fornecedor de software confiável" + +#: ../data/SoftwareProperties.glade.h:8 +msgid "Installation Media" +msgstr "" + +#: ../data/SoftwareProperties.glade.h:9 +msgid "Internet Updates" +msgstr "" + +#: ../data/SoftwareProperties.glade.h:10 +msgid "Restore _Defaults" +msgstr "Restaurar _Definições" + +#: ../data/SoftwareProperties.glade.h:11 +msgid "Restore the default keys of your distribution" +msgstr "Restaurar as chaves padrão da sua distribuição" + +#: ../data/SoftwareProperties.glade.h:12 +msgid "Software Preferences" +msgstr "Preferências de Software" + +#: ../data/SoftwareProperties.glade.h:13 +msgid "_Check for updates automatically:" +msgstr "_Procurar por actualizações automaticamente:" + +#: ../data/SoftwareProperties.glade.h:14 +msgid "_Download updates in the backgound, but do not install them" +msgstr "_Descarregar actualizações silenciosamente, sem as instalar" + +#: ../data/SoftwareProperties.glade.h:15 +msgid "_Install new updates without confirmation" +msgstr "_Instalar novas actualizações sem confirmação" + +#: ../data/UpdateManager.glade.h:1 +msgid "" +"<b><big>You need to manually reload the latest information about updates</" +"big></b>\n" +"\n" +"Your system does not check for updates automatically. You can configure this " +"behavior in \"System\" -> \"Administration\" -> \"Software Properties\"." +msgstr "" +"<b><big>Tem de reler manualmente a última informação sobre actualizações</" +"big></b>\n" +"\n" +"O seu sistema não procura por actualizações automaticamente. Pode configurar " +"este comportamento em \"Sistema\" -> \"Administração\" -> \"Propriedades do " +"Software\"." + +#: ../data/UpdateManager.glade.h:4 +msgid "" +"<big><b>Checking for available updates</b></big>\n" +"\n" +"Software updates can correct errors, eliminate security vulnerabilities, and " +"provide new features to you." +msgstr "" +"<big><b>A procurar por actualizações disponíveis</b></big>\n" +"\n" +"Actualizações de software podem corrigir erros, eliminar problemas de " +"segurança, e fornecer novas funcionalidades." + +#: ../data/UpdateManager.glade.h:7 +msgid "<big><b>Keep your system up-to-date</b></big>" +msgstr "<big><b>Mantenha o seu sistema actualizado</b></big>" + +#: ../data/UpdateManager.glade.h:8 +msgid "" +"<span weight=\"bold\" size=\"larger\">Downloading changes</span>\n" +"\n" +"Need to get the changes from the central server" +msgstr "" +"<span weight=\"bold\" size=\"larger\">A efectuar download de alterações</" +"span>\n" +"\n" +"É necessário obter as alterações de um servidor central" + +#: ../data/UpdateManager.glade.h:11 +msgid "Cancel _Download" +msgstr "Cancelar _Descarregamento" + +#: ../data/UpdateManager.glade.h:12 +msgid "Changes" +msgstr "Alterações" + +#: ../data/UpdateManager.glade.h:13 +msgid "Description" +msgstr "Descrição" + +#: ../data/UpdateManager.glade.h:14 +msgid "Release Notes" +msgstr "Notas de lançamento" + +#: ../data/UpdateManager.glade.h:15 +msgid "Reload the latest information about updates" +msgstr "Reler a última informação sobre actualizações" + +#: ../data/UpdateManager.glade.h:16 +msgid "Show details" +msgstr "Mostrar detalhes" + +#: ../data/UpdateManager.glade.h:17 +msgid "Show progress of single files" +msgstr "Mostrar progresso de ficheiros individuais" + +#: ../data/UpdateManager.glade.h:18 +msgid "Software Updates" +msgstr "Actualizações de Software" + +#: ../data/UpdateManager.glade.h:19 +msgid "" +"Software updates can correct errors, eliminate security vulnerabilities, and " +"provide new features to you." +msgstr "" +"Actualizações de software podem corrigir erros, eliminar problemas de " +"segurança, e fornecer novas funcionalidades." + +#: ../data/UpdateManager.glade.h:20 +msgid "U_pgrade" +msgstr "A_ctualização" + +#: ../data/UpdateManager.glade.h:21 +msgid "Upgrade to the latest version of Ubuntu" +msgstr "Actualize para a última versão do Ubuntu" + +#: ../data/UpdateManager.glade.h:22 +msgid "_Install Updates" +msgstr "_Instalar Actualizações" + +#: ../data/UpdateManager.glade.h:23 +msgid "_Reload" +msgstr "Reler" + +#. ChangelogURI +#: ../channels/Ubuntu.info.in.h:4 +#, no-c-format +msgid "http://changelogs.ubuntu.com/changelogs/pool/%s/%s/%s/%s_%s/changelog" +msgstr "" + +#. Description +#: ../channels/Ubuntu.info.in:6 +msgid "Ubuntu 6.04 \"Dapper Drake\"" +msgstr "Ubuntu 6.04 \"Dapper Drake\"" + +#. Description +#: ../channels/Ubuntu.info.in:23 +msgid "Ubuntu 5.10 \"Breezy Badger\"" +msgstr "Ubuntu 5.10 \"Breezy Badger\"" + +#. Description +#: ../channels/Ubuntu.info.in:40 +msgid "Ubuntu 5.10 Security Updates" +msgstr "Ubuntu 5.10 Actualizações de Segurança" + +#. Description +#: ../channels/Ubuntu.info.in:57 +msgid "Ubuntu 5.10 Updates" +msgstr "Ubuntu 5.10 Actualizações" + +#. Description +#: ../channels/Ubuntu.info.in:74 +msgid "Ubuntu 5.04 \"Hoary Hedgehog\"" +msgstr "Ubuntu 5.04 \"Hoary Hedgehog\"" + +#. Description +#: ../channels/Ubuntu.info.in:91 +msgid "Ubuntu 5.04 Security Updates" +msgstr "Ubuntu 5.04 Actualizações de Segurança" + +#. CompDescription +#: ../channels/Ubuntu.info.in:94 ../channels/Debian.info.in:51 +msgid "Oficially supported" +msgstr "Suportado Oficialmente" + +#. CompDescription +#: ../channels/Ubuntu.info.in:97 +msgid "Restricted copyright" +msgstr "Direitos de autor restritos" + +#. CompDescription +#: ../channels/Ubuntu.info.in:100 +msgid "Community maintained (Universe)" +msgstr "Mantido pela comunidade (Universe)" + +#. CompDescription +#: ../channels/Ubuntu.info.in:103 +msgid "Non-free (Multiverse)" +msgstr "Não-livre (Multiverse)" + +#. ChangelogURI +#: ../channels/Debian.info.in.h:4 +#, no-c-format +msgid "http://packages.debian.org/changelogs/pool/%s/%s/%s/%s_%s/changelog" +msgstr "" + +#. Description +#: ../channels/Debian.info.in:6 +msgid "Debian 3.1 \"Sarge\"" +msgstr "Debian 3.1 \"Sarge\"" + +#. BaseURI +#: ../channels/Debian.info.in:19 +msgid "http://security.debian.org/" +msgstr "http://security.debian.org/" + +#. Description +#: ../channels/Debian.info.in:20 +msgid "Debian 3.1 \"Sarge\" Security Updates" +msgstr "Debian 3.1 \"Sarge\" Actualizações de Segurança" + +#. Description +#: ../channels/Debian.info.in:34 +msgid "Debian \"Etch\" (testing)" +msgstr "Debian \"Etch\" (testing)" + +#. BaseURI +#: ../channels/Debian.info.in:47 +msgid "http://http.us.debian.org/debian/" +msgstr "http://http.us.debian.org/debian/" + +#. Description +#: ../channels/Debian.info.in:48 +msgid "Debian \"Sid\" (unstable)" +msgstr "Debian \"Sid\" (unstable)" + +#. CompDescription +#: ../channels/Debian.info.in:54 +msgid "DFSG-compatible Software with Non-Free Dependencies" +msgstr "Software compatível-DFSG com Dependências Não-Livres" + +#. CompDescription +#: ../channels/Debian.info.in:57 +msgid "Non-DFSG-compatible Software" +msgstr "Software compatível-DFSG" + +#: ../SoftwareProperties/SoftwareProperties.py:102 +#, python-format +msgid "Every %s days" +msgstr "Todos os % dias" + +#: ../SoftwareProperties/SoftwareProperties.py:132 +#, python-format +msgid "After %s days" +msgstr "Depois de %s dias" + +#: ../SoftwareProperties/SoftwareProperties.py:330 +msgid "Import key" +msgstr "Importar chave" + +#: ../SoftwareProperties/SoftwareProperties.py:340 +msgid "Error importing selected file" +msgstr "Erro ao importar ficheiro seleccionado" + +#: ../SoftwareProperties/SoftwareProperties.py:341 +msgid "The selected file may not be a GPG key file or it might be corrupt." +msgstr "" +"O ficheiro seleccionado pode não ser um ficheiro de chave GPG ou pode estar " +"corrompido." + +#: ../SoftwareProperties/SoftwareProperties.py:353 +msgid "Error removing the key" +msgstr "Erro ao remover a chave" + +#: ../SoftwareProperties/SoftwareProperties.py:354 +msgid "The key you selected could not be removed. Please report this as a bug." +msgstr "" +"A chave que seleccionou não pôde ser removida. Por favor reporte este erro." + +#: ../SoftwareProperties/SoftwareProperties.py:397 +#, python-format +msgid "" +"<big><b>Error scaning the CD</b></big>\n" +"\n" +"%s" +msgstr "" +"<big><b>Erro ao ler o CD</b></big>\n" +"\n" +"%s" + +#: ../SoftwareProperties/SoftwareProperties.py:447 +msgid "Please enter a name for the disc" +msgstr "Por favor introduza um nome para o disco" + +#: ../SoftwareProperties/SoftwareProperties.py:463 +msgid "Please insert a disc in the drive:" +msgstr "Por favor introduza um disco no leitor:" + +#: ../DistUpgrade/DistUpgradeCache.py:92 +msgid "Broken packages" +msgstr "Pacotes Quebrados" + +#: ../DistUpgrade/DistUpgradeCache.py:93 +msgid "" +"Your system contains broken packages that couldn't be fixed with this " +"software. Please fix them first using synaptic or apt-get before proceeding." +msgstr "" +"O seu sistema contém pacotes quebrados que não puderam ser corrigidos com " +"este software. Por favor corrija-os usando o synaptic ou apt-get antes de " +"continuar." + +#: ../DistUpgrade/DistUpgradeCache.py:135 +msgid "Can't upgrade required meta-packages" +msgstr "Não foi possível actualizar os meta-pacotes necessários" + +#: ../DistUpgrade/DistUpgradeCache.py:142 +msgid "A essential package would have to be removed" +msgstr "Um pacote essencial teria que ser removido" + +#. FIXME: change the text to something more useful +#: ../DistUpgrade/DistUpgradeCache.py:145 +msgid "Could not calculate the upgrade" +msgstr "Impossível de calcular a actualização" + +#: ../DistUpgrade/DistUpgradeCache.py:146 +msgid "" +"A unresolvable problem occured while calculating the upgrade. Please report " +"this as a bug. " +msgstr "" +"Um problema irresolúvel ocorreu ao calcular a actualização. Por favor " +"reporte este erro. " + +#. FIXME: maybe ask a question here? instead of failing? +#: ../DistUpgrade/DistUpgradeCache.py:168 +msgid "Error authenticating some packages" +msgstr "Erro ao autenticar alguns pacotes" + +#: ../DistUpgrade/DistUpgradeCache.py:169 +msgid "" +"It was not possible to authenticate some packages. This may be a transient " +"network problem. You may want to try again later. See below for a list of " +"unauthenticated packages." +msgstr "" +"Não foi possível autenticar alguns pacotes. Este pode ser um problema de " +"rede transitório. Pode tentar novamente mais tarde. Verifique abaixo uma " +"lista de pacotes não autenticados." + +#: ../DistUpgrade/DistUpgradeCache.py:232 +#, python-format +msgid "Can't install '%s'" +msgstr "Impossível de instalar '%s'" + +#: ../DistUpgrade/DistUpgradeCache.py:233 +msgid "" +"It was impossible to install a required package. Please report this as a " +"bug. " +msgstr "" +"Foi impossível instalar um pacote essencial. Por favor reporte este erro. " + +#. FIXME: provide a list +#: ../DistUpgrade/DistUpgradeCache.py:240 +msgid "Can't guess meta-package" +msgstr "Impossível de descobrir meta-pacote" + +#: ../DistUpgrade/DistUpgradeCache.py:241 +msgid "" +"Your system does not contain a ubuntu-desktop, kubuntu-desktop or edubuntu-" +"desktop package and it was not possible to detect which version of ubuntu " +"you are runing.\n" +" Please install one of the packages above first using synaptic or apt-get " +"before proceeding." +msgstr "" +"O seu sistema não contém o pacote ubuntu-desktop, kubuntu-desktop ou " +"edubuntu-desktop e portanto não foi possível detectar que versão do ubuntu " +"está a executar.\n" +" Por favor instale um dos pacotes acima mencionados usando o synaptic ou apt-" +"get antes de continuar." + +#: ../DistUpgrade/DistUpgradeControler.py:42 +msgid "Reading cache" +msgstr "A ler a cache" + +#. FIXME: offer to write a new self.sources.list entry +#: ../DistUpgrade/DistUpgradeControler.py:107 +msgid "No valid entry found" +msgstr "Nenhuma entrada válida encontrada" + +#: ../DistUpgrade/DistUpgradeControler.py:108 +msgid "" +"While scaning your repository information no valid entry for the upgrade was " +"found.\n" +msgstr "" +"Ao pesquisar o seu repositório de informação não foi encontrada nenhuma " +"entrada válida de actualização.\n" + +#: ../DistUpgrade/DistUpgradeControler.py:125 +msgid "Repository information invalid" +msgstr "Informação de repositório inválida" + +#: ../DistUpgrade/DistUpgradeControler.py:126 +msgid "" +"Upgrading the repository information resulted in a invalid file. Please " +"report this as a bug." +msgstr "" +"A actualização da informação de repositório resultou num ficheiro inválido. " +"Por favor reporte este erro." + +#: ../DistUpgrade/DistUpgradeControler.py:171 +msgid "Error during update" +msgstr "Erro durante a actualização" + +#: ../DistUpgrade/DistUpgradeControler.py:172 +msgid "" +"A problem occured during the update. This is usually some sort of network " +"problem, please check your network connection and retry." +msgstr "" +"Ocorreu um problema durante a actualização. Habitualmente trata-se de algum " +"tipo de problema na rede, por favor verifique a sua ligação à rede e volte a " +"tentar." + +#: ../DistUpgrade/DistUpgradeControler.py:190 +msgid "Not enough free space" +msgstr "Não existe espaço livre suficiente" + +#: ../DistUpgrade/DistUpgradeControler.py:191 +msgid "" +"There is not enough free space on your system to download the required " +"pacakges. Please free some space before trying again with e.g. 'sudo apt-get " +"clean'" +msgstr "" +"Não existe espaço suficiente no seu sistema para descarregar os pacotes " +"necessários. Por favor liberte algum espaço antes de tentar novamente por " +"exemplo usando 'sudo apt-get clean'" + +#: ../DistUpgrade/DistUpgradeControler.py:196 +msgid "Perform Upgrade?" +msgstr "Efectuar Actualização?" + +#. installing the packages failed, can't be retried +#: ../DistUpgrade/DistUpgradeControler.py:211 +#: ../DistUpgrade/DistUpgradeControler.py:280 +msgid "Error during commit" +msgstr "" + +#: ../DistUpgrade/DistUpgradeControler.py:212 +msgid "" +"Some problem occured during the upgrade. Most likely packages failed to " +"install. Try 'sudo apt-get install -f' or synaptic to fix your system." +msgstr "" +"Ocorreu algum problema durante a actualização. Provavelmente a instalação de " +"alguns pacotes falhou. Tente 'sudo apt-get install -f' ou use o synaptic " +"para corrigir o seu sistema." + +#: ../DistUpgrade/DistUpgradeControler.py:228 +msgid "Error fetching the packages" +msgstr "Erro ao descarregar os pacotes" + +#: ../DistUpgrade/DistUpgradeControler.py:229 +msgid "" +"Some problem occured during the fetching of the packages. This is most " +"likely a network problem. Please check your network and try again. " +msgstr "" +"Ocorreu algum problema ao descarregar pacotes. Trata-se provavelmente de um " +"problema de rede. Por favor verifique a rede e tente novamente. " + +#: ../DistUpgrade/DistUpgradeControler.py:273 +msgid "Remove obsolete Packages?" +msgstr "Remover Pacotes obsoletos?" + +#: ../DistUpgrade/DistUpgradeControler.py:281 +msgid "" +"Some problem occured during the clean-up. Please see the below message for " +"more information. " +msgstr "" +"Ocorreu algum problema durante a limpeza. Por favor verifique a mensagem " +"abaixo para mais informação. " + +#. sanity check (check for ubuntu-desktop, brokenCache etc) +#. then open the cache (again) +#: ../DistUpgrade/DistUpgradeControler.py:295 +#: ../DistUpgrade/DistUpgradeControler.py:318 +msgid "Checking package manager" +msgstr "A verificar gestor de pacotes" + +#: ../DistUpgrade/DistUpgradeControler.py:310 +msgid "Updating repository information" +msgstr "A Actualizar informação de repositórios" + +#: ../DistUpgrade/DistUpgradeControler.py:324 +msgid "Asking for confirmation" +msgstr "A pedir confirmação" + +#: ../DistUpgrade/DistUpgradeControler.py:328 +msgid "Upgrading" +msgstr "A actualizar" + +#: ../DistUpgrade/DistUpgradeControler.py:335 +msgid "Searching for obsolete software" +msgstr "À procura de software obsoleto" + +#: ../DistUpgrade/DistUpgradeControler.py:340 +msgid "System upgrade is complete." +msgstr "A actualização do sistema está completa." + +#. print "mediaChange %s %s" % (medium, drive) +#: ../DistUpgrade/DistUpgradeViewGtk.py:76 +#, python-format +msgid "Please insert '%s' into the drive '%s'" +msgstr "Por favor insira '%s' no leitor '%s'" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:94 +msgid "Download is complete" +msgstr "O Download está completo" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:105 +#, python-format +msgid "Downloading file %li of %li with %s/s" +msgstr "A fazer o download de ficheiro %li de %li com %s/s" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:106 +#, python-format +msgid "%s remaining" +msgstr "%s restantes" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:108 +#, python-format +msgid "Downloading file %li of %li with unknown speed" +msgstr "A fazer o download de ficheiro %li de %li a velocidade desconhecida" + +#. FIXME: add support for the timeout +#. of the terminal (to display something useful then) +#. -> longer term, move this code into python-apt +#: ../DistUpgrade/DistUpgradeViewGtk.py:131 +msgid "Installing updates" +msgstr "A instalar actualizações" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:144 +#, python-format +msgid "Could not install '%s'" +msgstr "Não foi possível instalar '%s'" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:145 +msgid "The upgrade will abort. Please report the bug." +msgstr "A actualização abortará. Reporte este erro." + +#: ../DistUpgrade/DistUpgradeViewGtk.py:216 +msgid "A fatal error occured" +msgstr "Ocorreu um erro fatal" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:217 +msgid "" +"During the operation a fatal error occured. Please report this as a bug and " +"include the files ~/dist-upgrade.log and ~/dist-upgrade-apt.log in your " +"report. The upgrade will abort now. " +msgstr "" +"Durante a operação ocorreu um erro fatal. Por favor reporte este erro e " +"inclua os ficheiros ~/dist-upgrade.log e ~/dist-upgrade-apt.log no seu " +"relatório. A actualização abortará agora. " + +#: ../DistUpgrade/DistUpgradeViewGtk.py:293 +#, python-format +msgid "" +"%s packages are going to be removed.\n" +"%s packages are going to be newly installed.\n" +"%s packages are going to be upgraded.\n" +"\n" +"%s needs to be fetched" +msgstr "" +"%s pacotes serão removidos.\n" +"%s pacotes novos serão instalados.\n" +"%s pacotes serão actualizados.\n" +"\n" +"%s precisam de ser descarregados" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:304 +#, python-format +msgid "<b>To be removed: %s</b>" +msgstr "<b>A ser removido: %s</b>" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:306 +#, python-format +msgid "To be installed: %s" +msgstr "A ser instalado: %s" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:308 +#, python-format +msgid "To be upgraded: %s" +msgstr "A ser actualizado: %s" + +#. print "on_window_main_delete_event()" +#: ../DistUpgrade/DistUpgradeViewGtk.py:339 +msgid "Are you sure you want cancel?" +msgstr "Tem a certeza que pretende cancelar?" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:340 +msgid "" +"Canceling during a upgrade can leave the system in a unstable state. It is " +"strongly adviced to continue the operation. " +msgstr "" +"Cancelar durante uma actualização pode deixar o seu sistema num estado " +"instável. É fortemente aconselhado a prosseguir a operação. " + +#: ../DistUpgrade/DistUpgradeView.py:67 +msgid "Reboot required" +msgstr "Necessário reiniciar" + +#: ../DistUpgrade/DistUpgradeView.py:68 +msgid "" +"The upgrade is finished now. A reboot is required to now, do you want to do " +"this now?" +msgstr "" +"A actualização terminou agora. É necessário reiniciar, deseja efectuá-lo " +"agora?" + +#. testcode to see if the bullets look nice in the dialog +#. for i in range(4): +#. view.setStep(i+1) +#. app.openCache() +#: ../DistUpgrade/DistUpgrade.glade.h:1 +msgid " " +msgstr "" + +#: ../DistUpgrade/DistUpgrade.glade.h:2 +msgid "<b><big>Restart the system to complete the upgrade</big></b>" +msgstr "<b><big>Reinicie o sistema para completar a actualização</big></b>" + +#: ../DistUpgrade/DistUpgrade.glade.h:3 +msgid "<b><big>Start the upgrade?</big></b>" +msgstr "<b><big>Iniciar a actualização?</big></b>" + +#: ../DistUpgrade/DistUpgrade.glade.h:4 +msgid "" +"<span weight=\"bold\" size=\"x-large\">Upgrading to Ubuntu \"Dapper\" 6.04</" +"span>" +msgstr "" +"<span weight=\"bold\" size=\"x-large\">A actualizar para Ubuntu \"Dapper\" " +"6.04</span>" + +#: ../DistUpgrade/DistUpgrade.glade.h:5 +msgid "Cleaning up" +msgstr "A efectuar limpeza" + +#: ../DistUpgrade/DistUpgrade.glade.h:6 +msgid "Details" +msgstr "Detalhes" + +#: ../DistUpgrade/DistUpgrade.glade.h:7 +msgid "Downloading and installing the upgrades" +msgstr "A efectuar o download e a instalar actualizações" + +#: ../DistUpgrade/DistUpgrade.glade.h:8 +msgid "Modifing the software channels" +msgstr "" + +#: ../DistUpgrade/DistUpgrade.glade.h:9 +msgid "Preparing the upgrade" +msgstr "A preparar actualização" + +#: ../DistUpgrade/DistUpgrade.glade.h:10 +msgid "Terminal" +msgstr "Terminal" + +#: ../DistUpgrade/DistUpgrade.glade.h:11 +msgid "Upgrading Ubuntu" +msgstr "A actualizar o Ubuntu" + +#: ../DistUpgrade/DistUpgrade.glade.h:12 +msgid "_Report Bug" +msgstr "_Reportar um erro" + +#: ../DistUpgrade/DistUpgrade.glade.h:13 +msgid "_Restart Now" +msgstr "_Reiniciar agora" + +#, fuzzy +#~ msgid "<b>Sources</b>" +#~ msgstr "<b>Fontes de Software</b>" + +#~ msgid "<b>Components</b>" +#~ msgstr "<b>Componentes</b>" + +#~ msgid "<b>URI:</b>" +#~ msgstr "<b>URI:</b>" + +#~ msgid "APT line:" +#~ msgstr "Linha do APT:" + +#~ msgid "Clean interval in days: " +#~ msgstr "Intervalo de limpeza em dias: " + +#~ msgid "Delete _old packages in the package cache" +#~ msgstr "Excluir pacotes _antigos da cache de pacotes" + +#~ msgid "Your system has broken packages!" +#~ msgstr "O seu sistema tem pacotes quebrados!" + +#~ msgid "Your system is up-to-date!" +#~ msgstr "O seu sistema está actualizado!" + +#~ msgid "Never show this message again" +#~ msgstr "Nunca exibir esta mensagem novamente" + +#~ msgid "Software Properties" +#~ msgstr "Propriedades dos Software" + +#~ msgid "CD" +#~ msgstr "CD" diff --git a/po/update-manager.pot b/po/update-manager.pot new file mode 100644 index 00000000..66b7fa1e --- /dev/null +++ b/po/update-manager.pot @@ -0,0 +1,759 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: michael.vogt@canonical.com\n" +"POT-Creation-Date: 2006-02-23 12:55+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: ../data/SoftwareProperties.glade.h:1 +msgid "<b>Channels</b>" +msgstr "" + +#: ../data/SoftwareProperties.glade.h:2 +msgid "<b>Internet updates</b>" +msgstr "" + +#: ../data/SoftwareProperties.glade.h:3 +msgid "<b>Keys</b>" +msgstr "" + +#: ../data/SoftwareProperties.glade.h:4 +msgid "Add _Cdrom" +msgstr "" + +#: ../data/SoftwareProperties.glade.h:5 +msgid "Authentication" +msgstr "" + +#: ../data/SoftwareProperties.glade.h:6 +msgid "D_elete downloaded software files:" +msgstr "" + +#: ../data/SoftwareProperties.glade.h:7 +msgid "Import the public key from a trusted software provider" +msgstr "" + +#: ../data/SoftwareProperties.glade.h:8 +msgid "Installation Media" +msgstr "" + +#: ../data/SoftwareProperties.glade.h:9 +msgid "Internet Updates" +msgstr "" + +#: ../data/SoftwareProperties.glade.h:10 +msgid "" +"Only security updates from the official Ubuntu servers will be installed " +"automatically. The software package \"unattended-upgrades\" needs to be " +"installed therefor" +msgstr "" + +#: ../data/SoftwareProperties.glade.h:11 +msgid "Restore _Defaults" +msgstr "" + +#: ../data/SoftwareProperties.glade.h:12 +msgid "Restore the default keys of your distribution" +msgstr "" + +#: ../data/SoftwareProperties.glade.h:13 +msgid "Software Preferences" +msgstr "" + +#: ../data/SoftwareProperties.glade.h:14 +msgid "_Check for updates automatically:" +msgstr "" + +#: ../data/SoftwareProperties.glade.h:15 +msgid "_Download updates in the backgound, but do not install them" +msgstr "" + +#: ../data/SoftwareProperties.glade.h:16 +msgid "_Install security updates without confirmation" +msgstr "" + +#: ../SoftwareProperties/SoftwareProperties.py:115 +#, python-format +msgid "Every %s days" +msgstr "" + +#: ../SoftwareProperties/SoftwareProperties.py:145 +#, python-format +msgid "After %s days" +msgstr "" + +#. cell_desc.set_property("xpad", 10) +#. cell_desc.set_property("ypad", 10) +#: ../SoftwareProperties/SoftwareProperties.py:230 +msgid "Software Channel" +msgstr "" + +#: ../SoftwareProperties/SoftwareProperties.py:236 +msgid "Active" +msgstr "" + +#: ../SoftwareProperties/SoftwareProperties.py:413 +msgid "Import key" +msgstr "" + +#: ../SoftwareProperties/SoftwareProperties.py:423 +msgid "Error importing selected file" +msgstr "" + +#: ../SoftwareProperties/SoftwareProperties.py:424 +msgid "The selected file may not be a GPG key file or it might be corrupt." +msgstr "" + +#: ../SoftwareProperties/SoftwareProperties.py:436 +msgid "Error removing the key" +msgstr "" + +#: ../SoftwareProperties/SoftwareProperties.py:437 +msgid "The key you selected could not be removed. Please report this as a bug." +msgstr "" + +#: ../SoftwareProperties/SoftwareProperties.py:480 +#, python-format +msgid "" +"<big><b>Error scaning the CD</b></big>\n" +"\n" +"%s" +msgstr "" + +#: ../SoftwareProperties/SoftwareProperties.py:530 +msgid "Please enter a name for the disc" +msgstr "" + +#: ../SoftwareProperties/SoftwareProperties.py:546 +msgid "Please insert a disc in the drive:" +msgstr "" + +#: ../SoftwareProperties/dialog_sources_list.py:35 +msgid "Add Software Channels" +msgstr "" + +#: ../SoftwareProperties/dialog_sources_list.py:71 +msgid "Add the following software channel?" +msgid_plural "Add the following software channels?" +msgstr[0] "" +msgstr[1] "" + +#: ../SoftwareProperties/dialog_sources_list.py:74 +msgid "You can install software from a channel. Use trusted channels, only." +msgstr "" + +#: ../SoftwareProperties/dialog_sources_list.py:78 +msgid "_Add Channel" +msgid_plural "_Add Channels" +msgstr[0] "" +msgstr[1] "" + +#: ../SoftwareProperties/dialog_sources_list.py:91 +msgid "Could not add any software channels" +msgstr "" + +#: ../SoftwareProperties/dialog_sources_list.py:92 +#, python-format +msgid "The file '%s' does not contain any valid software channels." +msgstr "" + +#: ../DistUpgrade/DistUpgradeCache.py:92 +msgid "Broken packages" +msgstr "" + +#: ../DistUpgrade/DistUpgradeCache.py:93 +msgid "" +"Your system contains broken packages that couldn't be fixed with this " +"software. Please fix them first using synaptic or apt-get before proceeding." +msgstr "" + +#: ../DistUpgrade/DistUpgradeCache.py:135 +msgid "Can't upgrade required meta-packages" +msgstr "" + +#: ../DistUpgrade/DistUpgradeCache.py:142 +msgid "A essential package would have to be removed" +msgstr "" + +#. FIXME: change the text to something more useful +#: ../DistUpgrade/DistUpgradeCache.py:145 +msgid "Could not calculate the upgrade" +msgstr "" + +#: ../DistUpgrade/DistUpgradeCache.py:146 +msgid "" +"A unresolvable problem occured while calculating the upgrade. Please report " +"this as a bug. " +msgstr "" + +#. FIXME: maybe ask a question here? instead of failing? +#: ../DistUpgrade/DistUpgradeCache.py:168 +msgid "Error authenticating some packages" +msgstr "" + +#: ../DistUpgrade/DistUpgradeCache.py:169 +msgid "" +"It was not possible to authenticate some packages. This may be a transient " +"network problem. You may want to try again later. See below for a list of " +"unauthenticated packages." +msgstr "" + +#: ../DistUpgrade/DistUpgradeCache.py:232 +#, python-format +msgid "Can't install '%s'" +msgstr "" + +#: ../DistUpgrade/DistUpgradeCache.py:233 +msgid "" +"It was impossible to install a required package. Please report this as a " +"bug. " +msgstr "" + +#. FIXME: provide a list +#: ../DistUpgrade/DistUpgradeCache.py:240 +msgid "Can't guess meta-package" +msgstr "" + +#: ../DistUpgrade/DistUpgradeCache.py:241 +msgid "" +"Your system does not contain a ubuntu-desktop, kubuntu-desktop or edubuntu-" +"desktop package and it was not possible to detect which version of ubuntu " +"you are runing.\n" +" Please install one of the packages above first using synaptic or apt-get " +"before proceeding." +msgstr "" + +#: ../DistUpgrade/DistUpgradeControler.py:42 +msgid "Reading cache" +msgstr "" + +#. FIXME: offer to write a new self.sources.list entry +#: ../DistUpgrade/DistUpgradeControler.py:107 +msgid "No valid entry found" +msgstr "" + +#: ../DistUpgrade/DistUpgradeControler.py:108 +msgid "" +"While scaning your repository information no valid entry for the upgrade was " +"found.\n" +msgstr "" + +#: ../DistUpgrade/DistUpgradeControler.py:125 +msgid "Repository information invalid" +msgstr "" + +#: ../DistUpgrade/DistUpgradeControler.py:126 +msgid "" +"Upgrading the repository information resulted in a invalid file. Please " +"report this as a bug." +msgstr "" + +#: ../DistUpgrade/DistUpgradeControler.py:171 +msgid "Error during update" +msgstr "" + +#: ../DistUpgrade/DistUpgradeControler.py:172 +msgid "" +"A problem occured during the update. This is usually some sort of network " +"problem, please check your network connection and retry." +msgstr "" + +#: ../DistUpgrade/DistUpgradeControler.py:191 +msgid "Not enough free disk space" +msgstr "" + +#: ../DistUpgrade/DistUpgradeControler.py:192 +#, python-format +msgid "" +"The upgrade aborts now. Please free at least %s of disk space. Empty your " +"trash and remove temporary packages of former installations using 'sudo apt-" +"get clean'." +msgstr "" + +#: ../DistUpgrade/DistUpgradeControler.py:198 +msgid "Do you want to start the upgrade?" +msgstr "" + +#. installing the packages failed, can't be retried +#: ../DistUpgrade/DistUpgradeControler.py:214 +msgid "Could not install the upgrades" +msgstr "" + +#: ../DistUpgrade/DistUpgradeControler.py:215 +msgid "" +"The upgrade aborts now. Your system can be in an unusable state. Please try " +"'sudo apt-get install -f' or Synaptic to fix your system." +msgstr "" + +#: ../DistUpgrade/DistUpgradeControler.py:230 +msgid "Could not download the upgrades" +msgstr "" + +#: ../DistUpgrade/DistUpgradeControler.py:231 +msgid "" +"The upgrade aborts now. Please check your internet connection or " +"installation media and try again. " +msgstr "" + +#: ../DistUpgrade/DistUpgradeControler.py:274 +msgid "Remove obsolete Packages?" +msgstr "" + +#: ../DistUpgrade/DistUpgradeControler.py:281 +msgid "Error during commit" +msgstr "" + +#: ../DistUpgrade/DistUpgradeControler.py:282 +msgid "" +"Some problem occured during the clean-up. Please see the below message for " +"more information. " +msgstr "" + +#. sanity check (check for ubuntu-desktop, brokenCache etc) +#. then open the cache (again) +#: ../DistUpgrade/DistUpgradeControler.py:296 +#: ../DistUpgrade/DistUpgradeControler.py:319 +msgid "Checking package manager" +msgstr "" + +#: ../DistUpgrade/DistUpgradeControler.py:311 +msgid "Updating repository information" +msgstr "" + +#: ../DistUpgrade/DistUpgradeControler.py:325 +msgid "Asking for confirmation" +msgstr "" + +#: ../DistUpgrade/DistUpgradeControler.py:329 +msgid "Upgrading" +msgstr "" + +#: ../DistUpgrade/DistUpgradeControler.py:336 +msgid "Searching for obsolete software" +msgstr "" + +#: ../DistUpgrade/DistUpgradeControler.py:341 +msgid "System upgrade is complete." +msgstr "" + +#. print "mediaChange %s %s" % (medium, drive) +#: ../DistUpgrade/DistUpgradeViewGtk.py:77 +#, python-format +msgid "Please insert '%s' into the drive '%s'" +msgstr "" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:95 +msgid "Download is complete" +msgstr "" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:106 +#, python-format +msgid "Downloading file %li of %li at %s/s" +msgstr "" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:107 +#, python-format +msgid "%s remaining" +msgstr "" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:109 +#, python-format +msgid "Downloading file %li of %li at unknown speed" +msgstr "" + +#. FIXME: add support for the timeout +#. of the terminal (to display something useful then) +#. -> longer term, move this code into python-apt +#: ../DistUpgrade/DistUpgradeViewGtk.py:134 +msgid "Installing updates" +msgstr "" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:147 +#, python-format +msgid "Could not install '%s'" +msgstr "" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:148 +msgid "The upgrade aborts now. Please report this bug." +msgstr "" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:226 +msgid "A fatal error occured" +msgstr "" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:227 +msgid "" +"Please report this as a bug and include the files ~/dist-upgrade.log and ~/" +"dist-upgrade-apt.log in your report. The upgrade aborts now. " +msgstr "" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:308 +#, python-format +msgid "%s package is going to be removed." +msgid_plural "%s packages are going to be removed." +msgstr[0] "" +msgstr[1] "" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:314 +#, python-format +msgid "%s new package is going to be installed." +msgid_plural "%s new packages are going to be installed." +msgstr[0] "" +msgstr[1] "" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:320 +#, python-format +msgid "%s package is going to be upgraded." +msgid_plural "%s packages are going to be upgraded." +msgstr[0] "" +msgstr[1] "" + +#. FIXME: this should go into DistUpgradeController +#: ../DistUpgrade/DistUpgradeViewGtk.py:327 +msgid "Could not find any upgrades" +msgstr "" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:328 +msgid "Your system has already been upgraded." +msgstr "" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:332 +#, python-format +msgid "You have to download a total of %s." +msgstr "" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:339 +#, python-format +msgid "<b>Remove %s</b>" +msgstr "" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:341 +#, python-format +msgid "Install %s" +msgstr "" + +#: ../DistUpgrade/DistUpgradeViewGtk.py:343 +#, python-format +msgid "Upgrade %s" +msgstr "" + +#: ../DistUpgrade/DistUpgradeView.py:67 +msgid "Reboot required" +msgstr "" + +#: ../DistUpgrade/DistUpgradeView.py:68 +msgid "" +"The upgrade is finished now. A reboot is required to now, do you want to do " +"this now?" +msgstr "" + +#. testcode to see if the bullets look nice in the dialog +#. for i in range(4): +#. view.setStep(i+1) +#. app.openCache() +#: ../DistUpgrade/DistUpgrade.glade.h:1 +msgid " " +msgstr "" + +#: ../DistUpgrade/DistUpgrade.glade.h:2 +msgid "" +"<b><big>Cancel the running upgrade?</big></b>\n" +"\n" +"The system could be in an unusable state if you cancel the upgrade. You are " +"strongly adviced to resume the upgrade." +msgstr "" + +#: ../DistUpgrade/DistUpgrade.glade.h:5 +msgid "<b><big>Restart the system to complete the upgrade</big></b>" +msgstr "" + +#: ../DistUpgrade/DistUpgrade.glade.h:6 +msgid "<b><big>Start the upgrade?</big></b>" +msgstr "" + +#: ../DistUpgrade/DistUpgrade.glade.h:7 +msgid "" +"<span weight=\"bold\" size=\"x-large\">Upgrading to Ubuntu \"Dapper\" 6.04</" +"span>" +msgstr "" + +#: ../DistUpgrade/DistUpgrade.glade.h:8 +msgid "Cleaning up" +msgstr "" + +#: ../DistUpgrade/DistUpgrade.glade.h:9 +msgid "Details" +msgstr "" + +#: ../DistUpgrade/DistUpgrade.glade.h:10 +msgid "Downloading and installing the upgrades" +msgstr "" + +#: ../DistUpgrade/DistUpgrade.glade.h:11 +msgid "Modifying the software channels" +msgstr "" + +#: ../DistUpgrade/DistUpgrade.glade.h:12 +msgid "Preparing the upgrade" +msgstr "" + +#: ../DistUpgrade/DistUpgrade.glade.h:13 +msgid "Restarting the system" +msgstr "" + +#: ../DistUpgrade/DistUpgrade.glade.h:14 +msgid "Terminal" +msgstr "" + +#: ../DistUpgrade/DistUpgrade.glade.h:15 +msgid "Upgrading Ubuntu" +msgstr "" + +#: ../DistUpgrade/DistUpgrade.glade.h:16 +msgid "_Report Bug" +msgstr "" + +#: ../DistUpgrade/DistUpgrade.glade.h:17 +msgid "_Restart Now" +msgstr "" + +#: ../DistUpgrade/DistUpgrade.glade.h:18 +msgid "_Resume Upgrade" +msgstr "" + +#: ../data/UpdateManager.glade.h:1 +msgid "" +"<b><big>You need to manually reload the latest information about updates</" +"big></b>\n" +"\n" +"Your system does not check for updates automatically. You can configure this " +"behavior in \"System\" -> \"Administration\" -> \"Software Properties\"." +msgstr "" + +#: ../data/UpdateManager.glade.h:4 +msgid "" +"<big><b>Checking for available updates</b></big>\n" +"\n" +"Software updates can correct errors, eliminate security vulnerabilities, and " +"provide new features to you." +msgstr "" + +#: ../data/UpdateManager.glade.h:7 +msgid "<big><b>Keep your system up-to-date</b></big>" +msgstr "" + +#: ../data/UpdateManager.glade.h:8 +msgid "" +"<span weight=\"bold\" size=\"larger\">Downloading changes</span>\n" +"\n" +"Need to get the changes from the central server" +msgstr "" + +#: ../data/UpdateManager.glade.h:11 +msgid "Cancel _Download" +msgstr "" + +#: ../data/UpdateManager.glade.h:12 +msgid "Changes" +msgstr "" + +#: ../data/UpdateManager.glade.h:13 +msgid "Description" +msgstr "" + +#: ../data/UpdateManager.glade.h:14 +msgid "Release Notes" +msgstr "" + +#: ../data/UpdateManager.glade.h:15 +msgid "Reload the latest information about updates" +msgstr "" + +#: ../data/UpdateManager.glade.h:16 +msgid "Show details" +msgstr "" + +#: ../data/UpdateManager.glade.h:17 +msgid "Show progress of single files" +msgstr "" + +#: ../data/UpdateManager.glade.h:18 +msgid "Software Updates" +msgstr "" + +#: ../data/UpdateManager.glade.h:19 +msgid "" +"Software updates can correct errors, eliminate security vulnerabilities, and " +"provide new features to you." +msgstr "" + +#: ../data/UpdateManager.glade.h:20 +msgid "U_pgrade" +msgstr "" + +#: ../data/UpdateManager.glade.h:21 +msgid "Upgrade to the latest version of Ubuntu" +msgstr "" + +#: ../data/UpdateManager.glade.h:22 +msgid "_Hide this information in the future" +msgstr "" + +#: ../data/UpdateManager.glade.h:23 +msgid "_Install Updates" +msgstr "" + +#: ../data/UpdateManager.glade.h:24 +msgid "_Reload" +msgstr "" + +#: ../data/update-manager.desktop.in.h:1 +msgid "Show available updates and choose which to install" +msgstr "" + +#: ../data/update-manager.desktop.in.h:2 +msgid "Update Manager" +msgstr "" + +#: ../data/update-manager.schemas.in.h:1 +msgid "" +"If automatic checking for updates is disabeld, you have to reload the " +"channel list manually. This option allows to hide the reminder shown in this " +"case." +msgstr "" + +#: ../data/update-manager.schemas.in.h:2 +msgid "Remind to reload the channel list" +msgstr "" + +#: ../data/update-manager.schemas.in.h:3 +msgid "Show details of an update" +msgstr "" + +#: ../data/update-manager.schemas.in.h:4 +msgid "Stores the size of the update-manager dialog" +msgstr "" + +#: ../data/update-manager.schemas.in.h:5 +msgid "" +"Stores the state of the expander that contains the list of changs and the " +"description" +msgstr "" + +#: ../data/update-manager.schemas.in.h:6 +msgid "The window size" +msgstr "" + +#. ChangelogURI +#: ../channels/Ubuntu.info.in.h:4 +#, no-c-format +msgid "http://changelogs.ubuntu.com/changelogs/pool/%s/%s/%s/%s_%s/changelog" +msgstr "" + +#. Description +#: ../channels/Ubuntu.info.in:6 +msgid "Ubuntu 6.04 \"Dapper Drake\"" +msgstr "" + +#. Description +#: ../channels/Ubuntu.info.in:23 +msgid "Ubuntu 5.10 \"Breezy Badger\"" +msgstr "" + +#. Description +#: ../channels/Ubuntu.info.in:40 +msgid "Ubuntu 5.10 Security Updates" +msgstr "" + +#. Description +#: ../channels/Ubuntu.info.in:57 +msgid "Ubuntu 5.10 Updates" +msgstr "" + +#. Description +#: ../channels/Ubuntu.info.in:74 +msgid "Ubuntu 5.04 \"Hoary Hedgehog\"" +msgstr "" + +#. Description +#: ../channels/Ubuntu.info.in:91 +msgid "Ubuntu 5.04 Security Updates" +msgstr "" + +#. CompDescription +#: ../channels/Ubuntu.info.in:94 ../channels/Debian.info.in:51 +msgid "Oficially supported" +msgstr "" + +#. CompDescription +#: ../channels/Ubuntu.info.in:97 +msgid "Restricted copyright" +msgstr "" + +#. CompDescription +#: ../channels/Ubuntu.info.in:100 +msgid "Community maintained (Universe)" +msgstr "" + +#. CompDescription +#: ../channels/Ubuntu.info.in:103 +msgid "Non-free (Multiverse)" +msgstr "" + +#. ChangelogURI +#: ../channels/Debian.info.in.h:4 +#, no-c-format +msgid "http://packages.debian.org/changelogs/pool/%s/%s/%s/%s_%s/changelog" +msgstr "" + +#. Description +#: ../channels/Debian.info.in:6 +msgid "Debian 3.1 \"Sarge\"" +msgstr "" + +#. BaseURI +#: ../channels/Debian.info.in:19 +msgid "http://security.debian.org/" +msgstr "" + +#. Description +#: ../channels/Debian.info.in:20 +msgid "Debian 3.1 \"Sarge\" Security Updates" +msgstr "" + +#. Description +#: ../channels/Debian.info.in:34 +msgid "Debian \"Etch\" (testing)" +msgstr "" + +#. BaseURI +#: ../channels/Debian.info.in:47 +msgid "http://http.us.debian.org/debian/" +msgstr "" + +#. Description +#: ../channels/Debian.info.in:48 +msgid "Debian \"Sid\" (unstable)" +msgstr "" + +#. CompDescription +#: ../channels/Debian.info.in:54 +msgid "DFSG-compatible Software with Non-Free Dependencies" +msgstr "" + +#. CompDescription +#: ../channels/Debian.info.in:57 +msgid "Non-DFSG-compatible Software" +msgstr "" @@ -5,12 +5,28 @@ import glob import os GETTEXT_NAME="update-manager" +HELPFILES = [] +print "Setting up help files..." +for filepath in glob.glob("help/*"): + lang = filepath[len("help/"):] + print " Language: %s" % lang + path_xml = "share/gnome/help/update-manager/" + lang + path_figures = "share/gnome/help/update-manager/" + lang + "/figures/" + HELPFILES.append((path_xml, (glob.glob("%s/*.xml" % filepath)))) + HELPFILES.append((path_figures, (glob.glob("%s/figures/*.png" % \ + filepath)))) +HELPFILES.append(('share/omf/update-manager', glob.glob("help/*/*.omf"))) + I18NFILES = [] for filepath in glob.glob("po/mo/*/LC_MESSAGES/*.mo"): lang = filepath[len("po/mo/"):] targetpath = os.path.dirname(os.path.join("share/locale",lang)) I18NFILES.append((targetpath, [filepath])) +os.system("intltool-merge -d po data/update-manager.schemas.in"\ + " build/update-manager.schemas") + + # HACK: make sure that the mo files are generated and up-to-date os.system("cd po; make update-po") # do the same for the desktop files @@ -19,7 +35,7 @@ os.system("cd data; make") os.system("cd channels; make") setup(name='update-manager', - version='0.1', + version='0.42.2', packages=[ 'SoftwareProperties', 'UpdateManager', @@ -42,10 +58,16 @@ setup(name='update-manager', ["data/update-manager.desktop", "data/gnome-software-properties.desktop"] ), + ('share/gconf/schemas', + glob.glob("build/*.schemas") + ), ('share/pixmaps', ["data/update-manager.png"] + ), + ('share/mime/packages', + ["data/mime/apt.xml"] ) - ]+I18NFILES, + ] + I18NFILES + HELPFILES, ) |
