// verifyAncestry verifies that the Thrift file for the given module and the // Thrift files for all imported modules are contained within the directory // tree rooted at the given path. func verifyAncestry(m *compile.Module, root string) error { return m.Walk(func(m *compile.Module) error { path, err := filepath.Rel(root, m.ThriftPath) if err != nil { return fmt.Errorf( "could not resolve path for %q: %v", m.ThriftPath, err) } if strings.HasPrefix(path, "..") { return fmt.Errorf( "%q is not contained in the %q directory tree", m.ThriftPath, root) } return nil }) }
// findCommonAncestor finds the deepest common ancestor for the given module // and all modules imported by it. func findCommonAncestor(m *compile.Module) (string, error) { var result []string var lastString string err := m.Walk(func(m *compile.Module) error { thriftPath := m.ThriftPath if !filepath.IsAbs(thriftPath) { return fmt.Errorf( "ThriftPath must be absolute: %q is not absolute", thriftPath) } thriftDir := filepath.Dir(thriftPath) // Split("/foo/bar", "/") = ["", "foo", "bar"] parts := strings.Split(thriftDir, string(filepath.Separator)) if result == nil { result = parts lastString = thriftPath return nil } result = commonPrefix(result, parts) if len(result) == 1 && result[0] == "" { return fmt.Errorf( "%q does not share an ancestor with %q", thriftPath, lastString) } lastString = thriftPath return nil }) if err != nil { return "", err } return strings.Join(result, string(filepath.Separator)), nil }