-func mkdirForPkg(w http.ResponseWriter, r *http.Request, pkgName string) bool {
- path := filepath.Join(*root, pkgName)
- if _, err := os.Stat(path); os.IsNotExist(err) {
- if err = os.Mkdir(path, os.FileMode(0777)); err != nil {
- log.Println("error", r.RemoteAddr, "mkdir", pkgName, err)
- http.Error(w, err.Error(), http.StatusInternalServerError)
- return false
- }
- log.Println(r.RemoteAddr, "mkdir", pkgName)
- }
- return true
-}
-
-func listRoot(w http.ResponseWriter, r *http.Request) {
- files, err := ioutil.ReadDir(*root)
- if err != nil {
- log.Println("error", r.RemoteAddr, "root", err)
- http.Error(w, err.Error(), http.StatusInternalServerError)
- return
- }
- var result bytes.Buffer
- result.WriteString(fmt.Sprintf(HTMLBegin, "root"))
- for _, file := range files {
- if file.Mode().IsDir() {
- result.WriteString(fmt.Sprintf(
- HTMLElement,
- *refreshURLPath+file.Name()+"/",
- "", file.Name(),
- ))
- }
- }
- result.WriteString(HTMLEnd)
- w.Write(result.Bytes())
-}
-
-func listDir(
- w http.ResponseWriter,
- r *http.Request,
- pkgName string,
- autorefresh, gpgUpdate bool,
-) {
- dirPath := filepath.Join(*root, pkgName)
- if autorefresh {
- if !refreshDir(w, r, pkgName, "", gpgUpdate) {
- return
- }
- } else if _, err := os.Stat(dirPath); os.IsNotExist(err) && !refreshDir(w, r, pkgName, "", false) {
- return
- }
- fis, err := ioutil.ReadDir(dirPath)
- if err != nil {
- log.Println("error", r.RemoteAddr, "list", pkgName, err)
- http.Error(w, err.Error(), http.StatusInternalServerError)
- return
- }
- files := make(map[string]struct{}, len(fis)/2)
- for _, fi := range fis {
- files[fi.Name()] = struct{}{}
- }
- var result bytes.Buffer
- result.WriteString(fmt.Sprintf(HTMLBegin, pkgName))
- for _, algo := range knownHashAlgos {
- for fn := range files {
- if killed {
- // Skip expensive I/O when shutting down
- http.Error(w, "shutting down", http.StatusInternalServerError)
- return
- }
- if !strings.HasSuffix(fn, "."+algo) {
- continue
- }
- delete(files, fn)
- digest, err := ioutil.ReadFile(filepath.Join(dirPath, fn))
- if err != nil {
- log.Println("error", r.RemoteAddr, "list", fn, err)
- http.Error(w, err.Error(), http.StatusInternalServerError)
- return
- }
- fnClean := strings.TrimSuffix(fn, "."+algo)
- delete(files, fnClean)
- gpgSigAttr := ""
- if _, err = os.Stat(filepath.Join(dirPath, fnClean+GPGSigExt)); err == nil {
- gpgSigAttr = " data-gpg-sig=true"
- delete(files, fnClean+GPGSigExt)
- }
- result.WriteString(fmt.Sprintf(
- HTMLElement,
- strings.Join([]string{
- *refreshURLPath, pkgName, "/", fnClean,
- "#", algo, "=", hex.EncodeToString(digest),
- }, ""),
- gpgSigAttr,
- fnClean,
- ))
- }
- }
- result.WriteString(HTMLEnd)
- w.Write(result.Bytes())
-}
-