36a37 > "code.gitea.io/gitea/modules/annex" 212,216c213,219 < isTextFile bool < isLFSFile bool < fileSize int64 < lfsMeta *lfs.Pointer < st typesniffer.SniffedType --- > isTextFile bool > isLFSFile bool > isAnnexFile bool > isAnnexFilePresent bool > fileSize int64 > lfsMeta *lfs.Pointer > st typesniffer.SniffedType 219a223,265 > isAnnexed, err := annex.IsAnnexed(blob) > if err != nil { > return nil, nil, nil, err > } > if isAnnexed { > // TODO: this code could be merged with the LFS case, especially the redundant type sniffer, > // but it is *currently* written this way to make merging with the non-annex upstream easier: > // this way, the git-annex patch is (mostly) pure additions. > > annexContent, err := annex.Content(blob) > if err != nil { > // If annex.Content returns an error it can mean that the blob does not > // refer to an annexed file or that it is not present here. Since we already > // checked that it is annexed the latter must be the case. So we return the > // content of the blob instead and indicate that the file is indeed annexed, > // but not present here. The template can then communicate the situation. > dataRc, err := blob.DataAsync() > if err != nil { > return nil, nil, nil, err > } > > buf := make([]byte, 1024) > n, _ := util.ReadAtMost(dataRc, buf) > buf = buf[:n] > > st := typesniffer.DetectContentType(buf) > return buf, dataRc, &fileInfo{st.IsText(), false, true, false, blob.Size(), nil, st}, nil > } > > stat, err := annexContent.Stat() > if err != nil { > return nil, nil, nil, err > } > > buf := make([]byte, 1024) > n, _ := util.ReadAtMost(annexContent, buf) > buf = buf[:n] > > st := typesniffer.DetectContentType(buf) > > return buf, annexContent, &fileInfo{st.IsText(), false, true, true, stat.Size(), nil, st}, nil > } > 234c280 < return buf, dataRc, &fileInfo{isTextFile, false, blob.Size(), nil, st}, nil --- > return buf, dataRc, &fileInfo{isTextFile, false, false, false, blob.Size(), nil, st}, nil 239c285 < return buf, dataRc, &fileInfo{isTextFile, false, blob.Size(), nil, st}, nil --- > return buf, dataRc, &fileInfo{isTextFile, false, false, false, blob.Size(), nil, st}, nil 245c291 < return buf, dataRc, &fileInfo{isTextFile, false, blob.Size(), nil, st}, nil --- > return buf, dataRc, &fileInfo{isTextFile, false, false, false, blob.Size(), nil, st}, nil 265c311 < return buf, dataRc, &fileInfo{st.IsText(), true, meta.Size, &meta.Pointer, st}, nil --- > return buf, dataRc, &fileInfo{st.IsText(), true, false, false, meta.Size, &meta.Pointer, st}, nil 327a374 > Blob: target.Blob(), 450c497 < if fInfo.isLFSFile { --- > if fInfo.isLFSFile || fInfo.isAnnexFile { 453a501,507 > if fInfo.isAnnexFile { > // pre-git-annex v7, all annexed files were represented in-repo as symlinks; > // but we pretend they aren't, since that's a distracting quirk of git-annex > // and not a meaningful choice on the user's part > ctx.Data["FileIsSymlink"] = false > } > 460a515,516 > ctx.Data["IsAnnexFile"] = fInfo.isAnnexFile > ctx.Data["IsAnnexFilePresent"] = fInfo.isAnnexFilePresent 494a551,552 > } else if fInfo.isAnnexFile { > ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.cannot_edit_annex_files") 548a607 > Blob: entry.Blob(), 602c661 < if !fInfo.isLFSFile { --- > if !fInfo.isLFSFile && !fInfo.isAnnexFile { 646a706 > Blob: entry.Blob(), 1155a1216,1224 > isAnnexFile, okAnnexFile := ctx.Data["IsAnnexFile"] > isAnnexFilePresent, okAnnexFilePresent := ctx.Data["IsAnnexFilePresent"] > if okAnnexFile && okAnnexFilePresent && isAnnexFile.(bool) && !isAnnexFilePresent.(bool) { > // If the file to be viewed is annexed but not present then render it normally > // (which will show the plain git blob content, i.e. the symlink or pointer target) > // but make the status code a 404. > ctx.HTML(http.StatusNotFound, tplRepoHome) > return > }