This commit is contained in:
@@ -65,6 +65,10 @@ type RemoveInput struct {
|
|||||||
Name string `path:"name" example:"htop" doc:"Package to remove"`
|
Name string `path:"name" example:"htop" doc:"Package to remove"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type UpgradeOneInput struct {
|
||||||
|
Name string `path:"name" example:"htop" doc:"Package to upgrade"`
|
||||||
|
}
|
||||||
|
|
||||||
// SSE event types for streaming package operations.
|
// SSE event types for streaming package operations.
|
||||||
type PkgOutputEvent struct {
|
type PkgOutputEvent struct {
|
||||||
Line string `json:"line" doc:"One line of the package manager's terminal output"`
|
Line string `json:"line" doc:"One line of the package manager's terminal output"`
|
||||||
@@ -162,6 +166,25 @@ func registerPackages(api huma.API, pm manager) {
|
|||||||
bin, args := pm.upgradeArgs()
|
bin, args := pm.upgradeArgs()
|
||||||
streamOp(ctx, send, bin, args)
|
streamOp(ctx, send, bin, args)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
sse.Register(api, huma.Operation{
|
||||||
|
OperationID: "packages-upgrade-one",
|
||||||
|
Method: "POST",
|
||||||
|
Path: "/api/packages/upgrade/{name}",
|
||||||
|
Summary: "Upgrade a single package (streamed)",
|
||||||
|
Description: "Upgrades the named package to its latest version, streaming the " +
|
||||||
|
"package manager's output live. apt uses `install --only-upgrade` so the " +
|
||||||
|
"package must already be installed; dnf/pacman handle this natively.",
|
||||||
|
Tags: []string{tagPackages},
|
||||||
|
Metadata: op("write"),
|
||||||
|
}, pkgEvents, func(ctx context.Context, in *UpgradeOneInput, send sse.Sender) {
|
||||||
|
if validateName(in.Name) != nil {
|
||||||
|
send.Data(PkgErrorEvent{Message: "invalid package name: " + in.Name})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
bin, args := pm.upgradeOneArgs(in.Name)
|
||||||
|
streamOp(ctx, send, bin, args)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// streamOp runs a package write and streams its combined output to the client.
|
// streamOp runs a package write and streams its combined output to the client.
|
||||||
@@ -293,6 +316,21 @@ func (m manager) upgradeArgs() (string, []string) {
|
|||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// upgradeOneArgs upgrades a single package to its latest version. apt's
|
||||||
|
// `install --only-upgrade` is the safe variant (won't install if absent);
|
||||||
|
// pacman -S re-syncs to latest; dnf upgrade is naturally scoped by name.
|
||||||
|
func (m manager) upgradeOneArgs(name string) (string, []string) {
|
||||||
|
switch m.name {
|
||||||
|
case "dnf":
|
||||||
|
return "dnf", []string{"upgrade", "-y", "--", name}
|
||||||
|
case "apt":
|
||||||
|
return "apt-get", []string{"install", "--only-upgrade", "-y", "--", name}
|
||||||
|
case "pacman":
|
||||||
|
return "pacman", []string{"-S", "--noconfirm", "--", name}
|
||||||
|
}
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
|
||||||
// --- parsers (pure, tested) --------------------------------------------------
|
// --- parsers (pure, tested) --------------------------------------------------
|
||||||
|
|
||||||
// parseTabbed reads "name\tversion" lines (dpkg-query / rpm output).
|
// parseTabbed reads "name\tversion" lines (dpkg-query / rpm output).
|
||||||
|
|||||||
Reference in New Issue
Block a user