#pragma once #include "types.hh" #include "hash.hh" #include "path.hh" #include "attrs.hh" #include "url.hh" #include namespace nix { class Store; } namespace nix::fetchers { struct Tree { Path actualPath; StorePath storePath; Tree(Path && actualPath, StorePath && storePath) : actualPath(actualPath), storePath(std::move(storePath)) {} }; struct InputScheme; struct Input { friend struct InputScheme; std::shared_ptr scheme; // note: can be null Attrs attrs; bool immutable = false; bool direct = true; public: static Input fromURL(const std::string & url); static Input fromURL(const ParsedURL & url); static Input fromAttrs(Attrs && attrs); ParsedURL toURL() const; std::string toURLString(const std::map & extraQuery = {}) const; std::string to_string() const; Attrs toAttrs() const; /* Check whether this is a "direct" input, that is, not one that goes through a registry. */ bool isDirect() const { return direct; } /* Check whether this is an "immutable" input, that is, one that contains a commit hash or content hash. */ bool isImmutable() const { return immutable; } bool hasAllInfo() const; bool operator ==(const Input & other) const; bool contains(const Input & other) const; std::pair fetch(ref store) const; Input applyOverrides( std::optional ref, std::optional rev) const; void clone(const Path & destDir) const; std::optional getSourcePath() const; void markChangedFile( std::string_view file, std::optional commitMsg) const; StorePath computeStorePath(Store & store) const; // Convenience functions for common attributes. std::string getType() const; std::optional getNarHash() const; std::optional getRef() const; std::optional getRev() const; std::optional getRevCount() const; std::optional getLastModified() const; }; struct InputScheme { virtual ~InputScheme() { } virtual std::optional inputFromURL(const ParsedURL & url) = 0; virtual std::optional inputFromAttrs(const Attrs & attrs) = 0; virtual ParsedURL toURL(const Input & input); virtual bool hasAllInfo(const Input & input) = 0; virtual Input applyOverrides( const Input & input, std::optional ref, std::optional rev); virtual void clone(const Input & input, const Path & destDir); virtual std::optional getSourcePath(const Input & input); virtual void markChangedFile(const Input & input, std::string_view file, std::optional commitMsg); virtual std::pair fetch(ref store, const Input & input) = 0; }; void registerInputScheme(std::shared_ptr && fetcher); struct DownloadFileResult { StorePath storePath; std::string etag; std::string effectiveUrl; }; DownloadFileResult downloadFile( ref store, const std::string & url, const std::string & name, bool immutable, const Headers & headers = {}); std::pair downloadTarball( ref store, const std::string & url, const std::string & name, bool immutable, const Headers & headers = {}); }