2015-11-14 09:34:01 +00:00
{{ template "base/head" . }}
2023-02-01 22:56:10 +00:00
< div role = "main" aria-label = " {{ .Title }} " class = "page-content repository file list {{ if .IsBlame }} blame {{ end }} " >
2015-12-07 22:30:52 +00:00
{{ template "repo/header" . }}
2020-06-25 18:58:12 +00:00
< div class = "ui container {{ if .IsBlame }} fluid padded {{ end }} " >
2016-08-25 04:35:03 +00:00
{{ template "base/alert" . }}
2023-07-08 03:19:00 +00:00
{{ template "repo/code/recently_pushed_new_branches" . }}
2022-10-13 08:31:10 +00:00
{{ if and ( not .HideRepoInfo ) ( not .IsBlame ) }}
2023-11-07 23:52:08 +00:00
< div class = "ui repo-description gt-word-break" >
2023-08-31 05:01:01 +00:00
< div id = "repo-desc" class = "gt-font-16" >
2022-08-25 21:55:52 +00:00
{{ $description := .Repository.DescriptionHTML $.Context }}
2023-09-25 08:56:50 +00:00
{{ if $description }} < span class = "description" > {{ $description | RenderCodeBlock }} </ span > {{ else if .IsRepositoryAdmin }} < span class = "no-description text-italic" > {{ ctx .Locale.Tr "repo.no_desc" }} </ span > {{ end }}
2017-10-27 06:10:54 +00:00
< a class = "link" href = " {{ .Repository.Website }} " > {{ .Repository.Website }} </ a >
< / div >
{{ if .RepoSearchEnabled }}
< div class = "ui repo-search" >
2018-03-23 14:10:42 +00:00
< form class = "ui form ignore-dirty" action = " {{ .RepoLink }} /search" method = "get" >
2017-10-27 06:10:54 +00:00
< div class = "field" >
2023-09-25 08:56:50 +00:00
< div class = "ui small action input {{ if .CodeIndexerUnavailable }} disabled left icon {{ end }} " {{ if .CodeIndexerUnavailable }} data-tooltip-content = " {{ ctx .Locale.Tr "repo.search.code_search_unavailable" }} " {{ end }} >
< input name = "q" value = " {{ .Keyword }} " {{ if .CodeIndexerUnavailable }} disabled {{ end }} placeholder = " {{ ctx .Locale.Tr "repo.search.search_repo" }} " >
2022-08-25 21:55:52 +00:00
{{ if .CodeIndexerUnavailable }}
2023-08-25 23:35:10 +00:00
< i class = "icon" > {{ svg "octicon-alert" }} </ i >
2022-01-27 08:30:51 +00:00
{{ end }}
2023-04-30 03:33:25 +00:00
< button class = "ui small icon button" {{ if .CodeIndexerUnavailable }} disabled {{ end }} type = "submit" >
2020-10-30 18:54:58 +00:00
{{ svg "octicon-search" }}
2017-10-27 06:10:54 +00:00
< / button >
< / div >
< / div >
< / form >
< / div >
{{ end }}
< / div >
2023-07-08 18:12:30 +00:00
< div class = "gt-df gt-ac gt-fw gt-gap-2" id = "repo-topics" >
{{ range .Topics }} < a class = "ui repo-topic large label topic gt-m-0" href = " {{ AppSubUrl }} /explore/repos?q= {{ .Name }} &topic=1" > {{ .Name }} </ a > {{ end }}
2023-09-25 08:56:50 +00:00
{{ if and .Permission.IsAdmin ( not .Repository.IsArchived ) }} < button id = "manage_topic" class = "btn interact-fg gt-font-12" > {{ ctx .Locale.Tr "repo.topic.manage_topics" }} </ button > {{ end }}
2018-04-11 02:51:44 +00:00
< / div >
2022-10-13 08:31:10 +00:00
{{ end }}
2019-01-24 10:22:27 +00:00
{{ if and .Permission.IsAdmin ( not .Repository.IsArchived ) }}
2023-11-06 09:23:50 +00:00
< div class = "ui form gt-hidden gt-df gt-fc gt-mt-4" id = "topic_edit" >
< div class = "field gt-f1 gt-mb-2" >
< div class = "ui fluid multiple search selection dropdown gt-fw" data-text-count-prompt = " {{ ctx .Locale.Tr "repo.topic.count_prompt" }} " data-text-format-prompt = " {{ ctx .Locale.Tr "repo.topic.format_prompt" }} " >
Use a general Eval function for expressions in templates. (#23927)
One of the proposals in #23328
This PR introduces a simple expression calculator
(templates/eval/eval.go), it can do basic expression calculations.
Many untested template helper functions like `Mul` `Add` can be replaced
by this new approach.
Then these `Add` / `Mul` / `percentage` / `Subtract` / `DiffStatsWidth`
could all use this `Eval`.
And it provides enhancements for Golang templates, and improves
readability.
Some examples:
----
* Before: `{{Add (Mul $glyph.Row 12) 12}}`
* After: `{{Eval $glyph.Row "*" 12 "+" 12}}`
----
* Before: `{{if lt (Add $i 1) (len $.Topics)}}`
* After: `{{if Eval $i "+" 1 "<" (len $.Topics)}}`
## FAQ
### Why not use an existing expression package?
We need a highly customized expression engine:
* do the calculation on the fly, without pre-compiling
* deal with int/int64/float64 types, to make the result could be used in
Golang template.
* make the syntax could be used in the Golang template directly
* do not introduce too much complex or strange syntax, we just need a
simple calculator.
* it needs to strictly follow Golang template's behavior, for example,
Golang template treats all non-zero values as truth, but many 3rd
packages don't do so.
### What's the benefit?
* Developers don't need to add more `Add`/`Mul`/`Sub`-like functions,
they were getting more and more.
Now, only one `Eval` is enough for all cases.
* The new code reads better than old `{{Add (Mul $glyph.Row 12) 12}}`,
the old one isn't familiar to most procedural programming developers
(eg, the Golang expression syntax).
* The `Eval` is fully covered by tests, many old `Add`/`Mul`-like
functions were never tested.
### The performance?
It doesn't use `reflect`, it doesn't need to parse or compile when used
in Golang template, the performance is as fast as native Go template.
### Is it too complex? Could it be unstable?
The expression calculator program is a common homework for computer
science students, and it's widely used as a teaching and practicing
purpose for developers. The algorithm is pretty well-known.
The behavior can be clearly defined, it is stable.
2023-04-07 13:25:49 +00:00
< input type = "hidden" name = "topics" value = " {{ range $i , $v := .Topics }}{{ .Name }}{{ if Eval $i "+" 1 "<" ( len $.Topics ) }} , {{ end }}{{ end }} " >
Fine tune more downdrop settings, use SVG for labels, improve Repo Topic Edit form (#23626)
Although it seems that some different purposes are mixed in this PR,
however, they are all related, and can be tested together, so I put them
together to save everyone's time.
Diff: `+79 −84`, everything becomes much better.
### Improve the dropdown settings.
Move all fomantic-init related code into our `fomantic.js`
Fine-tune some dropdown global settings, see the comments.
Also help to fix the first problem in #23625 , cc: @yp05327
The "language" menu has been simplified, and it works with small-height
window better.
### Use SVG instead of `<i class="delete icon">`
It's also done by `$.fn.dropdown.settings.templates.label` , cc:
@silverwind
### Remove incorrect `tabable` CSS class
It doesn't have CSS styles, and it was only in Vue. So it's totally
unnecessary, remove it by the way.
### Improve the Repo Topic Edit form
* Simplify the code
* Add a "Cancel" button
* Align elements
Before:
<details>
![image](https://user-images.githubusercontent.com/2114189/223325782-f09532de-0c38-4742-ba86-ed35cc9a858d.png)
</details>
After:
![image](https://user-images.githubusercontent.com/2114189/226796347-207feb0a-b3cd-4820-8a3e-01930bab1069.png)
2023-03-26 11:31:26 +00:00
{{ range .Topics }}
{{/* keey the same layout as Fomantic UI generated labels */}}
2023-05-29 14:10:06 +00:00
< a class = "ui label transition visible gt-cursor-default gt-dib" data-value = " {{ .Name }} " > {{ .Name }}{{ svg "octicon-x" 16 "delete icon" }} </ a >
Fine tune more downdrop settings, use SVG for labels, improve Repo Topic Edit form (#23626)
Although it seems that some different purposes are mixed in this PR,
however, they are all related, and can be tested together, so I put them
together to save everyone's time.
Diff: `+79 −84`, everything becomes much better.
### Improve the dropdown settings.
Move all fomantic-init related code into our `fomantic.js`
Fine-tune some dropdown global settings, see the comments.
Also help to fix the first problem in #23625 , cc: @yp05327
The "language" menu has been simplified, and it works with small-height
window better.
### Use SVG instead of `<i class="delete icon">`
It's also done by `$.fn.dropdown.settings.templates.label` , cc:
@silverwind
### Remove incorrect `tabable` CSS class
It doesn't have CSS styles, and it was only in Vue. So it's totally
unnecessary, remove it by the way.
### Improve the Repo Topic Edit form
* Simplify the code
* Add a "Cancel" button
* Align elements
Before:
<details>
![image](https://user-images.githubusercontent.com/2114189/223325782-f09532de-0c38-4742-ba86-ed35cc9a858d.png)
</details>
After:
![image](https://user-images.githubusercontent.com/2114189/226796347-207feb0a-b3cd-4820-8a3e-01930bab1069.png)
2023-03-26 11:31:26 +00:00
{{ end }}
< div class = "text" > < / div >
2018-04-11 02:51:44 +00:00
< / div >
< / div >
Fine tune more downdrop settings, use SVG for labels, improve Repo Topic Edit form (#23626)
Although it seems that some different purposes are mixed in this PR,
however, they are all related, and can be tested together, so I put them
together to save everyone's time.
Diff: `+79 −84`, everything becomes much better.
### Improve the dropdown settings.
Move all fomantic-init related code into our `fomantic.js`
Fine-tune some dropdown global settings, see the comments.
Also help to fix the first problem in #23625 , cc: @yp05327
The "language" menu has been simplified, and it works with small-height
window better.
### Use SVG instead of `<i class="delete icon">`
It's also done by `$.fn.dropdown.settings.templates.label` , cc:
@silverwind
### Remove incorrect `tabable` CSS class
It doesn't have CSS styles, and it was only in Vue. So it's totally
unnecessary, remove it by the way.
### Improve the Repo Topic Edit form
* Simplify the code
* Add a "Cancel" button
* Align elements
Before:
<details>
![image](https://user-images.githubusercontent.com/2114189/223325782-f09532de-0c38-4742-ba86-ed35cc9a858d.png)
</details>
After:
![image](https://user-images.githubusercontent.com/2114189/226796347-207feb0a-b3cd-4820-8a3e-01930bab1069.png)
2023-03-26 11:31:26 +00:00
< div >
2023-09-25 08:56:50 +00:00
< button class = "ui basic button" id = "cancel_topic_edit" > {{ ctx .Locale.Tr "cancel" }} </ button >
< button class = "ui primary button" id = "save_topic" data-link = " {{ .RepoLink }} /topics" > {{ ctx .Locale.Tr "save" }} </ button >
2018-04-11 02:51:44 +00:00
< / div >
< / div >
{{ end }}
[FEAT] Repository flags
This implements "repository flags", a way for instance administrators to
assign custom flags to repositories. The idea is that custom templates
can look at these flags, and display banners based on them, Forgejo does
not provide anything built on top of it, just the foundation. The
feature is optional, and disabled by default. To enable it, set
`[repository].ENABLE_FLAGS = true`.
On the UI side, instance administrators will see a new "Manage flags"
tab on repositories, and a list of enabled tags (if any) on the
repository home page. The "Manage flags" page allows them to remove
existing flags, or add any new ones that are listed in
`[repository].SETTABLE_FLAGS`.
The model does not enforce that only the `SETTABLE_FLAGS` are present.
If the setting is changed, old flags may remain present in the database,
and anything that uses them, will still work. The repository flag
management page will allow an instance administrator to remove them, but
not set them, once removed.
Signed-off-by: Gergely Nagy <forgejo@gergo.csillger.hu>
(cherry picked from commit ba735ce2228f8dd7ca105e94b9baa1be058ebe37)
(cherry picked from commit f09f6e029b4fb2714b86cd32dc19255078ecc0ee)
2024-01-04 13:28:19 +00:00
{{ if RepoFlagsEnabled }}
{{ template "custom/repo_flag_banners" . }}
{{ if .SignedUser.IsAdmin }}
{{ template "repo/admin_flags" . }}
{{ end }}
{{ end }}
2019-01-23 18:58:38 +00:00
{{ if .Repository.IsArchived }}
2023-07-08 10:57:17 +00:00
< div class = "ui warning message gt-text-center" >
2023-04-26 14:46:26 +00:00
{{ if .Repository.ArchivedUnix.IsZero }}
2023-09-25 08:56:50 +00:00
{{ ctx .Locale.Tr "repo.archive.title" }}
2023-04-26 14:46:26 +00:00
{{ else }}
2023-09-25 08:56:50 +00:00
{{ ctx .Locale.Tr "repo.archive.title_date" ( DateTime "long" .Repository.ArchivedUnix ) | Safe }}
2023-04-26 14:46:26 +00:00
{{ end }}
2019-01-23 18:58:38 +00:00
< / div >
{{ end }}
2017-10-26 00:49:16 +00:00
{{ template "repo/sub_menu" . }}
2023-06-15 15:12:08 +00:00
< div class = "repo-button-row" >
2023-03-10 03:14:45 +00:00
< div class = "gt-df gt-ac gt-fw gt-gap-y-3" >
2023-05-03 21:58:59 +00:00
{{ template "repo/branch_dropdown" dict "root" . "ContainerClasses" "gt-mr-2" }}
2023-05-22 07:57:00 +00:00
{{ if and .CanCompareOrPull .IsViewBranch ( not .Repository.IsArchived ) }}
2023-04-29 12:02:29 +00:00
{{ $cmpBranch := "" }}
{{ if ne .Repository.ID .BaseRepo.ID }}
{{ $cmpBranch = printf "%s/%s:" ( .Repository.OwnerName | PathEscape ) ( .Repository.Name | PathEscape ) }}
{{ end }}
2023-09-16 03:51:54 +00:00
{{ $cmpBranch = print $cmpBranch ( .BranchName | PathEscapeSegments ) }}
2023-04-29 12:02:29 +00:00
{{ $compareLink := printf "%s/compare/%s...%s" .BaseRepo.Link ( .BaseRepo.DefaultBranch | PathEscapeSegments ) $cmpBranch }}
< a id = "new-pull-request" role = "button" class = "ui compact basic button" href = " {{ $compareLink }} "
2023-09-25 12:42:40 +00:00
data-tooltip-content="{{ if .PullRequestCtx.Allowed }}{{ ctx .Locale.Tr "repo.pulls.compare_changes" }}{{ else }}{{ ctx .Locale.Tr "action.compare_branch" }}{{ end }} ">
2023-04-26 02:53:44 +00:00
{{ svg "octicon-git-pull-request" }}
2023-04-25 14:08:29 +00:00
< / a >
{{ end }}
2023-05-22 07:57:00 +00:00
<!-- Show go to file and breadcrumbs if not on home page -->
{{ $n := len .TreeNames }}
{{ $l := Eval $n "-" 1 }}
2022-08-07 23:15:11 +00:00
{{ if eq $n 0 }}
2023-09-25 08:56:50 +00:00
< a href = " {{ .Repository.Link }} /find/ {{ .BranchNameSubURL }} " class = "ui compact basic button" > {{ ctx .Locale.Tr "repo.find_file.go_to_file" }} </ a >
2022-09-06 07:01:58 +00:00
{{ end }}
2023-04-19 13:40:42 +00:00
2023-07-07 13:36:14 +00:00
{{ if and .CanWriteCode .IsViewBranch ( not .Repository.IsMirror ) ( not .Repository.IsArchived ) ( not .IsViewFile ) }}
2023-06-15 15:12:08 +00:00
< button class = "ui dropdown basic compact jump button gt-mr-2" {{ if not .Repository.CanEnableEditor }} disabled {{ end }} >
2023-09-25 08:56:50 +00:00
{{ ctx .Locale.Tr "repo.editor.add_file" }}
2023-06-15 15:12:08 +00:00
{{ svg "octicon-triangle-down" 14 "dropdown icon" }}
2022-09-06 07:01:58 +00:00
< div class = "menu" >
2023-04-19 13:40:42 +00:00
< a class = "item" href = " {{ .RepoLink }} /_new/ {{ .BranchName | PathEscapeSegments }} / {{ .TreePath | PathEscapeSegments }} " >
2023-09-25 08:56:50 +00:00
{{ ctx .Locale.Tr "repo.editor.new_file" }}
2023-04-19 13:40:42 +00:00
< / a >
{{ if .RepositoryUploadEnabled }}
< a class = "item" href = " {{ .RepoLink }} /_upload/ {{ .BranchName | PathEscapeSegments }} / {{ .TreePath | PathEscapeSegments }} " >
2023-09-25 08:56:50 +00:00
{{ ctx .Locale.Tr "repo.editor.upload_file" }}
2023-04-19 13:40:42 +00:00
< / a >
2022-09-06 07:01:58 +00:00
{{ end }}
2023-04-19 13:40:42 +00:00
< a class = "item" href = " {{ .RepoLink }} /_diffpatch/ {{ .BranchName | PathEscapeSegments }} / {{ .TreePath | PathEscapeSegments }} " >
2023-09-25 08:56:50 +00:00
{{ ctx .Locale.Tr "repo.editor.patch" }}
2023-04-19 13:40:42 +00:00
< / a >
2022-09-06 07:01:58 +00:00
< / div >
< / button >
{{ end }}
2023-04-19 13:40:42 +00:00
2023-03-10 03:14:45 +00:00
{{ if and ( eq $n 0 ) ( .Repository.IsTemplate ) }}
< a role = "button" class = "ui primary compact button" href = " {{ AppSubUrl }} /repo/create?template_id= {{ .Repository.ID }} " >
2023-09-25 08:56:50 +00:00
{{ ctx .Locale.Tr "repo.use_template" }}
2023-03-10 03:14:45 +00:00
< / a >
{{ end }}
2022-09-06 07:01:58 +00:00
{{ if ne $n 0 }}
2023-05-01 15:40:02 +00:00
< span class = "breadcrumb repo-path gt-ml-2" >
2023-04-29 12:02:29 +00:00
< a class = "section" href = " {{ .RepoLink }} /src/ {{ .BranchNameSubURL }} " title = " {{ .Repository.Name }} " > {{ StringUtils .EllipsisString .Repository.Name 30 }} </ a >
{{- range $i , $v := .TreeNames -}}
2023-08-16 00:08:23 +00:00
< span class = "breadcrumb-divider" > /< / span >
2023-04-29 12:02:29 +00:00
{{- if eq $i $l -}}
< span class = "active section" title = " {{ $v }} " > {{ StringUtils .EllipsisString $v 30 }} </ span >
{{- else -}}
{{ $p := index $.Paths $i }} < span class = "section" >< a href = " {{ $.BranchLink }} / {{ PathEscapeSegments $p }} " title = " {{ $v }} " > {{ StringUtils .EllipsisString $v 30 }} </ a ></ span >
{{- end -}}
{{- end -}}
< / span >
2022-08-07 23:15:11 +00:00
{{ end }}
2017-12-31 00:47:52 +00:00
< / div >
2023-02-13 17:59:59 +00:00
< div class = "gt-df gt-ac" >
2017-08-13 22:49:38 +00:00
<!-- Only show clone panel in repository home page -->
2016-08-11 12:48:08 +00:00
{{ if eq $n 0 }}
2017-08-13 22:49:38 +00:00
< div class = "ui action tiny input" id = "clone-panel" >
2022-08-12 05:16:05 +00:00
{{ template "repo/clone_buttons" . }}
2023-09-25 08:56:50 +00:00
< button id = "more-btn" class = "ui basic small compact jump dropdown icon button" data-tooltip-content = " {{ ctx .Locale.Tr "repo.more_operations" }} " >
2022-11-11 17:02:50 +00:00
{{ svg "octicon-kebab-horizontal" }}
2015-12-07 22:30:52 +00:00
< div class = "menu" >
2023-12-31 15:24:05 +00:00
{{ $citation := .CitationExist }}
{{ $originLink := .CloneButtonOriginLink }}
{{ range $.DownloadOrCloneMethods }}
{{ if not $.DisableDownloadSourceArchives }}
{{ if eq . "download-zip" }}
< a class = "item archive-link" href = " {{ $.RepoLink }} /archive/ {{ PathEscapeSegments $.RefName }} .zip" rel = "nofollow" > {{ svg "octicon-file-zip" 16 "gt-mr-3" }}{{ ctx .Locale.Tr "repo.download_zip" }} </ a >
{{ end }}
{{ if eq . "download-targz" }}
< a class = "item archive-link" href = " {{ $.RepoLink }} /archive/ {{ PathEscapeSegments $.RefName }} .tar.gz" rel = "nofollow" > {{ svg "octicon-file-zip" 16 "gt-mr-3" }}{{ ctx .Locale.Tr "repo.download_tar" }} </ a >
{{ end }}
{{ if eq . "download-bundle" }}
< a class = "item archive-link" href = " {{ $.RepoLink }} /archive/ {{ PathEscapeSegments $.RefName }} .bundle" rel = "nofollow" > {{ svg "octicon-package" 16 "gt-mr-3" }}{{ ctx .Locale.Tr "repo.download_bundle" }} </ a >
{{ end }}
{{ if $citation }}
{{ if eq . "cite" }}
< a class = "item" id = "cite-repo-button" > {{ svg "octicon-cross-reference" 16 "gt-mr-3" }}{{ ctx .Locale.Tr "repo.cite_this_repo" }} </ a >
{{ end }}
{{ end }}
{{ end }}
{{ if eq . "vscode-clone" }}
< a class = "item js-clone-url-vsc" href = "vscode://vscode.git/clone?url= {{ $originLink .HTTPS }} " > {{ svg "gitea-vscode" 16 "gt-mr-3" }}{{ ctx .Locale.Tr "repo.clone_in_vsc" }} </ a >
{{ end }}
{{ if eq . "vscodium-clone" }}
< a class = "item js-clone-url-vscodium" href = "vscodium://vscode.git/clone?url= {{ $originLink .HTTPS }} " > {{ svg "gitea-vscode" 16 "gt-mr-3" }}{{ ctx .Locale.Tr "repo.clone_in_vscodium" }} </ a >
2022-11-11 17:02:50 +00:00
{{ end }}
2022-08-12 05:16:05 +00:00
{{ end }}
2015-12-07 22:30:52 +00:00
< / div >
2021-04-13 00:10:57 +00:00
< / button >
2022-09-21 11:51:10 +00:00
{{ template "repo/clone_script" . }} {{/* the script will update `.js-clone-url` and related elements */}}
2015-12-07 22:30:52 +00:00
< / div >
2022-11-11 17:02:50 +00:00
{{ template "repo/cite/cite_modal" . }}
2016-08-11 12:48:08 +00:00
{{ end }}
2022-08-25 21:55:52 +00:00
{{ if and ( ne $n 0 ) ( not .IsViewFile ) ( not .IsBlame ) }}
2022-08-09 10:32:41 +00:00
< a class = "ui button" href = " {{ .RepoLink }} /commits/ {{ .BranchNameSubURL }} / {{ .TreePath | PathEscapeSegments }} " >
2023-09-25 08:56:50 +00:00
{{ svg "octicon-history" 16 "gt-mr-3" }}{{ ctx .Locale.Tr "repo.file_history" }}
2022-08-09 10:32:41 +00:00
< / a >
{{ end }}
2016-08-11 12:48:08 +00:00
< / div >
2015-12-07 22:30:52 +00:00
< / div >
2016-08-30 09:08:38 +00:00
{{ if .IsViewFile }}
2015-12-07 22:30:52 +00:00
{{ template "repo/view_file" . }}
2019-04-20 02:47:00 +00:00
{{ else if .IsBlame }}
{{ template "repo/blame" . }}
2015-12-07 22:30:52 +00:00
{{ else }}
{{ template "repo/view_list" . }}
{{ end }}
< / div >
2014-07-26 04:24:27 +00:00
< / div >
2015-12-07 22:30:52 +00:00
{{ template "base/footer" . }}