* postpone removing conflicts for upgrade operation until

fetching of all the packages finishes and before the actual 
  installation begins. This keeps the system stable while
  fetching the packages. xorg -> xorg-server case.

  there is also a new scenario added for testing this bug.

  fixes #3732
This commit is contained in:
Faik Uygur
2006-10-22 19:05:26 +00:00
parent 285bbf2173
commit 365fa59c64
2 changed files with 61 additions and 7 deletions
+19 -7
View File
@@ -174,7 +174,9 @@ in the respective order to satisfy extra dependencies:
G_f.write_graphviz(sys.stdout)
order = G_f.topological_sort()
if not ctx.get_option('ignore_package_conflicts'):
check_conflicts(order, packagedb)
conflicts = check_conflicts(order, packagedb)
if conflicts:
remove_conflicting_packages(conflicts)
order.reverse()
ctx.ui.info(_('Installation order: ') + util.strlist(order) )
@@ -221,6 +223,10 @@ def calculate_conflicts(order, packagedb):
return (C, D, pkg_conflicts)
def remove_conflicting_packages(conflicts):
if remove(conflicts, ignore_dep=True, ignore_safety=True) == False:
raise Error(_("Conflicts remain"))
def check_conflicts(order, packagedb):
"""check if upgrading to the latest versions will cause havoc
done in a simple minded way without regard for dependencies of
@@ -243,8 +249,7 @@ def check_conflicts(order, packagedb):
if not ctx.ui.confirm(_('Remove the following conflicting packages?')):
raise Error(_("Conflicts remain"))
if remove(list(C), ignore_dep=True, ignore_safety=True) == False:
raise Error(_("Conflicts remain"))
return list(C)
def expand_components(A):
Ap = set()
@@ -375,7 +380,9 @@ def plan_install_pkg_names(A, ignore_conflicts = False):
order = G_f.topological_sort()
order.reverse()
if not ctx.get_option('ignore_package_conflicts') and not ignore_conflicts:
check_conflicts(order, ctx.packagedb)
conflicts = check_conflicts(order, ctx.packagedb)
if conflicts:
remove_conflicting_packages(conflicts)
return G_f, order
def upgrade(A):
@@ -444,6 +451,9 @@ def upgrade_pkg_names(A = []):
G_f = None
order = list(A)
if not ctx.get_option('ignore_package_conflicts'):
conflicts = check_conflicts(order, ctx.packagedb)
ctx.ui.info(_('The following packages will be upgraded: ') +
util.strlist(order))
@@ -468,7 +478,11 @@ def upgrade_pkg_names(A = []):
# fetch to be upgraded packages but do not install them.
if ctx.get_option('fetch_only'):
return
if not ctx.get_option('ignore_package_conflicts'):
if conflicts:
remove_conflicting_packages(conflicts)
for path in paths:
install_op = atomicoperations.Install(path, ignore_file_conflicts = True)
install_op.install(True)
@@ -543,8 +557,6 @@ def plan_upgrade(A, ignore_build = False, ignore_conflicts = False):
G_f.write_graphviz(sys.stdout)
order = G_f.topological_sort()
order.reverse()
if not ctx.get_option('ignore_package_conflicts') and not ignore_conflicts:
check_conflicts(order, ctx.packagedb)
return G_f, order
def remove(A, ignore_dep = False, ignore_safety = False):
+42
View File
@@ -0,0 +1,42 @@
# -*- coding: utf-8 -*-
#
# Scenario : bug3732scen.py
#
# Source : http://bugs.pardus.org.tr/show_bug.cgi?id=3732
#
# Problem : If conflicting packages found while upgrading, by removing those prior to
# fetching and installing the desktop may become unusable while upgrading
# process
#
# Problem Description:
#
# This problem appeared in our xorg package split process. The divided packages were
# all marked as conflicting packages to xorg package. But because the xorg package was
# a conflicting package, it is removed before any fetch operation and installing began.
# So some desktop processes could not be started or used properly until the upgrade
# process ends.
#
# Expected:
#
# PiSi should not remove the conflicting packages unless fetching of all the new upgrade
# packages has finished.
from pisi.scenarioapi.scenario import *
XORG = "xorg"
QT = "qt"
XORG_SERVER = "xorg-server"
XORG_VIDEO = "xorg-video"
XORG_FONT = "xorg-font"
let_repo_had(XORG)
let_repo_had(QT, with_dependencies(XORG))
let_pisi_had(XORG, QT)
def run():
repo_added_package(XORG_VIDEO, with_conflicts(XORG))
repo_added_package(XORG_FONT, with_conflicts(XORG))
repo_added_package(XORG_SERVER, with_conflicts(XORG), with_dependencies(XORG_VIDEO, XORG_FONT))
repo_version_bumped(QT, with_removed_dependencies(XORG), with_added_dependencies(XORG_SERVER))
repo_updated_index()
pisi_upgraded()