2017-10-26 03:49:16 +03:00
{{ template "base/head" . }}
2023-02-02 01:56:10 +03:00
<div role="main" aria-label=" {{ .Title }} " class="page-content ui repository branches">
2017-10-26 03:49:16 +03:00
{{ template "repo/header" . }}
<div class="ui container">
{{ template "base/alert" . }}
{{ template "repo/sub_menu" . }}
2022-01-16 17:59:16 +03:00
{{ if .DefaultBranchBranch }}
2023-04-29 13:44:52 +03:00
<h4 class="ui top attached header">
2022-06-27 23:58:46 +03:00
{{ .locale .Tr "repo.default_branch" }}
2023-04-29 13:44:52 +03:00
{{ if and $ .IsWriter ( not $ .Repository .IsArchived ) ( not .IsDeleted ) }}
<a role="button" class="right" href=" {{ .RepoLink }} /settings/branches" data-tooltip-content=" {{ .locale .Tr "repo.settings.branches.switch_default_branch" }} ">
{{ svg "octicon-arrow-switch" }}
</a>
{{ end }}
2022-01-16 17:59:16 +03:00
</h4>
2017-10-26 03:49:16 +03:00
2022-01-16 17:59:16 +03:00
<div class="ui attached table segment">
<table class="ui very basic striped fixed table single line">
<tbody>
<tr>
<td>
{{ if .DefaultBranchBranch .IsProtected }}
2020-09-11 23:19:00 +03:00
{{ svg "octicon-shield-lock" }}
2019-07-17 23:02:41 +03:00
{{ end }}
2022-01-16 17:59:16 +03:00
<a href=" {{ .RepoLink }} /src/branch/ {{ PathEscapeSegments .DefaultBranch }} "> {{ .DefaultBranch }} </a>
2023-02-13 20:59:59 +03:00
<p class="info gt-df gt-ac gt-my-2"> {{ svg "octicon-git-commit" 1 6 "gt-mr-2" }} <a href=" {{ .RepoLink }} /commit/ {{ PathEscape .DefaultBranchBranch .Commit .ID .String }} "> {{ ShortSha .DefaultBranchBranch .Commit .ID .String }} </a> · <span class="commit-message"> {{ RenderCommitMessage $ .Context .DefaultBranchBranch .Commit .CommitMessage .RepoLink .Repository .ComposeMetas }} </span> · {{ .locale .Tr "org.repo_updated" }} {{ TimeSince .DefaultBranchBranch .Commit .Committer .When .locale }} </p>
2022-01-16 17:59:16 +03:00
</td>
<td class="right aligned overflow-visible">
{{ if and $ .IsWriter ( not $ .Repository .IsArchived ) ( not .IsDeleted ) }}
2023-04-30 18:08:51 +03:00
<button class="ui tertiary button show-create-branch-modal gt-mx-3"
data-modal="#create-branch-modal"
data-branch-from=" {{ $ .DefaultBranch }} "
data-branch-from-urlcomponent=" {{ PathEscapeSegments $ .DefaultBranch }} "
data-tooltip-content=" {{ $ .locale .Tr "repo.branch.new_branch_from" ( $ .DefaultBranch ) }} "
>
2022-01-16 17:59:16 +03:00
{{ svg "octicon-git-branch" }}
2022-11-24 15:29:43 +03:00
</button>
2022-01-16 17:59:16 +03:00
{{ end }}
2023-04-25 17:08:29 +03:00
{{ if .EnableFeed }}
2023-04-30 18:08:51 +03:00
<a role="button" class="ui tertiary button gt-mx-3" href=" {{ $ .FeedURL }} /rss/branch/ {{ PathEscapeSegments .DefaultBranch }} ">
2023-04-25 17:08:29 +03:00
{{ svg "octicon-rss" }}
</a>
{{ end }}
2022-07-31 19:57:02 +03:00
{{ if not $ .DisableDownloadSourceArchives }}
2023-04-30 18:08:51 +03:00
<div class="ui dropdown tertiary button gt-mx-3" data-tooltip-content=" {{ $ .locale .Tr "repo.branch.download" ( $ .DefaultBranch ) }} ">
2022-07-31 19:57:02 +03:00
{{ svg "octicon-download" }}
<div class="menu">
<a class="item archive-link" href=" {{ $ .RepoLink }} /archive/ {{ PathEscapeSegments $ .DefaultBranch }} .zip" rel="nofollow"> {{ svg "octicon-file-zip" }} ZIP</a>
<a class="item archive-link" href=" {{ $ .RepoLink }} /archive/ {{ PathEscapeSegments $ .DefaultBranch }} .tar.gz" rel="nofollow"> {{ svg "octicon-file-zip" }} TAR.GZ</a>
</div>
2023-04-30 18:08:51 +03:00
</div>
{{ end }}
{{ if and $ .IsWriter ( not $ .Repository .IsArchived ) ( not .IsDeleted ) ( not $ .IsMirror ) }}
<button class="ui tertiary button show-modal show-rename-branch-modal gt-mx-3"
data-modal="#rename-branch-modal"
data-old-branch-name=" {{ $ .DefaultBranch }} "
data-tooltip-content=" {{ $ .locale .Tr "repo.branch.rename" ( $ .DefaultBranch ) }} "
>
{{ svg "octicon-pencil" }}
2022-11-24 15:29:43 +03:00
</button>
2022-07-31 19:57:02 +03:00
{{ end }}
2022-01-16 17:59:16 +03:00
</td>
</tr>
</tbody>
</table>
</div>
{{ end }}
2017-10-26 03:49:16 +03:00
{{ if gt ( len .Branches ) 1 }}
<h4 class="ui top attached header">
2022-06-27 23:58:46 +03:00
{{ .locale .Tr "repo.branches" }}
2017-10-26 03:49:16 +03:00
</h4>
<div class="ui attached table segment">
<table class="ui very basic striped fixed table single line">
<tbody>
2019-07-30 18:02:58 +03:00
{{ range .Branches }}
2017-10-26 03:49:16 +03:00
{{ if ne .Name $ .DefaultBranch }}
<tr>
2019-07-26 14:21:14 +03:00
<td class="six wide">
2017-10-26 03:49:16 +03:00
{{ if .IsDeleted }}
2021-11-16 21:18:25 +03:00
<s><a href=" {{ $ .RepoLink }} /src/branch/ {{ PathEscapeSegments .Name }} "> {{ .Name }} </a></s>
2022-06-27 23:58:46 +03:00
<p class="info"> {{ $ .locale .Tr "repo.branch.deleted_by" .DeletedBranch .DeletedBy .Name }} {{ TimeSinceUnix .DeletedBranch .DeletedUnix $ .locale }} </p>
2017-10-26 03:49:16 +03:00
{{ else }}
2019-07-17 23:02:41 +03:00
{{ if .IsProtected }}
2020-09-11 23:19:00 +03:00
{{ svg "octicon-shield-lock" }}
2019-07-17 23:02:41 +03:00
{{ end }}
2021-11-16 21:18:25 +03:00
<a href=" {{ $ .RepoLink }} /src/branch/ {{ PathEscapeSegments .Name }} "> {{ .Name }} </a>
2023-02-13 20:59:59 +03:00
<p class="info gt-df gt-ac gt-my-2"> {{ svg "octicon-git-commit" 1 6 "gt-mr-2" }} <a href=" {{ $ .RepoLink }} /commit/ {{ PathEscape .Commit .ID .String }} "> {{ ShortSha .Commit .ID .String }} </a> · <span class="commit-message"> {{ RenderCommitMessage $ .Context .Commit .CommitMessage $ .RepoLink $ .Repository .ComposeMetas }} </span> · {{ $ .locale .Tr "org.repo_updated" }} {{ TimeSince .Commit .Committer .When $ .locale }} </p>
2017-10-26 03:49:16 +03:00
{{ end }}
2019-06-27 17:15:30 +03:00
</td>
2019-07-29 05:27:05 +03:00
<td class="three wide ui">
2022-01-16 17:59:16 +03:00
{{ if and ( not .IsDeleted ) $ .DefaultBranchBranch }}
2019-05-05 19:25:25 +03:00
<div class="commit-divergence">
<div class="bar-group">
<div class="count count-behind"> {{ .CommitsBehind }} </div>
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 16:25:49 +03:00
{{ / * old code bears 0 / 0 .0 = NaN output , so it might output in valid "width: NaNpx" , it just works and doesn ' t caues any problem . * / }}
<div class="bar bar-behind" style="width: {{ Eval 1 0 0 "*" .CommitsBehind "/" "(" .CommitsBehind "+" .CommitsAhead "+" 0.0 ")" }} %"></div>
2019-05-05 19:25:25 +03:00
</div>
<div class="bar-group">
<div class="count count-ahead"> {{ .CommitsAhead }} </div>
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 16:25:49 +03:00
<div class="bar bar-ahead" style="width: {{ Eval 1 0 0 "*" .CommitsAhead "/" "(" .CommitsBehind "+" .CommitsAhead "+" 0.0 ")" }} %"></div>
2019-05-05 19:25:25 +03:00
</div>
</div>
2019-06-27 17:15:30 +03:00
{{ end }}
</td>
2020-02-01 16:54:25 +03:00
<td class="three wide right aligned">
2019-06-27 17:15:30 +03:00
{{ if not .LatestPullRequest }}
2019-10-15 01:40:17 +03:00
{{ if .IsIncluded }}
2023-03-24 13:35:38 +03:00
<span class="ui orange large label" data-tooltip-content=" {{ $ .locale .Tr "repo.branch.included_desc" }} ">
2022-06-27 23:58:46 +03:00
{{ svg "octicon-git-pull-request" }} {{ $ .locale .Tr "repo.branch.included" }}
2023-03-14 08:11:38 +03:00
</span>
2019-10-15 01:40:17 +03:00
{{ else if and ( not .IsDeleted ) $ .AllowsPulls ( gt .CommitsAhead 0 ) }}
2021-11-16 21:18:25 +03:00
<a href=" {{ $ .RepoLink }} /compare/ {{ PathEscapeSegments $ .DefaultBranch }} ... {{ if ne $ .Repository .Owner .Name $ .Owner .Name }} {{ PathEscape $ .Owner .Name }} : {{ end }} {{ PathEscapeSegments .Name }} ">
2023-02-13 20:59:59 +03:00
<button id="new-pull-request" class="ui compact basic button gt-mr-0"> {{ if $ .CanPull }} {{ $ .locale .Tr "repo.pulls.compare_changes" }} {{ else }} {{ $ .locale .Tr "action.compare_branch" }} {{ end }} </button>
2020-01-07 20:06:14 +03:00
</a>
{{ end }}
{{ else if and .LatestPullRequest .HasMerged .MergeMovedOn }}
{{ if and ( not .IsDeleted ) $ .AllowsPulls ( gt .CommitsAhead 0 ) }}
2021-11-16 21:18:25 +03:00
<a href=" {{ $ .RepoLink }} /compare/ {{ PathEscapeSegments $ .DefaultBranch }} ... {{ if ne $ .Repository .Owner .Name $ .Owner .Name }} {{ $ .Owner .Name }} : {{ end }} {{ .Name | PathEscapeSegments }} ">
2023-02-13 20:59:59 +03:00
<button id="new-pull-request" class="ui compact basic button gt-mr-0"> {{ if $ .CanPull }} {{ $ .locale .Tr "repo.pulls.compare_changes" }} {{ else }} {{ $ .locale .Tr "action.compare_branch" }} {{ end }} </button>
2019-06-27 17:15:30 +03:00
</a>
{{ end }}
{{ else }}
2023-02-13 20:59:59 +03:00
<a href=" {{ .LatestPullRequest .Issue .Link }} " class="gt-vm ref-issue"> {{ if not .LatestPullRequest .IsSameRepo }} {{ .LatestPullRequest .BaseRepo .FullName }} {{ end }} # {{ .LatestPullRequest .Issue .Index }} </a>
2019-06-27 17:15:30 +03:00
{{ if .LatestPullRequest .HasMerged }}
2023-02-13 20:59:59 +03:00
<a href=" {{ .LatestPullRequest .Issue .Link }} " class="ui text-label purple large label gt-vm"> {{ svg "octicon-git-merge" 1 6 "gt-mr-2" }} {{ $ .locale .Tr "repo.pulls.merged" }} </a>
2019-06-27 17:15:30 +03:00
{{ else if .LatestPullRequest .Issue .IsClosed }}
2023-02-13 20:59:59 +03:00
<a href=" {{ .LatestPullRequest .Issue .Link }} " class="ui text-label red large label gt-vm"> {{ svg "octicon-git-pull-request" 1 6 "gt-mr-2" }} {{ $ .locale .Tr "repo.issues.closed_title" }} </a>
2019-06-27 17:15:30 +03:00
{{ else }}
2023-02-13 20:59:59 +03:00
<a href=" {{ .LatestPullRequest .Issue .Link }} " class="ui text-label green large label gt-vm"> {{ svg "octicon-git-pull-request" 1 6 "gt-mr-2" }} {{ $ .locale .Tr "repo.issues.open_title" }} </a>
2019-06-27 17:15:30 +03:00
{{ end }}
{{ end }}
2019-05-05 19:25:25 +03:00
</td>
2022-10-28 16:48:48 +03:00
<td class="three wide right aligned overflow-visible">
2021-05-24 17:57:46 +03:00
{{ if and $ .IsWriter ( not $ .Repository .IsArchived ) ( not .IsDeleted ) }}
2023-04-30 18:08:51 +03:00
<button class="ui tertiary button show-modal show-create-branch-modal gt-mx-3"
data-branch-from=" {{ .Name }} "
data-branch-from-urlcomponent=" {{ PathEscapeSegments .Name }} "
data-tooltip-content=" {{ $ .locale .Tr "repo.branch.new_branch_from" .Name }} "
data-modal="#create-branch-modal" data-name=" {{ .Name }} "
>
2021-05-24 17:57:46 +03:00
{{ svg "octicon-git-branch" }}
2022-11-24 15:29:43 +03:00
</button>
2021-05-24 17:57:46 +03:00
{{ end }}
2023-04-25 17:08:29 +03:00
{{ if $ .EnableFeed }}
2023-04-30 18:08:51 +03:00
<a role="button" class="ui tertiary button gt-mx-3" href=" {{ $ .FeedURL }} /rss/branch/ {{ PathEscapeSegments .Name }} ">
2023-04-25 17:08:29 +03:00
{{ svg "octicon-rss" }}
</a>
{{ end }}
2022-08-08 16:42:36 +03:00
{{ if and ( not .IsDeleted ) ( not $ .DisableDownloadSourceArchives ) }}
2023-04-30 18:08:51 +03:00
<div class="ui dropdown tertiary button gt-mx-3" data-tooltip-content=" {{ $ .locale .Tr "repo.branch.download" ( .Name ) }} ">
2021-04-03 11:37:32 +03:00
{{ svg "octicon-download" }}
2019-07-29 05:27:05 +03:00
<div class="menu">
2021-11-29 16:50:43 +03:00
<a class="item archive-link" href=" {{ $ .RepoLink }} /archive/ {{ PathEscapeSegments .Name }} .zip" rel="nofollow"> {{ svg "octicon-file-zip" }} ZIP</a>
<a class="item archive-link" href=" {{ $ .RepoLink }} /archive/ {{ PathEscapeSegments .Name }} .tar.gz" rel="nofollow"> {{ svg "octicon-file-zip" }} TAR.GZ</a>
2019-07-29 05:27:05 +03:00
</div>
2023-04-30 18:08:51 +03:00
</div>
{{ end }}
{{ if and $ .IsWriter ( not $ .Repository .IsArchived ) ( not .IsDeleted ) ( not $ .IsMirror ) }}
<button class="ui tertiary button show-modal show-rename-branch-modal gt-mx-3"
data-old-branch-name=" {{ .Name }} "
data-modal="#rename-branch-modal"
data-tooltip-content=" {{ $ .locale .Tr "repo.branch.rename" ( .Name ) }} "
>
{{ svg "octicon-pencil" }}
2022-11-24 15:29:43 +03:00
</button>
2017-10-26 03:49:16 +03:00
{{ end }}
2019-07-29 08:00:43 +03:00
{{ if and $ .IsWriter ( not $ .IsMirror ) ( not $ .Repository .IsArchived ) ( not .IsProtected ) }}
2019-07-29 05:27:05 +03:00
{{ if .IsDeleted }}
2023-04-30 18:08:51 +03:00
<button class="ui tertiary button undo-button gt-mx-3" data-url=" {{ $ .Link }} /restore?branch_id= {{ .DeletedBranch .ID }} &name= {{ .DeletedBranch .Name }} &page= {{ $ .Page .Paginater .Current }} " data-tooltip-content=" {{ $ .locale .Tr "repo.branch.restore" ( .Name ) }} ">
2022-11-24 15:29:43 +03:00
<span class="text blue">
{{ svg "octicon-reply" }}
</span>
</button>
2019-07-29 05:27:05 +03:00
{{ else }}
2023-04-30 18:08:51 +03:00
<button class="ui tertiary button delete-button delete-branch-button gt-mx-3" data-url=" {{ $ .Link }} /delete?name= {{ .Name }} &page= {{ $ .Page .Paginater .Current }} " data-tooltip-content=" {{ $ .locale .Tr "repo.branch.delete" ( .Name ) }} " data-name=" {{ .Name }} ">
2021-03-22 07:04:19 +03:00
{{ svg "octicon-trash" }}
2022-11-24 15:29:43 +03:00
</button>
2019-07-29 05:27:05 +03:00
{{ end }}
{{ end }}
</td>
2017-10-26 03:49:16 +03:00
</tr>
{{ end }}
{{ end }}
</tbody>
</table>
</div>
2021-01-19 07:07:38 +03:00
{{ template "base/paginate" . }}
2017-10-26 03:49:16 +03:00
{{ end }}
</div>
</div>
2023-04-24 14:08:59 +03:00
<div class="ui g-modal-confirm delete modal">
2023-04-23 12:24:19 +03:00
<div class="header">
2021-03-22 07:04:19 +03:00
{{ svg "octicon-trash" }}
2022-06-27 23:58:46 +03:00
{{ .locale .Tr "repo.branch.delete_html" }} <span class="name"></span>
2017-10-26 03:49:16 +03:00
</div>
<div class="content">
2022-06-27 23:58:46 +03:00
<p> {{ .locale .Tr "repo.branch.delete_desc" | Str2html }} </p>
2017-10-26 03:49:16 +03:00
</div>
2023-04-23 12:24:19 +03:00
{{ template "base/modal_actions_confirm" . }}
2017-10-26 03:49:16 +03:00
</div>
2021-05-24 17:57:46 +03:00
2023-04-30 18:08:51 +03:00
<div class="ui mini modal" id="create-branch-modal">
2021-05-24 17:57:46 +03:00
<div class="header">
2022-06-27 23:58:46 +03:00
{{ .locale .Tr "repo.branch.new_branch" }}
2021-05-24 17:57:46 +03:00
</div>
2023-04-30 18:08:51 +03:00
<form class="ui form" id="create-branch-form" action="" data-base-action=" {{ .Link }} /_new/branch/" method="post">
<div class="content">
2021-05-24 17:57:46 +03:00
{{ .CsrfTokenHtml }}
<div class="field">
2023-04-30 18:08:51 +03:00
{{ .locale .Tr "repo.branch.create_new_branch" }}
<span id="modal-create-branch-from-span"></span>
2021-05-24 17:57:46 +03:00
</div>
<div class="required field">
2022-06-27 23:58:46 +03:00
<label for="new_branch_name"> {{ .locale .Tr "repo.branch.name" }} </label>
2021-05-24 17:57:46 +03:00
<input id="new_branch_name" name="new_branch_name" required>
</div>
2023-04-30 18:08:51 +03:00
</div>
{{ template "base/modal_actions_confirm" ( dict "locale" $ .locale "ModalButtonTypes" "confirm" ) }}
</form>
</div>
2021-05-24 17:57:46 +03:00
2023-04-30 18:08:51 +03:00
<div class="ui mini modal" id="rename-branch-modal">
<div class="header">
{{ .locale .Tr "repo.settings.rename_branch" }}
2021-05-24 17:57:46 +03:00
</div>
2023-04-30 18:08:51 +03:00
<form class="ui form" action=" {{ $ .Repository .Link }} /settings/rename_branch" method="post">
<div class="content">
{{ .CsrfTokenHtml }}
<div class="field">
<span class="text" data-rename-branch-to=" {{ .locale .Tr "repo.branch.rename_branch_to" }} "></span>
</div>
<input name="from" type="hidden" required>
<div class="required field">
<input name="to" required>
</div>
</div>
{{ template "base/modal_actions_confirm" ( dict "locale" $ .locale "ModalButtonTypes" "confirm" ) }}
</form>
2021-05-24 17:57:46 +03:00
</div>
2017-10-26 03:49:16 +03:00
{{ template "base/footer" . }}