srctree

Gregory Mullen parent 27ff82d1 96595a4d
rename Context into Verse

src/api.zig added: 149, removed: 176, total 0
@@ -2,7 +2,7 @@ const std = @import("std");
const Allocator = std.mem.Allocator;
 
pub const Routes = @import("routes.zig");
pub const Context = @import("context.zig");
pub const Verse = @import("verse.zig");
 
const ROUTE = Routes.ROUTE;
 
@@ -34,7 +34,7 @@ const APIRouteData = struct {
}
};
 
pub fn router(ctx: *Context) Routes.Error!Routes.Callable {
pub fn router(ctx: *Verse) Routes.Error!Routes.Callable {
const uri_api = ctx.uri.next() orelse return heartbeat;
if (!std.mem.eql(u8, uri_api, "api")) return heartbeat;
const rd = try APIRouteData.init(ctx.alloc);
@@ -47,7 +47,7 @@ const Diff = struct {
sha: []const u8,
};
 
fn diff(ctx: *Context) Routes.Error!void {
fn diff(ctx: *Verse) Routes.Error!void {
return try ctx.sendJSON([0]Diff{});
}
 
@@ -55,7 +55,7 @@ const HeartBeat = struct {
nice: usize = 0,
};
 
fn heartbeat(ctx: *Context) Routes.Error!void {
fn heartbeat(ctx: *Verse) Routes.Error!void {
return try ctx.sendJSON(HeartBeat{ .nice = 69 });
}
 
@@ -63,7 +63,7 @@ const Issue = struct {
index: usize,
};
 
fn issue(ctx: *Context) Routes.Error!void {
fn issue(ctx: *Verse) Routes.Error!void {
return try ctx.sendJSON([0]Issue{});
}
 
@@ -82,7 +82,7 @@ const Network = struct {
networks: []RemotePeer,
};
 
fn network(ctx: *Context) Routes.Error!void {
fn network(ctx: *Verse) Routes.Error!void {
return try ctx.sendJSON(Network{ .networks = [0].{} });
}
 
@@ -90,7 +90,7 @@ const Patch = struct {
patch: []const u8,
};
 
fn patch(ctx: *Context) Routes.Error!void {
fn patch(ctx: *Verse) Routes.Error!void {
return try ctx.sendJSON(Patch{ .patch = [0].{} });
}
 
@@ -102,7 +102,7 @@ const Flex = struct {
};
};
 
fn flex(ctx: *Context) Routes.Error!void {
fn flex(ctx: *Verse) Routes.Error!void {
return try ctx.sendJSON([0]Flex{});
}
 
@@ -111,6 +111,6 @@ const User = struct {
email: []const u8,
};
 
fn user(ctx: *Context) Routes.Error!void {
fn user(ctx: *Verse) Routes.Error!void {
return try ctx.sendJSON([0]User{});
}
 
src/api/repo.zig added: 149, removed: 176, total 0
@@ -14,7 +14,7 @@ const endpoints = [_]Routes.Match{
ROUTE("tags", repoTags),
};
 
pub fn router(ctx: *API.Context) Routes.Error!Routes.Callable {
pub fn router(ctx: *API.Verse) Routes.Error!Routes.Callable {
const uri_api = ctx.uri.next() orelse return repo;
if (!std.mem.eql(u8, uri_api, "repo")) return repo;
 
@@ -45,7 +45,7 @@ fn openRepo(a: Allocator, raw_name: []const u8) !Git.Repo {
return gitrepo;
}
 
pub fn repo(ctx: *API.Context) API.Routes.Error!void {
pub fn repo(ctx: *API.Verse) API.Routes.Error!void {
const req = try ctx.reqdata.validate(RepoRequest);
 
var gitrepo = openRepo(ctx.alloc, req.name) catch |err| switch (err) {
@@ -84,7 +84,7 @@ pub const RepoBranches = struct {
branches: []const Branch,
};
 
pub fn repoBranches(ctx: *API.Context) API.Routes.Error!void {
pub fn repoBranches(ctx: *API.Verse) API.Routes.Error!void {
const req = try ctx.reqdata.validate(RepoRequest);
 
var gitrepo = openRepo(ctx.alloc, req.name) catch |err| switch (err) {
@@ -121,7 +121,7 @@ pub const RepoTags = struct {
tags: []const []const u8,
};
 
pub fn repoTags(ctx: *API.Context) API.Routes.Error!void {
pub fn repoTags(ctx: *API.Verse) API.Routes.Error!void {
const req = try ctx.reqdata.validate(RepoRequest);
 
var gitrepo = openRepo(ctx.alloc, req.name) catch |err| switch (err) {
 
src/endpoints/admin.zig added: 149, removed: 176, total 0
@@ -2,7 +2,7 @@ const std = @import("std");
 
const Allocator = std.mem.Allocator;
 
const Context = @import("../context.zig");
const Verse = @import("../verse.zig");
const Route = @import("../routes.zig");
const HTML = @import("../html.zig");
const DOM = @import("../dom.zig");
@@ -39,7 +39,7 @@ const AdminPage = Template.PageData("admin.html");
/// TODO fix me
const btns = [1]Template.Structs.NavButtons{.{ .name = "inbox", .extra = 0, .url = "/inbox" }};
 
fn default(ctx: *Context) Error!void {
fn default(ctx: *Verse) Error!void {
try ctx.request.auth.validOrError();
var dom = DOM.new(ctx.alloc);
const action = "/admin/post";
@@ -69,7 +69,7 @@ fn default(ctx: *Context) Error!void {
try ctx.sendPage(&page);
}
 
fn cloneUpstream(ctx: *Context) Error!void {
fn cloneUpstream(ctx: *Verse) Error!void {
try ctx.request.auth.validOrError();
var dom = DOM.new(ctx.alloc);
const action = "/admin/clone-upstream";
@@ -104,7 +104,7 @@ const CloneUpstreamReq = struct {
repo_uri: []const u8,
};
 
fn postCloneUpstream(ctx: *Context) Error!void {
fn postCloneUpstream(ctx: *Verse) Error!void {
try ctx.request.auth.validOrError();
 
const udata = ctx.reqdata.post.?.validate(CloneUpstreamReq) catch return error.BadData;
@@ -151,7 +151,7 @@ fn postCloneUpstream(ctx: *Context) Error!void {
try ctx.sendPage(&page);
}
 
fn postNewRepo(ctx: *Context) Error!void {
fn postNewRepo(ctx: *Verse) Error!void {
try ctx.request.auth.validOrError();
// TODO ini repo dir
var valid = if (ctx.reqdata.post) |p|
@@ -205,7 +205,7 @@ fn postNewRepo(ctx: *Context) Error!void {
try ctx.sendPage(&page);
}
 
fn newRepo(ctx: *Context) Error!void {
fn newRepo(ctx: *Verse) Error!void {
try ctx.request.auth.validOrError();
var dom = DOM.new(ctx.alloc);
const action = "/admin/new-repo";
@@ -233,7 +233,7 @@ fn newRepo(ctx: *Context) Error!void {
try ctx.sendPage(&page);
}
 
fn view(ctx: *Context) Error!void {
fn view(ctx: *Verse) Error!void {
try ctx.request.auth.validOrError();
if (ctx.reqdata.post) |pd| {
std.debug.print("{any}\n", .{pd.items});
 
src/endpoints/commit-flex.zig added: 149, removed: 176, total 0
@@ -8,7 +8,7 @@ const Git = @import("../git.zig");
 
const DOM = @import("../dom.zig");
const HTML = @import("../html.zig");
const Context = @import("../context.zig");
const Verse = @import("../verse.zig");
const Template = @import("../template.zig");
const S = Template.Structs;
 
@@ -209,7 +209,7 @@ const YEAR = 31_536_000;
 
const UserCommitsPage = Template.PageData("user_commits.html");
 
pub fn commitFlex(ctx: *Context) Error!void {
pub fn commitFlex(ctx: *Verse) Error!void {
const monthAtt = HTML.Attr.class("month");
 
var nowish = DateTime.now();
 
src/endpoints/gist.zig added: 149, removed: 176, total 0
@@ -1,7 +1,7 @@
const std = @import("std");
const allocPrint = std.fmt.allocPrint;
 
const Context = @import("../context.zig");
const Verse = @import("../verse.zig");
const Template = @import("../template.zig");
const RequestData = @import("../request_data.zig").RequestData;
const Bleach = @import("../bleach.zig");
@@ -25,7 +25,7 @@ const endpoints = [_]Route.Match{
POST("post", post),
};
 
pub fn router(ctx: *Context) Error!Route.Callable {
pub fn router(ctx: *Verse) Error!Route.Callable {
if (!std.mem.eql(u8, ctx.uri.next() orelse "", "gist")) return error.Unrouteable;
 
if (ctx.uri.peek()) |peek| {
@@ -50,7 +50,7 @@ const GistPost = struct {
new_file: ?[]const u8,
};
 
fn post(ctx: *Context) Error!void {
fn post(ctx: *Verse) Error!void {
try ctx.request.auth.validOrError();
 
const udata = RequestData(GistPost).initMap(ctx.alloc, ctx.reqdata) catch return error.BadData;
@@ -90,12 +90,12 @@ fn post(ctx: *Context) Error!void {
return ctx.response.redirect("/gist/" ++ hash_str, true) catch unreachable;
}
 
fn new(ctx: *Context) Error!void {
fn new(ctx: *Verse) Error!void {
const files = [1]Template.Structs.GistFiles{.{}};
return edit(ctx, &files);
}
 
fn edit(ctx: *Context, files: []const Template.Structs.GistFiles) Error!void {
fn edit(ctx: *Verse, files: []const Template.Structs.GistFiles) Error!void {
// TODO move this back into context somehow
var btns = [1]Template.Structs.NavButtons{
.{ .name = "inbox", .extra = 0, .url = "/inbox" },
@@ -130,7 +130,7 @@ fn toTemplate(a: Allocator, files: []const Gist.File) ![]Template.Structs.GistFi
return out;
}
 
fn view(ctx: *Context) Error!void {
fn view(ctx: *Verse) Error!void {
// TODO move this back into context somehow
var btns = [1]Template.Structs.NavButtons{.{ .name = "inbox", .extra = 0, .url = "/inbox" }};
 
 
src/endpoints/network.zig added: 149, removed: 176, total 0
@@ -2,7 +2,7 @@ const std = @import("std");
const allocPrint = std.fmt.allocPrint;
 
const DOM = @import("../dom.zig");
const Context = @import("../context.zig");
const Verse = @import("../verse.zig");
const Template = @import("../template.zig");
 
const Route = @import("../routes.zig");
@@ -21,7 +21,7 @@ pub const endpoints = [_]Route.Match{
 
const NetworkPage = Template.PageData("network.html");
 
fn default(ctx: *Context) Error!void {
fn default(ctx: *Verse) Error!void {
var dom = DOM.new(ctx.alloc);
 
const list = try Repos.allNames(ctx.alloc);
 
src/endpoints/repos.zig added: 149, removed: 176, total 0
@@ -6,7 +6,7 @@ const eql = std.mem.eql;
const startsWith = std.mem.startsWith;
const splitScalar = std.mem.splitScalar;
 
const Context = @import("../context.zig");
const Verse = @import("../verse.zig");
const Response = @import("../response.zig");
const Request = @import("../request.zig");
const HTML = @import("../html.zig");
@@ -91,7 +91,7 @@ pub const RouteData = struct {
}
};
 
pub fn navButtons(ctx: *Context) ![2]Template.Structs.NavButtons {
pub fn navButtons(ctx: *Verse) ![2]Template.Structs.NavButtons {
const rd = RouteData.make(&ctx.uri) orelse unreachable;
if (!rd.exists()) unreachable;
var i_count: usize = 0;
@@ -122,7 +122,7 @@ pub fn navButtons(ctx: *Context) ![2]Template.Structs.NavButtons {
return btns;
}
 
pub fn router(ctx: *Context) Error!Route.Callable {
pub fn router(ctx: *Verse) Error!Route.Callable {
const rd = RouteData.make(&ctx.uri) orelse return list;
 
if (rd.exists()) {
@@ -142,19 +142,19 @@ pub fn router(ctx: *Context) Error!Route.Callable {
//const issuecnt = try std.fmt.allocPrint(ctx.alloc, "{}", .{i_count});
//const diffcnt = try std.fmt.allocPrint(ctx.alloc, "{}", .{d_count});
//const diffurl = try std.fmt.allocPrint(ctx.alloc, "/repos/{s}/diffs/", .{rd.name});
//const header_nav = try ctx.alloc.dupe(Template.Context, &[2]Template.Context{
// Template.Context.initWith(ctx.alloc, &[3]Template.Context.Pair{
//const header_nav = try ctx.alloc.dupe(Template.Verse, &[2]Template.Verse{
// Template.Verse.initWith(ctx.alloc, &[3]Template.Verse.Pair{
// .{ .name = "Name", .value = "issues" },
// .{ .name = "Url", .value = issueurl },
// .{ .name = "Extra", .value = issuecnt },
// }) catch return error.OutOfMemory,
// Template.Context.initWith(ctx.alloc, &[3]Template.Context.Pair{
// Template.Verse.initWith(ctx.alloc, &[3]Template.Verse.Pair{
// .{ .name = "Name", .value = "diffs" },
// .{ .name = "Url", .value = diffurl },
// .{ .name = "Extra", .value = diffcnt },
// }) catch return error.OutOfMemory,
//});
//try ctx.putContext("NavButtons", .{ .block = header_nav });
//try ctx.putVerse("NavButtons", .{ .block = header_nav });
 
if (rd.verb) |_| {
_ = ctx.uri.next();
@@ -266,7 +266,7 @@ const RepoSortReq = struct {
sort: ?[]const u8,
};
 
fn list(ctx: *Context) Error!void {
fn list(ctx: *Verse) Error!void {
var cwd = std.fs.cwd();
 
const udata = ctx.reqdata.query.validate(RepoSortReq) catch return error.BadData;
@@ -342,13 +342,13 @@ fn dupeDir(a: Allocator, name: []const u8) ![]u8 {
}
 
const NewRepoPage = Template.PageData("repo-new.html");
fn newRepo(ctx: *Context) Error!void {
fn newRepo(ctx: *Verse) Error!void {
ctx.response.status = .ok;
 
return error.NotImplemented;
}
 
fn treeBlob(ctx: *Context) Error!void {
fn treeBlob(ctx: *Verse) Error!void {
const rd = RouteData.make(&ctx.uri) orelse return error.Unrouteable;
_ = ctx.uri.next();
 
@@ -473,7 +473,7 @@ fn parseBlame(a: Allocator, blame_txt: []const u8) !struct {
 
const BlamePage = Template.PageData("blame.html");
 
fn blame(ctx: *Context) Error!void {
fn blame(ctx: *Verse) Error!void {
const rd = RouteData.make(&ctx.uri) orelse return error.Unrouteable;
std.debug.assert(std.mem.eql(u8, rd.verb orelse "", "blame"));
_ = ctx.uri.next();
@@ -580,7 +580,7 @@ fn excludedExt(name: []const u8) bool {
 
const BlobPage = Template.PageData("blob.html");
 
fn blob(ctx: *Context, repo: *Git.Repo, pfiles: Git.Tree) Error!void {
fn blob(ctx: *Verse, repo: *Git.Repo, pfiles: Git.Tree) Error!void {
var blb: Git.Blob = undefined;
 
var files = pfiles;
@@ -722,13 +722,13 @@ fn drawTree(a: Allocator, ddom: *DOM, rname: []const u8, base: []const u8, obj:
 
const TreePage = Template.PageData("tree.html");
 
fn tree(ctx: *Context, repo: *Git.Repo, files: *Git.Tree) Error!void {
fn tree(ctx: *Verse, repo: *Git.Repo, files: *Git.Tree) Error!void {
//const head = if (repo.head) |h| switch (h) {
// .sha => |s| s.hex[0..],
// .branch => |b| b.name,
// else => "unknown",
//} else "unknown";
//ctx.putContext("Branch.default", .{ .slice = head }) catch return error.Unknown;
//ctx.putVerse("Branch.default", .{ .slice = head }) catch return error.Unknown;
 
const rd = RouteData.make(&ctx.uri) orelse return error.Unrouteable;
ctx.uri.reset();
@@ -820,7 +820,7 @@ fn tree(ctx: *Context, repo: *Git.Repo, files: *Git.Tree) Error!void {
 
const TagPage = Template.PageData("repo-tags.html");
 
fn tagsList(ctx: *Context) Error!void {
fn tagsList(ctx: *Verse) Error!void {
const rd = RouteData.make(&ctx.uri) orelse return error.Unrouteable;
 
var cwd = std.fs.cwd();
 
src/endpoints/repos/commits.zig added: 149, removed: 176, total 0
@@ -10,7 +10,7 @@ const Diffs = @import("diffs.zig");
const Repos = @import("../repos.zig");
 
const Bleach = @import("../../bleach.zig");
const Context = @import("../../context.zig");
const Verse = @import("../../verse.zig");
const DOM = @import("../../dom.zig");
const Git = @import("../../git.zig");
const HTML = @import("../../html.zig");
@@ -44,21 +44,21 @@ const AddComment = struct {
text: []const u8,
};
 
pub fn router(ctx: *Context) Error!Route.Callable {
pub fn router(ctx: *Verse) Error!Route.Callable {
const rd = RouteData.make(&ctx.uri) orelse return commitsView;
if (rd.verb != null and std.mem.eql(u8, "commit", rd.verb.?))
return viewCommit;
return commitsView;
}
 
fn newComment(ctx: *Context) Error!void {
fn newComment(ctx: *Verse) Error!void {
if (ctx.reqdata.post) |post| {
_ = post.validate(AddComment) catch return error.BadData;
}
return error.BadData;
}
 
pub fn patchContext(a: Allocator, patch: *Patch.Patch) ![]Template.Context {
pub fn patchVerse(a: Allocator, patch: *Patch.Patch) ![]Template.Context {
patch.parse(a) catch |err| {
if (std.mem.indexOf(u8, patch.blob, "\nMerge: ") == null) {
std.debug.print("'''\n{s}\n'''\n", .{patch.blob});
@@ -69,10 +69,10 @@ pub fn patchContext(a: Allocator, patch: *Patch.Patch) ![]Template.Context {
return error.PatchInvalid;
};
 
return try patch.diffsContextSlice(a);
return try patch.diffsVerseSlice(a);
}
 
fn commitHtml(ctx: *Context, sha: []const u8, repo_name: []const u8, repo: Git.Repo) Error!void {
fn commitHtml(ctx: *Verse, sha: []const u8, repo_name: []const u8, repo: Git.Repo) Error!void {
if (!Git.commitish(sha)) {
std.debug.print("Abusive ''{s}''\n", .{sha});
return error.Abusive;
@@ -181,7 +181,7 @@ fn commitHtml(ctx: *Context, sha: []const u8, repo_name: []const u8, repo: Git.R
return ctx.sendPage(&page) catch unreachable;
}
 
pub fn commitPatch(ctx: *Context, sha: []const u8, repo: Git.Repo) Error!void {
pub fn commitPatch(ctx: *Verse, sha: []const u8, repo: Git.Repo) Error!void {
var acts = repo.getAgent(ctx.alloc);
if (endsWith(u8, sha, ".patch")) {
var rbuf: [0xff]u8 = undefined;
@@ -200,7 +200,7 @@ pub fn commitPatch(ctx: *Context, sha: []const u8, repo: Git.Repo) Error!void {
}
}
 
pub fn viewCommit(ctx: *Context) Error!void {
pub fn viewCommit(ctx: *Verse) Error!void {
const rd = RouteData.make(&ctx.uri) orelse return error.Unrouteable;
if (rd.verb == null) return commitsView(ctx);
 
@@ -295,7 +295,7 @@ pub fn htmlCommit(a: Allocator, c: Git.Commit, repo: []const u8, comptime top: b
return dom.done();
}
 
fn commitContext(a: Allocator, c: Git.Commit, repo_name: []const u8) !S.Commits {
fn commitVerse(a: Allocator, c: Git.Commit, repo_name: []const u8) !S.Commits {
var parcount: usize = 0;
for (c.parent) |p| {
if (p != null) parcount += 1;
@@ -360,7 +360,7 @@ fn buildListBetween(
}
var found: usize = 0;
for (commits, 1..) |*c, i| {
c.* = try commitContext(a, current, name);
c.* = try commitVerse(a, current, name);
found = i;
outsha.* = current.sha;
if (left) |l| if (current.sha.eqlIsh(l)) break;
@@ -372,7 +372,7 @@ fn buildListBetween(
return commits;
}
 
pub fn commitsView(ctx: *Context) Error!void {
pub fn commitsView(ctx: *Verse) Error!void {
const rd = RouteData.make(&ctx.uri) orelse return error.Unrouteable;
 
if (ctx.uri.next()) |next| {
@@ -411,7 +411,7 @@ pub fn commitsView(ctx: *Context) Error!void {
return sendCommits(ctx, cmts_list, rd.name, last_sha.hex[0..8]);
}
 
pub fn commitsBefore(ctx: *Context) Error!void {
pub fn commitsBefore(ctx: *Verse) Error!void {
const rd = RouteData.make(&ctx.uri) orelse return error.Unrouteable;
 
std.debug.assert(std.mem.eql(u8, "after", ctx.uri.next().?));
@@ -423,13 +423,13 @@ pub fn commitsBefore(ctx: *Context) Error!void {
repo.loadData(ctx.alloc) catch return error.Unknown;
 
const before: Git.SHA = if (ctx.uri.next()) |bf| Git.SHA.initPartial(bf);
const commits_b = try ctx.alloc.alloc(Template.Context, 50);
const commits_b = try ctx.alloc.alloc(Template.Verse, 50);
var last_sha: Git.SHA = undefined;
const cmts_list = try buildList(ctx.alloc, repo, rd.name, before, commits_b, &last_sha);
return sendCommits(ctx, cmts_list, rd.name, last_sha[0..]);
}
 
fn sendCommits(ctx: *Context, list: []const S.Commits, repo_name: []const u8, sha: []const u8) Error!void {
fn sendCommits(ctx: *Verse, list: []const S.Commits, repo_name: []const u8, sha: []const u8) Error!void {
const meta_head = S.MetaHeadHtml{ .open_graph = .{} };
 
var page = CommitsListPage.init(.{
 
src/endpoints/repos/diffs.zig added: 149, removed: 176, total 0
@@ -18,7 +18,7 @@ const Repos = @import("../repos.zig");
 
const Git = @import("../../git.zig");
const Bleach = @import("../../bleach.zig");
const Context = @import("../../context.zig");
const Verse = @import("../../verse.zig");
const DOM = @import("../../dom.zig");
const HTML = @import("../../html.zig");
const Humanize = @import("../../humanize.zig");
@@ -51,7 +51,7 @@ fn isHex(input: []const u8) ?usize {
return std.fmt.parseInt(usize, input, 16) catch null;
}
 
pub fn router(ctx: *Context) Error!Route.Callable {
pub fn router(ctx: *Verse) Error!Route.Callable {
if (!eql(u8, "diffs", ctx.uri.next() orelse return error.Unrouteable))
return error.Unrouteable;
const verb = ctx.uri.peek() orelse return Route.router(ctx, &routes);
@@ -79,7 +79,7 @@ const DiffCreateChangeReq = struct {
desc: []const u8,
};
 
fn new(ctx: *Context) Error!void {
fn new(ctx: *Verse) Error!void {
var network: ?S.Network = null;
var patchuri: ?S.PatchUri = .{};
var title: ?[]const u8 = null;
@@ -158,7 +158,7 @@ const DiffCreateReq = struct {
//},
};
 
fn createDiff(ctx: *Context) Error!void {
fn createDiff(ctx: *Verse) Error!void {
const rd = Repos.RouteData.make(&ctx.uri) orelse return error.Unrouteable;
if (ctx.reqdata.post) |post| {
const udata = post.validate(DiffCreateReq) catch return error.BadData;
@@ -206,7 +206,7 @@ fn createDiff(ctx: *Context) Error!void {
return try new(ctx);
}
 
fn newComment(ctx: *Context) Error!void {
fn newComment(ctx: *Verse) Error!void {
const rd = Repos.RouteData.make(&ctx.uri) orelse return error.Unrouteable;
var buf: [2048]u8 = undefined;
if (ctx.reqdata.post) |post| {
@@ -232,7 +232,7 @@ fn newComment(ctx: *Context) Error!void {
return error.Unknown;
}
 
pub fn directReply(ctx: *Context) Error!void {
pub fn directReply(ctx: *Verse) Error!void {
_ = ctx.uri.next().?;
_ = ctx.uri.next().?;
std.debug.print("{s}\n", .{ctx.uri.next().?});
@@ -630,7 +630,7 @@ fn translateComment(a: Allocator, comment: []const u8, patch: Patch, repo: *cons
 
const DiffViewPage = Template.PageData("delta-diff.html");
 
fn view(ctx: *Context) Error!void {
fn view(ctx: *Verse) Error!void {
const rd = Repos.RouteData.make(&ctx.uri) orelse return error.Unrouteable;
 
var cwd = std.fs.cwd();
@@ -759,7 +759,7 @@ fn view(ctx: *Context) Error!void {
}
 
const DeltaListPage = Template.PageData("delta-list.html");
fn list(ctx: *Context) Error!void {
fn list(ctx: *Verse) Error!void {
const rd = Repos.RouteData.make(&ctx.uri) orelse return error.Unrouteable;
 
const last = Delta.last(rd.name) + 1;
 
src/endpoints/repos/issues.zig added: 149, removed: 176, total 0
@@ -7,7 +7,7 @@ const fmtSliceHexLower = std.fmt.fmtSliceHexLower;
const Route = @import("../../routes.zig");
const DOM = @import("../../dom.zig");
const HTML = @import("../../html.zig");
const Context = @import("../../context.zig");
const Verse = @import("../../verse.zig");
const Template = @import("../../template.zig");
const Error = Route.Error;
const UriIter = Route.Error;
@@ -37,7 +37,7 @@ fn isHex(input: []const u8) ?usize {
return std.fmt.parseInt(usize, input, 16) catch null;
}
 
pub fn router(ctx: *Context) Error!Route.Callable {
pub fn router(ctx: *Verse) Error!Route.Callable {
std.debug.assert(std.mem.eql(u8, "issues", ctx.uri.next().?));
const verb = ctx.uri.peek() orelse return Route.router(ctx, &routes);
 
@@ -50,7 +50,7 @@ pub fn router(ctx: *Context) Error!Route.Callable {
 
const IssueNewPage = Template.PageData("issue-new.html");
 
fn new(ctx: *Context) Error!void {
fn new(ctx: *Verse) Error!void {
const meta_head = S.MetaHeadHtml{ .open_graph = .{} };
var page = IssueNewPage.init(.{
.meta_head = meta_head,
@@ -67,7 +67,7 @@ const IssueCreate = struct {
desc: []const u8,
};
 
fn newPost(ctx: *Context) Error!void {
fn newPost(ctx: *Verse) Error!void {
const rd = Repos.RouteData.make(&ctx.uri) orelse return error.Unrouteable;
var buf: [2048]u8 = undefined;
if (ctx.reqdata.post) |post| {
@@ -93,7 +93,7 @@ fn newPost(ctx: *Context) Error!void {
return ctx.response.redirect(loc, true) catch unreachable;
}
 
fn newComment(ctx: *Context) Error!void {
fn newComment(ctx: *Verse) Error!void {
const rd = Repos.RouteData.make(&ctx.uri) orelse return error.Unrouteable;
if (ctx.reqdata.post) |post| {
var valid = post.validator();
@@ -124,7 +124,7 @@ fn newComment(ctx: *Context) Error!void {
 
const DeltaIssuePage = Template.PageData("delta-issue.html");
 
fn view(ctx: *Context) Error!void {
fn view(ctx: *Verse) Error!void {
const rd = Repos.RouteData.make(&ctx.uri) orelse return error.Unrouteable;
const delta_id = ctx.uri.next().?;
const index = isHex(delta_id) orelse return error.Unrouteable;
@@ -179,7 +179,7 @@ fn view(ctx: *Context) Error!void {
 
const DeltaListHtml = Template.PageData("delta-list.html");
 
fn list(ctx: *Context) Error!void {
fn list(ctx: *Verse) Error!void {
const rd = Repos.RouteData.make(&ctx.uri) orelse return error.Unrouteable;
 
const last = Delta.last(rd.name) + 1;
 
src/endpoints/search.zig added: 149, removed: 176, total 0
@@ -3,7 +3,7 @@ const Allocator = std.mem.Allocator;
const splitScalar = std.mem.splitScalar;
const allocPrint = std.fmt.allocPrint;
 
const Context = @import("../context.zig");
const Verse = @import("../verse.zig");
const Delta = @import("../types.zig").Delta;
const Template = @import("../template.zig");
const Route = @import("../routes.zig");
@@ -19,7 +19,7 @@ pub const routes = [_]Route.Match{
ROUTE("inbox", inbox),
};
 
pub fn router(ctx: *Context) Error!Route.Callable {
pub fn router(ctx: *Verse) Error!Route.Callable {
return Route.router(ctx, &routes);
}
 
@@ -27,11 +27,11 @@ const SearchReq = struct {
q: ?[]const u8,
};
 
fn inbox(ctx: *Context) Error!void {
fn inbox(ctx: *Verse) Error!void {
return custom(ctx, "owner:me");
}
 
fn search(ctx: *Context) Error!void {
fn search(ctx: *Verse) Error!void {
const udata = ctx.reqdata.query.validate(SearchReq) catch return error.BadData;
 
const query_str = udata.q orelse "null";
@@ -42,7 +42,7 @@ fn search(ctx: *Context) Error!void {
 
const DeltaListPage = Template.PageData("delta-list.html");
 
fn custom(ctx: *Context, search_str: []const u8) Error!void {
fn custom(ctx: *Verse, search_str: []const u8) Error!void {
var rules = std.ArrayList(Delta.SearchRule).init(ctx.alloc);
 
var itr = splitScalar(u8, search_str, ' ');
 
src/endpoints/settings.zig added: 149, removed: 176, total 0
@@ -1,6 +1,6 @@
const std = @import("std");
pub const Template = @import("../template.zig");
const Context = @import("../context.zig");
const Verse = @import("../verse.zig");
const Route = @import("../routes.zig");
const RequestData = @import("../request_data.zig").RequestData;
 
@@ -11,7 +11,7 @@ pub const endpoints = [_]Route.Match{
 
const SettingsPage = Template.PageData("settings.html");
 
fn default(ctx: *Context) Route.Error!void {
fn default(ctx: *Verse) Route.Error!void {
try ctx.request.auth.validOrError();
 
var blocks = try ctx.alloc.alloc(Template.Structs.ConfigBlocks, ctx.cfg.?.ns.len);
@@ -42,7 +42,7 @@ const SettingsReq = struct {
block_text: [][]const u8,
};
 
fn post(ctx: *Context) Route.Error!void {
fn post(ctx: *Verse) Route.Error!void {
try ctx.request.auth.validOrError();
 
const udata = RequestData(SettingsReq).initMap(ctx.alloc, ctx.reqdata) catch return error.BadData;
 
src/endpoints/users.zig added: 149, removed: 176, total 0
@@ -2,7 +2,7 @@ const std = @import("std");
 
const DOM = @import("../dom.zig");
const HTML = @import("../html.zig");
const Context = @import("../context.zig");
const Verse = @import("../verse.zig");
const Template = @import("../template.zig");
const Route = @import("../routes.zig");
const UriIter = Route.UriIter;
 
src/gitweb.zig added: 149, removed: 176, total 0
@@ -2,7 +2,7 @@ const std = @import("std");
 
const Allocator = std.mem.Allocator;
 
const Context = @import("context.zig");
const Verse = @import("verse.zig");
const Response = @import("response.zig");
const Request = @import("request.zig");
const HTML = @import("html.zig");
@@ -31,12 +31,12 @@ pub const endpoints = [_]Route.Match{
.{ .name = "git-upload-pack", .methods = .{ .POST = true }, .match = .{ .call = gitUploadPack } },
};
 
pub fn router(ctx: *Context) Error!Route.Callable {
pub fn router(ctx: *Verse) Error!Route.Callable {
std.debug.print("gitweb router {s}\n{any}, {any} \n", .{ ctx.ctx.uri.peek().?, ctx.ctx.uri, ctx.request.method });
return Route.router(ctx, &endpoints);
}
 
fn gitUploadPack(ctx: *Context) Error!void {
fn gitUploadPack(ctx: *Verse) Error!void {
ctx.uri.reset();
_ = ctx.uri.first();
const name = ctx.uri.next() orelse return error.Unknown;
@@ -112,7 +112,7 @@ fn gitUploadPack(ctx: *Context) Error!void {
_ = child.wait() catch unreachable;
}
 
fn __objects(ctx: *Context) Error!void {
fn __objects(ctx: *Verse) Error!void {
std.debug.print("gitweb objects\n", .{});
 
const rd = @import("../../REPO.RouteData.make(ctx.uri) orelse return error.Unrouteable.zig");
@@ -146,7 +146,7 @@ fn __objects(ctx: *Context) Error!void {
ctx.response.finish() catch return Error.Unknown;
}
 
fn __info(ctx: *Context) Error!void {
fn __info(ctx: *Verse) Error!void {
std.debug.print("gitweb info\n", .{});
 
const rd = @import("../../REPO.RouteData.make(ctx.uri) orelse return error.Unrouteable.zig");
 
src/http.zig added: 149, removed: 176, total 0
@@ -3,7 +3,7 @@ const std = @import("std");
const Allocator = std.mem.Allocator;
const Server = std.http.Server;
 
const Context = @import("context.zig");
const Verse = @import("verse.zig");
const Request = @import("request.zig");
const Response = @import("response.zig");
const Router = @import("routes.zig");
@@ -44,7 +44,7 @@ pub fn serve(a: Allocator, srv: *Server) !void {
var request = try Request.init(alloc, http_resp);
const response = Response.init(alloc, &request);
 
var ctx = try Context.init(
var ctx = try Verse.init(
alloc,
request,
response,
 
src/patch.zig added: 149, removed: 176, total 0
@@ -13,7 +13,7 @@ const Bleach = @import("bleach.zig");
const Response = @import("response.zig");
const HTML = @import("html.zig");
const DOM = @import("dom.zig");
const Context = @import("template.zig").Context;
const Verse = @import("template.zig").Verse;
 
pub const Patch = @This();
 
@@ -304,11 +304,11 @@ pub fn parse(self: *Patch, a: Allocator) !void {
}
}
 
pub fn diffsContextSlice(self: Patch, a: Allocator) ![]Context {
pub fn diffsVerseSlice(self: Patch, a: Allocator) ![]Verse {
if (self.diffs) |diffs| {
const diffs_ctx: []Context = try a.alloc(Context, diffs.len);
const diffs_ctx: []Verse = try a.alloc(Verse, diffs.len);
for (diffs, diffs_ctx) |diff, *dctx| {
var ctx: Context = Context.init(a);
var ctx: Verse = Verse.init(a);
switch (diff.header.change) {
.none => try ctx.putSlice("Filename", diff.filename orelse "Malformed Patch"),
.newfile => {
 
src/routes.zig added: 149, removed: 176, total 0
@@ -4,7 +4,7 @@ const eql = std.mem.eql;
const Allocator = std.mem.Allocator;
 
const api = @import("api.zig");
const Context = @import("context.zig");
const Verse = @import("verse.zig");
const Response = @import("response.zig");
const Request = @import("request.zig");
const HTML = @import("html.zig");
@@ -15,8 +15,8 @@ pub const Error = Errors.ServerError || Errors.ClientError || Errors.NetworkErro
 
pub const UriIter = std.mem.SplitIterator(u8, .scalar);
 
pub const Router = *const fn (*Context) Error!Callable;
pub const Callable = *const fn (*Context) Error!void;
pub const Router = *const fn (*Verse) Error!Callable;
pub const Callable = *const fn (*Verse) Error!void;
 
pub const DEBUG: bool = false;
 
@@ -118,24 +118,24 @@ pub fn defaultResponse(comptime code: std.http.Status) Callable {
};
}
 
fn notFound(ctx: *Context) Error!void {
fn notFound(ctx: *Verse) Error!void {
ctx.response.status = .not_found;
const E4XX = @embedFile("../templates/4XX.html");
return ctx.sendRawSlice(E4XX);
}
 
fn internalServerError(ctx: *Context) Error!void {
fn internalServerError(ctx: *Verse) Error!void {
ctx.response.status = .internal_server_error;
const E5XX = @embedFile("../templates/5XX.html");
return ctx.sendRawSlice(E5XX);
}
 
fn default(ctx: *Context) Error!void {
fn default(ctx: *Verse) Error!void {
const index = @embedFile("../templates/index.html");
return ctx.sendRawSlice(index);
}
 
pub fn router(ctx: *Context, comptime routes: []const Match) Callable {
pub fn router(ctx: *Verse, comptime routes: []const Match) Callable {
const search = ctx.uri.peek() orelse {
if (DEBUG) std.debug.print("No endpoint found: URI is empty.\n", .{});
return notFound;
@@ -171,7 +171,7 @@ const root = [_]Match{
ROUTE("", default),
};
 
pub fn baseRouter(ctx: *Context) Error!void {
pub fn baseRouter(ctx: *Verse) Error!void {
if (DEBUG) std.debug.print("baserouter {s}\n", .{ctx.uri.peek().?});
if (ctx.uri.peek()) |first| {
if (first.len > 0) {
@@ -185,7 +185,7 @@ pub fn baseRouter(ctx: *Context) Error!void {
const root_with_static = root ++
[_]Match{.{ .name = "static", .match = .{ .call = StaticFile.file } }};
 
pub fn baseRouterHtml(ctx: *Context) Error!void {
pub fn baseRouterHtml(ctx: *Verse) Error!void {
if (DEBUG) std.debug.print("baserouter {s}\n", .{ctx.uri.peek().?});
if (ctx.uri.peek()) |first| {
if (first.len > 0) {
 
src/srctree.zig added: 149, removed: 176, total 0
@@ -1,5 +1,5 @@
const Routes = @import("routes.zig");
const Context = @import("context.zig");
const Verse = @import("verse.zig");
const Template = @import("template.zig");
const Api = @import("api.zig");
//const Types = @import("types.zig");
@@ -39,7 +39,7 @@ pub const routes = [_]Match{
 
const E404Page = Template.PageData("4XX.html");
 
fn notFound(ctx: *Context) Routes.Error!void {
fn notFound(ctx: *Verse) Routes.Error!void {
// TODO fix this
@import("std").debug.print("404 for route\n", .{});
ctx.response.status = .not_found;
@@ -47,7 +47,7 @@ fn notFound(ctx: *Context) Routes.Error!void {
ctx.sendPage(&page) catch unreachable;
}
 
pub fn router(ctx: *Context) Callable {
pub fn router(ctx: *Verse) Callable {
// var i_count: usize = 0;
// var itr = Types.Delta.iterator(ctx.alloc, "");
// while (itr.next()) |it| {
@@ -59,7 +59,7 @@ pub fn router(ctx: *Context) Callable {
}
 
// TODO replace with better API
pub fn build(ctx: *Context, call: Callable) Routes.Error!void {
pub fn build(ctx: *Verse, call: Callable) Routes.Error!void {
return call(ctx) catch |err| switch (err) {
error.InvalidURI,
error.Unrouteable,
 
src/static-file.zig added: 149, removed: 176, total 0
@@ -1,9 +1,9 @@
const std = @import("std");
 
const Context = @import("context.zig");
const Verse = @import("verse.zig");
const Route = @import("routes.zig");
 
pub fn fileOnDisk(ctx: *Context) Route.Error!void {
pub fn fileOnDisk(ctx: *Verse) Route.Error!void {
_ = ctx.uri.next(); // clear /static
const fname = ctx.uri.next() orelse return error.Unrouteable;
if (fname.len == 0) return error.Unrouteable;
 
src/types/delta.zig added: 149, removed: 176, total 0
@@ -227,33 +227,6 @@ pub fn countComments(self: Delta) struct { count: usize, new: bool } {
return .{ .count = 0, .new = false };
}
 
pub fn toContext(self: Delta, a: Allocator) !Template.Context {
return Template.Context.initBuildable(a, self);
}
 
pub fn builder(self: Delta) Template.Context.Builder(Delta) {
return Template.Context.Builder(Delta).init(self);
}
 
pub fn contextBuilder(self: Delta, a: Allocator, ctx: *Template.Context) !void {
try ctx.putSlice("Title", try Bleach.sanitizeAlloc(a, self.title, .{}));
try ctx.putSlice("Desc", try Bleach.sanitizeAlloc(a, self.message, .{}));
 
try ctx.putSlice("Index", try std.fmt.allocPrint(a, "0x{x}", .{self.index}));
try ctx.putSlice("TitleUri", try std.fmt.allocPrint(a, "/repo/{s}/{s}/{x}", .{
self.repo,
if (self.attach == .issue) "issues" else "diffs",
self.index,
}));
 
if (self.thread) |thread| if (thread.getMessages()) |messages| {
try ctx.putSlice(
"CommentsIcon",
try std.fmt.allocPrint(a, "<span class=\"icon\">\xee\xa0\x9c {}</span>", .{messages.len}),
);
} else |_| {};
}
 
pub fn raze(_: Delta, _: std.mem.Allocator) void {
// TODO implement raze
}
 
src/context.zig added: 149, removed: 176, total 0
@@ -17,7 +17,7 @@ const Config = @import("ini.zig").Config;
 
const Error = @import("errors.zig").Error;
 
pub const Context = @This();
pub const Verse = @This();
 
alloc: Allocator,
request: Request,
@@ -35,10 +35,10 @@ const VarPair = struct {
[]const u8,
};
 
pub fn init(a: Allocator, cfg: ?Config, req: Request, res: Response, reqdata: RequestData) !Context {
pub fn init(a: Allocator, cfg: ?Config, req: Request, res: Response, reqdata: RequestData) !Verse {
std.debug.assert(req.uri[0] == '/');
//const reqheader = req.headers
return Context{
return .{
.alloc = a,
.request = req,
.response = res,
@@ -49,7 +49,7 @@ pub fn init(a: Allocator, cfg: ?Config, req: Request, res: Response, reqdata: Re
};
}
 
pub fn sendPage(ctx: *Context, page: anytype) Error!void {
pub fn sendPage(ctx: *Verse, page: anytype) Error!void {
ctx.response.start() catch |err| switch (err) {
error.BrokenPipe => return error.NetworkCrash,
else => unreachable,
@@ -66,15 +66,15 @@ pub fn sendPage(ctx: *Context, page: anytype) Error!void {
};
}
 
pub fn sendRawSlice(ctx: *Context, slice: []const u8) Error!void {
pub fn sendRawSlice(ctx: *Verse, slice: []const u8) Error!void {
ctx.response.send(slice) catch unreachable;
}
 
pub fn sendError(ctx: *Context, comptime code: std.http.Status) Error!void {
pub fn sendError(ctx: *Verse, comptime code: std.http.Status) Error!void {
return Routes.defaultResponse(code)(ctx);
}
 
pub fn sendJSON(ctx: *Context, json: anytype) Error!void {
pub fn sendJSON(ctx: *Verse, json: anytype) Error!void {
ctx.response.start() catch |err| switch (err) {
error.BrokenPipe => return error.NetworkCrash,
else => unreachable,
 
src/zwsgi.zig added: 149, removed: 176, total 0
@@ -3,7 +3,7 @@ const std = @import("std");
const Allocator = std.mem.Allocator;
const Server = std.net.Server;
 
const Context = @import("context.zig");
const Verse = @import("verse.zig");
const Request = @import("request.zig");
const Response = @import("response.zig");
const Router = @import("routes.zig");
@@ -18,9 +18,9 @@ routefn: RouterFn,
buildfn: BuildFn,
runmode: RunMode = .unix,
 
pub const RouterFn = *const fn (*Context) Router.Callable;
pub const RouterFn = *const fn (*Verse) Router.Callable;
// TODO provide default for this?
pub const BuildFn = *const fn (*Context, Router.Callable) Router.Error!void;
pub const BuildFn = *const fn (*Verse, Router.Callable) Router.Error!void;
 
const uProtoHeader = packed struct {
mod1: u8 = 0,
@@ -91,7 +91,7 @@ fn serveUnix(zwsgi: *ZWSGI) !void {
defer arena.deinit();
const a = arena.allocator();
 
var ctx = try zwsgi.buildContextuWSGI(a, &acpt);
var ctx = try zwsgi.buildVerseuWSGI(a, &acpt);
 
defer {
std.log.err("zWSGI: [{d:.3}] {s} - {s}: {s} -- \"{s}\"", .{
@@ -170,7 +170,7 @@ fn serveHttp(zwsgi: *ZWSGI) !void {
 
var hreq = try hsrv.receiveHead();
 
var ctx = try zwsgi.buildContextHttp(a, &hreq);
var ctx = try zwsgi.buildVerseHttp(a, &hreq);
var ipbuf: [0x20]u8 = undefined;
const ipport = try std.fmt.bufPrint(&ipbuf, "{}", .{conn.address});
if (std.mem.indexOf(u8, ipport, ":")) |i| {
@@ -279,7 +279,7 @@ fn findOr(list: []uWSGIVar, search: []const u8) []const u8 {
return find(list, search) orelse "[missing]";
}
 
fn buildContext(z: ZWSGI, a: Allocator, request: *Request) !Context {
fn buildVerse(z: ZWSGI, a: Allocator, request: *Request) !Verse {
var post_data: ?RequestData.PostData = null;
var reqdata: RequestData = undefined;
switch (request.raw_request) {
@@ -340,7 +340,7 @@ fn buildContext(z: ZWSGI, a: Allocator, request: *Request) !Context {
}
 
const response = try Response.init(a, request);
return Context.init(a, z.config, request.*, response, reqdata);
return Verse.init(a, z.config, request.*, response, reqdata);
}
 
fn readHttpHeaders(a: Allocator, req: *std.http.Server.Request) !Request {
@@ -355,10 +355,10 @@ fn readHttpHeaders(a: Allocator, req: *std.http.Server.Request) !Request {
return try Request.init(a, req);
}
 
fn buildContextHttp(z: ZWSGI, a: Allocator, req: *std.http.Server.Request) !Context {
fn buildVerseHttp(z: ZWSGI, a: Allocator, req: *std.http.Server.Request) !Verse {
var request = try readHttpHeaders(a, req);
std.debug.print("http target -> {s}\n", .{request.uri});
return z.buildContext(a, &request);
return z.buildVerse(a, &request);
}
 
fn readuWSGIHeader(a: Allocator, acpt: Server.Connection) !Request {
@@ -387,8 +387,8 @@ fn readuWSGIHeader(a: Allocator, acpt: Server.Connection) !Request {
);
}
 
fn buildContextuWSGI(z: ZWSGI, a: Allocator, conn: *Server.Connection) !Context {
fn buildVerseuWSGI(z: ZWSGI, a: Allocator, conn: *Server.Connection) !Verse {
var request = try readuWSGIHeader(a, conn.*);
 
return z.buildContext(a, &request);
return z.buildVerse(a, &request);
}