|
|
@@ -3,7 +3,14 @@ |
|
|
|
#include <dds/project.hpp> |
|
|
|
#include <dds/temp.hpp> |
|
|
|
|
|
|
|
#include <libman/parse.hpp> |
|
|
|
|
|
|
|
#include <browns/md5.hpp> |
|
|
|
#include <browns/output.hpp> |
|
|
|
#include <neo/buffer.hpp> |
|
|
|
|
|
|
|
#include <range/v3/algorithm/for_each.hpp> |
|
|
|
#include <range/v3/algorithm/sort.hpp> |
|
|
|
#include <range/v3/view/filter.hpp> |
|
|
|
|
|
|
|
#include <spdlog/spdlog.h> |
|
|
@@ -12,30 +19,57 @@ using namespace dds; |
|
|
|
|
|
|
|
namespace { |
|
|
|
|
|
|
|
void sdist_copy_library(path_ref out_root, const library& lib, const sdist_params& params) { |
|
|
|
void hash_file(std::string_view prefix, path_ref fpath, browns::md5& hash) { |
|
|
|
hash.feed(neo::buffer(prefix)); |
|
|
|
std::ifstream infile; |
|
|
|
infile.exceptions(std::ios::failbit | std::ios::badbit); |
|
|
|
using file_iter = std::istreambuf_iterator<char>; |
|
|
|
infile.open(fpath, std::ios::binary); |
|
|
|
assert(infile.good()); |
|
|
|
hash.feed(neo::buffer("\nfile_content: ")); |
|
|
|
hash.feed(file_iter(infile), file_iter()); |
|
|
|
} |
|
|
|
|
|
|
|
void sdist_export_file(path_ref out_root, path_ref in_root, path_ref filepath, browns::md5& hash) { |
|
|
|
auto relpath = fs::relative(filepath, in_root); |
|
|
|
spdlog::info("Export file {}", relpath.string()); |
|
|
|
hash_file("filepath:" + relpath.generic_string(), filepath, hash); |
|
|
|
auto dest = out_root / relpath; |
|
|
|
fs::create_directories(dest.parent_path()); |
|
|
|
fs::copy(filepath, dest); |
|
|
|
} |
|
|
|
|
|
|
|
void sdist_copy_library(path_ref out_root, |
|
|
|
const library& lib, |
|
|
|
const sdist_params& params, |
|
|
|
browns::md5& hash) { |
|
|
|
auto sources_to_keep = // |
|
|
|
lib.sources() // |
|
|
|
| ranges::view::filter([&](const source_file& sf) { |
|
|
|
if (sf.kind == source_kind::source || sf.kind == source_kind::header) { |
|
|
|
if (sf.kind == source_kind::app && params.include_apps) { |
|
|
|
return true; |
|
|
|
} |
|
|
|
if (sf.kind == source_kind::app && params.include_apps) { |
|
|
|
if (sf.kind == source_kind::source || sf.kind == source_kind::header) { |
|
|
|
return true; |
|
|
|
} |
|
|
|
if (sf.kind == source_kind::test && params.include_tests) { |
|
|
|
return true; |
|
|
|
} |
|
|
|
return false; |
|
|
|
}); |
|
|
|
}) // |
|
|
|
| ranges::to_vector; |
|
|
|
|
|
|
|
ranges::sort(sources_to_keep, std::less<>(), DDS_TL(_1.path)); |
|
|
|
|
|
|
|
auto lib_dds_path = lib.base_dir() / "library.dds"; |
|
|
|
if (fs::is_regular_file(lib_dds_path)) { |
|
|
|
sdist_export_file(out_root, params.project_dir, lib_dds_path, hash); |
|
|
|
} |
|
|
|
|
|
|
|
spdlog::info("sdist: Export library from {}", lib.base_dir().string()); |
|
|
|
fs::create_directories(out_root); |
|
|
|
for (const auto& source : sources_to_keep) { |
|
|
|
auto relpath = fs::relative(source.path, lib.base_dir()); |
|
|
|
spdlog::info("Copy source file {}", relpath.string()); |
|
|
|
auto dest = out_root / relpath; |
|
|
|
fs::create_directories(dest.parent_path()); |
|
|
|
fs::copy(source.path, dest); |
|
|
|
sdist_export_file(out_root, params.project_dir, source.path, hash); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@@ -61,13 +95,27 @@ void dds::create_sdist(const sdist_params& params) { |
|
|
|
} |
|
|
|
|
|
|
|
void dds::create_sdist_in_dir(path_ref out, const sdist_params& params) { |
|
|
|
auto project = project::from_directory(params.project_dir); |
|
|
|
auto project = project::from_directory(params.project_dir); |
|
|
|
browns::md5 md5; |
|
|
|
|
|
|
|
if (project.main_library()) { |
|
|
|
sdist_copy_library(out, *project.main_library(), params); |
|
|
|
sdist_copy_library(out, *project.main_library(), params, md5); |
|
|
|
} |
|
|
|
|
|
|
|
auto man_path = project.root() / "manifest.dds"; |
|
|
|
for (const library& submod : project.submodules()) { |
|
|
|
sdist_copy_library(out, submod, params, md5); |
|
|
|
} |
|
|
|
|
|
|
|
auto man_path = project.root() / "package.dds"; |
|
|
|
if (fs::is_regular_file(man_path)) { |
|
|
|
fs::copy(man_path, out / man_path.filename()); |
|
|
|
sdist_export_file(out, params.project_dir, man_path, md5); |
|
|
|
} |
|
|
|
|
|
|
|
md5.pad(); |
|
|
|
auto hash_str = browns::format_digest(md5.digest()); |
|
|
|
spdlog::info("Generated export as {}-{}", project.manifest().name, hash_str); |
|
|
|
|
|
|
|
std::vector<lm::pair> pairs; |
|
|
|
pairs.emplace_back("MD5-Hash", hash_str); |
|
|
|
lm::write_pairs(out / "_meta.dds", pairs); |
|
|
|
} |