From: Tobias Ulmer Date: Fri, 3 May 2019 17:47:35 +0000 (+0200) Subject: git: improve fetch-sources --update handling of different repo states X-Git-Tag: e2factory-2.3.18rc1~1 X-Git-Url: https://git.e2factory.org/?a=commitdiff_plain;h=90369818e1eaa94247f6f424b65a6a9b296c80a8;p=e2factory.git git: improve fetch-sources --update handling of different repo states This should fix several failing corner cases and also handles the new no-local-branch state of the repository. Signed-off-by: Tobias Ulmer --- diff --git a/plugins/git.lua b/plugins/git.lua index fa93f0e..97a73f2 100644 --- a/plugins/git.lua +++ b/plugins/git.lua @@ -460,7 +460,7 @@ function git.git_source:check_workingcopy() query = string.format("branch.%s.remote", self:get_branch()) remote, re = generic_git.git_config(gitdir, query) if not remote then - e:append("no remote configured for branch \"%s\"", self:get_branch()) + e:append("no remote configured for branch %q", self:get_branch()) return false, e elseif remote ~= "origin" then e:append("remote of local branch \"%s\" must be named \"origin\"", @@ -510,17 +510,20 @@ function git.git_source:fetch_source() return true end + -- If commit id for requested branch ref exists, it's already checked out. rc, re, id = generic_git.lookup_id(git_dir, generic_git.NO_REMOTE, refs_heads(self:get_branch())) if not rc then return false, e:cat(re) elseif not id then + -- set up tracking branch (XXX: default remote) rc, re = generic_git.git_branch_new1(work_tree, true, self:get_branch(), "origin/" .. self:get_branch()) if not rc then return false, e:cat(re) end + -- switch to new tracking branch rc, re = generic_git.git_checkout1(work_tree, refs_heads(self:get_branch())) if not rc then @@ -544,25 +547,33 @@ function git.git_source:update_source() return false, e:cat(re) end - e2lib.logf(2, "updating %s [%s]", self:get_working(), self:get_branch()) + e2lib.logf(2, "%s: updating %s [%s]", self:get_name(), self:get_working(), self:get_branch()) gitwc = e2lib.join(e2tool.root(), self:get_working()) gitdir = e2lib.join(gitwc, ".git") - argv = generic_git.git_new_argv(gitdir, gitwc, "fetch") + -- check that remote "origin" exists. No need to continue if not. + rc, re = self:_check_git_remote() + if not rc then + e2lib.warnf("WOTHER", + "%s: skipping update due to git remote problem: %s", + self:get_name(), re:tostring()) + return true + end + + argv = generic_git.git_new_argv(gitdir, gitwc, "fetch", "--tags") rc, re = generic_git.git(argv) if not rc then return false, e:cat(re) end - argv = generic_git.git_new_argv(gitdir, gitwc, "fetch", "--tags") + argv = generic_git.git_new_argv(gitdir, gitwc, "fetch") rc, re = generic_git.git(argv) if not rc then return false, e:cat(re) end - e2lib.logf(3, "%s: fetching objects and refs success.", - self:get_name()) + e2lib.logf(2, "%s: git fetch complete", self:get_name()) -- Find the prefered branch and... local ref, re = self:_refs_prefered_local_remote_branch() @@ -570,40 +581,55 @@ function git.git_source:update_source() return false, e:cat(re) end + local skipping = "skipping fast forward merge" + -- ... if it is the local remotes branch, skip any merge attempts if ref == generic_git.refs_remotes(self:get_branch()) then - e2lib.logf(3, "%s: using '%s', no merge required.", - self:get_name(), ref) + e2lib.logf(2, "%s: no local branch %q, using %q and %s", + self:get_name(), self:get_branch(), ref, skipping) return true end - -- Use HEAD commit ID to find the branch we're on - rc, re, id = generic_git.lookup_id(gitdir, generic_git.NO_REMOTE, "HEAD") + -- still here? find the current branch name ... + rc, re = generic_git.current_branch(gitdir) if not rc then return false, e:cat(re) - elseif not id then - return false, e:cat(err.new("can not find commit ID for HEAD")) end - rc, re, branch = generic_git.lookup_ref(gitdir, generic_git.NO_REMOTE, id, - "refs/heads/") - if not rc then - return false, e:cat(re) - elseif not branch then - e2lib.warnf("WOTHER", "HEAD is not on a branch (detached?). Skipping") + branch = rc + -- we're on a detached HEAD, no branch or mismatched branch... + if branch == "HEAD" then + e2lib.warnf("WOTHER", "%s: on detached HEAD branch, %s", + self:get_name(), skipping) + return true + elseif branch == "" then + e2lib.warnf( + "WOTHER", "%s: not on any branch, %s", self:get_name(), skipping) + return true + elseif branch ~= self:get_branch() then + e2lib.warnf( + "WOTHER", "%s: working copy on branch %q, %s", + self:get_name(), branch, skipping) return true end - if branch ~= refs_heads(self:get_branch()) then - e2lib.warnf("WOTHER", "not on configured branch. Skipping.") + -- Find the remote name for the branch + remote, re = generic_git.git_config(gitdir, + "branch."..self:get_branch()..".remote") + if not remote or string.len(remote) == 0 then + e2lib.warnf("WOTHER", + "%s: no remote configured for branch %q, %s", + self:get_name(), self:get_branch(), skipping) return true end - remote, re = generic_git.git_config( - gitdir, "branch."..self:get_branch()..".remote") - if not remote or string.len(remote) == 0 then - e2lib.warnf("WOTHER", "no remote configured for branch %q. Skipping.", - self:get_branch()) + -- XXX: origin + -- currently we don't support any other remote than "origin" + if remote ~= "origin" then + e2lib.warnf("WOTHER", + "%s: branch %q is configured to merge from remote %q, ".. + "skipping due to unclear configuration", + self:get_name(), self:get_branch(), remote) return true end @@ -611,7 +637,11 @@ function git.git_source:update_source() argv = generic_git.git_new_argv(gitdir, gitwc, "merge", "--ff-only", branch) rc, re = generic_git.git(argv) if not rc then - return false, e:cat(re) + e2lib.warnf("WOTHER", + "%s: fast forward merge failed, ".. + "please resolve the sitution manually. Error message was:\n%s", + self:get_name(), re:tostring()) + return true end return true