diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..90e7af499d68aa5e8dbd03d86fbad54cf9493ab3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/zig-* +/.zigmod +/deps.zig diff --git a/build.zig b/build.zig new file mode 100644 index 0000000000000000000000000000000000000000..58bea1710c156a3bb27231324d24a7b0e973b859 --- /dev/null +++ b/build.zig @@ -0,0 +1,23 @@ +const std = @import("std"); +const deps = @import("./deps.zig"); + +pub fn build(b: *std.build.Builder) void { + const target = b.standardTargetOptions(.{}); + + const mode = b.standardReleaseOptions(); + + const exe = b.addExecutable("zig-license-detect", "src/main.zig"); + exe.setTarget(target); + exe.setBuildMode(mode); + deps.addAllTo(exe); + exe.install(); + + const run_cmd = exe.run(); + run_cmd.step.dependOn(b.getInstallStep()); + if (b.args) |args| { + run_cmd.addArgs(args); + } + + const run_step = b.step("run", "Run the app"); + run_step.dependOn(&run_cmd.step); +} diff --git a/src/lib.zig b/src/lib.zig new file mode 100644 index 0000000000000000000000000000000000000000..9779de7c6a7f011f8ae2d06b7c690e99f785771a --- /dev/null +++ b/src/lib.zig @@ -0,0 +1,40 @@ +const std = @import("std"); +const licenses = @import("licenses-text"); +const leven = @import("leven"); +const fscheck = @import("fs-check"); + +pub fn detect(alloc: *std.mem.Allocator, license_src: []const u8) ![]const u8 { + var min: ?usize = null; + var ind: ?usize = null; + + for (licenses.spdx) |item, i| { + const distance = try leven.leven(u8, alloc, license_src, item[1], min); + + if (min == null or distance < min.?) { + min = distance; + ind = i; + } + } + + return licenses.spdx[ind.?][0]; +} + +pub fn detectInDir(alloc: *std.mem.Allocator, dir: std.fs.Dir) !?[]const u8 { + const lic_filename = (try testLicenseFile(dir, "LICENSE")) orelse + (try testLicenseFile(dir, "LICENSE.md")) orelse + null; + + if (lic_filename == null) return null; + const f = try dir.openFile(lic_filename.?, .{}); + defer f.close(); + const b = try f.reader().readAllAlloc(alloc, 1024 * 1024); + defer alloc.free(b); + return try detect(alloc, b); +} + +// +// + +pub fn testLicenseFile(dir: std.fs.Dir, name: []const u8) !?[]const u8 { + return if (try fscheck.doesFileExist(dir, name)) name else null; +} diff --git a/src/main.zig b/src/main.zig new file mode 100644 index 0000000000000000000000000000000000000000..26516517f87ead80a2174854146f15df36d2804f --- /dev/null +++ b/src/main.zig @@ -0,0 +1,14 @@ +const std = @import("std"); + +const detectlicense = @import("detect-license"); + +pub fn main() !void { + std.log.info("All your codebase are belong to us.", .{}); + + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + const alloc = &gpa.allocator; + + const license = try detectlicense.detectInDir(alloc, std.fs.cwd()); + std.debug.assert(std.mem.eql(u8, license.?, "MIT")); + std.log.info("OK", .{}); +} diff --git a/zig.mod b/zig.mod new file mode 100644 index 0000000000000000000000000000000000000000..35ec68ef1b8618a57b703a7e2245f188b9edc744 --- /dev/null +++ b/zig.mod @@ -0,0 +1,9 @@ +id: 2ovav391ivakpt5uh706c38jy7wddi6tqo5rmbdwig9ngkh7 +name: detect-license +main: src/lib.zig +license: MIT +description: Given an input text guess which SPDX license it most likely is an instance of +dependencies: + - src: git https://github.com/nektro/zig-licenses-text + - src: git https://github.com/nektro/zig-leven + - src: git https://github.com/nektro/zig-fs-check diff --git a/zigmod.lock b/zigmod.lock new file mode 100644 index 0000000000000000000000000000000000000000..df147ae26d18464e8b11caa1e2b2bf31a67997a8 --- /dev/null +++ b/zigmod.lock @@ -0,0 +1,5 @@ +2 +git https://github.com/nektro/zig-licenses-text commit-3c07c6e4eb0965dafd0b029c632f823631b3169c +git https://github.com/nektro/zig-leven commit-8e9f827117ab1418578b692a2325754cc3ee692d +git https://github.com/nektro/zig-range commit-890ca308fe09b3d5c866d5cfb3b3d7a95dbf939f +git https://github.com/nektro/zig-fs-check commit-dcd8da90fcb8bf3c9887e713bf0ec072bc897dd5 diff --git a/zigmod.sum b/zigmod.sum new file mode 100644 index 0000000000000000000000000000000000000000..edf3e4c83736365310392451f5192998d08447e0 --- /dev/null +++ b/zigmod.sum @@ -0,0 +1,4 @@ +blake3-20ceb9e27bdb93540e93006628fb94e0540f3f69a2304a8f73ad2989b8e27226 git/github.com/nektro/zig-licenses-text +blake3-cf68eaad66254b89c8bc18578f58607aa2e87ae59dd5696c2394eb5a0a31c455 git/github.com/nektro/zig-leven +blake3-09698753782139ab4877d08f33235170836f68b73e482b65cdee5637a6addf86 git/github.com/nektro/zig-range +blake3-10460da714f5c8436d09c268795597b0b2686ffc1e789c9f50366c2cbb0e1ff3 git/github.com/nektro/zig-fs-check