From 3566d2c860b0ad3ab7d6d5fb1490eb9a5b5f5974 Mon Sep 17 00:00:00 2001 From: guillep2k Date: Fri, 2 Aug 2019 12:14:50 -0300 Subject: [PATCH 01/12] Include "executable" files in the index, as they are not necessarily binary (#7718) --- models/repo_indexer.go | 2 +- modules/git/tree_entry.go | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/models/repo_indexer.go b/models/repo_indexer.go index 83383807a792..3a41e0525ac3 100644 --- a/models/repo_indexer.go +++ b/models/repo_indexer.go @@ -232,7 +232,7 @@ func addDelete(filename string, repo *Repository, batch rupture.FlushingBatch) e } func isIndexable(entry *git.TreeEntry) bool { - return entry.IsRegular() + return entry.IsRegular() || entry.IsExecutable() } // parseGitLsTreeOutput parses the output of a `git ls-tree -r --full-name` command diff --git a/modules/git/tree_entry.go b/modules/git/tree_entry.go index 6019e34487fe..4e18cc8ead2f 100644 --- a/modules/git/tree_entry.go +++ b/modules/git/tree_entry.go @@ -108,6 +108,11 @@ func (te *TreeEntry) IsRegular() bool { return te.gogitTreeEntry.Mode == filemode.Regular } +// IsExecutable if the entry is an executable file (not necessarily binary) +func (te *TreeEntry) IsExecutable() bool { + return te.gogitTreeEntry.Mode == filemode.Executable +} + // Blob returns the blob object the entry func (te *TreeEntry) Blob() *Blob { encodedObj, err := te.ptree.repo.gogitRepo.Storer.EncodedObject(plumbing.AnyObject, te.gogitTreeEntry.Hash) From 76408d50fb338e9239ee06bb26eec28453167300 Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Fri, 2 Aug 2019 18:06:28 +0200 Subject: [PATCH 02/12] org/members: display 2FA members states + optimize sql requests (#7621) * org/members: display 2FA state * fix comment typo * lay down UserList bases * add basic test for previous methods * add comment for UserList type * add valid two-fa account * test new UserList methods * optimize MembersIsPublic by side loading info on GetMembers + fix integrations tests * respect fmt rules * use map for data * Optimize GetTwoFaStatus * rewrite by using existing sub func * Optimize IsUserOrgOwner * remove un-used code * tests: cover empty org + fix import order * tests: add ErrTeamNotExist path * tests: fix wrong expected result --- models/fixtures/org_user.yml | 6 ++ models/fixtures/team.yml | 11 +++- models/fixtures/team_user.yml | 8 ++- models/fixtures/two_factor.yml | 9 +++ models/fixtures/user.yml | 37 +++++++++++- models/org.go | 17 +++--- models/org_team.go | 5 ++ models/user.go | 11 ++-- models/user_test.go | 59 ++++++++++++++++++- models/userlist.go | 95 +++++++++++++++++++++++++++++++ models/userlist_test.go | 90 +++++++++++++++++++++++++++++ routers/org/members.go | 7 ++- templates/org/member/members.tmpl | 16 ++++-- 13 files changed, 346 insertions(+), 25 deletions(-) create mode 100644 models/fixtures/two_factor.yml create mode 100644 models/userlist.go create mode 100644 models/userlist_test.go diff --git a/models/fixtures/org_user.yml b/models/fixtures/org_user.yml index 5bb23571fc26..385492dd68d1 100644 --- a/models/fixtures/org_user.yml +++ b/models/fixtures/org_user.yml @@ -39,3 +39,9 @@ uid: 20 org_id: 19 is_public: true + +- + id: 8 + uid: 24 + org_id: 25 + is_public: true diff --git a/models/fixtures/team.yml b/models/fixtures/team.yml index 2d0dd9cd56ca..b7265ec49e40 100644 --- a/models/fixtures/team.yml +++ b/models/fixtures/team.yml @@ -77,4 +77,13 @@ name: review_team authorize: 1 # read num_repos: 1 - num_members: 1 \ No newline at end of file + num_members: 1 + +- + id: 10 + org_id: 25 + lower_name: notowners + name: NotOwners + authorize: 1 # owner + num_repos: 0 + num_members: 1 diff --git a/models/fixtures/team_user.yml b/models/fixtures/team_user.yml index e20b5c9684bf..4fc609791d39 100644 --- a/models/fixtures/team_user.yml +++ b/models/fixtures/team_user.yml @@ -62,4 +62,10 @@ id: 11 org_id: 17 team_id: 9 - uid: 20 \ No newline at end of file + uid: 20 + +- + id: 12 + org_id: 25 + team_id: 10 + uid: 24 diff --git a/models/fixtures/two_factor.yml b/models/fixtures/two_factor.yml new file mode 100644 index 000000000000..d8cb85274b68 --- /dev/null +++ b/models/fixtures/two_factor.yml @@ -0,0 +1,9 @@ +- + id: 1 + uid: 24 + secret: KlDporn6Ile4vFcKI8z7Z6sqK1Scj2Qp0ovtUzCZO6jVbRW2lAoT7UDxDPtrab8d2B9zKOocBRdBJnS8orsrUNrsyETY+jJHb79M82uZRioKbRUz15sfOpmJmEzkFeSg6S4LicUBQos= + scratch_salt: Qb5bq2DyR2 + scratch_hash: 068eb9b8746e0bcfe332fac4457693df1bda55800eb0f6894d14ebb736ae6a24e0fc8fc5333c19f57f81599788f0b8e51ec1 + last_used_passcode: + created_unix: 1564253724 + updated_unix: 1564253724 diff --git a/models/fixtures/user.yml b/models/fixtures/user.yml index ed60e7f5eab0..d89dc3c12673 100644 --- a/models/fixtures/user.yml +++ b/models/fixtures/user.yml @@ -365,4 +365,39 @@ is_active: true num_members: 0 num_teams: 0 - visibility: 2 \ No newline at end of file + visibility: 2 + +- + id: 24 + lower_name: user24 + name: user24 + full_name: "user24" + email: user24@example.com + keep_email_private: true + passwd: 7d93daa0d1e6f2305cc8fa496847d61dc7320bb16262f9c55dd753480207234cdd96a93194e408341971742f4701772a025a # password + type: 0 # individual + salt: ZogKvWdyEx + is_admin: false + avatar: avatar24 + avatar_email: user24@example.com + num_repos: 0 + num_stars: 0 + num_followers: 0 + num_following: 0 + is_active: true + +- + id: 25 + lower_name: org25 + name: org25 + full_name: "org25" + email: org25@example.com + passwd: 7d93daa0d1e6f2305cc8fa496847d61dc7320bb16262f9c55dd753480207234cdd96a93194e408341971742f4701772a025a # password + type: 1 # organization + salt: ZogKvWdyEx + is_admin: false + avatar: avatar25 + avatar_email: org25@example.com + num_repos: 0 + num_members: 1 + num_teams: 1 diff --git a/models/org.go b/models/org.go index d86109de57e1..7032f6698eeb 100644 --- a/models/org.go +++ b/models/org.go @@ -72,9 +72,12 @@ func (org *User) GetMembers() error { } var ids = make([]int64, len(ous)) + var idsIsPublic = make(map[int64]bool, len(ous)) for i, ou := range ous { ids[i] = ou.UID + idsIsPublic[ou.UID] = ou.IsPublic } + org.MembersIsPublic = idsIsPublic org.Members, err = GetUsersByIDs(ids) return err } @@ -298,15 +301,13 @@ type OrgUser struct { } func isOrganizationOwner(e Engine, orgID, uid int64) (bool, error) { - ownerTeam := &Team{ - OrgID: orgID, - Name: ownerTeamName, - } - if has, err := e.Get(ownerTeam); err != nil { + ownerTeam, err := getOwnerTeam(e, orgID) + if err != nil { + if err == ErrTeamNotExist { + log.Error("Organization does not have owner team: %d", orgID) + return false, nil + } return false, err - } else if !has { - log.Error("Organization does not have owner team: %d", orgID) - return false, nil } return isTeamMember(e, orgID, ownerTeam.ID, uid) } diff --git a/models/org_team.go b/models/org_team.go index dcf07437403d..1786376d02c8 100644 --- a/models/org_team.go +++ b/models/org_team.go @@ -362,6 +362,11 @@ func GetTeam(orgID int64, name string) (*Team, error) { return getTeam(x, orgID, name) } +// getOwnerTeam returns team by given team name and organization. +func getOwnerTeam(e Engine, orgID int64) (*Team, error) { + return getTeam(e, orgID, ownerTeamName) +} + func getTeamByID(e Engine, teamID int64) (*Team, error) { t := new(Team) has, err := e.ID(teamID).Get(t) diff --git a/models/user.go b/models/user.go index 1f684a594045..ab29683a7bf1 100644 --- a/models/user.go +++ b/models/user.go @@ -139,11 +139,12 @@ type User struct { NumRepos int // For organization - NumTeams int - NumMembers int - Teams []*Team `xorm:"-"` - Members []*User `xorm:"-"` - Visibility structs.VisibleType `xorm:"NOT NULL DEFAULT 0"` + NumTeams int + NumMembers int + Teams []*Team `xorm:"-"` + Members UserList `xorm:"-"` + MembersIsPublic map[int64]bool `xorm:"-"` + Visibility structs.VisibleType `xorm:"NOT NULL DEFAULT 0"` // Preferences DiffViewStyle string `xorm:"NOT NULL DEFAULT ''"` diff --git a/models/user_test.go b/models/user_test.go index 10420a143f19..290253c4b1a0 100644 --- a/models/user_test.go +++ b/models/user_test.go @@ -5,6 +5,7 @@ package models import ( + "fmt" "math/rand" "strings" "testing" @@ -15,6 +16,58 @@ import ( "github.com/stretchr/testify/assert" ) +func TestUserIsPublicMember(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + tt := []struct { + uid int64 + orgid int64 + expected bool + }{ + {2, 3, true}, + {4, 3, false}, + {5, 6, true}, + {5, 7, false}, + } + for _, v := range tt { + t.Run(fmt.Sprintf("UserId%dIsPublicMemberOf%d", v.uid, v.orgid), func(t *testing.T) { + testUserIsPublicMember(t, v.uid, v.orgid, v.expected) + }) + } +} + +func testUserIsPublicMember(t *testing.T, uid int64, orgID int64, expected bool) { + user, err := GetUserByID(uid) + assert.NoError(t, err) + assert.Equal(t, expected, user.IsPublicMember(orgID)) +} + +func TestIsUserOrgOwner(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + tt := []struct { + uid int64 + orgid int64 + expected bool + }{ + {2, 3, true}, + {4, 3, false}, + {5, 6, true}, + {5, 7, true}, + } + for _, v := range tt { + t.Run(fmt.Sprintf("UserId%dIsOrgOwnerOf%d", v.uid, v.orgid), func(t *testing.T) { + testIsUserOrgOwner(t, v.uid, v.orgid, v.expected) + }) + } +} + +func testIsUserOrgOwner(t *testing.T, uid int64, orgID int64, expected bool) { + user, err := GetUserByID(uid) + assert.NoError(t, err) + assert.Equal(t, expected, user.IsUserOrgOwner(orgID)) +} + func TestGetUserEmailsByNames(t *testing.T) { assert.NoError(t, PrepareTestDatabase()) @@ -83,7 +136,7 @@ func TestSearchUsers(t *testing.T) { []int64{7, 17}) testOrgSuccess(&SearchUserOptions{OrderBy: "id ASC", Page: 3, PageSize: 2}, - []int64{19}) + []int64{19, 25}) testOrgSuccess(&SearchUserOptions{Page: 4, PageSize: 2}, []int64{}) @@ -95,13 +148,13 @@ func TestSearchUsers(t *testing.T) { } testUserSuccess(&SearchUserOptions{OrderBy: "id ASC", Page: 1}, - []int64{1, 2, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 20, 21}) + []int64{1, 2, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 20, 21, 24}) testUserSuccess(&SearchUserOptions{Page: 1, IsActive: util.OptionalBoolFalse}, []int64{9}) testUserSuccess(&SearchUserOptions{OrderBy: "id ASC", Page: 1, IsActive: util.OptionalBoolTrue}, - []int64{1, 2, 4, 5, 8, 10, 11, 12, 13, 14, 15, 16, 18, 20, 21}) + []int64{1, 2, 4, 5, 8, 10, 11, 12, 13, 14, 15, 16, 18, 20, 21, 24}) testUserSuccess(&SearchUserOptions{Keyword: "user1", OrderBy: "id ASC", Page: 1, IsActive: util.OptionalBoolTrue}, []int64{1, 10, 11, 12, 13, 14, 15, 16, 18}) diff --git a/models/userlist.go b/models/userlist.go new file mode 100644 index 000000000000..43838a680441 --- /dev/null +++ b/models/userlist.go @@ -0,0 +1,95 @@ +// Copyright 2019 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package models + +import ( + "fmt" + + "code.gitea.io/gitea/modules/log" +) + +//UserList is a list of user. +// This type provide valuable methods to retrieve information for a group of users efficiently. +type UserList []*User + +func (users UserList) getUserIDs() []int64 { + userIDs := make([]int64, len(users)) + for _, user := range users { + userIDs = append(userIDs, user.ID) //Considering that user id are unique in the list + } + return userIDs +} + +// IsUserOrgOwner returns true if user is in the owner team of given organization. +func (users UserList) IsUserOrgOwner(orgID int64) map[int64]bool { + results := make(map[int64]bool, len(users)) + for _, user := range users { + results[user.ID] = false //Set default to false + } + ownerMaps, err := users.loadOrganizationOwners(x, orgID) + if err == nil { + for _, owner := range ownerMaps { + results[owner.UID] = true + } + } + return results +} + +func (users UserList) loadOrganizationOwners(e Engine, orgID int64) (map[int64]*TeamUser, error) { + if len(users) == 0 { + return nil, nil + } + ownerTeam, err := getOwnerTeam(e, orgID) + if err != nil { + if err == ErrTeamNotExist { + log.Error("Organization does not have owner team: %d", orgID) + return nil, nil + } + return nil, err + } + + userIDs := users.getUserIDs() + ownerMaps := make(map[int64]*TeamUser) + err = e.In("uid", userIDs). + And("org_id=?", orgID). + And("team_id=?", ownerTeam.ID). + Find(&ownerMaps) + if err != nil { + return nil, fmt.Errorf("find team users: %v", err) + } + return ownerMaps, nil +} + +// GetTwoFaStatus return state of 2FA enrollement +func (users UserList) GetTwoFaStatus() map[int64]bool { + results := make(map[int64]bool, len(users)) + for _, user := range users { + results[user.ID] = false //Set default to false + } + tokenMaps, err := users.loadTwoFactorStatus(x) + if err == nil { + for _, token := range tokenMaps { + results[token.UID] = true + } + } + + return results +} + +func (users UserList) loadTwoFactorStatus(e Engine) (map[int64]*TwoFactor, error) { + if len(users) == 0 { + return nil, nil + } + + userIDs := users.getUserIDs() + tokenMaps := make(map[int64]*TwoFactor, len(userIDs)) + err := e. + In("uid", userIDs). + Find(&tokenMaps) + if err != nil { + return nil, fmt.Errorf("find two factor: %v", err) + } + return tokenMaps, nil +} diff --git a/models/userlist_test.go b/models/userlist_test.go new file mode 100644 index 000000000000..ca08cc90ce89 --- /dev/null +++ b/models/userlist_test.go @@ -0,0 +1,90 @@ +// Copyright 2019 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package models + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestUserListIsPublicMember(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + tt := []struct { + orgid int64 + expected map[int64]bool + }{ + {3, map[int64]bool{2: true, 4: false}}, + {6, map[int64]bool{5: true}}, + {7, map[int64]bool{5: false}}, + {25, map[int64]bool{24: true}}, + {22, map[int64]bool{}}, + } + for _, v := range tt { + t.Run(fmt.Sprintf("IsPublicMemberOfOrdIg%d", v.orgid), func(t *testing.T) { + testUserListIsPublicMember(t, v.orgid, v.expected) + }) + } +} +func testUserListIsPublicMember(t *testing.T, orgID int64, expected map[int64]bool) { + org, err := GetUserByID(orgID) + assert.NoError(t, err) + assert.NoError(t, org.GetMembers()) + assert.Equal(t, expected, org.MembersIsPublic) + +} + +func TestUserListIsUserOrgOwner(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + tt := []struct { + orgid int64 + expected map[int64]bool + }{ + {3, map[int64]bool{2: true, 4: false}}, + {6, map[int64]bool{5: true}}, + {7, map[int64]bool{5: true}}, + {25, map[int64]bool{24: false}}, // ErrTeamNotExist + {22, map[int64]bool{}}, // No member + } + for _, v := range tt { + t.Run(fmt.Sprintf("IsUserOrgOwnerOfOrdIg%d", v.orgid), func(t *testing.T) { + testUserListIsUserOrgOwner(t, v.orgid, v.expected) + }) + } +} + +func testUserListIsUserOrgOwner(t *testing.T, orgID int64, expected map[int64]bool) { + org, err := GetUserByID(orgID) + assert.NoError(t, err) + assert.NoError(t, org.GetMembers()) + assert.Equal(t, expected, org.Members.IsUserOrgOwner(orgID)) +} + +func TestUserListIsTwoFaEnrolled(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + tt := []struct { + orgid int64 + expected map[int64]bool + }{ + {3, map[int64]bool{2: false, 4: false}}, + {6, map[int64]bool{5: false}}, + {7, map[int64]bool{5: false}}, + {25, map[int64]bool{24: true}}, + {22, map[int64]bool{}}, + } + for _, v := range tt { + t.Run(fmt.Sprintf("IsTwoFaEnrolledOfOrdIg%d", v.orgid), func(t *testing.T) { + testUserListIsTwoFaEnrolled(t, v.orgid, v.expected) + }) + } +} + +func testUserListIsTwoFaEnrolled(t *testing.T, orgID int64, expected map[int64]bool) { + org, err := GetUserByID(orgID) + assert.NoError(t, err) + assert.NoError(t, org.GetMembers()) + assert.Equal(t, expected, org.Members.GetTwoFaStatus()) +} diff --git a/routers/org/members.go b/routers/org/members.go index d65bc2a00844..20f80cefcd1f 100644 --- a/routers/org/members.go +++ b/routers/org/members.go @@ -19,7 +19,7 @@ const ( tplMembers base.TplName = "org/member/members" ) -// Members render orgnization users page +// Members render organization users page func Members(ctx *context.Context) { org := ctx.Org.Organization ctx.Data["Title"] = org.FullName @@ -30,11 +30,14 @@ func Members(ctx *context.Context) { return } ctx.Data["Members"] = org.Members + ctx.Data["MembersIsPublicMember"] = org.MembersIsPublic + ctx.Data["MembersIsUserOrgOwner"] = org.Members.IsUserOrgOwner(org.ID) + ctx.Data["MembersTwoFaStatus"] = org.Members.GetTwoFaStatus() ctx.HTML(200, tplMembers) } -// MembersAction response for operation to a member of orgnization +// MembersAction response for operation to a member of organization func MembersAction(ctx *context.Context) { uid := com.StrTo(ctx.Query("uid")).MustInt64() if uid == 0 { diff --git a/templates/org/member/members.tmpl b/templates/org/member/members.tmpl index 7f0a763610e3..9db506ee5bf9 100644 --- a/templates/org/member/members.tmpl +++ b/templates/org/member/members.tmpl @@ -5,7 +5,7 @@ {{template "base/alert" .}}
- {{range .Members}} + {{ range .Members}}
@@ -14,12 +14,12 @@
{{.FullName}}
-
+
{{$.i18n.Tr "org.members.membership_visibility"}}
- {{ $isPublic := .IsPublicMember $.Org.ID}} + {{ $isPublic := index $.MembersIsPublicMember .ID}} {{if $isPublic}} {{$.i18n.Tr "org.members.public"}} {{if or (eq $.SignedUser.ID .ID) $.IsOrganizationOwner}}({{$.i18n.Tr "org.members.public_helper"}}){{end}} @@ -34,7 +34,15 @@ {{$.i18n.Tr "org.members.member_role"}}
- {{if .IsUserOrgOwner $.Org.ID}} {{$.i18n.Tr "org.members.owner"}}{{else}}{{$.i18n.Tr "org.members.member"}}{{end}} + {{if index $.MembersIsUserOrgOwner .ID}} {{$.i18n.Tr "org.members.owner"}}{{else}}{{$.i18n.Tr "org.members.member"}}{{end}} +
+
+
+
+ 2FA +
+
+
From 7d9a13035e0dd9f38bbb67f9b300d53c3579fb01 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 3 Aug 2019 15:07:51 +0800 Subject: [PATCH 03/12] display as error (#7724) --- routers/init.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routers/init.go b/routers/init.go index e431260687e8..26d750d20eb9 100644 --- a/routers/init.go +++ b/routers/init.go @@ -54,7 +54,7 @@ func initDBEngine() (err error) { } else if i == setting.DBConnectRetries-1 { return err } - log.Debug("ORM engine initialization attempt #%d/%d failed. Error: %v", i+1, setting.DBConnectRetries, err) + log.Error("ORM engine initialization attempt #%d/%d failed. Error: %v", i+1, setting.DBConnectRetries, err) log.Info("Backing off for %d seconds", int64(setting.DBConnectBackoff/time.Second)) time.Sleep(setting.DBConnectBackoff) } From 4fe490f062a4bdf943d9b58398ecbd5b1d2b1b7e Mon Sep 17 00:00:00 2001 From: guillep2k Date: Sat, 3 Aug 2019 14:42:09 -0300 Subject: [PATCH 04/12] Fixes indexed repos keeping outdated indexes when files grow too large (#7712) --- models/repo_indexer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/repo_indexer.go b/models/repo_indexer.go index 3a41e0525ac3..c991b1aac970 100644 --- a/models/repo_indexer.go +++ b/models/repo_indexer.go @@ -199,7 +199,7 @@ func addUpdate(update fileUpdate, repo *Repository, batch rupture.FlushingBatch) if size, err := strconv.Atoi(strings.TrimSpace(stdout)); err != nil { return fmt.Errorf("Misformatted git cat-file output: %v", err) } else if int64(size) > setting.Indexer.MaxIndexerFileSize { - return nil + return addDelete(update.Filename, repo, batch) } fileContents, err := git.NewCommand("cat-file", "blob", update.BlobSha). From 6c0c5c531065dad3c59889e45676b0b0374f39aa Mon Sep 17 00:00:00 2001 From: Lauris BH Date: Sat, 3 Aug 2019 21:38:42 +0300 Subject: [PATCH 05/12] Fix milestone completness calculation when migrating (#7725) --- models/migrate.go | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/models/migrate.go b/models/migrate.go index b30e6a9d1c4f..85be3a312c1f 100644 --- a/models/migrate.go +++ b/models/migrate.go @@ -62,38 +62,50 @@ func insertIssue(sess *xorm.Session, issue *Issue) error { if _, err := sess.Insert(issueLabels); err != nil { return err } + + cols := make([]string, 0) if !issue.IsPull { sess.ID(issue.RepoID).Incr("num_issues") + cols = append(cols, "num_issues") if issue.IsClosed { sess.Incr("num_closed_issues") + cols = append(cols, "num_closed_issues") } } else { sess.ID(issue.RepoID).Incr("num_pulls") + cols = append(cols, "num_pulls") if issue.IsClosed { sess.Incr("num_closed_pulls") + cols = append(cols, "num_closed_pulls") } } - if _, err := sess.NoAutoTime().Update(issue.Repo); err != nil { + if _, err := sess.NoAutoTime().Cols(cols...).Update(issue.Repo); err != nil { return err } + cols = []string{"num_issues"} sess.Incr("num_issues") if issue.IsClosed { sess.Incr("num_closed_issues") + cols = append(cols, "num_closed_issues") } - if _, err := sess.In("id", labelIDs).NoAutoTime().Update(new(Label)); err != nil { + if _, err := sess.In("id", labelIDs).NoAutoTime().Cols(cols...).Update(new(Label)); err != nil { return err } if issue.MilestoneID > 0 { + cols = []string{"num_issues"} sess.Incr("num_issues") + cl := "num_closed_issues" if issue.IsClosed { sess.Incr("num_closed_issues") + cols = append(cols, "num_closed_issues") + cl = "(num_closed_issues + 1)" } if _, err := sess.ID(issue.MilestoneID). - SetExpr("completeness", "num_closed_issues * 100 / num_issues"). - NoAutoTime(). + SetExpr("completeness", cl+" * 100 / (num_issues + 1)"). + NoAutoTime().Cols(cols...). Update(new(Milestone)); err != nil { return err } From 09463d17e4370f1826a4573e0e741daff2a7b80e Mon Sep 17 00:00:00 2001 From: guillep2k Date: Sun, 4 Aug 2019 03:53:17 -0300 Subject: [PATCH 06/12] Fix repo_index_status lingering when deleting a repository (#7734) --- models/repo.go | 1 + 1 file changed, 1 insertion(+) diff --git a/models/repo.go b/models/repo.go index fe296c1a11a6..20175397af6a 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1800,6 +1800,7 @@ func DeleteRepository(doer *User, uid, repoID int64) error { &HookTask{RepoID: repoID}, &Notification{RepoID: repoID}, &CommitStatus{RepoID: repoID}, + &RepoIndexerStatus{RepoID: repoID}, ); err != nil { return fmt.Errorf("deleteBeans: %v", err) } From 0e887af2d16740798a1ced5f6af0b58bd070c40b Mon Sep 17 00:00:00 2001 From: FlorianBen Date: Sun, 4 Aug 2019 10:11:27 +0200 Subject: [PATCH 07/12] Fix specific highlighting (CMakeLists.txt ...) (#7686) * Fix specific highlighting. * Highlighting CMakeLists.txt: remove case sensitive checks. use lowercase checks instead. --- modules/highlight/highlight.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/modules/highlight/highlight.go b/modules/highlight/highlight.go index cb52f6ac2ea9..4334480566f7 100644 --- a/modules/highlight/highlight.go +++ b/modules/highlight/highlight.go @@ -19,9 +19,11 @@ var ( } // File names that are representing highlight classes. - highlightFileNames = map[string]bool{ - "dockerfile": true, - "makefile": true, + highlightFileNames = map[string]string{ + "dockerfile": "dockerfile", + "makefile": "makefile", + "gnumakefile": "makefile", + "cmakelists.txt": "cmake", } // Extensions that are same as highlight classes. @@ -87,8 +89,8 @@ func FileNameToHighlightClass(fname string) string { return "nohighlight" } - if highlightFileNames[fname] { - return fname + if name, ok := highlightFileNames[fname]; ok { + return name } ext := path.Ext(fname) From a1f5789a29a7a854125fe50a024282470e658cf7 Mon Sep 17 00:00:00 2001 From: silverwind Date: Sun, 4 Aug 2019 14:55:20 +0200 Subject: [PATCH 08/12] Tweak label border CSS (#7739) Also did various tweaks to label hover and dark theme. Fixes: https://github.com/go-gitea/gitea/pull/5487 --- public/css/index.css | 7 ++++--- public/css/theme-arc-green.css | 4 +++- public/less/_repository.less | 24 +++++++++++++----------- public/less/themes/arc-green.less | 15 +++++++++++++-- 4 files changed, 33 insertions(+), 17 deletions(-) diff --git a/public/css/index.css b/public/css/index.css index b2676282bc48..b38d814ea595 100644 --- a/public/css/index.css +++ b/public/css/index.css @@ -633,10 +633,11 @@ footer .ui.left,footer .ui.right{line-height:40px} .repository #commits-table thead .shatd{text-align:center} .repository #commits-table td.sha .sha.label{margin:0} .repository #commits-table.ui.basic.striped.table tbody tr:nth-child(2n){background-color:rgba(0,0,0,.02)!important} -.repository #commits-table td.sha .sha.label.isSigned,.repository #repo-files-table .sha.label.isSigned{border:1px solid #bbb} -.repository #commits-table td.sha .sha.label.isSigned .detail.icon,.repository #repo-files-table .sha.label.isSigned .detail.icon{background:#fafafa;margin:-6px -10px -4px 0;padding:5px 3px 5px 6px;border-left:1px solid #bbb;border-top-left-radius:0;border-bottom-left-radius:0} +.repository #commits-table td.sha .sha.label,.repository #repo-files-table .sha.label{border:1px solid #bbb} +.repository #commits-table td.sha .sha.label .detail.icon,.repository #repo-files-table .sha.label .detail.icon{background:#fafafa;margin:-6px -10px -4px 0;padding:5px 3px 5px 6px;border-left:1px solid #bbb;border-top-left-radius:0;border-bottom-left-radius:0} .repository #commits-table td.sha .sha.label.isSigned.isVerified,.repository #repo-files-table .sha.label.isSigned.isVerified{border:1px solid #21ba45;background:rgba(33,186,69,.1)} -.repository #commits-table td.sha .sha.label.isSigned.isVerified .detail.icon,.repository #repo-files-table .sha.label.isSigned.isVerified .detail.icon{border-left:1px solid rgba(33,186,69,.5)} +.repository #commits-table td.sha .sha.label.isSigned.isVerified .detail.icon,.repository #repo-files-table .sha.label.isSigned.isVerified .detail.icon{border-left:1px solid #21ba45} +.repository #commits-table td.sha .sha.label.isSigned.isVerified:hover,.repository #repo-files-table .sha.label.isSigned.isVerified:hover{background:rgba(33,186,69,.3)!important} .repository .diff-detail-box{padding:7px 0;background:#fff;line-height:30px} .repository .diff-detail-box>div:after{clear:both;content:"";display:block} .repository .diff-detail-box ol{clear:both;padding-left:0;margin-top:5px;margin-bottom:28px} diff --git a/public/css/theme-arc-green.css b/public/css/theme-arc-green.css index f8722ffa5dbc..605c9b047ab0 100644 --- a/public/css/theme-arc-green.css +++ b/public/css/theme-arc-green.css @@ -211,7 +211,9 @@ input{background:#2e323e} .ui.basic.blue.button:hover,.ui.basic.blue.buttons .button:hover{box-shadow:0 0 0 1px #87ab63 inset!important;color:#87ab63!important} .ui.basic.blue.button:focus,.ui.basic.blue.buttons .button:focus{box-shadow:0 0 0 1px #87ab63 inset!important;color:#87ab63!important} .repository.file.list #file-content .code-view .lines-code .hljs,.repository.file.list #file-content .code-view .lines-code ol,.repository.file.list #file-content .code-view .lines-code pre,.repository.file.list #file-content .code-view .lines-num .hljs,.repository.file.list #file-content .code-view .lines-num ol,.repository.file.list #file-content .code-view .lines-num pre{background-color:#2a2e3a} -a.ui.label:hover,a.ui.labels .label:hover{background-color:#505667;color:#dbdbdb} +a.ui.label:hover,a.ui.labels .label:hover{background-color:#505667!important;color:#dbdbdb!important} +.repository #commits-table td.sha .sha.label,.repository #repo-files-table .sha.label{border-color:#888} +.repository #commits-table td.sha .sha.label.isSigned .detail.icon,.repository #repo-files-table .sha.label.isSigned .detail.icon{background:0 0;border-left-color:#888} .repository .label.list .item{border-bottom:1px dashed #4c505c} .ui.basic.blue.button,.ui.basic.blue.buttons .button{box-shadow:0 0 0 1px #87ab63 inset!important;color:#87ab63!important} .repository.file.list #file-content .code-view .hljs,.repository.file.list #file-content .code-view .lines-code ol,.repository.file.list #file-content .code-view .lines-code pre,.repository.file.list #file-content .code-view .lines-num .hljs,.repository.file.list #file-content .code-view .lines-num ol,.repository.file.list #file-content .code-view .lines-num pre{background-color:#2a2e3a} diff --git a/public/less/_repository.less b/public/less/_repository.less index 8d2ca07d9316..093f35f83107 100644 --- a/public/less/_repository.less +++ b/public/less/_repository.less @@ -1272,17 +1272,15 @@ #commits-table td.sha .sha.label, #repo-files-table .sha.label { - &.isSigned { - border: 1px solid #bbbbbb; + border: 1px solid #bbbbbb; - .detail.icon { - background: #fafafa; - margin: -6px -10px -4px 0; - padding: 5px 3px 5px 6px; - border-left: 1px solid #bbbbbb; - border-top-left-radius: 0; - border-bottom-left-radius: 0; - } + .detail.icon { + background: #fafafa; + margin: -6px -10px -4px 0; + padding: 5px 3px 5px 6px; + border-left: 1px solid #bbbbbb; + border-top-left-radius: 0; + border-bottom-left-radius: 0; } &.isSigned.isVerified { @@ -1290,7 +1288,11 @@ background: fade(#21ba45, 10%); .detail.icon { - border-left: 1px solid fade(#21ba45, 50%); + border-left: 1px solid #21ba45; + } + + &:hover { + background: fade(#21ba45, 30%) !important; } } } diff --git a/public/less/themes/arc-green.less b/public/less/themes/arc-green.less index 12d7eb2db1c0..37911c186c79 100644 --- a/public/less/themes/arc-green.less +++ b/public/less/themes/arc-green.less @@ -1091,8 +1091,19 @@ input { a.ui.label:hover, a.ui.labels .label:hover { - background-color: #505667; - color: #dbdbdb; + background-color: #505667 !important; + color: #dbdbdb !important; +} + +.repository #commits-table td.sha .sha.label, +.repository #repo-files-table .sha.label { + border-color: #888; +} + +.repository #commits-table td.sha .sha.label.isSigned .detail.icon, +.repository #repo-files-table .sha.label.isSigned .detail.icon { + background: none; + border-left-color: #888; } .repository .label.list .item { From 7b2a39c78bbda57cd76c5c01af4904bf6a709a7d Mon Sep 17 00:00:00 2001 From: jaqra <48099350+jaqra@users.noreply.github.com> Date: Sun, 4 Aug 2019 17:49:29 +0300 Subject: [PATCH 09/12] Apply emoji on commit graph page (#7743) --- templates/repo/graph.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/repo/graph.tmpl b/templates/repo/graph.tmpl index e8da069a9d7e..14fbfac6d70d 100644 --- a/templates/repo/graph.tmpl +++ b/templates/repo/graph.tmpl @@ -26,7 +26,7 @@ {{ .ShortRev}} {{.Branch}} - {{RenderCommitMessage .Subject $.RepoLink $.Repository.ComposeMetas}} by + {{RenderCommitMessage .Subject $.RepoLink $.Repository.ComposeMetas}} by {{.Author}} From 5b902e2368fdb67eda4ba033f7167fadf72e4350 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 5 Aug 2019 02:33:36 +0800 Subject: [PATCH 10/12] add pagination for admin api get orgs and fix only list public orgs bug (#7742) --- models/user.go | 4 +--- routers/api/v1/admin/org.go | 13 ++++++++++++- templates/swagger/v1_json.tmpl | 14 ++++++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/models/user.go b/models/user.go index ab29683a7bf1..2e4f971662ad 100644 --- a/models/user.go +++ b/models/user.go @@ -1409,9 +1409,7 @@ type SearchUserOptions struct { } func (opts *SearchUserOptions) toConds() builder.Cond { - - var cond = builder.NewCond() - cond = cond.And(builder.Eq{"type": opts.Type}) + var cond builder.Cond = builder.Eq{"type": opts.Type} if len(opts.Keyword) > 0 { lowerKeyword := strings.ToLower(opts.Keyword) diff --git a/routers/api/v1/admin/org.go b/routers/api/v1/admin/org.go index d740647cd4f2..c90e739626a0 100644 --- a/routers/api/v1/admin/org.go +++ b/routers/api/v1/admin/org.go @@ -82,6 +82,15 @@ func GetAllOrgs(ctx *context.APIContext) { // summary: List all organizations // produces: // - application/json + // parameters: + // - name: page + // in: query + // description: page number of results to return (1-based) + // type: integer + // - name: limit + // in: query + // description: page size of results, maximum page size is 50 + // type: integer // responses: // "200": // "$ref": "#/responses/OrganizationList" @@ -90,7 +99,9 @@ func GetAllOrgs(ctx *context.APIContext) { users, _, err := models.SearchUsers(&models.SearchUserOptions{ Type: models.UserTypeOrganization, OrderBy: models.SearchOrderByAlphabetically, - PageSize: -1, + Page: ctx.QueryInt("page"), + PageSize: convert.ToCorrectPageSize(ctx.QueryInt("limit")), + Private: true, }) if err != nil { ctx.Error(500, "SearchOrganizations", err) diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 43eca15871e2..4ae7f5a49ebf 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -33,6 +33,20 @@ ], "summary": "List all organizations", "operationId": "adminGetAllOrgs", + "parameters": [ + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results, maximum page size is 50", + "name": "limit", + "in": "query" + } + ], "responses": { "200": { "$ref": "#/responses/OrganizationList" From cd238bc41598e69a78b4d17370c8929911c5f249 Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Sun, 4 Aug 2019 23:58:16 +0200 Subject: [PATCH 11/12] build: use GOPROXY and disable download on some steps (#7745) * build: use GOPROXY * disable download vendor on some steps --- .drone.yml | 23 +++++++++++++++++++++++ Dockerfile | 3 +++ 2 files changed, 26 insertions(+) diff --git a/.drone.yml b/.drone.yml index dedf4d741090..44e4b225a269 100644 --- a/.drone.yml +++ b/.drone.yml @@ -66,6 +66,7 @@ steps: image: golang:1.11 # this step is kept as the lowest version of golang that we support environment: GO111MODULE: on + GOPROXY: off commands: - go build -mod=vendor -o gitea_no_gcc # test if build succeeds without the sqlite tag @@ -74,6 +75,7 @@ steps: image: golang:1.12 environment: GO111MODULE: on + GOPROXY: off GOOS: linux GOARCH: 386 commands: @@ -92,6 +94,7 @@ steps: - make test-vendor - make build environment: + GOPROXY: https://goproxy.cn # proxy.golang.org is blocked in China, this proxy is not TAGS: bindata sqlite sqlite_unlock_notify - name: unit-test @@ -100,6 +103,7 @@ steps: commands: - make unit-test-coverage environment: + GOPROXY: off TAGS: bindata sqlite sqlite_unlock_notify depends_on: - build @@ -116,6 +120,7 @@ steps: commands: - make test environment: + GOPROXY: off TAGS: bindata sqlite sqlite_unlock_notify depends_on: - build @@ -143,6 +148,7 @@ steps: commands: - make test environment: + GOPROXY: off TAGS: bindata depends_on: - tag-pre-condition @@ -159,6 +165,7 @@ steps: - timeout -s ABRT 20m make test-sqlite-migration - timeout -s ABRT 20m make test-sqlite environment: + GOPROXY: off TAGS: bindata depends_on: - build @@ -172,6 +179,7 @@ steps: - make test-mysql-migration - make integration-test-coverage environment: + GOPROXY: off TAGS: bindata TEST_LDAP: 1 depends_on: @@ -192,6 +200,7 @@ steps: - timeout -s ABRT 20m make test-mysql-migration - timeout -s ABRT 20m make test-mysql environment: + GOPROXY: off TAGS: bindata TEST_LDAP: 1 depends_on: @@ -209,6 +218,7 @@ steps: - timeout -s ABRT 20m make test-mysql8-migration - timeout -s ABRT 20m make test-mysql8 environment: + GOPROXY: off TAGS: bindata TEST_LDAP: 1 depends_on: @@ -223,6 +233,7 @@ steps: - timeout -s ABRT 20m make test-pgsql-migration - timeout -s ABRT 20m make test-pgsql environment: + GOPROXY: off TAGS: bindata TEST_LDAP: 1 depends_on: @@ -237,6 +248,7 @@ steps: - make test-mssql-migration - make test-mssql environment: + GOPROXY: off TAGS: bindata TEST_LDAP: 1 depends_on: @@ -248,6 +260,7 @@ steps: commands: - make coverage environment: + GOPROXY: off TAGS: bindata depends_on: - unit-test @@ -380,6 +393,7 @@ steps: - make generate - make release environment: + GOPROXY: off TAGS: bindata sqlite sqlite_unlock_notify - name: gpg-sign @@ -481,6 +495,7 @@ steps: - make generate - make release environment: + GOPROXY: off TAGS: bindata sqlite sqlite_unlock_notify - name: gpg-sign @@ -607,6 +622,8 @@ steps: dry_run: true repo: gitea/gitea tags: linux-amd64 + build_args: + - GOPROXY=off when: event: - pull_request @@ -618,6 +635,8 @@ steps: auto_tag: true auto_tag_suffix: linux-amd64 repo: gitea/gitea + build_args: + - GOPROXY=off password: from_secret: docker_password username: @@ -668,6 +687,8 @@ steps: dry_run: true repo: gitea/gitea tags: linux-arm64 + build_args: + - GOPROXY=off when: event: - pull_request @@ -679,6 +700,8 @@ steps: auto_tag: true auto_tag_suffix: linux-arm64 repo: gitea/gitea + build_args: + - GOPROXY=off password: from_secret: docker_password username: diff --git a/Dockerfile b/Dockerfile index f13fdbe55fed..6fa367a3ee15 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,6 +3,9 @@ #Build stage FROM golang:1.12-alpine3.10 AS build-env +ARG GOPROXY +ENV GOPROXY ${GOPROXY:-direct} + ARG GITEA_VERSION ARG TAGS="sqlite sqlite_unlock_notify" ENV TAGS "bindata $TAGS" From 52feff5a5c76421fe90c8e6a62ec86eaaa4634f2 Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Mon, 5 Aug 2019 09:52:41 +0200 Subject: [PATCH 12/12] deps: Upgrade gopkg.in/editorconfig/editorconfig-core-go.v1 (#7749) * deps: Upgrade gopkg.in/editorconfig/editorconfig-core-go.v1 from 1.2.0 to 1.3.0 * deps: vendor updates --- go.mod | 2 +- go.sum | 4 +- .../editorconfig-core-go.v1/.editorconfig | 2 +- .../editorconfig-core-go.v1/.gitignore | 3 + .../editorconfig-core-go.v1/.gitmodules | 3 + .../editorconfig-core-go.v1/.travis.yml | 14 +++++ .../editorconfig-core-go.v1/Makefile | 25 ++++++++ .../editorconfig-core-go.v1/README.md | 3 +- .../editorconfig-core-go.v1/editorconfig.go | 57 +++++++++++-------- vendor/modules.txt | 2 +- 10 files changed, 86 insertions(+), 29 deletions(-) create mode 100644 vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/.gitmodules create mode 100644 vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/.travis.yml create mode 100644 vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/Makefile diff --git a/go.mod b/go.mod index 9bf380007708..804573e0d7bf 100644 --- a/go.mod +++ b/go.mod @@ -115,7 +115,7 @@ require ( gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/asn1-ber.v1 v1.0.0-20150924051756-4e86f4367175 // indirect gopkg.in/bufio.v1 v1.0.0-20140618132640-567b2bfa514e // indirect - gopkg.in/editorconfig/editorconfig-core-go.v1 v1.2.0 + gopkg.in/editorconfig/editorconfig-core-go.v1 v1.3.0 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df gopkg.in/ini.v1 v1.42.0 gopkg.in/ldap.v3 v3.0.2 diff --git a/go.sum b/go.sum index a3adcc180349..89a2362e9657 100644 --- a/go.sum +++ b/go.sum @@ -451,8 +451,8 @@ gopkg.in/bufio.v1 v1.0.0-20140618132640-567b2bfa514e/go.mod h1:xsQCaysVCudhrYTfz gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/editorconfig/editorconfig-core-go.v1 v1.2.0 h1:CO465/foR4+bY1xNYjZEl6l8By1g/iMsImoruxfEt84= -gopkg.in/editorconfig/editorconfig-core-go.v1 v1.2.0/go.mod h1:s2mQFI9McjArkyCwyEwU//+luQENTnD/Lfb/7Sj3/kQ= +gopkg.in/editorconfig/editorconfig-core-go.v1 v1.3.0 h1:oxOEwvhxLMpWpN+0pb2r9TWrM0DCFBHxbuIlS27tmFg= +gopkg.in/editorconfig/editorconfig-core-go.v1 v1.3.0/go.mod h1:s2mQFI9McjArkyCwyEwU//+luQENTnD/Lfb/7Sj3/kQ= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE= diff --git a/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/.editorconfig b/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/.editorconfig index c3bc90e1d01c..715e21f1de6d 100644 --- a/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/.editorconfig +++ b/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/.editorconfig @@ -10,4 +10,4 @@ trim_trailing_whitespace = true [*.go] indent_style = tab -indent_size = 4 +indent_size = 8 diff --git a/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/.gitignore b/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/.gitignore index d3beee5771a8..f5dcd260833a 100644 --- a/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/.gitignore +++ b/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/.gitignore @@ -24,3 +24,6 @@ _testmain.go *.test *.prof +# EditorConfig + +/editorconfig diff --git a/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/.gitmodules b/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/.gitmodules new file mode 100644 index 000000000000..9e75e1ca0b25 --- /dev/null +++ b/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/.gitmodules @@ -0,0 +1,3 @@ +[submodule "core-test"] + path = core-test + url = https://github.com/editorconfig/editorconfig-core-test.git diff --git a/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/.travis.yml b/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/.travis.yml new file mode 100644 index 000000000000..a3183d6a781e --- /dev/null +++ b/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/.travis.yml @@ -0,0 +1,14 @@ +--- +language: go +sudo: false +go: + - '1.8' + - '1.9' + - '1.10' +go_import_path: gopkg.in/editorconfig/editorconfig-core-go.v1 + +install: + - make installdeps + +script: + - make test diff --git a/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/Makefile b/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/Makefile new file mode 100644 index 000000000000..5151ed818d92 --- /dev/null +++ b/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/Makefile @@ -0,0 +1,25 @@ +PROJECT_ROOT_DIR := $(CURDIR) +SRC := editorconfig.go cmd/editorconfig/main.go + +.PHONY: bin test test-go test-core submodule installdeps + +test: test-go test-core + +submodule: + git submodule update --init + +installdeps: + go get -t ./... + +editorconfig: $(SRC) + go build ./cmd/editorconfig + +test-go: + go test -v + +test-core: editorconfig + cd $(PROJECT_ROOT_DIR)/core-test && \ + cmake -DEDITORCONFIG_CMD="$(PROJECT_ROOT_DIR)/editorconfig" . +# Temporarily disable core-test + # cd $(PROJECT_ROOT_DIR)/core-test && \ + # ctest --output-on-failure . diff --git a/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/README.md b/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/README.md index 4a57ec133d8c..e060f1061f39 100644 --- a/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/README.md +++ b/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/README.md @@ -1,3 +1,4 @@ +[![Build Status](https://travis-ci.org/editorconfig/editorconfig-core-go.svg?branch=master)](https://travis-ci.org/editorconfig/editorconfig-core-go) [![GoDoc](https://godoc.org/gopkg.in/editorconfig/editorconfig-core-go.v1?status.svg)](https://godoc.org/gopkg.in/editorconfig/editorconfig-core-go.v1) [![Go Report Card](https://goreportcard.com/badge/gopkg.in/editorconfig/editorconfig-core-go.v1)](https://goreportcard.com/report/gopkg.in/editorconfig/editorconfig-core-go.v1) @@ -15,7 +16,7 @@ We recommend the use of [gopkg.in][gopkg] for this package: go get -u gopkg.in/editorconfig/editorconfig-core-go.v1 ``` -Import by the same path. Tha package name you will use to access it is +Import by the same path. The package name you will use to access it is `editorconfig`. ```go diff --git a/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/editorconfig.go b/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/editorconfig.go index 6291af5759d5..d9d629f143bd 100644 --- a/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/editorconfig.go +++ b/vendor/gopkg.in/editorconfig/editorconfig-core-go.v1/editorconfig.go @@ -14,6 +14,10 @@ import ( "gopkg.in/ini.v1" ) +const ( + ConfigNameDefault = ".editorconfig" +) + // IndentStyle possible values const ( IndentStyleTab = "tab" @@ -49,6 +53,8 @@ type Definition struct { EndOfLine string `ini:"end_of_line" json:"end_of_line,omitempty"` TrimTrailingWhitespace bool `ini:"trim_trailing_whitespace" json:"trim_trailing_whitespace,omitempty"` InsertFinalNewline bool `ini:"insert_final_newline" json:"insert_final_newline,omitempty"` + + Raw map[string]string `ini:"-" json:"-"` } // Editorconfig represents a .editorconfig file. @@ -75,6 +81,7 @@ func ParseBytes(data []byte) (*Editorconfig, error) { var ( iniSection = iniFile.Section(sectionStr) definition = &Definition{} + raw = make(map[string]string) ) err := iniSection.MapTo(&definition) if err != nil { @@ -89,7 +96,13 @@ func ParseBytes(data []byte) (*Editorconfig, error) { } } + // Shallow copy all properties + for k, v := range iniSection.KeysHash() { + raw[k] = v + } + definition.Selector = sectionStr + definition.Raw = raw editorConfig.Definitions = append(editorConfig.Definitions, definition) } return editorConfig, nil @@ -171,6 +184,19 @@ func (d *Definition) merge(md *Definition) { if !d.InsertFinalNewline { d.InsertFinalNewline = md.InsertFinalNewline } + + for k, v := range md.Raw { + if _, ok := d.Raw[k]; !ok { + d.Raw[k] = v + } + } +} + +func (d *Definition) InsertToIniFile(iniFile *ini.File) { + iniSec := iniFile.Section(d.Selector) + for k, v := range d.Raw { + iniSec.Key(k).SetValue(v) + } } // GetDefinitionForFilename returns a definition for the given filename. @@ -178,6 +204,7 @@ func (d *Definition) merge(md *Definition) { // The last section has preference over the priors. func (e *Editorconfig) GetDefinitionForFilename(name string) *Definition { def := &Definition{} + def.Raw = make(map[string]string) for i := len(e.Definitions) - 1; i >= 0; i-- { actualDef := e.Definitions[i] if filenameMatches(actualDef.Selector, name) { @@ -206,28 +233,7 @@ func (e *Editorconfig) Serialize() ([]byte, error) { iniFile.Section(ini.DEFAULT_SECTION).Key("root").SetValue(boolToString(e.Root)) } for _, d := range e.Definitions { - iniSec := iniFile.Section(d.Selector) - if len(d.Charset) > 0 { - iniSec.Key("charset").SetValue(d.Charset) - } - if len(d.IndentStyle) > 0 { - iniSec.Key("indent_style").SetValue(d.IndentStyle) - } - if len(d.IndentSize) > 0 { - iniSec.Key("indent_size").SetValue(d.IndentSize) - } - if d.TabWidth > 0 && strconv.Itoa(d.TabWidth) != d.IndentSize { - iniSec.Key("tab_width").SetValue(strconv.Itoa(d.TabWidth)) - } - if len(d.EndOfLine) > 0 { - iniSec.Key("end_of_line").SetValue(d.EndOfLine) - } - if d.TrimTrailingWhitespace { - iniSec.Key("trim_trailing_whitespace").SetValue(boolToString(d.TrimTrailingWhitespace)) - } - if d.InsertFinalNewline { - iniSec.Key("insert_final_newline").SetValue(boolToString(d.InsertFinalNewline)) - } + d.InsertToIniFile(iniFile) } _, err := iniFile.WriteTo(buffer) if err != nil { @@ -251,16 +257,21 @@ func (e *Editorconfig) Save(filename string) error { // folder with `root = true`, and returns the right editorconfig // definition for the given file. func GetDefinitionForFilename(filename string) (*Definition, error) { + return GetDefinitionForFilenameWithConfigname(filename, ConfigNameDefault) +} + +func GetDefinitionForFilenameWithConfigname(filename string, configname string) (*Definition, error) { abs, err := filepath.Abs(filename) if err != nil { return nil, err } definition := &Definition{} + definition.Raw = make(map[string]string) dir := abs for dir != filepath.Dir(dir) { dir = filepath.Dir(dir) - ecFile := filepath.Join(dir, ".editorconfig") + ecFile := filepath.Join(dir, configname) if _, err := os.Stat(ecFile); os.IsNotExist(err) { continue } diff --git a/vendor/modules.txt b/vendor/modules.txt index 3f74ea6721d8..187d128d7f13 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -414,7 +414,7 @@ gopkg.in/alexcesaro/quotedprintable.v3 gopkg.in/asn1-ber.v1 # gopkg.in/bufio.v1 v1.0.0-20140618132640-567b2bfa514e gopkg.in/bufio.v1 -# gopkg.in/editorconfig/editorconfig-core-go.v1 v1.2.0 +# gopkg.in/editorconfig/editorconfig-core-go.v1 v1.3.0 gopkg.in/editorconfig/editorconfig-core-go.v1 # gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df gopkg.in/gomail.v2