summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xadd-software-channel90
-rw-r--r--data/dialog_add_channels.glade180
-rw-r--r--data/mime/add-software-channel.applications9
-rw-r--r--data/mime/add-software-channel.desktop11
-rw-r--r--data/mime/add-software-channel.desktop.in11
-rw-r--r--data/mime/apt.xml7
-rwxr-xr-xdebian/rules2
-rwxr-xr-xsetup.py9
8 files changed, 318 insertions, 1 deletions
diff --git a/add-software-channel b/add-software-channel
new file mode 100755
index 00000000..348e0f24
--- /dev/null
+++ b/add-software-channel
@@ -0,0 +1,90 @@
+#!/usr/bin/env python
+import pygtk
+import gtk
+import gtk.glade
+import gobject
+import os
+from optparse import OptionParser
+from SoftwareProperties.aptsources import SourcesList, SourceEntryMatcher
+from gettext import gettext as _
+import gettext
+import urllib
+
+class AddSoftwareChannel:
+ def __init__(self, data, file):
+ icons = gtk.icon_theme_get_default()
+ logo_pixbuf=icons.load_icon("gnome-settings-default-applications",
+ 32, 0)
+ gtk.window_set_default_icon_list(logo_pixbuf)
+
+ self.glade = gtk.glade.XML(os.path.join(data,
+ "dialog_add_channels.glade"))
+ self.glade.signal_autoconnect(self)
+ self.dialog = self.glade.get_widget("dialog_add_channel")
+ 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.dialog.realize()
+ 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()
+ column = gtk.TreeViewColumn("Software Channel", cell, markup=0)
+ column.set_max_width(500)
+ self.treeview.append_column(column)
+
+ # Parse the source.list file
+ self.sources = SingleSourcesList(self.format_uri(file))
+ self.matcher = SourceEntryMatcher()
+ for source in self.sources.list:
+ if source.invalid or source.disabled:
+ continue
+ (a_type, dist, comps) = self.matcher.match(source)
+ line = "<big><b>%s </b></big> (%s) <small>\n%s</small>" %\
+ self.matcher.match(source)
+ self.store.append([line])
+
+ header = gettext.ngettext("Add the following software channel?",
+ "Add the following software channels?",
+ len(self.sources.list))
+ body = _("You can install software from a channel. Nice, or?")
+ 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",
+ len(self.sources.list)))
+
+ self.dialog.run()
+ self.dialog.destroy()
+
+ 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.list = []
+ self.load(file)
+
+def main(file):
+# file="sources.list"
+ print file
+ data = "/usr/share/update-manager/glade"
+ dialog = AddSoftwareChannel(data, file)
+
+if __name__ == '__main__':
+ parser = OptionParser()
+ (options, args) = parser.parse_args()
+ main(args[0])
+
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/mime/add-software-channel.applications b/data/mime/add-software-channel.applications
new file mode 100644
index 00000000..2b38d9b7
--- /dev/null
+++ b/data/mime/add-software-channel.applications
@@ -0,0 +1,9 @@
+
+add-software-channel
+ command=add-software-channel
+ name=Add Software Channel
+ can_open_multiple_files=false
+ expects_uris=false
+ requires_terminal=false
+ mime_types=text/x-apt-sources
+
diff --git a/data/mime/add-software-channel.desktop b/data/mime/add-software-channel.desktop
new file mode 100644
index 00000000..fa61fe81
--- /dev/null
+++ b/data/mime/add-software-channel.desktop
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Name=Add Software Channel
+GenericName=Add Software Channel
+Exec=/usr/bin/add-software-channel
+Icon=update-manager.png
+Terminal=false
+Hide=true
+Type=Application
+Encoding=UTF-8
+Categories=Application;System;
+MimeType=text/x-apt-sources;
diff --git a/data/mime/add-software-channel.desktop.in b/data/mime/add-software-channel.desktop.in
new file mode 100644
index 00000000..bc8b1f7a
--- /dev/null
+++ b/data/mime/add-software-channel.desktop.in
@@ -0,0 +1,11 @@
+[Desktop Entry]
+_Name=Add Software Channel
+_GenericName=Add Software Channel
+Exec=/usr/bin/add-software-channel
+Icon=update-manager.png
+Terminal=false
+Visible=false
+Type=Application
+Encoding=UTF-8
+Categories=Application;System;Settings;
+MimeType=text/x-apt-sources
diff --git a/data/mime/apt.xml b/data/mime/apt.xml
new file mode 100644
index 00000000..33592bdd
--- /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">
+ <comment>Software Channel List</comment>
+ <glob pattern="sources.list"/>
+ </mime-type>
+</mime-info>
diff --git a/debian/rules b/debian/rules
index dbeb3dc4..a8da2355 100755
--- a/debian/rules
+++ b/debian/rules
@@ -62,6 +62,8 @@ binary-arch: build install
dh_installchangelogs ChangeLog
dh_installdocs
dh_scrollkeeper
+ dh_installmime
+ dh_desktop
dh_installexamples
# dh_install
# dh_installmenu
diff --git a/setup.py b/setup.py
index 6395dd28..ded9c30e 100755
--- a/setup.py
+++ b/setup.py
@@ -39,7 +39,8 @@ setup(name='update-manager',
],
scripts=[
'gnome-software-properties',
- 'update-manager'
+ 'update-manager',
+ 'add-software-channel'
],
data_files=[
('share/update-manager/glade',
@@ -56,6 +57,12 @@ setup(name='update-manager',
),
('share/pixmaps',
["data/update-manager.png"]
+ ),
+ ('share/applications',
+ ["data/mime/add-software-channel.desktop"]
+ ),
+ ('share/mime/packages',
+ ["data/mime/apt.xml"]
)
] + I18NFILES + HELPFILES,
)