Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pattern modify dbus #770

Merged
merged 10 commits into from Sep 26, 2023
27 changes: 27 additions & 0 deletions service/lib/agama/dbus/software/manager.rb
Expand Up @@ -51,6 +51,7 @@ def initialize(backend, logger)
register_callbacks
register_progress_callbacks
register_service_status_callbacks
@selected_patterns = {}
end

SOFTWARE_INTERFACE = "org.opensuse.Agama.Software1"
Expand All @@ -61,6 +62,13 @@ def initialize(backend, logger)

dbus_reader :selected_base_product, "s"

# documented way to be able to write to patterns and trigger signal
attr_writer :selected_patterns

# selected patterns is hash with pattern name as id and 0 for user selected and
# 1 for auto selected. Can be extended in future e.g. for mandatory patterns
dbus_attr_reader :selected_patterns, "a{sy}"

dbus_method :SelectProduct, "in ProductID:s" do |product_id|
old_product_id = backend.product

Expand Down Expand Up @@ -91,6 +99,10 @@ def initialize(backend, logger)
]
end

dbus_method :AddPattern, "in id:s" { |p| backend.add_pattern(p) }
dbus_method :RemovePattern, "in id:s" { |p| backend.remove_pattern(p) }
dbus_method :SetUserPatterns, "in ids:as" { |ids| backend.user_patterns = ids }

dbus_method :ProvisionsSelected, "in Provisions:as, out Result:ab" do |provisions|
[provisions.map { |p| backend.provision_selected?(p) }]
end
Expand Down Expand Up @@ -161,6 +173,21 @@ def register_callbacks
nm_client.on_connection_changed do |connected|
probe if connected
end

backend.on_selected_patterns_change do
self.selected_patterns = compute_patterns
end
end

USER_SELECTED_PATTERN = 0
AUTO_SELECTED_PATTERN = 0
def compute_patterns
patterns = {}
user_selected, auto_selected = backend.selected_patterns
user_selected.each { |p| patterns[p] = USER_SELECTED_PATTERN }
auto_selected.each { |p| patterns[p] = AUTO_SELECTED_PATTERN }

patterns
end
end
end
Expand Down
53 changes: 53 additions & 0 deletions service/lib/agama/software/manager.rb
Expand Up @@ -75,6 +75,9 @@ def initialize(config, logger)
end
@repositories = RepositoriesManager.new
on_progress_change { logger.info progress.to_s }
# patterns selected by user
@user_patterns = []
@selected_patterns_change_callbacks = []
end

def select_product(name)
Expand Down Expand Up @@ -190,6 +193,52 @@ def patterns(filtered)
patterns
end

def add_pattern(id)
# TODO: error handling
res = Yast::Pkg.ResolvableInstall(id, :pattern)
logger.info "Adding pattern #{res.inspect}"
@user_patterns << id

res = Yast::Pkg.PkgSolve(unused = true)
logger.info "Solver run #{res.inspect}"
selected_patterns_changed
end

def remove_pattern(id)
# TODO: error handling
Yast::Pkg.ResolvableRemove(id, :pattern)
logger.info "Removing pattern #{res.inspect}"
@user_patterns << id

res = Yast::Pkg.PkgSolve(unused = true)
logger.info "Solver run #{res.inspect}"
selected_patterns_changed
end

def user_patterns=(ids)
@user_patterns.each { |p| Yast::Pkg.ResolvableRemove(p, :pattern) }
lslezak marked this conversation as resolved.
Show resolved Hide resolved
@user_patterns = ids
@user_patterns.each { |p| Yast::Pkg.ResolvableInstall(p, :pattern) }
logger.info "Setting patterns to #{res.inspect}"

res = Yast::Pkg.PkgSolve(unused = true)
logger.info "Solver run #{res.inspect}"
selected_patterns_changed
end

# @return [Array<Array<String>,Array<String>] returns pair of arrays where the first one
# is user selected pattern ids and in other is auto selected ones
def selected_patterns
patterns = Y2Packager::Resolvable.find(kind: :pattern, status: :selected)
patterns.map!(&:name)

patterns.partition { |p| @user_patterns.include?(p) }
end

def on_selected_patterns_change(&block)
@selected_patterns_change_callbacks << block
end

# Determines whether a package is installed
#
# @param name [String] Package name
Expand Down Expand Up @@ -290,6 +339,10 @@ def select_resolvables
proposal.set_resolvables("agama", :package, optional_packages,
optional: true)
end

def selected_patterns_changed
@selected_patterns_change_callbacks.each(&:call)
end
end
end
end