func IssueGetAttachment(ctx *middleware.Context) { id := com.StrTo(ctx.Params(":id")).MustInt64() if id == 0 { ctx.Error(404) return } attachment, err := models.GetAttachmentById(id) if err != nil { ctx.Handle(404, "issue.IssueGetAttachment(models.GetAttachmentById)", err) return } // Fix #312. Attachments with , in their name are not handled correctly by Google Chrome. // We must put the name in " manually. ctx.ServeFile(attachment.Path, "\""+attachment.Name+"\"") }
func Download(ctx *middleware.Context) { var ( uri = ctx.Params("*") refName string ext string archivePath string archiveType git.ArchiveType ) switch { case strings.HasSuffix(uri, ".zip"): ext = ".zip" archivePath = path.Join(ctx.Repo.GitRepo.Path, "archives/zip") archiveType = git.ZIP case strings.HasSuffix(uri, ".tar.gz"): ext = ".tar.gz" archivePath = path.Join(ctx.Repo.GitRepo.Path, "archives/targz") archiveType = git.TARGZ default: ctx.Error(404) return } refName = strings.TrimSuffix(uri, ext) if !com.IsDir(archivePath) { if err := os.MkdirAll(archivePath, os.ModePerm); err != nil { ctx.Handle(500, "Download -> os.MkdirAll(archivePath)", err) return } } // Get corresponding commit. var ( commit *git.Commit err error ) gitRepo := ctx.Repo.GitRepo if gitRepo.IsBranchExist(refName) { commit, err = gitRepo.GetCommitOfBranch(refName) if err != nil { ctx.Handle(500, "Download", err) return } } else if gitRepo.IsTagExist(refName) { commit, err = gitRepo.GetCommitOfTag(refName) if err != nil { ctx.Handle(500, "Download", err) return } } else if len(refName) == 40 { commit, err = gitRepo.GetCommit(refName) if err != nil { ctx.Handle(404, "Download", nil) return } } else { ctx.Error(404) return } archivePath = path.Join(archivePath, base.ShortSha(commit.Id.String())+ext) if !com.IsFile(archivePath) { if err := commit.CreateArchive(archivePath, archiveType); err != nil { ctx.Handle(500, "Download -> CreateArchive "+archivePath, err) return } } ctx.ServeFile(archivePath, ctx.Repo.Repository.Name+"-"+base.ShortSha(commit.Id.String())+ext) }