mirror of
https://github.com/aptly-dev/aptly.git
synced 2026-01-12 03:21:33 +00:00
Allow database to be initialized without opening, unify all the open paths to retry on failure. In API router make sure open requests are matched with acks in explicit way. This also enables re-open attempts in all the aptly commands, so it should make running aptly CLI much easier now hopefully. Fix up system tests for oldoldstable ;)
117 lines
2.7 KiB
Go
117 lines
2.7 KiB
Go
package api
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
ctx "github.com/smira/aptly/context"
|
|
)
|
|
|
|
var context *ctx.AptlyContext
|
|
|
|
// Router returns prebuilt with routes http.Handler
|
|
func Router(c *ctx.AptlyContext) http.Handler {
|
|
context = c
|
|
|
|
router := gin.Default()
|
|
router.Use(gin.ErrorLogger())
|
|
|
|
if context.Flags().Lookup("no-lock").Value.Get().(bool) {
|
|
// We use a goroutine to count the number of
|
|
// concurrent requests. When no more requests are
|
|
// running, we close the database to free the lock.
|
|
requests := make(chan dbRequest)
|
|
|
|
go acquireDatabase(requests)
|
|
|
|
router.Use(func(c *gin.Context) {
|
|
var err error
|
|
|
|
errCh := make(chan error)
|
|
requests <- dbRequest{acquiredb, errCh}
|
|
|
|
err = <-errCh
|
|
if err != nil {
|
|
c.Fail(500, err)
|
|
return
|
|
}
|
|
|
|
defer func() {
|
|
requests <- dbRequest{releasedb, errCh}
|
|
err = <-errCh
|
|
if err != nil {
|
|
c.Fail(500, err)
|
|
}
|
|
}()
|
|
|
|
c.Next()
|
|
})
|
|
|
|
} else {
|
|
go cacheFlusher()
|
|
}
|
|
|
|
root := router.Group("/api")
|
|
|
|
{
|
|
root.GET("/version", apiVersion)
|
|
}
|
|
|
|
{
|
|
root.GET("/repos", apiReposList)
|
|
root.POST("/repos", apiReposCreate)
|
|
root.GET("/repos/:name", apiReposShow)
|
|
root.PUT("/repos/:name", apiReposEdit)
|
|
root.DELETE("/repos/:name", apiReposDrop)
|
|
|
|
root.GET("/repos/:name/packages", apiReposPackagesShow)
|
|
root.POST("/repos/:name/packages", apiReposPackagesAdd)
|
|
root.DELETE("/repos/:name/packages", apiReposPackagesDelete)
|
|
|
|
root.POST("/repos/:name/file/:dir/:file", apiReposPackageFromFile)
|
|
root.POST("/repos/:name/file/:dir", apiReposPackageFromDir)
|
|
|
|
root.POST("/repos/:name/snapshots", apiSnapshotsCreateFromRepository)
|
|
}
|
|
|
|
{
|
|
root.POST("/mirrors/:name/snapshots", apiSnapshotsCreateFromMirror)
|
|
}
|
|
|
|
{
|
|
root.GET("/files", apiFilesListDirs)
|
|
root.POST("/files/:dir", apiFilesUpload)
|
|
root.GET("/files/:dir", apiFilesListFiles)
|
|
root.DELETE("/files/:dir", apiFilesDeleteDir)
|
|
root.DELETE("/files/:dir/:name", apiFilesDeleteFile)
|
|
}
|
|
|
|
{
|
|
root.GET("/publish", apiPublishList)
|
|
root.POST("/publish", apiPublishRepoOrSnapshot)
|
|
root.POST("/publish/:prefix", apiPublishRepoOrSnapshot)
|
|
root.PUT("/publish/:prefix/:distribution", apiPublishUpdateSwitch)
|
|
root.DELETE("/publish/:prefix/:distribution", apiPublishDrop)
|
|
}
|
|
|
|
{
|
|
root.GET("/snapshots", apiSnapshotsList)
|
|
root.POST("/snapshots", apiSnapshotsCreate)
|
|
root.PUT("/snapshots/:name", apiSnapshotsUpdate)
|
|
root.GET("/snapshots/:name", apiSnapshotsShow)
|
|
root.GET("/snapshots/:name/packages", apiSnapshotsSearchPackages)
|
|
root.DELETE("/snapshots/:name", apiSnapshotsDrop)
|
|
root.GET("/snapshots/:name/diff/:withSnapshot", apiSnapshotsDiff)
|
|
}
|
|
|
|
{
|
|
root.GET("/packages/:key", apiPackagesShow)
|
|
}
|
|
|
|
{
|
|
root.GET("/graph.:ext", apiGraph)
|
|
}
|
|
|
|
return router
|
|
}
|