Todo TUI powered by plaintext with full mouse support
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

cli: accept positional argument for storage path

reykjalin.org 32d6022a 254c9ad0

verified
+48 -24
+1
.gitignore
··· 1 1 zig-out 2 2 .zig-cache 3 + storage/
+47 -24
src/main.zig
··· 1771 1771 }; 1772 1772 1773 1773 fn get_todo_file_storage_path_caller_should_free(allocator: std.mem.Allocator) ![]const u8 { 1774 - const data_path = try known_folders.getPath(allocator, known_folders.KnownFolder.data); 1775 - defer { 1776 - if (data_path) |p| { 1777 - allocator.free(p); 1778 - } 1779 - } 1780 - 1781 - if (data_path) |p| { 1782 - return try std.fs.path.join(allocator, &.{ p, "todo" }); 1783 - } 1784 - 1785 - unreachable; 1774 + return try std.fs.path.join(allocator, &.{ data_storage_path, "todo" }); 1786 1775 } 1787 1776 1788 1777 fn get_completed_todo_file_storage_path_caller_should_free(allocator: std.mem.Allocator) ![]const u8 { 1789 - const data_path = try known_folders.getPath(allocator, known_folders.KnownFolder.data); 1790 - defer { 1791 - if (data_path) |p| { 1792 - allocator.free(p); 1793 - } 1794 - } 1795 - 1796 - if (data_path) |p| { 1797 - return try std.fs.path.join(allocator, &.{ p, "todo", "completed" }); 1798 - } 1799 - 1800 - unreachable; 1778 + return try std.fs.path.join(allocator, &.{ data_storage_path, "todo", "completed" }); 1801 1779 } 1802 1780 1803 1781 fn get_todo_app_log_storage_path(allocator: std.mem.Allocator) ![]const u8 { 1782 + // NOTE: We're not using the global data_storage_path because this function gets called from 1783 + // the custom logger function, which can run both before and after the memory in 1784 + // data_storage_path is initialized or freed. 1804 1785 const data_path = try known_folders.getPath(allocator, known_folders.KnownFolder.data); 1805 1786 defer { 1806 1787 if (data_path) |p| { ··· 1890 1871 } 1891 1872 } 1892 1873 1874 + /// Global reference to where the data, logs, and config should be stored. 1875 + var data_storage_path: []u8 = undefined; 1876 + 1893 1877 /// Keep our main function small. Typically handling arg parsing and initialization only 1894 1878 pub fn main() !void { 1895 1879 var gpa = std.heap.GeneralPurposeAllocator(.{}){}; ··· 1901 1885 } 1902 1886 } 1903 1887 const allocator = gpa.allocator(); 1888 + 1889 + // Process arguments. 1890 + const args = try std.process.argsAlloc(allocator); 1891 + defer std.process.argsFree(allocator, args); 1892 + 1893 + if (args.len > 1 and (std.mem.eql(u8, args[1], "--help") or std.mem.eql(u8, args[1], "-h"))) { 1894 + const writer = std.io.getStdOut().writer(); 1895 + try writer.print("Usage: todui [storage_folder]\n", .{}); 1896 + try writer.print("\n", .{}); 1897 + try writer.print("Positional options:\n", .{}); 1898 + try writer.print(" [storage_folder] The path to where todui data should be stored.\n", .{}); 1899 + try writer.print(" Defaults to ~/.local/share/todo/ when no path is provided.\n", .{}); 1900 + try writer.print("\n", .{}); 1901 + try writer.print("General options:\n", .{}); 1902 + try writer.print("\n", .{}); 1903 + try writer.print(" -h, --help Print fn help\n", .{}); 1904 + try writer.print(" -v, --version Print fn help\n", .{}); 1905 + std.process.exit(0); 1906 + } 1907 + if (args.len > 1 and (std.mem.eql(u8, args[1], "--version") or std.mem.eql(u8, args[1], "-v"))) { 1908 + const writer = std.io.getStdOut().writer(); 1909 + try writer.print("2024.11-dev\n", .{}); 1910 + std.process.exit(0); 1911 + } 1912 + if (args.len > 1) { 1913 + const cwd = std.fs.cwd(); 1914 + cwd.makePath(args[args.len - 1]) catch |err| switch (err) { 1915 + error.PathAlreadyExists => {}, 1916 + else => return err, 1917 + }; 1918 + 1919 + data_storage_path = try cwd.realpathAlloc(allocator, args[args.len - 1]); 1920 + } else { 1921 + const storage_path = (try known_folders.getPath(allocator, known_folders.KnownFolder.data)) orelse unreachable; 1922 + defer allocator.free(storage_path); 1923 + data_storage_path = try allocator.alloc(u8, storage_path.len); 1924 + std.mem.copyForwards(u8, data_storage_path, storage_path); 1925 + } 1926 + defer allocator.free(data_storage_path); 1904 1927 1905 1928 // Initialize our application 1906 1929 var app = try TodoApp.init(allocator);