mirror of
https://github.com/roddhjav/apparmor.d.git
synced 2024-11-15 16:03:51 +01:00
215 lines
5.5 KiB
Go
215 lines
5.5 KiB
Go
|
/*
|
||
|
* This file is part of PathsHelper library.
|
||
|
*
|
||
|
* Copyright 2018 Arduino AG (http://www.arduino.cc/)
|
||
|
*
|
||
|
* PathsHelper library is free software; you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU General Public License as published by
|
||
|
* the Free Software Foundation; either version 2 of the License, or
|
||
|
* (at your option) any later version.
|
||
|
*
|
||
|
* This program is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU General Public License
|
||
|
* along with this program; if not, write to the Free Software
|
||
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||
|
*
|
||
|
* As a special exception, you may use this file as part of a free software
|
||
|
* library without restriction. Specifically, if other files instantiate
|
||
|
* templates or use macros or inline functions from this file, or you compile
|
||
|
* this file and link it with other files to produce an executable, this
|
||
|
* file does not by itself cause the resulting executable to be covered by
|
||
|
* the GNU General Public License. This exception does not however
|
||
|
* invalidate any other reasons why the executable file might be covered by
|
||
|
* the GNU General Public License.
|
||
|
*/
|
||
|
|
||
|
package paths
|
||
|
|
||
|
import (
|
||
|
"sort"
|
||
|
)
|
||
|
|
||
|
// PathList is a list of Path
|
||
|
type PathList []*Path
|
||
|
|
||
|
// NewPathList creates a new PathList with the given paths
|
||
|
func NewPathList(paths ...string) PathList {
|
||
|
res := PathList{}
|
||
|
for _, path := range paths {
|
||
|
res = append(res, New(path))
|
||
|
}
|
||
|
return res
|
||
|
}
|
||
|
|
||
|
// Clone returns a copy of the current PathList
|
||
|
func (p *PathList) Clone() PathList {
|
||
|
res := PathList{}
|
||
|
for _, path := range *p {
|
||
|
res.Add(path.Clone())
|
||
|
}
|
||
|
return res
|
||
|
}
|
||
|
|
||
|
// AsStrings return this path list as a string array
|
||
|
func (p *PathList) AsStrings() []string {
|
||
|
res := []string{}
|
||
|
for _, path := range *p {
|
||
|
res = append(res, path.String())
|
||
|
}
|
||
|
return res
|
||
|
}
|
||
|
|
||
|
// FilterDirs remove all entries except directories
|
||
|
func (p *PathList) FilterDirs() {
|
||
|
res := (*p)[:0]
|
||
|
for _, path := range *p {
|
||
|
if path.IsDir() {
|
||
|
res = append(res, path)
|
||
|
}
|
||
|
}
|
||
|
*p = res
|
||
|
}
|
||
|
|
||
|
// FilterOutDirs remove all directories entries
|
||
|
func (p *PathList) FilterOutDirs() {
|
||
|
res := (*p)[:0]
|
||
|
for _, path := range *p {
|
||
|
if !path.IsDir() {
|
||
|
res = append(res, path)
|
||
|
}
|
||
|
}
|
||
|
*p = res
|
||
|
}
|
||
|
|
||
|
// FilterOutHiddenFiles remove all hidden files (files with the name
|
||
|
// starting with ".")
|
||
|
func (p *PathList) FilterOutHiddenFiles() {
|
||
|
p.FilterOutPrefix(".")
|
||
|
}
|
||
|
|
||
|
// Filter will remove all the elements of the list that do not match
|
||
|
// the specified acceptor function
|
||
|
func (p *PathList) Filter(acceptorFunc func(*Path) bool) {
|
||
|
res := (*p)[:0]
|
||
|
for _, path := range *p {
|
||
|
if acceptorFunc(path) {
|
||
|
res = append(res, path)
|
||
|
}
|
||
|
}
|
||
|
*p = res
|
||
|
}
|
||
|
|
||
|
// FilterOutPrefix remove all entries having one of the specified prefixes
|
||
|
func (p *PathList) FilterOutPrefix(prefixes ...string) {
|
||
|
filterFunction := func(path *Path) bool {
|
||
|
return !path.HasPrefix(prefixes...)
|
||
|
}
|
||
|
p.Filter(filterFunction)
|
||
|
}
|
||
|
|
||
|
// FilterPrefix remove all entries not having one of the specified prefixes
|
||
|
func (p *PathList) FilterPrefix(prefixes ...string) {
|
||
|
filterFunction := func(path *Path) bool {
|
||
|
return path.HasPrefix(prefixes...)
|
||
|
}
|
||
|
p.Filter(filterFunction)
|
||
|
}
|
||
|
|
||
|
// FilterOutSuffix remove all entries having one of the specified suffixes
|
||
|
func (p *PathList) FilterOutSuffix(suffixies ...string) {
|
||
|
filterFunction := func(path *Path) bool {
|
||
|
return !path.HasSuffix(suffixies...)
|
||
|
}
|
||
|
p.Filter(filterFunction)
|
||
|
}
|
||
|
|
||
|
// FilterSuffix remove all entries not having one of the specified suffixes
|
||
|
func (p *PathList) FilterSuffix(suffixies ...string) {
|
||
|
filterFunction := func(path *Path) bool {
|
||
|
return path.HasSuffix(suffixies...)
|
||
|
}
|
||
|
p.Filter(filterFunction)
|
||
|
}
|
||
|
|
||
|
// Add adds a Path to the PathList
|
||
|
func (p *PathList) Add(path *Path) {
|
||
|
*p = append(*p, path)
|
||
|
}
|
||
|
|
||
|
// AddAll adds all Paths in the list passed as argument
|
||
|
func (p *PathList) AddAll(paths PathList) {
|
||
|
*p = append(*p, paths...)
|
||
|
}
|
||
|
|
||
|
// AddIfMissing adds a Path to the PathList if the path is not already
|
||
|
// in the list
|
||
|
func (p *PathList) AddIfMissing(path *Path) {
|
||
|
if (*p).Contains(path) {
|
||
|
return
|
||
|
}
|
||
|
(*p).Add(path)
|
||
|
}
|
||
|
|
||
|
// AddAllMissing adds all paths to the PathList excluding the paths already
|
||
|
// in the list
|
||
|
func (p *PathList) AddAllMissing(pathsToAdd PathList) {
|
||
|
for _, pathToAdd := range pathsToAdd {
|
||
|
(*p).AddIfMissing(pathToAdd)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// ToAbs calls Path.ToAbs() method on each path of the list.
|
||
|
// It stops at the first error and returns it. If all ToAbs calls
|
||
|
// are successful nil is returned.
|
||
|
func (p *PathList) ToAbs() error {
|
||
|
for _, path := range *p {
|
||
|
if err := path.ToAbs(); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// Contains check if the list contains a path that match
|
||
|
// exactly (EqualsTo) to the specified path
|
||
|
func (p *PathList) Contains(pathToSearch *Path) bool {
|
||
|
for _, path := range *p {
|
||
|
if path.EqualsTo(pathToSearch) {
|
||
|
return true
|
||
|
}
|
||
|
}
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
// ContainsEquivalentTo check if the list contains a path
|
||
|
// that is equivalent (EquivalentTo) to the specified path
|
||
|
func (p *PathList) ContainsEquivalentTo(pathToSearch *Path) bool {
|
||
|
for _, path := range *p {
|
||
|
if path.EquivalentTo(pathToSearch) {
|
||
|
return true
|
||
|
}
|
||
|
}
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
// Sort sorts this pathlist
|
||
|
func (p *PathList) Sort() {
|
||
|
sort.Sort(p)
|
||
|
}
|
||
|
|
||
|
func (p *PathList) Len() int {
|
||
|
return len(*p)
|
||
|
}
|
||
|
|
||
|
func (p *PathList) Less(i, j int) bool {
|
||
|
return (*p)[i].path < (*p)[j].path
|
||
|
}
|
||
|
|
||
|
func (p *PathList) Swap(i, j int) {
|
||
|
(*p)[i], (*p)[j] = (*p)[j], (*p)[i]
|
||
|
}
|