Skip to content

Commit c296126

Browse files
Merge branch 'master' into branch-protection-anyone
# Conflicts: # public/js/index.js # public/js/index.js.map
2 parents 8afcf90 + f5bd088 commit c296126

40 files changed

+664
-309
lines changed

cmd/web.go

Lines changed: 7 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@ package cmd
66

77
import (
88
"fmt"
9-
"net"
109
"net/http"
11-
"net/http/fcgi"
1210
_ "net/http/pprof" // Used for debugging if enabled and a web server is running
1311
"os"
1412
"strings"
@@ -60,7 +58,7 @@ func runHTTPRedirector() {
6058
http.Redirect(w, r, target, http.StatusTemporaryRedirect)
6159
})
6260

63-
var err = runHTTP(source, context2.ClearHandler(handler))
61+
var err = runHTTP("tcp", source, context2.ClearHandler(handler))
6462

6563
if err != nil {
6664
log.Fatal("Failed to start port redirection: %v", err)
@@ -77,12 +75,12 @@ func runLetsEncrypt(listenAddr, domain, directory, email string, m http.Handler)
7775
go func() {
7876
log.Info("Running Let's Encrypt handler on %s", setting.HTTPAddr+":"+setting.PortToRedirect)
7977
// all traffic coming into HTTP will be redirect to HTTPS automatically (LE HTTP-01 validation happens here)
80-
var err = runHTTP(setting.HTTPAddr+":"+setting.PortToRedirect, certManager.HTTPHandler(http.HandlerFunc(runLetsEncryptFallbackHandler)))
78+
var err = runHTTP("tcp", setting.HTTPAddr+":"+setting.PortToRedirect, certManager.HTTPHandler(http.HandlerFunc(runLetsEncryptFallbackHandler)))
8179
if err != nil {
8280
log.Fatal("Failed to start the Let's Encrypt handler on port %s: %v", setting.PortToRedirect, err)
8381
}
8482
}()
85-
return runHTTPSWithTLSConfig(listenAddr, certManager.TLSConfig(), context2.ClearHandler(m))
83+
return runHTTPSWithTLSConfig("tcp", listenAddr, certManager.TLSConfig(), context2.ClearHandler(m))
8684
}
8785

8886
func runLetsEncryptFallbackHandler(w http.ResponseWriter, r *http.Request) {
@@ -171,7 +169,7 @@ func runWeb(ctx *cli.Context) error {
171169
switch setting.Protocol {
172170
case setting.HTTP:
173171
NoHTTPRedirector()
174-
err = runHTTP(listenAddr, context2.ClearHandler(m))
172+
err = runHTTP("tcp", listenAddr, context2.ClearHandler(m))
175173
case setting.HTTPS:
176174
if setting.EnableLetsEncrypt {
177175
err = runLetsEncrypt(listenAddr, setting.Domain, setting.LetsEncryptDirectory, setting.LetsEncryptEmail, context2.ClearHandler(m))
@@ -182,43 +180,13 @@ func runWeb(ctx *cli.Context) error {
182180
} else {
183181
NoHTTPRedirector()
184182
}
185-
err = runHTTPS(listenAddr, setting.CertFile, setting.KeyFile, context2.ClearHandler(m))
183+
err = runHTTPS("tcp", listenAddr, setting.CertFile, setting.KeyFile, context2.ClearHandler(m))
186184
case setting.FCGI:
187185
NoHTTPRedirector()
188-
// FCGI listeners are provided as stdin - this is orthogonal to the LISTEN_FDS approach
189-
// in graceful and systemD
190-
NoMainListener()
191-
var listener net.Listener
192-
listener, err = net.Listen("tcp", listenAddr)
193-
if err != nil {
194-
log.Fatal("Failed to bind %s: %v", listenAddr, err)
195-
}
196-
defer func() {
197-
if err := listener.Close(); err != nil {
198-
log.Fatal("Failed to stop server: %v", err)
199-
}
200-
}()
201-
err = fcgi.Serve(listener, context2.ClearHandler(m))
186+
err = runFCGI(listenAddr, context2.ClearHandler(m))
202187
case setting.UnixSocket:
203-
// This could potentially be inherited using LISTEN_FDS but currently
204-
// these cannot be inherited
205188
NoHTTPRedirector()
206-
NoMainListener()
207-
if err := os.Remove(listenAddr); err != nil && !os.IsNotExist(err) {
208-
log.Fatal("Failed to remove unix socket directory %s: %v", listenAddr, err)
209-
}
210-
var listener *net.UnixListener
211-
listener, err = net.ListenUnix("unix", &net.UnixAddr{Name: listenAddr, Net: "unix"})
212-
if err != nil {
213-
break // Handle error after switch
214-
}
215-
216-
// FIXME: add proper implementation of signal capture on all protocols
217-
// execute this on SIGTERM or SIGINT: listener.Close()
218-
if err = os.Chmod(listenAddr, os.FileMode(setting.UnixSocketPermission)); err != nil {
219-
log.Fatal("Failed to set permission of unix socket: %v", err)
220-
}
221-
err = http.Serve(listener, context2.ClearHandler(m))
189+
err = runHTTP("unix", listenAddr, context2.ClearHandler(m))
222190
default:
223191
log.Fatal("Invalid protocol: %s", setting.Protocol)
224192
}

cmd/web_graceful.go

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,24 @@ package cmd
66

77
import (
88
"crypto/tls"
9+
"net"
910
"net/http"
11+
"net/http/fcgi"
1012

1113
"code.gitea.io/gitea/modules/graceful"
14+
"code.gitea.io/gitea/modules/log"
1215
)
1316

14-
func runHTTP(listenAddr string, m http.Handler) error {
15-
return graceful.HTTPListenAndServe("tcp", listenAddr, m)
17+
func runHTTP(network, listenAddr string, m http.Handler) error {
18+
return graceful.HTTPListenAndServe(network, listenAddr, m)
1619
}
1720

18-
func runHTTPS(listenAddr, certFile, keyFile string, m http.Handler) error {
19-
return graceful.HTTPListenAndServeTLS("tcp", listenAddr, certFile, keyFile, m)
21+
func runHTTPS(network, listenAddr, certFile, keyFile string, m http.Handler) error {
22+
return graceful.HTTPListenAndServeTLS(network, listenAddr, certFile, keyFile, m)
2023
}
2124

22-
func runHTTPSWithTLSConfig(listenAddr string, tlsConfig *tls.Config, m http.Handler) error {
23-
return graceful.HTTPListenAndServeTLSConfig("tcp", listenAddr, tlsConfig, m)
25+
func runHTTPSWithTLSConfig(network, listenAddr string, tlsConfig *tls.Config, m http.Handler) error {
26+
return graceful.HTTPListenAndServeTLSConfig(network, listenAddr, tlsConfig, m)
2427
}
2528

2629
// NoHTTPRedirector tells our cleanup routine that we will not be using a fallback http redirector
@@ -33,3 +36,17 @@ func NoHTTPRedirector() {
3336
func NoMainListener() {
3437
graceful.Manager.InformCleanup()
3538
}
39+
40+
func runFCGI(listenAddr string, m http.Handler) error {
41+
// This needs to handle stdin as fcgi point
42+
fcgiServer := graceful.NewServer("tcp", listenAddr)
43+
44+
err := fcgiServer.ListenAndServe(func(listener net.Listener) error {
45+
return fcgi.Serve(listener, m)
46+
})
47+
if err != nil {
48+
log.Fatal("Failed to start FCGI main server: %v", err)
49+
}
50+
log.Info("FCGI Listener: %s Closed", listenAddr)
51+
return err
52+
}

models/issue_label.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -279,10 +279,9 @@ func GetLabelsInRepoByIDs(repoID int64, labelIDs []int64) ([]*Label, error) {
279279
Find(&labels)
280280
}
281281

282-
// GetLabelsByRepoID returns all labels that belong to given repository by ID.
283-
func GetLabelsByRepoID(repoID int64, sortType string) ([]*Label, error) {
282+
func getLabelsByRepoID(e Engine, repoID int64, sortType string) ([]*Label, error) {
284283
labels := make([]*Label, 0, 10)
285-
sess := x.Where("repo_id = ?", repoID)
284+
sess := e.Where("repo_id = ?", repoID)
286285

287286
switch sortType {
288287
case "reversealphabetically":
@@ -298,6 +297,11 @@ func GetLabelsByRepoID(repoID int64, sortType string) ([]*Label, error) {
298297
return labels, sess.Find(&labels)
299298
}
300299

300+
// GetLabelsByRepoID returns all labels that belong to given repository by ID.
301+
func GetLabelsByRepoID(repoID int64, sortType string) ([]*Label, error) {
302+
return getLabelsByRepoID(x, repoID, sortType)
303+
}
304+
301305
func getLabelsByIssueID(e Engine, issueID int64) ([]*Label, error) {
302306
var labels []*Label
303307
return labels, e.Where("issue_label.issue_id = ?", issueID).

models/repo.go

Lines changed: 32 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ import (
4242
"github.com/unknwon/com"
4343
ini "gopkg.in/ini.v1"
4444
"xorm.io/builder"
45-
"xorm.io/xorm"
4645
)
4746

4847
var repoWorkingPool = sync.NewExclusivePool()
@@ -173,8 +172,8 @@ type Repository struct {
173172
*Mirror `xorm:"-"`
174173
Status RepositoryStatus `xorm:"NOT NULL DEFAULT 0"`
175174

176-
ExternalMetas map[string]string `xorm:"-"`
177-
Units []*RepoUnit `xorm:"-"`
175+
RenderingMetas map[string]string `xorm:"-"`
176+
Units []*RepoUnit `xorm:"-"`
178177

179178
IsFork bool `xorm:"INDEX NOT NULL DEFAULT false"`
180179
ForkID int64 `xorm:"INDEX"`
@@ -559,27 +558,39 @@ func (repo *Repository) mustOwnerName(e Engine) string {
559558

560559
// ComposeMetas composes a map of metas for properly rendering issue links and external issue trackers.
561560
func (repo *Repository) ComposeMetas() map[string]string {
562-
if repo.ExternalMetas == nil {
563-
repo.ExternalMetas = map[string]string{
561+
if repo.RenderingMetas == nil {
562+
metas := map[string]string{
564563
"user": repo.MustOwner().Name,
565564
"repo": repo.Name,
566565
"repoPath": repo.RepoPath(),
567566
}
567+
568568
unit, err := repo.GetUnit(UnitTypeExternalTracker)
569-
if err != nil {
570-
return repo.ExternalMetas
569+
if err == nil {
570+
metas["format"] = unit.ExternalTrackerConfig().ExternalTrackerFormat
571+
switch unit.ExternalTrackerConfig().ExternalTrackerStyle {
572+
case markup.IssueNameStyleAlphanumeric:
573+
metas["style"] = markup.IssueNameStyleAlphanumeric
574+
default:
575+
metas["style"] = markup.IssueNameStyleNumeric
576+
}
571577
}
572578

573-
repo.ExternalMetas["format"] = unit.ExternalTrackerConfig().ExternalTrackerFormat
574-
switch unit.ExternalTrackerConfig().ExternalTrackerStyle {
575-
case markup.IssueNameStyleAlphanumeric:
576-
repo.ExternalMetas["style"] = markup.IssueNameStyleAlphanumeric
577-
default:
578-
repo.ExternalMetas["style"] = markup.IssueNameStyleNumeric
579+
if repo.Owner.IsOrganization() {
580+
teams := make([]string, 0, 5)
581+
_ = x.Table("team_repo").
582+
Join("INNER", "team", "team.id = team_repo.team_id").
583+
Where("team_repo.repo_id = ?", repo.ID).
584+
Select("team.lower_name").
585+
OrderBy("team.lower_name").
586+
Find(&teams)
587+
metas["teams"] = "," + strings.Join(teams, ",") + ","
588+
metas["org"] = repo.Owner.LowerName
579589
}
580590

591+
repo.RenderingMetas = metas
581592
}
582-
return repo.ExternalMetas
593+
return repo.RenderingMetas
583594
}
584595

585596
// DeleteWiki removes the actual and local copy of repository wiki.
@@ -1246,20 +1257,6 @@ type CreateRepoOptions struct {
12461257
Status RepositoryStatus
12471258
}
12481259

1249-
// GenerateRepoOptions contains the template units to generate
1250-
type GenerateRepoOptions struct {
1251-
Name string
1252-
Description string
1253-
Private bool
1254-
GitContent bool
1255-
Topics bool
1256-
}
1257-
1258-
// IsValid checks whether at least one option is chosen for generation
1259-
func (gro GenerateRepoOptions) IsValid() bool {
1260-
return gro.GitContent || gro.Topics // or other items as they are added
1261-
}
1262-
12631260
func getRepoInitFile(tp, name string) ([]byte, error) {
12641261
cleanedName := strings.TrimLeft(path.Clean("/"+name), "/")
12651262
relPath := path.Join("options", tp, cleanedName)
@@ -1471,37 +1468,6 @@ func initRepository(e Engine, repoPath string, u *User, repo *Repository, opts C
14711468
return nil
14721469
}
14731470

1474-
// generateRepository initializes repository from template
1475-
func generateRepository(e Engine, repo, templateRepo *Repository) (err error) {
1476-
tmpDir := filepath.Join(os.TempDir(), "gitea-"+repo.Name+"-"+com.ToStr(time.Now().Nanosecond()))
1477-
1478-
if err := os.MkdirAll(tmpDir, os.ModePerm); err != nil {
1479-
return fmt.Errorf("Failed to create dir %s: %v", tmpDir, err)
1480-
}
1481-
1482-
defer func() {
1483-
if err := os.RemoveAll(tmpDir); err != nil {
1484-
log.Error("RemoveAll: %v", err)
1485-
}
1486-
}()
1487-
1488-
if err = generateRepoCommit(e, repo, templateRepo, tmpDir); err != nil {
1489-
return fmt.Errorf("generateRepoCommit: %v", err)
1490-
}
1491-
1492-
// re-fetch repo
1493-
if repo, err = getRepositoryByID(e, repo.ID); err != nil {
1494-
return fmt.Errorf("getRepositoryByID: %v", err)
1495-
}
1496-
1497-
repo.DefaultBranch = "master"
1498-
if err = updateRepository(e, repo, false); err != nil {
1499-
return fmt.Errorf("updateRepository: %v", err)
1500-
}
1501-
1502-
return nil
1503-
}
1504-
15051471
var (
15061472
reservedRepoNames = []string{".", ".."}
15071473
reservedRepoPatterns = []string{"*.git", "*.wiki"}
@@ -1512,7 +1478,7 @@ func IsUsableRepoName(name string) error {
15121478
return isUsableName(reservedRepoNames, reservedRepoPatterns, name)
15131479
}
15141480

1515-
func createRepository(e *xorm.Session, doer, u *User, repo *Repository) (err error) {
1481+
func createRepository(e Engine, doer, u *User, repo *Repository) (err error) {
15161482
if err = IsUsableRepoName(repo.Name); err != nil {
15171483
return err
15181484
}
@@ -2759,72 +2725,6 @@ func ForkRepository(doer, owner *User, oldRepo *Repository, name, desc string) (
27592725
return repo, CopyLFS(repo, oldRepo)
27602726
}
27612727

2762-
// GenerateRepository generates a repository from a template
2763-
func GenerateRepository(doer, owner *User, templateRepo *Repository, opts GenerateRepoOptions) (_ *Repository, err error) {
2764-
repo := &Repository{
2765-
OwnerID: owner.ID,
2766-
Owner: owner,
2767-
Name: opts.Name,
2768-
LowerName: strings.ToLower(opts.Name),
2769-
Description: opts.Description,
2770-
IsPrivate: opts.Private,
2771-
IsEmpty: !opts.GitContent || templateRepo.IsEmpty,
2772-
IsFsckEnabled: templateRepo.IsFsckEnabled,
2773-
TemplateID: templateRepo.ID,
2774-
}
2775-
2776-
createSess := x.NewSession()
2777-
defer createSess.Close()
2778-
if err = createSess.Begin(); err != nil {
2779-
return nil, err
2780-
}
2781-
2782-
if err = createRepository(createSess, doer, owner, repo); err != nil {
2783-
return nil, err
2784-
}
2785-
2786-
//Commit repo to get created repo ID
2787-
err = createSess.Commit()
2788-
if err != nil {
2789-
return nil, err
2790-
}
2791-
2792-
sess := x.NewSession()
2793-
defer sess.Close()
2794-
if err = sess.Begin(); err != nil {
2795-
return repo, err
2796-
}
2797-
2798-
repoPath := RepoPath(owner.Name, repo.Name)
2799-
if err = checkInitRepository(repoPath); err != nil {
2800-
return repo, err
2801-
}
2802-
2803-
if opts.GitContent && !templateRepo.IsEmpty {
2804-
if err = generateRepository(sess, repo, templateRepo); err != nil {
2805-
return repo, err
2806-
}
2807-
2808-
if err = repo.updateSize(sess); err != nil {
2809-
return repo, fmt.Errorf("failed to update size for repository: %v", err)
2810-
}
2811-
2812-
if err = copyLFS(sess, repo, templateRepo); err != nil {
2813-
return repo, fmt.Errorf("failed to copy LFS: %v", err)
2814-
}
2815-
}
2816-
2817-
if opts.Topics {
2818-
for _, topic := range templateRepo.Topics {
2819-
if _, err = addTopicByNameToRepo(sess, repo.ID, topic); err != nil {
2820-
return repo, err
2821-
}
2822-
}
2823-
}
2824-
2825-
return repo, sess.Commit()
2826-
}
2827-
28282728
// GetForks returns all the forks of the repository
28292729
func (repo *Repository) GetForks() ([]*Repository, error) {
28302730
forks := make([]*Repository, 0, repo.NumForks)
@@ -3041,8 +2941,12 @@ func (repo *Repository) GetTreePathLock(treePath string) (*LFSLock, error) {
30412941
return nil, nil
30422942
}
30432943

2944+
func updateRepositoryCols(e Engine, repo *Repository, cols ...string) error {
2945+
_, err := e.ID(repo.ID).Cols(cols...).Update(repo)
2946+
return err
2947+
}
2948+
30442949
// UpdateRepositoryCols updates repository's columns
30452950
func UpdateRepositoryCols(repo *Repository, cols ...string) error {
3046-
_, err := x.ID(repo.ID).Cols(cols...).Update(repo)
3047-
return err
2951+
return updateRepositoryCols(x, repo, cols...)
30482952
}

0 commit comments

Comments
 (0)