diff --git a/modules/git/repo_attribute.go b/modules/git/repo_attribute.go
index d3a3dc8c8..404d9e502 100644
--- a/modules/git/repo_attribute.go
+++ b/modules/git/repo_attribute.go
@@ -9,8 +9,6 @@ import (
 	"fmt"
 	"io"
 	"os"
-	"strconv"
-	"strings"
 
 	"code.gitea.io/gitea/modules/log"
 )
@@ -288,102 +286,6 @@ func (wr *nulSeparatedAttributeWriter) Close() error {
 	return nil
 }
 
-type lineSeparatedAttributeWriter struct {
-	tmp        []byte
-	attributes chan attributeTriple
-	closed     chan struct{}
-}
-
-func (wr *lineSeparatedAttributeWriter) Write(p []byte) (n int, err error) {
-	l := len(p)
-
-	nlIdx := bytes.IndexByte(p, '\n')
-	for nlIdx >= 0 {
-		wr.tmp = append(wr.tmp, p[:nlIdx]...)
-
-		if len(wr.tmp) == 0 {
-			// This should not happen
-			if len(p) > nlIdx+1 {
-				wr.tmp = wr.tmp[:0]
-				p = p[nlIdx+1:]
-				nlIdx = bytes.IndexByte(p, '\n')
-				continue
-			} else {
-				return l, nil
-			}
-		}
-
-		working := attributeTriple{}
-		if wr.tmp[0] == '"' {
-			sb := new(strings.Builder)
-			remaining := string(wr.tmp[1:])
-			for len(remaining) > 0 {
-				rn, _, tail, err := strconv.UnquoteChar(remaining, '"')
-				if err != nil {
-					if len(remaining) > 2 && remaining[0] == '"' && remaining[1] == ':' && remaining[2] == ' ' {
-						working.Filename = sb.String()
-						wr.tmp = []byte(remaining[3:])
-						break
-					}
-					return l, fmt.Errorf("unexpected tail %s", remaining)
-				}
-				_, _ = sb.WriteRune(rn)
-				remaining = tail
-			}
-		} else {
-			idx := bytes.IndexByte(wr.tmp, ':')
-			if idx < 0 {
-				return l, fmt.Errorf("unexpected input %s", string(wr.tmp))
-			}
-			working.Filename = string(wr.tmp[:idx])
-			if len(wr.tmp) < idx+2 {
-				return l, fmt.Errorf("unexpected input %s", string(wr.tmp))
-			}
-			wr.tmp = wr.tmp[idx+2:]
-		}
-
-		idx := bytes.IndexByte(wr.tmp, ':')
-		if idx < 0 {
-			return l, fmt.Errorf("unexpected input %s", string(wr.tmp))
-		}
-
-		working.Attribute = string(wr.tmp[:idx])
-		if len(wr.tmp) < idx+2 {
-			return l, fmt.Errorf("unexpected input %s", string(wr.tmp))
-		}
-
-		working.Value = string(wr.tmp[idx+2:])
-
-		wr.attributes <- working
-		wr.tmp = wr.tmp[:0]
-		if len(p) > nlIdx+1 {
-			p = p[nlIdx+1:]
-			nlIdx = bytes.IndexByte(p, '\n')
-			continue
-		} else {
-			return l, nil
-		}
-	}
-
-	wr.tmp = append(wr.tmp, p...)
-	return l, nil
-}
-
-func (wr *lineSeparatedAttributeWriter) ReadAttribute() <-chan attributeTriple {
-	return wr.attributes
-}
-
-func (wr *lineSeparatedAttributeWriter) Close() error {
-	select {
-	case <-wr.closed:
-		return nil
-	default:
-	}
-	close(wr.attributes)
-	close(wr.closed)
-	return nil
-}
-
 // Create a check attribute reader for the current repository and provided commit ID
 func (repo *Repository) CheckAttributeReader(commitID string) (*CheckAttributeReader, context.CancelFunc) {
 	indexFilename, worktree, deleteTemporaryFile, err := repo.ReadTreeToTemporaryIndex(commitID)
diff --git a/modules/git/repo_attribute_test.go b/modules/git/repo_attribute_test.go
index 6882874d2..f88ae9540 100644
--- a/modules/git/repo_attribute_test.go
+++ b/modules/git/repo_attribute_test.go
@@ -95,64 +95,3 @@ func Test_nulSeparatedAttributeWriter_ReadAttribute(t *testing.T) {
 		Value:     "unspecified",
 	}, attr)
 }
-
-func Test_lineSeparatedAttributeWriter_ReadAttribute(t *testing.T) {
-	wr := &lineSeparatedAttributeWriter{
-		attributes: make(chan attributeTriple, 5),
-	}
-
-	testStr := `".gitignore\"\n": linguist-vendored: unspecified
-`
-	n, err := wr.Write([]byte(testStr))
-
-	assert.Equal(t, n, len(testStr))
-	assert.NoError(t, err)
-
-	select {
-	case attr := <-wr.ReadAttribute():
-		assert.Equal(t, ".gitignore\"\n", attr.Filename)
-		assert.Equal(t, "linguist-vendored", attr.Attribute)
-		assert.Equal(t, "unspecified", attr.Value)
-	case <-time.After(100 * time.Millisecond):
-		assert.Fail(t, "took too long to read an attribute from the list")
-	}
-
-	// Write a second attribute again
-	n, err = wr.Write([]byte(testStr))
-
-	assert.Equal(t, n, len(testStr))
-	assert.NoError(t, err)
-
-	select {
-	case attr := <-wr.ReadAttribute():
-		assert.Equal(t, ".gitignore\"\n", attr.Filename)
-		assert.Equal(t, "linguist-vendored", attr.Attribute)
-		assert.Equal(t, "unspecified", attr.Value)
-	case <-time.After(100 * time.Millisecond):
-		assert.Fail(t, "took too long to read an attribute from the list")
-	}
-
-	// Write a partial attribute
-	_, err = wr.Write([]byte("incomplete-file"))
-	assert.NoError(t, err)
-	_, err = wr.Write([]byte("name: "))
-	assert.NoError(t, err)
-	select {
-	case <-wr.ReadAttribute():
-		assert.Fail(t, "There should not be an attribute ready to read")
-	case <-time.After(100 * time.Millisecond):
-	}
-	_, err = wr.Write([]byte("attribute: "))
-	assert.NoError(t, err)
-	select {
-	case <-wr.ReadAttribute():
-		assert.Fail(t, "There should not be an attribute ready to read")
-	case <-time.After(100 * time.Millisecond):
-	}
-	_, err = wr.Write([]byte("value\n"))
-	assert.NoError(t, err)
-	attr := <-wr.ReadAttribute()
-	assert.Equal(t, "incomplete-filename", attr.Filename)
-	assert.Equal(t, "attribute", attr.Attribute)
-	assert.Equal(t, "value", attr.Value)
-}
diff --git a/modules/markup/markdown/markdown.go b/modules/markup/markdown/markdown.go
index 1e5c47075..f1ffea887 100644
--- a/modules/markup/markdown/markdown.go
+++ b/modules/markup/markdown/markdown.go
@@ -289,9 +289,3 @@ func RenderRawString(ctx *markup.RenderContext, content string) (string, error)
 	}
 	return buf.String(), nil
 }
-
-// IsMarkdownFile reports whether name looks like a Markdown file
-// based on its extension.
-func IsMarkdownFile(name string) bool {
-	return markup.IsMarkupFile(name, MarkupName)
-}
diff --git a/modules/markup/markdown/markdown_test.go b/modules/markup/markdown/markdown_test.go
index bb2c47f18..cc683dc5b 100644
--- a/modules/markup/markdown/markdown_test.go
+++ b/modules/markup/markdown/markdown_test.go
@@ -74,28 +74,6 @@ func TestRender_StandardLinks(t *testing.T) {
 		`<p><a href="`+lnkWiki+`" rel="nofollow">WikiPage</a></p>`)
 }
 
-func TestMisc_IsMarkdownFile(t *testing.T) {
-	setting.Markdown.FileExtensions = []string{".md", ".markdown", ".mdown", ".mkd"}
-	trueTestCases := []string{
-		"test.md",
-		"wow.MARKDOWN",
-		"LOL.mDoWn",
-	}
-	falseTestCases := []string{
-		"test",
-		"abcdefg",
-		"abcdefghijklmnopqrstuvwxyz",
-		"test.md.test",
-	}
-
-	for _, testCase := range trueTestCases {
-		assert.True(t, IsMarkdownFile(testCase))
-	}
-	for _, testCase := range falseTestCases {
-		assert.False(t, IsMarkdownFile(testCase))
-	}
-}
-
 func TestRender_Images(t *testing.T) {
 	setting.AppURL = AppURL
 	setting.AppSubURL = AppSubURL