| // Copyright 2017-2020 The Verible Authors. | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| // -*- c++ -*- | |
| // Some filesystem utilities. | |
| #ifndef VERIBLE_COMMON_UTIL_FILE_UTIL_H_ | |
| #define VERIBLE_COMMON_UTIL_FILE_UTIL_H_ | |
| #include <string> | |
| #include <vector> | |
| #include "absl/status/status.h" | |
| #include "absl/status/statusor.h" | |
| #include "absl/strings/string_view.h" | |
| #include "common/strings/mem_block.h" | |
| namespace verible { | |
| namespace file { | |
| // A representation of a filesystem directory. | |
| struct Directory { | |
| // Path to the directory. | |
| std::string path; | |
| // Files inside this directory (prefixed by the path). Sorted. | |
| std::vector<std::string> files; | |
| // Directories inside this directory (prefixed by the path). Sorted. | |
| std::vector<std::string> directories; | |
| }; | |
| // Returns the part of the path after the final "/". If there is no | |
| // "/" in the path, the result is the same as the input. | |
| // Note that this function's behavior differs from the Unix basename | |
| // command if path ends with "/". For such paths, this function returns the | |
| // empty string. | |
| absl::string_view Basename(absl::string_view filename); | |
| // Returns the the directory that contains the file. If there is no | |
| // "/" in the path, the result is the same as the input. | |
| // If no "/" is found the result is the same as the input. | |
| absl::string_view Dirname(absl::string_view filename); | |
| // Returns the part of the basename of path prior to the final ".". If | |
| // there is no "." in the basename, this is equivalent to file::Basename(path). | |
| absl::string_view Stem(absl::string_view filename); | |
| // Search for 'filename' file starting at 'start' (can be file or directory) | |
| // and going upwards the directory tree. Returns true if anything is found and | |
| // puts the found file in 'result'. | |
| absl::Status UpwardFileSearch(absl::string_view start, | |
| absl::string_view filename, std::string* result); | |
| // Determines whether the given filename exists and is a regular file or pipe. | |
| absl::Status FileExists(const std::string& filename); | |
| // Read file "filename" and store its content in "content" | |
| absl::Status GetContents(absl::string_view filename, std::string* content); | |
| // Read file "filename" and store its content in MemBlock. Attempts to MemMap | |
| // first; if that fails, reads file regularly. | |
| absl::StatusOr<std::unique_ptr<MemBlock>> GetContentAsMemBlock( | |
| absl::string_view filename); | |
| // Create file "filename" and store given content in it. | |
| absl::Status SetContents(absl::string_view filename, absl::string_view content); | |
| // Join directory + filename | |
| std::string JoinPath(absl::string_view base, absl::string_view name); | |
| // Create directory with given name, return success. | |
| absl::Status CreateDir(absl::string_view dir); | |
| // Returns the content of the directory. POSIX only. Ignores symlinks and | |
| // unknown nodes which it fails to resolve to a file or a directory. Returns an | |
| // error status on any read error (doesn't allow partial results) except | |
| // resolving symlinks and unknown nodes. | |
| // TODO (after bump to c++17) rewrite this function to use std::filesystem | |
| absl::StatusOr<Directory> ListDir(absl::string_view dir); | |
| namespace testing { | |
| // Generate a random file name (no directory). This does not create any file. | |
| std::string RandomFileBasename(absl::string_view prefix); | |
| // Useful for testing: a temporary file with a randomly generated name | |
| // that is pre-populated with a particular content. | |
| // File is deleted when instance goes out of scope. | |
| class ScopedTestFile { | |
| public: | |
| // Write a new file in directory 'base_dir' with given 'content'. | |
| // 'base_dir' needs to already exist, and will not be automatically created. | |
| // If 'use_this_filename' is provided as a base name, that will be used, | |
| // otherwise, a file name will be randomly generated. | |
| ScopedTestFile(absl::string_view base_dir, absl::string_view content, | |
| absl::string_view use_this_filename = ""); | |
| ~ScopedTestFile(); | |
| // not copy-able | |
| ScopedTestFile(const ScopedTestFile&) = delete; | |
| ScopedTestFile& operator=(const ScopedTestFile&) = delete; | |
| // move-able (to support vector::emplace_back()) | |
| ScopedTestFile(ScopedTestFile&&) = default; | |
| ScopedTestFile& operator=(ScopedTestFile&&) = default; | |
| // Filename created by this instance. | |
| const std::string& filename() const { return filename_; } | |
| private: | |
| std::string filename_; | |
| }; | |
| } // namespace testing | |
| } // namespace file | |
| } // namespace verible | |
| #endif // VERIBLE_COMMON_UTIL_FILE_UTIL_H_ |