From 372e249cb7ca0f7da468786f1d643cfc3905ffc6 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Mon, 31 Jul 2006 23:39:48 +0200 Subject: * moved aptsources into the Common directory --- DistUpgrade/DistUpgrade.glade | 2 +- DistUpgrade/build-tarball.sh | 2 +- SoftwareProperties/SoftwareProperties.py | 2 +- SoftwareProperties/aptsources.py | 665 ------------------------------ UpdateManager/Common/aptsources.py | 666 +++++++++++++++++++++++++++++++ po/ar.po | 2 +- po/bg.po | 2 +- po/bn.po | 2 +- po/br.po | 2 +- po/ca.po | 2 +- po/cs.po | 2 +- po/da.po | 2 +- po/de.po | 2 +- po/el.po | 2 +- po/en_AU.po | 2 +- po/en_CA.po | 2 +- po/en_GB.po | 2 +- po/es.po | 2 +- po/fi.po | 2 +- po/fr.po | 2 +- po/fur.po | 2 +- po/gl.po | 2 +- po/he.po | 2 +- po/hi.po | 2 +- po/hr.po | 2 +- po/hu.po | 2 +- po/id.po | 2 +- po/it.po | 2 +- po/ja.po | 2 +- po/ka.po | 2 +- po/ko.po | 2 +- po/ku.po | 2 +- po/lt.po | 2 +- po/mk.po | 2 +- po/ms.po | 2 +- po/nb.po | 2 +- po/ne.po | 2 +- po/nl.po | 2 +- po/no.po | 2 +- po/oc.po | 2 +- po/pa.po | 2 +- po/pl.po | 2 +- po/pt.po | 2 +- po/pt_BR.po | 2 +- po/ro.po | 2 +- po/ru.po | 2 +- po/rw.po | 2 +- po/sk.po | 2 +- po/sr.po | 2 +- po/sv.po | 2 +- po/th.po | 2 +- po/tr.po | 2 +- po/uk.po | 2 +- po/update-manager.pot | 2 +- po/ur.po | 2 +- po/urd.po | 2 +- po/vi.po | 2 +- po/xh.po | 2 +- po/zh_CN.po | 2 +- po/zh_HK.po | 2 +- po/zh_TW.po | 2 +- software-properties | 2 +- 62 files changed, 726 insertions(+), 725 deletions(-) delete mode 100644 SoftwareProperties/aptsources.py create mode 100644 UpdateManager/Common/aptsources.py diff --git a/DistUpgrade/DistUpgrade.glade b/DistUpgrade/DistUpgrade.glade index 91d5b33f..a31df120 100644 --- a/DistUpgrade/DistUpgrade.glade +++ b/DistUpgrade/DistUpgrade.glade @@ -38,7 +38,7 @@ True - <span weight="bold" size="x-large">Upgrading to Ubuntu 6.06 LTS</span> + <span weight="bold" size="x-large">Upgrading to Ubuntu 6.10</span> False True GTK_JUSTIFY_LEFT diff --git a/DistUpgrade/build-tarball.sh b/DistUpgrade/build-tarball.sh index a30e40a0..4f88b848 100755 --- a/DistUpgrade/build-tarball.sh +++ b/DistUpgrade/build-tarball.sh @@ -1,6 +1,6 @@ #!/bin/sh -DIST=dapper +DIST=edgy # cleanup rm -f *~ *.bak *.pyc *.moved '#'* diff --git a/SoftwareProperties/SoftwareProperties.py b/SoftwareProperties/SoftwareProperties.py index 35793151..18e5d260 100644 --- a/SoftwareProperties/SoftwareProperties.py +++ b/SoftwareProperties/SoftwareProperties.py @@ -38,7 +38,7 @@ import re from UpdateManager.Common.SimpleGladeApp import SimpleGladeApp from UpdateManager.Common.HelpViewer import HelpViewer -import aptsources +import UpdateManager.Common.aptsources as aptsources import dialog_add import dialog_edit import dialog_cache_outdated diff --git a/SoftwareProperties/aptsources.py b/SoftwareProperties/aptsources.py deleted file mode 100644 index a4d16fa0..00000000 --- a/SoftwareProperties/aptsources.py +++ /dev/null @@ -1,665 +0,0 @@ -# aptsource.py.in - parse sources.list -# -# Copyright (c) 2004,2005 Canonical -# 2004 Michiel Sikkes -# -# Author: Michiel Sikkes -# Michael Vogt -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 -# USA - -import string -import gettext -import re -import apt_pkg -import glob -import shutil -import time -import os.path - -#import pdb - -from UpdateManager.Common.DistInfo import DistInfo - - -# some global helpers -def is_mirror(master_uri, compare_uri): - """check if the given add_url is idential or a mirror of orig_uri - e.g. master_uri = archive.ubuntu.com - compare_uri = de.archive.ubuntu.com - -> True - """ - # remove traling spaces and "/" - compare_uri = compare_uri.rstrip("/ ") - master_uri = master_uri.rstrip("/ ") - # uri is identical - if compare_uri == master_uri: - #print "Identical" - return True - # add uri is a master site and orig_uri has the from "XX.mastersite" - # (e.g. de.archive.ubuntu.com) - try: - compare_srv = compare_uri.split("//")[1] - master_srv = master_uri.split("//")[1] - #print "%s == %s " % (add_srv, orig_srv) - except IndexError: # ok, somethings wrong here - #print "IndexError" - return False - # remove the leading "." (if any) and see if that helps - if "." in compare_srv and \ - compare_srv[compare_srv.index(".")+1:] == master_srv: - #print "Mirror" - return True - return False - -def uniq(s): - """ simple and efficient way to return uniq list """ - return list(set(s)) - - - -# actual source.list entries -class SourceEntry: - - def __init__(self, line,file=None): - self.invalid = False - self.disabled = False - self.type = "" - self.uri = "" - self.dist = "" - self.comps = [] - self.comment = "" - self.line = line - if file == None: - file = apt_pkg.Config.FindDir("Dir::Etc")+apt_pkg.Config.Find("Dir::Etc::sourcelist") - self.file = file - self.parse(line) - self.template = None - self.children = [] - - # works mostely like split but takes [] into account - def mysplit(self, line): - line = string.strip(line) - pieces = [] - tmp = "" - # we are inside a [..] block - p_found = False - space_found = False - for i in range(len(line)): - if line[i] == "[": - p_found=True - tmp += line[i] - elif line[i] == "]": - p_found=False - tmp += line[i] - elif space_found and not line[i].isspace(): # we skip one or more space - space_found = False - pieces.append(tmp) - tmp = line[i] - elif line[i].isspace() and not p_found: # found a whitespace - space_found = True - else: - tmp += line[i] - # append last piece - if len(tmp) > 0: - pieces.append(tmp) - return pieces - - - # parse a given source line and split it into the fields we need - def parse(self,line): - line = string.strip(self.line) - #print line - # check if the source is enabled/disabled - if line == "" or line == "#": # empty line - self.invalid = True - return - if line[0] == "#": - self.disabled = True - pieces = string.split(line[1:]) - # if it looks not like a disabled deb line return - if not (pieces[0] == "deb" or pieces[0] == "deb-src"): - self.invalid = True - return - else: - line = line[1:] - # check for another "#" in the line (this is treated as a comment) - i = line.find("#") - if i > 0: - self.comment = line[i+1:] - 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]) - if len(self.uri) < 1: - self.invalid = True - # distro and components (optional) - # Directory or distro - self.dist = string.strip(pieces[2]) - if len(pieces) > 3: - # List of components - self.comps = pieces[3:] - else: - self.comps = [] - - #print self.__dict__ - - - # set enabled/disabled - def set_enabled(self, new_value): - self.disabled = not new_value - # enable, remove all "#" from the start of the line - if new_value == True: - i=0 - self.line = string.lstrip(self.line) - while self.line[i] == "#": - i += 1 - self.line = self.line[i:] - else: - # disabled, add a "#" - if string.strip(self.line)[0] != "#": - self.line = "#" + self.line - - def __str__(self): - """ debug helper """ - return self.str().strip() - - def str(self): - """ return the current line as string """ - if self.invalid: - return self.line - line = "" - if self.disabled: - line = "# " - line += "%s %s %s" % (self.type, self.uri, self.dist) - if len(self.comps) > 0: - line += " " + " ".join(self.comps) - if self.comment != "": - line += " #"+self.comment - line += "\n" - return line - -# the SourceList file as a class -class SourcesList: - def __init__(self): - self.list = [] # of Type SourceEntries - self.matcher = SourceEntryMatcher() - self.refresh() - - def refresh(self): - self.list = [] - # read sources.list - dir = apt_pkg.Config.FindDir("Dir::Etc") - file = apt_pkg.Config.Find("Dir::Etc::sourcelist") - self.load(dir+file) - # read sources.list.d - partsdir = apt_pkg.Config.FindDir("Dir::Etc::sourceparts") - for file in glob.glob("%s/*.list" % partsdir): - self.load(file) - # check if the source item fits a predefined template - for source in self.list: - if source.invalid == False: - self.matcher.match(source) - - def __iter__(self): - for entry in self.list: - yield entry - raise StopIteration - - def add(self, type, uri, dist, comps, comment="", pos=-1, file=None): - """ - Add a new source to the sources.list. - The method will search for existing matching repos and will try to - reuse them as far as possible - """ - for source in self.list: - # if there is a repo with the same (type, uri, dist) just add the - # components - if source.disabled == False and source.invalid == False and \ - source.type == type and uri == source.uri and \ - source.dist == dist: - comps = uniq(source.comps + comps) - source.comps = comps - return source - # if there is a corresponding repo which is disabled, enable it - elif source.disabled == True and source.invalid == False and \ - source.type == type and uri == source.uri and \ - source.dist == dist and \ - len(set(source.comps) & set(comps)) == len(comps): - source.disabled = False - return source - # there isn't any matching source, so create a new line and parse it - line = "%s %s %s" % (type,uri,dist) - for c in comps: - line = line + " " + c; - if comment != "": - line = "%s #%s\n" %(line,comment) - line = line + "\n" - new_entry = SourceEntry(line) - if file != None: - new_entry.file = file - self.matcher.match(new_entry) - self.list.insert(pos, new_entry) - return new_entry - - def remove(self, source_entry): - self.list.remove(source_entry) - - def restoreBackup(self, backup_ext): - " restore 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): - shutil.copy(dir+file+backup_ext,dir+file) - # 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): - shutil.copy(file+backup_ext,file) - - def backup(self, backup_ext=None): - """ make a backup of the current source files, if no backup extension - is given, the current date/time is used (and returned) """ - already_backuped = set() - if backup_ext == None: - backup_ext = time.strftime("%y%m%d.%H%M") - for source in self.list: - if not source.file in already_backuped: - shutil.copy(source.file,"%s%s" % (source.file,backup_ext)) - return backup_ext - - def load(self,file): - """ (re)load the current sources """ - try: - f = open(file, "r") - lines = f.readlines() - for line in lines: - source = SourceEntry(line,file) - self.list.append(source) - except: - print "could not open file '%s'" % file - else: - f.close() - - def save(self): - """ save the current sources """ - files = {} - for source in self.list: - if not files.has_key(source.file): - files[source.file]=open(source.file,"w") - files[source.file].write(source.str()) - for f in files: - files[f].close() - - def check_for_relations(self, sources_list): - """get all parent and child channels in the sources list""" - parents = [] - used_child_templates = {} - for source in sources_list: - # try to avoid checking uninterressting sources - if source.template == None: - continue - # set up a dict with all used child templates and corresponding - # source entries - if source.template.child == True: - key = source.template - if not used_child_templates.has_key(key): - used_child_templates[key] = [] - temp = used_child_templates[key] - temp.append(source) - else: - # store each source with children aka. a parent :) - if len(source.template.children) > 0: - parents.append(source) - #print self.used_child_templates - #print self.parents - return (parents, used_child_templates) - -# templates for the add dialog -class SourceEntryTemplate(SourceEntry): - def __init__(self,a_type,uri,dist,description,comps): - self.comps_descriptions = [] - self.type = a_type - self.uri = uri - self.dist = dist - self.description = description - self.comps = comps - - def matches(self,source_entry): - """ check if a given source_entry matches this one """ - if (self.type != source_entry.type): - return False - if (self.dist != source_entry.dist): - return False - if not is_mirror(self.uri,source_entry.uri): - return False - for e_comp in source_entry.comps: - for t_comp in self.comps: - if e_comp == t_comp.name: break - else: - return False - return True - -class SourceCompTemplate: - def __init__(self, name, description, on_by_default): - self.name = name - self.description = description - self.on_by_default = on_by_default - -class SourceEntryTemplates: - def __init__(self,datadir): - _ = gettext.gettext - self.templates = [] - - dinfo = DistInfo (base_dir=datadir+"channels/") - - for suite in dinfo.suites: - comps = [] - for comp in suite.components: - comps.append(SourceCompTemplate(comp.name, _(comp.description), - comp.enabled)) - self.templates.append (SourceEntryTemplate(suite.repository_type, - suite.base_uri, - suite.name, - suite.description, - comps)) - -# matcher class to make a source entry look nice -# lots of predefined matchers to make it i18n/gettext friendly -class SourceEntryMatcher: - class MatchType: - def __init__(self, a_type,a_descr): - self.type = a_type - self.description = a_descr - - class MatchDist: - def __init__(self,a_uri,a_dist, a_descr,l_comps, l_comps_descr): - self.uri = a_uri - self.dist = a_dist - self.description = a_descr - self.comps = l_comps - self.comps_descriptions = l_comps_descr - - def __init__(self): - self.templates = [] - # Get the human readable channel and comp names from the channel .infos - spec_files = glob.glob("/usr/share/update-manager/channels/*.info") - for f in spec_files: - f = os.path.basename(f) - i = f.find(".info") - f = f[0:i] - dist = DistInfo(f) - for suite in dist.suites: - if suite.match_uri != None: - self.templates.append(suite) - return - - def match(self, source): - """Add a matching template to the source""" - _ = gettext.gettext - found = False - for template in self.templates: - #print "'%s'" %source.uri - if re.search(template.match_uri, source.uri) and \ - re.match(template.match_name, source.dist): - found = True - source.template = template - break - return found - -class Distribution: - def __init__(self): - """" - Container for distribution specific informations - """ - # LSB information - self.id = "" - self.codename = "" - self.description = "" - self.release = "" - - # get the LSB information - lsb_info = [] - for lsb_option in ["-i", "-c", "-d", "-r"]: - pipe = os.popen("lsb_release %s | cut -d : -f 2-" % lsb_option) - lsb_info.append(pipe.read().strip()) - del pipe - (self.id, self.codename, self.description, self.release) = lsb_info - - # get a list of country codes and real names - self.countries = {} - try: - f = open("/usr/share/iso-codes/iso_3166.tab", "r") - lines = f.readlines() - for line in lines: - parts = line.split("\t") - self.countries[parts[0].lower()] = parts[1] - except: - print "could not open file '%s'" % file - else: - f.close() - - def get_sources(self, sources_list): - """ - Find the corresponding template, main and child sources - for the distribution - """ - # corresponding sources - self.source_template = None - self.child_sources = [] - self.main_sources = [] - self.disabled_sources = [] - self.cdrom_sources = [] - self.download_comps = [] - self.enabled_comps = [] - self.cdrom_comps = [] - self.used_media = [] - self.get_source_code = False - self.source_code_sources = [] - - # location of the sources - self.default_server = "" - self.main_server = "" - self.nearest_server = "" - self.used_servers = [] - - # find the distro template - for template in sources_list.matcher.templates: - if template.name == self.codename and\ - template.distribution == self.id: - #print "yeah! found a template for %s" % self.description - #print template.description, template.base_uri, template.components - self.source_template = template - break - if self.source_template == None: - print "Error: could not find a distribution template" - # FIXME: will go away - only for debugging issues - sys.exit(1) - - # find main and child sources - media = [] - comps = [] - cdrom_comps = [] - enabled_comps = [] - source_code = [] - for source in sources_list.list: - if source.invalid == False and\ - source.dist == self.codename and\ - source.template and\ - source.template.name == self.codename: - #print "yeah! found a distro repo: %s" % source.line - # cdroms need do be handled differently - if source.uri.startswith("cdrom:") and \ - source.disabled == False: - self.cdrom_sources.append(source) - cdrom_comps.extend(source.comps) - elif source.uri.startswith("cdrom:") and \ - source.disabled == True: - self.cdrom_sources.append(source) - elif source.type == "deb" and source.disabled == False: - self.main_sources.append(source) - comps.extend(source.comps) - media.append(source.uri) - elif source.type == "deb" and source.disabled == True: - self.disabled_sources.append(source) - elif source.type.endswith("-src") and source.disabled == False: - self.source_code_sources.append(source) - elif source.type.endswith("-src") and source.disabled == True: - self.disabled_sources.append(source) - if source.template in self.source_template.children: - #print "yeah! child found: %s" % source.template.name - if source.type == "deb": - self.child_sources.append(source) - elif source.type == "deb-src": - self.source_code_sources.append(source) - self.download_comps = set(comps) - self.cdrom_comps = set(cdrom_comps) - enabled_comps.extend(comps) - enabled_comps.extend(cdrom_comps) - self.enabled_comps = set(enabled_comps) - self.used_media = set(media) - - self.get_mirrors() - - def get_mirrors(self): - """ - Provide a set of mirrors where you can get the distribution from - """ - # the main server is stored in the template - self.main_server = self.source_template.base_uri - - # try to guess the nearest mirror from the locale - # FIXME: for debian we need something different - if self.id == "Ubuntu": - locale = os.getenv("LANG", default="en.UK") - a = locale.find("_") - z = locale.find(".") - if z == -1: - z = len(locale) - country_code = locale[a+1:z].lower() - self.nearest_server = "http://%s.archive.ubuntu.com/ubuntu/" % \ - country_code - if self.countries.has_key(country_code): - self.country = self.countries[country_code] - else: - self.country = None - - # other used servers - for medium in self.used_media: - if not medium.startswith("cdrom:"): - # seems to be a network source - self.used_servers.append(medium) - - if len(self.main_sources) == 0: - self.default_server = self.main_server - else: - self.default_server = self.main_sources[0].uri - - def add_source(self, sources_list, type=None, - uri=None, dist=None, comps=None, comment=""): - """ - Add distribution specific sources - """ - if uri == None: - # FIXME: Add support for the server selector - uri = self.default_server - if dist == None: - dist = self.codename - if comps == None: - comps = list(self.enabled_comps) - if type == None: - type = "deb" - if comment == "": - comment == "Added by software-properties" - new_source = sources_list.add(type, uri, dist, comps, comment) - # if source code is enabled add a deb-src line after the new - # source - if self.get_source_code == True and not type.endswith("-src"): - sources_list.add("%s-src" % type, uri, dist, comps, comment, - file=new_source.file, - pos=sources_list.list.index(new_source)+1) - - def enable_component(self, sourceslist, comp): - """ - Disable a component in all main, child and source code sources - (excluding cdrom based sources) - - sourceslist: an aptsource.sources_list - comp: the component that should be enabled - """ - sources = [] - sources.extend(self.main_sources) - sources.extend(self.child_sources) - sources.extend(self.source_code_sources) - # check if there is a main source at all - if len(self.main_sources) < 1: - # create a new main source - self.add_source(sourceslist, comps=["%s"%comp]) - else: - # add the comp to all main, child and source code sources - for source in sources: - if comp not in source.comps: - source.comps.append(comp) - if self.get_source_code == True: - for source in self.source_code_sources: - if comp not in source.comps: source.comps.append(comp) - - def disable_component(self, sourceslist, comp): - """ - Disable a component in all main, child and source code sources - (excluding cdrom based sources) - """ - sources = [] - sources.extend(self.main_sources) - sources.extend(self.child_sources) - sources.extend(self.source_code_sources) - if comp in self.cdrom_comps: - sources = [] - sources.extend(self.main_sources) - - for source in sources: - if comp in source.comps: - source.comps.remove(comp) - if len(source.comps) < 1: - sourceslist.remove(source) - - -# some simple tests -if __name__ == "__main__": - apt_pkg.InitConfig() - sources = SourcesList() - - for entry in sources: - print entry.str() - #print entry.uri - - mirror = is_mirror("http://archive.ubuntu.com/ubuntu/", - "http://de.archive.ubuntu.com/ubuntu/") - print "is_mirror(): %s" % mirror - - print is_mirror("http://archive.ubuntu.com/ubuntu", - "http://de.archive.ubuntu.com/ubuntu/") diff --git a/UpdateManager/Common/aptsources.py b/UpdateManager/Common/aptsources.py new file mode 100644 index 00000000..fce06c2b --- /dev/null +++ b/UpdateManager/Common/aptsources.py @@ -0,0 +1,666 @@ +# aptsource.py.in - parse sources.list +# +# Copyright (c) 2004,2005 Canonical +# 2004 Michiel Sikkes +# +# Author: Michiel Sikkes +# Michael Vogt +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA + +import string +import gettext +import re +import apt_pkg +import glob +import shutil +import time +import os.path + +#import pdb + +from UpdateManager.Common.DistInfo import DistInfo + + +# some global helpers +def is_mirror(master_uri, compare_uri): + """check if the given add_url is idential or a mirror of orig_uri + e.g. master_uri = archive.ubuntu.com + compare_uri = de.archive.ubuntu.com + -> True + """ + # remove traling spaces and "/" + compare_uri = compare_uri.rstrip("/ ") + master_uri = master_uri.rstrip("/ ") + # uri is identical + if compare_uri == master_uri: + #print "Identical" + return True + # add uri is a master site and orig_uri has the from "XX.mastersite" + # (e.g. de.archive.ubuntu.com) + try: + compare_srv = compare_uri.split("//")[1] + master_srv = master_uri.split("//")[1] + #print "%s == %s " % (add_srv, orig_srv) + except IndexError: # ok, somethings wrong here + #print "IndexError" + return False + # remove the leading "." (if any) and see if that helps + if "." in compare_srv and \ + compare_srv[compare_srv.index(".")+1:] == master_srv: + #print "Mirror" + return True + return False + +def uniq(s): + """ simple and efficient way to return uniq list """ + return list(set(s)) + + + +# actual source.list entries +class SourceEntry: + + def __init__(self, line,file=None): + self.invalid = False + self.disabled = False + self.type = "" + self.uri = "" + self.dist = "" + self.comps = [] + self.comment = "" + self.line = line + if file == None: + file = apt_pkg.Config.FindDir("Dir::Etc")+apt_pkg.Config.Find("Dir::Etc::sourcelist") + self.file = file + self.parse(line) + self.template = None + self.children = [] + + # works mostely like split but takes [] into account + def mysplit(self, line): + line = string.strip(line) + pieces = [] + tmp = "" + # we are inside a [..] block + p_found = False + space_found = False + for i in range(len(line)): + if line[i] == "[": + p_found=True + tmp += line[i] + elif line[i] == "]": + p_found=False + tmp += line[i] + elif space_found and not line[i].isspace(): # we skip one or more space + space_found = False + pieces.append(tmp) + tmp = line[i] + elif line[i].isspace() and not p_found: # found a whitespace + space_found = True + else: + tmp += line[i] + # append last piece + if len(tmp) > 0: + pieces.append(tmp) + return pieces + + + # parse a given source line and split it into the fields we need + def parse(self,line): + line = string.strip(self.line) + #print line + # check if the source is enabled/disabled + if line == "" or line == "#": # empty line + self.invalid = True + return + if line[0] == "#": + self.disabled = True + pieces = string.split(line[1:]) + # if it looks not like a disabled deb line return + if not (pieces[0] == "deb" or pieces[0] == "deb-src"): + self.invalid = True + return + else: + line = line[1:] + # check for another "#" in the line (this is treated as a comment) + i = line.find("#") + if i > 0: + self.comment = line[i+1:] + 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]) + if len(self.uri) < 1: + self.invalid = True + # distro and components (optional) + # Directory or distro + self.dist = string.strip(pieces[2]) + if len(pieces) > 3: + # List of components + self.comps = pieces[3:] + else: + self.comps = [] + + #print self.__dict__ + + + # set enabled/disabled + def set_enabled(self, new_value): + self.disabled = not new_value + # enable, remove all "#" from the start of the line + if new_value == True: + i=0 + self.line = string.lstrip(self.line) + while self.line[i] == "#": + i += 1 + self.line = self.line[i:] + else: + # disabled, add a "#" + if string.strip(self.line)[0] != "#": + self.line = "#" + self.line + + def __str__(self): + """ debug helper """ + return self.str().strip() + + def str(self): + """ return the current line as string """ + if self.invalid: + return self.line + line = "" + if self.disabled: + line = "# " + line += "%s %s %s" % (self.type, self.uri, self.dist) + if len(self.comps) > 0: + line += " " + " ".join(self.comps) + if self.comment != "": + line += " #"+self.comment + line += "\n" + return line + +# the SourceList file as a class +class SourcesList: + def __init__(self, withMatcher=True): + self.list = [] # of Type SourceEntries + if withMatcher: + self.matcher = SourceEntryMatcher() + self.refresh() + + def refresh(self): + self.list = [] + # read sources.list + dir = apt_pkg.Config.FindDir("Dir::Etc") + file = apt_pkg.Config.Find("Dir::Etc::sourcelist") + self.load(dir+file) + # read sources.list.d + partsdir = apt_pkg.Config.FindDir("Dir::Etc::sourceparts") + for file in glob.glob("%s/*.list" % partsdir): + self.load(file) + # check if the source item fits a predefined template + for source in self.list: + if source.invalid == False: + self.matcher.match(source) + + def __iter__(self): + for entry in self.list: + yield entry + raise StopIteration + + def add(self, type, uri, dist, comps, comment="", pos=-1, file=None): + """ + Add a new source to the sources.list. + The method will search for existing matching repos and will try to + reuse them as far as possible + """ + for source in self.list: + # if there is a repo with the same (type, uri, dist) just add the + # components + if source.disabled == False and source.invalid == False and \ + source.type == type and uri == source.uri and \ + source.dist == dist: + comps = uniq(source.comps + comps) + source.comps = comps + return source + # if there is a corresponding repo which is disabled, enable it + elif source.disabled == True and source.invalid == False and \ + source.type == type and uri == source.uri and \ + source.dist == dist and \ + len(set(source.comps) & set(comps)) == len(comps): + source.disabled = False + return source + # there isn't any matching source, so create a new line and parse it + line = "%s %s %s" % (type,uri,dist) + for c in comps: + line = line + " " + c; + if comment != "": + line = "%s #%s\n" %(line,comment) + line = line + "\n" + new_entry = SourceEntry(line) + if file != None: + new_entry.file = file + self.matcher.match(new_entry) + self.list.insert(pos, new_entry) + return new_entry + + def remove(self, source_entry): + self.list.remove(source_entry) + + def restoreBackup(self, backup_ext): + " restore 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): + shutil.copy(dir+file+backup_ext,dir+file) + # 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): + shutil.copy(file+backup_ext,file) + + def backup(self, backup_ext=None): + """ make a backup of the current source files, if no backup extension + is given, the current date/time is used (and returned) """ + already_backuped = set() + if backup_ext == None: + backup_ext = time.strftime("%y%m%d.%H%M") + for source in self.list: + if not source.file in already_backuped: + shutil.copy(source.file,"%s%s" % (source.file,backup_ext)) + return backup_ext + + def load(self,file): + """ (re)load the current sources """ + try: + f = open(file, "r") + lines = f.readlines() + for line in lines: + source = SourceEntry(line,file) + self.list.append(source) + except: + print "could not open file '%s'" % file + else: + f.close() + + def save(self): + """ save the current sources """ + files = {} + for source in self.list: + if not files.has_key(source.file): + files[source.file]=open(source.file,"w") + files[source.file].write(source.str()) + for f in files: + files[f].close() + + def check_for_relations(self, sources_list): + """get all parent and child channels in the sources list""" + parents = [] + used_child_templates = {} + for source in sources_list: + # try to avoid checking uninterressting sources + if source.template == None: + continue + # set up a dict with all used child templates and corresponding + # source entries + if source.template.child == True: + key = source.template + if not used_child_templates.has_key(key): + used_child_templates[key] = [] + temp = used_child_templates[key] + temp.append(source) + else: + # store each source with children aka. a parent :) + if len(source.template.children) > 0: + parents.append(source) + #print self.used_child_templates + #print self.parents + return (parents, used_child_templates) + +# templates for the add dialog +class SourceEntryTemplate(SourceEntry): + def __init__(self,a_type,uri,dist,description,comps): + self.comps_descriptions = [] + self.type = a_type + self.uri = uri + self.dist = dist + self.description = description + self.comps = comps + + def matches(self,source_entry): + """ check if a given source_entry matches this one """ + if (self.type != source_entry.type): + return False + if (self.dist != source_entry.dist): + return False + if not is_mirror(self.uri,source_entry.uri): + return False + for e_comp in source_entry.comps: + for t_comp in self.comps: + if e_comp == t_comp.name: break + else: + return False + return True + +class SourceCompTemplate: + def __init__(self, name, description, on_by_default): + self.name = name + self.description = description + self.on_by_default = on_by_default + +class SourceEntryTemplates: + def __init__(self,datadir): + _ = gettext.gettext + self.templates = [] + + dinfo = DistInfo (base_dir=datadir+"channels/") + + for suite in dinfo.suites: + comps = [] + for comp in suite.components: + comps.append(SourceCompTemplate(comp.name, _(comp.description), + comp.enabled)) + self.templates.append (SourceEntryTemplate(suite.repository_type, + suite.base_uri, + suite.name, + suite.description, + comps)) + +# matcher class to make a source entry look nice +# lots of predefined matchers to make it i18n/gettext friendly +class SourceEntryMatcher: + class MatchType: + def __init__(self, a_type,a_descr): + self.type = a_type + self.description = a_descr + + class MatchDist: + def __init__(self,a_uri,a_dist, a_descr,l_comps, l_comps_descr): + self.uri = a_uri + self.dist = a_dist + self.description = a_descr + self.comps = l_comps + self.comps_descriptions = l_comps_descr + + def __init__(self): + self.templates = [] + # Get the human readable channel and comp names from the channel .infos + spec_files = glob.glob("/usr/share/update-manager/channels/*.info") + for f in spec_files: + f = os.path.basename(f) + i = f.find(".info") + f = f[0:i] + dist = DistInfo(f) + for suite in dist.suites: + if suite.match_uri != None: + self.templates.append(suite) + return + + def match(self, source): + """Add a matching template to the source""" + _ = gettext.gettext + found = False + for template in self.templates: + #print "'%s'" %source.uri + if re.search(template.match_uri, source.uri) and \ + re.match(template.match_name, source.dist): + found = True + source.template = template + break + return found + +class Distribution: + def __init__(self): + """" + Container for distribution specific informations + """ + # LSB information + self.id = "" + self.codename = "" + self.description = "" + self.release = "" + + # get the LSB information + lsb_info = [] + for lsb_option in ["-i", "-c", "-d", "-r"]: + pipe = os.popen("lsb_release %s | cut -d : -f 2-" % lsb_option) + lsb_info.append(pipe.read().strip()) + del pipe + (self.id, self.codename, self.description, self.release) = lsb_info + + # get a list of country codes and real names + self.countries = {} + try: + f = open("/usr/share/iso-codes/iso_3166.tab", "r") + lines = f.readlines() + for line in lines: + parts = line.split("\t") + self.countries[parts[0].lower()] = parts[1] + except: + print "could not open file '%s'" % file + else: + f.close() + + def get_sources(self, sources_list): + """ + Find the corresponding template, main and child sources + for the distribution + """ + # corresponding sources + self.source_template = None + self.child_sources = [] + self.main_sources = [] + self.disabled_sources = [] + self.cdrom_sources = [] + self.download_comps = [] + self.enabled_comps = [] + self.cdrom_comps = [] + self.used_media = [] + self.get_source_code = False + self.source_code_sources = [] + + # location of the sources + self.default_server = "" + self.main_server = "" + self.nearest_server = "" + self.used_servers = [] + + # find the distro template + for template in sources_list.matcher.templates: + if template.name == self.codename and\ + template.distribution == self.id: + #print "yeah! found a template for %s" % self.description + #print template.description, template.base_uri, template.components + self.source_template = template + break + if self.source_template == None: + print "Error: could not find a distribution template" + # FIXME: will go away - only for debugging issues + sys.exit(1) + + # find main and child sources + media = [] + comps = [] + cdrom_comps = [] + enabled_comps = [] + source_code = [] + for source in sources_list.list: + if source.invalid == False and\ + source.dist == self.codename and\ + source.template and\ + source.template.name == self.codename: + #print "yeah! found a distro repo: %s" % source.line + # cdroms need do be handled differently + if source.uri.startswith("cdrom:") and \ + source.disabled == False: + self.cdrom_sources.append(source) + cdrom_comps.extend(source.comps) + elif source.uri.startswith("cdrom:") and \ + source.disabled == True: + self.cdrom_sources.append(source) + elif source.type == "deb" and source.disabled == False: + self.main_sources.append(source) + comps.extend(source.comps) + media.append(source.uri) + elif source.type == "deb" and source.disabled == True: + self.disabled_sources.append(source) + elif source.type.endswith("-src") and source.disabled == False: + self.source_code_sources.append(source) + elif source.type.endswith("-src") and source.disabled == True: + self.disabled_sources.append(source) + if source.template in self.source_template.children: + #print "yeah! child found: %s" % source.template.name + if source.type == "deb": + self.child_sources.append(source) + elif source.type == "deb-src": + self.source_code_sources.append(source) + self.download_comps = set(comps) + self.cdrom_comps = set(cdrom_comps) + enabled_comps.extend(comps) + enabled_comps.extend(cdrom_comps) + self.enabled_comps = set(enabled_comps) + self.used_media = set(media) + + self.get_mirrors() + + def get_mirrors(self): + """ + Provide a set of mirrors where you can get the distribution from + """ + # the main server is stored in the template + self.main_server = self.source_template.base_uri + + # try to guess the nearest mirror from the locale + # FIXME: for debian we need something different + if self.id == "Ubuntu": + locale = os.getenv("LANG", default="en.UK") + a = locale.find("_") + z = locale.find(".") + if z == -1: + z = len(locale) + country_code = locale[a+1:z].lower() + self.nearest_server = "http://%s.archive.ubuntu.com/ubuntu/" % \ + country_code + if self.countries.has_key(country_code): + self.country = self.countries[country_code] + else: + self.country = None + + # other used servers + for medium in self.used_media: + if not medium.startswith("cdrom:"): + # seems to be a network source + self.used_servers.append(medium) + + if len(self.main_sources) == 0: + self.default_server = self.main_server + else: + self.default_server = self.main_sources[0].uri + + def add_source(self, sources_list, type=None, + uri=None, dist=None, comps=None, comment=""): + """ + Add distribution specific sources + """ + if uri == None: + # FIXME: Add support for the server selector + uri = self.default_server + if dist == None: + dist = self.codename + if comps == None: + comps = list(self.enabled_comps) + if type == None: + type = "deb" + if comment == "": + comment == "Added by software-properties" + new_source = sources_list.add(type, uri, dist, comps, comment) + # if source code is enabled add a deb-src line after the new + # source + if self.get_source_code == True and not type.endswith("-src"): + sources_list.add("%s-src" % type, uri, dist, comps, comment, + file=new_source.file, + pos=sources_list.list.index(new_source)+1) + + def enable_component(self, sourceslist, comp): + """ + Disable a component in all main, child and source code sources + (excluding cdrom based sources) + + sourceslist: an aptsource.sources_list + comp: the component that should be enabled + """ + sources = [] + sources.extend(self.main_sources) + sources.extend(self.child_sources) + sources.extend(self.source_code_sources) + # check if there is a main source at all + if len(self.main_sources) < 1: + # create a new main source + self.add_source(sourceslist, comps=["%s"%comp]) + else: + # add the comp to all main, child and source code sources + for source in sources: + if comp not in source.comps: + source.comps.append(comp) + if self.get_source_code == True: + for source in self.source_code_sources: + if comp not in source.comps: source.comps.append(comp) + + def disable_component(self, sourceslist, comp): + """ + Disable a component in all main, child and source code sources + (excluding cdrom based sources) + """ + sources = [] + sources.extend(self.main_sources) + sources.extend(self.child_sources) + sources.extend(self.source_code_sources) + if comp in self.cdrom_comps: + sources = [] + sources.extend(self.main_sources) + + for source in sources: + if comp in source.comps: + source.comps.remove(comp) + if len(source.comps) < 1: + sourceslist.remove(source) + + +# some simple tests +if __name__ == "__main__": + apt_pkg.InitConfig() + sources = SourcesList() + + for entry in sources: + print entry.str() + #print entry.uri + + mirror = is_mirror("http://archive.ubuntu.com/ubuntu/", + "http://de.archive.ubuntu.com/ubuntu/") + print "is_mirror(): %s" % mirror + + print is_mirror("http://archive.ubuntu.com/ubuntu", + "http://de.archive.ubuntu.com/ubuntu/") diff --git a/po/ar.po b/po/ar.po index cbcf3459..b25550fa 100644 --- a/po/ar.po +++ b/po/ar.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-23 19:46+0000\n" "Last-Translator: Jadmadi \n" "Language-Team: Arabic \n" diff --git a/po/bg.po b/po/bg.po index 83cf9797..de6df323 100644 --- a/po/bg.po +++ b/po/bg.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-23 19:40+0000\n" "Last-Translator: Nikola Kasabov \n" "Language-Team: Bulgarian \n" diff --git a/po/bn.po b/po/bn.po index 199defa6..dcd7a2fb 100644 --- a/po/bn.po +++ b/po/bn.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-26 12:09+0000\n" "Last-Translator: Khandakar Mujahidul Islam \n" "Language-Team: Bengali \n" diff --git a/po/br.po b/po/br.po index d68c230c..784f625b 100644 --- a/po/br.po +++ b/po/br.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-19 02:42+0000\n" "Last-Translator: Oublieuse \n" "Language-Team: Breton \n" diff --git a/po/ca.po b/po/ca.po index f2987b80..6da4ed56 100644 --- a/po/ca.po +++ b/po/ca.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-29 21:18+0000\n" "Last-Translator: Jordi Irazuzta \n" "Language-Team: Catalan \n" diff --git a/po/cs.po b/po/cs.po index 73071fc3..9387e60b 100644 --- a/po/cs.po +++ b/po/cs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-25 18:52+0000\n" "Last-Translator: Tomáš Hála \n" "Language-Team: Czech \n" diff --git a/po/da.po b/po/da.po index aed71b7e..8d2981b1 100644 --- a/po/da.po +++ b/po/da.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-23 19:41+0000\n" "Last-Translator: Mathias-K \n" "Language-Team: Danish \n" diff --git a/po/de.po b/po/de.po index 51276339..412385d2 100644 --- a/po/de.po +++ b/po/de.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-27 10:58+0000\n" "Last-Translator: Sebastian Heinlein \n" "Language-Team: German GNOME Translations \n" diff --git a/po/el.po b/po/el.po index 253457db..df431e8b 100644 --- a/po/el.po +++ b/po/el.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: el\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-25 15:39+0000\n" "Last-Translator: Kostas Papadimas \n" "Language-Team: Greek \n" diff --git a/po/en_AU.po b/po/en_AU.po index 0cfccae4..983a7e36 100644 --- a/po/en_AU.po +++ b/po/en_AU.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-26 21:06+0000\n" "Last-Translator: David Symons \n" "Language-Team: English (Australia) \n" diff --git a/po/en_CA.po b/po/en_CA.po index 6f6246f2..ea0eb274 100644 --- a/po/en_CA.po +++ b/po/en_CA.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-23 19:41+0000\n" "Last-Translator: Adam Weinberger \n" "Language-Team: Canadian English \n" diff --git a/po/en_GB.po b/po/en_GB.po index dcea5c7d..42f56e94 100644 --- a/po/en_GB.po +++ b/po/en_GB.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-23 19:41+0000\n" "Last-Translator: Abigail Brady \n" "Language-Team: \n" diff --git a/po/es.po b/po/es.po index 97430b97..8be24196 100644 --- a/po/es.po +++ b/po/es.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: es\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-26 09:38+0000\n" "Last-Translator: Ricardo Pérez López \n" "Language-Team: Spanish \n" diff --git a/po/fi.po b/po/fi.po index b01d2588..4fb7509c 100644 --- a/po/fi.po +++ b/po/fi.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-25 18:26+0000\n" "Last-Translator: Timo Jyrinki \n" "Language-Team: Finnish \n" diff --git a/po/fr.po b/po/fr.po index 519fef68..d3d1746a 100644 --- a/po/fr.po +++ b/po/fr.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager 0.37.2\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-26 21:09+0000\n" "Last-Translator: Claude Paroz \n" "Language-Team: French \n" diff --git a/po/fur.po b/po/fur.po index 3c3aedae..256127d4 100644 --- a/po/fur.po +++ b/po/fur.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-30 14:37+0000\n" "Last-Translator: marcuz \n" "Language-Team: Friulian \n" diff --git a/po/gl.po b/po/gl.po index e0da8cea..1370f0da 100644 --- a/po/gl.po +++ b/po/gl.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gl\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-23 19:42+0000\n" "Last-Translator: Ignacio Casal Quinteiro \n" "Language-Team: Galego\n" diff --git a/po/he.po b/po/he.po index d489f76d..2b3b0c3b 100644 --- a/po/he.po +++ b/po/he.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager.HEAD\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-30 11:15+0000\n" "Last-Translator: Yaniv Abir \n" "Language-Team: Hebrew \n" diff --git a/po/hi.po b/po/hi.po index 8d75639f..d0862c24 100644 --- a/po/hi.po +++ b/po/hi.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-23 19:46+0000\n" "Last-Translator: Rosetta Administrators \n" "Language-Team: Hindi \n" diff --git a/po/hr.po b/po/hr.po index 6082643e..85aa2a13 100644 --- a/po/hr.po +++ b/po/hr.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-24 20:54+0000\n" "Last-Translator: Ante Karamatić \n" "Language-Team: Croatian \n" diff --git a/po/hu.po b/po/hu.po index fa0ec160..a124cc27 100644 --- a/po/hu.po +++ b/po/hu.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager.HEAD\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-28 21:22+0000\n" "Last-Translator: Gabor Kelemen \n" "Language-Team: Hungarian \n" diff --git a/po/id.po b/po/id.po index c15dbb90..6f8f1983 100644 --- a/po/id.po +++ b/po/id.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-28 18:46+0000\n" "Last-Translator: Andy Apdhani \n" "Language-Team: Indonesian \n" diff --git a/po/it.po b/po/it.po index b5004cf1..f61c58f9 100644 --- a/po/it.po +++ b/po/it.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-24 14:01+0000\n" "Last-Translator: Luca Ferretti \n" "Language-Team: Italian \n" diff --git a/po/ja.po b/po/ja.po index 7eca8a7a..448e8696 100644 --- a/po/ja.po +++ b/po/ja.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager 0.42.4\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-24 07:06+0000\n" "Last-Translator: Ikuya Awashiro \n" "Language-Team: Ubuntu Japanese Team \n" diff --git a/po/ka.po b/po/ka.po index 47e5af28..0e776ab9 100644 --- a/po/ka.po +++ b/po/ka.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-23 19:19+0000\n" "Last-Translator: Vladimer Sichinava \n" "Language-Team: Georgian \n" diff --git a/po/ko.po b/po/ko.po index e2e9df5c..227b519f 100644 --- a/po/ko.po +++ b/po/ko.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-28 15:14+0000\n" "Last-Translator: darehanl \n" "Language-Team: Korean \n" diff --git a/po/ku.po b/po/ku.po index 0bd54299..42644134 100644 --- a/po/ku.po +++ b/po/ku.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-23 19:43+0000\n" "Last-Translator: Erdal Ronahi \n" "Language-Team: Kurdish \n" diff --git a/po/lt.po b/po/lt.po index 5bd29c07..0e5df421 100644 --- a/po/lt.po +++ b/po/lt.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager HEAD\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-28 20:07+0000\n" "Last-Translator: Mantas Kriaučiūnas \n" "Language-Team: Lithuanian \n" diff --git a/po/mk.po b/po/mk.po index b98bde16..3ca8f9bb 100644 --- a/po/mk.po +++ b/po/mk.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mk\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-23 19:43+0000\n" "Last-Translator: Арангел Ангов \n" "Language-Team: Macedonian \n" diff --git a/po/ms.po b/po/ms.po index 7510b364..baba9a1a 100644 --- a/po/ms.po +++ b/po/ms.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-30 13:49+0000\n" "Last-Translator: azlinux \n" "Language-Team: Malay \n" diff --git a/po/nb.po b/po/nb.po index d4ce9cdf..0edbc0c9 100644 --- a/po/nb.po +++ b/po/nb.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: nb\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-29 13:06+0000\n" "Last-Translator: Hans Petter Birkeland \n" "Language-Team: Norwegian Bokmal \n" diff --git a/po/ne.po b/po/ne.po index 92d0bfd2..cbef83ef 100644 --- a/po/ne.po +++ b/po/ne.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager.HEAD\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-23 19:43+0000\n" "Last-Translator: Jaydeep Bhusal \n" "Language-Team: Nepali \n" diff --git a/po/nl.po b/po/nl.po index e99d3fb7..9efe0175 100644 --- a/po/nl.po +++ b/po/nl.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager HEAD\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-24 01:32+0000\n" "Last-Translator: Tino Meinen \n" "Language-Team: Nederlands \n" diff --git a/po/no.po b/po/no.po index 45e77058..1b04ca84 100644 --- a/po/no.po +++ b/po/no.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: nb\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2005-06-08 23:10+0200\n" "Last-Translator: Terance Edward Sola \n" "Language-Team: Norwegian Bokmal \n" diff --git a/po/oc.po b/po/oc.po index c5f21fd3..a2209808 100644 --- a/po/oc.po +++ b/po/oc.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-29 08:11+0000\n" "Last-Translator: Yannig MARCHEGAY (Kokoyaya) \n" diff --git a/po/pa.po b/po/pa.po index 45b445c9..3e5fd974 100644 --- a/po/pa.po +++ b/po/pa.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: pa\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-04-28 23:31+0000\n" "Last-Translator: Amanpreet Singh Alam \n" "Language-Team: Punjabi \n" diff --git a/po/pl.po b/po/pl.po index b3a03e01..b37d0d39 100644 --- a/po/pl.po +++ b/po/pl.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager cvs\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-23 19:59+0000\n" "Last-Translator: Tomasz Dominikowski \n" "Language-Team: Polish \n" diff --git a/po/pt.po b/po/pt.po index 2144bab4..1e9fe9db 100644 --- a/po/pt.po +++ b/po/pt.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-24 10:17+0000\n" "Last-Translator: Joao Carvalhinho \n" "Language-Team: Ubuntu Portuguese Team \n" diff --git a/po/pt_BR.po b/po/pt_BR.po index 3ab912a9..cb3c8c2c 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-26 22:31+0000\n" "Last-Translator: KurtKraut \n" "Language-Team: Ubuntu-BR \n" diff --git a/po/ro.po b/po/ro.po index 1e0d1589..e73adf0f 100644 --- a/po/ro.po +++ b/po/ro.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-24 17:39+0000\n" "Last-Translator: Sami POTIRCA \n" "Language-Team: Romanian \n" diff --git a/po/ru.po b/po/ru.po index e873db5a..c14af2cf 100644 --- a/po/ru.po +++ b/po/ru.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-25 19:23+0000\n" "Last-Translator: Igor Zubarev \n" "Language-Team: Russian \n" diff --git a/po/rw.po b/po/rw.po index 931052ca..abba200e 100644 --- a/po/rw.po +++ b/po/rw.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager HEAD\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-23 19:44+0000\n" "Last-Translator: Steve Murphy \n" "Language-Team: Kinyarwanda \n" diff --git a/po/sk.po b/po/sk.po index acb12569..974215ac 100644 --- a/po/sk.po +++ b/po/sk.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-24 17:32+0000\n" "Last-Translator: Peter Chabada \n" "Language-Team: Slovak \n" diff --git a/po/sr.po b/po/sr.po index f6e75a7b..7a432396 100644 --- a/po/sr.po +++ b/po/sr.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-27 12:27+0000\n" "Last-Translator: Dejan Milosavljevic \n" "Language-Team: Serbian \n" diff --git a/po/sv.po b/po/sv.po index 6c187227..03fe3e20 100644 --- a/po/sv.po +++ b/po/sv.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-23 19:18+0000\n" "Last-Translator: Robin Sonefors \n" "Language-Team: Swedish \n" diff --git a/po/th.po b/po/th.po index 9cf2d41a..d42d3b0f 100644 --- a/po/th.po +++ b/po/th.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-24 16:44+0000\n" "Last-Translator: Roys Hengwatanakul \n" "Language-Team: Thai \n" diff --git a/po/tr.po b/po/tr.po index 8ffe6754..e8018237 100644 --- a/po/tr.po +++ b/po/tr.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-23 19:45+0000\n" "Last-Translator: Özgur KIRCALI \n" "Language-Team: Turkish \n" diff --git a/po/uk.po b/po/uk.po index f996843e..322af381 100644 --- a/po/uk.po +++ b/po/uk.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-23 19:45+0000\n" "Last-Translator: Serhey Kusyumoff \n" "Language-Team: Ukrainian \n" diff --git a/po/update-manager.pot b/po/update-manager.pot index f2e00f38..897a7804 100644 --- a/po/update-manager.pot +++ b/po/update-manager.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/po/ur.po b/po/ur.po index 18ebec55..3464b679 100644 --- a/po/ur.po +++ b/po/ur.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-19 02:46+0000\n" "Last-Translator: Hameed محمد حمید \n" "Language-Team: Urdu \n" diff --git a/po/urd.po b/po/urd.po index 27d954c5..18e68cec 100644 --- a/po/urd.po +++ b/po/urd.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-07 01:53+0000\n" "Last-Translator: Hameed محمد حمید \n" "Language-Team: Urdu \n" diff --git a/po/vi.po b/po/vi.po index 025b54ed..c03e91e0 100644 --- a/po/vi.po +++ b/po/vi.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager Gnome HEAD\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-23 19:45+0000\n" "Last-Translator: Tran The Trung \n" "Language-Team: Vietnamese \n" diff --git a/po/xh.po b/po/xh.po index 86d1c4df..e519731a 100644 --- a/po/xh.po +++ b/po/xh.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: update-notifier\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-04-20 19:15+0000\n" "Last-Translator: Canonical Ltd \n" "Language-Team: Xhosa \n" diff --git a/po/zh_CN.po b/po/zh_CN.po index 9f78ebe5..d9e7edab 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager HEAD\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-30 14:16+0000\n" "Last-Translator: catinsnow \n" "Language-Team: zh_CN \n" diff --git a/po/zh_HK.po b/po/zh_HK.po index 4322ad56..b89955ac 100644 --- a/po/zh_HK.po +++ b/po/zh_HK.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager 0.41.1\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-23 19:45+0000\n" "Last-Translator: Abel Cheung \n" "Language-Team: Chinese (traditional) \n" diff --git a/po/zh_TW.po b/po/zh_TW.po index 0400bb12..5d0bb9d7 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: update-manager 0.41.1\n" "Report-Msgid-Bugs-To: sebastian.heinlein@web.de\n" -"POT-Creation-Date: 2006-07-31 18:12+0200\n" +"POT-Creation-Date: 2006-07-31 21:12+0200\n" "PO-Revision-Date: 2006-05-31 12:00+0000\n" "Last-Translator: PCMan \n" "Language-Team: Chinese (Taiwan) \n" diff --git a/software-properties b/software-properties index 6c38d073..129c3085 100644 --- a/software-properties +++ b/software-properties @@ -34,7 +34,7 @@ import sys from optparse import OptionParser -import SoftwareProperties.aptsources as aptsources +import UpdateManager.Common.aptsources as aptsources #sys.path.append("@prefix@/share/update-manager/python") -- cgit v1.2.3