diff --git a/dots/.config/nvim/lua/mr.lua b/dots/.config/nvim/lua/mr.lua new file mode 100644 index 00000000..b237100b --- /dev/null +++ b/dots/.config/nvim/lua/mr.lua @@ -0,0 +1,44 @@ +local M = {} + +local function merge_base() + return vim.fn.system("git merge-base origin/main HEAD"):gsub("%s+", "") +end + +function M.files() + local base = merge_base() + require("fzf-lua").fzf_exec("git diff --name-only " .. base .. "...HEAD", { + prompt = "MR files> ", + actions = { + ["default"] = function(selected) + vim.cmd("edit " .. selected[1]) + require("gitsigns").diffthis(base) + end, + }, + }) +end + +function M.commits() + local base = merge_base() + require("fzf-lua").fzf_exec("git log --oneline " .. base .. "..HEAD", { + prompt = "MR commits> ", + actions = { + ["default"] = function(selected) + local sha = selected[1]:match("^(%S+)") + require("fzf-lua").fzf_exec("git diff --name-only " .. sha .. "~1.." .. sha, { + prompt = sha:sub(1, 7) .. " files> ", + actions = { + ["default"] = function(files) + vim.cmd("edit " .. files[1]) + require("gitsigns").diffthis(sha .. "~1") + end, + }, + }) + end, + }, + }) +end + +vim.api.nvim_create_user_command("MRFiles", M.files, {}) +vim.api.nvim_create_user_command("MRCommits", M.commits, {}) + +return M diff --git a/home/hosts/work/packages.local.nix b/home/hosts/work/packages.local.nix new file mode 100644 index 00000000..93fcdac8 --- /dev/null +++ b/home/hosts/work/packages.local.nix @@ -0,0 +1,43 @@ +{ pkgs, ... }: + +with pkgs; +let + nodejs = [ + biome + tsx + ]; + oasdiff = buildGoModule rec { + pname = "oasdiff"; + version = "1.11.10"; + src = fetchFromGitHub { + owner = "oasdiff"; + repo = "oasdiff"; + rev = "v${version}"; + hash = "sha256-/Pk2mKzdYKl51RvEkm5yRDMHz2vISgoHlnel+llDJus="; + }; + vendorHash = "sha256-ZKs9Ai8Q9Yj4V9GIufYRh9cl3ZUKnSehwpaodyGXtfg="; + }; + misc = [ + curl + flameshot + fzf-git-sh + git-machete + gitlab-ci-local + go + lua + ngrok + oasdiff + responder + rustlings + sleuthkit + vault-bin + xclip + xmage + # xwayland-satellite + # (python314.withPackages (ppkgs: [ + # ppkgs.plyer + # ppkgs.dbus-python + # ])) + ]; +in +misc ++ nodejs diff --git a/home/modules/networking/default.nix b/home/modules/networking/default.nix new file mode 100644 index 00000000..8ada48ed --- /dev/null +++ b/home/modules/networking/default.nix @@ -0,0 +1,9 @@ +{ pkgs, ... }: + +{ + config = { + home.packages = with pkgs; [ + wireshark + ]; + }; +} diff --git a/home/modules/work-cli/default.nix b/home/modules/work-cli/default.nix new file mode 100644 index 00000000..d7b436de --- /dev/null +++ b/home/modules/work-cli/default.nix @@ -0,0 +1,110 @@ +{ + lib, + config, + pkgs, + inputs, + ... +}: +let + cfg = config.programs.work-cli; + workCliPkg = inputs.work-cli.packages.${pkgs.system}.default; +in +{ + options.programs.work-cli = { + enable = lib.mkEnableOption "work-cli unified developer workflow CLI"; + + general = { + defaultBranch = lib.mkOption { + type = lib.types.str; + default = "main"; + description = "Default git branch name"; + }; + }; + + gitlab = { + url = lib.mkOption { + type = lib.types.str; + default = "https://gitlab.com"; + description = "GitLab instance URL"; + }; + + project = lib.mkOption { + type = lib.types.str; + default = ""; + description = "GitLab project path (namespace/repo)"; + }; + + group = lib.mkOption { + type = lib.types.str; + default = ""; + description = "GitLab group path"; + }; + }; + + jira = { + enable = lib.mkEnableOption "jira integration"; + + url = lib.mkOption { + type = lib.types.str; + default = ""; + description = "Jira instance URL"; + }; + + projectKey = lib.mkOption { + type = lib.types.str; + default = ""; + description = "Jira project key"; + }; + }; + + vault = { + enable = lib.mkEnableOption "vault integration"; + + url = lib.mkOption { + type = lib.types.str; + default = ""; + description = "Vault instance URL"; + }; + }; + + repos = { + path = lib.mkOption { + type = lib.types.str; + default = "~/work"; + description = "Local path where repos are cloned"; + }; + }; + }; + + config = lib.mkIf cfg.enable { + home.packages = [ workCliPkg ]; + + home.file.".config/work/config.toml".text = '' + [general] + default_branch = "${cfg.general.defaultBranch}" + + [gitlab] + url = "${cfg.gitlab.url}" + project = "${cfg.gitlab.project}" + group = "${cfg.gitlab.group}" + + [repos] + path = "${cfg.repos.path}" + '' + + lib.optionalString cfg.jira.enable '' + + [jira] + url = "${cfg.jira.url}" + project_key = "${cfg.jira.projectKey}" + '' + + lib.optionalString cfg.vault.enable '' + + [vault] + url = "${cfg.vault.url}" + ''; + + programs.bash.initExtra = '' + eval "$(${workCliPkg}/bin/work --show-completion bash 2>/dev/null)" + ''; + }; +}