mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-26 12:27:06 +00:00 
			
		
		
		
	Refactor some trivial problems (#34959)
1. make our "route group pattern match" also update chi's RoutePattern 2. fix incorrect "NotFound" call in conda package 3. make ".flex-item .flex-item-main" has a general gap, then no need to use `tw` tricks 4. improve the "test webhook" UI
This commit is contained in:
		| @@ -26,6 +26,7 @@ func (g *RouterPathGroup) ServeHTTP(resp http.ResponseWriter, req *http.Request) | |||||||
| 	path := chiCtx.URLParam(g.pathParam) | 	path := chiCtx.URLParam(g.pathParam) | ||||||
| 	for _, m := range g.matchers { | 	for _, m := range g.matchers { | ||||||
| 		if m.matchPath(chiCtx, path) { | 		if m.matchPath(chiCtx, path) { | ||||||
|  | 			chiCtx.RoutePatterns = append(chiCtx.RoutePatterns, m.pattern) | ||||||
| 			handler := m.handlerFunc | 			handler := m.handlerFunc | ||||||
| 			for i := len(m.middlewares) - 1; i >= 0; i-- { | 			for i := len(m.middlewares) - 1; i >= 0; i-- { | ||||||
| 				handler = m.middlewares[i](handler).ServeHTTP | 				handler = m.middlewares[i](handler).ServeHTTP | ||||||
| @@ -38,6 +39,7 @@ func (g *RouterPathGroup) ServeHTTP(resp http.ResponseWriter, req *http.Request) | |||||||
| } | } | ||||||
|  |  | ||||||
| type RouterPathGroupPattern struct { | type RouterPathGroupPattern struct { | ||||||
|  | 	pattern     string | ||||||
| 	re          *regexp.Regexp | 	re          *regexp.Regexp | ||||||
| 	params      []routerPathParam | 	params      []routerPathParam | ||||||
| 	middlewares []any | 	middlewares []any | ||||||
| @@ -62,6 +64,7 @@ type routerPathParam struct { | |||||||
|  |  | ||||||
| type routerPathMatcher struct { | type routerPathMatcher struct { | ||||||
| 	methods     container.Set[string] | 	methods     container.Set[string] | ||||||
|  | 	pattern     string | ||||||
| 	re          *regexp.Regexp | 	re          *regexp.Regexp | ||||||
| 	params      []routerPathParam | 	params      []routerPathParam | ||||||
| 	middlewares []func(http.Handler) http.Handler | 	middlewares []func(http.Handler) http.Handler | ||||||
| @@ -117,7 +120,7 @@ func newRouterPathMatcher(methods string, patternRegexp *RouterPathGroupPattern, | |||||||
| 		} | 		} | ||||||
| 		p.methods.Add(method) | 		p.methods.Add(method) | ||||||
| 	} | 	} | ||||||
| 	p.re, p.params = patternRegexp.re, patternRegexp.params | 	p.pattern, p.re, p.params = patternRegexp.pattern, patternRegexp.re, patternRegexp.params | ||||||
| 	return p | 	return p | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -157,7 +160,7 @@ func patternRegexp(pattern string, h ...any) *RouterPathGroupPattern { | |||||||
| 		p.params = append(p.params, param) | 		p.params = append(p.params, param) | ||||||
| 	} | 	} | ||||||
| 	re = append(re, '$') | 	re = append(re, '$') | ||||||
| 	p.re = regexp.MustCompile(string(re)) | 	p.pattern, p.re = pattern, regexp.MustCompile(string(re)) | ||||||
| 	return p | 	return p | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -56,17 +56,20 @@ func TestRouter(t *testing.T) { | |||||||
| 	recorder.Body = buff | 	recorder.Body = buff | ||||||
|  |  | ||||||
| 	type resultStruct struct { | 	type resultStruct struct { | ||||||
| 		method       string | 		method          string | ||||||
| 		pathParams   map[string]string | 		pathParams      map[string]string | ||||||
| 		handlerMarks []string | 		handlerMarks    []string | ||||||
|  | 		chiRoutePattern *string | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	var res resultStruct | 	var res resultStruct | ||||||
| 	h := func(optMark ...string) func(resp http.ResponseWriter, req *http.Request) { | 	h := func(optMark ...string) func(resp http.ResponseWriter, req *http.Request) { | ||||||
| 		mark := util.OptionalArg(optMark, "") | 		mark := util.OptionalArg(optMark, "") | ||||||
| 		return func(resp http.ResponseWriter, req *http.Request) { | 		return func(resp http.ResponseWriter, req *http.Request) { | ||||||
|  | 			chiCtx := chi.RouteContext(req.Context()) | ||||||
| 			res.method = req.Method | 			res.method = req.Method | ||||||
| 			res.pathParams = chiURLParamsToMap(chi.RouteContext(req.Context())) | 			res.pathParams = chiURLParamsToMap(chiCtx) | ||||||
|  | 			res.chiRoutePattern = util.ToPointer(chiCtx.RoutePattern()) | ||||||
| 			if mark != "" { | 			if mark != "" { | ||||||
| 				res.handlerMarks = append(res.handlerMarks, mark) | 				res.handlerMarks = append(res.handlerMarks, mark) | ||||||
| 			} | 			} | ||||||
| @@ -125,21 +128,29 @@ func TestRouter(t *testing.T) { | |||||||
| 			req, err := http.NewRequest(methodPathFields[0], methodPathFields[1], nil) | 			req, err := http.NewRequest(methodPathFields[0], methodPathFields[1], nil) | ||||||
| 			assert.NoError(t, err) | 			assert.NoError(t, err) | ||||||
| 			r.ServeHTTP(recorder, req) | 			r.ServeHTTP(recorder, req) | ||||||
|  | 			if expected.chiRoutePattern == nil { | ||||||
|  | 				res.chiRoutePattern = nil | ||||||
|  | 			} | ||||||
| 			assert.Equal(t, expected, res) | 			assert.Equal(t, expected, res) | ||||||
| 		}) | 		}) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	t.Run("RootRouter", func(t *testing.T) { | 	t.Run("RootRouter", func(t *testing.T) { | ||||||
| 		testRoute(t, "GET /the-user/the-repo/other", resultStruct{method: "GET", handlerMarks: []string{"not-found:/"}}) | 		testRoute(t, "GET /the-user/the-repo/other", resultStruct{ | ||||||
|  | 			method:          "GET", | ||||||
|  | 			handlerMarks:    []string{"not-found:/"}, | ||||||
|  | 			chiRoutePattern: util.ToPointer(""), | ||||||
|  | 		}) | ||||||
| 		testRoute(t, "GET /the-user/the-repo/pulls", resultStruct{ | 		testRoute(t, "GET /the-user/the-repo/pulls", resultStruct{ | ||||||
| 			method:       "GET", | 			method:       "GET", | ||||||
| 			pathParams:   map[string]string{"username": "the-user", "reponame": "the-repo", "type": "pulls"}, | 			pathParams:   map[string]string{"username": "the-user", "reponame": "the-repo", "type": "pulls"}, | ||||||
| 			handlerMarks: []string{"list-issues-b"}, | 			handlerMarks: []string{"list-issues-b"}, | ||||||
| 		}) | 		}) | ||||||
| 		testRoute(t, "GET /the-user/the-repo/issues/123", resultStruct{ | 		testRoute(t, "GET /the-user/the-repo/issues/123", resultStruct{ | ||||||
| 			method:       "GET", | 			method:          "GET", | ||||||
| 			pathParams:   map[string]string{"username": "the-user", "reponame": "the-repo", "type": "issues", "index": "123"}, | 			pathParams:      map[string]string{"username": "the-user", "reponame": "the-repo", "type": "issues", "index": "123"}, | ||||||
| 			handlerMarks: []string{"view-issue"}, | 			handlerMarks:    []string{"view-issue"}, | ||||||
|  | 			chiRoutePattern: util.ToPointer("/{username}/{reponame}/{type:issues|pulls}/{index}"), | ||||||
| 		}) | 		}) | ||||||
| 		testRoute(t, "GET /the-user/the-repo/issues/123?stop=hijack", resultStruct{ | 		testRoute(t, "GET /the-user/the-repo/issues/123?stop=hijack", resultStruct{ | ||||||
| 			method:       "GET", | 			method:       "GET", | ||||||
| @@ -154,7 +165,10 @@ func TestRouter(t *testing.T) { | |||||||
| 	}) | 	}) | ||||||
|  |  | ||||||
| 	t.Run("Sub Router", func(t *testing.T) { | 	t.Run("Sub Router", func(t *testing.T) { | ||||||
| 		testRoute(t, "GET /api/v1/other", resultStruct{method: "GET", handlerMarks: []string{"not-found:/api/v1"}}) | 		testRoute(t, "GET /api/v1/other", resultStruct{ | ||||||
|  | 			method:       "GET", | ||||||
|  | 			handlerMarks: []string{"not-found:/api/v1"}, | ||||||
|  | 		}) | ||||||
| 		testRoute(t, "GET /api/v1/repos/the-user/the-repo/branches", resultStruct{ | 		testRoute(t, "GET /api/v1/repos/the-user/the-repo/branches", resultStruct{ | ||||||
| 			method:     "GET", | 			method:     "GET", | ||||||
| 			pathParams: map[string]string{"username": "the-user", "reponame": "the-repo"}, | 			pathParams: map[string]string{"username": "the-user", "reponame": "the-repo"}, | ||||||
| @@ -211,9 +225,10 @@ func TestRouter(t *testing.T) { | |||||||
| 		}) | 		}) | ||||||
|  |  | ||||||
| 		testRoute(t, "GET /api/v1/repos/the-user/the-repo/branches/d1/d2/fn?stop=s3", resultStruct{ | 		testRoute(t, "GET /api/v1/repos/the-user/the-repo/branches/d1/d2/fn?stop=s3", resultStruct{ | ||||||
| 			method:       "GET", | 			method:          "GET", | ||||||
| 			pathParams:   map[string]string{"username": "the-user", "reponame": "the-repo", "*": "d1/d2/fn", "dir": "d1/d2", "file": "fn"}, | 			pathParams:      map[string]string{"username": "the-user", "reponame": "the-repo", "*": "d1/d2/fn", "dir": "d1/d2", "file": "fn"}, | ||||||
| 			handlerMarks: []string{"s1", "s2", "s3"}, | 			handlerMarks:    []string{"s1", "s2", "s3"}, | ||||||
|  | 			chiRoutePattern: util.ToPointer("/api/v1/repos/{username}/{reponame}/branches/<dir:*>/<file:[a-z]{1,2}>"), | ||||||
| 		}) | 		}) | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2334,8 +2334,8 @@ settings.hooks_desc = Webhooks automatically make HTTP POST requests to a server | |||||||
| settings.webhook_deletion = Remove Webhook | settings.webhook_deletion = Remove Webhook | ||||||
| settings.webhook_deletion_desc = Removing a webhook deletes its settings and delivery history. Continue? | settings.webhook_deletion_desc = Removing a webhook deletes its settings and delivery history. Continue? | ||||||
| settings.webhook_deletion_success = The webhook has been removed. | settings.webhook_deletion_success = The webhook has been removed. | ||||||
| settings.webhook.test_delivery = Test Delivery | settings.webhook.test_delivery = Test Push Event | ||||||
| settings.webhook.test_delivery_desc = Test this webhook with a fake event. | settings.webhook.test_delivery_desc = Test this webhook with a fake push event. | ||||||
| settings.webhook.test_delivery_desc_disabled = To test this webhook with a fake event, activate it. | settings.webhook.test_delivery_desc_disabled = To test this webhook with a fake event, activate it. | ||||||
| settings.webhook.request = Request | settings.webhook.request = Request | ||||||
| settings.webhook.response = Response | settings.webhook.response = Response | ||||||
|   | |||||||
| @@ -51,7 +51,7 @@ func ListOrGetPackages(ctx *context.Context) { | |||||||
| 		DownloadPackageFile(ctx) | 		DownloadPackageFile(ctx) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	ctx.NotFound(nil) | 	http.NotFound(ctx.Resp, ctx.Req) | ||||||
| } | } | ||||||
|  |  | ||||||
| func EnumeratePackages(ctx *context.Context) { | func EnumeratePackages(ctx *context.Context) { | ||||||
|   | |||||||
| @@ -68,7 +68,7 @@ | |||||||
| 							<a class="text primary" href="{{$.Link}}"> | 							<a class="text primary" href="{{$.Link}}"> | ||||||
| 								gitea-org / gitea | 								gitea-org / gitea | ||||||
| 							</a> | 							</a> | ||||||
| 							<span data-tooltip-content="{{ctx.Locale.Tr "repo.fork"}}">{{svg "octicon-repo-forked"}}</span> | 							<span class="flex-text-inline" data-tooltip-content="{{ctx.Locale.Tr "repo.fork"}}">{{svg "octicon-repo-forked"}}</span> | ||||||
| 						</div> | 						</div> | ||||||
| 						<div class="flex-item-trailing"> | 						<div class="flex-item-trailing"> | ||||||
| 							<a class="muted" href="{{$.Link}}"> | 							<a class="muted" href="{{$.Link}}"> | ||||||
|   | |||||||
| @@ -26,7 +26,7 @@ | |||||||
| 							{{else}} | 							{{else}} | ||||||
| 								<span class="text red">{{svg "octicon-alert"}}</span> | 								<span class="text red">{{svg "octicon-alert"}}</span> | ||||||
| 							{{end}} | 							{{end}} | ||||||
| 							<a class="ui primary sha label toggle button show-panel" data-panel="#info-{{.ID}}">{{.UUID}}</a> | 							<button class="btn interact-bg tw-p-2 toggle show-panel" data-panel="#info-{{.ID}}">{{.UUID}}</button> | ||||||
| 						</div> | 						</div> | ||||||
| 						<span class="text grey"> | 						<span class="text grey"> | ||||||
| 							{{DateUtils.TimeSince .Delivered}} | 							{{DateUtils.TimeSince .Delivered}} | ||||||
|   | |||||||
| @@ -35,7 +35,7 @@ | |||||||
| 					</div> | 					</div> | ||||||
| 					{{end}} | 					{{end}} | ||||||
| 				</div> | 				</div> | ||||||
| 				<div class="flex-item-body tw-mt-1"> | 				<div class="flex-item-body"> | ||||||
| 					<a class="index" href="{{if .Link}}{{.Link}}{{else}}{{$.Link}}/{{.Index}}{{end}}"> | 					<a class="index" href="{{if .Link}}{{.Link}}{{else}}{{$.Link}}/{{.Index}}{{end}}"> | ||||||
| 						{{if eq $.listType "dashboard"}} | 						{{if eq $.listType "dashboard"}} | ||||||
| 							{{.Repo.FullName}}#{{.Index}} | 							{{.Repo.FullName}}#{{.Index}} | ||||||
|   | |||||||
| @@ -17,6 +17,7 @@ | |||||||
| .flex-item .flex-item-main { | .flex-item .flex-item-main { | ||||||
|   display: flex; |   display: flex; | ||||||
|   flex-direction: column; |   flex-direction: column; | ||||||
|  |   gap: 0.25em; | ||||||
|   flex-grow: 1; |   flex-grow: 1; | ||||||
|   flex-basis: 60%; /* avoid wrapping the "flex-item-trailing" too aggressively */ |   flex-basis: 60%; /* avoid wrapping the "flex-item-trailing" too aggressively */ | ||||||
|   min-width: 0; /* make the "text truncate" work, otherwise the flex axis is not limited and the text just overflows */ |   min-width: 0; /* make the "text truncate" work, otherwise the flex axis is not limited and the text just overflows */ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 wxiaoguang
					wxiaoguang