Skip to content

Commit e35e724

Browse files
authored
Use db.WithTx/WithTx2 instead of TxContext when possible (#35428)
1 parent fb247f6 commit e35e724

File tree

13 files changed

+582
-675
lines changed

13 files changed

+582
-675
lines changed

models/asymkey/gpg_key_add.go

Lines changed: 71 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -72,96 +72,90 @@ func AddGPGKey(ctx context.Context, ownerID int64, content, token, signature str
7272
return nil, err
7373
}
7474

75-
ctx, committer, err := db.TxContext(ctx)
76-
if err != nil {
77-
return nil, err
78-
}
79-
defer committer.Close()
80-
81-
keys := make([]*GPGKey, 0, len(ekeys))
82-
83-
verified := false
84-
// Handle provided signature
85-
if signature != "" {
86-
signer, err := openpgp.CheckArmoredDetachedSignature(ekeys, strings.NewReader(token), strings.NewReader(signature), nil)
87-
if err != nil {
88-
signer, err = openpgp.CheckArmoredDetachedSignature(ekeys, strings.NewReader(token+"\n"), strings.NewReader(signature), nil)
89-
}
90-
if err != nil {
91-
signer, err = openpgp.CheckArmoredDetachedSignature(ekeys, strings.NewReader(token+"\r\n"), strings.NewReader(signature), nil)
92-
}
93-
if err != nil {
94-
log.Debug("AddGPGKey CheckArmoredDetachedSignature failed: %v", err)
95-
return nil, ErrGPGInvalidTokenSignature{
96-
ID: ekeys[0].PrimaryKey.KeyIdString(),
97-
Wrapped: err,
75+
return db.WithTx2(ctx, func(ctx context.Context) ([]*GPGKey, error) {
76+
keys := make([]*GPGKey, 0, len(ekeys))
77+
78+
verified := false
79+
// Handle provided signature
80+
if signature != "" {
81+
signer, err := openpgp.CheckArmoredDetachedSignature(ekeys, strings.NewReader(token), strings.NewReader(signature), nil)
82+
if err != nil {
83+
signer, err = openpgp.CheckArmoredDetachedSignature(ekeys, strings.NewReader(token+"\n"), strings.NewReader(signature), nil)
9884
}
85+
if err != nil {
86+
signer, err = openpgp.CheckArmoredDetachedSignature(ekeys, strings.NewReader(token+"\r\n"), strings.NewReader(signature), nil)
87+
}
88+
if err != nil {
89+
log.Debug("AddGPGKey CheckArmoredDetachedSignature failed: %v", err)
90+
return nil, ErrGPGInvalidTokenSignature{
91+
ID: ekeys[0].PrimaryKey.KeyIdString(),
92+
Wrapped: err,
93+
}
94+
}
95+
ekeys = []*openpgp.Entity{signer}
96+
verified = true
9997
}
100-
ekeys = []*openpgp.Entity{signer}
101-
verified = true
102-
}
103-
104-
if len(ekeys) > 1 {
105-
id2key := map[string]*openpgp.Entity{}
106-
newEKeys := make([]*openpgp.Entity, 0, len(ekeys))
107-
for _, ekey := range ekeys {
108-
id := ekey.PrimaryKey.KeyIdString()
109-
if original, has := id2key[id]; has {
110-
// Coalesce this with the other one
111-
for _, subkey := range ekey.Subkeys {
112-
if subkey.PublicKey == nil {
113-
continue
114-
}
115-
found := false
11698

117-
for _, originalSubkey := range original.Subkeys {
118-
if originalSubkey.PublicKey == nil {
99+
if len(ekeys) > 1 {
100+
id2key := map[string]*openpgp.Entity{}
101+
newEKeys := make([]*openpgp.Entity, 0, len(ekeys))
102+
for _, ekey := range ekeys {
103+
id := ekey.PrimaryKey.KeyIdString()
104+
if original, has := id2key[id]; has {
105+
// Coalesce this with the other one
106+
for _, subkey := range ekey.Subkeys {
107+
if subkey.PublicKey == nil {
119108
continue
120109
}
121-
if originalSubkey.PublicKey.KeyId == subkey.PublicKey.KeyId {
122-
found = true
123-
break
110+
found := false
111+
112+
for _, originalSubkey := range original.Subkeys {
113+
if originalSubkey.PublicKey == nil {
114+
continue
115+
}
116+
if originalSubkey.PublicKey.KeyId == subkey.PublicKey.KeyId {
117+
found = true
118+
break
119+
}
120+
}
121+
if !found {
122+
original.Subkeys = append(original.Subkeys, subkey)
124123
}
125124
}
126-
if !found {
127-
original.Subkeys = append(original.Subkeys, subkey)
128-
}
129-
}
130-
for name, identity := range ekey.Identities {
131-
if _, has := original.Identities[name]; has {
132-
continue
125+
for name, identity := range ekey.Identities {
126+
if _, has := original.Identities[name]; has {
127+
continue
128+
}
129+
original.Identities[name] = identity
133130
}
134-
original.Identities[name] = identity
131+
continue
135132
}
136-
continue
133+
id2key[id] = ekey
134+
newEKeys = append(newEKeys, ekey)
137135
}
138-
id2key[id] = ekey
139-
newEKeys = append(newEKeys, ekey)
140-
}
141-
ekeys = newEKeys
142-
}
143-
144-
for _, ekey := range ekeys {
145-
// Key ID cannot be duplicated.
146-
has, err := db.GetEngine(ctx).Where("key_id=?", ekey.PrimaryKey.KeyIdString()).
147-
Get(new(GPGKey))
148-
if err != nil {
149-
return nil, err
150-
} else if has {
151-
return nil, ErrGPGKeyIDAlreadyUsed{ekey.PrimaryKey.KeyIdString()}
136+
ekeys = newEKeys
152137
}
153138

154-
// Get DB session
139+
for _, ekey := range ekeys {
140+
// Key ID cannot be duplicated.
141+
has, err := db.GetEngine(ctx).Where("key_id=?", ekey.PrimaryKey.KeyIdString()).
142+
Get(new(GPGKey))
143+
if err != nil {
144+
return nil, err
145+
} else if has {
146+
return nil, ErrGPGKeyIDAlreadyUsed{ekey.PrimaryKey.KeyIdString()}
147+
}
155148

156-
key, err := parseGPGKey(ctx, ownerID, ekey, verified)
157-
if err != nil {
158-
return nil, err
159-
}
149+
key, err := parseGPGKey(ctx, ownerID, ekey, verified)
150+
if err != nil {
151+
return nil, err
152+
}
160153

161-
if err = addGPGKey(ctx, key, content); err != nil {
162-
return nil, err
154+
if err = addGPGKey(ctx, key, content); err != nil {
155+
return nil, err
156+
}
157+
keys = append(keys, key)
163158
}
164-
keys = append(keys, key)
165-
}
166-
return keys, committer.Commit()
159+
return keys, nil
160+
})
167161
}

models/git/branch.go

Lines changed: 81 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -334,122 +334,111 @@ func FindRenamedBranch(ctx context.Context, repoID int64, from string) (branch *
334334

335335
// RenameBranch rename a branch
336336
func RenameBranch(ctx context.Context, repo *repo_model.Repository, from, to string, gitAction func(ctx context.Context, isDefault bool) error) (err error) {
337-
ctx, committer, err := db.TxContext(ctx)
338-
if err != nil {
339-
return err
340-
}
341-
defer committer.Close()
337+
return db.WithTx(ctx, func(ctx context.Context) error {
338+
sess := db.GetEngine(ctx)
342339

343-
sess := db.GetEngine(ctx)
340+
// check whether from branch exist
341+
var branch Branch
342+
exist, err := db.GetEngine(ctx).Where("repo_id=? AND name=?", repo.ID, from).Get(&branch)
343+
if err != nil {
344+
return err
345+
} else if !exist || branch.IsDeleted {
346+
return ErrBranchNotExist{
347+
RepoID: repo.ID,
348+
BranchName: from,
349+
}
350+
}
344351

345-
// check whether from branch exist
346-
var branch Branch
347-
exist, err := db.GetEngine(ctx).Where("repo_id=? AND name=?", repo.ID, from).Get(&branch)
348-
if err != nil {
349-
return err
350-
} else if !exist || branch.IsDeleted {
351-
return ErrBranchNotExist{
352-
RepoID: repo.ID,
353-
BranchName: from,
352+
// check whether to branch exist or is_deleted
353+
var dstBranch Branch
354+
exist, err = db.GetEngine(ctx).Where("repo_id=? AND name=?", repo.ID, to).Get(&dstBranch)
355+
if err != nil {
356+
return err
354357
}
355-
}
358+
if exist {
359+
if !dstBranch.IsDeleted {
360+
return ErrBranchAlreadyExists{
361+
BranchName: to,
362+
}
363+
}
356364

357-
// check whether to branch exist or is_deleted
358-
var dstBranch Branch
359-
exist, err = db.GetEngine(ctx).Where("repo_id=? AND name=?", repo.ID, to).Get(&dstBranch)
360-
if err != nil {
361-
return err
362-
}
363-
if exist {
364-
if !dstBranch.IsDeleted {
365-
return ErrBranchAlreadyExists{
366-
BranchName: to,
365+
if _, err := db.GetEngine(ctx).ID(dstBranch.ID).NoAutoCondition().Delete(&dstBranch); err != nil {
366+
return err
367367
}
368368
}
369369

370-
if _, err := db.GetEngine(ctx).ID(dstBranch.ID).NoAutoCondition().Delete(&dstBranch); err != nil {
370+
// 1. update branch in database
371+
if n, err := sess.Where("repo_id=? AND name=?", repo.ID, from).Update(&Branch{
372+
Name: to,
373+
}); err != nil {
371374
return err
375+
} else if n <= 0 {
376+
return ErrBranchNotExist{
377+
RepoID: repo.ID,
378+
BranchName: from,
379+
}
372380
}
373-
}
374381

375-
// 1. update branch in database
376-
if n, err := sess.Where("repo_id=? AND name=?", repo.ID, from).Update(&Branch{
377-
Name: to,
378-
}); err != nil {
379-
return err
380-
} else if n <= 0 {
381-
return ErrBranchNotExist{
382-
RepoID: repo.ID,
383-
BranchName: from,
382+
// 2. update default branch if needed
383+
isDefault := repo.DefaultBranch == from
384+
if isDefault {
385+
repo.DefaultBranch = to
386+
_, err = sess.ID(repo.ID).Cols("default_branch").Update(repo)
387+
if err != nil {
388+
return err
389+
}
384390
}
385-
}
386391

387-
// 2. update default branch if needed
388-
isDefault := repo.DefaultBranch == from
389-
if isDefault {
390-
repo.DefaultBranch = to
391-
_, err = sess.ID(repo.ID).Cols("default_branch").Update(repo)
392+
// 3. Update protected branch if needed
393+
protectedBranch, err := GetProtectedBranchRuleByName(ctx, repo.ID, from)
392394
if err != nil {
393395
return err
394396
}
395-
}
396397

397-
// 3. Update protected branch if needed
398-
protectedBranch, err := GetProtectedBranchRuleByName(ctx, repo.ID, from)
399-
if err != nil {
400-
return err
401-
}
398+
if protectedBranch != nil {
399+
// there is a protect rule for this branch
400+
protectedBranch.RuleName = to
401+
if _, err = sess.ID(protectedBranch.ID).Cols("branch_name").Update(protectedBranch); err != nil {
402+
return err
403+
}
404+
} else {
405+
// some glob protect rules may match this branch
406+
protected, err := IsBranchProtected(ctx, repo.ID, from)
407+
if err != nil {
408+
return err
409+
}
410+
if protected {
411+
return ErrBranchIsProtected
412+
}
413+
}
402414

403-
if protectedBranch != nil {
404-
// there is a protect rule for this branch
405-
protectedBranch.RuleName = to
406-
_, err = sess.ID(protectedBranch.ID).Cols("branch_name").Update(protectedBranch)
415+
// 4. Update all not merged pull request base branch name
416+
_, err = sess.Table("pull_request").Where("base_repo_id=? AND base_branch=? AND has_merged=?",
417+
repo.ID, from, false).
418+
Update(map[string]any{"base_branch": to})
407419
if err != nil {
408420
return err
409421
}
410-
} else {
411-
// some glob protect rules may match this branch
412-
protected, err := IsBranchProtected(ctx, repo.ID, from)
413-
if err != nil {
422+
423+
// 4.1 Update all not merged pull request head branch name
424+
if _, err = sess.Table("pull_request").Where("head_repo_id=? AND head_branch=? AND has_merged=?",
425+
repo.ID, from, false).
426+
Update(map[string]any{"head_branch": to}); err != nil {
414427
return err
415428
}
416-
if protected {
417-
return ErrBranchIsProtected
418-
}
419-
}
420-
421-
// 4. Update all not merged pull request base branch name
422-
_, err = sess.Table("pull_request").Where("base_repo_id=? AND base_branch=? AND has_merged=?",
423-
repo.ID, from, false).
424-
Update(map[string]any{"base_branch": to})
425-
if err != nil {
426-
return err
427-
}
428429

429-
// 4.1 Update all not merged pull request head branch name
430-
if _, err = sess.Table("pull_request").Where("head_repo_id=? AND head_branch=? AND has_merged=?",
431-
repo.ID, from, false).
432-
Update(map[string]any{"head_branch": to}); err != nil {
433-
return err
434-
}
435-
436-
// 5. insert renamed branch record
437-
renamedBranch := &RenamedBranch{
438-
RepoID: repo.ID,
439-
From: from,
440-
To: to,
441-
}
442-
err = db.Insert(ctx, renamedBranch)
443-
if err != nil {
444-
return err
445-
}
446-
447-
// 6. do git action
448-
if err = gitAction(ctx, isDefault); err != nil {
449-
return err
450-
}
430+
// 5. insert renamed branch record
431+
if err = db.Insert(ctx, &RenamedBranch{
432+
RepoID: repo.ID,
433+
From: from,
434+
To: to,
435+
}); err != nil {
436+
return err
437+
}
451438

452-
return committer.Commit()
439+
// 6. do git action
440+
return gitAction(ctx, isDefault)
441+
})
453442
}
454443

455444
type FindRecentlyPushedNewBranchesOptions struct {

0 commit comments

Comments
 (0)