Home | History | Annotate | Download | only in kati
      1 // Copyright 2015 Google Inc. All rights reserved
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //      http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 package kati
     16 
     17 import (
     18 	"os"
     19 	"path/filepath"
     20 )
     21 
     22 func exists(filename string) bool {
     23 	_, err := os.Stat(filename)
     24 	if os.IsNotExist(err) {
     25 		return false
     26 	}
     27 	return true
     28 }
     29 
     30 type vpath struct {
     31 	pattern string
     32 	dirs    []string
     33 }
     34 
     35 type searchPaths struct {
     36 	vpaths []vpath  // vpath directives
     37 	dirs   []string // VPATH variable
     38 }
     39 
     40 func (s searchPaths) exists(target string) (string, bool) {
     41 	if exists(target) {
     42 		return target, true
     43 	}
     44 	for _, vpath := range s.vpaths {
     45 		if !matchPattern(vpath.pattern, target) {
     46 			continue
     47 		}
     48 		for _, dir := range vpath.dirs {
     49 			vtarget := filepath.Join(dir, target)
     50 			if exists(vtarget) {
     51 				return vtarget, true
     52 			}
     53 		}
     54 	}
     55 	for _, dir := range s.dirs {
     56 		vtarget := filepath.Join(dir, target)
     57 		if exists(vtarget) {
     58 			return vtarget, true
     59 		}
     60 	}
     61 	return target, false
     62 }
     63