Skip to content

Commit 3cc37a6

Browse files
authored
Add functions for adding/removing packages (#65)
1 parent 6b1b313 commit 3cc37a6

File tree

5 files changed

+171
-1
lines changed

5 files changed

+171
-1
lines changed

interfaces.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package alpm
22

3+
// #include <alpm.h>
4+
import "C"
5+
36
import (
47
"time"
58
)
@@ -76,6 +79,9 @@ type IPackage interface {
7679
SyncNewVersion(l IDBList) IPackage
7780

7881
Type() string
82+
83+
// Get the underlying alpm pkg type
84+
getPmpkg() *C.alpm_pkg_t
7985
}
8086

8187
// IPackageList exports the alpm.PackageList symbols.

package.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,10 @@ func (pkg *Package) Type() string {
303303
return "alpm"
304304
}
305305

306+
func (pkg *Package) getPmpkg() *C.alpm_pkg_t {
307+
return pkg.pmpkg
308+
}
309+
306310
// SortBySize returns a PackageList sorted by size.
307311
func (l PackageList) SortBySize() IPackageList {
308312
pkgList := (*C.struct__alpm_list_t)(unsafe.Pointer(l.list))

testdata/examples/Makefile

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
all: alpm-installed alpm-search alpm-updates
1+
all: alpm-installed alpm-search alpm-updates alpm-sync
22

33
alpm-installed: installed.go
44
go build -x -o $@ $<
@@ -9,5 +9,8 @@ alpm-search: search.go
99
alpm-updates: updates.go
1010
go build -x -o $@ $<
1111

12+
alpm-sync: sync.go
13+
go build -x -o $@ $<
14+
1215
clean:
1316
rm -f alpm-installed alpm-search alpm-updates

testdata/examples/sync/sync.go

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
// sync.go - Example of installing, and removing packages.
2+
//
3+
// Copyright (c) 2013 The go-alpm Authors
4+
//
5+
// MIT Licensed. See LICENSE for details.
6+
7+
package main
8+
9+
import (
10+
"fmt"
11+
"log"
12+
13+
"github.com/Jguer/go-alpm/v2"
14+
"github.com/Morganamilo/go-pacmanconf"
15+
)
16+
17+
func main() {
18+
h, err := alpm.Initialize("/", "/var/lib/pacman")
19+
if err != nil {
20+
fmt.Println(err)
21+
return
22+
}
23+
24+
defer func() {
25+
if err := h.Release(); err != nil {
26+
fmt.Println(err)
27+
return
28+
}
29+
}()
30+
31+
conf, _, err := pacmanconf.ParseFile("/etc/pacman.conf")
32+
if err != nil {
33+
fmt.Println(err)
34+
return
35+
}
36+
37+
fmt.Println("loading databases")
38+
39+
var addPkg alpm.IPackage
40+
var removePkg alpm.IPackage
41+
42+
for _, repo := range conf.Repos {
43+
db, err := h.RegisterSyncDB(repo.Name, 0)
44+
if err != nil {
45+
fmt.Println(err)
46+
return
47+
}
48+
db.SetServers(repo.Servers)
49+
50+
foundPkg := db.Pkg("vim")
51+
if foundPkg != nil {
52+
addPkg = foundPkg
53+
}
54+
}
55+
56+
localDb, err := h.LocalDB()
57+
if err != nil {
58+
log.Println(err)
59+
return
60+
}
61+
// A package can only be removed if it is in the local DB
62+
removePkg = localDb.Pkg("vi")
63+
64+
fmt.Println("initializing transaction")
65+
if err := h.TransInit(0); err != nil {
66+
fmt.Println(err)
67+
return
68+
}
69+
70+
defer func() {
71+
fmt.Println("releasing transaction")
72+
if err := h.TransRelease(); err != nil {
73+
fmt.Println(err)
74+
return
75+
}
76+
}()
77+
78+
fmt.Println("synchronizing databases")
79+
if err := h.SyncSysupgrade(true); err != nil {
80+
fmt.Println(err)
81+
return
82+
}
83+
84+
fmt.Println("adding package")
85+
if err := h.AddPkg(addPkg); err != nil {
86+
fmt.Println(err)
87+
return
88+
}
89+
90+
fmt.Println("removing package")
91+
if removePkg != nil {
92+
if err := h.RemovePkg(removePkg); err != nil {
93+
fmt.Println(err)
94+
return
95+
}
96+
} else {
97+
fmt.Println("vi is not installed")
98+
}
99+
100+
fmt.Println("preparing transaction")
101+
if err := h.TransPrepare(); err != nil {
102+
fmt.Println(err)
103+
return
104+
}
105+
106+
fmt.Println("committing transaction")
107+
if err := h.TransCommit(); err != nil {
108+
fmt.Println(err)
109+
return
110+
}
111+
}

trans.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,34 @@ func (h *Handle) TransInit(flags TransFlag) error {
2424
return nil
2525
}
2626

27+
func (h *Handle) TransPrepare() error {
28+
var data *C.alpm_list_t
29+
ret := C.alpm_trans_prepare(h.ptr, &data)
30+
if ret != 0 {
31+
return h.LastError()
32+
}
33+
34+
return nil
35+
}
36+
37+
func (h *Handle) TransInterrupt() error {
38+
ret := C.alpm_trans_interrupt(h.ptr)
39+
if ret != 0 {
40+
return h.LastError()
41+
}
42+
43+
return nil
44+
}
45+
46+
func (h *Handle) TransCommit() error {
47+
ret := C.alpm_trans_commit(h.ptr, nil)
48+
if ret != 0 {
49+
return h.LastError()
50+
}
51+
52+
return nil
53+
}
54+
2755
func (h *Handle) TransRelease() error {
2856
ret := C.alpm_trans_release(h.ptr)
2957
if ret != 0 {
@@ -52,3 +80,21 @@ func (h *Handle) TransGetFlags() (TransFlag, error) {
5280

5381
return TransFlag(flags), nil
5482
}
83+
84+
func (h *Handle) AddPkg(pkg IPackage) error {
85+
ret := C.alpm_add_pkg(h.ptr, pkg.getPmpkg())
86+
if ret != 0 {
87+
return h.LastError()
88+
}
89+
90+
return nil
91+
}
92+
93+
func (h *Handle) RemovePkg(pkg IPackage) error {
94+
ret := C.alpm_remove_pkg(h.ptr, pkg.getPmpkg())
95+
if ret != 0 {
96+
return h.LastError()
97+
}
98+
99+
return nil
100+
}

0 commit comments

Comments
 (0)