Fix commenting on non-utf8 encoded files (#11916)
* Add comment on non-unicode line to force fail Signed-off-by: Andrew Thornton <art27@cantab.net> * Just quote/unquote patch Signed-off-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
		
							parent
							
								
									1dd3f19ee3
								
							
						
					
					
						commit
						654a970644
					
				
					 6 changed files with 41 additions and 4 deletions
				
			
		|  | @ -86,6 +86,11 @@ func TestAPIPullReview(t *testing.T) { | ||||||
| 			Body:       "first old line", | 			Body:       "first old line", | ||||||
| 			OldLineNum: 1, | 			OldLineNum: 1, | ||||||
| 			NewLineNum: 0, | 			NewLineNum: 0, | ||||||
|  | 		}, { | ||||||
|  | 			Path:       "iso-8859-1.txt", | ||||||
|  | 			Body:       "this line contains a non-utf-8 character", | ||||||
|  | 			OldLineNum: 0, | ||||||
|  | 			NewLineNum: 1, | ||||||
| 		}, | 		}, | ||||||
| 		}, | 		}, | ||||||
| 	}) | 	}) | ||||||
|  | @ -93,7 +98,7 @@ func TestAPIPullReview(t *testing.T) { | ||||||
| 	DecodeJSON(t, resp, &review) | 	DecodeJSON(t, resp, &review) | ||||||
| 	assert.EqualValues(t, 6, review.ID) | 	assert.EqualValues(t, 6, review.ID) | ||||||
| 	assert.EqualValues(t, "PENDING", review.State) | 	assert.EqualValues(t, "PENDING", review.State) | ||||||
| 	assert.EqualValues(t, 2, review.CodeCommentsCount) | 	assert.EqualValues(t, 3, review.CodeCommentsCount) | ||||||
| 
 | 
 | ||||||
| 	// test SubmitPullReview
 | 	// test SubmitPullReview
 | ||||||
| 	req = NewRequestWithJSON(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/reviews/%d?token=%s", repo.OwnerName, repo.Name, pullIssue.Index, review.ID, token), &api.SubmitPullReviewOptions{ | 	req = NewRequestWithJSON(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/reviews/%d?token=%s", repo.OwnerName, repo.Name, pullIssue.Index, review.ID, token), &api.SubmitPullReviewOptions{ | ||||||
|  | @ -104,7 +109,7 @@ func TestAPIPullReview(t *testing.T) { | ||||||
| 	DecodeJSON(t, resp, &review) | 	DecodeJSON(t, resp, &review) | ||||||
| 	assert.EqualValues(t, 6, review.ID) | 	assert.EqualValues(t, 6, review.ID) | ||||||
| 	assert.EqualValues(t, "APPROVED", review.State) | 	assert.EqualValues(t, "APPROVED", review.State) | ||||||
| 	assert.EqualValues(t, 2, review.CodeCommentsCount) | 	assert.EqualValues(t, 3, review.CodeCommentsCount) | ||||||
| 
 | 
 | ||||||
| 	// test DeletePullReview
 | 	// test DeletePullReview
 | ||||||
| 	req = NewRequestWithJSON(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/reviews?token=%s", repo.OwnerName, repo.Name, pullIssue.Index, token), &api.CreatePullReviewOptions{ | 	req = NewRequestWithJSON(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/reviews?token=%s", repo.OwnerName, repo.Name, pullIssue.Index, token), &api.CreatePullReviewOptions{ | ||||||
|  |  | ||||||
										
											Binary file not shown.
										
									
								
							|  | @ -0,0 +1,2 @@ | ||||||
|  | xe<>±NÄ0D©#åæŽ4  | ||||||
|  | JÄAÅ5”޳—,—xÑzsVþ<56>‚5„DåÑØ»ž7ý,=®®o.áEå<45>¢áq5J=éˆý<CB86>È	rÄ=>4§ú
O!óŠý<C5A0>ã´ðÐ6ms˜8ƒ¾&\Ea¾tÍT„´I¢z”‰Ô…!	¢dso@a›Ú&ÌK5üB)›r4–”Q¦`YèLÚ¯²b	›<>¾o`Ûaä3¹@(<C5A0>ÒeýÔ5
ô<>ÂH—\sÔHÿ9Ÿ9Rª3)Îë@ŽSùã_"§‘4sE0”Rºñ§¤.‘U|/€m¦Û¿]U÷ÌzÀ | ||||||
										
											Binary file not shown.
										
									
								
							|  | @ -1 +1 @@ | ||||||
| 4a357436d925b5c974181ff12a994538ddc5a269 | 5f22f7d0d95d614d25a5b68592adb345a4b5c7fd | ||||||
|  |  | ||||||
|  | @ -11,7 +11,9 @@ import ( | ||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"regexp" | 	"regexp" | ||||||
|  | 	"strconv" | ||||||
| 	"strings" | 	"strings" | ||||||
|  | 	"unicode/utf8" | ||||||
| 
 | 
 | ||||||
| 	"code.gitea.io/gitea/modules/git" | 	"code.gitea.io/gitea/modules/git" | ||||||
| 	"code.gitea.io/gitea/modules/log" | 	"code.gitea.io/gitea/modules/log" | ||||||
|  | @ -143,7 +145,8 @@ type Comment struct { | ||||||
| 	RenderedContent string `xorm:"-"` | 	RenderedContent string `xorm:"-"` | ||||||
| 
 | 
 | ||||||
| 	// Path represents the 4 lines of code cemented by this comment
 | 	// Path represents the 4 lines of code cemented by this comment
 | ||||||
| 	Patch string `xorm:"TEXT"` | 	Patch       string `xorm:"-"` | ||||||
|  | 	PatchQuoted string `xorm:"TEXT patch"` | ||||||
| 
 | 
 | ||||||
| 	CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` | 	CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` | ||||||
| 	UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` | 	UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` | ||||||
|  | @ -199,6 +202,33 @@ func (c *Comment) loadIssue(e Engine) (err error) { | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // BeforeInsert will be invoked by XORM before inserting a record
 | ||||||
|  | func (c *Comment) BeforeInsert() { | ||||||
|  | 	c.PatchQuoted = c.Patch | ||||||
|  | 	if !utf8.ValidString(c.Patch) { | ||||||
|  | 		c.PatchQuoted = strconv.Quote(c.Patch) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // BeforeUpdate will be invoked by XORM before updating a record
 | ||||||
|  | func (c *Comment) BeforeUpdate() { | ||||||
|  | 	c.PatchQuoted = c.Patch | ||||||
|  | 	if !utf8.ValidString(c.Patch) { | ||||||
|  | 		c.PatchQuoted = strconv.Quote(c.Patch) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // AfterLoad is invoked from XORM after setting the values of all fields of this object.
 | ||||||
|  | func (c *Comment) AfterLoad(session *xorm.Session) { | ||||||
|  | 	c.Patch = c.PatchQuoted | ||||||
|  | 	if len(c.PatchQuoted) > 0 && c.PatchQuoted[0] == '"' { | ||||||
|  | 		unquoted, err := strconv.Unquote(c.PatchQuoted) | ||||||
|  | 		if err == nil { | ||||||
|  | 			c.Patch = unquoted | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (c *Comment) loadPoster(e Engine) (err error) { | func (c *Comment) loadPoster(e Engine) (err error) { | ||||||
| 	if c.PosterID <= 0 || c.Poster != nil { | 	if c.PosterID <= 0 || c.Poster != nil { | ||||||
| 		return nil | 		return nil | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue