parent
0cd0262bed
commit
f66789d381
47 changed files with 2513 additions and 0 deletions
214
pkg/paths/list.go
Normal file
214
pkg/paths/list.go
Normal file
|
|
@ -0,0 +1,214 @@
|
|||
/*
|
||||
* 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]
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue