mirror of https://github.com/go-gitea/gitea
Fix reverting a merge commit failing (#28794)
Fixes #22236
---
Error occurring currently while trying to revert commit using read-tree
-m approach:
> 2022/12/26 16:04:43 ...rvices/pull/patch.go:240:AttemptThreeWayMerge()
[E] [63a9c61a] Unable to run read-tree -m! Error: exit status 128 -
fatal: this operation must be run in a work tree
> - fatal: this operation must be run in a work tree
We need to clone a non-bare repository for `git read-tree -m` to work.
bb371aee6e
adds support to create a non-bare cloned temporary upload repository.
After cloning a non-bare temporary upload repository, we [set default
index](https://github.com/go-gitea/gitea/blob/main/services/repository/files/cherry_pick.go#L37)
(`git read-tree HEAD`).
This operation ends up resetting the git index file (see investigation
details below), due to which, we need to call `git update-index
--refresh` afterward.
Here's the diff of the index file before and after we execute
SetDefaultIndex: https://www.diffchecker.com/hyOP3eJy/
Notice the **ctime**, **mtime** are set to 0 after SetDefaultIndex.
You can reproduce the same behavior using these steps:
```bash
$ git clone https://try.gitea.io/me-heer/test.git -s -b main
$ cd test
$ git read-tree HEAD
$ git read-tree -m 1f085d7ed8 1f085d7ed8 9933caed00
error: Entry '1' not uptodate. Cannot merge.
```
After which, we can fix like this:
```
$ git update-index --refresh
$ git read-tree -m 1f085d7ed8 1f085d7ed8 9933caed00
```
pull/28819/head
parent
edfb57e699
commit
b8270240bf
@ -0,0 +1 @@ |
||||
ref: refs/heads/main |
@ -0,0 +1,8 @@ |
||||
[core] |
||||
repositoryformatversion = 0 |
||||
filemode = true |
||||
bare = true |
||||
ignorecase = true |
||||
precomposeunicode = true |
||||
[remote "origin"] |
||||
url = https://try.gitea.io/me-heer/test_commit_revert.git |
@ -0,0 +1 @@ |
||||
Unnamed repository; edit this file 'description' to name the repository. |
@ -0,0 +1,6 @@ |
||||
# git ls-files --others --exclude-from=.git/info/exclude |
||||
# Lines that start with '#' are comments. |
||||
# For a project mostly in C, the following would be a good set of |
||||
# exclude patterns (uncomment them if you want to use them): |
||||
# *.[oa] |
||||
# *~ |
Binary file not shown.
Binary file not shown.
@ -0,0 +1,3 @@ |
||||
# pack-refs with: peeled fully-peeled sorted |
||||
46aa6ab2c881ae90e15d9ccfc947d1625c892ce5 refs/heads/develop |
||||
deebcbc752e540bab4ce3ee713d3fc8fdc35b2f7 refs/heads/main |
@ -0,0 +1,34 @@ |
||||
package integration |
||||
|
||||
import ( |
||||
"net/http" |
||||
"testing" |
||||
|
||||
"code.gitea.io/gitea/tests" |
||||
|
||||
"github.com/stretchr/testify/assert" |
||||
) |
||||
|
||||
func TestRepoMergeCommitRevert(t *testing.T) { |
||||
defer tests.PrepareTestEnv(t)() |
||||
session := loginUser(t, "user2") |
||||
|
||||
req := NewRequest(t, "GET", "/user2/test_commit_revert/_cherrypick/deebcbc752e540bab4ce3ee713d3fc8fdc35b2f7/main?ref=main&refType=branch&cherry-pick-type=revert") |
||||
resp := session.MakeRequest(t, req, http.StatusOK) |
||||
|
||||
htmlDoc := NewHTMLParser(t, resp.Body) |
||||
req = NewRequestWithValues(t, "POST", "/user2/test_commit_revert/_cherrypick/deebcbc752e540bab4ce3ee713d3fc8fdc35b2f7/main", map[string]string{ |
||||
"_csrf": htmlDoc.GetCSRF(), |
||||
"last_commit": "deebcbc752e540bab4ce3ee713d3fc8fdc35b2f7", |
||||
"page_has_posted": "true", |
||||
"revert": "true", |
||||
"commit_summary": "reverting test commit", |
||||
"commit_message": "test message", |
||||
"commit_choice": "direct", |
||||
"new_branch_name": "test-revert-branch-1", |
||||
}) |
||||
resp = session.MakeRequest(t, req, http.StatusSeeOther) |
||||
|
||||
// A successful revert redirects to the main branch
|
||||
assert.EqualValues(t, "/user2/test_commit_revert/src/branch/main", resp.Header().Get("Location")) |
||||
} |
Loading…
Reference in new issue