From 60220cbe4ffdc7ba3b86fdc3f920f883f049dcc6 Mon Sep 17 00:00:00 2001 From: Stephen Gutekanst Date: Tue, 23 Aug 2022 08:36:22 -0700 Subject: [PATCH] dev: ensure .git* files are standardized across subprojects Signed-off-by: Stephen Gutekanst --- dev/ensure-standard-files.zig | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/dev/ensure-standard-files.zig b/dev/ensure-standard-files.zig index 9b1389ba..7e1af457 100644 --- a/dev/ensure-standard-files.zig +++ b/dev/ensure-standard-files.zig @@ -1,8 +1,11 @@ +//! Ensures that standard files in subprojects, like LICENSE files, .gitattributes, etc. +//! are present and in-sync with the version in dev/template. +//! //! Usage: zig run ./dev/ensure-standard-files.zig const std = @import("std"); -const dirs = [_][]const u8{ +const projects = [_][]const u8{ ".", "basisu", "ecs", @@ -16,13 +19,32 @@ const dirs = [_][]const u8{ }; pub fn main() !void { - inline for (dirs) |dir| { - copyFile("dev/template/LICENSE", dir ++ "/LICENSE"); - copyFile("dev/template/LICENSE-MIT", dir ++ "/LICENSE-MIT"); - copyFile("dev/template/LICENSE-APACHE", dir ++ "/LICENSE-APACHE"); + inline for (projects) |project| { + copyFile("dev/template/LICENSE", project ++ "/LICENSE"); + copyFile("dev/template/LICENSE-MIT", project ++ "/LICENSE-MIT"); + copyFile("dev/template/LICENSE-APACHE", project ++ "/LICENSE-APACHE"); + copyFile("dev/template/.gitattributes", project ++ "/.gitattributes"); + copyFile("dev/template/.gitignore", project ++ "/.gitignore"); + + if (!std.mem.eql(u8, project, ".")) { + copyFile( + "dev/template/.github/pull_request_template.md", + project ++ "/.github/pull_request_template.md", + ); + replaceInFile(project ++ "/.github/pull_request_template.md", "foobar", project); + } + copyFile("dev/template/.github/FUNDING.yml", project ++ "/.github/FUNDING.yml"); } } pub fn copyFile(src_path: []const u8, dst_path: []const u8) void { + std.fs.cwd().makePath(std.fs.path.dirname(dst_path).?) catch unreachable; std.fs.cwd().copyFile(src_path, std.fs.cwd(), dst_path, .{}) catch unreachable; } + +pub fn replaceInFile(file_path: []const u8, needle: []const u8, replacement: []const u8) void { + const allocator = std.heap.page_allocator; + const data = std.fs.cwd().readFileAlloc(allocator, file_path, std.math.maxInt(usize)) catch unreachable; + const new_data = std.mem.replaceOwned(u8, allocator, data, needle, replacement) catch unreachable; + std.fs.cwd().writeFile(file_path, new_data) catch unreachable; +}