Allow multiple projects per issue and pull requests (#36784)

Add ability to add and remove multiple projects per issue
and pull request.

Resolve #12974

---------

Signed-off-by: Icy Avocado <avocado@ovacoda.com>
Co-authored-by: Tyrone Yeh <siryeh@gmail.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: OpenCode (gpt-5.2-codex) <opencode@openai.com>
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
Co-authored-by: silverwind <me@silverwind.io>
Co-authored-by: Claude (Opus 4.7) <noreply@anthropic.com>
This commit is contained in:
Icy Avocado
2026-04-30 08:38:05 -06:00
committed by GitHub
parent 52d6baf5a8
commit 81692ceafa
58 changed files with 1597 additions and 430 deletions
+20
View File
@@ -15,6 +15,8 @@ import (
"strings"
"sync"
"code.gitea.io/gitea/modules/container"
"golang.org/x/text/cases"
"golang.org/x/text/language"
)
@@ -291,3 +293,21 @@ func NormalizeStringEOL(input string) string {
// Other than this, we should respect the original content, even leading or trailing spaces.
return UnsafeBytesToString(NormalizeEOL(UnsafeStringToBytes(input)))
}
func DiffSlice[T comparable](oldSlice, newSlice []T) (added, removed []T) {
oldSet := container.SetOf(oldSlice...)
newSet := container.SetOf(newSlice...)
addedSet, removedSet := container.Set[T]{}, container.Set[T]{}
for _, v := range newSlice {
if !oldSet.Contains(v) && addedSet.Add(v) {
added = append(added, v)
}
}
for _, v := range oldSlice {
if !newSet.Contains(v) && removedSet.Add(v) {
removed = append(removed, v)
}
}
return added, removed
}