diff --git a/conf.go b/conf.go index 1803323..6228472 100644 --- a/conf.go +++ b/conf.go @@ -69,6 +69,7 @@ type PacmanConfig struct { type RepoConfig struct { Name string SigLevel SigLevel + Usage Usage Servers []string } @@ -197,6 +198,24 @@ lineloop: case "SigLevel": // TODO: implement SigLevel parsing. continue lineloop + case "Usage": + for _, usage := range line.Values { + switch usage { + case "Sync": + curRepo.Usage |= UsageSync + case "Search": + curRepo.Usage |= UsageSearch + case "Install": + curRepo.Usage |= UsageInstall + case "Upgrade": + curRepo.Usage |= UsageUpgrade + case "All": + curRepo.Usage |= UsageAll + default: + err = fmt.Errorf("unknown option at line %d: %s", rdr.Lineno, line.Name) + break lineloop + } + } case "Server": curRepo.Servers = append(curRepo.Servers, line.Values...) continue lineloop @@ -261,6 +280,13 @@ lineloop: conf.CacheDir = []string{"/var/cache/pacman/pkg/"} //should only be set if the config does not specify this } + for n, _ := range conf.Repos { + repo := &conf.Repos[n] + if repo.Usage == 0 { + repo.Usage = UsageAll + } + } + return conf, err } @@ -316,6 +342,7 @@ func (conf *PacmanConfig) CreateHandle() (*Handle, error) { repoconf.Servers[i] = addr } db.SetServers(repoconf.Servers) + db.SetUsage(repoconf.Usage) } } diff --git a/conf_test.go b/conf_test.go index 23e35c0..a574cbf 100644 --- a/conf_test.go +++ b/conf_test.go @@ -35,8 +35,8 @@ var pacmanConfRef = PacmanConfig{ Options: ConfColor | ConfCheckSpace | ConfVerbosePkgLists, Repos: []RepoConfig{ - {Name: "core", Servers: []string{"ftp://ftp.example.com/foobar/$repo/os/$arch/"}}, - {Name: "custom", Servers: []string{"file:///home/custompkgs"}}, + {Name: "core", Usage: UsageAll, Servers: []string{"ftp://ftp.example.com/foobar/$repo/os/$arch/"}}, + {Name: "custom", Usage: UsageInstall | UsageUpgrade, Servers: []string{"file:///home/custompkgs"}}, }, } diff --git a/db.go b/db.go index 214984d..1295e26 100644 --- a/db.go +++ b/db.go @@ -117,6 +117,11 @@ func (db Db) SetServers(servers []string) { } } +// SetUsage sets the Usage of the database +func (db Db) SetUsage(usage Usage) { + C.alpm_db_set_usage(db.ptr, C.int(usage)) +} + // PkgByName searches a package in db. func (db Db) PkgByName(name string) (*Package, error) { cName := C.CString(name) @@ -151,3 +156,23 @@ func (db Db) PkgCache() PackageList { pkgcache := (*list)(unsafe.Pointer(C.alpm_db_get_pkgcache(db.ptr))) return PackageList{pkgcache, db.handle} } + +func (db Db) Search(targets []string) PackageList { + needles := &C.alpm_list_t{} + head := needles + needles.data = unsafe.Pointer(C.CString(targets[0])) + + for _, str := range targets[1:] { + needles.next = &C.alpm_list_t{} + needles = needles.next + needles.data = unsafe.Pointer(C.CString(str)) + } + + pkglist := (*list)(unsafe.Pointer(C.alpm_db_search(db.ptr, needles))) + + for needles = head; needles != nil; needles = needles.next { + C.free(needles.data) + } + + return PackageList{pkglist, db.handle} +} diff --git a/enums.go b/enums.go index 3c692bc..9a4c46c 100644 --- a/enums.go +++ b/enums.go @@ -118,3 +118,38 @@ const ( ValidationSignature ValidationUnkown Validation = 0 ) + +type Usage int + +const ( + UsageSync Usage = 1 << iota + UsageSearch + UsageInstall + UsageUpgrade + UsageAll = (1 << 4) - 1 +) + +type TransFlag int + +const ( + TransFlagNoDeps TransFlag = 1 << iota + TransFlagForce + TransFlagNoSave + TransFlagNoDepVersion + TransFlagCascade + TransFlagRecurse + // 7 is missing + _ + TransFlagDbOnly + TransFlagAllDeps + TransFlagDownloadOnly + TransFlagNoScriptlets + // 12 is missing + _ + TransFlagNoConflicts + TransFlagNeeded + TransFlagAllExplicit + TransFlagUnneeded + TransFlagRecurseAll + TransFlagNoLock +) diff --git a/package.go b/package.go index 8873eb5..63dd135 100644 --- a/package.go +++ b/package.go @@ -27,6 +27,7 @@ int pkg_cmp(const void *v1, const void *v2) import "C" import ( + "fmt" "time" "unsafe" ) @@ -309,3 +310,8 @@ func (pkg Package) ShouldIgnore() bool { result := C.alpm_pkg_should_ignore(pkg.handle.ptr, pkg.pmpkg) return result == 1 } + +func (pkg Package) OldPkg() Package { + fmt.Printf("%#v\n", pkg.pmpkg) + return Package{pkg.pmpkg, pkg.handle} +} diff --git a/sync.go b/sync.go new file mode 100644 index 0000000..d5e4eba --- /dev/null +++ b/sync.go @@ -0,0 +1,27 @@ +// db.go - Functions for database handling. +// +// Copyright (c) 2013 The go-alpm Authors +// +// MIT Licensed. See LICENSE for details. + +package alpm + +/* +#include +*/ +import "C" + +func (h *Handle) SyncSysupgrade(enableDowngrade bool) error { + intEnableDowngrade := C.int(0) + + if enableDowngrade { + intEnableDowngrade = C.int(1) + } + + ret := C.alpm_sync_sysupgrade(h.ptr, intEnableDowngrade) + if ret != 0 { + return h.LastError() + } + + return nil +} diff --git a/testing/conf/good_pacman.conf b/testing/conf/good_pacman.conf index b08295f..34829e1 100644 --- a/testing/conf/good_pacman.conf +++ b/testing/conf/good_pacman.conf @@ -39,3 +39,4 @@ Server = ftp://ftp.example.com/foobar/$repo/os/$arch/ [custom] Server = file:///home/custompkgs +Usage = Install Upgrade diff --git a/trans.go b/trans.go new file mode 100644 index 0000000..92d5a74 --- /dev/null +++ b/trans.go @@ -0,0 +1,54 @@ +// db.go - Functions for database handling. +// +// Copyright (c) 2013 The go-alpm Authors +// +// MIT Licensed. See LICENSE for details. + +package alpm + +/* +#include +*/ +import "C" + +import ( + "unsafe" +) + +func (h *Handle) TransInit(flags TransFlag) error { + ret := C.alpm_trans_init(h.ptr, C.int(flags)) + if ret != 0 { + return h.LastError() + } + + return nil +} + +func (h *Handle) TransRelease() error { + ret := C.alpm_trans_release(h.ptr) + if ret != 0 { + return h.LastError() + } + + return nil +} + +func (h *Handle) TransGetAdd() PackageList { + pkgs := C.alpm_trans_get_add(h.ptr) + return PackageList{(*list)(unsafe.Pointer(pkgs)), *h} +} + +func (h *Handle) TransGetRemove() PackageList { + pkgs := C.alpm_trans_get_remove(h.ptr) + return PackageList{(*list)(unsafe.Pointer(pkgs)), *h} +} + +func (h *Handle) TransGetFalgs() (TransFlag, error) { + flags := C.alpm_trans_get_flags(h.ptr) + + if flags == -1 { + return -1, h.LastError() + } + + return TransFlag(flags), nil +} diff --git a/types.go b/types.go index 9139055..351a21e 100644 --- a/types.go +++ b/types.go @@ -192,6 +192,14 @@ func (question QuestionAny) QuestionSelectProvider() (QuestionSelectProvider, er return QuestionSelectProvider{}, fmt.Errorf("Can not convert to QuestionInstallIgnorepkg") } +func (question QuestionAny) QuestionReplace() (QuestionReplace, error) { + if question.Type() == QuestionTypeReplacePkg { + return *(*QuestionReplace)(unsafe.Pointer(&question)), nil + } + + return QuestionReplace{}, fmt.Errorf("Can not convert to QuestionReplace") +} + func (question QuestionInstallIgnorepkg) SetInstall(install bool) { if install { question.ptr.install = 1