Keep languages defined in .gitattributes (#21403)
Fixes #21377 This marks all "defined" languages in the `.gitattributes` file so they are not removed if they are not of type `programming` or `markup`. ![grafik](https://user-images.githubusercontent.com/1666336/194942021-1e641b60-bb8a-49c6-9a1c-413e7c4ba17d.png) Co-authored-by: zeripath <art27@cantab.net> Co-authored-by: Lauris BH <lauris@nix.lv> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
This commit is contained in:
parent
434622ab6f
commit
49436c2c62
2 changed files with 51 additions and 19 deletions
|
@ -44,7 +44,15 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err
|
||||||
checker, deferable := repo.CheckAttributeReader(commitID)
|
checker, deferable := repo.CheckAttributeReader(commitID)
|
||||||
defer deferable()
|
defer deferable()
|
||||||
|
|
||||||
|
// sizes contains the current calculated size of all files by language
|
||||||
sizes := make(map[string]int64)
|
sizes := make(map[string]int64)
|
||||||
|
// by default we will only count the sizes of programming languages or markup languages
|
||||||
|
// unless they are explicitly set using linguist-language
|
||||||
|
includedLanguage := map[string]bool{}
|
||||||
|
// or if there's only one language in the repository
|
||||||
|
firstExcludedLanguage := ""
|
||||||
|
firstExcludedLanguageSize := int64(0)
|
||||||
|
|
||||||
err = tree.Files().ForEach(func(f *object.File) error {
|
err = tree.Files().ForEach(func(f *object.File) error {
|
||||||
if f.Size == 0 {
|
if f.Size == 0 {
|
||||||
return nil
|
return nil
|
||||||
|
@ -75,8 +83,8 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err
|
||||||
language = group
|
language = group
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// this language will always be added to the size
|
||||||
sizes[language] += f.Size
|
sizes[language] += f.Size
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
} else if language, has := attrs["gitlab-language"]; has && language != "unspecified" && language != "" {
|
} else if language, has := attrs["gitlab-language"]; has && language != "unspecified" && language != "" {
|
||||||
// strip off a ? if present
|
// strip off a ? if present
|
||||||
|
@ -90,6 +98,7 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err
|
||||||
language = group
|
language = group
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// this language will always be added to the size
|
||||||
sizes[language] += f.Size
|
sizes[language] += f.Size
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -124,7 +133,18 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err
|
||||||
language = group
|
language = group
|
||||||
}
|
}
|
||||||
|
|
||||||
|
included, checked := includedLanguage[language]
|
||||||
|
if !checked {
|
||||||
|
langtype := enry.GetLanguageType(language)
|
||||||
|
included = langtype == enry.Programming || langtype == enry.Markup
|
||||||
|
includedLanguage[language] = included
|
||||||
|
}
|
||||||
|
if included {
|
||||||
sizes[language] += f.Size
|
sizes[language] += f.Size
|
||||||
|
} else if len(sizes) == 0 && (firstExcludedLanguage == "" || firstExcludedLanguage == language) {
|
||||||
|
firstExcludedLanguage = language
|
||||||
|
firstExcludedLanguageSize += f.Size
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
@ -132,14 +152,9 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// filter special languages unless they are the only language
|
// If there are no included languages add the first excluded language
|
||||||
if len(sizes) > 1 {
|
if len(sizes) == 0 && firstExcludedLanguage != "" {
|
||||||
for language := range sizes {
|
sizes[firstExcludedLanguage] = firstExcludedLanguageSize
|
||||||
langtype := enry.GetLanguageType(language)
|
|
||||||
if langtype != enry.Programming && langtype != enry.Markup {
|
|
||||||
delete(sizes, language)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return sizes, nil
|
return sizes, nil
|
||||||
|
|
|
@ -67,7 +67,16 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err
|
||||||
|
|
||||||
contentBuf := bytes.Buffer{}
|
contentBuf := bytes.Buffer{}
|
||||||
var content []byte
|
var content []byte
|
||||||
|
|
||||||
|
// sizes contains the current calculated size of all files by language
|
||||||
sizes := make(map[string]int64)
|
sizes := make(map[string]int64)
|
||||||
|
// by default we will only count the sizes of programming languages or markup languages
|
||||||
|
// unless they are explicitly set using linguist-language
|
||||||
|
includedLanguage := map[string]bool{}
|
||||||
|
// or if there's only one language in the repository
|
||||||
|
firstExcludedLanguage := ""
|
||||||
|
firstExcludedLanguageSize := int64(0)
|
||||||
|
|
||||||
for _, f := range entries {
|
for _, f := range entries {
|
||||||
select {
|
select {
|
||||||
case <-repo.Ctx.Done():
|
case <-repo.Ctx.Done():
|
||||||
|
@ -107,6 +116,7 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err
|
||||||
language = group
|
language = group
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// this language will always be added to the size
|
||||||
sizes[language] += f.Size()
|
sizes[language] += f.Size()
|
||||||
continue
|
continue
|
||||||
} else if language, has := attrs["gitlab-language"]; has && language != "unspecified" && language != "" {
|
} else if language, has := attrs["gitlab-language"]; has && language != "unspecified" && language != "" {
|
||||||
|
@ -121,6 +131,7 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err
|
||||||
language = group
|
language = group
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// this language will always be added to the size
|
||||||
sizes[language] += f.Size()
|
sizes[language] += f.Size()
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -180,18 +191,24 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err
|
||||||
language = group
|
language = group
|
||||||
}
|
}
|
||||||
|
|
||||||
|
included, checked := includedLanguage[language]
|
||||||
|
if !checked {
|
||||||
|
langtype := enry.GetLanguageType(language)
|
||||||
|
included = langtype == enry.Programming || langtype == enry.Markup
|
||||||
|
includedLanguage[language] = included
|
||||||
|
}
|
||||||
|
if included {
|
||||||
sizes[language] += f.Size()
|
sizes[language] += f.Size()
|
||||||
|
} else if len(sizes) == 0 && (firstExcludedLanguage == "" || firstExcludedLanguage == language) {
|
||||||
|
firstExcludedLanguage = language
|
||||||
|
firstExcludedLanguageSize += f.Size()
|
||||||
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// filter special languages unless they are the only language
|
// If there are no included languages add the first excluded language
|
||||||
if len(sizes) > 1 {
|
if len(sizes) == 0 && firstExcludedLanguage != "" {
|
||||||
for language := range sizes {
|
sizes[firstExcludedLanguage] = firstExcludedLanguageSize
|
||||||
langtype := enry.GetLanguageType(language)
|
|
||||||
if langtype != enry.Programming && langtype != enry.Markup {
|
|
||||||
delete(sizes, language)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return sizes, nil
|
return sizes, nil
|
||||||
|
|
Loading…
Reference in a new issue