about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/exe.zig40
-rw-r--r--src/main.zig35
2 files changed, 67 insertions, 8 deletions
diff --git a/src/exe.zig b/src/exe.zig
index fc24c50..998ea3b 100644
--- a/src/exe.zig
+++ b/src/exe.zig
@@ -82,7 +82,6 @@ fn pandocWorker(ctx: *Context, page: []const u8) !void {
     defer ctx.allocator().free(mtime_str);
 
     const f = try fs.FileSwapper.createAt(ctx.allocator(), target_path);
-    defer f.close();
 
     var buffer: [1024]u8 = undefined;
     var w = f.writer(&buffer);
@@ -113,6 +112,45 @@ fn pandocWorker(ctx: *Context, page: []const u8) !void {
         "--output=-",
         source_path,
     }, &env_map, &w.interface);
+
+    f.close();
+
+    if (f.swapped.*) {
+        try ctx.generated.append(
+            ctx.allocator(),
+            try ctx.allocator().dupe(u8, target_path),
+        );
+    }
+}
+
+pub fn commit(ctx: *Context, paths: []const []const u8) !void {
+    // skip early if we have nothing to do
+    if (paths.len == 0) return;
+
+    // skip if staging is unclean
+    shell(ctx,
+        \\git diff --cached --exit-code
+    , null) catch |e| switch (e) {
+        error.NonZeroExitCode => return,
+        else => return e,
+    };
+
+    for (paths) |f| {
+        const cmd = try std.fmt.allocPrint(ctx.allocator(), "git add {s}", .{f});
+        defer ctx.allocator().free(cmd);
+
+        try shell(ctx, cmd, null);
+    }
+
+    try shell(ctx,
+        \\GIT_COMMITTER_NAME=rbc git commit --quiet --message=*
+    , null);
+
+    try shell(ctx,
+        \\git show --stat --pretty=oneline
+    , null);
+
+    log.info("Committed {d} paths", .{paths.len});
 }
 
 pub fn captureStdout(ctx: *Context, argv: []const []const u8, env_map: ?*std.process.EnvMap, w: *std.Io.Writer) !void {
diff --git a/src/main.zig b/src/main.zig
index d7cb0c4..f47bd36 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -144,17 +144,17 @@ const Cli = struct {
         _ = argv.skip(); // skip arg0
 
         if (argv.inner.count == 1) {
-            try Cli.mdCmd(ctx);
-            try Cli.genCmd(ctx);
+            try Cli.mdCmd(ctx, null);
+            try Cli.genCmd(ctx, null);
         }
 
         while (argv.next()) |arg| {
             if (std.mem.eql(u8, arg, "help")) {
                 Cli.helpCmd(ctx);
             } else if (std.mem.eql(u8, arg, "gen")) {
-                try Cli.genCmd(ctx);
+                try Cli.genCmd(ctx, &argv);
             } else if (std.mem.eql(u8, arg, "md")) {
-                try Cli.mdCmd(ctx);
+                try Cli.mdCmd(ctx, &argv);
             } else if (std.mem.eql(u8, arg, "watch")) {
                 try Cli.watchCmd(ctx);
             } else if (std.mem.eql(u8, arg, "serve")) {
@@ -165,25 +165,46 @@ const Cli = struct {
         }
     }
 
+    fn checkOpts(maybe_argv: ?*std.process.ArgIterator, opts: []const []const u8) bool {
+        if (maybe_argv) |argv| {
+            const arg = argv.next() orelse return false;
+            // check opts
+            for (opts) |opt| {
+                if (std.mem.eql(u8, arg, opt)) return true;
+            }
+            // rewind argv
+            argv.*.inner.index -= 1;
+            return false;
+        } else {
+            return false;
+        }
+    }
+
     fn helpCmd(_: *Context) void {
         std.debug.print("usage: rbl [gen|md|watch|serve]\n\n", .{});
     }
 
-    fn genCmd(ctx: *Context) !void {
+    fn genCmd(ctx: *Context, argv: ?*std.process.ArgIterator) !void {
         try index(ctx);
         try gen.generate(ctx);
+
+        if (checkOpts(argv, &.{ "-c", "--commit" }))
+            try exe.commit(ctx, ctx.generated.items);
     }
 
-    fn mdCmd(ctx: *Context) !void {
+    fn mdCmd(ctx: *Context, argv: ?*std.process.ArgIterator) !void {
         try index(ctx);
         try exe.runPandoc(ctx);
+
+        if (checkOpts(argv, &.{ "-c", "--commit" }))
+            try exe.commit(ctx, ctx.generated.items);
     }
 
     fn watchCmd(ctx: *Context) !void {
         const selfExe = try std.fs.selfExePathAlloc(ctx.allocator());
         const command = try std.fmt.allocPrint(ctx.allocator(),
             \\find ./src/inc/ -type f -print | entr -nc -dd -- {s} md gen
-            , .{selfExe});
+        , .{selfExe});
 
         try exe.shell(ctx, command, null);
     }