84
88
# on broken packages, try to fix via saveDistUpgrade()
85
89
if self._depcache.broken_count > 0:
86
90
self.saveDistUpgrade()
87
assert (self._depcache.broken_count == 0
88
and self._depcache.del_count == 0)
92
self._depcache.broken_count == 0 and self._depcache.del_count == 0
89
94
self.launchpad = None
90
95
# generate versioned_kernel_pkgs_regexp for later use
91
96
apt_versioned_kernel_pkgs = apt_pkg.config.value_list(
92
"APT::VersionedKernelPackages")
97
"APT::VersionedKernelPackages"
93
99
if apt_versioned_kernel_pkgs:
94
self.versioned_kernel_pkgs_regexp = re.compile("(" + "|".join(
95
["^" + p for p in apt_versioned_kernel_pkgs]) + ")")
100
self.versioned_kernel_pkgs_regexp = re.compile(
102
+ "|".join(["^" + p for p in apt_versioned_kernel_pkgs])
96
105
running_kernel_version = subprocess.check_output(
97
["uname", "-r"], universal_newlines=True).rstrip()
98
self.running_kernel_pkgs_regexp = re.compile("(" + "|".join(
99
[("^" + p + ".*" + running_kernel_version)
100
if not p.startswith(".*") else (running_kernel_version + p)
101
for p in apt_versioned_kernel_pkgs]) + ")")
106
["uname", "-r"], universal_newlines=True
108
self.running_kernel_pkgs_regexp = re.compile(
112
("^" + p + ".*" + running_kernel_version)
113
if not p.startswith(".*")
114
else (running_kernel_version + p)
115
for p in apt_versioned_kernel_pkgs
103
121
self.versioned_kernel_pkgs_regexp = None
104
122
self.running_kernel_pkgs_regexp = None
108
126
test if the dpkg journal is dirty
109
127
(similar to debSystem::CheckUpdates)
112
apt_pkg.config.find_file("Dir::State::status")) + "/updates"
130
os.path.dirname(apt_pkg.config.find_file("Dir::State::status"))
113
133
for f in os.listdir(d):
114
134
if re.match("[0-9]+", f):
118
138
def _initDepCache(self):
119
#apt_pkg.config.set("Debug::pkgPolicy","1")
120
#self.depcache = apt_pkg.GetDepCache(self.cache)
121
#self._depcache = apt_pkg.GetDepCache(self._cache)
139
# apt_pkg.config.set("Debug::pkgPolicy","1")
140
# self.depcache = apt_pkg.GetDepCache(self.cache)
141
# self._depcache = apt_pkg.GetDepCache(self._cache)
122
142
self._depcache.read_pinfile()
123
143
if os.path.exists(SYNAPTIC_PINFILE):
124
144
self._depcache.read_pinfile(SYNAPTIC_PINFILE)
169
192
for cpkg in self:
170
193
candidate = cpkg.candidate
171
194
if candidate is not None:
172
if (self._check_dependencies(
173
target, candidate.get_dependencies("Conflicts"))
174
and self._check_dependencies(
175
target, candidate.get_dependencies("Replaces"))):
195
if self._check_dependencies(
196
target, candidate.get_dependencies("Conflicts")
197
) and self._check_dependencies(
198
target, candidate.get_dependencies("Replaces")
177
"%s Conflicts/Replaces %s; allowing removal" % (
178
candidate.package.shortname, pkg.shortname))
201
"%s Conflicts/Replaces %s; allowing removal"
202
% (candidate.package.shortname, pkg.shortname)
182
207
def saveDistUpgrade(self):
183
""" this functions mimics a upgrade but will never remove anything """
184
#self._apply_dselect_upgrade()
208
"""this functions mimics a upgrade but will never remove anything"""
209
# self._apply_dselect_upgrade()
185
210
self._depcache.upgrade(True)
186
211
wouldDelete = self._depcache.del_count
187
212
if wouldDelete > 0:
193
218
if wouldDelete > 0:
195
assert (self._depcache.broken_count == 0
196
and self._depcache.del_count == 0)
221
self._depcache.broken_count == 0
222
and self._depcache.del_count == 0
198
225
assert self._depcache.broken_count == 0
199
#self._apply_dselect_upgrade()
226
# self._apply_dselect_upgrade()
200
227
self._depcache.upgrade()
201
228
return wouldDelete
203
230
def _strip_epoch(self, verstr):
204
" strip of the epoch "
205
232
vers_no_epoch = verstr.split(":")
206
233
if len(vers_no_epoch) > 1:
207
234
verstr = "".join(vers_no_epoch[1:])
210
def _get_changelog_or_news(self, name, fname, strict_versioning=False,
211
changelogs_uri=None):
212
" helper that fetches the file in question "
237
def _get_changelog_or_news(
238
self, name, fname, strict_versioning=False, changelogs_uri=None
240
"helper that fetches the file in question"
213
241
# don't touch the gui in this function, it needs to be thread-safe
319
359
# Login on launchpad if we are not already
320
360
if self.launchpad is None:
321
self.launchpad = Launchpad.login_anonymously('update-manager',
361
self.launchpad = Launchpad.login_anonymously(
362
"update-manager", "production", version="devel"
325
365
archive = self.launchpad.archives.getByReference(
326
reference='~%s/ubuntu/%s' % (user, ppa)
366
reference="~%s/ubuntu/%s" % (user, ppa)
328
368
if archive is None:
329
logging.error("Unable to retrieve the archive from the Launchpad "
370
"Unable to retrieve the archive from the Launchpad API."
333
spphs = archive.getPublishedSources(source_name=cdt.source_name,
335
version=cdt.source_version)
374
spphs = archive.getPublishedSources(
375
source_name=cdt.source_name,
377
version=cdt.source_version,
337
logging.error("No published sources were retrieved from the "
381
"No published sources were retrieved from the "
341
386
return spphs[0].changelogUrl()
390
435
# Special case for PPAs
391
436
changelogs_uri_ppa = None
392
437
for origin in origins:
393
if origin.origin.startswith('LP-PPA-'):
438
if origin.origin.startswith("LP-PPA-"):
395
440
changelogs_uri_ppa = self._extract_ppa_changelog_uri(name)
397
442
except Exception:
398
logging.exception("Unable to connect to the Launchpad "
444
"Unable to connect to the Launchpad API."
400
446
# Try non official changelog location
401
changelogs_uri_binary = \
447
changelogs_uri_binary = (
402
448
self._guess_third_party_changelogs_uri_by_binary(name)
403
changelogs_uri_source = \
450
changelogs_uri_source = (
404
451
self._guess_third_party_changelogs_uri_by_source(name)
405
453
error_message = ""
406
for changelogs_uri in [changelogs_uri_ppa,
407
changelogs_uri_binary,
408
changelogs_uri_source]:
454
for changelogs_uri in [
456
changelogs_uri_binary,
457
changelogs_uri_source,
409
459
if changelogs_uri:
411
461
changelog = self._get_changelog_or_news(
412
name, "changelog", False, changelogs_uri)
462
name, "changelog", False, changelogs_uri
413
464
self.all_changes[name] += changelog
414
465
except (HTTPError, HttpsChangelogsUnsupportedError):
415
466
# no changelogs_uri or 404
416
467
error_message = _(
417
468
"This update does not come from a "
418
"source that supports changelogs.")
469
"source that supports changelogs."
419
471
except (IOError, BadStatusLine, socket.error):
420
472
# network errors and others
421
473
logging.exception("error on changelog fetching")
422
474
error_message = _(
423
475
"Failed to download the list of changes. \n"
424
"Please check your Internet connection.")
476
"Please check your Internet connection."
425
478
self.all_changes[name] += error_message
427
480
def get_changelog(self, name):
428
" get the changelog file from the changelog location "
481
"get the changelog file from the changelog location"
429
482
origins = self[name].candidate.origins
430
self.all_changes[name] = _("Changes for %s versions:\n"
431
"Installed version: %s\n"
432
"Available version: %s\n\n") % \
433
(name, getattr(self[name].installed, "version", None),
434
self[name].candidate.version)
483
self.all_changes[name] = _(
484
"Changes for %s versions:\n"
485
"Installed version: %s\n"
486
"Available version: %s\n\n"
489
getattr(self[name].installed, "version", None),
490
self[name].candidate.version,
435
492
if self.CHANGELOG_ORIGIN not in [o.origin for o in origins]:
436
493
self._fetch_changelog_for_third_party_package(name, origins)
438
495
# fixup epoch handling version
439
496
srcpkg = self[name].candidate.source_name
440
srcver_epoch = self[name].candidate.source_version.replace(':', '%3A')
497
srcver_epoch = self[name].candidate.source_version.replace(":", "%3A")
442
499
changelog = self._get_changelog_or_news(name, "changelog")
443
500
if len(changelog) == 0:
444
changelog = _("The changelog does not contain any relevant "
446
"Please use http://launchpad.net/ubuntu/+source/"
448
"until the changes become available or try "
449
"again later.") % (srcpkg, srcver_epoch)
502
"The changelog does not contain any relevant changes.\n\n"
503
"Please use http://launchpad.net/ubuntu/+source/"
505
"until the changes become available or try again later."
506
) % (srcpkg, srcver_epoch)
450
507
except HTTPError:
451
changelog = _("The list of changes is not available yet.\n\n"
452
"Please use http://launchpad.net/ubuntu/+source/"
454
"until the changes become available or try again "
455
"later.") % (srcpkg, srcver_epoch)
509
"The list of changes is not available yet.\n\n"
510
"Please use http://launchpad.net/ubuntu/+source/"
512
"until the changes become available or try again later."
513
) % (srcpkg, srcver_epoch)
456
514
except (IOError, BadStatusLine, socket.error) as e:
457
515
print("caught exception: ", e)
458
changelog = _("Failed to download the list "
459
"of changes. \nPlease "
460
"check your Internet "
517
"Failed to download the list of changes. \n"
518
"Please check your Internet connection."
462
520
self.all_changes[name] += changelog