Skip to content

Commit ee52d2d

Browse files
Merge remote-tracking branch 'upstream/master' into team-grant-all-repos-work
# Conflicts: # models/repo.go
2 parents c4546cd + 70fa80d commit ee52d2d

File tree

16 files changed

+190
-92
lines changed

16 files changed

+190
-92
lines changed

models/repo.go

Lines changed: 33 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -742,6 +742,28 @@ func (repo *Repository) CanUserFork(user *User) (bool, error) {
742742
return false, nil
743743
}
744744

745+
// CanUserDelete returns true if user could delete the repository
746+
func (repo *Repository) CanUserDelete(user *User) (bool, error) {
747+
if user.IsAdmin || user.ID == repo.OwnerID {
748+
return true, nil
749+
}
750+
751+
if err := repo.GetOwner(); err != nil {
752+
return false, err
753+
}
754+
755+
if repo.Owner.IsOrganization() {
756+
isOwner, err := repo.Owner.IsOwnedBy(user.ID)
757+
if err != nil {
758+
return false, err
759+
} else if isOwner {
760+
return true, nil
761+
}
762+
}
763+
764+
return false, nil
765+
}
766+
745767
// CanEnablePulls returns true if repository meets the requirements of accepting pulls.
746768
func (repo *Repository) CanEnablePulls() bool {
747769
return !repo.IsMirror && !repo.IsEmpty
@@ -1437,14 +1459,6 @@ func createRepository(e *xorm.Session, doer, u *User, repo *Repository) (err err
14371459
}
14381460
}
14391461
}
1440-
if err := prepareWebhooks(e, repo, HookEventRepository, &api.RepositoryPayload{
1441-
Action: api.HookRepoCreated,
1442-
Repository: repo.innerAPIFormat(e, AccessModeOwner, false),
1443-
Organization: u.APIFormat(),
1444-
Sender: doer.APIFormat(),
1445-
}); err != nil {
1446-
return fmt.Errorf("prepareWebhooks: %v", err)
1447-
}
14481462
} else if err = repo.recalculateAccesses(e); err != nil {
14491463
// Organization automatically called this in addRepository method.
14501464
return fmt.Errorf("recalculateAccesses: %v", err)
@@ -1527,11 +1541,6 @@ func CreateRepository(doer, u *User, opts CreateRepoOptions) (_ *Repository, err
15271541
return nil, err
15281542
}
15291543

1530-
// Add to hook queue for created repo after session commit.
1531-
if u.IsOrganization() {
1532-
go HookQueue.Add(repo.ID)
1533-
}
1534-
15351544
return repo, err
15361545
}
15371546

@@ -2053,18 +2062,6 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
20532062
return fmt.Errorf("Commit: %v", err)
20542063
}
20552064

2056-
if org.IsOrganization() {
2057-
if err = PrepareWebhooks(repo, HookEventRepository, &api.RepositoryPayload{
2058-
Action: api.HookRepoDeleted,
2059-
Repository: repo.APIFormat(AccessModeOwner),
2060-
Organization: org.APIFormat(),
2061-
Sender: doer.APIFormat(),
2062-
}); err != nil {
2063-
return err
2064-
}
2065-
go HookQueue.Add(repo.ID)
2066-
}
2067-
20682065
if len(repo.Avatar) > 0 {
20692066
avatarPath := repo.CustomAvatarPath()
20702067
if com.IsExist(avatarPath) {
@@ -2074,7 +2071,6 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
20742071
}
20752072
}
20762073

2077-
DeleteRepoFromIndexer(repo)
20782074
return nil
20792075
}
20802076

@@ -2530,22 +2526,22 @@ func HasForkedRepo(ownerID, repoID int64) (*Repository, bool) {
25302526
}
25312527

25322528
// ForkRepository forks a repository
2533-
func ForkRepository(doer, u *User, oldRepo *Repository, name, desc string) (_ *Repository, err error) {
2534-
forkedRepo, err := oldRepo.GetUserFork(u.ID)
2529+
func ForkRepository(doer, owner *User, oldRepo *Repository, name, desc string) (_ *Repository, err error) {
2530+
forkedRepo, err := oldRepo.GetUserFork(owner.ID)
25352531
if err != nil {
25362532
return nil, err
25372533
}
25382534
if forkedRepo != nil {
25392535
return nil, ErrForkAlreadyExist{
2540-
Uname: u.Name,
2536+
Uname: owner.Name,
25412537
RepoName: oldRepo.FullName(),
25422538
ForkName: forkedRepo.FullName(),
25432539
}
25442540
}
25452541

25462542
repo := &Repository{
2547-
OwnerID: u.ID,
2548-
Owner: u,
2543+
OwnerID: owner.ID,
2544+
Owner: owner,
25492545
Name: name,
25502546
LowerName: strings.ToLower(name),
25512547
Description: desc,
@@ -2562,17 +2558,17 @@ func ForkRepository(doer, u *User, oldRepo *Repository, name, desc string) (_ *R
25622558
return nil, err
25632559
}
25642560

2565-
if err = createRepository(sess, doer, u, repo); err != nil {
2561+
if err = createRepository(sess, doer, owner, repo); err != nil {
25662562
return nil, err
25672563
}
25682564

25692565
if _, err = sess.Exec("UPDATE `repository` SET num_forks=num_forks+1 WHERE id=?", oldRepo.ID); err != nil {
25702566
return nil, err
25712567
}
25722568

2573-
repoPath := RepoPath(u.Name, repo.Name)
2569+
repoPath := RepoPath(owner.Name, repo.Name)
25742570
_, stderr, err := process.GetManager().ExecTimeout(10*time.Minute,
2575-
fmt.Sprintf("ForkRepository(git clone): %s/%s", u.Name, repo.Name),
2571+
fmt.Sprintf("ForkRepository(git clone): %s/%s", owner.Name, repo.Name),
25762572
git.GitExecutable, "clone", "--bare", oldRepo.repoPath(sess), repoPath)
25772573
if err != nil {
25782574
return nil, fmt.Errorf("git clone: %v", stderr)
@@ -2595,24 +2591,6 @@ func ForkRepository(doer, u *User, oldRepo *Repository, name, desc string) (_ *R
25952591
return nil, err
25962592
}
25972593

2598-
oldMode, _ := AccessLevel(doer, oldRepo)
2599-
mode, _ := AccessLevel(doer, repo)
2600-
2601-
if err = PrepareWebhooks(oldRepo, HookEventFork, &api.ForkPayload{
2602-
Forkee: oldRepo.APIFormat(oldMode),
2603-
Repo: repo.APIFormat(mode),
2604-
Sender: doer.APIFormat(),
2605-
}); err != nil {
2606-
log.Error("PrepareWebhooks [repo_id: %d]: %v", oldRepo.ID, err)
2607-
} else {
2608-
go HookQueue.Add(oldRepo.ID)
2609-
}
2610-
2611-
// Add to hook queue for created repo after session commit.
2612-
if u.IsOrganization() {
2613-
go HookQueue.Add(repo.ID)
2614-
}
2615-
26162594
if err = repo.UpdateSize(); err != nil {
26172595
log.Error("Failed to update size for repository: %v", err)
26182596
}
@@ -2621,20 +2599,19 @@ func ForkRepository(doer, u *User, oldRepo *Repository, name, desc string) (_ *R
26212599
sess2 := x.NewSession()
26222600
defer sess2.Close()
26232601
if err = sess2.Begin(); err != nil {
2624-
return nil, err
2602+
return repo, err
26252603
}
26262604

26272605
var lfsObjects []*LFSMetaObject
2628-
26292606
if err = sess2.Where("repository_id=?", oldRepo.ID).Find(&lfsObjects); err != nil {
2630-
return nil, err
2607+
return repo, err
26312608
}
26322609

26332610
for _, v := range lfsObjects {
26342611
v.ID = 0
26352612
v.RepositoryID = repo.ID
26362613
if _, err = sess2.Insert(v); err != nil {
2637-
return nil, err
2614+
return repo, err
26382615
}
26392616
}
26402617

modules/notification/indexer/indexer.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ func (r *indexerNotifier) NotifyDeleteComment(doer *models.User, comment *models
9898

9999
func (r *indexerNotifier) NotifyDeleteRepository(doer *models.User, repo *models.Repository) {
100100
issue_indexer.DeleteRepoIssueIndexer(repo)
101+
models.DeleteRepoFromIndexer(repo)
101102
}
102103

103104
func (r *indexerNotifier) NotifyIssueChangeContent(doer *models.User, issue *models.Issue, oldContent string) {

modules/notification/webhook/webhook.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,67 @@ func (m *webhookNotifier) NotifyIssueClearLabels(doer *models.User, issue *model
6565
go models.HookQueue.Add(issue.RepoID)
6666
}
6767
}
68+
69+
func (m *webhookNotifier) NotifyForkRepository(doer *models.User, oldRepo, repo *models.Repository) {
70+
oldMode, _ := models.AccessLevel(doer, oldRepo)
71+
mode, _ := models.AccessLevel(doer, repo)
72+
73+
// forked webhook
74+
if err := models.PrepareWebhooks(oldRepo, models.HookEventFork, &api.ForkPayload{
75+
Forkee: oldRepo.APIFormat(oldMode),
76+
Repo: repo.APIFormat(mode),
77+
Sender: doer.APIFormat(),
78+
}); err != nil {
79+
log.Error("PrepareWebhooks [repo_id: %d]: %v", oldRepo.ID, err)
80+
} else {
81+
go models.HookQueue.Add(oldRepo.ID)
82+
}
83+
84+
u := repo.MustOwner()
85+
86+
// Add to hook queue for created repo after session commit.
87+
if u.IsOrganization() {
88+
if err := models.PrepareWebhooks(repo, models.HookEventRepository, &api.RepositoryPayload{
89+
Action: api.HookRepoCreated,
90+
Repository: repo.APIFormat(models.AccessModeOwner),
91+
Organization: u.APIFormat(),
92+
Sender: doer.APIFormat(),
93+
}); err != nil {
94+
log.Error("PrepareWebhooks [repo_id: %d]: %v", repo.ID, err)
95+
} else {
96+
go models.HookQueue.Add(repo.ID)
97+
}
98+
}
99+
}
100+
101+
func (m *webhookNotifier) NotifyCreateRepository(doer *models.User, u *models.User, repo *models.Repository) {
102+
// Add to hook queue for created repo after session commit.
103+
if u.IsOrganization() {
104+
if err := models.PrepareWebhooks(repo, models.HookEventRepository, &api.RepositoryPayload{
105+
Action: api.HookRepoCreated,
106+
Repository: repo.APIFormat(models.AccessModeOwner),
107+
Organization: u.APIFormat(),
108+
Sender: doer.APIFormat(),
109+
}); err != nil {
110+
log.Error("PrepareWebhooks [repo_id: %d]: %v", repo.ID, err)
111+
} else {
112+
go models.HookQueue.Add(repo.ID)
113+
}
114+
}
115+
}
116+
117+
func (m *webhookNotifier) NotifyDeleteRepository(doer *models.User, repo *models.Repository) {
118+
u := repo.MustOwner()
119+
120+
if u.IsOrganization() {
121+
if err := models.PrepareWebhooks(repo, models.HookEventRepository, &api.RepositoryPayload{
122+
Action: api.HookRepoDeleted,
123+
Repository: repo.APIFormat(models.AccessModeOwner),
124+
Organization: u.APIFormat(),
125+
Sender: doer.APIFormat(),
126+
}); err != nil {
127+
log.Error("PrepareWebhooks [repo_id: %d]: %v", repo.ID, err)
128+
}
129+
go models.HookQueue.Add(repo.ID)
130+
}
131+
}

options/locale/locale_es-ES.ini

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ openid_signin_desc=Introduzca su URI OpenID. Por ejemplo: https://anne.me, bob.o
259259
disable_forgot_password_mail=La recuperación de cuentas está desactivada. Por favor, contacte con el administrador del sitio.
260260
email_domain_blacklisted=No puede registrarse con su correo electrónico.
261261
authorize_application=Autorizar aplicación
262+
authorize_redirect_notice=Será redirigido a %s si autoriza esta aplicación.
262263
authorize_application_created_by=Esta aplicación fue creada por %s.
263264
authorize_application_description=Si concede el acceso, podrá acceder y escribir a toda la información de su cuenta, incluyendo repositorios privado y organizaciones.
264265
authorize_title=¿Autorizar a "%s" a acceder a su cuenta?
@@ -800,6 +801,7 @@ issues.delete_branch_at=`rama eliminada <b>%s</b> %s`
800801
issues.open_tab=%d abiertas
801802
issues.close_tab=%d cerradas
802803
issues.filter_label=Etiqueta
804+
issues.filter_label_exclude=`Usa <code>alt</code> + <code>clic/enter</code> para excluir etiquetas`
803805
issues.filter_label_no_select=Todas las etiquetas
804806
issues.filter_milestone=Milestone
805807
issues.filter_milestone_no_select=Todos los hitos
@@ -974,6 +976,7 @@ issues.review.review=Revisar
974976
issues.review.reviewers=Revisores
975977
issues.review.show_outdated=Mostrar obsoletos
976978
issues.review.hide_outdated=Ocultar obsoletos
979+
issues.assignee.error=No todos los asignados fueron añadidos debido a un error inesperado.
977980

978981
pulls.desc=Activar Pull Requests y revisiones de código.
979982
pulls.new=Nuevo Pull Request

options/locale/locale_pt-BR.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -976,6 +976,7 @@ issues.review.review=Revisão
976976
issues.review.reviewers=Revisões
977977
issues.review.show_outdated=Mostrar desatualizado
978978
issues.review.hide_outdated=Ocultar desatualizado
979+
issues.assignee.error=Nem todos os responsáveis foram adicionados devido a um erro inesperado.
979980

980981
pulls.desc=Habilitar pull requests e revisões de código.
981982
pulls.new=Novo pull request

options/locale/locale_tr-TR.ini

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -746,8 +746,8 @@ issues.label_templates.fail_to_load_file=Etiket şablon dosyası yüklemesi baş
746746
issues.add_label_at= %[4]s <div class="ui label has-emoji" style="color: %[1]s\; background-color: %[2]s">%[3]s</div> etiketini eklendi
747747
issues.remove_label_at=<div class="ui label has-emoji" style="color: %s\; background-color: %s">%s</div> etiketi silindi %s
748748
issues.add_milestone_at=`%[2]s <b>%[1]s</b> kilometre taşına ekledi`
749-
issues.change_milestone_at=` <b>%s</b>den<b>%s</b>ye yol taşı düzenlendi %s`
750-
issues.remove_milestone_at=`bu dosya <b>%s</b> yol taşından kaldırıldı %s`
749+
issues.change_milestone_at=`%[3]s kilometre taşı <b>%[1]s</b> iken <b>%[2]s</b> olarak değiştirildi`
750+
issues.remove_milestone_at=`%[2]s <b>%[1]s</b> kilometre taşından kaldırıldı`
751751
issues.deleted_milestone=`(silindi)`
752752
issues.self_assign_at=`%s kendini atadı`
753753
issues.add_assignee_at=`%[2]s <b>%[1]s</b> tarafından atandı`

public/css/index.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,7 @@ i.icon.centerlock{top:1.5em}
567567
.repository.view.issue .comment-list .timeline-line:before{display:block;content:"";position:absolute;margin-top:12px;margin-bottom:14px;top:0;bottom:0;left:82px;width:2px;background-color:#f3f3f3;z-index:-1}
568568
.repository.view.issue .comment-list .comment .avatar{width:3em}
569569
.repository.view.issue .comment-list .comment .tag{color:#767676;margin-top:3px;padding:2px 5px;font-size:12px;border:1px solid rgba(0,0,0,.1);border-radius:3px}
570+
.repository.view.issue .comment-list .comment .tag.pending{color:#000;background-color:#fffbb2;margin-left:5px}
570571
.repository.view.issue .comment-list .comment .actions .item{float:left}
571572
.repository.view.issue .comment-list .comment .actions .item.tag{margin-right:5px}
572573
.repository.view.issue .comment-list .comment .actions .item.action{margin-top:6px;margin-left:10px}

public/less/_repository.less

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -738,6 +738,11 @@
738738
font-size: 12px;
739739
border: 1px solid rgba(0, 0, 0, 0.1);
740740
border-radius: 3px;
741+
&.pending {
742+
color: black;
743+
background-color: #fffbb2;
744+
margin-left: 5px;
745+
}
741746
}
742747

743748
.actions {

routers/admin/repos.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"code.gitea.io/gitea/modules/log"
1212
"code.gitea.io/gitea/modules/setting"
1313
"code.gitea.io/gitea/routers"
14+
repo_service "code.gitea.io/gitea/services/repository"
1415
)
1516

1617
const (
@@ -38,7 +39,7 @@ func DeleteRepo(ctx *context.Context) {
3839
return
3940
}
4041

41-
if err := models.DeleteRepository(ctx.User, repo.MustOwner().ID, repo.ID); err != nil {
42+
if err := repo_service.DeleteRepository(ctx.User, repo); err != nil {
4243
ctx.ServerError("DeleteRepository", err)
4344
return
4445
}

routers/api/v1/repo/fork.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"code.gitea.io/gitea/models"
99
"code.gitea.io/gitea/modules/context"
1010
api "code.gitea.io/gitea/modules/structs"
11+
repo_service "code.gitea.io/gitea/services/repository"
1112
)
1213

1314
// ListForks list a repository's forks
@@ -97,10 +98,12 @@ func CreateFork(ctx *context.APIContext, form api.CreateForkOption) {
9798
}
9899
forker = org
99100
}
100-
fork, err := models.ForkRepository(ctx.User, forker, repo, repo.Name, repo.Description)
101+
102+
fork, err := repo_service.ForkRepository(ctx.User, forker, repo, repo.Name, repo.Description)
101103
if err != nil {
102104
ctx.Error(500, "ForkRepository", err)
103105
return
104106
}
107+
105108
ctx.JSON(202, fork.APIFormat(models.AccessModeOwner))
106109
}

0 commit comments

Comments
 (0)