Closed aliok closed 7 months ago
Sınırlamalar:
Implementasyon şu şekilde olabilir:
stars:>50 forks:>10 is:public pushed:>2023-08-19 size:>1000 template:false archived:false created:2010-01-01..2010-01-07
stars:>50 forks:>10 is:public pushed:>2023-08-19 size:>1000 template:false archived:false created:2010-01-08..2010-01-14
...
N. stars:>50 forks:>10 is:public pushed:>2023-08-19 size:>1000 template:false archived:false created:2023-09-13..2023-09-19
Sırasıyla bu şekilde bir haftalık tarih aralığında oluşturulmuş repo'ları çekeriz, ta ki, 1 yıl öncesine kadar. Oluşturulma tarihi sabit olduğu için, (1) ve (2) nolu request'lerin kesişen bir sonucu olmayacak.
Her query'nin page'lerini çekerken yine de page'ler arasında sonuçlar değişebilir. Mesela, tam 2. page'i çekerken sırada bir repo'nun star sayısı artabilir ve 1. page'e düşebilir. Ama bunun gibi durumlar ihmal edilebilir çok uç örnekler.
Bunu GraphQL API'si ile birleştirirsek, tek seferde aggregation işini de yapmış oluruz.
Örnek bir GraphQL query'si:
query {
search(type:REPOSITORY, query:"stars:>50 forks:>10 is:public pushed:>2023-06-19 created:2010-01-01..2010-01-15 size:>1000 template:false archived:false", first:100){
repositoryCount
nodes{
...on Repository{
nameWithOwner
isInOrganization
owner{
login
}
watchers{
totalCount
}
forkCount
stargazerCount
pullRequests(states:[OPEN, MERGED]){
totalCount
}
issues(states:[OPEN, CLOSED]){
totalCount
}
mentionableUsers{
totalCount
}
}
}
}
}
Çıktı:
{
"data": {
"search": {
"repositoryCount": 24,
"nodes": [
{
"nameWithOwner": "symfony/symfony",
"isInOrganization": true,
"owner": {
"login": "symfony"
},
"watchers": {
"totalCount": 1127
},
"forkCount": 9236,
"stargazerCount": 28688,
"pullRequests": {
"totalCount": 20936
},
"issues": {
"totalCount": 18895
},
"mentionableUsers": {
"totalCount": 2828
}
},
{
"nameWithOwner": "facebook/hhvm",
"isInOrganization": true,
"owner": {
"login": "facebook"
},
"watchers": {
"totalCount": 1002
},
"forkCount": 3144,
"stargazerCount": 17808,
"pullRequests": {
"totalCount": 182
},
"issues": {
"totalCount": 5914
},
"mentionableUsers": {
"totalCount": 1050
}
},
...
Burada hem proje aramasını, hem de watcher sayısı, PR sayısı gibi aggregation'ları tek seferde yapmış oluyoruz.
mentionableUsers
'un tam tanımını bulamadım. Ama, projelerin GitHub'da görünen "contributors" sayısına yakın bir değer görünüyor manuel yaptığım kontrollerde.
Keşke filtreleme de desteklenseydi. O zaman aggregation'ların sonucuna göre filtreleme yapabilirdik ve mesela 50 PR'ın altında PR'ı olanlar gelmezdi. Şu anda bunlar geliyor ve bunları elle filtrelememiz gerekecek.
Şurada yazıldığı üzere, raporda stratejik proje tanımı yapıldı: https://github.com/OpenTRFoundation/OpenTR/issues/20#issuecomment-1880179046
Kriterler raporda mevcut: https://state.opentr.foundation/
Kriterler
Odak organizasyonlar:
Aşağıdaki kriterleri karşılayan en az bir repository'si var:
Odak repository'ler:
@altuga nın çok mantıklı bir sorusu var:
Şu commentimde bahsettiğim gibi, bir stratejik proje tanımı yapmamız gerekiyor: https://github.com/OpenTRFoundation/OpenTR/issues/20#issuecomment-1722555345
Bugün biraz projeleri inceledim ve şu tarz bir tanım yapılabilir diye düşünüyorum:
repository'ler stratejik projeler olarak tanımlanabilir.
Bununla beraber bazı projeler birden fazla repository'den oluşuyor (bundan sonra bahsedeceğim).
Yukarıdaki kriterlerden çoğu, doğrudan GitHub search api'ye verilebiliyor. (*) ile işearetlenenler verilemiyor. Bunun için de, GitHub search api'den dönen sonuçları, GitHub api ile teker teker çekmek gerekiyor.
Örnek bir search şurada: https://github.com/search?q=stars%3A%3E50+forks%3A%3E10++is%3Apublic+pushed%3A%3E2023-08-19+created%3A%3C%3D2022-09-19+size%3A%3E1000+template%3Afalse+archived%3Afalse+&type=repositories&ref=advsearch
Arama sonucunda bugün itibariyle, 57000 repository dönüyor. (*) ile belirtilen kriterler de eklenince bu sayının %20'sine düşmesini bekliyorum (denemedim).
Birden fazla repo'dan oluşan projeler konusu
Bazı projeler birden fazla repository'den oluşuyor. Örneğin Knative, 20'den fazla repository'den oluşuyor. Bu repository'lerin bazısı üstteki kriterleri sağlıyor, bazısı sağlamıyor. Ama, genelde OpenTR için önemli olan projelerde, organizasyondaki en azından 1 proje bu kriterleri sağlayacaktır. Sonrasında, bu repoların organizasyonunun altındaki tüm projeleri dahil edebiliriz diye düşünüyorum.
Yani stratejik proje tanımımız şöyle olabilir:
Hatta bazı durumlarda, bir proje birden fazla organizasyona sahip olabiliyor. Knative'de hem "knative" hem de "knative-extensions" organizasyonları var. Bu iki organizasyonu iki ayrı proje şeklinde düşünmek işimizi kolaylaştıracaktır.
Proje != Repository ve Proje != Organizasyon
Proje denilen şey aslında biraz soyut bir şey. Yani, "Knative contributor'uyum" dediğimde, repository'lerin hepsine katkıda bulunmuş olmuyorum. Bir tanesine katkıda bulunmuş olmam yeterli. Ya da, hatta doğrudan "knative" organizasyonu altında değil de "knative-extensions" organizasyonu altındaki bir repository'ye katkıda bulunmuş olmam da yeterli.
(Bu katkının miktarı da önemli, ama o ayrı bir tartışma konusu.)