mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-03 12:05:59 +01:00
Fix issues in git refs APIs (#3275)
This commit is contained in:
@@ -57,22 +57,27 @@ trait ApiGitReferenceControllerBase extends ControllerBase {
|
|||||||
* iii. Create a reference
|
* iii. Create a reference
|
||||||
* https://docs.github.com/en/free-pro-team@latest/rest/reference/git#create-a-reference
|
* https://docs.github.com/en/free-pro-team@latest/rest/reference/git#create-a-reference
|
||||||
*/
|
*/
|
||||||
post("/api/v3/repos/:owner/:repository/git/refs")(referrersOnly { repository =>
|
post("/api/v3/repos/:owner/:repository/git/refs")(writableUsersOnly { repository =>
|
||||||
extractFromJsonBody[CreateARef].map {
|
extractFromJsonBody[CreateARef].map {
|
||||||
data =>
|
data =>
|
||||||
Using.resource(Git.open(getRepositoryDir(repository.owner, repository.owner))) { git =>
|
Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) {
|
||||||
val ref = git.getRepository.findRef(data.ref)
|
git =>
|
||||||
if (ref == null) {
|
val ref = git.getRepository.findRef(data.ref)
|
||||||
val update = git.getRepository.updateRef(data.ref)
|
if (ref == null) {
|
||||||
update.setNewObjectId(ObjectId.fromString(data.sha))
|
val update = git.getRepository.updateRef(data.ref)
|
||||||
val result = update.update()
|
update.setNewObjectId(ObjectId.fromString(data.sha))
|
||||||
result match {
|
val result = update.update()
|
||||||
case Result.NEW => JsonFormat(ApiRef.fromRef(RepositoryName(repository.owner, repository.name), ref))
|
result match {
|
||||||
case _ => UnprocessableEntity(result.name())
|
case Result.NEW =>
|
||||||
|
JsonFormat(
|
||||||
|
ApiRef
|
||||||
|
.fromRef(RepositoryName(repository.owner, repository.name), git.getRepository.findRef(data.ref))
|
||||||
|
)
|
||||||
|
case _ => UnprocessableEntity(result.name())
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
UnprocessableEntity("Ref already exists.")
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
UnprocessableEntity("Ref already exists.")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} getOrElse BadRequest()
|
} getOrElse BadRequest()
|
||||||
})
|
})
|
||||||
@@ -85,7 +90,7 @@ trait ApiGitReferenceControllerBase extends ControllerBase {
|
|||||||
val refName = multiParams("splat").mkString("/")
|
val refName = multiParams("splat").mkString("/")
|
||||||
extractFromJsonBody[UpdateARef].map {
|
extractFromJsonBody[UpdateARef].map {
|
||||||
data =>
|
data =>
|
||||||
Using.resource(Git.open(getRepositoryDir(repository.owner, repository.owner))) { git =>
|
Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git =>
|
||||||
val ref = git.getRepository.findRef(refName)
|
val ref = git.getRepository.findRef(refName)
|
||||||
if (ref == null) {
|
if (ref == null) {
|
||||||
UnprocessableEntity("Ref does not exist.")
|
UnprocessableEntity("Ref does not exist.")
|
||||||
@@ -96,7 +101,7 @@ trait ApiGitReferenceControllerBase extends ControllerBase {
|
|||||||
val result = update.update()
|
val result = update.update()
|
||||||
result match {
|
result match {
|
||||||
case Result.FORCED | Result.FAST_FORWARD | Result.NO_CHANGE =>
|
case Result.FORCED | Result.FAST_FORWARD | Result.NO_CHANGE =>
|
||||||
JsonFormat(ApiRef.fromRef(RepositoryName(repository), update.getRef))
|
JsonFormat(ApiRef.fromRef(RepositoryName(repository), git.getRepository.findRef(refName)))
|
||||||
case _ => UnprocessableEntity(result.name())
|
case _ => UnprocessableEntity(result.name())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -275,4 +275,29 @@ class ApiIntegrationTest extends AnyFunSuite {
|
|||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test("Git refs APIs") {
|
||||||
|
Using.resource(new TestingGitBucketServer(19999)) { server =>
|
||||||
|
val github = server.client("root", "root")
|
||||||
|
|
||||||
|
val repo = github.createRepository("git_refs_test").autoInit(true).create()
|
||||||
|
val sha1 = repo.getBranch("master").getSHA1
|
||||||
|
|
||||||
|
val refs1 = repo.listRefs().toList
|
||||||
|
assert(refs1.size() == 1)
|
||||||
|
assert(refs1.get(0).getRef == "refs/heads/master")
|
||||||
|
assert(refs1.get(0).getObject.getSha == sha1)
|
||||||
|
|
||||||
|
val ref = repo.createRef("refs/heads/testref", sha1)
|
||||||
|
assert(ref.getRef == "refs/heads/testref")
|
||||||
|
assert(ref.getObject.getSha == sha1)
|
||||||
|
|
||||||
|
val refs2 = repo.listRefs().toList
|
||||||
|
assert(refs2.size() == 2)
|
||||||
|
assert(refs2.get(0).getRef == "refs/heads/master")
|
||||||
|
assert(refs2.get(0).getObject.getSha == sha1)
|
||||||
|
assert(refs2.get(1).getRef == "refs/heads/testref")
|
||||||
|
assert(refs2.get(1).getObject.getSha == sha1)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user