Merge branch 'master' into master

This commit is contained in:
Lunny Xiao 2018-03-07 23:57:36 +08:00 committed by GitHub
commit 20ed1e949e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
50 changed files with 1362 additions and 307 deletions

View File

@ -339,6 +339,7 @@ func TestCommitRepoAction(t *testing.T) {
s.action.ActUserID = user.ID
s.action.RepoID = repo.ID
s.action.Repo = repo
s.action.IsPrivate = repo.IsPrivate
testCorrectRepoAction(t, s.commitRepoActionOptions, &s.action)

View File

@ -11,10 +11,12 @@ import (
"os"
"path"
gouuid "github.com/satori/go.uuid"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
api "code.gitea.io/sdk/gitea"
"github.com/go-xorm/xorm"
gouuid "github.com/satori/go.uuid"
)
// Attachment represent a attachment of issue/comment/release.
@ -39,6 +41,20 @@ func (a *Attachment) IncreaseDownloadCount() error {
return nil
}
// APIFormat converts models.Attachment to api.Attachment
func (a *Attachment) APIFormat() *api.Attachment {
size, _ := a.Size()
return &api.Attachment{
ID: a.ID,
Name: a.Name,
Created: a.CreatedUnix.AsTime(),
DownloadCount: a.DownloadCount,
Size: size,
UUID: a.UUID,
DownloadURL: a.DownloadURL(),
}
}
// AttachmentLocalPath returns where attachment is stored in local file
// system based on given UUID.
func AttachmentLocalPath(uuid string) string {
@ -50,6 +66,20 @@ func (a *Attachment) LocalPath() string {
return AttachmentLocalPath(a.UUID)
}
// Size returns the file's size of the attachment
func (a *Attachment) Size() (int64, error) {
fi, err := os.Stat(a.LocalPath())
if err != nil {
return 0, err
}
return fi.Size(), nil
}
// DownloadURL returns the download url of the attached file
func (a *Attachment) DownloadURL() string {
return fmt.Sprintf("%sattachments/%s", setting.AppURL, a.UUID)
}
// NewAttachment creates a new attachment object.
func NewAttachment(name string, buf []byte, file multipart.File) (_ *Attachment, err error) {
attach := &Attachment{
@ -81,6 +111,22 @@ func NewAttachment(name string, buf []byte, file multipart.File) (_ *Attachment,
return attach, nil
}
// GetAttachmentByID returns attachment by given id
func GetAttachmentByID(id int64) (*Attachment, error) {
return getAttachmentByID(x, id)
}
func getAttachmentByID(e Engine, id int64) (*Attachment, error) {
attach := &Attachment{ID: id}
if has, err := e.Get(attach); err != nil {
return nil, err
} else if !has {
return nil, ErrAttachmentNotExist{ID: id, UUID: ""}
}
return attach, nil
}
func getAttachmentByUUID(e Engine, uuid string) (*Attachment, error) {
attach := &Attachment{UUID: uuid}
has, err := e.Get(attach)
@ -180,3 +226,20 @@ func DeleteAttachmentsByComment(commentID int64, remove bool) (int, error) {
return DeleteAttachments(attachments, remove)
}
// UpdateAttachment updates the given attachment in database
func UpdateAttachment(atta *Attachment) error {
return updateAttachment(x, atta)
}
func updateAttachment(e Engine, atta *Attachment) error {
var sess *xorm.Session
if atta.ID != 0 && atta.UUID == "" {
sess = e.ID(atta.ID)
} else {
// Use uuid only if id is not set and uuid is set
sess = e.Where("uuid = ?", atta.UUID)
}
_, err := sess.Cols("name", "issue_id", "release_id", "comment_id", "download_count").Update(atta)
return err
}

View File

@ -58,3 +58,32 @@ func TestDeleteAttachments(t *testing.T) {
assert.True(t, IsErrAttachmentNotExist(err))
assert.Nil(t, attachment)
}
func TestGetAttachmentByID(t *testing.T) {
assert.NoError(t, PrepareTestDatabase())
attach, err := GetAttachmentByID(1)
assert.NoError(t, err)
assert.Equal(t, "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11", attach.UUID)
}
func TestAttachment_DownloadURL(t *testing.T) {
attach := &Attachment{
UUID: "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11",
ID: 1,
}
assert.Equal(t, "https://try.gitea.io/attachments/a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11", attach.DownloadURL())
}
func TestUpdateAttachment(t *testing.T) {
assert.NoError(t, PrepareTestDatabase())
attach, err := GetAttachmentByID(1)
assert.NoError(t, err)
assert.Equal(t, "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11", attach.UUID)
attach.Name = "new_name"
assert.NoError(t, UpdateAttachment(attach))
AssertExistsAndLoadBean(t, &Attachment{Name: "new_name"})
}

View File

@ -374,7 +374,11 @@ func ParseCommitWithSignature(c *git.Commit) *CommitVerification {
//Find Committer account
committer, err := GetUserByEmail(c.Committer.Email) //This find the user by primary email or activated email so commit will not be valid if email is not
if err != nil { //Skipping not user for commiter
log.Error(3, "NoCommitterAccount: %v", err)
// We can expect this to often be an ErrUserNotExist. in the case
// it is not, however, it is important to log it.
if !IsErrUserNotExist(err) {
log.Error(3, "GetUserByEmail: %v", err)
}
return &CommitVerification{
Verified: false,
Reason: "gpg.error.no_committer_account",

View File

@ -219,6 +219,66 @@ Please try to upgrade to a lower version (>= v0.6.0) first, then upgrade to curr
return nil
}
func dropTableColumns(x *xorm.Engine, tableName string, columnNames ...string) (err error) {
if tableName == "" || len(columnNames) == 0 {
return nil
}
switch {
case setting.UseSQLite3:
log.Warn("Unable to drop columns in SQLite")
case setting.UseMySQL, setting.UseTiDB, setting.UsePostgreSQL:
cols := ""
for _, col := range columnNames {
if cols != "" {
cols += ", "
}
cols += "DROP COLUMN `" + col + "`"
}
if _, err := x.Exec(fmt.Sprintf("ALTER TABLE `%s` %s", tableName, columnNames)); err != nil {
return fmt.Errorf("Drop table `%s` columns %v: %v", tableName, columnNames, err)
}
case setting.UseMSSQL:
sess := x.NewSession()
defer sess.Close()
if err = sess.Begin(); err != nil {
return err
}
cols := ""
for _, col := range columnNames {
if cols != "" {
cols += ", "
}
cols += "`" + strings.ToLower(col) + "`"
}
sql := fmt.Sprintf("SELECT Name FROM SYS.DEFAULT_CONSTRAINTS WHERE PARENT_OBJECT_ID = OBJECT_ID('%[1]s') AND PARENT_COLUMN_ID IN (SELECT column_id FROM sys.columns WHERE lower(NAME) IN (%[2]s) AND object_id = OBJECT_ID('%[1]s'))",
tableName, strings.Replace(cols, "`", "'", -1))
constraints := make([]string, 0)
if err := sess.SQL(sql).Find(&constraints); err != nil {
sess.Rollback()
return fmt.Errorf("Find constraints: %v", err)
}
for _, constraint := range constraints {
if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` DROP CONSTRAINT `%s`", tableName, constraint)); err != nil {
sess.Rollback()
return fmt.Errorf("Drop table `%s` constraint `%s`: %v", tableName, constraint, err)
}
}
if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` DROP COLUMN %s", tableName, cols)); err != nil {
sess.Rollback()
return fmt.Errorf("Drop table `%s` columns %v: %v", tableName, columnNames, err)
}
return sess.Commit()
default:
log.Fatal(4, "Unrecognized DB")
}
return nil
}
func fixLocaleFileLoadPanic(_ *xorm.Engine) error {
cfg, err := ini.Load(setting.CustomConf)
if err != nil {

View File

@ -5,29 +5,9 @@
package migrations
import (
"fmt"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
"github.com/go-xorm/xorm"
)
func removeIsOwnerColumnFromOrgUser(x *xorm.Engine) (err error) {
switch {
case setting.UseSQLite3:
log.Warn("Unable to drop columns in SQLite")
case setting.UseMySQL, setting.UseTiDB, setting.UsePostgreSQL:
if _, err := x.Exec("ALTER TABLE org_user DROP COLUMN is_owner, DROP COLUMN num_teams"); err != nil {
return fmt.Errorf("DROP COLUMN org_user.is_owner, org_user.num_teams: %v", err)
}
case setting.UseMSSQL:
if _, err := x.Exec("ALTER TABLE org_user DROP COLUMN is_owner, num_teams"); err != nil {
return fmt.Errorf("DROP COLUMN org_user.is_owner, org_user.num_teams: %v", err)
}
default:
log.Fatal(4, "Unrecognized DB")
}
return nil
return dropTableColumns(x, "org_user", "is_owner", "num_teams")
}

View File

@ -53,7 +53,7 @@ func (r *Release) loadAttributes(e Engine) error {
return err
}
}
return nil
return GetReleaseAttachments(r)
}
// LoadAttributes load repo and publisher attributes for a release
@ -79,6 +79,10 @@ func (r *Release) TarURL() string {
// APIFormat convert a Release to api.Release
func (r *Release) APIFormat() *api.Release {
assets := make([]*api.Attachment, 0)
for _, att := range r.Attachments {
assets = append(assets, att.APIFormat())
}
return &api.Release{
ID: r.ID,
TagName: r.TagName,
@ -92,6 +96,7 @@ func (r *Release) APIFormat() *api.Release {
CreatedAt: r.CreatedUnix.AsTime(),
PublishedAt: r.CreatedUnix.AsTime(),
Publisher: r.Publisher.APIFormat(),
Attachments: assets,
}
}

View File

@ -2176,6 +2176,7 @@ func GitFsck() {
func(idx int, bean interface{}) error {
repo := bean.(*Repository)
repoPath := repo.RepoPath()
log.Trace(fmt.Sprintf("Running health check for repository %s", repoPath))
if err := git.Fsck(repoPath, setting.Cron.RepoHealthCheck.Timeout, setting.Cron.RepoHealthCheck.Args...); err != nil {
desc := fmt.Sprintf("Failed to health check repository (%s): %v", repoPath, err)
log.Warn(desc)
@ -2187,6 +2188,7 @@ func GitFsck() {
}); err != nil {
log.Error(4, "GitFsck: %v", err)
}
log.Trace("Finished: GitFsck")
}
// GitGcRepos calls 'git gc' to remove unnecessary files and optimize the local repository

View File

@ -87,6 +87,21 @@ func notifyWatchers(e Engine, act *Action) error {
return fmt.Errorf("insert new actioner: %v", err)
}
act.loadRepo()
// check repo owner exist.
if err := act.Repo.getOwner(e); err != nil {
return fmt.Errorf("can't get repo owner: %v", err)
}
// Add feed for organization
if act.Repo.Owner.IsOrganization() && act.ActUserID != act.Repo.Owner.ID {
act.ID = 0
act.UserID = act.Repo.Owner.ID
if _, err = e.InsertOne(act); err != nil {
return fmt.Errorf("insert new actioner: %v", err)
}
}
for i := range watches {
if act.ActUserID == watches[i].UserID {
continue

View File

@ -464,7 +464,11 @@ func shortLinkProcessorFull(ctx *postProcessCtx, node *html.Node, noLink bool) {
childNode.Parent = linkNode
absoluteLink := isLinkStr(link)
if !absoluteLink {
link = strings.Replace(link, " ", "+", -1)
if image {
link = strings.Replace(link, " ", "+", -1)
} else {
link = strings.Replace(link, " ", "-", -1)
}
}
urlPrefix := ctx.urlPrefix
if image {

View File

@ -81,11 +81,13 @@ func TestRender_ShortLinks(t *testing.T) {
rawtree := util.URLJoin(AppSubURL, "raw", "master")
url := util.URLJoin(tree, "Link")
otherURL := util.URLJoin(tree, "OtherLink")
otherURL := util.URLJoin(tree, "Other-Link")
imgurl := util.URLJoin(rawtree, "Link.jpg")
otherImgurl := util.URLJoin(rawtree, "Link+Other.jpg")
urlWiki := util.URLJoin(AppSubURL, "wiki", "Link")
otherURLWiki := util.URLJoin(AppSubURL, "wiki", "OtherLink")
otherURLWiki := util.URLJoin(AppSubURL, "wiki", "Other-Link")
imgurlWiki := util.URLJoin(AppSubURL, "wiki", "raw", "Link.jpg")
otherImgurlWiki := util.URLJoin(AppSubURL, "wiki", "raw", "Link+Other.jpg")
favicon := "http://google.com/favicon.ico"
test(
@ -125,7 +127,11 @@ func TestRender_ShortLinks(t *testing.T) {
`<p><a href="`+imgurl+`" rel="nofollow"><img src="`+imgurl+`" title="Title" alt="AltName"/></a></p>`,
`<p><a href="`+imgurlWiki+`" rel="nofollow"><img src="`+imgurlWiki+`" title="Title" alt="AltName"/></a></p>`)
test(
"[[Link]] [[OtherLink]]",
`<p><a href="`+url+`" rel="nofollow">Link</a> <a href="`+otherURL+`" rel="nofollow">OtherLink</a></p>`,
`<p><a href="`+urlWiki+`" rel="nofollow">Link</a> <a href="`+otherURLWiki+`" rel="nofollow">OtherLink</a></p>`)
"[[Name|Link Other.jpg|alt=\"AltName\"|title='Title']]",
`<p><a href="`+otherImgurl+`" rel="nofollow"><img src="`+otherImgurl+`" title="Title" alt="AltName"/></a></p>`,
`<p><a href="`+otherImgurlWiki+`" rel="nofollow"><img src="`+otherImgurlWiki+`" title="Title" alt="AltName"/></a></p>`)
test(
"[[Link]] [[Other Link]]",
`<p><a href="`+url+`" rel="nofollow">Link</a> <a href="`+otherURL+`" rel="nofollow">Other Link</a></p>`,
`<p><a href="`+urlWiki+`" rel="nofollow">Link</a> <a href="`+otherURLWiki+`" rel="nofollow">Other Link</a></p>`)
}

View File

@ -8,7 +8,7 @@ sign_in=Anmelden
sign_in_with=Anmelden mit
sign_out=Abmelden
sign_up=Registrieren
link_account=Account verbinden
link_account=Konto verbinden
link_account_signin_or_signup=Melde dich mit den existierenden Zugangsdaten an, um das Benutzerkonto mit diesem Benutzerkonto zu verbinden, oder registriere ein neues Benutzerkonto
register=Registrieren
website=Webseite
@ -112,21 +112,21 @@ server_service_title=Server- und sonstige Diensteinstellungen
offline_mode=Offline-Modus aktivieren
offline_mode_popup=CDN deaktivieren. Alle benötigten Dateien werden von diesem Server ausgeliefert.
disable_gravatar=Gravatar-Dienst deaktivieren
disable_gravatar_popup=Gravatar und benutzerdefinierte Quellen deaktivieren. Alle Profilbilder werden vom Nutzer hochgeladen oder sind das Standard-Profilbild.
disable_gravatar_popup=Gravatar und benutzerdefinierte Quellen deaktivieren. Alle Profilbilder müssen vom Nutzer hochgeladen werde, ansonsten wird das Standard-Profilbild verwendet.
federated_avatar_lookup=Suche nach föderierten Profilbildern einschalten
federated_avatar_lookup_popup=Die Suche nach föderierten Profilbildern durch die Verwendung von föderierten open source Services basierend auf libravatar erlauben.
federated_avatar_lookup_popup=Föderierte Profilbilder via Libravatar aktivieren.
disable_registration=Registrierung deaktivieren
disable_registration_popup=Registrierung neuer Benutzer deaktivieren. Nur Administratoren können Benutzerkonten anlegen.
disable_registration_popup=Registrierung neuer Benutzer deaktivieren; nur Administratoren werden Benutzerkonten anlegen können.
openid_signin=OpenID Anmeldung aktivieren
openid_signin_popup=Aktiviere Anmeldung via OpenID für Benutzer
openid_signup=Aktiviere OpenID Selbstregistrierung
openid_signup_popup=Aktiviere OpenID-basierte Selbstregistrierung
openid_signin_popup=Benutzeranmeldung via OpenID aktivieren
openid_signup=OpenID Selbstregistrierung aktivieren
openid_signup_popup=OpenID-basierte Selbstregistrierung aktivieren
enable_captcha=Captcha aktivieren
enable_captcha_popup=Captcha-Eingabe bei der Registrierung erforderlich.
require_sign_in_view=Seiten nur für angemeldete Benutzer zugänglich
require_sign_in_view_popup=Nur angemeldete Benutzer können auf alle Seiten zugreifen. Gäste sehen nur die Seiten zum Anmelden/Registrieren.
admin_setting_desc=Du musst jetzt kein Administrator-Konto anlegen. Der erste Benutzer, der sich registriert, erhält automatisch Administrator-Rechte.
admin_title=Administrator Einstellungen
admin_title=Administratoreinstellungen
admin_name=Benutzername
admin_password=Passwort
confirm_password=Passwort bestätigen
@ -142,13 +142,13 @@ invalid_admin_setting=Admin-Konto Einstellungen sind ungültig: %v
install_success=Willkommen! Danke, dass du Gitea gewählt hast. Viel Spaß!
invalid_log_root_path=Pfad zum Log-Verzeichnis ist ungültig: %v
default_keep_email_private=Standard-Wert für "Private E-Mail-Adressen
default_keep_email_private_popup=Das ist der der Standardwert für die Sichtbarkeit der E-Mail-Adresse der Benutzer. Die E-Mail-Adressen aller neu registrierten Benutzer werden versteckt wenn eingeschalten, außer der Benutzer ändert seine Einstellung.
default_allow_create_organization=Berechtigung, die es neuen Benutzern erlaubt Organisationen zu erstellen
default_allow_create_organization_popup=Dies ist die Berechtigung, die neue Benutzer standartmäßig haben. Wenn dies auf "wahr" gesetzt ist, können neue Benutzer Organisationen erstellen.
default_keep_email_private_popup=Das ist der der Standardwert für die Sichtbarkeit der E-Mail-Adresse der Benutzer. Die E-Mail-Adressen aller neu registrierten Benutzer werden versteckt wenn aktiviert, außer der Benutzer ändert diese Einstellung.
default_allow_create_organization=Standardberechtigung, die es neuen Benutzern erlaubt Organisationen zu erstellen
default_allow_create_organization_popup=Die Standardberechtigung für neue Benutzer. Wenn dies aktiviert ist, können neue Benutzer Organisationen erstellen.
default_enable_timetracking=Zeiterfassung standardmäßig aktivieren
default_enable_timetracking_popup=Repositories werden Zeiterfassung entsprechend dieser Einstellung standardmäßig aktiviert haben
no_reply_address=No-Reply Adresse
no_reply_address_helper=Domain für die E-Mail-adresse des Benutzers in den git logs, wenn der Benutzer seine E-Mail privat halten möchte. (z.B. Benutzer 'joe' und 'noreply.example.org' als Einstellung -> 'joe@noreply.example.org')
no_reply_address_helper=Domain für die E-Mail-Adresse des Benutzers in den git logs, wenn der Benutzer seine E-Mail privat halten möchte, z.B. Benutzer 'joe' und 'noreply.example.org' als Einstellung wird zu 'joe@noreply.example.org' in den Logs.
[home]
uname_holder=Benutzername oder E-Mail
@ -160,7 +160,7 @@ collaborative_repos=Gemeinschaftliche Repositories
my_orgs=Meine Organisationen
my_mirrors=Meine Mirrors
view_home=%s betrachten
search_repos=Finde eine Repository…
search_repos=Finde ein Repository…
issues.in_your_repos=Eigene Repositories
@ -178,39 +178,39 @@ create_new_account=Konto erstellen
register_helper_msg=Hast du bereits ein Konto? Jetzt anmelden!
social_register_helper_msg=Hast du bereits ein Konto? Jetzt anmelden!
disable_register_prompt=Die Registrierung wurde deaktiviert. Bitte wende dich an den Administrator.
disable_register_mail=Es tut uns leid, die Bestätigung der Registrierungs-E-Mail wurde deaktiviert.
disable_register_mail=Die Bestätigung der Registrierungs-E-Mail wurde deaktiviert.
remember_me=Angemeldet bleiben
forgot_password_title=Passwort vergessen
forgot_password=Passwort vergessen?
sign_up_now=Möchtest du ein Konto? Registriere dich jetzt.
confirmation_mail_sent_prompt=Eine neue Bestätigungs-E-Mail wurde an <b>%s</b> gesendet. Bitte kontrolliere dein Postfach innerhalb der nächsten %s, um die Registrierung abzuschließen.
reset_password_mail_sent_prompt=Eine E-Mail wurde an <b>%s</b> gesendet. Bitte kontrolliere dein Postfach innerhalb der nächsten %s, um das Passwort zurückzusetzen.
sign_up_now=Noch kein Konto? Jetzt registrieren.
confirmation_mail_sent_prompt=Eine neue Bestätigungs-E-Mail wurde an <b>%s</b> gesendet. Bitte überprüfe dein Postfach innerhalb der nächsten %s, um die Registrierung abzuschließen.
reset_password_mail_sent_prompt=Eine E-Mail wurde an <b>%s</b> gesendet. Bitte überprüfe dein Postfach innerhalb der nächsten %s, um das Passwort zurückzusetzen.
active_your_account=Aktiviere dein Konto
prohibit_login=Anmelden verboten
prohibit_login_desc=Dein Account wurde gesperrt, bitte wende dich an den Administrator.
prohibit_login_desc=Dein Konto wurde gesperrt, bitte wende dich an den Administrator.
resent_limit_prompt=Du hast bereits eine Aktivierungs-E-Mail angefordert. Bitte warte 3 Minuten und probiere es dann nochmal.
has_unconfirmed_mail=Hallo %s, du hast eine unbestätigte E-Mail-Adresse (<b>%s</b>). Wenn du keine Bestätigungs-E-Mail erhalten hast oder eine neue senden möchtest, klicke bitte auf den folgenden Button.
resend_mail=Hier klicken, um die Aktivierungs-E-Mail erneut zu versenden
resend_mail=Aktivierungs-E-Mail erneut verschicken
email_not_associate=Diese E-Mail-Adresse ist mit keinem Konto verknüpft.
send_reset_mail=Hier klicken, um die E-Mail zum Passwort-zurücksetzen erneut zu versenden
send_reset_mail=E-Mail zum Passwort-zurücksetzen erneut verschicken
reset_password=Passwort zurücksetzen
invalid_code=Es tut uns leid, der Bestätigungscode ist abgelaufen oder ungültig.
reset_password_helper=Hier klicken, um das Passwort zurückzusetzen
reset_password_helper=Passwort zurückzusetzen
password_too_short=Das Passwort muss mindenstens %d Zeichen lang sein.
non_local_account=Nicht-Lokale Accounts können ihre Passwörter nicht über das Gitea-Webinterface ändern.
non_local_account=Nicht-Lokale Benutzerkonten können ihre Passwörter nicht über das Gitea-Webinterface ändern.
verify=Verifizieren
scratch_code=Einmalpasswort
use_scratch_code=Einmalpasswort verwenden
twofa_scratch_used=Du hast dein Einmalpasswort verwendet. Du wurdest zu den Einstellung der Zwei-Faktor-Authentifizierung umgeleitet, dort kannst du dein Gerät abmelden oder ein neues Einmalpasswort erzeugen.
twofa_passcode_incorrect=Ungültige PIN. Wenn du dein Gerät verlegt hast, verwende dein Einmalpasswort.
twofa_scratch_token_incorrect=Dein Einmalpasswort ist falsch.
twofa_passcode_incorrect=Ungültige PIN. Wenn du dein Gerät verloren hast, verwende dein Einmalpasswort.
twofa_scratch_token_incorrect=Das Einmalpasswort ist falsch.
login_userpass=Benutzer / Passwort
login_openid=OpenID
openid_connect_submit=Verbinden
openid_connect_title=Mit bestehendem Account verbinden
openid_connect_desc=Die eingegebene OpenID ist uns unbekannt, du kannst sie mit einem bestehendem Account verbinden.
openid_connect_title=Mit bestehendem Konto verbinden
openid_connect_desc=Die eingegebene OpenID URI ist uns unbekannt, du kannst sie mit einem bestehendem Konto verbinden.
openid_register_title=Neues Konto einrichten
openid_register_desc=Die eingegebene OpenID ist uns unbekannt, du kannst sie hier mit einem neuen Account verbinden.
openid_register_desc=Die eingegebene OpenID URI ist uns unbekannt, du kannst sie hier mit einem neuen Konto verbinden.
openid_signin_desc=Beispiel-URIs: https://anne.me, bob.openid.org.cn, gnusocial.net/carry
disable_forgot_password_mail=Das zurücksetzen von Passwörtern wurde deaktiviert. Bitte kontaktiere den Administrator.
@ -247,8 +247,8 @@ TreeName=Dateipfad
Content=Inhalt
require_error=` darf nicht leer sein.`
alpha_dash_error=` kann ausschließlich alphanumerische Zeichen und (-_) enthalten.`
alpha_dash_dot_error=` müssen gültige alphanumerische, dash(-_) oder Punkt-Zeichen sein. `
alpha_dash_error=` darf ausschließlich alphanumerische Zeichen und (-_) enthalten.`
alpha_dash_dot_error=` darf ausschließlich alphanumerische, (-_) und Punkt-Zeichen enthalten.`
git_ref_name_error=` muss ein wohlgeformter Git-Referenzname sein.`
size_error=` muss die Größe %s haben.`
min_size_error=` muss mindestens %s Zeichen enthalten.`
@ -269,25 +269,25 @@ email_been_used=E-Mail-Adresse wird bereits verwendet.
openid_been_used=OpenID-Adresse "%s" wurde bereits verwendet.
username_password_incorrect=Falscher Benutzername oder Passwort.
enterred_invalid_repo_name=Bitte achte darauf, dass der eingegebene Repository-Name korrekt ist.
enterred_invalid_owner_name=Bitte achte darauf, dass der eingegebene Name des Besitzers korrekt ist.
enterred_invalid_owner_name=Bitte achte darauf, dass der eingegebene Besitzername korrekt ist.
enterred_invalid_password=Bitte achte darauf, dass das eingegebene Passwort korrekt ist.
user_not_exist=Dieser Benutzer ist nicht vorhanden.
last_org_owner=Entfernen des letzten Mitglieds aus einem Eigentümer-Team ist nicht zulässig, da es immer mindestens einen Eigentümer pro Organisation geben muss.
last_org_owner=Du kannst das letzte Mitglied aus dem Eigentümer-Team nicht entfernen, da es immer mindestens einen Eigentümer pro Organisation geben muss.
cannot_add_org_to_team=Organisationen können nicht als Teammitglied hinzugefügt werden.
invalid_ssh_key=Leider konnte der SSH-Schlüssel vom Server nicht überprüfen werden: %s
invalid_gpg_key=Leider konnte der GPG-Schlüssel vom Server nicht überprüft werden: %s
unable_verify_ssh_key=Bitte überprüfe den SSH-Schlüssel nochmal, da er nicht verifiziert werden konnte.
invalid_ssh_key=Wir konnten deinen SSH-Schlüssel leider nicht überprüfen: %s
invalid_gpg_key=Wir konnten deinen GPG-Schlüssel leider nicht überprüfen: %s
unable_verify_ssh_key=Bitte überprüfe den SSH-Schlüssel, da er nicht verifiziert werden konnte.
auth_failed=Authentifizierung fehlgeschlagen: %v
still_own_repo=Dein Konto ist noch der Besitzer von mindestens einem Repository. Bitte lösche oder transferiere dieses zuerst.
still_own_repo=Dein Konto ist noch der Besitzer von mindestens einem Repository. Bitte lösche oder übertrage dieses zuerst.
still_has_org=Dein Konto ist noch ein Mitglied mindestens einer Organisation, du musst diese zuerst verlassen.
org_still_own_repo=Diese Organisation besitzt noch Repositories, diese musst du vorher löschen oder transferieren.
org_still_own_repo=Diese Organisation besitzt noch Repositories, diese musst du vorher löschen oder übertragen.
target_branch_not_exist=Ziel-Branch existiert nicht
target_branch_not_exist=Die Ziel-Branch existiert nicht.
[user]
change_avatar=Ändere dein Profilbild
change_avatar=Profilbild ändern
join_on=Beigetreten am
repositories=Repositories
activity=Öffentliche Aktivität
@ -312,12 +312,12 @@ orgs=Organisationen
repos=Repositories
delete=Konto löschen
twofa=Zwei-Faktor-Authentifizierung
account_link=Externe Accounts
account_link=Externe Konten
organization=Organisation
uid=Uid
public_profile=Öffentliches Profil
profile_desc=Deine E-Mail-Adresse ist öffentlich einsehbar und wird dafür verwendet, dir Benachrichtigungen zu deinem Konto und Aktivitäten auf der Webseite zu schicken.
profile_desc=Deine E-Mail-Adresse ist öffentlich einsehbar und wird dafür verwendet, dir Benachrichtigungen zu deinem Konto und Aktivitäten auf Gitea zu schicken.
password_username_disabled=Nutzer, die nicht von Gitea verwaltet sind, können ihren Benutzernamen nicht ändern. Bitte kontaktiere den Gitea-Administrator für mehr Details.
full_name=Vollständiger Name
website=Webseite
@ -325,13 +325,13 @@ location=Standort
update_profile=Profil aktualisieren
update_profile_success=Dein Profil wurde aktualisiert.
change_username=Benutzername geändert
change_username_prompt=Diese Änderung wird den Link zu Ihrem Profil ändern.
change_username_prompt=Diese Änderung wird den Link zu deinem Profil ändern.
continue=Weiter
cancel=Abbrechen
lookup_avatar_by_mail=Suche nach Profilbildern via E-Mail
federated_avatar_lookup=Suche nach föderierten Profilbildern
enable_custom_avatar=Benutzerdefiniertes Profilbild aktivieren
enable_custom_avatar=Benutzerdefiniertes Profilbild benutzen
choose_new_avatar=Neues Profilbild auswählen
update_avatar=Profilbild-Einstellungen aktualisieren
delete_current_avatar=Aktuelles Profilbild löschen
@ -342,7 +342,7 @@ change_password=Passwort ändern
old_password=Aktuelles Passwort
new_password=Neues Passwort
retype_new_password=Neues Passwort erneut eingeben
password_incorrect=Aktuelles Passwort ist nicht korrekt.
password_incorrect=Das aktuelle Passwort ist falsch.
change_password_success=Dein Passwort wurde geändert. Du kannst dich jetzt mit deinem neuen Passwort anmelden.
password_change_disabled=Nicht-lokale Benutzer dürfen nicht ihr Kennwort über das Webinterface ändern.
@ -354,45 +354,45 @@ primary=Primär
primary_email=Als primäre Adresse verwenden
delete_email=Löschen
email_deletion=E-Mail-Adresse löschen
email_deletion_desc=Wenn du diese E-Mail-Adresse löschst, werden alle mit deinem Konto verknüpften Informationen verloren gehen. Git commits, die mit dieser E-Mail ausgeführt werden, bleiben ungeändert. Willst du fortfahren?
email_deletion_desc=Wenn du diese E-Mail-Adresse löschst, werden alle mit deinem Konto verknüpften Informationen verloren gehen. Git commits, die mit dieser E-Mail ausgeführt werden, werden nicht geändert. Fortfahren?
email_deletion_success=E-Mail-Adresse wurde erfolgreich gelöscht!
openid_deletion=OpenID Löschen
openid_deletion_desc=Du wirst dich nicht mehr mit dieser OpenID anmelden können, wenn du sie löschst. Weiter?
openid_deletion_desc=Du wirst dich nicht mehr mit dieser OpenID anmelden können, wenn du sie löschst. Fortfahren?
openid_deletion_success=OpenID wurde erfolgreich gelöscht!
add_new_email=Neue E-Mail-Adresse hinzufügen
add_new_openid=Neue OpenID-URI hinzufügen
add_email=E-Mail-Adresse hinzufügen
add_openid=OpenID-URI hinzufügen
add_email_confirmation_sent=Eine neue Bestätigungs-E-Mail wurde an '%s' gesendet. Kontrolliere dein Postfach innerhalb der nächsten %s, um die Verifizierung abzuschließen.
add_email_success=Dein neue E-Mail-Adresse wurde erfolgreich hinzugefügt.
add_email_confirmation_sent=Eine neue Bestätigungs-E-Mail wurde an '%s' gesendet. Bitte überprüfe dein Postfach innerhalb der nächsten %s, um die Verifizierung abzuschließen.
add_email_success=Deine neue E-Mail-Adresse wurde erfolgreich hinzugefügt.
add_openid_success=Deine neue OpenID-Adresse wurde erfolgreich hinzugefügt.
keep_email_private=E-Mail-Adresse nicht veröffentlichen
keep_email_private_popup=Deine E-Mail-Adresse wird vor anderen Benutzern versteckt, wenn diese Option gesetzt ist.
openid_desc=Mit deinen OpenID-Adressen kannst du die Authentifizierung an einen provider deiner Wahl delegieren
openid_desc=Mit deinen OpenID-Adressen kannst du die Authentifizierung an einen Provider deiner Wahl delegieren
manage_ssh_keys=SSH-Schlüssel verwalten
manage_gpg_keys=GPG-Schlüssel verwalten
add_key=Schlüssel hinzufügen
ssh_desc=Dies ist eine Liste aller SSH-Schlüssel, die deinem Konto zugeordnet sind. Bitte entferne alle Schlüssel, die dir unbekannt sind.
gpg_desc=Dies ist eine Liste aller GPG-Schlüssel, die deinem Konto zugeordnet sind. Bitte entferne alle Schlüssel, die dir unbekannt sind.
ssh_helper=<strong>Brauchst du Hilfe?</strong> Hier ist eine Anleitung zum <a href="%s">Erzeugen von SSH-Schlüsseln</a> oder <a href="%s">Lösen einfacher SSH-Probleme</a>.
ssh_desc=Dies ist eine Liste aller SSH-Schlüssel, die deinem Konto zugeordnet sind. Bitte entferne alle Schlüssel, die dir unbekannt sind, da damit Zugriff auf deine Repositories möglich ist.
gpg_desc=Dies ist eine Liste aller GPG-Schlüssel, die deinem Konto zugeordnet sind. Bitte entferne alle Schlüssel, die dir unbekannt sind, da diese verwendet werden um Git-Commits damit zu verifizieren.
ssh_helper=<strong>Brauchst du Hilfe?</strong> Hier ist Githubs Anleitung zum <a href="%s">Erzeugen von SSH-Schlüsseln</a> oder <a href="%s">Lösen einfacher SSH-Probleme</a>.
gpg_helper=<strong>Brauchst du Hilfe?</strong> Hier ist GitHubs Anleitung <a href="%s">über GPG</a>.
add_new_key=SSH-Schlüssel hinzufügen
add_new_gpg_key=GPG-Schlüssel hinzufügen
ssh_key_been_used=Dieser öffentliche Schlüssel wird bereits verwendet.
ssh_key_name_used=Ein öffentlicher Schlüssel mit demselben Namen ist bereits vorhanden.
gpg_key_id_used=Ein öffentlicher GPG-Schlüssel mit der gleichen ID existiert bereits.
gpg_no_key_email_found=Es konnte keine passende E-Mail aus diesem GPG-Schlüssel gefunden werden.
gpg_no_key_email_found=Es konnte keine passende E-Mail in diesem GPG-Schlüssel gefunden werden.
subkeys=Unterschlüssel
key_id=Schlüssel-ID
key_name=Schlüsselname
key_content=Inhalt
add_key_success=Ihr SSH-Schlüssel "%s" wurde hinzugefügt.
add_gpg_key_success=Ihr GPG-Schlüssel "%s" wurde hinzugefügt.
add_key_success=Dein SSH-Schlüssel "%s" wurde hinzugefügt.
add_gpg_key_success=Dein GPG-Schlüssel "%s" wurde hinzugefügt.
delete_key=Löschen
ssh_key_deletion=SSH-Schlüssel löschen
gpg_key_deletion=GPG-Schlüssel löschen
ssh_key_deletion_desc=Wenn du diesen SSH-Schlüssel löschst, wirst du nicht mehr in der Lage sein, dich mit diesem Schlüssel auf deinem Account anzumelden. Fortfahren?
ssh_key_deletion_desc=Wenn du diesen SSH-Schlüssel löschst, wirst du nicht mehr in der Lage sein, diesen Schlüssel für deinen Konto zu benutzen. Fortfahren?
gpg_key_deletion_desc=Wenn du diesen GPG-Schlüssel löschst, werden alle Commits, die damit signiert wurden als unsigniert makiert. Fortfahren?
ssh_key_deletion_success=Der SSH-Schlüssel wurde gelöscht.
gpg_key_deletion_success=Der GPG-Schlüssel wurde gelöscht.
@ -412,42 +412,42 @@ ssh_disabled=SSH ist deaktiviert
manage_social=Verknüpfte soziale Konten verwalten
social_desc=Dies ist eine Liste deiner zugeordneten Social-Media-Accounts. Bitte stelle sicher, dass du alle diese Accounts kennst, da man sich damit in deinem Namen auf Gitea einloggen kann.
unbind=Verknüpfung entfernen
unbind_success=Das Social-Konto wurde von deinem Account entfernt.
unbind_success=Das Social-Media-Konto wurde von deinem Konto entfernt.
manage_access_token=Verwaltung persönlicher Zugangs-Token
manage_access_token=Verwaltung persönlicher Zugangstokens
generate_new_token=Neuen Token erzeugen
tokens_desc=Von dir erzeugten Token, können zum Zugriff auf die Gitea-API verwendet werden.
new_token_desc=Jeder Token ermöglicht vollen Zugriff auf dein Konto.
token_name=Token-Name
generate_token=Token generieren
generate_token_success=Dein Zugangs-Token wurde erfolgreich erstellt! Denk daran, es jetzt gleich zu kopieren, später wirst du es nicht mehr sehen!
generate_token_success=Dein Zugangstoken wurde erfolgreich erstellt! Aus Sicherheitsgründen wird das Passwort nur einmal angezeigt.
delete_token=Löschen
access_token_deletion=Persönlichen Token entfernen
access_token_deletion_desc=Wenn du dieses Zugangs-Token löschst, wird das der Zugang für sämtliche Applikationen, die es nutzen, nicht mehr möglich sein. Fortfahren?
delete_token_success=Das persönliche Zugangstoken wurde erfolgreich entfernt! Vergiss nicht, es aus Apps zu entfernen, welche es nutzen.
access_token_deletion_desc=Wenn du diesen Zugangstoken löschst, wird das der Zugang für sämtliche Anwendungen, die ihn nutzen, nicht mehr möglich sein. Fortfahren?
delete_token_success=Der persönliche Zugangstoken wurde erfolgreich entfernt! Vergiss nicht, ihn aus Anwendungen zu entfernen, die ihn nutzen.
twofa_desc=Gitea unterstützt Zwei-Faktor-Authentifizierung, um deine Account-Sicherheit zu erhöhen.
twofa_desc=Gitea unterstützt Zwei-Faktor-Authentifizierung, um deine Kontosicherheit zu erhöhen.
twofa_is_enrolled=Für dein Konto ist die Zwei-Faktor-Authentifizierung <strong>eingeschaltet</strong>.
twofa_not_enrolled=Für deinen Account ist die Zwei-Faktor-Authentifizierung momentan nicht eingeschaltet.
twofa_not_enrolled=Für dein Konto ist die Zwei-Faktor-Authentifizierung momentan nicht eingeschaltet.
twofa_disable=Zwei-Faktor-Authentifizierung deaktivieren
twofa_scratch_token_regenerate=Neues Einmalpasswort erstellen
twofa_scratch_token_regenerated=Ein neues Einmalpasswort wurde generiert. Es lautet %s. Bewahre es an einem sicheren Ort auf.
twofa_enroll=Zwei-Faktor-Authentifizierung aktivieren
twofa_disable_note=Du kannst Zwei-Faktor-Authentifizierung auch deaktivieren.
twofa_disable_desc=Die Deaktivierung von Zwei-Faktor-Authentifizierung wird die Sicherheit deines Kontos verringern. Möchtest du wirklich fortfahren?
twofa_disable_desc=Die Deaktivierung von Zwei-Faktor-Authentifizierung wird die Sicherheit deines Kontos verringern. Fortfahren?
regenerate_scratch_token_desc=Wenn du dein Einmalpasswort verlegt oder du dich damit eingeloggt hast, kannst du es hier zurücksetzen.
twofa_disabled=Zwei-Faktor-Authentifizierung wurde deaktiviert.
scan_this_image=Scanne diese Grafik mit deiner Authentifizierungs-App:
or_enter_secret=Oder gib das Secret ein: %s
then_enter_passcode=Und gebe den PIN ein, die die Anwendung dir gibt:
then_enter_passcode=Und gebe den PIN ein, die die Anwendung dir anzeigt:
passcode_invalid=Die PIN ist ungültig. Versuche es erneut.
twofa_enrolled=Die Zwei-Faktor-Authentifizierung ist jetzt für dein Konto aktiviert. Vergewissere dich, dass du das Einmalpasswort (%s) gespeichert hast, da es nur einmal angezeigt wird!
manage_account_links=Verknüpfte Konten verwalten
manage_account_links_desc=Externe, mit diesem Konto verknüpfte Accounts
account_links_not_available=Es sind keine externen Accounts mit diesem verknüpft
manage_account_links_desc=Externe, mit diesem Benutzerkonto verknüpfte Konten
account_links_not_available=Es sind keine externen Benutzerkonten mit diesem verknüpft
remove_account_link=Verknüpftes Konto entfernen
remove_account_link_desc=Das Löschen dieses Kontos wird sämtlichen verbundenen Zugang zu deinem Account entfernen. Fortfahren?
remove_account_link_desc=Das Löschen dieses verknüpften Benutzerkontos wird sämtlichen verbundenen Zugang zu deinem Benutzerkonto entfernen. Fortfahren?
remove_account_link_success=Verknüpftes Konto wurde erfolgreich entfernt!
orgs_none=Du bist kein Mitglied in einer Organisation.
@ -455,7 +455,7 @@ repos_none=Du besitzt keine Repositories
delete_account=Konto löschen
delete_prompt=Diese Aktion wird dein Konto dauerhaft löschen und kann <strong>NICHT</strong> rückgängig gemacht werden!
confirm_delete_account=Löschvorgang bestätigen
confirm_delete_account=Löschen bestätigen
delete_account_title=Konto löschen
delete_account_desc=Bist du sicher, dass du dieses Konto dauerhaft löschen möchtest?
@ -477,19 +477,19 @@ repo_gitignore_helper=Wähle eine .gitignore Vorlage aus
license=Lizenz
license_helper=Wähle eine Lizenz aus
readme=Readme
readme_helper=Readme Vorlage auswählen
readme_helper=Readme-Vorlage auswählen
auto_init=Repository mit ausgewählten Dateien und Vorlagen erstellen
create_repo=Repository erstellen
default_branch=Standard-Branch
default_branch=Standardbranch
mirror_prune=Entfernen
mirror_prune_desc=Entferne alle Verweise auf nicht mehr existierende Remote-Repositories
mirror_interval=Spiegel Intervall (gültige Zeiteinheiten sind "h", "m", "s")
mirror_interval=Spiegelintervall (gültige Zeiteinheiten sind "h", "m", "s")
mirror_interval_invalid=Spiegel-Intervall ist nicht gültig
mirror_address=Mirror-Adresse
mirror_address_desc=Bitte die nötigen Zugangsdaten in die Adresse mit aufnehmen.
mirror_address_desc=Bitte füge alle nötigen Zugangsdaten in die Adresse mit ein.
mirror_last_synced=Zuletzt synchronisiert
watchers=Beobachter
stargazers=In Favoriten von
stargazers=Favorisiert von
forks=Forks
pick_reaction=Wähle eine Reaktion
reactions_more=und %d weitere
@ -498,21 +498,21 @@ form.reach_limit_of_creation=Du hast bereits dein Limit von %d Repositories erre
form.name_reserved=Der Repository-Name '%s' ist reserviert.
form.name_pattern_not_allowed=Repository-Namen der Form '%s' sind nicht erlaubt.
need_auth=Authorisierung benötigt
need_auth=Authentifizierung benötigt
migrate_type=Migrationstyp
migrate_type_helper=Dieses Repository wird ein <span class="text blue">Mirror</span> sein
migrate_repo=Repository migrieren
migrate.clone_address=Adresse kopieren
migrate.clone_address_desc=Dies kann eine HTTP/HTTPS/GIT URL oder ein lokaler Serverpfad sein.
migrate.clone_local_path=oder Pfad auf dem lokalen Server
migrate.permission_denied=Dir wurde die Berechtigung zum Importieren lokaler Repositories nicht erteilt.
migrate.clone_address=Klon-Adresse
migrate.clone_address_desc=Dies kann eine HTTP/HTTPS/GIT URL sein.
migrate.clone_local_path=oder ein lokaler Serverpfad
migrate.permission_denied=Du hast keine Berechtigung zum Importieren lokaler Repositories.
migrate.invalid_local_path=Der lokale Pfad ist ungültig, existiert nicht oder ist kein Ordner.
migrate.failed=Fehler bei Migration: %v
migrate.failed=Fehler bei der Migration: %v
migrate.lfs_mirror_unsupported=Spiegelung von LFS-Objekten wird nicht unterstützt - nutze stattdessen 'git lfs fetch --all' und 'git lfs push --all'.
mirror_from=Mirror von
forked_from=geforkt von
fork_from_self=Du kannst kein Repository forken, das dir gehört!
fork_from_self=Du kannst kein Repository forken, das dir bereits gehört!
copy_link=Kopieren
copy_link_success=Kopiert!
copy_link_error=Drücke ⌘-C oder Strg-C zum Kopieren
@ -543,7 +543,7 @@ pulls=Pull-Requests
labels=Label
milestones=Meilensteine
commits=Commits
commit=Commits
commit=Commit
releases=Releases
file_raw=Originalformat
file_history=Verlauf
@ -576,7 +576,7 @@ editor.update='%s' ändern
editor.delete='%s' löschen
editor.commit_message_desc=Eine ausführlichere (optionale) Beschreibung hinzufügen…
editor.commit_directly_to_this_branch=Direkt in die <strong class="branch-name">%s</strong>-Branch einchecken.
editor.create_new_branch=Einen <strong>neuen Branch</strong> für diesen Commit erstellen und einen Pull Request starten.
editor.create_new_branch=Einen <strong>neue Branch</strong> für diesen Commit erstellen und einen Pull Request starten.
editor.new_branch_name_desc=Neuer Branchname…
editor.cancel=Abbrechen
editor.filename_cannot_be_empty=Der Dateiname darf nicht leer sein.
@ -590,7 +590,7 @@ editor.file_already_exists=Eine Datei mit dem Namen '%s' existiert bereits in di
editor.no_changes_to_show=Keine Änderungen vorhanden.
editor.fail_to_update_file=Fehler beim Ändern/Erstellen der Datei '%s'. Fehler: %v
editor.add_subdir=Unterverzeichnis erstellen…
editor.unable_to_upload_files=Fehler beim Hochladen der Dateien zu '%s'. Fehler: %v
editor.unable_to_upload_files=Fehler beim Hochladen der Dateien nach '%s'. Fehler: %v
editor.upload_files_to_dir=Dateien hochladen nach '%s'
editor.cannot_commit_to_protected_branch=Auf die geschützte Branch "%s" kann nicht geschrieben werden.
@ -633,8 +633,8 @@ issues.label_templates.info=Es sind noch keine Label vorhanden. Du kannst vordef
issues.label_templates.helper=Wähle ein Label
issues.label_templates.use=Dieses Label Set benutzen
issues.label_templates.fail_to_load_file=Fehler beim Laden der Label Template Datei '%s': %v
issues.add_label_at=das <div class="ui label"style="color: %s\; background-color: %s">%s</div>-Label %s hinzugefügt
issues.remove_label_at=das <div class="ui label"style="color: %s\; background-color: %s">%s</div>-Label %s entfernt
issues.add_label_at=hat das <div class="ui label"style="color: %s\; background-color: %s">%s</div>-Label %s hinzugefügt
issues.remove_label_at=hat das <div class="ui label"style="color: %s\; background-color: %s">%s</div>-Label %s entfernt
issues.add_milestone_at=`fügte das Issue zum <b>%s</b> Meilenstein hinzu %s`
issues.change_milestone_at=`änderte den Meilenstein von <b>%s</b> zu <b>%s</b> %s`
issues.remove_milestone_at=`entfernte das Issue vom <b>%s</b> Meilenstein %s`
@ -661,10 +661,10 @@ issues.filter_sort=Sortieren
issues.filter_sort.latest=Neueste
issues.filter_sort.oldest=Älteste
issues.filter_sort.recentupdate=Kürzlich aktualisiert
issues.filter_sort.leastupdate=Am längsten nicht aktualisiert
issues.filter_sort.leastupdate=Am Längsten nicht aktualisiert
issues.filter_sort.mostcomment=Am meisten kommentiert
issues.filter_sort.leastcomment=Am wenigsten kommentiert
issues.action_open=Offen
issues.action_open=Öffnen
issues.action_close=Schließen
issues.action_label=Label
issues.action_milestone=Meilenstein
@ -679,7 +679,7 @@ issues.open_title=Offen
issues.closed_title=Geschlossen
issues.num_comments=%d Kommentare
issues.commented_at=`kommentierte <a href="#%s">%s</a>`
issues.delete_comment_confirm=Bist du sicher dass du das Kommentar löschen möchtest?
issues.delete_comment_confirm=Bist du sicher dass du diesen Kommentar löschen möchtest?
issues.no_content=Hier gibt es bis jetzt noch keinen Inhalt.
issues.close_issue=Schließen
issues.close_comment_issue=Kommentieren und schließen
@ -708,8 +708,8 @@ issues.label_deletion_desc=Durch das löschen des Labels wird dieses von jeden I
issues.label_deletion_success=Das Label wurde erfolgreich gelöscht!
issues.label.filter_sort.alphabetically=Alphabetisch
issues.label.filter_sort.reverse_alphabetically=Umgekehrt alphabetisch
issues.label.filter_sort.by_size=Größe
issues.label.filter_sort.reverse_by_size=Umgekehrte Größe
issues.label.filter_sort.by_size=Kleinste zuerst
issues.label.filter_sort.reverse_by_size=Größte zuerst
issues.num_participants=%d Beteiligte
issues.attachment.open_tab=`Klicken um "%s" in einem neuen Tab zu öffnen`
issues.attachment.download=`Klicken um "%s" herunterzuladen`
@ -786,7 +786,7 @@ milestones.cancel=Abbrechen
milestones.modify=Meilenstein ändern
milestones.edit_success=Änderungen des Meilensteins '%s' wurden erfolgreich gespeichert!
milestones.deletion=Meilenstein löschen
milestones.deletion_desc=Der Meilenstein wird von allen verknüpften Issues entfernt. Möchtest du fortfahren?
milestones.deletion_desc=Der Meilenstein wird von allen verknüpften Issues entfernt. Fortfahren?
milestones.deletion_success=Meilenstein erfolgreich gelöscht!
milestones.filter_sort.closest_due_date=Nächster Stichtag
milestones.filter_sort.furthest_due_date=Fernster Stichtag
@ -936,7 +936,7 @@ settings.add_collaborator=Mitarbeiter hinzufügen
settings.add_collaborator_success=Neuer Mitarbeiter wurde hinzugefügt.
settings.delete_collaborator=Löschen
settings.collaborator_deletion=Mitarbeiter löschen
settings.collaborator_deletion_desc=Nach dem Löschen wird dieser Benutzer keinen Zugriff mehr als Mitarbeiter auf dieses Repository haben. Möchtest du fortfahren?
settings.collaborator_deletion_desc=Nach dem Löschen wird dieser Benutzer keinen Mitarbeiter-Zugriff mehr auf dieses Repository haben. Fortfahren?
settings.remove_collaborator_success=Mitarbeiter wurde entfernt.
settings.search_user_placeholder=Benutzer suchen…
settings.org_not_allowed_to_be_collaborator=Eine Organisation kann nicht als Mitarbeiter hinzugefügt werden.
@ -944,7 +944,7 @@ settings.user_is_org_member=Benutzer ist ein Organisationsmitglied und kann nich
settings.add_webhook=Webhook hinzufügen
settings.hooks_desc=Webhooks erlauben es dir, externe Dienste zu informieren, wenn etwas Bestimmtes in deinem Repository passiert. Gitea sendet dann einen POST-Request an die angegebene URL. Erfahre mehr im <a target="_blank" rel="noopener" href="%s">Webhooks Guide</a>.
settings.webhook_deletion=Webhook entfernen
settings.webhook_deletion_desc=Das Löschen dieses Webhooks wird alle zugehörigen Informationen und den Übertragungsverlauf entfernen. Wirklich fortfahren?
settings.webhook_deletion_desc=Das Löschen dieses Webhooks wird alle zugehörigen Informationen und den Übertragungsverlauf entfernen. Fortfahren?
settings.webhook_deletion_success=Webhook wurde erfolgreich entfernt!
settings.webhook.test_delivery=Senden testen
settings.webhook.test_delivery_desc=Sendet ein simuliertes Push-Ereignis, um die Webhook-Einstellungen zu testen
@ -959,7 +959,7 @@ settings.githook_edit_desc=Wenn ein Hook nicht aktiv ist, wird der Standardinhal
settings.githook_name=Hook-Name
settings.githook_content=Hook-Inhalt
settings.update_githook=Hook aktualisieren
settings.add_webhook_desc=Gitea sendet einen <code>POST</code>-Request an die unten stehende URL mit Details aller abonnierten Ereignisse. Du kannst auch angeben, welches Datenformat du empfangen möchtest (JSON, x-www-form-urlencoded, etc.). Mehr Informationen findest du im <a target="_blank" rel="noopener" href="%s">Webhooks Guide</a>.
settings.add_webhook_desc=Gitea sendet einen <code>POST</code>-Request an die unten stehende URL mit Details aller abonnierten Ereignisse. Du kannst auch angeben, welches Datenformat du empfangen möchtest (JSON, x-www-form-urlencoded, XML, etc.). Mehr Informationen findest du im <a target="_blank" rel="noopener" href="%s">Webhooks Guide</a>.
settings.payload_url=Payload-URL
settings.content_type=Inhaltstyp
settings.secret=Secret
@ -1006,21 +1006,21 @@ settings.key_been_used=Deploy-Schlüssel wurde verwendet.
settings.key_name_used=Ein Deploy-Schlüssel mit diesem Namen existiert bereits.
settings.add_key_success=Der Deploy-Schlüssel '%s' wurde erfolgreich hinzugefügt!
settings.deploy_key_deletion=Deploy-Schlüssel löschen
settings.deploy_key_deletion_desc=Durch das Löschen dieses Keys wird ein Zugriff damit nicht mehr möglich sein. Fortfahren?
settings.deploy_key_deletion_desc=Durch das Löschen dieses Deploy-Schlüssels wird ein Zugriff damit nicht mehr möglich sein. Fortfahren?
settings.deploy_key_deletion_success=Der Deploy-Schlüssel wurde erfolgreich gelöscht!
settings.branches=Branches
settings.protected_branch=Branch-Schutz
settings.protected_branch=Branch-Protection
settings.protected_branch_can_push=Push erlauben?
settings.protected_branch_can_push_yes=Du kannst pushen
settings.protected_branch_can_push_no=Du kannst nicht pushen
settings.branch_protection=Branch-Protection für <b>%s</b>
settings.protect_this_branch=Diesen Branch schützen
settings.protect_this_branch=Diese Branch schützen
settings.protect_this_branch_desc=Verhindere Force-Pushes sowie Löschungen.
settings.protect_whitelist_committers=Erlaube wer in diesen Branch pushen kann
settings.protect_whitelist_committers=Erlaube wer in diese Branch pushen kann
settings.protect_whitelist_committers_desc=Füge Benutzer oder Teams zur Whitelist hinzu. Benutzer auf der Whitelist können Push-Restriktionen umgehen.
settings.protect_whitelist_users=Benutzer, die in diesen Branch pushen können
settings.protect_whitelist_users=Benutzer, die in diese Branch pushen können
settings.protect_whitelist_search_users=Benutzer suchen
settings.protect_whitelist_teams=Teams, deren Mitglieder in diesen Branch pushen können.
settings.protect_whitelist_teams=Teams, deren Mitglieder in diese Branch pushen können.
settings.protect_whitelist_search_teams=Teams suchen
settings.add_protected_branch=Schutz aktivieren
settings.delete_protected_branch=Schutz deaktivieren
@ -1029,7 +1029,7 @@ settings.remove_protected_branch_success=Branch-Protection für %s erfolgreich e
settings.protected_branch_deletion=Eine geschützte Branch löschen
settings.protected_branch_deletion_desc=Jeder mit Schreibzugriff wird direkt in diese Branch pushen können. Bist du sicher?
settings.default_branch_desc=Die Standardbranch ist als "basis"-Branch in deinem Repository definiert, Commits und Pull-Requests werden automatisch mit dieser Branch durchgeführt wenn du keine andere angibst.
settings.choose_branch=Wähle einen Branch…
settings.choose_branch=Wähle eine Branch…
settings.no_protected_branch=Es gibt keine geschützten Branches
diff.browse_source=Quellcode durchsuchen
@ -1072,21 +1072,21 @@ release.save_draft=Entwurf speichern
release.edit_release=Release bearbeiten
release.delete_release=Dieses Release löschen
release.deletion=Release löschen
release.deletion_desc=Beim Löschen dieses Releases wird das entsprechende Git-Tag gelöscht. Möchtest du fortfahren?
release.deletion_desc=Beim Löschen dieses Releases wird das entsprechende Git-Tag gelöscht. Es wird kein Code gelöscht. Fortfahren?
release.deletion_success=Das Release wurde gelöscht.
release.tag_name_already_exist=Ein Release mit diesem Tag existiert bereits.
release.tag_name_invalid=Tag-Name ist nicht gültig.
release.downloads=Downloads
branch.name=Branch name
branch.name=Branchname
branch.search=Branches durchsuchen
branch.already_exists=Es existiert bereits eine Branch mit dem Namen %s.
branch.delete_head=Löschen
branch.delete=Branch %s löschen
branch.delete_html=Branch löschen
branch.delete_desc=Das Löschen eines Branches kann nicht Rückgängig gemacht werden.
branch.delete_desc=Das Löschen einer Branch kann nicht Rückgängig gemacht werden.
branch.delete_notices_1=- Diese Operation <strong>kann nicht</strong> rückgängig gemacht werden.
branch.delete_notices_2=- Diese Operation wird permanent alle Inhalte des Branches %s löschen.
branch.delete_notices_2=- Diese Operation wird permanent alle Inhalte der Branch %s löschen.
branch.delete_notices_html=- Diese Operation wird permanent alle Inhalte der Branch löschen
branch.deletion_success=%s wurde gelöscht.
branch.deletion_failed=Branch %s konnte nicht gelöscht werden.
@ -1095,7 +1095,7 @@ branch.create_branch=Erstelle Branch <strong>%s</strong>
branch.create_from=von '%s'
branch.create_success=Branch '%s' wurde erfolgreich erstellt!
branch.branch_already_exists=Branch '%s' existiert bereits in diesem Repository.
branch.branch_name_conflict=Branch Name '%s' steht in Konflikt mit dem bestehendem Branch '%s'.
branch.branch_name_conflict=Branch Name '%s' steht in Konflikt mit der bestehendem Branch '%s'.
branch.tag_collision=Branch '%s' kann nicht erstellt werden, da ein Tag mit dem selben Namen bereits in diesem Repository vorhanden ist.
branch.deleted_by=Von %s gelöscht
branch.restore_success=%s wurde erfolgreich wiederhergestellt
@ -1139,7 +1139,7 @@ settings.delete_account=Diese Organisation löschen
settings.delete_prompt=Die Organisation wird dauerhaft gelöscht. Dies kann <strong>NICHT</strong> rückgängig gemacht werden!
settings.confirm_delete_account=Löschen
settings.delete_org_title=Organisation löschen
settings.delete_org_desc=Diese Organisation wird dauerhaft gelöscht. Möchtest du fortfahren?
settings.delete_org_desc=Diese Organisation wird dauerhaft gelöscht. Fortfahren?
settings.hooks_desc=Webhooks hinzufügen, die für <strong>alle</strong> Repositories dieser Organisation ausgelöst werden.
members.membership_visibility=Sichtbarkeit der Mitgliedschaft:
@ -1171,7 +1171,7 @@ teams.update_settings=Einstellungen aktualisieren
teams.delete_team=Dieses Team löschen
teams.add_team_member=Teammitglied hinzufügen
teams.delete_team_title=Team löschen
teams.delete_team_desc=Mitglieder dieses Teams verlieren möglicherweise ihren Zugang zu einigen Repositories, wenn dieses Team gelöscht wird. Möchtest du fortfahren?
teams.delete_team_desc=Mitglieder dieses Teams verlieren möglicherweise ihren Zugang zu einigen Repositories, wenn dieses Team gelöscht wird. Fortfahren?
teams.delete_team_success=Das Team wurde gelöscht.
teams.read_permission_desc=Dieses Team hat <strong>Lesezugriff</strong>: Mitglieder können Team-Repositories einsehen und klonen.
teams.write_permission_desc=Dieses Team hat <strong>Schreibzugriff</strong>: Mitglieder können Team-Repositories einsehen und darauf pushen.
@ -1220,6 +1220,8 @@ dashboard.reinit_missing_repos=Alle Git-Repositories mit Einträgen neu einlesen
dashboard.reinit_missing_repos_success=Alle verlorenen Git-Repositories mit existierenden Einträgen wurden erfolgreich aktualisiert.
dashboard.sync_external_users=Externe Benutzerdaten synchronisieren
dashboard.sync_external_users_started=Externe Benutzersynchronisation gestartet
dashboard.git_fsck=Healthchecks auf alle Repositories ausführen
dashboard.git_fsck_started=Repository-Healthchecks gestartet
dashboard.server_uptime=Server-Uptime
dashboard.current_goroutine=Aktuelle Goroutinen
dashboard.current_memory_usage=Aktuelle Speichernutzung
@ -1260,7 +1262,7 @@ users.created=Registriert am
users.last_login=Letzter Login
users.never_login=Niemals eingeloggt
users.send_register_notify=Registrierungs-Benachrichtigung an den Benutzer senden
users.new_success=Der Account '%s' wurde erfolgreich erstellt.
users.new_success=Das Konto '%s' wurde erfolgreich erstellt.
users.edit=Bearbeiten
users.auth_source=Authentifizierungsquelle
users.local=Lokal
@ -1270,14 +1272,14 @@ users.update_profile_success=Kontoprofil wurde erfolgreich aktualisiert.
users.edit_account=Konto bearbeiten
users.max_repo_creation=Maximal erstellbare Repositories
users.max_repo_creation_desc=(Auf -1 setzen, um das globale Standardlimit zu verwenden)
users.is_activated=Benutzerkonto aktiviert
users.is_activated=Benutzerkonto ist aktiv
users.prohibit_login=Login deaktiviert
users.is_admin=Administratorberechtigungen
users.is_admin=Ist Admin
users.allow_git_hook=Kann Git-Hooks erstellen
users.allow_import_local=Kann lokale Repositories importieren
users.allow_create_organization=Kann Organisationen erstellen
users.update_profile=Konto aktualisieren
users.delete_account=Konto löschen
users.delete_account=Benutzerkonto löschen
users.still_own_repo=Dieser Benutzer besitzt noch eine oder mehr Repositories. Diese Repositories müssen erst gelöscht oder übertragen werden.
users.still_has_org=Dieser Benutzer ist noch Mitglied einer oder mehr Organisationen. Der Benutzer muss diese erst verlassen oder löschen.
users.deletion_success=Benutzerkonto erfolgreich gelöscht.
@ -1361,7 +1363,7 @@ auths.update_success=Die Authentifizierungseinstellungen wurden aktualisiert.
auths.update=Authentifizierungseinstellungen aktualisieren
auths.delete=Diese Authentifizierungsquelle löschen
auths.delete_auth_title=Authentifizierungsquelle löschen
auths.delete_auth_desc=Diese Authentifizierungsquelle wird gelöscht. Möchtest du fortfahren?
auths.delete_auth_desc=Diese Authentifizierungsquelle wird gelöscht. Fortfahren?
auths.still_in_used=Diese Authentifizierung wird noch von einem oder mehreren Nutzern verwendet. Bitte lösche diese Benutzer oder ändere deren Anmeldetyp.
auths.deletion_success=Authentifizierung wurde erfolgreich gelöscht.
auths.login_source_exist=Login-Quelle '%s' ist bereits vorhanden.
@ -1411,7 +1413,7 @@ config.register_email_confirm=E-Mail-Bestätigung erforderlich
config.disable_register=Registrierung deaktivieren
config.enable_openid_signup=Registrierung via OpenID aktivieren
config.enable_openid_signin=Anmelden via OpenID aktivieren
config.show_registration_button=Schaltfläche Registrieren anzeigen
config.show_registration_button=Schaltfläche zum Registrieren anzeigen
config.require_sign_in_view=Ansehen erfordert Anmeldung
config.mail_notify=E-Mail-Benachrichtigung
config.disable_key_size_check=Prüfung der Mindestschlüssellänge deaktiveren
@ -1565,10 +1567,10 @@ mark_all_as_read=Alle als gelesen markieren
[gpg]
error.extract_sign=Die Signatur konnte nicht extrahiert werden
error.generate_hash=Es konnte kein Hash vom Commit generiert werden
error.no_committer_account=Es ist kein Account mit dieser Commiter-Email verbunden
error.no_committer_account=Es ist kein Benutzerkonto mit dieser Commiter-Email verbunden
error.no_gpg_keys_found=Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
error.not_signed_commit=Kein signierter Commit
error.failed_retrieval_gpg_keys=Fehler beim Abrufen eines Keys des Commiter-Accounts
error.failed_retrieval_gpg_keys=Fehler beim Abrufen eines Keys des Commiter-Kontos
[units]
error.no_unit_allowed_repo=Es konnte kein Repository-Element gefunden werden auf welches du Zugriff hast

View File

@ -946,6 +946,7 @@ settings.transfer_form_title = Please enter the following information to confirm
settings.wiki_delete = Erase Wiki Data
settings.wiki_delete_desc = Once you erase wiki data there is no going back. Please be certain.
settings.wiki_delete_notices_1 = - This will delete and disable the wiki for %s
settings.confirm_wiki_delete = Erase Wiki Data
settings.wiki_deletion_success = Repository wiki data have been erased.
settings.delete = Delete This Repository
settings.delete_desc = Once you delete a repository, there is no going back. Please be certain.
@ -1246,6 +1247,8 @@ dashboard.reinit_missing_repos = Reinitialize all missing Git repositories for w
dashboard.reinit_missing_repos_success = All missing Git repositories for which records existed have been reinitialized.
dashboard.sync_external_users = Synchronize external user data
dashboard.sync_external_users_started = External user synchronization started
dashboard.git_fsck = Execute health checks on all repositories
dashboard.git_fsck_started = Repository health checks started
dashboard.server_uptime = Server Uptime
dashboard.current_goroutine = Current Goroutines
dashboard.current_memory_usage = Current Memory Usage

View File

@ -920,6 +920,7 @@ settings.transfer_form_title=Kérlek, add meg a követező információt a műve
settings.wiki_delete=Wiki adatok törlése
settings.wiki_delete_desc=Miután kitörli a Wiki adatokat nincs visszaút. Jól gondolja meg.
settings.wiki_delete_notices_1=- Ez le fogja törölni, és kikapcsolni a Wiki a következőnek: %s
settings.confirm_wiki_delete=Wiki Adatok Törlése
settings.wiki_deletion_success=A tároló Wikijében lévő összes adat törölve.
settings.delete=A tároló törlése
settings.delete_desc=Ha egyszer letöröl egy tárolót, azt nem lehet visszavonni. Bizonyosodjon meg benne, hogy ezt szeretné.
@ -1220,6 +1221,8 @@ dashboard.reinit_missing_repos=Az összes Git tároló újra-inicializálása am
dashboard.reinit_missing_repos_success=Az összes Git tároló amihez létezett bejegyzés újra lett iniciaizálva.
dashboard.sync_external_users=Külső felhasználói adatok szinkronizálása
dashboard.sync_external_users_started=Külső felhasználó szinkronizálása elkezdődött
dashboard.git_fsck=Tárolók állapotának ellenőrzése
dashboard.git_fsck_started=Tárolók állapotának ellenőrzése elindítva
dashboard.server_uptime=Kiszolgáló futási ideje
dashboard.current_goroutine=Jelenlegi Goroutinok
dashboard.current_memory_usage=Jelenlegi memória használat

View File

@ -920,6 +920,7 @@ settings.transfer_form_title=Введите сопутствующую инфо
settings.wiki_delete=Стереть данные Вики
settings.wiki_delete_desc=Будьте внимательны! Удаление всех вики-страниц необратимо.
settings.wiki_delete_notices_1=-Это будет удалено и отключит Вики для %s
settings.confirm_wiki_delete=Стереть данные Вики
settings.wiki_deletion_success=Данные Вики успешно стерты.
settings.delete=Удалить этот репозиторий
settings.delete_desc=Будьте внимательны! Как только вы удалите репозиторий — пути назад не будет.
@ -1220,6 +1221,8 @@ dashboard.reinit_missing_repos=Переинициализировать все
dashboard.reinit_missing_repos_success=Все отсутствующие репозитории Git, для которых существуют записи были повторно инициализированы.
dashboard.sync_external_users=Синхронизировать данные внешних пользователей
dashboard.sync_external_users_started=Запущена синхронизация внешних пользователей
dashboard.git_fsck=Запустить проверку данных всех репозиториев (git fsck)
dashboard.git_fsck_started=Проверка данных запущена
dashboard.server_uptime=Время непрерывной работы сервера
dashboard.current_goroutine=Текущее количество Goroutines
dashboard.current_memory_usage=Текущее использование памяти

View File

@ -4,4 +4,4 @@
"less": "^2.7.2",
"less-plugin-clean-css": "^1.5.1"
}
}
}

File diff suppressed because one or more lines are too long

View File

@ -1,7 +1,7 @@
@footer-margin: 40px;
body {
font-family: "Lato", "Microsoft YaHei", Arial, Helvetica, sans-serif !important;
font-family: "Lato", "Segoe UI", "Microsoft YaHei", Arial, Helvetica, sans-serif !important;
background-color: #fff;
overflow-y: scroll;
-webkit-font-smoothing: antialiased;

View File

@ -989,13 +989,16 @@
margin: 0;
}
.lines-num {
border-right: 1px solid #d4d4d5;
border-color: #d4d4d5;
border-right-width: 1px;
border-right-style: solid;
padding: 0 5px;
}
tbody {
tr {
td.halfwidth {
width: 50%;
// halfwidth is used in split view - and in that case, 1% of each
width: 49%;
}
&.tag-code td, td.tag-code {
@ -1034,23 +1037,33 @@
border-color: #c1e9c1 !important;
}
}
.code-diff-split tbody tr {
// light gray for empty lines before / after commit
&.add-code td:nth-child(1), &.add-code td:nth-child(2),
&.del-code td:nth-child(3), &.del-code td:nth-child(4) {
background-color: #fafafa;
.code-diff-split {
table, tbody {
width: 100%;
}
tbody tr {
// light gray for empty lines before / after commit
&.add-code td:nth-child(1), &.add-code td:nth-child(2),
&.del-code td:nth-child(3), &.del-code td:nth-child(4) {
background-color: #fafafa;
}
&.del-code td:nth-child(1), &.del-code td:nth-child(2),
td.del-code {
background-color: #ffe0e0 !important;
border-color: #f1c0c0 !important;
}
&.del-code td:nth-child(1), &.del-code td:nth-child(2),
td.del-code {
background-color: #ffe0e0 !important;
border-color: #f1c0c0 !important;
}
&.add-code td:nth-child(3), &.add-code td:nth-child(4),
td.add-code{
background-color: #d6fcd6 !important;
border-color: #c1e9c1 !important;
&.add-code td:nth-child(3), &.add-code td:nth-child(4),
td.add-code{
background-color: #d6fcd6 !important;
border-color: #c1e9c1 !important;
}
td:nth-child(3) {
border-left-width: 1px;
border-left-style: solid;
}
}
}
&.file-content {
@ -1263,11 +1276,11 @@
}
@media only screen and (max-width: 767px) {
.dividing.header .stackable.grid .button {
margin-top: 2px;
margin-bottom: 2px;
}
}
.dividing.header .stackable.grid .button {
margin-top: 2px;
margin-bottom: 2px;
}
}
}
&.settings {
@ -1698,14 +1711,14 @@ tbody.commit-list {
}
@media only screen and (max-width: 767px) {
.ui.stackable.menu {
&.mobile--margin-between-items > .item {
margin-top: 5px;
margin-bottom: 5px;
}
&.mobile--no-negative-margins {
margin-left: 0;
margin-right: 0;
}
}
.ui.stackable.menu {
&.mobile--margin-between-items > .item {
margin-top: 5px;
margin-bottom: 5px;
}
&.mobile--no-negative-margins {
margin-left: 0;
margin-right: 0;
}
}
}

394
public/swagger.v1.json vendored
View File

@ -1830,6 +1830,12 @@
"description": "page number of requested issues",
"name": "page",
"in": "query"
},
{
"type": "string",
"description": "search string",
"name": "q",
"in": "query"
}
],
"responses": {
@ -3225,6 +3231,37 @@
},
"/repos/{owner}/{repo}/releases": {
"get": {
"produces": [
"application/json"
],
"tags": [
"repository"
],
"summary": "List a repo's releases",
"operationId": "repoListReleases",
"parameters": [
{
"type": "string",
"description": "owner of the repo",
"name": "owner",
"in": "path",
"required": true
},
{
"type": "string",
"description": "name of the repo",
"name": "repo",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"$ref": "#/responses/ReleaseList"
}
}
},
"post": {
"consumes": [
"application/json"
],
@ -3267,6 +3304,44 @@
}
},
"/repos/{owner}/{repo}/releases/{id}": {
"get": {
"produces": [
"application/json"
],
"tags": [
"repository"
],
"summary": "Get a release",
"operationId": "repoGetRelease",
"parameters": [
{
"type": "string",
"description": "owner of the repo",
"name": "owner",
"in": "path",
"required": true
},
{
"type": "string",
"description": "name of the repo",
"name": "repo",
"in": "path",
"required": true
},
{
"type": "integer",
"description": "id of the release to get",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"$ref": "#/responses/Release"
}
}
},
"delete": {
"tags": [
"repository"
@ -3351,6 +3426,247 @@
}
}
},
"/repos/{owner}/{repo}/releases/{id}/assets": {
"get": {
"produces": [
"application/json"
],
"tags": [
"repository"
],
"summary": "List release's attachments",
"operationId": "repoListReleaseAttachments",
"parameters": [
{
"type": "string",
"description": "owner of the repo",
"name": "owner",
"in": "path",
"required": true
},
{
"type": "string",
"description": "name of the repo",
"name": "repo",
"in": "path",
"required": true
},
{
"type": "integer",
"description": "id of the release",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"$ref": "#/responses/AttachmentList"
}
}
},
"post": {
"consumes": [
"multipart/form-data"
],
"produces": [
"application/json"
],
"tags": [
"repository"
],
"summary": "Create a release attachment",
"operationId": "repoCreateReleaseAttachment",
"parameters": [
{
"type": "string",
"description": "owner of the repo",
"name": "owner",
"in": "path",
"required": true
},
{
"type": "string",
"description": "name of the repo",
"name": "repo",
"in": "path",
"required": true
},
{
"type": "integer",
"description": "id of the release",
"name": "id",
"in": "path",
"required": true
},
{
"type": "string",
"description": "name of the attachment",
"name": "name",
"in": "query"
},
{
"type": "file",
"description": "attachment to upload",
"name": "attachment",
"in": "formData",
"required": true
}
],
"responses": {
"201": {
"$ref": "#/responses/Attachment"
}
}
}
},
"/repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}": {
"get": {
"produces": [
"application/json"
],
"tags": [
"repository"
],
"summary": "Get a release attachment",
"operationId": "repoGetReleaseAttachment",
"parameters": [
{
"type": "string",
"description": "owner of the repo",
"name": "owner",
"in": "path",
"required": true
},
{
"type": "string",
"description": "name of the repo",
"name": "repo",
"in": "path",
"required": true
},
{
"type": "integer",
"description": "id of the release",
"name": "id",
"in": "path",
"required": true
},
{
"type": "integer",
"description": "id of the attachment to get",
"name": "attachment_id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"$ref": "#/responses/Attachment"
}
}
},
"delete": {
"produces": [
"application/json"
],
"tags": [
"repository"
],
"summary": "Delete a release attachment",
"operationId": "repoDeleteReleaseAttachment",
"parameters": [
{
"type": "string",
"description": "owner of the repo",
"name": "owner",
"in": "path",
"required": true
},
{
"type": "string",
"description": "name of the repo",
"name": "repo",
"in": "path",
"required": true
},
{
"type": "integer",
"description": "id of the release",
"name": "id",
"in": "path",
"required": true
},
{
"type": "integer",
"description": "id of the attachment to delete",
"name": "attachment_id",
"in": "path",
"required": true
}
],
"responses": {
"204": {
"$ref": "#/responses/empty"
}
}
},
"patch": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"repository"
],
"summary": "Edit a release attachment",
"operationId": "repoEditReleaseAttachment",
"parameters": [
{
"type": "string",
"description": "owner of the repo",
"name": "owner",
"in": "path",
"required": true
},
{
"type": "string",
"description": "name of the repo",
"name": "repo",
"in": "path",
"required": true
},
{
"type": "integer",
"description": "id of the release",
"name": "id",
"in": "path",
"required": true
},
{
"type": "integer",
"description": "id of the attachment to edit",
"name": "attachment_id",
"in": "path",
"required": true
},
{
"name": "body",
"in": "body",
"schema": {
"$ref": "#/definitions/EditAttachmentOptions"
}
}
],
"responses": {
"201": {
"$ref": "#/responses/Attachment"
}
}
}
},
"/repos/{owner}/{repo}/stargazers": {
"get": {
"produces": [
@ -4994,6 +5310,45 @@
},
"x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea"
},
"Attachment": {
"description": "Attachment a generic attachment",
"type": "object",
"properties": {
"browser_download_url": {
"type": "string",
"x-go-name": "DownloadURL"
},
"created_at": {
"type": "string",
"format": "date-time",
"x-go-name": "Created"
},
"download_count": {
"type": "integer",
"format": "int64",
"x-go-name": "DownloadCount"
},
"id": {
"type": "integer",
"format": "int64",
"x-go-name": "ID"
},
"name": {
"type": "string",
"x-go-name": "Name"
},
"size": {
"type": "integer",
"format": "int64",
"x-go-name": "Size"
},
"uuid": {
"type": "string",
"x-go-name": "UUID"
}
},
"x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea"
},
"Branch": {
"description": "Branch represents a repository branch",
"type": "object",
@ -5202,6 +5557,11 @@
"uniqueItems": true,
"x-go-name": "Key"
},
"read_only": {
"description": "Describe if the key has only read access or read/write",
"type": "boolean",
"x-go-name": "ReadOnly"
},
"title": {
"description": "Title of the key to add",
"type": "string",
@ -5540,6 +5900,17 @@
},
"x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea"
},
"EditAttachmentOptions": {
"description": "EditAttachmentOptions options for editing attachments",
"type": "object",
"properties": {
"name": {
"type": "string",
"x-go-name": "Name"
}
},
"x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea"
},
"EditHookOption": {
"description": "EditHookOption options when modify one hook",
"type": "object",
@ -6459,6 +6830,13 @@
"description": "Release represents a repository release",
"type": "object",
"properties": {
"assets": {
"type": "array",
"items": {
"$ref": "#/definitions/Attachment"
},
"x-go-name": "Attachments"
},
"author": {
"$ref": "#/definitions/User"
},
@ -6848,6 +7226,19 @@
"AccessTokenList": {
"description": "AccessTokenList represents a list of API access token."
},
"Attachment": {
"schema": {
"$ref": "#/definitions/Attachment"
}
},
"AttachmentList": {
"schema": {
"type": "array",
"items": {
"$ref": "#/definitions/Attachment"
}
}
},
"Branch": {
"schema": {
"$ref": "#/definitions/Branch"
@ -7131,7 +7522,7 @@
},
"parameterBodies": {
"schema": {
"$ref": "#/definitions/MigrateRepoForm"
"$ref": "#/definitions/EditAttachmentOptions"
},
"headers": {
"AddCollaboratorOption": {},
@ -7152,6 +7543,7 @@
"CreateTeamOption": {},
"CreateUserOption": {},
"DeleteEmailOption": {},
"EditAttachmentOptions": {},
"EditHookOption": {},
"EditIssueCommentOption": {},
"EditIssueOption": {},

View File

@ -122,6 +122,7 @@ const (
syncRepositoryUpdateHook
reinitMissingRepository
syncExternalUsers
gitFsck
)
// Dashboard show admin panel dashboard
@ -161,6 +162,9 @@ func Dashboard(ctx *context.Context) {
case syncExternalUsers:
success = ctx.Tr("admin.dashboard.sync_external_users_started")
go models.SyncExternalUsers()
case gitFsck:
success = ctx.Tr("admin.dashboard.git_fsck_started")
go models.GitFsck()
}
if err != nil {

View File

@ -469,9 +469,18 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Group("/releases", func() {
m.Combo("").Get(repo.ListReleases).
Post(reqToken(), reqRepoWriter(), context.ReferencesGitRepo(), bind(api.CreateReleaseOption{}), repo.CreateRelease)
m.Combo("/:id").Get(repo.GetRelease).
Patch(reqToken(), reqRepoWriter(), context.ReferencesGitRepo(), bind(api.EditReleaseOption{}), repo.EditRelease).
Delete(reqToken(), reqRepoWriter(), repo.DeleteRelease)
m.Group("/:id", func() {
m.Combo("").Get(repo.GetRelease).
Patch(reqToken(), reqRepoWriter(), context.ReferencesGitRepo(), bind(api.EditReleaseOption{}), repo.EditRelease).
Delete(reqToken(), reqRepoWriter(), repo.DeleteRelease)
m.Group("/assets", func() {
m.Combo("").Get(repo.ListReleaseAttachments).
Post(reqToken(), reqRepoWriter(), repo.CreateReleaseAttachment)
m.Combo("/:asset").Get(repo.GetReleaseAttachment).
Patch(reqToken(), reqRepoWriter(), bind(api.EditAttachmentOptions{}), repo.EditReleaseAttachment).
Delete(reqToken(), reqRepoWriter(), repo.DeleteReleaseAttachment)
})
})
})
m.Post("/mirror-sync", reqToken(), reqRepoWriter(), repo.MirrorSync)
m.Get("/editorconfig/:filename", context.RepoRef(), repo.GetEditorconfig)

View File

@ -13,6 +13,7 @@ import (
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/indexer"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
)
@ -43,6 +44,10 @@ func ListIssues(ctx *context.APIContext) {
// in: query
// description: page number of requested issues
// type: integer
// - name: q
// in: query
// description: search string
// type: string
// responses:
// "200":
// "$ref": "#/responses/IssueList"
@ -56,12 +61,30 @@ func ListIssues(ctx *context.APIContext) {
isClosed = util.OptionalBoolFalse
}
issues, err := models.Issues(&models.IssuesOptions{
RepoIDs: []int64{ctx.Repo.Repository.ID},
Page: ctx.QueryInt("page"),
PageSize: setting.UI.IssuePagingNum,
IsClosed: isClosed,
})
var issues []*models.Issue
keyword := strings.Trim(ctx.Query("q"), " ")
if strings.IndexByte(keyword, 0) >= 0 {
keyword = ""
}
var issueIDs []int64
var err error
if len(keyword) > 0 {
issueIDs, err = indexer.SearchIssuesByKeyword(ctx.Repo.Repository.ID, keyword)
}
// Only fetch the issues if we either don't have a keyword or the search returned issues
// This would otherwise return all issues if no issues were found by the search.
if len(keyword) == 0 || len(issueIDs) > 0 {
issues, err = models.Issues(&models.IssuesOptions{
RepoIDs: []int64{ctx.Repo.Repository.ID},
Page: ctx.QueryInt("page"),
PageSize: setting.UI.IssuePagingNum,
IsClosed: isClosed,
IssueIDs: issueIDs,
})
}
if err != nil {
ctx.Error(500, "Issues", err)
return

View File

@ -13,7 +13,7 @@ import (
// GetRelease get a single release of a repository
func GetRelease(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/releases repository repoGetRelease
// swagger:operation GET /repos/{owner}/{repo}/releases/{id} repository repoGetRelease
// ---
// summary: Get a release
// produces:
@ -29,7 +29,7 @@ func GetRelease(ctx *context.APIContext) {
// description: name of the repo
// type: string
// required: true
// - name: repo
// - name: id
// in: path
// description: id of the release to get
// type: integer

View File

@ -0,0 +1,322 @@
// Copyright 2018 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package repo
import (
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/setting"
api "code.gitea.io/sdk/gitea"
"errors"
"net/http"
"strings"
)
// GetReleaseAttachment gets a single attachment of the release
func GetReleaseAttachment(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/releases/{id}/assets/{attachment_id} repository repoGetReleaseAttachment
// ---
// summary: Get a release attachment
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// - name: id
// in: path
// description: id of the release
// type: integer
// required: true
// - name: attachment_id
// in: path
// description: id of the attachment to get
// type: integer
// required: true
// responses:
// "200":
// "$ref": "#/responses/Attachment"
releaseID := ctx.ParamsInt64(":id")
attachID := ctx.ParamsInt64(":asset")
attach, err := models.GetAttachmentByID(attachID)
if err != nil {
ctx.Error(500, "GetAttachmentByID", err)
return
}
if attach.ReleaseID != releaseID {
ctx.Status(404)
return
}
// FIXME Should prove the existence of the given repo, but results in unnecessary database requests
ctx.JSON(200, attach.APIFormat())
}
// ListReleaseAttachments lists all attachments of the release
func ListReleaseAttachments(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/releases/{id}/assets repository repoListReleaseAttachments
// ---
// summary: List release's attachments
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// - name: id
// in: path
// description: id of the release
// type: integer
// required: true
// responses:
// "200":
// "$ref": "#/responses/AttachmentList"
releaseID := ctx.ParamsInt64(":id")
release, err := models.GetReleaseByID(releaseID)
if err != nil {
ctx.Error(500, "GetReleaseByID", err)
return
}
if release.RepoID != ctx.Repo.Repository.ID {
ctx.Status(404)
return
}
if err := release.LoadAttributes(); err != nil {
ctx.Error(500, "LoadAttributes", err)
return
}
ctx.JSON(200, release.APIFormat().Attachments)
}
// CreateReleaseAttachment creates an attachment and saves the given file
func CreateReleaseAttachment(ctx *context.APIContext) {
// swagger:operation POST /repos/{owner}/{repo}/releases/{id}/assets repository repoCreateReleaseAttachment
// ---
// summary: Create a release attachment
// produces:
// - application/json
// consumes:
// - multipart/form-data
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// - name: id
// in: path
// description: id of the release
// type: integer
// required: true
// - name: name
// in: query
// description: name of the attachment
// type: string
// required: false
// - name: attachment
// in: formData
// description: attachment to upload
// type: file
// required: true
// responses:
// "201":
// "$ref": "#/responses/Attachment"
// Check if attachments are enabled
if !setting.AttachmentEnabled {
ctx.Error(404, "AttachmentEnabled", errors.New("attachment is not enabled"))
return
}
// Check if release exists an load release
releaseID := ctx.ParamsInt64(":id")
release, err := models.GetReleaseByID(releaseID)
if err != nil {
ctx.Error(500, "GetReleaseByID", err)
return
}
// Get uploaded file from request
file, header, err := ctx.GetFile("attachment")
if err != nil {
ctx.Error(500, "GetFile", err)
return
}
defer file.Close()
buf := make([]byte, 1024)
n, _ := file.Read(buf)
if n > 0 {
buf = buf[:n]
}
// Check if the filetype is allowed by the settings
fileType := http.DetectContentType(buf)
allowedTypes := strings.Split(setting.AttachmentAllowedTypes, ",")
allowed := false
for _, t := range allowedTypes {
t := strings.Trim(t, " ")
if t == "*/*" || t == fileType {
allowed = true
break
}
}
if !allowed {
ctx.Error(400, "DetectContentType", errors.New("File type is not allowed"))
return
}
var filename = header.Filename
if query := ctx.Query("name"); query != "" {
filename = query
}
// Create a new attachment and save the file
attach, err := models.NewAttachment(filename, buf, file)
if err != nil {
ctx.Error(500, "NewAttachment", err)
return
}
attach.ReleaseID = release.ID
if err := models.UpdateAttachment(attach); err != nil {
ctx.Error(500, "UpdateAttachment", err)
return
}
ctx.JSON(201, attach.APIFormat())
}
// EditReleaseAttachment updates the given attachment
func EditReleaseAttachment(ctx *context.APIContext, form api.EditAttachmentOptions) {
// swagger:operation PATCH /repos/{owner}/{repo}/releases/{id}/assets/{attachment_id} repository repoEditReleaseAttachment
// ---
// summary: Edit a release attachment
// produces:
// - application/json
// consumes:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// - name: id
// in: path
// description: id of the release
// type: integer
// required: true
// - name: attachment_id
// in: path
// description: id of the attachment to edit
// type: integer
// required: true
// - name: body
// in: body
// schema:
// "$ref": "#/definitions/EditAttachmentOptions"
// responses:
// "201":
// "$ref": "#/responses/Attachment"
// Check if release exists an load release
releaseID := ctx.ParamsInt64(":id")
attachID := ctx.ParamsInt64(":attachment")
attach, err := models.GetAttachmentByID(attachID)
if err != nil {
ctx.Error(500, "GetAttachmentByID", err)
return
}
if attach.ReleaseID != releaseID {
ctx.Status(404)
return
}
// FIXME Should prove the existence of the given repo, but results in unnecessary database requests
if form.Name != "" {
attach.Name = form.Name
}
if err := models.UpdateAttachment(attach); err != nil {
ctx.Error(500, "UpdateAttachment", attach)
}
ctx.JSON(201, attach.APIFormat())
}
// DeleteReleaseAttachment delete a given attachment
func DeleteReleaseAttachment(ctx *context.APIContext) {
// swagger:operation DELETE /repos/{owner}/{repo}/releases/{id}/assets/{attachment_id} repository repoDeleteReleaseAttachment
// ---
// summary: Delete a release attachment
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// - name: id
// in: path
// description: id of the release
// type: integer
// required: true
// - name: attachment_id
// in: path
// description: id of the attachment to delete
// type: integer
// required: true
// responses:
// "204":
// "$ref": "#/responses/empty"
// Check if release exists an load release
releaseID := ctx.ParamsInt64(":id")
attachID := ctx.ParamsInt64(":attachment")
attach, err := models.GetAttachmentByID(attachID)
if err != nil {
ctx.Error(500, "GetAttachmentByID", err)
return
}
if attach.ReleaseID != releaseID {
ctx.Status(404)
return
}
// FIXME Should prove the existence of the given repo, but results in unnecessary database requests
if err := models.DeleteAttachment(attach, true); err != nil {
ctx.Error(500, "DeleteAttachment", err)
return
}
ctx.Status(204)
}

View File

@ -63,4 +63,6 @@ type swaggerParameterBodies struct {
EditUserOption api.EditUserOption
MigrateRepoForm auth.MigrateRepoForm
EditAttachmentOptions api.EditAttachmentOptions
}

View File

@ -90,3 +90,15 @@ type swaggerResponseWatchInfo struct {
type swaggerResponseSearchResults struct {
Body api.SearchResults `json:"body"`
}
// swagger:response AttachmentList
type swaggerResponseAttachmentList struct {
//in: body
Body []api.Attachment `json:"body"`
}
// swagger:response Attachment
type swaggerResponseAttachment struct {
//in: body
Body api.Attachment `json:"body"`
}

View File

@ -55,6 +55,7 @@ func UploadAttachment(ctx *context.Context) {
}
if !allowed {
log.Info("Attachment with type %s blocked from upload", fileType)
ctx.Error(400, ErrFileTypeForbidden.Error())
return
}

View File

@ -49,6 +49,10 @@
<td>{{.i18n.Tr "admin.dashboard.sync_external_users"}}</td>
<td><i class="fa fa-caret-square-o-right"></i> <a href="{{AppSubUrl}}/admin?op=8">{{.i18n.Tr "admin.dashboard.operation_run"}}</a></td>
</tr>
<tr>
<td>{{.i18n.Tr "admin.dashboard.git_fsck"}}</td>
<td><i class="fa fa-caret-square-o-right"></i> <a href="{{AppSubUrl}}/admin?op=9">{{.i18n.Tr "admin.dashboard.operation_run"}}</a></td>
</tr>
</tbody>
</table>
</div>

View File

@ -405,7 +405,7 @@
{{if .Repository.UnitEnabled $.UnitTypeWiki}}
<div class="ui small modal" id="delete-wiki-modal">
<div class="header">
{{.i18n.Tr "repo.settings.wiki-delete"}}
{{.i18n.Tr "repo.settings.wiki_delete"}}
</div>
<div class="content">
<div class="ui warning message text left">
@ -428,7 +428,7 @@
<div class="text right actions">
<div class="ui cancel button">{{.i18n.Tr "settings.cancel"}}</div>
<button class="ui red button">{{.i18n.Tr "repo.settings.confirm_delete"}}</button>
<button class="ui red button">{{.i18n.Tr "repo.settings.confirm_wiki_delete"}}</button>
</div>
</form>
</div>

View File

@ -12,7 +12,7 @@ import (
// CreateUserOption create user options
type CreateUserOption struct {
SourceID int64 `json:"source_id"`
SourceID int64 `json:"source_id"`
LoginName string `json:"login_name"`
// required: true
Username string `json:"username" binding:"Required;AlphaDashDot;MaxSize(35)"`
@ -21,8 +21,8 @@ type CreateUserOption struct {
// swagger:strfmt email
Email string `json:"email" binding:"Required;Email;MaxSize(254)"`
// required: true
Password string `json:"password" binding:"Required;MaxSize(255)"`
SendNotify bool `json:"send_notify"`
Password string `json:"password" binding:"Required;MaxSize(255)"`
SendNotify bool `json:"send_notify"`
}
// AdminCreateUser create a user
@ -37,20 +37,20 @@ func (c *Client) AdminCreateUser(opt CreateUserOption) (*User, error) {
// EditUserOption edit user options
type EditUserOption struct {
SourceID int64 `json:"source_id"`
SourceID int64 `json:"source_id"`
LoginName string `json:"login_name"`
FullName string `json:"full_name" binding:"MaxSize(100)"`
FullName string `json:"full_name" binding:"MaxSize(100)"`
// required: true
// swagger:strfmt email
Email string `json:"email" binding:"Required;Email;MaxSize(254)"`
Password string `json:"password" binding:"MaxSize(255)"`
Website string `json:"website" binding:"MaxSize(50)"`
Location string `json:"location" binding:"MaxSize(50)"`
Active *bool `json:"active"`
Admin *bool `json:"admin"`
AllowGitHook *bool `json:"allow_git_hook"`
AllowImportLocal *bool `json:"allow_import_local"`
MaxRepoCreation *int `json:"max_repo_creation"`
Email string `json:"email" binding:"Required;Email;MaxSize(254)"`
Password string `json:"password" binding:"MaxSize(255)"`
Website string `json:"website" binding:"MaxSize(50)"`
Location string `json:"location" binding:"MaxSize(50)"`
Active *bool `json:"active"`
Admin *bool `json:"admin"`
AllowGitHook *bool `json:"allow_git_hook"`
AllowImportLocal *bool `json:"allow_import_local"`
MaxRepoCreation *int `json:"max_repo_creation"`
}
// AdminEditUser modify user informations

View File

@ -3,15 +3,90 @@
// license that can be found in the LICENSE file.
package gitea // import "code.gitea.io/sdk/gitea"
import "time"
import (
"bytes"
"encoding/json"
"fmt"
"io"
"mime/multipart"
"net/http"
"time"
)
// Attachment a generic attachment
// swagger:model
type Attachment struct {
ID int64 `json:"id"`
Name string `json:"name"`
Size int64 `json:"size"`
DownloadCount int64 `json:"download_count"`
Created time.Time `json:"created_at"`
UUID string `json:"uuid"`
DownloadURL string `json:"browser_download_url"`
ID int64 `json:"id"`
Name string `json:"name"`
Size int64 `json:"size"`
DownloadCount int64 `json:"download_count"`
// swagger:strfmt date-time
Created time.Time `json:"created_at"`
UUID string `json:"uuid"`
DownloadURL string `json:"browser_download_url"`
}
// ListReleaseAttachments list release's attachments
func (c *Client) ListReleaseAttachments(user, repo string, release int64) ([]*Attachment, error) {
attachments := make([]*Attachment, 0, 10)
err := c.getParsedResponse("GET",
fmt.Sprintf("/repos/%s/%s/releases/%d/assets", user, repo, release),
nil, nil, &attachments)
return attachments, err
}
// ListReleaseAttachments list release's attachments
func (c *Client) GetReleaseAttachment(user, repo string, release int64, id int64) (*Attachment, error) {
a := new(Attachment)
err := c.getParsedResponse("GET",
fmt.Sprintf("/repos/%s/%s/releases/%d/assets/%d", user, repo, release, id),
nil, nil, &a)
return a, err
}
// CreateReleaseAttachment creates an attachment for the given release
func (c *Client) CreateReleaseAttachment(user, repo string, release int64, file io.Reader, filename string) (*Attachment, error) {
// Write file to body
body := new(bytes.Buffer)
writer := multipart.NewWriter(body)
part, err := writer.CreateFormFile("attachment", filename)
if err != nil {
return nil, err
}
if _, err = io.Copy(part, file); err != nil {
return nil, err
}
if err = writer.Close(); err != nil {
return nil, err
}
// Send request
attachment := new(Attachment)
err = c.getParsedResponse("POST",
fmt.Sprintf("/repos/%s/%s/releases/%d/assets", user, repo, release),
http.Header{"Content-Type": {writer.FormDataContentType()}}, body, &attachment)
return attachment, err
}
// EditReleaseAttachment updates the given attachment with the given options
func (c *Client) EditReleaseAttachment(user, repo string, release int64, attachment int64, form EditAttachmentOptions) (*Attachment, error) {
body, err := json.Marshal(&form)
if err != nil {
return nil, err
}
attach := new(Attachment)
return attach, c.getParsedResponse("PATCH", fmt.Sprintf("/repos/%s/%s/releases/%d/assets/%d", user, repo, release, attachment), jsonHeader, bytes.NewReader(body), attach)
}
// DeleteReleaseAttachment deletes the given attachment including the uploaded file
func (c *Client) DeleteReleaseAttachment(user, repo string, release int64, id int64) error {
_, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/releases/%d/assets/%d", user, repo, release, id), nil, nil)
return err
}
// EditAttachmentOptions options for editing attachments
// swagger:model
type EditAttachmentOptions struct {
Name string `json:"name"`
}

View File

@ -7,6 +7,7 @@ package gitea
import (
"encoding/json"
"errors"
"fmt"
"io"
"io/ioutil"
"net/http"
@ -69,6 +70,8 @@ func (c *Client) getResponse(method, path string, header http.Header, body io.Re
return nil, errors.New("403 Forbidden")
case 404:
return nil, errors.New("404 Not Found")
case 422:
return nil, fmt.Errorf("422 Unprocessable Entity: %s", string(data))
}
if resp.StatusCode/100 != 2 {

View File

@ -21,16 +21,16 @@ var (
// Hook a hook is a web hook when one repository changed
type Hook struct {
ID int64 `json:"id"`
Type string `json:"type"`
URL string `json:"-"`
Config map[string]string `json:"config"`
Events []string `json:"events"`
Active bool `json:"active"`
ID int64 `json:"id"`
Type string `json:"type"`
URL string `json:"-"`
Config map[string]string `json:"config"`
Events []string `json:"events"`
Active bool `json:"active"`
// swagger:strfmt date-time
Updated time.Time `json:"updated_at"`
Updated time.Time `json:"updated_at"`
// swagger:strfmt date-time
Created time.Time `json:"created_at"`
Created time.Time `json:"created_at"`
}
// HookList represents a list of API hook.
@ -67,7 +67,7 @@ type CreateHookOption struct {
Type string `json:"type" binding:"Required"`
// required: true
Config map[string]string `json:"config" binding:"Required"`
Events []string `json:"events"`
Events []string `json:"events"`
// default: false
Active bool `json:"active"`
}
@ -95,8 +95,8 @@ func (c *Client) CreateRepoHook(user, repo string, opt CreateHookOption) (*Hook,
// EditHookOption options when modify one hook
type EditHookOption struct {
Config map[string]string `json:"config"`
Events []string `json:"events"`
Active *bool `json:"active"`
Events []string `json:"events"`
Active *bool `json:"active"`
}
// EditOrgHook modify one hook of an organization, with hook id and options
@ -140,7 +140,7 @@ type Payloader interface {
// PayloadUser represents the author or committer of a commit
type PayloadUser struct {
// Full name of the commit author
Name string `json:"name"`
Name string `json:"name"`
// swagger:strfmt email
Email string `json:"email"`
UserName string `json:"username"`
@ -159,7 +159,7 @@ type PayloadCommit struct {
Committer *PayloadUser `json:"committer"`
Verification *PayloadCommitVerification `json:"verification"`
// swagger:strfmt date-time
Timestamp time.Time `json:"timestamp"`
Timestamp time.Time `json:"timestamp"`
}
// PayloadCommitVerification represents the GPG verification of a commit

View File

@ -43,12 +43,12 @@ type Issue struct {
//
// type: string
// enum: open,closed
State StateType `json:"state"`
Comments int `json:"comments"`
State StateType `json:"state"`
Comments int `json:"comments"`
// swagger:strfmt date-time
Created time.Time `json:"created_at"`
Created time.Time `json:"created_at"`
// swagger:strfmt date-time
Updated time.Time `json:"updated_at"`
Updated time.Time `json:"updated_at"`
PullRequest *PullRequestMeta `json:"pull_request"`
}
@ -86,15 +86,15 @@ func (c *Client) GetIssue(owner, repo string, index int64) (*Issue, error) {
// CreateIssueOption options to create one issue
type CreateIssueOption struct {
// required:true
Title string `json:"title" binding:"Required"`
Body string `json:"body"`
Title string `json:"title" binding:"Required"`
Body string `json:"body"`
// username of assignee
Assignee string `json:"assignee"`
Assignee string `json:"assignee"`
// milestone id
Milestone int64 `json:"milestone"`
Milestone int64 `json:"milestone"`
// list of label ids
Labels []int64 `json:"labels"`
Closed bool `json:"closed"`
Labels []int64 `json:"labels"`
Closed bool `json:"closed"`
}
// CreateIssue create a new issue for a given repository

View File

@ -13,16 +13,16 @@ import (
// Comment represents a comment on a commit or issue
type Comment struct {
ID int64 `json:"id"`
HTMLURL string `json:"html_url"`
PRURL string `json:"pull_request_url"`
IssueURL string `json:"issue_url"`
Poster *User `json:"user"`
Body string `json:"body"`
ID int64 `json:"id"`
HTMLURL string `json:"html_url"`
PRURL string `json:"pull_request_url"`
IssueURL string `json:"issue_url"`
Poster *User `json:"user"`
Body string `json:"body"`
// swagger:strfmt date-time
Created time.Time `json:"created_at"`
Created time.Time `json:"created_at"`
// swagger:strfmt date-time
Updated time.Time `json:"updated_at"`
Updated time.Time `json:"updated_at"`
}
// ListIssueComments list comments on an issue.

View File

@ -13,8 +13,8 @@ import (
// Label a label to an issue or a pr
// swagger:model
type Label struct {
ID int64 `json:"id"`
Name string `json:"name"`
ID int64 `json:"id"`
Name string `json:"name"`
// example: 00aabb
Color string `json:"color"`
URL string `json:"url"`
@ -36,7 +36,7 @@ func (c *Client) GetRepoLabel(owner, repo string, id int64) (*Label, error) {
// CreateLabelOption options for creating a label
type CreateLabelOption struct {
// required:true
Name string `json:"name" binding:"Required"`
Name string `json:"name" binding:"Required"`
// required:true
// example: #00aabb
Color string `json:"color" binding:"Required;Size(7)"`

View File

@ -13,16 +13,16 @@ import (
// Milestone milestone is a collection of issues on one repository
type Milestone struct {
ID int64 `json:"id"`
Title string `json:"title"`
Description string `json:"description"`
State StateType `json:"state"`
OpenIssues int `json:"open_issues"`
ClosedIssues int `json:"closed_issues"`
ID int64 `json:"id"`
Title string `json:"title"`
Description string `json:"description"`
State StateType `json:"state"`
OpenIssues int `json:"open_issues"`
ClosedIssues int `json:"closed_issues"`
// swagger:strfmt date-time
Closed *time.Time `json:"closed_at"`
Closed *time.Time `json:"closed_at"`
// swagger:strfmt date-time
Deadline *time.Time `json:"due_on"`
Deadline *time.Time `json:"due_on"`
}
// ListRepoMilestones list all the milestones of one repository
@ -39,10 +39,10 @@ func (c *Client) GetMilestone(owner, repo string, id int64) (*Milestone, error)
// CreateMilestoneOption options for creating a milestone
type CreateMilestoneOption struct {
Title string `json:"title"`
Description string `json:"description"`
Title string `json:"title"`
Description string `json:"description"`
// swagger:strfmt date-time
Deadline *time.Time `json:"due_on"`
Deadline *time.Time `json:"due_on"`
}
// CreateMilestone create one milestone with options

View File

@ -13,7 +13,7 @@ import (
// TrackedTime worked time for an issue / pr
type TrackedTime struct {
ID int64 `json:"id"`
ID int64 `json:"id"`
// swagger:strfmt date-time
Created time.Time `json:"created"`
// Time in seconds

View File

@ -42,11 +42,11 @@ func (c *Client) GetOrg(orgname string) (*Organization, error) {
// CreateOrgOption options for creating an organization
type CreateOrgOption struct {
// required: true
UserName string `json:"username" binding:"Required"`
FullName string `json:"full_name"`
UserName string `json:"username" binding:"Required"`
FullName string `json:"full_name"`
Description string `json:"description"`
Website string `json:"website"`
Location string `json:"location"`
Website string `json:"website"`
Location string `json:"location"`
}
// EditOrgOption options for editing an organization

View File

@ -10,7 +10,7 @@ type Team struct {
Name string `json:"name"`
Description string `json:"description"`
// enum: none,read,write,admin,owner
Permission string `json:"permission"`
Permission string `json:"permission"`
}
// CreateTeamOption options for creating a team
@ -19,7 +19,7 @@ type CreateTeamOption struct {
Name string `json:"name" binding:"Required;AlphaDashDot;MaxSize(30)"`
Description string `json:"description" binding:"MaxSize(255)"`
// enum: read,write,admin
Permission string `json:"permission"`
Permission string `json:"permission"`
}
// EditTeamOption options for editing a team
@ -28,5 +28,5 @@ type EditTeamOption struct {
Name string `json:"name" binding:"Required;AlphaDashDot;MaxSize(30)"`
Description string `json:"description" binding:"MaxSize(255)"`
// enum: read,write,admin
Permission string `json:"permission"`
Permission string `json:"permission"`
}

View File

@ -29,8 +29,8 @@ type PullRequest struct {
DiffURL string `json:"diff_url"`
PatchURL string `json:"patch_url"`
Mergeable bool `json:"mergeable"`
HasMerged bool `json:"merged"`
Mergeable bool `json:"mergeable"`
HasMerged bool `json:"merged"`
// swagger:strfmt date-time
Merged *time.Time `json:"merged_at"`
MergedCommitID *string `json:"merge_commit_sha"`

View File

@ -13,21 +13,22 @@ import (
// Release represents a repository release
type Release struct {
ID int64 `json:"id"`
TagName string `json:"tag_name"`
Target string `json:"target_commitish"`
Title string `json:"name"`
Note string `json:"body"`
URL string `json:"url"`
TarURL string `json:"tarball_url"`
ZipURL string `json:"zipball_url"`
IsDraft bool `json:"draft"`
IsPrerelease bool `json:"prerelease"`
ID int64 `json:"id"`
TagName string `json:"tag_name"`
Target string `json:"target_commitish"`
Title string `json:"name"`
Note string `json:"body"`
URL string `json:"url"`
TarURL string `json:"tarball_url"`
ZipURL string `json:"zipball_url"`
IsDraft bool `json:"draft"`
IsPrerelease bool `json:"prerelease"`
// swagger:strfmt date-time
CreatedAt time.Time `json:"created_at"`
CreatedAt time.Time `json:"created_at"`
// swagger:strfmt date-time
PublishedAt time.Time `json:"published_at"`
Publisher *User `json:"author"`
PublishedAt time.Time `json:"published_at"`
Publisher *User `json:"author"`
Attachments []*Attachment `json:"assets"`
}
// ListReleases list releases of a repository

View File

@ -41,10 +41,10 @@ type Repository struct {
OpenIssues int `json:"open_issues_count"`
DefaultBranch string `json:"default_branch"`
// swagger:strfmt date-time
Created time.Time `json:"created_at"`
Created time.Time `json:"created_at"`
// swagger:strfmt date-time
Updated time.Time `json:"updated_at"`
Permissions *Permission `json:"permissions,omitempty"`
Updated time.Time `json:"updated_at"`
Permissions *Permission `json:"permissions,omitempty"`
}
// ListMyRepos lists all repositories for the authenticated user that has access to.
@ -122,15 +122,15 @@ func (c *Client) DeleteRepo(owner, repo string) error {
// MigrateRepoOption options for migrating a repository from an external service
type MigrateRepoOption struct {
// required: true
CloneAddr string `json:"clone_addr" binding:"Required"`
CloneAddr string `json:"clone_addr" binding:"Required"`
AuthUsername string `json:"auth_username"`
AuthPassword string `json:"auth_password"`
// required: true
UID int `json:"uid" binding:"Required"`
// required: true
RepoName string `json:"repo_name" binding:"Required"`
Mirror bool `json:"mirror"`
Private bool `json:"private"`
RepoName string `json:"repo_name" binding:"Required"`
Mirror bool `json:"mirror"`
Private bool `json:"private"`
Description string `json:"description"`
}

View File

@ -13,10 +13,10 @@ import (
// DeployKey a deploy key
type DeployKey struct {
ID int64 `json:"id"`
Key string `json:"key"`
URL string `json:"url"`
Title string `json:"title"`
ID int64 `json:"id"`
Key string `json:"key"`
URL string `json:"url"`
Title string `json:"title"`
// swagger:strfmt date-time
Created time.Time `json:"created_at"`
ReadOnly bool `json:"read_only"`

View File

@ -38,9 +38,9 @@ type Status struct {
Context string `json:"context"`
Creator *User `json:"creator"`
// swagger:strfmt date-time
Created time.Time `json:"created_at"`
Created time.Time `json:"created_at"`
// swagger:strfmt date-time
Updated time.Time `json:"updated_at"`
Updated time.Time `json:"updated_at"`
}
// CombinedStatus holds the combined state of several statuses for a single commit

View File

@ -13,13 +13,13 @@ import (
// swagger:model
type User struct {
// the user's id
ID int64 `json:"id"`
ID int64 `json:"id"`
// the user's username
UserName string `json:"login"`
UserName string `json:"login"`
// the user's full name
FullName string `json:"full_name"`
FullName string `json:"full_name"`
// swagger:strfmt email
Email string `json:"email"`
Email string `json:"email"`
// URL to the user's avatar
AvatarURL string `json:"avatar_url"`
}

View File

@ -24,9 +24,9 @@ type GPGKey struct {
CanEncryptStorage bool `json:"can_encrypt_storage"`
CanCertify bool `json:"can_certify"`
// swagger:strfmt date-time
Created time.Time `json:"created_at,omitempty"`
Created time.Time `json:"created_at,omitempty"`
// swagger:strfmt date-time
Expires time.Time `json:"expires_at,omitempty"`
Expires time.Time `json:"expires_at,omitempty"`
}
// GPGKeyEmail an email attached to a GPGKey

14
vendor/code.gitea.io/sdk/gitea/user_search.go generated vendored Normal file
View File

@ -0,0 +1,14 @@
package gitea
import "fmt"
type searchUsersResponse struct {
Users []*User `json:"data"`
}
// SearchUsers finds users by query
func (c *Client) SearchUsers(query string, limit int) ([]*User, error) {
resp := new(searchUsersResponse)
err := c.getParsedResponse("GET", fmt.Sprintf("/users/search?q=%s&limit=%d", query, limit), nil, nil, &resp)
return resp.Users, err
}

6
vendor/vendor.json vendored
View File

@ -9,10 +9,10 @@
"revisionTime": "2018-02-10T03:05:43Z"
},
{
"checksumSHA1": "Qtq0kW+BnpYMOriaoCjMa86WGG8=",
"checksumSHA1": "PWaIU7g1YSkETxka2DIS1EYsPK0=",
"path": "code.gitea.io/sdk/gitea",
"revision": "79eee8f12c7fc1cc5b802c5cdc5b494ef3733866",
"revisionTime": "2017-12-20T06:57:50Z"
"revision": "cdbef997666132599cc92dc22aa94de3db04adeb",
"revisionTime": "2018-03-02T14:48:43Z"
},
{
"checksumSHA1": "bOODD4Gbw3GfcuQPU2dI40crxxk=",