From 88af408376a5afec602551cc4b8ba1d1f0a9d12f Mon Sep 17 00:00:00 2001 From: ThePrimeagen Date: Wed, 14 Apr 2021 15:07:13 -0600 Subject: [PATCH 1/3] feat(on_tree_change): Better interfacing with on_tree_change --- lua/git-worktree/enum.lua | 22 ++++++++++++++++++++++ lua/git-worktree/init.lua | 12 ++++++------ 2 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 lua/git-worktree/enum.lua diff --git a/lua/git-worktree/enum.lua b/lua/git-worktree/enum.lua new file mode 100644 index 0000000..1d9376a --- /dev/null +++ b/lua/git-worktree/enum.lua @@ -0,0 +1,22 @@ +local Enum = function(tbl) + return setmetatable(tbl, { + __index = function(_, key) + error(string.format("%s does not exist for this enum.", key)) + end, + + __newindex = function(t, key, value) + error("Enums are immutable. You are not able to set new values") + end, + }) +end + +return { + Operations = Enum({ + Create = "create", + Switch = "switch", + Delete = "delete", + }) +} + + + diff --git a/lua/git-worktree/init.lua b/lua/git-worktree/init.lua index 6dd45c8..e279ef2 100644 --- a/lua/git-worktree/init.lua +++ b/lua/git-worktree/init.lua @@ -1,5 +1,6 @@ local Job = require("plenary.job") local Path = require("plenary.path") +local Enum = require("git-worktree.enum") local Status = require("git-worktree.status") @@ -10,7 +11,7 @@ local on_change_callbacks = {} local function on_tree_change_handler(op, path, _) -- _ = upstream if M._config.update_on_change then - if op == "switch" then + if op == Enum.Operations.Switch then local changed = M.update_current_buffer() if not changed then vim.cmd(string.format(":Ex %s", M.get_worktree_path(path))) @@ -20,14 +21,12 @@ local function on_tree_change_handler(op, path, _) -- _ = upstream end local function emit_on_change(op, path, upstream) - -- TODO: We don't have a way to async update what is running status:next_status(string.format("Running post %s callbacks", op)) on_tree_change_handler(op, path, upstream) for idx = 1, #on_change_callbacks do on_change_callbacks[idx](op, path, upstream) end - end local function change_dirs(path) @@ -159,7 +158,7 @@ local function create_worktree(path, upstream, found_branch) end vim.schedule(function() - emit_on_change("create", path, upstream) + emit_on_change(Enum.Operations.Create, path, upstream) M.switch_worktree(path) end) end) @@ -196,7 +195,7 @@ M.switch_worktree = function(path) vim.schedule(function() change_dirs(path) - emit_on_change("switch", path) + emit_on_change(Enum.Operations.Switch, path) end) end) @@ -219,7 +218,7 @@ M.delete_worktree = function(path, force) local delete = Job:new(cmd) delete:after_success(vim.schedule_wrap(function() - emit_on_change("delete", path) + emit_on_change(Enum.Operations.Delete, path) end)) delete:after_failure(failure(cmd, vim.loop.cwd())) @@ -299,5 +298,6 @@ M.set_status = function(msg) end M.setup() +M.Operations = Enum.Operations return M From 246b62909356f8d6e2f6f38343dfa56996594c74 Mon Sep 17 00:00:00 2001 From: ThePrimeagen Date: Wed, 14 Apr 2021 15:16:19 -0600 Subject: [PATCH 2/3] feat(set_push): push so I can push with Git push --- lua/git-worktree/init.lua | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/lua/git-worktree/init.lua b/lua/git-worktree/init.lua index e279ef2..beda3f3 100644 --- a/lua/git-worktree/init.lua +++ b/lua/git-worktree/init.lua @@ -85,15 +85,21 @@ local function has_worktree(path, cb) job:start() end -local function failure(from, cmd, path) +local function failure(from, cmd, path, soft_error) return function(e) - status:error(string.format( + local error_message = string.format( "%s Failed: PATH %s CMD %s RES %s, ERR %s", from, path, vim.inspect(cmd), vim.inspect(e:result()), - vim.inspect(e:stderr_result()))) + vim.inspect(e:stderr_result())) + + if soft_error then + status:status(error_message) + else + status:error(error_message) + end end end @@ -135,6 +141,17 @@ local function create_worktree(path, upstream, found_branch) end }) + -- TODO: How to configure origin??? Should upstream ever be the push + -- destination? + local set_push = Job:new({ + 'git', 'push', "--set-upstream", "origin", path, + cwd = worktree_path, + on_start = function() + status:next_status("git set_branch") + end + }) + + local rebase = Job:new({ 'git', 'rebase', cwd = worktree_path, @@ -145,11 +162,17 @@ local function create_worktree(path, upstream, found_branch) create:and_then_on_success(fetch) fetch:and_then_on_success(set_branch) - set_branch:and_then_on_success(rebase) + + -- These are "optional" operations. + -- We have to figure out how we want to handle these... + set_branch:and_then(set_push) + set_push:and_then(rebase) create:after_failure(failure("create_worktree", create.args, git_worktree_root)) fetch:after_failure(failure("create_worktree", fetch.args, worktree_path)) - set_branch:after_failure(failure("create_worktree", set_branch.args, worktree_path)) + + set_branch:after_failure(failure("create_worktree", set_branch.args, worktree_path, true)) + set_push:after_failure(failure("create_worktree", set_branch.args, worktree_path, true)) rebase:after(function() From d8abfa41e70ed444103ba5c33ea92be75a38aba3 Mon Sep 17 00:00:00 2001 From: ThePrimeagen Date: Wed, 14 Apr 2021 15:24:07 -0600 Subject: [PATCH 3/3] fix(status): Status was 8 / 7 at some point. --- lua/git-worktree/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/git-worktree/init.lua b/lua/git-worktree/init.lua index beda3f3..5fd35c4 100644 --- a/lua/git-worktree/init.lua +++ b/lua/git-worktree/init.lua @@ -190,7 +190,7 @@ local function create_worktree(path, upstream, found_branch) end M.create_worktree = function(path, upstream) - status:reset(7) + status:reset(8) if upstream == nil then error("Please provide an upstream...")