summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Vogt <michael.vogt@ubuntu.com>2006-02-27 19:47:44 +0100
committerMichael Vogt <michael.vogt@ubuntu.com>2006-02-27 19:47:44 +0100
commit9fab3e0069ee2f9b05084787ce114a67ae65c13f (patch)
treea1d3680ffb37fac0550959de618d1640428eaf8c
parenteadf5eaff85bec1548298ce14874cac070f44454 (diff)
parent67389517a2f4c58ee03b3ba6ee540df4f8f073f7 (diff)
downloadpython-apt-9fab3e0069ee2f9b05084787ce114a67ae65c13f.tar.gz
* merged with main
-rw-r--r--DistUpgrade/DistUpgrade.glade3
-rw-r--r--DistUpgrade/DistUpgradeView.py6
-rw-r--r--DistUpgrade/DistUpgradeViewGtk.py36
-rw-r--r--DistUpgrade/TODO18
-rw-r--r--SoftwareProperties/SoftwareProperties.py205
-rw-r--r--SoftwareProperties/aptsources.py328
-rw-r--r--SoftwareProperties/dialog_add.py130
-rw-r--r--SoftwareProperties/dialog_sources_list.py123
-rw-r--r--SoftwareProperties/utils.py2
-rw-r--r--TODO6
-rw-r--r--UpdateManager/Common/DistInfo.py5
-rw-r--r--UpdateManager/DistUpgradeFetcher.py46
-rw-r--r--UpdateManager/MetaRelease.py8
-rw-r--r--UpdateManager/UpdateManager.py12
-rw-r--r--channels/Ubuntu.info.in30
-rw-r--r--data/SoftwareProperties.glade272
-rw-r--r--data/SoftwareProperties.gladep8
-rw-r--r--data/SoftwarePropertiesDialogs.glade615
-rw-r--r--data/UpdateManager.glade65
-rw-r--r--data/dialog_add_channels.glade180
-rw-r--r--data/gnome-software-properties.desktop.in3
-rw-r--r--data/gnome-software-properties.gladep8
-rw-r--r--data/mime/apt.xml7
-rw-r--r--data/update-manager.gladep8
-rw-r--r--data/update-manager.schemas.in52
-rw-r--r--debian/changelog13
-rwxr-xr-xdebian/rules3
-rw-r--r--gnome-software-properties7
-rw-r--r--help/C/update-manager-C.omf11
-rw-r--r--help/Makefile.am1
-rw-r--r--po/POTFILES.in2
-rw-r--r--po/pt.po737
-rw-r--r--po/update-manager.pot759
-rwxr-xr-xsetup.py26
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,
diff --git a/TODO b/TODO
index 2a1d3928..1507f002 100644
--- a/TODO
+++ b/TODO
@@ -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">&lt;b&gt;Repository&lt;/b&gt;</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">&lt;b&gt;Components&lt;/b&gt;</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">&lt;b&gt;Custom channel&lt;/b&gt;</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">&lt;b&gt;&lt;big&gt;You need to manually reload the latest information about updates&lt;/big&gt;&lt;/b&gt;
+ <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">&lt;b&gt;&lt;big&gt;You need to manually reload the latest information about updates&lt;/big&gt;&lt;/b&gt;
Your system does not check for updates automatically. You can configure this behavior in &quot;System&quot; -&gt; &quot;Administration&quot; -&gt; &quot;Software Properties&quot;.</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 ""
diff --git a/setup.py b/setup.py
index c901656f..873f5de4 100755
--- a/setup.py
+++ b/setup.py
@@ -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,
)