mirror of
https://github.com/go-gitea/gitea.git
synced 2025-07-18 00:01:32 -04:00
Compare commits
15 Commits
4fcf3a3f90
...
33e556e67a
Author | SHA1 | Date | |
---|---|---|---|
|
33e556e67a | ||
|
4d2d3bd65d | ||
|
43405c35f0 | ||
|
4de5cd9f36 | ||
|
a7e98d70b6 | ||
|
09d7377090 | ||
|
77f70bd5a3 | ||
|
c8c2a31818 | ||
|
1fcf96ad01 | ||
|
9ebf6424ee | ||
|
e7b560f3fe | ||
|
7f790c70b9 | ||
|
e7be610d57 | ||
|
dc9cebdf45 | ||
|
e3cffa70f9 |
@ -1,44 +1,133 @@
|
|||||||
extends: stylelint-config-standard
|
|
||||||
|
|
||||||
plugins:
|
plugins:
|
||||||
- stylelint-declaration-strict-value
|
- stylelint-declaration-strict-value
|
||||||
|
|
||||||
overrides:
|
overrides:
|
||||||
- files: ["**/*.less"]
|
- files: ["**/*.less"]
|
||||||
customSyntax: postcss-less
|
customSyntax: postcss-less
|
||||||
- files: ["**/*.less"]
|
|
||||||
rules:
|
|
||||||
scale-unlimited/declaration-strict-value: [color, {
|
|
||||||
ignoreValues: /^(inherit|transparent|unset|initial)$/
|
|
||||||
}]
|
|
||||||
- files: ["**/chroma/*", "**/codemirror/*", "**/standalone/*", "**/console/*"]
|
- files: ["**/chroma/*", "**/codemirror/*", "**/standalone/*", "**/console/*"]
|
||||||
rules:
|
rules:
|
||||||
scale-unlimited/declaration-strict-value: null
|
scale-unlimited/declaration-strict-value: null
|
||||||
|
|
||||||
rules:
|
rules:
|
||||||
alpha-value-notation: null
|
alpha-value-notation: null
|
||||||
|
annotation-no-unknown: true
|
||||||
|
at-rule-allowed-list: null
|
||||||
|
at-rule-disallowed-list: null
|
||||||
at-rule-empty-line-before: null
|
at-rule-empty-line-before: null
|
||||||
block-closing-brace-empty-line-before: null
|
at-rule-no-unknown: true
|
||||||
|
at-rule-no-vendor-prefix: true
|
||||||
|
at-rule-property-required-list: null
|
||||||
|
block-no-empty: true
|
||||||
color-function-notation: null
|
color-function-notation: null
|
||||||
|
color-hex-alpha: null
|
||||||
color-hex-length: null
|
color-hex-length: null
|
||||||
|
color-named: null
|
||||||
|
color-no-hex: null
|
||||||
|
color-no-invalid-hex: true
|
||||||
comment-empty-line-before: null
|
comment-empty-line-before: null
|
||||||
|
comment-no-empty: true
|
||||||
|
comment-pattern: null
|
||||||
|
comment-whitespace-inside: null
|
||||||
|
comment-word-disallowed-list: null
|
||||||
|
custom-media-pattern: null
|
||||||
|
custom-property-empty-line-before: null
|
||||||
|
custom-property-no-missing-var-function: true
|
||||||
|
custom-property-pattern: null
|
||||||
|
declaration-block-no-duplicate-custom-properties: true
|
||||||
|
declaration-block-no-duplicate-properties: [true, {ignore: [consecutive-duplicates-with-different-values]}]
|
||||||
declaration-block-no-redundant-longhand-properties: null
|
declaration-block-no-redundant-longhand-properties: null
|
||||||
|
declaration-block-no-shorthand-property-overrides: null
|
||||||
declaration-block-single-line-max-declarations: null
|
declaration-block-single-line-max-declarations: null
|
||||||
declaration-empty-line-before: null
|
declaration-empty-line-before: null
|
||||||
|
declaration-no-important: null
|
||||||
|
declaration-property-max-values: null
|
||||||
|
declaration-property-unit-allowed-list: null
|
||||||
|
declaration-property-unit-disallowed-list: null
|
||||||
|
declaration-property-value-allowed-list: null
|
||||||
|
declaration-property-value-disallowed-list: null
|
||||||
|
declaration-property-value-no-unknown: true
|
||||||
|
font-family-name-quotes: always-where-recommended
|
||||||
|
font-family-no-duplicate-names: true
|
||||||
|
font-family-no-missing-generic-family-keyword: true
|
||||||
|
font-weight-notation: null
|
||||||
|
function-allowed-list: null
|
||||||
|
function-calc-no-unspaced-operator: true
|
||||||
|
function-disallowed-list: null
|
||||||
|
function-linear-gradient-no-nonstandard-direction: true
|
||||||
|
function-name-case: lower
|
||||||
function-no-unknown: null
|
function-no-unknown: null
|
||||||
|
function-url-no-scheme-relative: null
|
||||||
|
function-url-quotes: always
|
||||||
|
function-url-scheme-allowed-list: null
|
||||||
|
function-url-scheme-disallowed-list: null
|
||||||
hue-degree-notation: null
|
hue-degree-notation: null
|
||||||
import-notation: string
|
import-notation: string
|
||||||
indentation: 2
|
keyframe-block-no-duplicate-selectors: true
|
||||||
max-line-length: null
|
keyframe-declaration-no-important: true
|
||||||
|
keyframe-selector-notation: null
|
||||||
|
keyframes-name-pattern: null
|
||||||
|
length-zero-no-unit: true
|
||||||
|
max-nesting-depth: null
|
||||||
|
media-feature-name-allowed-list: null
|
||||||
|
media-feature-name-disallowed-list: null
|
||||||
|
media-feature-name-no-unknown: true
|
||||||
|
media-feature-name-no-vendor-prefix: true
|
||||||
|
media-feature-name-unit-allowed-list: null
|
||||||
|
media-feature-name-value-allowed-list: null
|
||||||
|
media-feature-range-notation: null
|
||||||
|
named-grid-areas-no-invalid: true
|
||||||
no-descending-specificity: null
|
no-descending-specificity: null
|
||||||
|
no-duplicate-at-import-rules: true
|
||||||
|
no-duplicate-selectors: true
|
||||||
|
no-empty-source: true
|
||||||
|
no-invalid-double-slash-comments: true
|
||||||
no-invalid-position-at-import-rule: null
|
no-invalid-position-at-import-rule: null
|
||||||
number-leading-zero: never
|
no-irregular-whitespace: true
|
||||||
|
no-unknown-animations: null
|
||||||
number-max-precision: null
|
number-max-precision: null
|
||||||
|
property-allowed-list: null
|
||||||
|
property-disallowed-list: null
|
||||||
|
property-no-unknown: true
|
||||||
property-no-vendor-prefix: null
|
property-no-vendor-prefix: null
|
||||||
rule-empty-line-before: null
|
rule-empty-line-before: null
|
||||||
|
rule-selector-property-disallowed-list: null
|
||||||
|
scale-unlimited/declaration-strict-value: [color, {ignoreValues: /^(inherit|transparent|unset|initial|currentcolor)$/}]
|
||||||
|
selector-attribute-name-disallowed-list: null
|
||||||
|
selector-attribute-operator-allowed-list: null
|
||||||
|
selector-attribute-operator-disallowed-list: null
|
||||||
|
selector-attribute-quotes: always
|
||||||
selector-class-pattern: null
|
selector-class-pattern: null
|
||||||
|
selector-combinator-allowed-list: null
|
||||||
|
selector-combinator-disallowed-list: null
|
||||||
|
selector-disallowed-list: null
|
||||||
selector-id-pattern: null
|
selector-id-pattern: null
|
||||||
|
selector-max-attribute: null
|
||||||
|
selector-max-class: null
|
||||||
|
selector-max-combinators: null
|
||||||
|
selector-max-compound-selectors: null
|
||||||
|
selector-max-id: null
|
||||||
|
selector-max-pseudo-class: null
|
||||||
|
selector-max-specificity: null
|
||||||
|
selector-max-type: null
|
||||||
|
selector-max-universal: null
|
||||||
|
selector-nested-pattern: null
|
||||||
|
selector-no-qualifying-type: null
|
||||||
|
selector-no-vendor-prefix: true
|
||||||
|
selector-not-notation: null
|
||||||
|
selector-pseudo-class-allowed-list: null
|
||||||
|
selector-pseudo-class-disallowed-list: null
|
||||||
|
selector-pseudo-class-no-unknown: true
|
||||||
|
selector-pseudo-element-allowed-list: null
|
||||||
selector-pseudo-element-colon-notation: double
|
selector-pseudo-element-colon-notation: double
|
||||||
|
selector-pseudo-element-disallowed-list: null
|
||||||
|
selector-pseudo-element-no-unknown: true
|
||||||
|
selector-type-case: lower
|
||||||
|
selector-type-no-unknown: [true, {ignore: [custom-elements]}]
|
||||||
shorthand-property-no-redundant-values: true
|
shorthand-property-no-redundant-values: true
|
||||||
string-quotes: null
|
string-no-newline: true
|
||||||
value-no-vendor-prefix: null
|
time-min-milliseconds: null
|
||||||
|
unit-allowed-list: null
|
||||||
|
unit-disallowed-list: null
|
||||||
|
unit-no-unknown: true
|
||||||
|
value-keyword-case: null
|
||||||
|
value-no-vendor-prefix: [true, {ignoreValues: [box, inline-box]}]
|
||||||
|
13
CHANGELOG.md
13
CHANGELOG.md
@ -4,6 +4,19 @@ This changelog goes through all the changes that have been made in each release
|
|||||||
without substantial changes to our git log; to see the highlights of what has
|
without substantial changes to our git log; to see the highlights of what has
|
||||||
been added to each release, please refer to the [blog](https://blog.gitea.io).
|
been added to each release, please refer to the [blog](https://blog.gitea.io).
|
||||||
|
|
||||||
|
## [1.18.5](https://github.com/go-gitea/gitea/releases/tag/v1.18.5) - 2023-02-21
|
||||||
|
|
||||||
|
* ENHANCEMENTS
|
||||||
|
* Hide 2FA status from other members in organization members list (#22999) (#23023)
|
||||||
|
* BUGFIXES
|
||||||
|
* Add force_merge to merge request and fix checking mergable (#23010) (#23032)
|
||||||
|
* Use `--message=%s` for git commit message (#23028) (#23029)
|
||||||
|
* Render access log template as text instead of HTML (#23013) (#23025)
|
||||||
|
* Fix the Manually Merged form (#23015) (#23017)
|
||||||
|
* Use beforeCommit instead of baseCommit (#22949) (#22996)
|
||||||
|
* Display attachments of review comment when comment content is blank (#23035) (#23046)
|
||||||
|
* Return empty url for submodule tree entries (#23043) (#23048)
|
||||||
|
|
||||||
## [1.18.4](https://github.com/go-gitea/gitea/releases/tag/1.18.4) - 2023-02-20
|
## [1.18.4](https://github.com/go-gitea/gitea/releases/tag/1.18.4) - 2023-02-20
|
||||||
|
|
||||||
* SECURITY
|
* SECURITY
|
||||||
|
@ -299,9 +299,7 @@ known as the release freeze. All the feature pull requests should be
|
|||||||
merged before feature freeze. And, during the frozen period, a corresponding
|
merged before feature freeze. And, during the frozen period, a corresponding
|
||||||
release branch is open for fixes backported from main branch. Release candidates
|
release branch is open for fixes backported from main branch. Release candidates
|
||||||
are made during this period for user testing to
|
are made during this period for user testing to
|
||||||
obtain a final version that is maintained in this branch. A release is
|
obtain a final version that is maintained in this branch.
|
||||||
maintained by issuing patch releases to only correct critical problems
|
|
||||||
such as crashes or security issues.
|
|
||||||
|
|
||||||
Major release cycles are seasonal. They always begin on the 25th and end on
|
Major release cycles are seasonal. They always begin on the 25th and end on
|
||||||
the 24th (i.e., the 25th of December to March 24th).
|
the 24th (i.e., the 25th of December to March 24th).
|
||||||
@ -311,6 +309,16 @@ for the previous version. For example, if the latest, published release is
|
|||||||
v1.2, then minor changes for the previous release—e.g., v1.1.0 -> v1.1.1—are
|
v1.2, then minor changes for the previous release—e.g., v1.1.0 -> v1.1.1—are
|
||||||
still possible.
|
still possible.
|
||||||
|
|
||||||
|
The previous release gets fixes for:
|
||||||
|
|
||||||
|
- Security issues
|
||||||
|
- Critical bugs
|
||||||
|
- Regressions
|
||||||
|
- Build issues
|
||||||
|
- Necessary enhancements (including necessary UI/UX fixes)
|
||||||
|
|
||||||
|
The backported fixes should avoid breaking downgrade between minor releases as much as possible.
|
||||||
|
|
||||||
## Maintainers
|
## Maintainers
|
||||||
|
|
||||||
To make sure every PR is checked, we have [team
|
To make sure every PR is checked, we have [team
|
||||||
|
@ -64,5 +64,7 @@ CMD ["/bin/s6-svscan", "/etc/s6"]
|
|||||||
COPY docker/root /
|
COPY docker/root /
|
||||||
COPY --from=build-env /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea
|
COPY --from=build-env /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea
|
||||||
COPY --from=build-env /go/src/code.gitea.io/gitea/environment-to-ini /usr/local/bin/environment-to-ini
|
COPY --from=build-env /go/src/code.gitea.io/gitea/environment-to-ini /usr/local/bin/environment-to-ini
|
||||||
|
COPY --from=build-env /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete /etc/profile.d/gitea_bash_autocomplete.sh
|
||||||
RUN chmod 755 /usr/bin/entrypoint /app/gitea/gitea /usr/local/bin/gitea /usr/local/bin/environment-to-ini
|
RUN chmod 755 /usr/bin/entrypoint /app/gitea/gitea /usr/local/bin/gitea /usr/local/bin/environment-to-ini
|
||||||
RUN chmod 755 /etc/s6/gitea/* /etc/s6/openssh/* /etc/s6/.s6-svscan/*
|
RUN chmod 755 /etc/s6/gitea/* /etc/s6/openssh/* /etc/s6/.s6-svscan/*
|
||||||
|
RUN chmod 644 /etc/profile.d/gitea_bash_autocomplete.sh
|
||||||
|
@ -54,7 +54,9 @@ RUN chown git:git /var/lib/gitea /etc/gitea
|
|||||||
COPY docker/rootless /
|
COPY docker/rootless /
|
||||||
COPY --from=build-env --chown=root:root /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea
|
COPY --from=build-env --chown=root:root /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea
|
||||||
COPY --from=build-env --chown=root:root /go/src/code.gitea.io/gitea/environment-to-ini /usr/local/bin/environment-to-ini
|
COPY --from=build-env --chown=root:root /go/src/code.gitea.io/gitea/environment-to-ini /usr/local/bin/environment-to-ini
|
||||||
|
COPY --from=build-env /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete /etc/profile.d/gitea_bash_autocomplete.sh
|
||||||
RUN chmod 755 /usr/local/bin/docker-entrypoint.sh /usr/local/bin/docker-setup.sh /app/gitea/gitea /usr/local/bin/gitea /usr/local/bin/environment-to-ini
|
RUN chmod 755 /usr/local/bin/docker-entrypoint.sh /usr/local/bin/docker-setup.sh /app/gitea/gitea /usr/local/bin/gitea /usr/local/bin/environment-to-ini
|
||||||
|
RUN chmod 644 /etc/profile.d/gitea_bash_autocomplete.sh
|
||||||
|
|
||||||
#git:git
|
#git:git
|
||||||
USER 1000:1000
|
USER 1000:1000
|
||||||
|
17
contrib/autocompletion/README
Normal file
17
contrib/autocompletion/README
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
Bash and Zsh completion
|
||||||
|
=======================
|
||||||
|
|
||||||
|
From within the gitea root run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
source contrib/autocompletion/bash_autocomplete
|
||||||
|
```
|
||||||
|
|
||||||
|
or for zsh run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
source contrib/autocompletion/zsh_autocomplete
|
||||||
|
```
|
||||||
|
|
||||||
|
These scripts will check if gitea is on the path and if so add autocompletion for `gitea`. Or if not autocompletion will work for `./gitea`.
|
||||||
|
If gitea has been installed as a different program pass in the `PROG` environment variable to set the correct program name.
|
30
contrib/autocompletion/bash_autocomplete
Executable file
30
contrib/autocompletion/bash_autocomplete
Executable file
@ -0,0 +1,30 @@
|
|||||||
|
#! /bin/bash
|
||||||
|
# Heavily inspired by https://github.com/urfave/cli
|
||||||
|
|
||||||
|
_cli_bash_autocomplete() {
|
||||||
|
if [[ "${COMP_WORDS[0]}" != "source" ]]; then
|
||||||
|
local cur opts base
|
||||||
|
COMPREPLY=()
|
||||||
|
cur="${COMP_WORDS[COMP_CWORD]}"
|
||||||
|
if [[ "$cur" == "-"* ]]; then
|
||||||
|
opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} ${cur} --generate-bash-completion )
|
||||||
|
else
|
||||||
|
opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} --generate-bash-completion )
|
||||||
|
fi
|
||||||
|
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ -z "$PROG" ] && [ ! "$(command -v gitea &> /dev/null)" ] ; then
|
||||||
|
complete -o bashdefault -o default -o nospace -F _cli_bash_autocomplete gitea
|
||||||
|
elif [ -z "$PROG" ]; then
|
||||||
|
complete -o bashdefault -o default -o nospace -F _cli_bash_autocomplete ./gitea
|
||||||
|
complete -o bashdefault -o default -o nospace -F _cli_bash_autocomplete "$PWD/gitea"
|
||||||
|
else
|
||||||
|
complete -o bashdefault -o default -o nospace -F _cli_bash_autocomplete "$PROG"
|
||||||
|
unset PROG
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
30
contrib/autocompletion/zsh_autocomplete
Normal file
30
contrib/autocompletion/zsh_autocomplete
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#compdef ${PROG:=gitea}
|
||||||
|
|
||||||
|
|
||||||
|
# Heavily inspired by https://github.com/urfave/cli
|
||||||
|
|
||||||
|
_cli_zsh_autocomplete() {
|
||||||
|
|
||||||
|
local -a opts
|
||||||
|
local cur
|
||||||
|
cur=${words[-1]}
|
||||||
|
if [[ "$cur" == "-"* ]]; then
|
||||||
|
opts=("${(@f)$(_CLI_ZSH_AUTOCOMPLETE_HACK=1 ${words[@]:0:#words[@]-1} ${cur} --generate-bash-completion)}")
|
||||||
|
else
|
||||||
|
opts=("${(@f)$(_CLI_ZSH_AUTOCOMPLETE_HACK=1 ${words[@]:0:#words[@]-1} --generate-bash-completion)}")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "${opts[1]}" != "" ]]; then
|
||||||
|
_describe 'values' opts
|
||||||
|
else
|
||||||
|
_files
|
||||||
|
fi
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ -z $PROG ] ; then
|
||||||
|
compdef _cli_zsh_autocomplete gitea
|
||||||
|
else
|
||||||
|
compdef _cli_zsh_autocomplete $(basename $PROG)
|
||||||
|
fi
|
@ -18,7 +18,7 @@ params:
|
|||||||
description: Git with a cup of tea
|
description: Git with a cup of tea
|
||||||
author: The Gitea Authors
|
author: The Gitea Authors
|
||||||
website: https://docs.gitea.io
|
website: https://docs.gitea.io
|
||||||
version: 1.18.1
|
version: 1.18.5
|
||||||
minGoVersion: 1.19
|
minGoVersion: 1.19
|
||||||
goVersion: 1.20
|
goVersion: 1.20
|
||||||
minNodeVersion: 16
|
minNodeVersion: 16
|
||||||
|
@ -39,12 +39,20 @@ We recommend [Google HTML/CSS Style Guide](https://google.github.io/styleguide/h
|
|||||||
### Gitea specific guidelines:
|
### Gitea specific guidelines:
|
||||||
|
|
||||||
1. Every feature (Fomantic-UI/jQuery module) should be put in separate files/directories.
|
1. Every feature (Fomantic-UI/jQuery module) should be put in separate files/directories.
|
||||||
2. HTML ids and classes should use kebab-case.
|
2. HTML ids and classes should use kebab-case, it's preferred to contain 2-3 feature related keywords.
|
||||||
3. HTML ids and classes used in JavaScript should be unique for the whole project, and should contain 2-3 feature related keywords. We recommend to use the `js-` prefix for classes that are only used in JavaScript.
|
3. HTML ids and classes used in JavaScript should be unique for the whole project, and should contain 2-3 feature related keywords. We recommend to use the `js-` prefix for classes that are only used in JavaScript.
|
||||||
4. jQuery events across different features could use their own namespaces if there are potential conflicts.
|
4. CSS styling for classes provided by frameworks should not be overwritten. Always use new class names with 2-3 feature related keywords to overwrite framework styles. Gitea's helper CSS classes in `helpers.less` could be helpful.
|
||||||
5. CSS styling for classes provided by frameworks should not be overwritten. Always use new class-names with 2-3 feature related keywords to overwrite framework styles.
|
5. The backend can pass complex data to the frontend by using `ctx.PageData["myModuleData"] = map[]{}`, but do not expose whole models to the frontend to avoid leaking sensitive data.
|
||||||
6. The backend can pass complex data to the frontend by using `ctx.PageData["myModuleData"] = map[]{}`
|
6. Simple pages and SEO-related pages use Go HTML Template render to generate static Fomantic-UI HTML output. Complex pages can use Vue3.
|
||||||
7. Simple pages and SEO-related pages use Go HTML Template render to generate static Fomantic-UI HTML output. Complex pages can use Vue3.
|
7. Clarify variable types, prefer `elem.disabled = true` instead of `elem.setAttribute('disabled', 'anything')`, prefer `$el.prop('checked', var === 'yes')` instead of `$el.prop('checked', var)`.
|
||||||
|
8. Use semantic elements, prefer `<button class="ui button">` instead of `<div class="ui button">`.
|
||||||
|
9. Avoid unnecessary `!important` in CSS, add comments to explain why it's necessary if it can't be avoided.
|
||||||
|
|
||||||
|
### Accessibility / ARIA
|
||||||
|
|
||||||
|
In history, Gitea heavily uses Fomantic UI which is not an accessibility-friendly framework.
|
||||||
|
Gitea uses some patches to make Fomantic UI more accessible (see the `aria.js` and `aria.md`),
|
||||||
|
but there are still many problems which need a lot of work and time to fix.
|
||||||
|
|
||||||
### Framework Usage
|
### Framework Usage
|
||||||
|
|
||||||
|
@ -129,6 +129,16 @@ export GITEA_WORK_DIR=/var/lib/gitea/
|
|||||||
cp gitea /usr/local/bin/gitea
|
cp gitea /usr/local/bin/gitea
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Adding bash/zsh autocompletion (from 1.19)
|
||||||
|
|
||||||
|
A script to enable bash-completion can be found at [`contrib/autocompletion/bash_autocomplete`](https://raw.githubusercontent.com/go-gitea/gitea/main/contrib/autocompletion/bash_autocomplete). This can be copied to `/usr/share/bash-completion/completions/gitea`
|
||||||
|
or sourced within your `.bashrc`.
|
||||||
|
|
||||||
|
Similarly a script for zsh-completion can be found at [`contrib/autocompletion/zsh_autocomplete`](https://raw.githubusercontent.com/go-gitea/gitea/main/contrib/autocompletion/zsh_autocomplete). This can be copied to `/usr/share/zsh/_gitea` or sourced within your
|
||||||
|
`.zshrc`.
|
||||||
|
|
||||||
|
YMMV and these scripts may need further improvement.
|
||||||
|
|
||||||
## Running Gitea
|
## Running Gitea
|
||||||
|
|
||||||
After you complete the above steps, you can run Gitea two ways:
|
After you complete the above steps, you can run Gitea two ways:
|
||||||
|
@ -193,3 +193,13 @@ LDFLAGS="-linkmode external -extldflags '-static' $LDFLAGS" TAGS="netgo osusergo
|
|||||||
```
|
```
|
||||||
|
|
||||||
This can be combined with `CC`, `GOOS`, and `GOARCH` as above.
|
This can be combined with `CC`, `GOOS`, and `GOARCH` as above.
|
||||||
|
|
||||||
|
### Adding bash/zsh autocompletion (from 1.19)
|
||||||
|
|
||||||
|
A script to enable bash-completion can be found at [`contrib/autocompletion/bash_autocomplete`](https://raw.githubusercontent.com/go-gitea/gitea/main/contrib/autocompletion/bash_autocomplete). This should be altered as appropriate and can be `source` in your `.bashrc`
|
||||||
|
or copied as `/usr/share/bash-completion/completions/gitea`.
|
||||||
|
|
||||||
|
Similary a script for zsh-completion can be found at [`contrib/autocompletion/zsh_autocomplete`](https://raw.githubusercontent.com/go-gitea/gitea/main/contrib/autocompletion/zsh_autocomplete). This can be copied to `/usr/share/zsh/_gitea` or sourced within your
|
||||||
|
`.zshrc`.
|
||||||
|
|
||||||
|
YMMV and these scripts may need further improvement.
|
||||||
|
2
main.go
2
main.go
@ -113,6 +113,8 @@ arguments - which can alternatively be run by running the subcommand web.`
|
|||||||
setFlagsAndBeforeOnSubcommands(&app.Commands[i], defaultFlags, establishCustomPath)
|
setFlagsAndBeforeOnSubcommands(&app.Commands[i], defaultFlags, establishCustomPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
app.EnableBashCompletion = true
|
||||||
|
|
||||||
err := app.Run(os.Args)
|
err := app.Run(os.Args)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal("Failed to run app with %s: %v", os.Args, err)
|
log.Fatal("Failed to run app with %s: %v", os.Args, err)
|
||||||
|
@ -131,7 +131,7 @@ func CommitChangesWithArgs(repoPath string, args TrustedCmdArgs, opts CommitChan
|
|||||||
if opts.Author != nil {
|
if opts.Author != nil {
|
||||||
cmd.AddOptionFormat("--author='%s <%s>'", opts.Author.Name, opts.Author.Email)
|
cmd.AddOptionFormat("--author='%s <%s>'", opts.Author.Name, opts.Author.Email)
|
||||||
}
|
}
|
||||||
cmd.AddOptionValues("-m", opts.Message)
|
cmd.AddOptionFormat("--message=%s", opts.Message)
|
||||||
|
|
||||||
_, _, err := cmd.RunStdString(&RunOpts{Dir: repoPath})
|
_, _, err := cmd.RunStdString(&RunOpts{Dir: repoPath})
|
||||||
// No stderr but exit status 1 means nothing to commit.
|
// No stderr but exit status 1 means nothing to commit.
|
||||||
|
@ -316,9 +316,8 @@ func initRepoCommit(ctx context.Context, tmpPath string, repo *repo_model.Reposi
|
|||||||
return fmt.Errorf("git add --all: %w", err)
|
return fmt.Errorf("git add --all: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd := git.NewCommand(ctx, "commit").
|
cmd := git.NewCommand(ctx, "commit", "--message=Initial commit").
|
||||||
AddOptionFormat("--author='%s <%s>'", sig.Name, sig.Email).
|
AddOptionFormat("--author='%s <%s>'", sig.Name, sig.Email)
|
||||||
AddOptionValues("-m", "Initial commit")
|
|
||||||
|
|
||||||
sign, keyID, signer, _ := asymkey_service.SignInitialCommit(ctx, tmpPath, u)
|
sign, keyID, signer, _ := asymkey_service.SignInitialCommit(ctx, tmpPath, u)
|
||||||
if sign {
|
if sign {
|
||||||
|
241
package-lock.json
generated
241
package-lock.json
generated
@ -65,9 +65,8 @@
|
|||||||
"jsdom": "21.0.0",
|
"jsdom": "21.0.0",
|
||||||
"markdownlint-cli": "0.33.0",
|
"markdownlint-cli": "0.33.0",
|
||||||
"postcss-less": "6.0.0",
|
"postcss-less": "6.0.0",
|
||||||
"stylelint": "14.16.1",
|
"stylelint": "15.2.0",
|
||||||
"stylelint-config-standard": "29.0.0",
|
"stylelint-declaration-strict-value": "1.9.2",
|
||||||
"stylelint-declaration-strict-value": "1.9.1",
|
|
||||||
"svgo": "3.0.2",
|
"svgo": "3.0.2",
|
||||||
"updates": "13.2.7",
|
"updates": "13.2.7",
|
||||||
"vitest": "0.27.2"
|
"vitest": "0.27.2"
|
||||||
@ -297,10 +296,56 @@
|
|||||||
"jquery": ">= 1.7.x"
|
"jquery": ">= 1.7.x"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@csstools/css-parser-algorithms": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-B9/8PmOtU6nBiibJg0glnNktQDZ3rZnGn/7UmDfrm2vMtrdlXO3p7ErE95N0up80IRk9YEtB5jyj/TmQ1WH3dw==",
|
||||||
|
"dev": true,
|
||||||
|
"engines": {
|
||||||
|
"node": "^14 || ^16 || >=18"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/csstools"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@csstools/css-tokenizer": "^2.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@csstools/css-tokenizer": {
|
||||||
|
"version": "2.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.0.2.tgz",
|
||||||
|
"integrity": "sha512-prUTipz0NZH7Lc5wyBUy93NFy3QYDMVEQgSeZzNdpMbKRd6V2bgRFyJ+O0S0Dw0MXWuE/H9WXlJk3kzMZRHZ/g==",
|
||||||
|
"dev": true,
|
||||||
|
"engines": {
|
||||||
|
"node": "^14 || ^16 || >=18"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/csstools"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@csstools/media-query-list-parser": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-X2/OuzEbjaxhzm97UJ+95GrMeT29d1Ib+Pu+paGLuRWZnWRK9sI9r3ikmKXPWGA1C4y4JEdBEFpp9jEqCvLeRA==",
|
||||||
|
"dev": true,
|
||||||
|
"engines": {
|
||||||
|
"node": "^14 || ^16 || >=18"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/csstools"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@csstools/css-parser-algorithms": "^2.0.0",
|
||||||
|
"@csstools/css-tokenizer": "^2.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@csstools/selector-specificity": {
|
"node_modules/@csstools/selector-specificity": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz",
|
||||||
"integrity": "sha512-zJ6hb3FDgBbO8d2e83vg6zq7tNvDqSq9RwdwfzJ8tdm9JHNvANq2fqwyRn6mlpUb7CwTs5ILdUrGwi9Gk4vY5w==",
|
"integrity": "sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^14 || ^16 || >=18"
|
"node": "^14 || ^16 || >=18"
|
||||||
@ -1528,12 +1573,6 @@
|
|||||||
"integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
|
"integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/parse-json": {
|
|
||||||
"version": "4.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
|
|
||||||
"integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"node_modules/@types/tern": {
|
"node_modules/@types/tern": {
|
||||||
"version": "0.23.4",
|
"version": "0.23.4",
|
||||||
"resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz",
|
"resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz",
|
||||||
@ -2642,19 +2681,18 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/cosmiconfig": {
|
"node_modules/cosmiconfig": {
|
||||||
"version": "7.1.0",
|
"version": "8.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz",
|
||||||
"integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
|
"integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/parse-json": "^4.0.0",
|
|
||||||
"import-fresh": "^3.2.1",
|
"import-fresh": "^3.2.1",
|
||||||
|
"js-yaml": "^4.1.0",
|
||||||
"parse-json": "^5.0.0",
|
"parse-json": "^5.0.0",
|
||||||
"path-type": "^4.0.0",
|
"path-type": "^4.0.0"
|
||||||
"yaml": "^1.10.0"
|
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10"
|
"node": ">=14"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/cross-spawn": {
|
"node_modules/cross-spawn": {
|
||||||
@ -8343,16 +8381,20 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/stylelint": {
|
"node_modules/stylelint": {
|
||||||
"version": "14.16.1",
|
"version": "15.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz",
|
"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.2.0.tgz",
|
||||||
"integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==",
|
"integrity": "sha512-wjg5OLn8zQwjlj5cYUgyQpMWKzct42AG5dYlqkHRJQJqsystFFn3onqEc263KH4xfEI0W3lZCnlIhFfS64uwSA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@csstools/selector-specificity": "^2.0.2",
|
"@csstools/css-parser-algorithms": "^2.0.1",
|
||||||
|
"@csstools/css-tokenizer": "^2.0.1",
|
||||||
|
"@csstools/media-query-list-parser": "^2.0.1",
|
||||||
|
"@csstools/selector-specificity": "^2.1.1",
|
||||||
"balanced-match": "^2.0.0",
|
"balanced-match": "^2.0.0",
|
||||||
"colord": "^2.9.3",
|
"colord": "^2.9.3",
|
||||||
"cosmiconfig": "^7.1.0",
|
"cosmiconfig": "^8.0.0",
|
||||||
"css-functions-list": "^3.1.0",
|
"css-functions-list": "^3.1.0",
|
||||||
|
"css-tree": "^2.3.1",
|
||||||
"debug": "^4.3.4",
|
"debug": "^4.3.4",
|
||||||
"fast-glob": "^3.2.12",
|
"fast-glob": "^3.2.12",
|
||||||
"fastest-levenshtein": "^1.0.16",
|
"fastest-levenshtein": "^1.0.16",
|
||||||
@ -8361,7 +8403,7 @@
|
|||||||
"globby": "^11.1.0",
|
"globby": "^11.1.0",
|
||||||
"globjoin": "^0.1.4",
|
"globjoin": "^0.1.4",
|
||||||
"html-tags": "^3.2.0",
|
"html-tags": "^3.2.0",
|
||||||
"ignore": "^5.2.1",
|
"ignore": "^5.2.4",
|
||||||
"import-lazy": "^4.0.0",
|
"import-lazy": "^4.0.0",
|
||||||
"imurmurhash": "^0.1.4",
|
"imurmurhash": "^0.1.4",
|
||||||
"is-plain-object": "^5.0.0",
|
"is-plain-object": "^5.0.0",
|
||||||
@ -8371,7 +8413,7 @@
|
|||||||
"micromatch": "^4.0.5",
|
"micromatch": "^4.0.5",
|
||||||
"normalize-path": "^3.0.0",
|
"normalize-path": "^3.0.0",
|
||||||
"picocolors": "^1.0.0",
|
"picocolors": "^1.0.0",
|
||||||
"postcss": "^8.4.19",
|
"postcss": "^8.4.21",
|
||||||
"postcss-media-query-parser": "^0.2.3",
|
"postcss-media-query-parser": "^0.2.3",
|
||||||
"postcss-resolve-nested-selector": "^0.1.1",
|
"postcss-resolve-nested-selector": "^0.1.1",
|
||||||
"postcss-safe-parser": "^6.0.0",
|
"postcss-safe-parser": "^6.0.0",
|
||||||
@ -8385,51 +8427,30 @@
|
|||||||
"svg-tags": "^1.0.0",
|
"svg-tags": "^1.0.0",
|
||||||
"table": "^6.8.1",
|
"table": "^6.8.1",
|
||||||
"v8-compile-cache": "^2.3.0",
|
"v8-compile-cache": "^2.3.0",
|
||||||
"write-file-atomic": "^4.0.2"
|
"write-file-atomic": "^5.0.0"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"stylelint": "bin/stylelint.js"
|
"stylelint": "bin/stylelint.js"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
|
"node": "^14.13.1 || >=16.0.0"
|
||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"type": "opencollective",
|
"type": "opencollective",
|
||||||
"url": "https://opencollective.com/stylelint"
|
"url": "https://opencollective.com/stylelint"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/stylelint-config-recommended": {
|
|
||||||
"version": "9.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz",
|
|
||||||
"integrity": "sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ==",
|
|
||||||
"dev": true,
|
|
||||||
"peerDependencies": {
|
|
||||||
"stylelint": "^14.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/stylelint-config-standard": {
|
|
||||||
"version": "29.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz",
|
|
||||||
"integrity": "sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"stylelint-config-recommended": "^9.0.0"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"stylelint": "^14.14.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/stylelint-declaration-strict-value": {
|
"node_modules/stylelint-declaration-strict-value": {
|
||||||
"version": "1.9.1",
|
"version": "1.9.2",
|
||||||
"resolved": "https://registry.npmjs.org/stylelint-declaration-strict-value/-/stylelint-declaration-strict-value-1.9.1.tgz",
|
"resolved": "https://registry.npmjs.org/stylelint-declaration-strict-value/-/stylelint-declaration-strict-value-1.9.2.tgz",
|
||||||
"integrity": "sha512-iIkMh2ukIfSTtJoEDgGq5cqUyYWP8NExPk2YSGcePtFikb7KmJoSi0QYajiZRxge/PTbYspci7nIcrtArJlAsw==",
|
"integrity": "sha512-Z/2yr7g4tq2iGOUWhZLzHL2g2GJYJGcPkfjDh++zI8ukLxW0tcLGJjo64XYCDjja6YcECPDUWbpN+OAoAtAYvw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"css-values": "^0.1.0",
|
"css-values": "^0.1.0",
|
||||||
"shortcss": "^0.1.3"
|
"shortcss": "^0.1.3"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"stylelint": ">=7 <=14"
|
"stylelint": ">=7 <=15"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/stylelint/node_modules/balanced-match": {
|
"node_modules/stylelint/node_modules/balanced-match": {
|
||||||
@ -9778,16 +9799,16 @@
|
|||||||
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
|
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
|
||||||
},
|
},
|
||||||
"node_modules/write-file-atomic": {
|
"node_modules/write-file-atomic": {
|
||||||
"version": "4.0.2",
|
"version": "5.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.0.tgz",
|
||||||
"integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
|
"integrity": "sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"imurmurhash": "^0.1.4",
|
"imurmurhash": "^0.1.4",
|
||||||
"signal-exit": "^3.0.7"
|
"signal-exit": "^3.0.7"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
|
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/ws": {
|
"node_modules/ws": {
|
||||||
@ -9850,15 +9871,6 @@
|
|||||||
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
|
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/yaml": {
|
|
||||||
"version": "1.10.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
|
|
||||||
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
|
|
||||||
"dev": true,
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/yargs": {
|
"node_modules/yargs": {
|
||||||
"version": "17.3.1",
|
"version": "17.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz",
|
||||||
@ -10073,10 +10085,30 @@
|
|||||||
"integrity": "sha512-8Ro6D4GCrmOl41+6w4NFhEOpx8vjxwVRI69bulXsFDt49uVRKhLU5TnzEV7AmOJrylkVq+ugnYNMiGHBieeKUQ==",
|
"integrity": "sha512-8Ro6D4GCrmOl41+6w4NFhEOpx8vjxwVRI69bulXsFDt49uVRKhLU5TnzEV7AmOJrylkVq+ugnYNMiGHBieeKUQ==",
|
||||||
"requires": {}
|
"requires": {}
|
||||||
},
|
},
|
||||||
|
"@csstools/css-parser-algorithms": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-B9/8PmOtU6nBiibJg0glnNktQDZ3rZnGn/7UmDfrm2vMtrdlXO3p7ErE95N0up80IRk9YEtB5jyj/TmQ1WH3dw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {}
|
||||||
|
},
|
||||||
|
"@csstools/css-tokenizer": {
|
||||||
|
"version": "2.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.0.2.tgz",
|
||||||
|
"integrity": "sha512-prUTipz0NZH7Lc5wyBUy93NFy3QYDMVEQgSeZzNdpMbKRd6V2bgRFyJ+O0S0Dw0MXWuE/H9WXlJk3kzMZRHZ/g==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"@csstools/media-query-list-parser": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-X2/OuzEbjaxhzm97UJ+95GrMeT29d1Ib+Pu+paGLuRWZnWRK9sI9r3ikmKXPWGA1C4y4JEdBEFpp9jEqCvLeRA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {}
|
||||||
|
},
|
||||||
"@csstools/selector-specificity": {
|
"@csstools/selector-specificity": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz",
|
||||||
"integrity": "sha512-zJ6hb3FDgBbO8d2e83vg6zq7tNvDqSq9RwdwfzJ8tdm9JHNvANq2fqwyRn6mlpUb7CwTs5ILdUrGwi9Gk4vY5w==",
|
"integrity": "sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {}
|
"requires": {}
|
||||||
},
|
},
|
||||||
@ -10906,12 +10938,6 @@
|
|||||||
"integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
|
"integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@types/parse-json": {
|
|
||||||
"version": "4.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
|
|
||||||
"integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"@types/tern": {
|
"@types/tern": {
|
||||||
"version": "0.23.4",
|
"version": "0.23.4",
|
||||||
"resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz",
|
"resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz",
|
||||||
@ -11749,16 +11775,15 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"cosmiconfig": {
|
"cosmiconfig": {
|
||||||
"version": "7.1.0",
|
"version": "8.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz",
|
||||||
"integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
|
"integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/parse-json": "^4.0.0",
|
|
||||||
"import-fresh": "^3.2.1",
|
"import-fresh": "^3.2.1",
|
||||||
|
"js-yaml": "^4.1.0",
|
||||||
"parse-json": "^5.0.0",
|
"parse-json": "^5.0.0",
|
||||||
"path-type": "^4.0.0",
|
"path-type": "^4.0.0"
|
||||||
"yaml": "^1.10.0"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"cross-spawn": {
|
"cross-spawn": {
|
||||||
@ -15993,16 +16018,20 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"stylelint": {
|
"stylelint": {
|
||||||
"version": "14.16.1",
|
"version": "15.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz",
|
"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.2.0.tgz",
|
||||||
"integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==",
|
"integrity": "sha512-wjg5OLn8zQwjlj5cYUgyQpMWKzct42AG5dYlqkHRJQJqsystFFn3onqEc263KH4xfEI0W3lZCnlIhFfS64uwSA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@csstools/selector-specificity": "^2.0.2",
|
"@csstools/css-parser-algorithms": "^2.0.1",
|
||||||
|
"@csstools/css-tokenizer": "^2.0.1",
|
||||||
|
"@csstools/media-query-list-parser": "^2.0.1",
|
||||||
|
"@csstools/selector-specificity": "^2.1.1",
|
||||||
"balanced-match": "^2.0.0",
|
"balanced-match": "^2.0.0",
|
||||||
"colord": "^2.9.3",
|
"colord": "^2.9.3",
|
||||||
"cosmiconfig": "^7.1.0",
|
"cosmiconfig": "^8.0.0",
|
||||||
"css-functions-list": "^3.1.0",
|
"css-functions-list": "^3.1.0",
|
||||||
|
"css-tree": "^2.3.1",
|
||||||
"debug": "^4.3.4",
|
"debug": "^4.3.4",
|
||||||
"fast-glob": "^3.2.12",
|
"fast-glob": "^3.2.12",
|
||||||
"fastest-levenshtein": "^1.0.16",
|
"fastest-levenshtein": "^1.0.16",
|
||||||
@ -16011,7 +16040,7 @@
|
|||||||
"globby": "^11.1.0",
|
"globby": "^11.1.0",
|
||||||
"globjoin": "^0.1.4",
|
"globjoin": "^0.1.4",
|
||||||
"html-tags": "^3.2.0",
|
"html-tags": "^3.2.0",
|
||||||
"ignore": "^5.2.1",
|
"ignore": "^5.2.4",
|
||||||
"import-lazy": "^4.0.0",
|
"import-lazy": "^4.0.0",
|
||||||
"imurmurhash": "^0.1.4",
|
"imurmurhash": "^0.1.4",
|
||||||
"is-plain-object": "^5.0.0",
|
"is-plain-object": "^5.0.0",
|
||||||
@ -16021,7 +16050,7 @@
|
|||||||
"micromatch": "^4.0.5",
|
"micromatch": "^4.0.5",
|
||||||
"normalize-path": "^3.0.0",
|
"normalize-path": "^3.0.0",
|
||||||
"picocolors": "^1.0.0",
|
"picocolors": "^1.0.0",
|
||||||
"postcss": "^8.4.19",
|
"postcss": "^8.4.21",
|
||||||
"postcss-media-query-parser": "^0.2.3",
|
"postcss-media-query-parser": "^0.2.3",
|
||||||
"postcss-resolve-nested-selector": "^0.1.1",
|
"postcss-resolve-nested-selector": "^0.1.1",
|
||||||
"postcss-safe-parser": "^6.0.0",
|
"postcss-safe-parser": "^6.0.0",
|
||||||
@ -16035,7 +16064,7 @@
|
|||||||
"svg-tags": "^1.0.0",
|
"svg-tags": "^1.0.0",
|
||||||
"table": "^6.8.1",
|
"table": "^6.8.1",
|
||||||
"v8-compile-cache": "^2.3.0",
|
"v8-compile-cache": "^2.3.0",
|
||||||
"write-file-atomic": "^4.0.2"
|
"write-file-atomic": "^5.0.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"balanced-match": {
|
"balanced-match": {
|
||||||
@ -16052,26 +16081,10 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"stylelint-config-recommended": {
|
|
||||||
"version": "9.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz",
|
|
||||||
"integrity": "sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {}
|
|
||||||
},
|
|
||||||
"stylelint-config-standard": {
|
|
||||||
"version": "29.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz",
|
|
||||||
"integrity": "sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"stylelint-config-recommended": "^9.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"stylelint-declaration-strict-value": {
|
"stylelint-declaration-strict-value": {
|
||||||
"version": "1.9.1",
|
"version": "1.9.2",
|
||||||
"resolved": "https://registry.npmjs.org/stylelint-declaration-strict-value/-/stylelint-declaration-strict-value-1.9.1.tgz",
|
"resolved": "https://registry.npmjs.org/stylelint-declaration-strict-value/-/stylelint-declaration-strict-value-1.9.2.tgz",
|
||||||
"integrity": "sha512-iIkMh2ukIfSTtJoEDgGq5cqUyYWP8NExPk2YSGcePtFikb7KmJoSi0QYajiZRxge/PTbYspci7nIcrtArJlAsw==",
|
"integrity": "sha512-Z/2yr7g4tq2iGOUWhZLzHL2g2GJYJGcPkfjDh++zI8ukLxW0tcLGJjo64XYCDjja6YcECPDUWbpN+OAoAtAYvw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"css-values": "^0.1.0",
|
"css-values": "^0.1.0",
|
||||||
@ -16997,9 +17010,9 @@
|
|||||||
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
|
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
|
||||||
},
|
},
|
||||||
"write-file-atomic": {
|
"write-file-atomic": {
|
||||||
"version": "4.0.2",
|
"version": "5.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.0.tgz",
|
||||||
"integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
|
"integrity": "sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"imurmurhash": "^0.1.4",
|
"imurmurhash": "^0.1.4",
|
||||||
@ -17043,12 +17056,6 @@
|
|||||||
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
|
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"yaml": {
|
|
||||||
"version": "1.10.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
|
|
||||||
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"yargs": {
|
"yargs": {
|
||||||
"version": "17.3.1",
|
"version": "17.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz",
|
||||||
|
@ -65,9 +65,8 @@
|
|||||||
"jsdom": "21.0.0",
|
"jsdom": "21.0.0",
|
||||||
"markdownlint-cli": "0.33.0",
|
"markdownlint-cli": "0.33.0",
|
||||||
"postcss-less": "6.0.0",
|
"postcss-less": "6.0.0",
|
||||||
"stylelint": "14.16.1",
|
"stylelint": "15.2.0",
|
||||||
"stylelint-config-standard": "29.0.0",
|
"stylelint-declaration-strict-value": "1.9.2",
|
||||||
"stylelint-declaration-strict-value": "1.9.1",
|
|
||||||
"svgo": "3.0.2",
|
"svgo": "3.0.2",
|
||||||
"updates": "13.2.7",
|
"updates": "13.2.7",
|
||||||
"vitest": "0.27.2"
|
"vitest": "0.27.2"
|
||||||
|
@ -767,11 +767,18 @@ func MergePullRequest(ctx *context.APIContext) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
manuallMerge := repo_model.MergeStyle(form.Do) == repo_model.MergeStyleManuallyMerged
|
manuallyMerged := repo_model.MergeStyle(form.Do) == repo_model.MergeStyleManuallyMerged
|
||||||
force := form.ForceMerge != nil && *form.ForceMerge
|
|
||||||
|
mergeCheckType := pull_service.MergeCheckTypeGeneral
|
||||||
|
if form.MergeWhenChecksSucceed {
|
||||||
|
mergeCheckType = pull_service.MergeCheckTypeAuto
|
||||||
|
}
|
||||||
|
if manuallyMerged {
|
||||||
|
mergeCheckType = pull_service.MergeCheckTypeManually
|
||||||
|
}
|
||||||
|
|
||||||
// start with merging by checking
|
// start with merging by checking
|
||||||
if err := pull_service.CheckPullMergable(ctx, ctx.Doer, &ctx.Repo.Permission, pr, manuallMerge, force); err != nil {
|
if err := pull_service.CheckPullMergable(ctx, ctx.Doer, &ctx.Repo.Permission, pr, mergeCheckType, form.ForceMerge); err != nil {
|
||||||
if errors.Is(err, pull_service.ErrIsClosed) {
|
if errors.Is(err, pull_service.ErrIsClosed) {
|
||||||
ctx.NotFound()
|
ctx.NotFound()
|
||||||
} else if errors.Is(err, pull_service.ErrUserNotAllowedToMerge) {
|
} else if errors.Is(err, pull_service.ErrUserNotAllowedToMerge) {
|
||||||
@ -793,7 +800,7 @@ func MergePullRequest(ctx *context.APIContext) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// handle manually-merged mark
|
// handle manually-merged mark
|
||||||
if manuallMerge {
|
if manuallyMerged {
|
||||||
if err := pull_service.MergedManually(pr, ctx.Doer, ctx.Repo.GitRepo, form.MergeCommitID); err != nil {
|
if err := pull_service.MergedManually(pr, ctx.Doer, ctx.Repo.GitRepo, form.MergeCommitID); err != nil {
|
||||||
if models.IsErrInvalidMergeStyle(err) {
|
if models.IsErrInvalidMergeStyle(err) {
|
||||||
ctx.Error(http.StatusMethodNotAllowed, "Invalid merge style", fmt.Errorf("%s is not allowed an allowed merge style for this repository", repo_model.MergeStyle(form.Do)))
|
ctx.Error(http.StatusMethodNotAllowed, "Invalid merge style", fmt.Errorf("%s is not allowed an allowed merge style for this repository", repo_model.MergeStyle(form.Do)))
|
||||||
|
@ -926,11 +926,19 @@ func MergePullRequest(ctx *context.Context) {
|
|||||||
pr := issue.PullRequest
|
pr := issue.PullRequest
|
||||||
pr.Issue = issue
|
pr.Issue = issue
|
||||||
pr.Issue.Repo = ctx.Repo.Repository
|
pr.Issue.Repo = ctx.Repo.Repository
|
||||||
manualMerge := repo_model.MergeStyle(form.Do) == repo_model.MergeStyleManuallyMerged
|
|
||||||
forceMerge := form.ForceMerge != nil && *form.ForceMerge
|
manuallyMerged := repo_model.MergeStyle(form.Do) == repo_model.MergeStyleManuallyMerged
|
||||||
|
|
||||||
|
mergeCheckType := pull_service.MergeCheckTypeGeneral
|
||||||
|
if form.MergeWhenChecksSucceed {
|
||||||
|
mergeCheckType = pull_service.MergeCheckTypeAuto
|
||||||
|
}
|
||||||
|
if manuallyMerged {
|
||||||
|
mergeCheckType = pull_service.MergeCheckTypeManually
|
||||||
|
}
|
||||||
|
|
||||||
// start with merging by checking
|
// start with merging by checking
|
||||||
if err := pull_service.CheckPullMergable(ctx, ctx.Doer, &ctx.Repo.Permission, pr, manualMerge, forceMerge); err != nil {
|
if err := pull_service.CheckPullMergable(ctx, ctx.Doer, &ctx.Repo.Permission, pr, mergeCheckType, form.ForceMerge); err != nil {
|
||||||
switch {
|
switch {
|
||||||
case errors.Is(err, pull_service.ErrIsClosed):
|
case errors.Is(err, pull_service.ErrIsClosed):
|
||||||
if issue.IsPull {
|
if issue.IsPull {
|
||||||
@ -962,7 +970,7 @@ func MergePullRequest(ctx *context.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// handle manually-merged mark
|
// handle manually-merged mark
|
||||||
if manualMerge {
|
if manuallyMerged {
|
||||||
if err := pull_service.MergedManually(pr, ctx.Doer, ctx.Repo.GitRepo, form.MergeCommitID); err != nil {
|
if err := pull_service.MergedManually(pr, ctx.Doer, ctx.Repo.GitRepo, form.MergeCommitID); err != nil {
|
||||||
switch {
|
switch {
|
||||||
|
|
||||||
|
@ -230,7 +230,7 @@ func handlePull(pullID int64, sha string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := pull_service.CheckPullMergable(ctx, doer, &perm, pr, false, false); err != nil {
|
if err := pull_service.CheckPullMergable(ctx, doer, &perm, pr, pull_service.MergeCheckTypeGeneral, false); err != nil {
|
||||||
if errors.Is(pull_service.ErrUserNotAllowedToMerge, err) {
|
if errors.Is(pull_service.ErrUserNotAllowedToMerge, err) {
|
||||||
log.Info("%-v was scheduled to automerge by an unauthorized user", pr)
|
log.Info("%-v was scheduled to automerge by an unauthorized user", pr)
|
||||||
return
|
return
|
||||||
|
@ -604,7 +604,7 @@ type MergePullRequestForm struct {
|
|||||||
MergeMessageField string
|
MergeMessageField string
|
||||||
MergeCommitID string // only used for manually-merged
|
MergeCommitID string // only used for manually-merged
|
||||||
HeadCommitID string `json:"head_commit_id,omitempty"`
|
HeadCommitID string `json:"head_commit_id,omitempty"`
|
||||||
ForceMerge *bool `json:"force_merge,omitempty"`
|
ForceMerge bool `json:"force_merge,omitempty"`
|
||||||
MergeWhenChecksSucceed bool `json:"merge_when_checks_succeed,omitempty"`
|
MergeWhenChecksSucceed bool `json:"merge_when_checks_succeed,omitempty"`
|
||||||
DeleteBranchAfterMerge bool `json:"delete_branch_after_merge,omitempty"`
|
DeleteBranchAfterMerge bool `json:"delete_branch_after_merge,omitempty"`
|
||||||
}
|
}
|
||||||
|
@ -59,8 +59,16 @@ func AddToTaskQueue(pr *issues_model.PullRequest) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type MergeCheckType int
|
||||||
|
|
||||||
|
const (
|
||||||
|
MergeCheckTypeGeneral MergeCheckType = iota // general merge checks for "merge", "rebase", "squash", etc
|
||||||
|
MergeCheckTypeManually // Manually Merged button (mark a PR as merged manually)
|
||||||
|
MergeCheckTypeAuto // Auto Merge (Scheduled Merge) After Checks Succeed
|
||||||
|
)
|
||||||
|
|
||||||
// CheckPullMergable check if the pull mergable based on all conditions (branch protection, merge options, ...)
|
// CheckPullMergable check if the pull mergable based on all conditions (branch protection, merge options, ...)
|
||||||
func CheckPullMergable(stdCtx context.Context, doer *user_model.User, perm *access_model.Permission, pr *issues_model.PullRequest, manuallMerge, force bool) error {
|
func CheckPullMergable(stdCtx context.Context, doer *user_model.User, perm *access_model.Permission, pr *issues_model.PullRequest, mergeCheckType MergeCheckType, adminSkipProtectionCheck bool) error {
|
||||||
return db.WithTx(stdCtx, func(ctx context.Context) error {
|
return db.WithTx(stdCtx, func(ctx context.Context) error {
|
||||||
if pr.HasMerged {
|
if pr.HasMerged {
|
||||||
return ErrHasMerged
|
return ErrHasMerged
|
||||||
@ -80,8 +88,8 @@ func CheckPullMergable(stdCtx context.Context, doer *user_model.User, perm *acce
|
|||||||
return ErrUserNotAllowedToMerge
|
return ErrUserNotAllowedToMerge
|
||||||
}
|
}
|
||||||
|
|
||||||
if manuallMerge {
|
if mergeCheckType == MergeCheckTypeManually {
|
||||||
// don't check rules to "auto merge", doer is going to mark this pull as merged manually
|
// if doer is doing "manually merge" (mark as merged manually), do not check anything
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,14 +111,25 @@ func CheckPullMergable(stdCtx context.Context, doer *user_model.User, perm *acce
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if !force {
|
// Now the branch protection check failed, check whether the failure could be skipped (skip by setting err = nil)
|
||||||
return err
|
|
||||||
|
// * when doing Auto Merge (Scheduled Merge After Checks Succeed), skip the branch protection check
|
||||||
|
if mergeCheckType == MergeCheckTypeAuto {
|
||||||
|
err = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if isRepoAdmin, err2 := access_model.IsUserRepoAdmin(ctx, pr.BaseRepo, doer); err2 != nil {
|
// * if the doer is admin, they could skip the branch protection check
|
||||||
log.Error("Unable to check if %-v is a repo admin in %-v: %v", doer, pr.BaseRepo, err2)
|
if adminSkipProtectionCheck {
|
||||||
return err2
|
if isRepoAdmin, errCheckAdmin := access_model.IsUserRepoAdmin(ctx, pr.BaseRepo, doer); errCheckAdmin != nil {
|
||||||
} else if !isRepoAdmin {
|
log.Error("Unable to check if %-v is a repo admin in %-v: %v", doer, pr.BaseRepo, errCheckAdmin)
|
||||||
|
return errCheckAdmin
|
||||||
|
} else if isRepoAdmin {
|
||||||
|
err = nil // repo admin can skip the check, so clear the error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If there is still a branch protection check error, return it
|
||||||
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -533,7 +533,7 @@ func rawMerge(ctx context.Context, pr *issues_model.PullRequest, doer *user_mode
|
|||||||
if err := git.NewCommand(ctx, "commit").
|
if err := git.NewCommand(ctx, "commit").
|
||||||
AddArguments(signArgs...).
|
AddArguments(signArgs...).
|
||||||
AddOptionFormat("--author='%s <%s>'", sig.Name, sig.Email).
|
AddOptionFormat("--author='%s <%s>'", sig.Name, sig.Email).
|
||||||
AddOptionValues("-m", message).
|
AddOptionFormat("--message=%s", message).
|
||||||
Run(&git.RunOpts{
|
Run(&git.RunOpts{
|
||||||
Env: env,
|
Env: env,
|
||||||
Dir: tmpBasePath,
|
Dir: tmpBasePath,
|
||||||
@ -641,7 +641,7 @@ func rawMerge(ctx context.Context, pr *issues_model.PullRequest, doer *user_mode
|
|||||||
|
|
||||||
func commitAndSignNoAuthor(ctx context.Context, pr *issues_model.PullRequest, message string, signArgs git.TrustedCmdArgs, tmpBasePath string, env []string) error {
|
func commitAndSignNoAuthor(ctx context.Context, pr *issues_model.PullRequest, message string, signArgs git.TrustedCmdArgs, tmpBasePath string, env []string) error {
|
||||||
var outbuf, errbuf strings.Builder
|
var outbuf, errbuf strings.Builder
|
||||||
if err := git.NewCommand(ctx, "commit").AddArguments(signArgs...).AddOptionValues("-m", message).
|
if err := git.NewCommand(ctx, "commit").AddArguments(signArgs...).AddOptionFormat("--message=%s", message).
|
||||||
Run(&git.RunOpts{
|
Run(&git.RunOpts{
|
||||||
Env: env,
|
Env: env,
|
||||||
Dir: tmpBasePath,
|
Dir: tmpBasePath,
|
||||||
|
@ -85,6 +85,11 @@ func GetTreeBySHA(ctx context.Context, repo *repo_model.Repository, gitRepo *git
|
|||||||
if entries[e].IsDir() {
|
if entries[e].IsDir() {
|
||||||
copy(treeURL[copyPos:], entries[e].ID.String())
|
copy(treeURL[copyPos:], entries[e].ID.String())
|
||||||
tree.Entries[i].URL = string(treeURL)
|
tree.Entries[i].URL = string(treeURL)
|
||||||
|
} else if entries[e].IsSubModule() {
|
||||||
|
// In Github Rest API Version=2022-11-28, if a tree entry is a submodule,
|
||||||
|
// its url will be returned as an empty string.
|
||||||
|
// So the URL will be set to "" here.
|
||||||
|
tree.Entries[i].URL = ""
|
||||||
} else {
|
} else {
|
||||||
copy(blobURL[copyPos:], entries[e].ID.String())
|
copy(blobURL[copyPos:], entries[e].ID.String())
|
||||||
tree.Entries[i].URL = string(blobURL)
|
tree.Entries[i].URL = string(blobURL)
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
{{template "base/alert" .}}
|
{{template "base/alert" .}}
|
||||||
{{template "repo/sub_menu" .}}
|
{{template "repo/sub_menu" .}}
|
||||||
{{if .DefaultBranchBranch}}
|
{{if .DefaultBranchBranch}}
|
||||||
<h4 class="ui top attached header">
|
<h4 class="ui top attached header gt-mt-4">
|
||||||
{{.locale.Tr "repo.default_branch"}}
|
{{.locale.Tr "repo.default_branch"}}
|
||||||
</h4>
|
</h4>
|
||||||
|
|
||||||
|
@ -24,10 +24,10 @@
|
|||||||
{{svg "octicon-diff" 16 "gt-mr-2"}}{{.locale.Tr "repo.diff.stats_desc" .Diff.NumFiles .Diff.TotalAddition .Diff.TotalDeletion | Str2html}}
|
{{svg "octicon-diff" 16 "gt-mr-2"}}{{.locale.Tr "repo.diff.stats_desc" .Diff.NumFiles .Diff.TotalAddition .Diff.TotalDeletion | Str2html}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="diff-detail-actions gt-df gt-ac">
|
<div class="diff-detail-actions gt-df gt-ac gt-w-100">
|
||||||
{{if and .PageIsPullFiles $.SignedUserID (not .IsArchived)}}
|
{{if and .PageIsPullFiles $.SignedUserID (not .IsArchived)}}
|
||||||
<progress id="viewed-files-summary" class="gt-mr-2" value="{{.Diff.NumViewedFiles}}" max="{{.Diff.NumFiles}}"></progress>
|
<progress id="viewed-files-summary" class="gt-mr-2" value="{{.Diff.NumViewedFiles}}" max="{{.Diff.NumFiles}}"></progress>
|
||||||
<label for="viewed-files-summary" id="viewed-files-summary-label" class="gt-mr-3" data-text-changed-template="{{.locale.Tr "repo.pulls.viewed_files_label"}}">
|
<label for="viewed-files-summary" id="viewed-files-summary-label" class="gt-mr-3 gt-f1" data-text-changed-template="{{.locale.Tr "repo.pulls.viewed_files_label"}}">
|
||||||
{{.locale.Tr "repo.pulls.viewed_files_label" .Diff.NumViewedFiles .Diff.NumFiles}}
|
{{.locale.Tr "repo.pulls.viewed_files_label" .Diff.NumViewedFiles .Diff.NumFiles}}
|
||||||
</label>
|
</label>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
<div class="ui top right pointing dropdown custom" id="review-box">
|
<div id="review-box">
|
||||||
<div class="ui tiny green button btn-review gt-ml-2 gt-mr-0">
|
<button class="ui tiny green button gt-ml-2 gt-mr-0 js-btn-review">
|
||||||
{{.locale.Tr "repo.diff.review"}}
|
{{.locale.Tr "repo.diff.review"}}
|
||||||
<span class="ui small label review-comments-counter" data-pending-comment-number="{{.PendingCodeCommentNumber}}">{{.PendingCodeCommentNumber}}</span>
|
<span class="ui small label review-comments-counter" data-pending-comment-number="{{.PendingCodeCommentNumber}}">{{.PendingCodeCommentNumber}}</span>
|
||||||
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
</div>
|
</button>
|
||||||
<div class="menu review-box">
|
<div class="review-box-panel gt-hidden">
|
||||||
<div class="ui clearing segment">
|
<div class="ui segment">
|
||||||
<form class="ui form" action="{{.Link}}/reviews/submit" method="post">
|
<form class="ui form" action="{{.Link}}/reviews/submit" method="post">
|
||||||
{{.CsrfTokenHtml}}
|
{{.CsrfTokenHtml}}
|
||||||
<input type="hidden" name="commit_id" value="{{.AfterCommitID}}"/>
|
<input type="hidden" name="commit_id" value="{{.AfterCommitID}}"/>
|
||||||
|
@ -77,7 +77,7 @@
|
|||||||
<a href="{{.Repository.Link}}/find/{{.BranchNameSubURL}}" class="ui compact basic button">{{.locale.Tr "repo.find_file.go_to_file"}}</a>
|
<a href="{{.Repository.Link}}/find/{{.BranchNameSubURL}}" class="ui compact basic button">{{.locale.Tr "repo.find_file.go_to_file"}}</a>
|
||||||
{{end}}
|
{{end}}
|
||||||
{{if or .CanAddFile .CanUploadFile}}
|
{{if or .CanAddFile .CanUploadFile}}
|
||||||
<button class="ui basic small compact dropdown jump icon button gt-mr-2"{{if not .Repository.CanEnableEditor}} disabled{{end}}>
|
<button class="ui basic compact dropdown jump icon button gt-mr-2"{{if not .Repository.CanEnableEditor}} disabled{{end}}>
|
||||||
<span class="text">{{.locale.Tr "repo.editor.add_file"}}</span>
|
<span class="text">{{.locale.Tr "repo.editor.add_file"}}</span>
|
||||||
<div class="menu">
|
<div class="menu">
|
||||||
{{if .CanAddFile}}
|
{{if .CanAddFile}}
|
||||||
|
@ -399,7 +399,7 @@
|
|||||||
{{end}}
|
{{end}}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
{{if .Content}}
|
{{if or .Content .Attachments}}
|
||||||
<div class="timeline-item comment" id="{{.HashTag}}">
|
<div class="timeline-item comment" id="{{.HashTag}}">
|
||||||
<div class="content comment-container">
|
<div class="content comment-container">
|
||||||
<div class="ui top attached header comment-header gt-df gt-ac gt-sb">
|
<div class="ui top attached header comment-header gt-df gt-ac gt-sb">
|
||||||
@ -437,7 +437,7 @@
|
|||||||
{{end}}
|
{{end}}
|
||||||
{{if not $.Repository.IsArchived}}
|
{{if not $.Repository.IsArchived}}
|
||||||
{{template "repo/issue/view_content/add_reaction" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID)}}
|
{{template "repo/issue/view_content/add_reaction" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID)}}
|
||||||
{{template "repo/issue/view_content/context_menu" Dict "ctx" $ "item" . "delete" true "issue" true "diff" false "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}}
|
{{template "repo/issue/view_content/context_menu" Dict "ctx" $ "item" . "delete" false "issue" true "diff" false "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}}
|
||||||
{{end}}
|
{{end}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -129,6 +129,7 @@
|
|||||||
<div class="content">
|
<div class="content">
|
||||||
{{template "repo/pulls/status" .}}
|
{{template "repo/pulls/status" .}}
|
||||||
{{$canAutoMerge := false}}
|
{{$canAutoMerge := false}}
|
||||||
|
{{$showGeneralMergeForm := false}}
|
||||||
<div class="ui attached merge-section segment {{if not $.LatestCommitStatus}}no-header{{end}}">
|
<div class="ui attached merge-section segment {{if not $.LatestCommitStatus}}no-header{{end}}">
|
||||||
{{if .Issue.PullRequest.HasMerged}}
|
{{if .Issue.PullRequest.HasMerged}}
|
||||||
<div class="item text">
|
<div class="item text">
|
||||||
@ -320,6 +321,7 @@
|
|||||||
'textAutoMergeCancelSchedule': {{$.locale.Tr "repo.pulls.auto_merge_cancel_schedule"}},
|
'textAutoMergeCancelSchedule': {{$.locale.Tr "repo.pulls.auto_merge_cancel_schedule"}},
|
||||||
'textClearMergeMessage': {{$.locale.Tr "repo.pulls.clear_merge_message"}},
|
'textClearMergeMessage': {{$.locale.Tr "repo.pulls.clear_merge_message"}},
|
||||||
'textClearMergeMessageHint': {{$.locale.Tr "repo.pulls.clear_merge_message_hint"}},
|
'textClearMergeMessageHint': {{$.locale.Tr "repo.pulls.clear_merge_message_hint"}},
|
||||||
|
'textMergeCommitId': {{$.locale.Tr "repo.pulls.merge_commit_id"}},
|
||||||
|
|
||||||
'canMergeNow': {{$canMergeNow}},
|
'canMergeNow': {{$canMergeNow}},
|
||||||
'allOverridableChecksOk': {{not $notAllOverridableChecksOk}},
|
'allOverridableChecksOk': {{not $notAllOverridableChecksOk}},
|
||||||
@ -379,6 +381,7 @@
|
|||||||
window.config.pageData.pullRequestMergeForm = mergeForm;
|
window.config.pageData.pullRequestMergeForm = mergeForm;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
{{$showGeneralMergeForm = true}}
|
||||||
<div id="pull-request-merge-form"></div>
|
<div id="pull-request-merge-form"></div>
|
||||||
{{else}}
|
{{else}}
|
||||||
{{/* no merge style was set in repo setting: not or ($prUnit.PullRequestsConfig.AllowMerge ...) */}}
|
{{/* no merge style was set in repo setting: not or ($prUnit.PullRequestsConfig.AllowMerge ...) */}}
|
||||||
@ -452,30 +455,21 @@
|
|||||||
{{$.locale.Tr "repo.pulls.cannot_auto_merge_helper"}}
|
{{$.locale.Tr "repo.pulls.cannot_auto_merge_helper"}}
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
{{end}}
|
{{end}}{{/* end if: pull request status */}}
|
||||||
|
|
||||||
{{if $.StillCanManualMerge}}
|
{{if and $.StillCanManualMerge (not $showGeneralMergeForm)}}
|
||||||
<div class="ui divider"></div>
|
<div class="ui divider"></div>
|
||||||
<div class="ui form manually-merged-fields gt-hidden">
|
<div class="ui form">
|
||||||
<form action="{{.Link}}/merge" method="post">
|
<form action="{{.Link}}/merge" method="post">
|
||||||
{{.CsrfTokenHtml}}
|
{{.CsrfTokenHtml}}
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<input type="text" name="merge_commit_id" placeholder="{{$.locale.Tr "repo.pulls.merge_commit_id"}}">
|
<input type="text" name="merge_commit_id" placeholder="{{$.locale.Tr "repo.pulls.merge_commit_id"}}">
|
||||||
</div>
|
</div>
|
||||||
<button class="ui red button" type="submit" name="do" value="manually-merged">
|
<button class="ui red button" type="submit" name="do" value="manually-merged">
|
||||||
{{$.locale.Tr "repo.pulls.merge_manually"}}
|
{{$.locale.Tr "repo.pulls.merge_manually"}}
|
||||||
</button>
|
</button>
|
||||||
<button class="ui button merge-cancel">
|
|
||||||
{{$.locale.Tr "cancel"}}
|
|
||||||
</button>
|
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="ui red buttons merge-button">
|
|
||||||
<button class="ui button" data-do="manually-merged">
|
|
||||||
{{$.locale.Tr "repo.pulls.merge_manually"}}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
||||||
{{if and .ShowMergeInstructions .Issue.PullRequest.HeadRepo}}
|
{{if and .ShowMergeInstructions .Issue.PullRequest.HeadRepo}}
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
<input type="hidden" name="_csrf" :value="csrfToken">
|
<input type="hidden" name="_csrf" :value="csrfToken">
|
||||||
<input type="hidden" name="head_commit_id" v-model="mergeForm.pullHeadCommitID">
|
<input type="hidden" name="head_commit_id" v-model="mergeForm.pullHeadCommitID">
|
||||||
<input type="hidden" name="merge_when_checks_succeed" v-model="autoMergeWhenSucceed">
|
<input type="hidden" name="merge_when_checks_succeed" v-model="autoMergeWhenSucceed">
|
||||||
|
<input type="hidden" name="force_merge" v-model="forceMerge">
|
||||||
|
|
||||||
<template v-if="!mergeStyleDetail.hideMergeMessageTexts">
|
<template v-if="!mergeStyleDetail.hideMergeMessageTexts">
|
||||||
<div class="field">
|
<div class="field">
|
||||||
@ -36,6 +37,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<div class="field" v-if="mergeStyle === 'manually-merged'">
|
||||||
|
<input type="text" name="merge_commit_id" :placeholder="mergeForm.textMergeCommitId">
|
||||||
|
</div>
|
||||||
|
|
||||||
<button class="ui button" :class="mergeButtonStyleClass" type="submit" name="do" :value="mergeStyle">
|
<button class="ui button" :class="mergeButtonStyleClass" type="submit" name="do" :value="mergeStyle">
|
||||||
{{ mergeStyleDetail.textDoMerge }}
|
{{ mergeStyleDetail.textDoMerge }}
|
||||||
<template v-if="autoMergeWhenSucceed">
|
<template v-if="autoMergeWhenSucceed">
|
||||||
@ -127,6 +132,7 @@ export default {
|
|||||||
textDoMerge: '',
|
textDoMerge: '',
|
||||||
mergeTitleFieldText: '',
|
mergeTitleFieldText: '',
|
||||||
mergeMessageFieldText: '',
|
mergeMessageFieldText: '',
|
||||||
|
hideAutoMerge: false,
|
||||||
},
|
},
|
||||||
mergeStyleAllowedCount: 0,
|
mergeStyleAllowedCount: 0,
|
||||||
|
|
||||||
@ -137,7 +143,10 @@ export default {
|
|||||||
mergeButtonStyleClass() {
|
mergeButtonStyleClass() {
|
||||||
if (this.mergeForm.allOverridableChecksOk) return 'green';
|
if (this.mergeForm.allOverridableChecksOk) return 'green';
|
||||||
return this.autoMergeWhenSucceed ? 'blue' : 'red';
|
return this.autoMergeWhenSucceed ? 'blue' : 'red';
|
||||||
}
|
},
|
||||||
|
forceMerge() {
|
||||||
|
return this.mergeForm.canMergeNow && !this.mergeForm.allOverridableChecksOk;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
mergeStyle(val) {
|
mergeStyle(val) {
|
||||||
|
@ -1,8 +1,35 @@
|
|||||||
**This document is used as aria/a11y reference for future developers**
|
**This document is used as aria/a11y reference for future developers**
|
||||||
|
|
||||||
|
# Checkbox
|
||||||
|
|
||||||
|
## Accessibility-friendly Checkbox
|
||||||
|
|
||||||
|
The ideal checkboxes should be:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<label><input type="checkbox"> ... </label>
|
||||||
|
```
|
||||||
|
|
||||||
|
However, related styles aren't supported (not implemented) yet, so at the moment, almost all the checkboxes are still using Fomantic UI checkbox.
|
||||||
|
|
||||||
|
## Fomantic UI Checkbox
|
||||||
|
|
||||||
|
```html
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<input type="checkbox"> <!-- class "hidden" will be added by $.checkbox() -->
|
||||||
|
<label>...</label>
|
||||||
|
</div>
|
||||||
|
```
|
||||||
|
|
||||||
|
Then the JS `$.checkbox()` should be called to make it work with keyboard and label-clicking, then it works like the ideal checkboxes.
|
||||||
|
|
||||||
|
There is still a problem: Fomantic UI checkbox is not friendly to screen readers, so we add IDs to all the Fomantic UI checkboxes automatically by JS.
|
||||||
|
|
||||||
|
# Dropdown
|
||||||
|
|
||||||
## ARIA Dropdown
|
## ARIA Dropdown
|
||||||
|
|
||||||
There are different solutions:
|
There are different solutions:
|
||||||
* combobox + listbox + option
|
* combobox + listbox + option
|
||||||
* menu + menuitem
|
* menu + menuitem
|
||||||
|
|
||||||
@ -27,7 +54,7 @@ At the moment, `menu + menuitem` seems to work better with Fomantic UI Dropdown,
|
|||||||
<div class="ui dropdown"> <!-- focused here, then it's not perfect to use aria-activedescendant to point to the menu item -->
|
<div class="ui dropdown"> <!-- focused here, then it's not perfect to use aria-activedescendant to point to the menu item -->
|
||||||
<input type="hidden" ...>
|
<input type="hidden" ...>
|
||||||
<div class="text">Default</div>
|
<div class="text">Default</div>
|
||||||
<div class="menu transition hidden" tabindex="-1">
|
<div class="menu" tabindex="-1"> <!-- "transition hidden|visible" classes will be added by $.dropdown() and when the dropdown is working -->
|
||||||
<div class="item active selected">Default</div>
|
<div class="item active selected">Default</div>
|
||||||
<div class="item">...</div>
|
<div class="item">...</div>
|
||||||
</div>
|
</div>
|
||||||
@ -38,7 +65,7 @@ At the moment, `menu + menuitem` seems to work better with Fomantic UI Dropdown,
|
|||||||
<input type="hidden" ...>
|
<input type="hidden" ...>
|
||||||
<input class="search" autocomplete="off" tabindex="0"> <!-- focused here -->
|
<input class="search" autocomplete="off" tabindex="0"> <!-- focused here -->
|
||||||
<div class="text"></div>
|
<div class="text"></div>
|
||||||
<div class="menu transition visible" tabindex="-1">
|
<div class="menu" tabindex="-1"> <!-- "transition hidden|visible" classes will be added by $.dropdown() and when the dropdown is working -->
|
||||||
<div class="item selected">...</div>
|
<div class="item selected">...</div>
|
||||||
<div class="item">...</div>
|
<div class="item">...</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -60,6 +60,7 @@ export function initGlobalEnterQuickSubmit() {
|
|||||||
export function initGlobalButtonClickOnEnter() {
|
export function initGlobalButtonClickOnEnter() {
|
||||||
$(document).on('keypress', '.ui.button', (e) => {
|
$(document).on('keypress', '.ui.button', (e) => {
|
||||||
if (e.keyCode === 13 || e.keyCode === 32) { // enter key or space bar
|
if (e.keyCode === 13 || e.keyCode === 32) { // enter key or space bar
|
||||||
|
if (e.target.nodeName === 'BUTTON') return; // button already handles space&enter correctly
|
||||||
$(e.target).trigger('click');
|
$(e.target).trigger('click');
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
}
|
}
|
||||||
|
@ -470,7 +470,7 @@ export function initRepoPullRequestReview() {
|
|||||||
assignMenuAttributes(form.find('.menu'));
|
assignMenuAttributes(form.find('.menu'));
|
||||||
});
|
});
|
||||||
|
|
||||||
const $reviewBox = $('.review-box');
|
const $reviewBox = $('.review-box-panel');
|
||||||
if ($reviewBox.length === 1) {
|
if ($reviewBox.length === 1) {
|
||||||
(async () => {
|
(async () => {
|
||||||
// the editor's height is too large in some cases, and the panel cannot be scrolled with page now because there is `.repository .diff-detail-box.sticky { position: sticky; }`
|
// the editor's height is too large in some cases, and the panel cannot be scrolled with page now because there is `.repository .diff-detail-box.sticky { position: sticky; }`
|
||||||
@ -487,12 +487,12 @@ export function initRepoPullRequestReview() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$('.btn-review').on('click', function (e) {
|
$('.js-btn-review').on('click', function (e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
$(this).closest('.dropdown').find('.menu').toggle('visible'); // eslint-disable-line
|
toggleElem($(this).parent().find('.review-box-panel'));
|
||||||
}).closest('.dropdown').find('.close').on('click', function (e) {
|
}).parent().find('.review-box-panel .close').on('click', function (e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
$(this).closest('.menu').toggle('visible'); // eslint-disable-line
|
hideElem($(this).closest('.review-box-panel'));
|
||||||
});
|
});
|
||||||
|
|
||||||
$(document).on('click', 'a.add-code-comment', async function (e) {
|
$(document).on('click', 'a.add-code-comment', async function (e) {
|
||||||
|
@ -19,7 +19,7 @@ function assertShown(el, expectShown) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function elementsCall(el, func, ...args) {
|
function elementsCall(el, func, ...args) {
|
||||||
if (el instanceof String) {
|
if (typeof el === 'string' || el instanceof String) {
|
||||||
el = document.querySelectorAll(el);
|
el = document.querySelectorAll(el);
|
||||||
}
|
}
|
||||||
if (el instanceof Node) {
|
if (el instanceof Node) {
|
||||||
@ -34,6 +34,10 @@ function elementsCall(el, func, ...args) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param el string (selector), Node, NodeList, HTMLCollection, Array or jQuery
|
||||||
|
* @param force force=true to show or force=false to hide, undefined to toggle
|
||||||
|
*/
|
||||||
function toggleShown(el, force) {
|
function toggleShown(el, force) {
|
||||||
if (force === true) {
|
if (force === true) {
|
||||||
el.classList.remove('gt-hidden');
|
el.classList.remove('gt-hidden');
|
||||||
|
@ -226,7 +226,7 @@ body {
|
|||||||
|
|
||||||
@supports (overflow: overlay) {
|
@supports (overflow: overlay) {
|
||||||
body {
|
body {
|
||||||
overflow: overlay;
|
overflow: overlay; // stylelint-disable-line
|
||||||
scrollbar-gutter: stable;
|
scrollbar-gutter: stable;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2476,24 +2476,13 @@ table th[data-sortt-desc] {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* fix up SVG dropdown triangles because fomantic thinks they are icon fonts */
|
.ui.dropdown .svg.dropdown.icon,
|
||||||
/* see https://github.com/go-gitea/gitea/issues/14014 */
|
.svg.dropdown.icon {
|
||||||
.ui.dropdown > .dropdown.icon,
|
margin-top: 0 !important; // reset the "ui.selection.dropdown > .dropdown.icon {margin-top}", for the Issue Dependencies dropdown
|
||||||
.btn-review > .dropdown.icon {
|
margin-right: -.5rem !important; // fix up SVG dropdown triangles because Fomantic thinks they are icon fonts
|
||||||
height: auto !important;
|
height: auto; // reset the ".ui.dropdown > .dropdown.icon {height}", otherwise the icon would be too small
|
||||||
margin-left: .5rem !important;
|
|
||||||
margin-top: -1px !important;
|
|
||||||
margin-bottom: -1px !important;
|
|
||||||
margin-right: -.5rem !important;
|
|
||||||
}
|
}
|
||||||
.ui.button.dropdown > .dropdown.icon,
|
|
||||||
.btn-review > .dropdown.icon {
|
|
||||||
float: right !important;
|
|
||||||
|
|
||||||
@media (max-width: 480px) {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.ui.selection.dropdown > .search.icon,
|
.ui.selection.dropdown > .search.icon,
|
||||||
.ui.selection.dropdown > .delete.icon,
|
.ui.selection.dropdown > .delete.icon,
|
||||||
.ui.selection.dropdown > .dropdown.icon {
|
.ui.selection.dropdown > .dropdown.icon {
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.editor-toolbar {
|
.editor-toolbar {
|
||||||
opacity: 1 !important;
|
max-width: calc(100vw - 80px);
|
||||||
border-color: var(--color-secondary);
|
border-color: var(--color-secondary);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ each(@fonts, {
|
|||||||
font-family: @family;
|
font-family: @family;
|
||||||
src: @src;
|
src: @src;
|
||||||
font-weight: @weight;
|
font-weight: @weight;
|
||||||
unicode-range: ~"U+11??, U+2E80-4DBF, U+4E00-9FFF, U+A960-A97F, U+AC00-D7FF, U+F900-FAFF, U+FE00-FE6F, U+FF00-FFEF, U+1F2??, U+2????";
|
unicode-range: U+11??, U+2E80-4DBF, U+4E00-9FFF, U+A960-A97F, U+AC00-D7FF, U+F900-FAFF, U+FE00-FE6F, U+FF00-FFEF, U+1F2??, U+2????;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,6 +93,10 @@
|
|||||||
&.teams,
|
&.teams,
|
||||||
&.profile {
|
&.profile {
|
||||||
.members {
|
.members {
|
||||||
|
a:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
.ui.avatar {
|
.ui.avatar {
|
||||||
width: 48px;
|
width: 48px;
|
||||||
height: 48px;
|
height: 48px;
|
||||||
|
@ -2864,11 +2864,6 @@
|
|||||||
margin-top: 10px;
|
margin-top: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.repo-button-row .dropdown > .dropdown.icon {
|
|
||||||
margin-left: .25rem !important;
|
|
||||||
margin-right: 0 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.wiki .repo-button-row {
|
.wiki .repo-button-row {
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
@ -70,7 +70,7 @@
|
|||||||
max-width: 1000px;
|
max-width: 1000px;
|
||||||
|
|
||||||
@media @mediaSm {
|
@media @mediaSm {
|
||||||
max-width: auto;
|
max-width: none;
|
||||||
padding: .75rem !important;
|
padding: .75rem !important;
|
||||||
|
|
||||||
.code-comment-buttons {
|
.code-comment-buttons {
|
||||||
@ -220,47 +220,45 @@ a.blob-excerpt:hover {
|
|||||||
|
|
||||||
// See the comment of createCommentEasyMDE() for the review editor
|
// See the comment of createCommentEasyMDE() for the review editor
|
||||||
// EasyMDE's options can not handle minHeight & maxHeight together correctly, we have to set minHeight in JS code
|
// EasyMDE's options can not handle minHeight & maxHeight together correctly, we have to set minHeight in JS code
|
||||||
#review-box .CodeMirror-scroll {
|
.review-box-panel .CodeMirror-scroll {
|
||||||
min-height: 80px;
|
min-height: 80px;
|
||||||
max-height: calc(100vh - 360px);
|
max-height: calc(100vh - 360px);
|
||||||
}
|
}
|
||||||
|
|
||||||
@media @mediaSm {
|
@media @mediaSm {
|
||||||
#review-box > .menu {
|
.review-box-panel .CodeMirror-scroll {
|
||||||
> .ui.segment {
|
|
||||||
width: 94vw;
|
|
||||||
}
|
|
||||||
|
|
||||||
.editor-toolbar {
|
|
||||||
overflow-x: auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#review-box .CodeMirror-scroll {
|
|
||||||
max-width: calc(100vw - 70px);
|
max-width: calc(100vw - 70px);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media @mediaMd {
|
@media @mediaMd {
|
||||||
#review-box .CodeMirror-scroll {
|
.review-box-panel .CodeMirror-scroll {
|
||||||
max-width: 700px;
|
max-width: 700px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media @mediaLg {
|
@media @mediaLg {
|
||||||
#review-box .CodeMirror-scroll {
|
.review-box-panel .CodeMirror-scroll {
|
||||||
max-width: 800px;
|
max-width: 800px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media @mediaXl {
|
@media @mediaXl {
|
||||||
#review-box .CodeMirror-scroll {
|
.review-box-panel .CodeMirror-scroll {
|
||||||
max-width: 900px;
|
max-width: 900px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.review-box > .segment {
|
#review-box {
|
||||||
border: none !important;
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.review-box-panel {
|
||||||
|
position: absolute;
|
||||||
|
min-width: max-content;
|
||||||
|
top: 45px;
|
||||||
|
right: -5px;
|
||||||
|
z-index: 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
#review-box .review-comments-counter {
|
#review-box .review-comments-counter {
|
||||||
|
@ -281,8 +281,6 @@
|
|||||||
table {
|
table {
|
||||||
display: block;
|
display: block;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
width: -webkit-max-content;
|
|
||||||
width: -moz-max-content;
|
|
||||||
width: max-content;
|
width: max-content;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.tippy-box[data-theme="menu"] {
|
.tippy-box[data-theme="menu"] {
|
||||||
background-color: none;
|
background-color: transparent;
|
||||||
color: var(--color-tooltip-text);
|
color: var(--color-tooltip-text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user