Implement POST /path?create=true for explicit repository creation

Legacy code which created repo on first "POST /keys/foo" remains, so
restic clients <= v0.3.3 continue working.
This commit is contained in:
Zlatko Čalušić 2017-01-25 20:59:18 +01:00
parent 2c90434911
commit 919add5012
2 changed files with 22 additions and 2 deletions

View file

@ -21,7 +21,7 @@ func isHashed(dir string) bool {
} }
func getRepo(r *http.Request) string { func getRepo(r *http.Request) string {
if strings.HasPrefix(fmt.Sprintf("%s", middleware.Pattern(r.Context())), "/:repo/") { if strings.HasPrefix(fmt.Sprintf("%s", middleware.Pattern(r.Context())), "/:repo") {
return filepath.Join(config.path, pat.Param(r, "repo")) return filepath.Join(config.path, pat.Param(r, "repo"))
} }
@ -29,7 +29,7 @@ func getRepo(r *http.Request) string {
} }
func createDirectories(path string) { func createDirectories(path string) {
log.Println("Creating repository directories") log.Printf("Creating repository directories in %s\n", path)
if err := os.MkdirAll(path, 0700); err != nil { if err := os.MkdirAll(path, 0700); err != nil {
log.Fatal(err) log.Fatal(err)
@ -240,6 +240,8 @@ func SaveBlob(w http.ResponseWriter, r *http.Request) {
dir := pat.Param(r, "type") dir := pat.Param(r, "type")
name := pat.Param(r, "name") name := pat.Param(r, "name")
// Legacy code, required for restic client <= v0.3.3
// TODO: remove sometime later
if dir == "keys" { if dir == "keys" {
if _, err := os.Stat("keys"); err != nil && os.IsNotExist(err) { if _, err := os.Stat("keys"); err != nil && os.IsNotExist(err) {
createDirectories(repo) createDirectories(repo)
@ -325,3 +327,19 @@ func DeleteBlob(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("200 ok")) w.Write([]byte("200 ok"))
} }
// CreateRepo creates repository directories.
func CreateRepo(w http.ResponseWriter, r *http.Request) {
if config.debug {
log.Println("CreateRepo()")
}
if r.URL.Query().Get("create") != "true" {
http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
return
}
createDirectories(getRepo(r))
w.Write([]byte("200 ok"))
}

View file

@ -70,6 +70,8 @@ func setupMux() *goji.Mux {
mux.HandleFunc(pat.Post("/:repo/:type/:name"), SaveBlob) mux.HandleFunc(pat.Post("/:repo/:type/:name"), SaveBlob)
mux.HandleFunc(pat.Delete("/:type/:name"), DeleteBlob) mux.HandleFunc(pat.Delete("/:type/:name"), DeleteBlob)
mux.HandleFunc(pat.Delete("/:repo/:type/:name"), DeleteBlob) mux.HandleFunc(pat.Delete("/:repo/:type/:name"), DeleteBlob)
mux.HandleFunc(pat.Post("/"), CreateRepo)
mux.HandleFunc(pat.Post("/:repo"), CreateRepo)
return mux return mux
} }