mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 11:28:24 +00:00 
			
		
		
		
	Deal with markdown template without metadata (#21639)
Fixed #21636. Related to #20987. A markdown template without metadata should not be treated as an invalid template. And this PR fixed another bug that non-template files(neither .md nor .yaml) are treated as yaml files. <img width="504" alt="image" src="https://user-images.githubusercontent.com/9418365/198968668-40082fa1-4f25-4d3e-9b73-1dbf6d1a7521.png">
This commit is contained in:
		| @@ -14,6 +14,7 @@ import ( | |||||||
| 	"code.gitea.io/gitea/modules/markup/markdown" | 	"code.gitea.io/gitea/modules/markup/markdown" | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
|  | 	"code.gitea.io/gitea/modules/util" | ||||||
|  |  | ||||||
| 	"gopkg.in/yaml.v2" | 	"gopkg.in/yaml.v2" | ||||||
| ) | ) | ||||||
| @@ -95,16 +96,29 @@ func unmarshal(filename string, content []byte) (*api.IssueTemplate, error) { | |||||||
| 	}{} | 	}{} | ||||||
|  |  | ||||||
| 	if typ := it.Type(); typ == api.IssueTemplateTypeMarkdown { | 	if typ := it.Type(); typ == api.IssueTemplateTypeMarkdown { | ||||||
| 		templateBody, err := markdown.ExtractMetadata(string(content), it) | 		if templateBody, err := markdown.ExtractMetadata(string(content), it); err != nil { | ||||||
| 		if err != nil { | 			// The only thing we know here is that we can't extract metadata from the content, | ||||||
| 			return nil, err | 			// it's hard to tell if metadata doesn't exist or metadata isn't valid. | ||||||
| 		} | 			// There's an example template: | ||||||
|  | 			// | ||||||
|  | 			//    --- | ||||||
|  | 			//    # Title | ||||||
|  | 			//    --- | ||||||
|  | 			//    Content | ||||||
|  | 			// | ||||||
|  | 			// It could be a valid markdown with two horizontal lines, or an invalid markdown with wrong metadata. | ||||||
|  |  | ||||||
|  | 			it.Content = string(content) | ||||||
|  | 			it.Name = filepath.Base(it.FileName) | ||||||
|  | 			it.About, _ = util.SplitStringAtByteN(it.Content, 80) | ||||||
|  | 		} else { | ||||||
| 			it.Content = templateBody | 			it.Content = templateBody | ||||||
| 			if it.About == "" { | 			if it.About == "" { | ||||||
| 				if _, err := markdown.ExtractMetadata(string(content), compatibleTemplate); err == nil && compatibleTemplate.About != "" { | 				if _, err := markdown.ExtractMetadata(string(content), compatibleTemplate); err == nil && compatibleTemplate.About != "" { | ||||||
| 					it.About = compatibleTemplate.About | 					it.About = compatibleTemplate.About | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
|  | 		} | ||||||
| 	} else if typ == api.IssueTemplateTypeYaml { | 	} else if typ == api.IssueTemplateTypeYaml { | ||||||
| 		if err := yaml.Unmarshal(content, it); err != nil { | 		if err := yaml.Unmarshal(content, it); err != nil { | ||||||
| 			return nil, fmt.Errorf("yaml unmarshal: %w", err) | 			return nil, fmt.Errorf("yaml unmarshal: %w", err) | ||||||
|   | |||||||
| @@ -170,7 +170,7 @@ func (it IssueTemplate) Type() IssueTemplateType { | |||||||
| 	if ext := filepath.Ext(it.FileName); ext == ".md" { | 	if ext := filepath.Ext(it.FileName); ext == ".md" { | ||||||
| 		return IssueTemplateTypeMarkdown | 		return IssueTemplateTypeMarkdown | ||||||
| 	} else if ext == ".yaml" || ext == ".yml" { | 	} else if ext == ".yaml" || ext == ".yml" { | ||||||
| 		return "yaml" |  | ||||||
| 	} |  | ||||||
| 		return IssueTemplateTypeYaml | 		return IssueTemplateTypeYaml | ||||||
|  | 	} | ||||||
|  | 	return "" | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user