Merge branch 'master' of https://github.com/go-gitea/gitea
This commit is contained in:
commit
ab9f7b384d
13
.drone.yml
13
.drone.yml
|
|
@ -9,6 +9,14 @@ clone:
|
|||
tags: true
|
||||
|
||||
pipeline:
|
||||
pre-build:
|
||||
image: webhippie/nodejs:latest
|
||||
pull: true
|
||||
commands:
|
||||
- npm install
|
||||
- make stylesheets-check
|
||||
when:
|
||||
event: [ push, tag, pull_request ]
|
||||
build:
|
||||
image: webhippie/golang:edge
|
||||
pull: true
|
||||
|
|
@ -16,14 +24,11 @@ pipeline:
|
|||
TAGS: bindata sqlite
|
||||
GOPATH: /srv/app
|
||||
commands:
|
||||
- apk -U add nodejs nodejs-npm
|
||||
- npm install
|
||||
- make clean
|
||||
- make generate
|
||||
- make vet
|
||||
- make lint
|
||||
- make fmt-check
|
||||
- make stylesheets-check
|
||||
- make misspell-check
|
||||
- make test-vendor
|
||||
- make build
|
||||
|
|
@ -212,6 +217,7 @@ pipeline:
|
|||
pull: true
|
||||
secrets: [ crowdin_key ]
|
||||
project_identifier: gitea
|
||||
ignore_branch: true
|
||||
files:
|
||||
locale_en-US.ini: options/locale/locale_en-US.ini
|
||||
when:
|
||||
|
|
@ -221,6 +227,7 @@ pipeline:
|
|||
github:
|
||||
image: plugins/github-release:1
|
||||
pull: true
|
||||
secrets: [ github_token ]
|
||||
files:
|
||||
- dist/release/*
|
||||
when:
|
||||
|
|
|
|||
14
Makefile
14
Makefile
|
|
@ -289,21 +289,17 @@ public/js/index.js: $(JAVASCRIPTS)
|
|||
cat $< >| $@
|
||||
|
||||
.PHONY: stylesheets-check
|
||||
stylesheets-check: stylesheets
|
||||
stylesheets-check: generate-stylesheets
|
||||
@diff=$$(git diff public/css/index.css); \
|
||||
if [ -n "$$diff" ]; then \
|
||||
echo "Please run 'make stylesheets' and commit the result:"; \
|
||||
echo "Please run 'make generate-stylesheets' and commit the result:"; \
|
||||
echo "$${diff}"; \
|
||||
exit 1; \
|
||||
fi;
|
||||
|
||||
.PHONY: stylesheets
|
||||
stylesheets:
|
||||
@hash minify > /dev/null 2>&1; if [ $$? -ne 0 ]; then \
|
||||
$(GO) get -u github.com/tdewolff/minify/cmd/minify; \
|
||||
fi
|
||||
node_modules/.bin/lessc --no-ie-compat public/less/index.less public/css/index.css
|
||||
minify -o public/css/index.css public/css/index.css
|
||||
.PHONY: generate-stylesheets
|
||||
generate-stylesheets:
|
||||
node_modules/.bin/lessc --no-ie-compat --clean-css public/less/index.less public/css/index.css
|
||||
|
||||
.PHONY: swagger-ui
|
||||
swagger-ui:
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ func InitIssueIndexer() {
|
|||
|
||||
// populateIssueIndexer populate the issue indexer with issue data
|
||||
func populateIssueIndexer() error {
|
||||
batch := indexer.IssueIndexerBatch()
|
||||
for page := 1; ; page++ {
|
||||
repos, _, err := Repositories(&SearchRepoOptions{
|
||||
Page: page,
|
||||
|
|
@ -34,7 +35,7 @@ func populateIssueIndexer() error {
|
|||
return fmt.Errorf("Repositories: %v", err)
|
||||
}
|
||||
if len(repos) == 0 {
|
||||
return nil
|
||||
return batch.Flush()
|
||||
}
|
||||
for _, repo := range repos {
|
||||
issues, err := Issues(&IssuesOptions{
|
||||
|
|
@ -42,29 +43,37 @@ func populateIssueIndexer() error {
|
|||
IsClosed: util.OptionalBoolNone,
|
||||
IsPull: util.OptionalBoolNone,
|
||||
})
|
||||
updates := make([]indexer.IssueIndexerUpdate, len(issues))
|
||||
for i, issue := range issues {
|
||||
updates[i] = issue.update()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err = indexer.BatchUpdateIssues(updates...); err != nil {
|
||||
return fmt.Errorf("BatchUpdate: %v", err)
|
||||
for _, issue := range issues {
|
||||
if err := batch.Add(issue.update()); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func processIssueIndexerUpdateQueue() {
|
||||
batch := indexer.IssueIndexerBatch()
|
||||
for {
|
||||
var issueID int64
|
||||
select {
|
||||
case issueID := <-issueIndexerUpdateQueue:
|
||||
issue, err := GetIssueByID(issueID)
|
||||
if err != nil {
|
||||
log.Error(4, "issuesIndexer.Index: %v", err)
|
||||
continue
|
||||
}
|
||||
if err = indexer.UpdateIssue(issue.update()); err != nil {
|
||||
log.Error(4, "issuesIndexer.Index: %v", err)
|
||||
case issueID = <-issueIndexerUpdateQueue:
|
||||
default:
|
||||
// flush whatever updates we currently have, since we
|
||||
// might have to wait a while
|
||||
if err := batch.Flush(); err != nil {
|
||||
log.Error(4, "IssueIndexer: %v", err)
|
||||
}
|
||||
issueID = <-issueIndexerUpdateQueue
|
||||
}
|
||||
issue, err := GetIssueByID(issueID)
|
||||
if err != nil {
|
||||
log.Error(4, "GetIssueByID: %v", err)
|
||||
} else if err = batch.Add(issue.update()); err != nil {
|
||||
log.Error(4, "IssueIndexer: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -227,7 +227,7 @@ func ChangeMilestoneStatus(m *Milestone, isClosed bool) (err error) {
|
|||
|
||||
repo.NumMilestones = int(countRepoMilestones(sess, repo.ID))
|
||||
repo.NumClosedMilestones = int(countRepoClosedMilestones(sess, repo.ID))
|
||||
if _, err = sess.Id(repo.ID).AllCols().Update(repo); err != nil {
|
||||
if _, err = sess.Id(repo.ID).Cols("num_milestones, num_closed_milestones").Update(repo); err != nil {
|
||||
return err
|
||||
}
|
||||
return sess.Commit()
|
||||
|
|
@ -341,7 +341,7 @@ func DeleteMilestoneByRepoID(repoID, id int64) error {
|
|||
|
||||
repo.NumMilestones = int(countRepoMilestones(sess, repo.ID))
|
||||
repo.NumClosedMilestones = int(countRepoClosedMilestones(sess, repo.ID))
|
||||
if _, err = sess.Id(repo.ID).AllCols().Update(repo); err != nil {
|
||||
if _, err = sess.Id(repo.ID).Cols("num_milestones, num_closed_milestones").Update(repo); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -101,7 +101,7 @@ func UpdateIssueUsersByMentions(e Engine, issueID int64, uids []int64) error {
|
|||
|
||||
iu.IsMentioned = true
|
||||
if has {
|
||||
_, err = e.Id(iu.ID).AllCols().Update(iu)
|
||||
_, err = e.Id(iu.ID).Cols("is_mentioned").Update(iu)
|
||||
} else {
|
||||
_, err = e.Insert(iu)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -412,7 +412,7 @@ func ChangeOrgUserStatus(orgID, uid int64, public bool) error {
|
|||
}
|
||||
|
||||
ou.IsPublic = public
|
||||
_, err = x.Id(ou.ID).AllCols().Update(ou)
|
||||
_, err = x.Id(ou.ID).Cols("is_public").Update(ou)
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -96,7 +96,7 @@ func (t *Team) addRepository(e Engine, repo *Repository) (err error) {
|
|||
}
|
||||
|
||||
t.NumRepos++
|
||||
if _, err = e.Id(t.ID).AllCols().Update(t); err != nil {
|
||||
if _, err = e.Id(t.ID).Cols("num_repos").Update(t); err != nil {
|
||||
return fmt.Errorf("update team: %v", err)
|
||||
}
|
||||
|
||||
|
|
@ -142,7 +142,7 @@ func (t *Team) removeRepository(e Engine, repo *Repository, recalculate bool) (e
|
|||
}
|
||||
|
||||
t.NumRepos--
|
||||
if _, err = e.Id(t.ID).AllCols().Update(t); err != nil {
|
||||
if _, err = e.Id(t.ID).Cols("num_repos").Update(t); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
@ -521,7 +521,7 @@ func AddTeamMember(team *Team, userID int64) error {
|
|||
if team.IsOwnerTeam() {
|
||||
ou.IsOwner = true
|
||||
}
|
||||
if _, err := sess.Id(ou.ID).AllCols().Update(ou); err != nil {
|
||||
if _, err := sess.Id(ou.ID).Cols("num_teams, is_owner").Update(ou); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
@ -552,7 +552,7 @@ func removeTeamMember(e Engine, team *Team, userID int64) error {
|
|||
return err
|
||||
} else if _, err = e.
|
||||
Id(team.ID).
|
||||
AllCols().
|
||||
Cols("num_members").
|
||||
Update(team); err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
@ -579,7 +579,7 @@ func removeTeamMember(e Engine, team *Team, userID int64) error {
|
|||
}
|
||||
if _, err = e.
|
||||
Id(ou.ID).
|
||||
AllCols().
|
||||
Cols("num_teams").
|
||||
Update(ou); err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
|||
|
|
@ -425,7 +425,7 @@ func (pr *PullRequest) setMerged() (err error) {
|
|||
if err = pr.Issue.changeStatus(sess, pr.Merger, pr.Issue.Repo, true); err != nil {
|
||||
return fmt.Errorf("Issue.changeStatus: %v", err)
|
||||
}
|
||||
if _, err = sess.Id(pr.ID).AllCols().Update(pr); err != nil {
|
||||
if _, err = sess.Id(pr.ID).Cols("has_merged").Update(pr); err != nil {
|
||||
return fmt.Errorf("update pull request: %v", err)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1469,7 +1469,7 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
|
|||
}
|
||||
|
||||
t.NumRepos--
|
||||
if _, err := sess.Id(t.ID).AllCols().Update(t); err != nil {
|
||||
if _, err := sess.Id(t.ID).Cols("num_repos").Update(t); err != nil {
|
||||
return fmt.Errorf("decrease team repository count '%d': %v", t.ID, err)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -143,7 +143,7 @@ func (repo *Repository) ChangeCollaborationAccessMode(uid int64, mode AccessMode
|
|||
|
||||
if _, err = sess.
|
||||
Id(collaboration.ID).
|
||||
AllCols().
|
||||
Cols("mode").
|
||||
Update(collaboration); err != nil {
|
||||
return fmt.Errorf("update collaboration: %v", err)
|
||||
} else if _, err = sess.Exec("UPDATE access SET mode = ? WHERE user_id = ? AND repo_id = ?", mode, uid, repo.ID); err != nil {
|
||||
|
|
|
|||
|
|
@ -477,15 +477,8 @@ func ListPublicKeys(uid int64) ([]*PublicKey, error) {
|
|||
Find(&keys)
|
||||
}
|
||||
|
||||
// UpdatePublicKey updates given public key.
|
||||
func UpdatePublicKey(key *PublicKey) error {
|
||||
_, err := x.Id(key.ID).AllCols().Update(key)
|
||||
return err
|
||||
}
|
||||
|
||||
// UpdatePublicKeyUpdated updates public key use time.
|
||||
func UpdatePublicKeyUpdated(id int64) error {
|
||||
now := time.Now()
|
||||
// Check if key exists before update as affected rows count is unreliable
|
||||
// and will return 0 affected rows if two updates are made at the same time
|
||||
if cnt, err := x.ID(id).Count(&PublicKey{}); err != nil {
|
||||
|
|
@ -495,8 +488,7 @@ func UpdatePublicKeyUpdated(id int64) error {
|
|||
}
|
||||
|
||||
_, err := x.ID(id).Cols("updated_unix").Update(&PublicKey{
|
||||
Updated: now,
|
||||
UpdatedUnix: now.Unix(),
|
||||
UpdatedUnix: time.Now().Unix(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
|
|
|
|||
|
|
@ -874,6 +874,10 @@ func UpdateUser(u *User) error {
|
|||
|
||||
// UpdateUserCols update user according special columns
|
||||
func UpdateUserCols(u *User, cols ...string) error {
|
||||
return updateUserCols(x, u, cols...)
|
||||
}
|
||||
|
||||
func updateUserCols(e Engine, u *User, cols ...string) error {
|
||||
// Organization does not need email
|
||||
u.Email = strings.ToLower(u.Email)
|
||||
if !u.IsOrganization() {
|
||||
|
|
@ -890,7 +894,7 @@ func UpdateUserCols(u *User, cols ...string) error {
|
|||
u.Website = base.TruncateString(u.Website, 255)
|
||||
u.Description = base.TruncateString(u.Description, 255)
|
||||
|
||||
_, err := x.Id(u.ID).Cols(cols...).Update(u)
|
||||
_, err := e.Id(u.ID).Cols(cols...).Update(u)
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -135,10 +135,10 @@ func (email *EmailAddress) Activate() error {
|
|||
email.IsActivated = true
|
||||
if _, err := sess.
|
||||
Id(email.ID).
|
||||
AllCols().
|
||||
Cols("is_activated").
|
||||
Update(email); err != nil {
|
||||
return err
|
||||
} else if err = updateUser(sess, user); err != nil {
|
||||
} else if err = updateUserCols(sess, user, "rands"); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
@ -222,7 +222,7 @@ func MakeEmailPrimary(email *EmailAddress) error {
|
|||
}
|
||||
|
||||
user.Email = email.Email
|
||||
if _, err = sess.Id(user.ID).AllCols().Update(user); err != nil {
|
||||
if _, err = sess.Id(user.ID).Cols("email").Update(user); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,6 +9,8 @@ import (
|
|||
"strconv"
|
||||
|
||||
"github.com/blevesearch/bleve"
|
||||
"github.com/blevesearch/bleve/analysis/token/unicodenorm"
|
||||
"github.com/blevesearch/bleve/mapping"
|
||||
"github.com/blevesearch/bleve/search/query"
|
||||
)
|
||||
|
||||
|
|
@ -41,3 +43,50 @@ func newMatchPhraseQuery(matchPhrase, field, analyzer string) *query.MatchPhrase
|
|||
q.Analyzer = analyzer
|
||||
return q
|
||||
}
|
||||
|
||||
const unicodeNormalizeName = "unicodeNormalize"
|
||||
|
||||
func addUnicodeNormalizeTokenFilter(m *mapping.IndexMappingImpl) error {
|
||||
return m.AddCustomTokenFilter(unicodeNormalizeName, map[string]interface{}{
|
||||
"type": unicodenorm.Name,
|
||||
"form": unicodenorm.NFC,
|
||||
})
|
||||
}
|
||||
|
||||
// Update represents an update to an indexer
|
||||
type Update interface {
|
||||
addToBatch(batch *bleve.Batch) error
|
||||
}
|
||||
|
||||
const maxBatchSize = 16
|
||||
|
||||
// Batch batch of indexer updates that automatically flushes once it
|
||||
// reaches a certain size
|
||||
type Batch struct {
|
||||
batch *bleve.Batch
|
||||
index bleve.Index
|
||||
}
|
||||
|
||||
// Add add update to batch, possibly flushing
|
||||
func (batch *Batch) Add(update Update) error {
|
||||
if err := update.addToBatch(batch.batch); err != nil {
|
||||
return err
|
||||
}
|
||||
return batch.flushIfFull()
|
||||
}
|
||||
|
||||
func (batch *Batch) flushIfFull() error {
|
||||
if batch.batch.Size() >= maxBatchSize {
|
||||
return batch.Flush()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Flush manually flush the batch, regardless of its size
|
||||
func (batch *Batch) Flush() error {
|
||||
if err := batch.index.Batch(batch.batch); err != nil {
|
||||
return err
|
||||
}
|
||||
batch.batch.Reset()
|
||||
return nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@ import (
|
|||
"github.com/blevesearch/bleve"
|
||||
"github.com/blevesearch/bleve/analysis/analyzer/custom"
|
||||
"github.com/blevesearch/bleve/analysis/token/lowercase"
|
||||
"github.com/blevesearch/bleve/analysis/token/unicodenorm"
|
||||
"github.com/blevesearch/bleve/analysis/tokenizer/unicode"
|
||||
"github.com/blevesearch/bleve/index/upsidedown"
|
||||
)
|
||||
|
|
@ -35,6 +34,10 @@ type IssueIndexerUpdate struct {
|
|||
Data *IssueIndexerData
|
||||
}
|
||||
|
||||
func (update IssueIndexerUpdate) addToBatch(batch *bleve.Batch) error {
|
||||
return batch.Index(indexerID(update.IssueID), update.Data)
|
||||
}
|
||||
|
||||
const issueIndexerAnalyzer = "issueIndexer"
|
||||
|
||||
// InitIssueIndexer initialize issue indexer
|
||||
|
|
@ -74,17 +77,13 @@ func createIssueIndexer() error {
|
|||
docMapping.AddFieldMappingsAt("Content", textFieldMapping)
|
||||
docMapping.AddFieldMappingsAt("Comments", textFieldMapping)
|
||||
|
||||
const unicodeNormNFC = "unicodeNormNFC"
|
||||
if err := mapping.AddCustomTokenFilter(unicodeNormNFC, map[string]interface{}{
|
||||
"type": unicodenorm.Name,
|
||||
"form": unicodenorm.NFC,
|
||||
}); err != nil {
|
||||
if err := addUnicodeNormalizeTokenFilter(mapping); err != nil {
|
||||
return err
|
||||
} else if err = mapping.AddCustomAnalyzer(issueIndexerAnalyzer, map[string]interface{}{
|
||||
"type": custom.Name,
|
||||
"char_filters": []string{},
|
||||
"tokenizer": unicode.Name,
|
||||
"token_filters": []string{unicodeNormNFC, lowercase.Name},
|
||||
"token_filters": []string{unicodeNormalizeName, lowercase.Name},
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
@ -97,21 +96,12 @@ func createIssueIndexer() error {
|
|||
return err
|
||||
}
|
||||
|
||||
// UpdateIssue update the issue indexer
|
||||
func UpdateIssue(update IssueIndexerUpdate) error {
|
||||
return issueIndexer.Index(indexerID(update.IssueID), update.Data)
|
||||
}
|
||||
|
||||
// BatchUpdateIssues perform a batch update of the issue indexer
|
||||
func BatchUpdateIssues(updates ...IssueIndexerUpdate) error {
|
||||
batch := issueIndexer.NewBatch()
|
||||
for _, update := range updates {
|
||||
err := batch.Index(indexerID(update.IssueID), update.Data)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// IssueIndexerBatch batch to add updates to
|
||||
func IssueIndexerBatch() *Batch {
|
||||
return &Batch{
|
||||
batch: issueIndexer.NewBatch(),
|
||||
index: issueIndexer,
|
||||
}
|
||||
return issueIndexer.Batch(batch)
|
||||
}
|
||||
|
||||
// SearchIssuesByKeyword searches for issues by given conditions.
|
||||
|
|
|
|||
11
package.json
11
package.json
|
|
@ -1,6 +1,7 @@
|
|||
{
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"less": "^2.7.2"
|
||||
}
|
||||
}
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"less": "^2.7.2",
|
||||
"less-plugin-clean-css": "^1.5.1"
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user