123 lines
4.3 KiB
Diff
123 lines
4.3 KiB
Diff
36a37
|
|
> "code.gitea.io/gitea/modules/annex"
|
|
42d42
|
|
< code_indexer "code.gitea.io/gitea/modules/indexer/code"
|
|
150a151
|
|
> var err error
|
|
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(),
|
|
1156,1160c1216,1223
|
|
< if setting.Indexer.RepoIndexerEnabled {
|
|
< ctx.Data["CodeIndexerUnavailable"] = !code_indexer.IsAvailable(ctx)
|
|
< ctx.Data["CodeSearchOptions"] = code_indexer.CodeSearchOptions
|
|
< } else {
|
|
< ctx.Data["CodeSearchOptions"] = git.GrepSearchOptions
|
|
---
|
|
> 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
|