RHEL 9.0.0 Alpha bootstrap

The content of this branch was automatically imported from Fedora ELN
with the following as its source:
https://src.fedoraproject.org/rpms/google-noto-cjk-fonts#225588fabf918c20eea46894c06fe26b413a56d9
This commit is contained in:
Petr Šabata 2020-10-15 09:41:11 +02:00
parent 9f9d326fc1
commit 59952f2656
13 changed files with 1273 additions and 0 deletions

4
.gitignore vendored
View File

@ -0,0 +1,4 @@
/v1.004.tar.gz
/noto-cjk-32a5844.tar.gz
/be6c059ac1587e556e2412b27f5155c8eb3ddbe6.tar.gz
/noto-cjk-be6c059.tar.gz

View File

@ -0,0 +1,92 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<match target="scan">
<test name="family">
<string>Noto Sans CJK SC</string>
</test>
<edit name="lang" mode="assign">
<minus>
<name>lang</name>
<langset>
<string>ja</string>
<string>ko</string>
<string>zh-hk</string>
<string>zh-mo</string>
<string>zh-tw</string>
</langset>
</minus>
</edit>
</match>
<match target="scan">
<test name="family">
<string>Noto Sans CJK TC</string>
</test>
<edit name="lang" mode="assign">
<minus>
<name>lang</name>
<langset>
<string>ja</string>
<string>ko</string>
<string>zh-cn</string>
<string>zh-hk</string>
<string>zh-mo</string>
<string>zh-sg</string>
</langset>
</minus>
</edit>
</match>
<match target="scan">
<test name="family">
<string>Noto Sans CJK HK</string>
</test>
<edit name="lang" mode="assign">
<minus>
<name>lang</name>
<langset>
<string>ja</string>
<string>ko</string>
<string>zh-cn</string>
<string>zh-sg</string>
<string>zh-tw</string>
</langset>
</minus>
</edit>
</match>
<match target="scan">
<test name="family">
<string>Noto Sans CJK JP</string>
</test>
<edit name="lang" mode="assign">
<minus>
<name>lang</name>
<langset>
<string>ko</string>
<string>zh-cn</string>
<string>zh-hk</string>
<string>zh-mo</string>
<string>zh-sg</string>
<string>zh-tw</string>
</langset>
</minus>
</edit>
</match>
<match target="scan">
<test name="family">
<string>Noto Sans CJK KR</string>
</test>
<edit name="lang" mode="assign">
<minus>
<name>lang</name>
<langset>
<string>ja</string>
<string>zh-cn</string>
<string>zh-hk</string>
<string>zh-mo</string>
<string>zh-sg</string>
<string>zh-tw</string>
</langset>
</minus>
</edit>
</match>
</fontconfig>

161
genfontconf.py Normal file
View File

@ -0,0 +1,161 @@
#!/usr/bin/python3
import argparse
'''
Generate the font config file for Noto CJK fonts
genfontconf.py "lang list" "common font name" "font name" "fallback font name" "prepend latin font" ...
like
genfontconf.py --fallback-font --prepend-latin-font "zh-cn:zh-sg" "monospace" "Source Han Sans CN" "Source Han Sans TW" "DejaVu Sans Mono" "zh-cn:zh-sg" "serif" "Source Han Sans CN" "Source Han Sans TW" "" "zh-cn:zh-sg" "sans-serif" "Source Han Sans CN" "Source Han Sans TW" ""
genfontconf.py "zh-cn:zh-sg" "monospace" "Noto Sans Mono CJK SC" "zh-cn:zh-sg" "serif" "Noto Serif CJK SC" "zh-cn:zh-sg" "sans-serif" "Noto Sans CJK SC"
The above information is in variable length array.
'''
'''
Some Noto CJK fonts may not need "fallback font name"
Skip the "fallback font name" argument if not needed.
'''
fallback_font_name = False
'''
Noto CJK may not need "prepend latin font".
Skip the "prepend latin font" argument if not needed.
'''
prepend_latin_font = False
class FontConfRecord:
@staticmethod
def renderRecord(langlist, common, font, fallback=None, latin=None):
for lang in langlist.split(":"):
FontConfRecord.renderMatch(lang, common, font, fallback, latin)
print()
FontConfRecord.renderAlias(font, common)
print()
@staticmethod
def renderMatch(lang, common, font, fallback, latin):
print('<match>')
FontConfRecord.renderTestLang(lang)
FontConfRecord.renderTestFamily(common)
FontConfRecord.renderEditFamily(font, fallback)
FontConfRecord.renderEditLatinFamily(latin)
print('</match>')
@staticmethod
def renderTestLang(lang):
print('<test name="lang">')
print('<string>{0}</string>'.format(lang))
print('</test>')
@staticmethod
def renderTestFamily(common):
print('<test name="family">')
print('<string>{0}</string>'.format(common))
print('</test>')
@staticmethod
def renderEditFamily(font, fallback):
print('<edit name="family" mode="prepend">')
print('<string>{0}</string>'.format(font))
if fallback:
print('<string>{0}</string>'.format(fallback))
print('</edit>')
@staticmethod
def renderEditLatinFamily(latin):
if not latin:
return
print('<edit name="family" mode="prepend" binding="strong">')
print('<string>{0}</string>'.format(latin))
print('</edit>')
@staticmethod
def renderAlias(font, common):
print('<alias>')
print('<family>{0}</family>'.format(font))
print('<default>')
print('<family>{0}</family>'.format(common))
print('</default>')
print('</alias>')
class FontConfFile:
@staticmethod
def renderFile(strings):
FontConfFile.renderHeader()
FontConfFile.renderBody(strings)
FontConfFile.renderFooter()
@staticmethod
def renderHeader():
print('<?xml version="1.0"?>')
print('<!DOCTYPE fontconfig SYSTEM "fonts.dtd">')
print('<fontconfig>')
@staticmethod
def renderBody(strings):
num = 3
if fallback_font_name:
num += 1
if prepend_latin_font:
num += 1
while len(strings):
items = strings[0:num]
strings = strings[num:]
if num == 3:
FontConfRecord.renderRecord(items[0], items[1], items[2])
if num == 4:
if fallback_font_name:
FontConfRecord.renderRecord \
(items[0], items[1], items[2], items[3])
if prepend_latin_font:
FontConfRecord.renderRecord \
(items[0], items[1], items[2], None, items[3])
if num == 5:
FontConfRecord.renderRecord \
(items[0], items[1], items[2], items[3], items[4])
@staticmethod
def renderFooter():
print('</fontconfig>')
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Generate font config.')
parser.add_argument('strings', metavar='string', type=str, nargs='+',
help='strings')
parser.add_argument('--fallback-font', dest='fallback_font', action='store_true')
parser.add_argument('--disable-fallback-font', dest='fallback_font', action='store_false')
parser.set_defaults(fallback_font=False)
parser.add_argument('--prepend-latin-font', dest='prepend_latin_font', action='store_true')
parser.add_argument('--disable-prepend-latin-font', dest='prepend_latin_font', action='store_false')
parser.set_defaults(prepend_latin_font=False)
args = parser.parse_args()
#print(args)
fallback_font_name = args.fallback_font
prepend_latin_font = args.prepend_latin_font
FontConfFile.renderFile(args.strings)

77
genfontconf.sh Normal file
View File

@ -0,0 +1,77 @@
#!/usr/bin/bash -x
# Generate for google-noto-sans-cjk-ttc-fonts
python3 genfontconf.py "ja" "monospace" "Noto Sans Mono CJK JP" \
"ja" "sans-serif" "Noto Sans CJK JP" \
"ko" "monospace" "Noto Sans Mono CJK KR" \
"ko" "sans-serif" "Noto Sans CJK KR" \
"zh-cn:zh-sg" "monospace" "Noto Sans Mono CJK SC" \
"zh-cn:zh-sg" "sans-serif" "Noto Sans CJK SC" \
"zh-tw:zh-mo" "monospace" "Noto Sans Mono CJK TC" \
"zh-tw:zh-mo" "sans-serif" "Noto Sans CJK TC" \
"zh-hk" "monospace" "Noto Sans Mono CJK HK" \
"zh-hk" "sans-serif" "Noto Sans CJK HK" \
| xmllint --format - |tee 65-0-google-noto-sans-cjk-ttc.conf
# Generate for google-noto-serif-cjk-ttc-fonts
python3 genfontconf.py "ja" "serif" "Noto Serif CJK JP" \
"ko" "serif" "Noto Serif CJK KR" \
"zh-cn:zh-sg" "serif" "Noto Serif CJK SC" \
"zh-tw:zh-hk:zh-mo" "serif" "Noto Serif CJK TC" \
| xmllint --format - |tee 65-0-google-noto-serif-cjk-ttc.conf
# Generate for google-noto-sans-cjk-jp-fonts, google-noto-serif-cjk-jp-fonts and google-noto-sans-mono-cjk-jp-fonts
python3 genfontconf.py "ja" "sans-serif" "Noto Sans CJK JP" | xmllint --format - |tee 66-google-noto-sans-cjk-jp.conf
python3 genfontconf.py "ja" "serif" "Noto Serif CJK JP" | xmllint --format - |tee 66-google-noto-serif-cjk-jp.conf
python3 genfontconf.py "ja" "monospace" "Noto Sans Mono CJK JP" | xmllint --format - |tee 66-google-noto-sans-mono-cjk-jp.conf
# Generate for google-noto-sans-cjk-kr-fonts, google-noto-serif-cjk-kr-fonts and google-noto-sans-mono-cjk-kr-fonts
python3 genfontconf.py "ko" "sans-serif" "Noto Sans CJK KR" | xmllint --format - |tee 66-google-noto-sans-cjk-kr.conf
python3 genfontconf.py "ko" "serif" "Noto Serif CJK KR" | xmllint --format - |tee 66-google-noto-serif-cjk-kr.conf
python3 genfontconf.py "ko" "monospace" "Noto Sans Mono CJK KR" | xmllint --format - |tee 66-google-noto-sans-mono-cjk-kr.conf
# Generate for google-noto-sans-cjk-sc-fonts, google-noto-serif-cjk-sc-fonts and google-noto-sans-mono-cjk-sc-fonts
python3 genfontconf.py "zh-cn:zh-sg" "sans-serif" "Noto Sans CJK SC" | xmllint --format - |tee 66-google-noto-sans-cjk-sc.conf
python3 genfontconf.py "zh-cn:zh-sg" "serif" "Noto Serif CJK SC" | xmllint --format - |tee 66-google-noto-serif-cjk-sc.conf
python3 genfontconf.py "zh-cn:zh-sg" "monospace" "Noto Sans Mono CJK SC" | xmllint --format - |tee 66-google-noto-sans-mono-cjk-sc.conf
# Generate for google-noto-sans-cjk-tc-fonts, google-noto-serif-cjk-tc-fonts and google-noto-sans-mono-cjk-tc-fonts
python3 genfontconf.py "zh-tw:zh-mo" "sans-serif" "Noto Sans CJK TC" | xmllint --format - |tee 66-google-noto-sans-cjk-tc.conf
python3 genfontconf.py "zh-tw:zh-hk:zh-mo" "serif" "Noto Serif CJK TC" | xmllint --format - |tee 66-google-noto-serif-cjk-tc.conf
python3 genfontconf.py "zh-tw:zh-mo" "monospace" "Noto Sans Mono CJK TC" | xmllint --format - |tee 66-google-noto-sans-mono-cjk-tc.conf
# Generate for google-noto-sans-cjk-hk-fonts and google-noto-sans-mono-cjk-hk-fonts
python3 genfontconf.py "zh-hk" "sans-serif" "Noto Sans CJK HK" | xmllint --format - |tee 66-google-noto-sans-cjk-hk.conf
python3 genfontconf.py "zh-hk" "monospace" "Noto Sans Mono CJK HK" | xmllint --format - |tee 66-google-noto-sans-mono-cjk-hk.conf
# Generate for google-noto-sans-jp-fonts and google-noto-serif-jp-fonts
python3 genfontconf.py "ja" "sans-serif" "Noto Sans JP" | xmllint --format - |tee 66-google-noto-sans-jp.conf
python3 genfontconf.py "ja" "serif" "Noto Serif JP" | xmllint --format - |tee 66-google-noto-serif-jp.conf
# Generate for google-noto-sans-kr-fonts and google-noto-serif-kr-fonts
python3 genfontconf.py "ko" "sans-serif" "Noto Sans KR" | xmllint --format - |tee 66-google-noto-sans-kr.conf
python3 genfontconf.py "ko" "serif" "Noto Serif KR" | xmllint --format - |tee 66-google-noto-serif-kr.conf
# Generate for google-noto-sans-sc-fonts and google-noto-serif-sc-fonts
python3 genfontconf.py "zh-cn:zh-sg" "sans-serif" "Noto Sans SC" | xmllint --format - |tee 66-google-noto-sans-sc.conf
python3 genfontconf.py "zh-cn:zh-sg" "serif" "Noto Serif SC" | xmllint --format - |tee 66-google-noto-serif-sc.conf
# Generate for google-noto-sans-tc-fonts and google-noto-serif-tc-fonts
python3 genfontconf.py "zh-tw:zh-mo" "sans-serif" "Noto Sans TC" | xmllint --format - |tee 66-google-noto-sans-tc.conf
python3 genfontconf.py "zh-tw:zh-hk:zh-mo" "serif" "Noto Serif TC" | xmllint --format - |tee 66-google-noto-serif-tc.conf
# Generate for google-noto-sans-hk-fonts
python3 genfontconf.py "zh-hk" "sans-serif" "Noto Sans HK" | xmllint --format - |tee 66-google-noto-sans-hk.conf

314
google-noto-cjk-fonts.spec Normal file
View File

@ -0,0 +1,314 @@
%global commit0 be6c059ac1587e556e2412b27f5155c8eb3ddbe6
%global shortcommit0 %(c=%{commit0}; echo ${c:0:7})
%global fontname google-noto-cjk
%global fontconf google-noto
%global fontconf2 65-%{fontconf}-cjk-fonts.conf
%global common_desc \
Noto CJK fonts, supporting Simplified Chinese, Traditional Chinese, \
Japanese, and Korean. The supported scripts are Han, Hiragana, Katakana, \
Hangul, and Bopomofo. Latin, Greek, Cyrllic, and various symbols are also \
supported for compatibility with CJK standards. \
%{nil}
Name: google-noto-cjk-fonts
Version: 20190416
Release: 7%{?dist}
Summary: Google Noto Sans CJK Fonts
License: OFL
URL: https://github.com/googlei18n/noto-cjk
Source0: https://github.com/googlei18n/noto-cjk/archive/%{commit0}.tar.gz#/noto-cjk-%{shortcommit0}.tar.gz
Source1: genfontconf.py
Source2: genfontconf.sh
Source3: %{fontconf2}
BuildArch: noarch
BuildRequires: fontpackages-devel
BuildRequires: python3
BuildRequires: /usr/bin/xmllint
Requires: fontpackages-filesystem
Requires: google-noto-sans-cjk-ttc-fonts
Requires: google-noto-serif-cjk-ttc-fonts
%if 0%{?fedora}
Obsoletes: google-noto-sans-cjk-fonts < 20150617
Provides: google-noto-sans-cjk-fonts = 20150617
# notocjkrep Package Name
%define notocjkrep(:)\
%define pname %(echo %{*} | tr "A-Z " "a-z-")\
Obsoletes: google-noto-%{pname}-fonts < 20150617\
Provides: google-noto-%{pname}-fonts = 20150617\
Obsoletes: google-noto-cjk-%{pname}-fonts < %{version}-%{release}\
Provides: google-noto-cjk-%{pname}-fonts = %{version}-%{release}\
%notocjkrep Sans Simplified Chinese
%notocjkrep Sans Traditional Chinese
%notocjkrep Sans Japanese
%notocjkrep Sans Korean
%endif
%description
%common_desc
%package common
Summary: Common files for Noto CJK fonts
%description common
%common_desc
Common files for Google Noto CJK fonts.
# notocjkpkg [-n sub-package-name] [-f font-file] [-p priority] Font Name
# -n sub package name
# -f font file name
# -p overrides fontconfig .conf priority (default 66)
%define notocjkpkg(n:f:p:) \
# override _font_pkg_name to avoid name changes in _font_pkg \
%define _font_pkg_name() %1 \
%define subpkgname %{-n:%{-n*}} \
%define fontfiles %{-f:%{-f*}}\
%define fconf %{-p*}%{!-p:66}-%{fontconf}-%{subpkgname}.conf\
%package -n google-noto-%subpkgname-fonts \
Summary: %* font files for %{name} \
Requires: %{name}-common = %{version}-%{release} \
\
%description -n google-noto-%subpkgname-fonts \
%common_desc \
\
The google-noto-%subpkgname-fonts package contains %* fonts. \
\
%_font_pkg -n google-noto-%subpkgname-fonts -f %{fconf} %fontfiles \
%{nil}
%notocjkpkg -n sans-cjk-ttc -f NotoSansCJK-*.ttc -p 65-0 Sans OTC
%notocjkpkg -n serif-cjk-ttc -f NotoSerifCJK-*.ttc -p 65-0 Serif OTC
%notocjkpkg -n sans-cjk-jp -f NotoSansCJKjp-*.otf Japanese Multilingual Sans OTF
%notocjkpkg -n serif-cjk-jp -f NotoSerifCJKjp-*.otf Japanese Multilingual Serif OTF
%notocjkpkg -n sans-mono-cjk-jp -f NotoSansMonoCJKjp-*.otf Japanese Multilingual Sans Mono OTF
%notocjkpkg -n sans-cjk-kr -f NotoSansCJKkr-*.otf Korean Multilingual Sans OTF
%notocjkpkg -n serif-cjk-kr -f NotoSerifCJKkr-*.otf Korean Multilingual Serif OTF
%notocjkpkg -n sans-mono-cjk-kr -f NotoSansMonoCJKkr-*.otf Korean Multilingual Sans Mono OTF
%notocjkpkg -n sans-cjk-sc -f NotoSansCJKsc-*.otf Simplified Chinese Multilingual Sans OTF
%notocjkpkg -n serif-cjk-sc -f NotoSerifCJKsc-*.otf Simplified Chinese Multilingual Serif OTF
%notocjkpkg -n sans-mono-cjk-sc -f NotoSansMonoCJKsc-*.otf Simplified Chinese Multilingual Sans Mono OTF
%notocjkpkg -n sans-cjk-tc -f NotoSansCJKtc-*.otf Traditional Chinese Multilingual Sans OTF
%notocjkpkg -n serif-cjk-tc -f NotoSerifCJKtc-*.otf Traditional Chinese Multilingual Serif OTF
%notocjkpkg -n sans-mono-cjk-tc -f NotoSansMonoCJKtc-*.otf Traditional Chinese Multilingual Sans Mono OTF
%notocjkpkg -n sans-cjk-hk -f NotoSansCJKhk-*.otf Traditional Chinese Multilingual Sans OTF
%notocjkpkg -n sans-mono-cjk-hk -f NotoSansMonoCJKhk-*.otf Traditional Chinese Multilingual Sans Mono OTF
%notocjkpkg -n sans-jp -f NotoSansJP-*.otf Japanese Region-specific Sans OTF
%notocjkpkg -n serif-jp -f NotoSerifJP-*.otf Japanese Region-specific Serif OTF
%notocjkpkg -n sans-kr -f NotoSansKR-*.otf Korean Region-specific Sans OTF
%notocjkpkg -n serif-kr -f NotoSerifKR-*.otf Korean Region-specific Serif OTF
%notocjkpkg -n sans-sc -f NotoSansSC-*.otf Simplified Chinese Region-specific Sans OTF
%notocjkpkg -n serif-sc -f NotoSerifSC-*.otf Simplified Chinese Region-specific Serif OTF
%notocjkpkg -n sans-tc -f NotoSansTC-*.otf Traditional Chinese Region-specific Sans OTF
%notocjkpkg -n serif-tc -f NotoSerifTC-*.otf Traditional Chinese Region-specific Serif OTF
%notocjkpkg -n sans-hk -f NotoSansHK-*.otf Traditional Chinese Region-specific Sans OTF
%prep
%setup -q -n noto-cjk-%{commit0}
cp -p %{SOURCE1} %{SOURCE2} .
# generate the font conf files
bash -x ./genfontconf.sh
%build
%install
install -m 0755 -d %{buildroot}%{_fontdir}
# copy OTC files
install -m 0644 -p NotoSansCJK-*.ttc %{buildroot}%{_fontdir}
install -m 0644 -p NotoSerifCJK-*.ttc %{buildroot}%{_fontdir}
# copy Multilingual OTF files
install -m 0644 -p NotoSansCJK{jp,kr,sc,tc,hk}-*.otf %{buildroot}%{_fontdir}
install -m 0644 -p NotoSerifCJK{jp,kr,sc,tc}-*.otf %{buildroot}%{_fontdir}
install -m 0644 -p NotoSansMonoCJK{jp,kr,sc,tc,hk}-*.otf %{buildroot}%{_fontdir}
# copy Region-specific OTF
install -m 0644 -p NotoSans{JP,KR,SC,TC,HK}-*.otf %{buildroot}%{_fontdir}
install -m 0644 -p NotoSerif{JP,KR,SC,TC}-*.otf %{buildroot}%{_fontdir}
install -m 0755 -d %{buildroot}%{_fontconfig_templatedir} \
%{buildroot}%{_fontconfig_confdir}
for f in sans-cjk-ttc serif-cjk-ttc \
sans-cjk-jp serif-cjk-jp sans-mono-cjk-jp \
sans-cjk-kr serif-cjk-kr sans-mono-cjk-kr \
sans-cjk-sc serif-cjk-sc sans-mono-cjk-sc \
sans-cjk-tc serif-cjk-tc sans-mono-cjk-tc \
sans-cjk-hk sans-mono-cjk-hk \
sans-jp serif-jp \
sans-kr serif-kr \
sans-sc serif-sc \
sans-tc serif-tc \
sans-hk;
do
fconf=$(basename -a *-%{fontconf}-$f.conf)
if [ "$(echo $fconf | wc -w)" -ne 1 ]; then
echo "Did not find unique \*-%{fontconf}-$f.conf file"
exit 1
fi
install -m 0644 -p ${fconf} \
%{buildroot}%{_fontconfig_templatedir}/${fconf}
ln -s %{_fontconfig_templatedir}/${fconf} \
%{buildroot}%{_fontconfig_confdir}/${fconf}
done
install -m 0644 -p %{SOURCE3} \
%{buildroot}%{_fontconfig_templatedir}/%{fontconf2}
ln -s %{_fontconfig_templatedir}/%{fontconf2} \
%{buildroot}%{_fontconfig_confdir}/%{fontconf2}
%files
%files common
%doc NEWS HISTORY README.formats README.third_party
%license LICENSE
%{_fontconfig_templatedir}/%{fontconf2}
%config(noreplace) %{_fontconfig_confdir}/%{fontconf2}
%changelog
* Tue Jul 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 20190416-7
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
* Wed Jan 29 2020 Fedora Release Engineering <releng@fedoraproject.org> - 20190416-6
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
* Tue Aug 13 2019 Peng Wu <pwu@redhat.com> - 20190416-5
- Update 65-google-noto-cjk-fonts.conf for HK
* Thu Aug 1 2019 Peng Wu <pwu@redhat.com> - 20190416-4
- Correct lang property of fontconfig in Noto Sans CJK fonts
* Thu Jul 25 2019 Fedora Release Engineering <releng@fedoraproject.org> - 20190416-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
* Tue May 14 2019 Peng Wu <pwu@redhat.com> - 20190416-2
- Include HongKong fonts
* Wed Apr 17 2019 Peng Wu <pwu@redhat.com> - 20190416-1
- Update to git commit be6c059
* Fri Feb 01 2019 Fedora Release Engineering <releng@fedoraproject.org> - 20170602-10
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
* Fri Dec 14 2018 Peng Wu <pwu@redhat.com> - 20170602-9
- Support Macau locale
* Fri Jul 13 2018 Fedora Release Engineering <releng@fedoraproject.org> - 20170602-8
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
* Mon Apr 16 2018 Peng Wu <pwu@redhat.com> - 20170602-7
- Make Noto CJK OTC files as default CJK fonts
* Wed Feb 07 2018 Fedora Release Engineering <releng@fedoraproject.org> - 20170602-6
- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
* Mon Jan 22 2018 Akira TAGOH <tagoh@redhat.com> - 20170602-5
- Update the priority to change the default font to Noto.
* Mon Dec 11 2017 Peng Wu <pwu@redhat.com> - 20170602-4
- Simplify spec file
* Thu Dec 7 2017 Peng Wu <pwu@redhat.com> - 20170602-3
- Include more fonts and sub package fonts
* Wed Jul 26 2017 Fedora Release Engineering <releng@fedoraproject.org> - 20170602-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
* Wed Jun 7 2017 Peng Wu <pwu@redhat.com> - 20170602-1
- Include Serif fonts
* Fri Feb 10 2017 Fedora Release Engineering <releng@fedoraproject.org> - 1.004-8
- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
* Fri Dec 2 2016 Peng Wu <pwu@redhat.com> - 1.004-7
- Rebuilt to fixes the spec file
* Fri Dec 2 2016 Peng Wu <pwu@redhat.com> - 1.004-6
- Disable Obsoletes for epel: for google-noto-sans-cjk-fonts (rh#1396260)
- Disable notocjkrep macro definition for epel
* Fri Apr 29 2016 Peng Wu <pwu@redhat.com> - 1.004-5
- Replace google-noto-sans-cjk-fonts package
* Wed Feb 03 2016 Fedora Release Engineering <releng@fedoraproject.org> - 1.004-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
* Fri Nov 13 2015 Peng Wu <pwu@redhat.com> - 1.004-3
- Use TTC Files
* Mon Oct 26 2015 Peng Wu <pwu@redhat.com> - 1.004-2
- Fixes Spec
* Mon Oct 26 2015 Peng Wu <pwu@redhat.com> - 1.004-1
- Initial Version

1
sources Normal file
View File

@ -0,0 +1 @@
SHA512 (noto-cjk-be6c059.tar.gz) = 8abebae9412622f50adb0f755621d97002233d8db367f8fc38dda6a0828c3ea879e9ac780a3b09239b0570ada1091b0a7889bb7301a9486da9dfdca7200e50da

View File

@ -0,0 +1,69 @@
# Ansible role for tests using fontconfig
Put this role in your `tests.yml` playbook. The playbook will first install
package dependencies listed on playbook on your localhost, then it will proceed
to run testing. You can redefine the following variables:
* **artifacts**: An artifacts directory on localhost to store logs
* **remote_artifacts**: The directory on the system under test where the logs
are stored. Note: if this variable is left undefined, it will default to
`/tmp/artifacts`
* **required_packages**: A list of prerequisite packages required by tests.
Please note that for Atomic Host, additional packages will be installed
using the `rpm-ostree` command which is affecting the test subject (it's
similar as rebuilding an rpm package to be tested) so this should be used
with caution on only when necessary.
* **path_prefix**: The directory on the system where fonts are installed.
please use one in coverage sub-parameter if having different path_prefix
per sub-packages.
* **package**: The package name to test. this is used to find out fontconfig
config file. please use one in families sub-parameter if having different
config files per sub-packages.
* **coverage**: A list of languages for language coverage tests.
* **families**: A list of family test cases.
## Language coverage test parameters
Supporting two types of formats. one is a simple list of languages:
coverage:
- en
- fr
Another one is a dictionary that has a language as a key and values as parameters:
coverage:
en:
...
fr:
...
You can redefine the following variables for dictionary format:
* **exclude**: A list of font file names to exclude on this testing. this is
useful to avoid unexpected failures on iterating tests when a package has
multiple font files and has different coverages but you need to prevent
testing for few fonts which has different coverages to them.
Please note that the file name is relative to `path_prefix` parameter. also
good to consider using `include` if non-targeted files is more than targeted.
* **include**: A list of font file names to include on this testing. this is
useful to avoid unexpected failures on iterating tests when a pcakge has
multiple font files and has different coverages but you need to prevent
testing for few fonts which has different coverages to them.
Please note that the file name is relative to `path_prefix` parameter. also
good to consider using `exclude` if targeted files is more than non-targeted.
* **name**: The name to store logs. the test script is trying to make an unique
file names to store logs but not perfectly working in some cases. this is
optional parameter to make it unique by yourself.
* **path_prefix**: A list of directory names where fonts are installed on system.
this is optional parameter and tries to obtain the font paths from installed
packages by `required_packages` if not available.
## Family test parameters
* **lang**: A language to test family name for.
* **alias**: An alias name to test.
* **family**: A family name to test, which is supposed to be assinged to the alias.
* **package**: The package name to test. this is used to find out fontconfig
config file. this is optional. if not specified here, global `package`
parameter will be used.

View File

@ -0,0 +1,7 @@
---
role_pkgs_req:
- fontconfig
- fontconfig-devel
- pkg-config
- rsync

View File

@ -0,0 +1,162 @@
#! /bin/bash -efu
debug() {
if [ -n "$DEBUG" ]; then
echo "$*" >&2
fi
}
msg_usage() {
cat <<_EOF_
Run family test.
Usage:
$PROG <options>
Options:
-h, --help Display this help and exit
-v, --verbose Turn on debug
-l, --lang=LANG Test LANG language coverage (default: en)
-f, --family=FILE Set a family name supposed to be assigned for alias.
-g, --alias=STR Set an alias name. (default: sans-serif)
-a, --artifactsdir=DIR Set environment dir to store artifacts
-k, --package=NAME Set a package name for fonts.
_EOF_
}
PROG="${PROG:-${0##*/}}"
DEBUG="${DEBUG:-}"
OPT_LANG="${OPT_LANG:-en}"
OPT_FAMILY="${OPT_FAMILY:-}"
OPT_ARTIFACTS_DIR="${OPT_ARTIFACTS_DIR:-}"
OPT_ALIAS="${OPT_ALIAS:-sans-serif}"
OPT_PACKAGE="${OPT_PACKAGE:-}"
opt=$(getopt -n "$0" --options "hvl:f:t:a:g:k:" --longoptions "help,verbose,lang:,family:,test:,artifactsdir:,alias:,package:" -- "$@")
eval set -- "$opt"
while [[ $# -gt 0 ]]; do
case "$1" in
-k|--package)
OPT_PACKAGE="$2"
shift 2
;;
-g|--alias)
OPT_ALIAS="$2"
shift 2
;;
-a|--artifactsdir)
OPT_ARTIFACTS_DIR="$2"
shift 2
;;
-f|--family)
OPT_FAMILY="$2"
shift 2
;;
-l|--lang)
OPT_LANG="$2"
shift 2
;;
-v|--verbose)
DEBUG="-v"
shift
;;
-h|--help)
msg_usage
exit 0
;;
--)
shift
;;
*)
msg_usage
exit 1
esac
done
if [ -z "$OPT_ARTIFACTS_DIR" ] || [ -z "$OPT_LANG" ] || [ -z "$OPT_FAMILY" ]; then
echo "Use: $PROG -h for help."
exit 0
fi
debug "Alias: $OPT_ALIAS"
debug "Family: $OPT_FAMILY"
debug "Lang: $OPT_LANG"
debug "Artifacts dir: $OPT_ARTIFACTS_DIR"
debug "Package name: $OPT_PACKAGE"
STR_TEST_DASHED=$(echo "${OPT_PACKAGE}_${OPT_ALIAS}_${OPT_LANG}" | sed -e 's/\//-/g' -e 's/ /-/g')
debug "Log file: $STR_TEST_DASHED.log"
clean_exit() {
rc=$?;
trap - SIGINT SIGTERM SIGABRT EXIT
echo "Run test $OPT_ALIAS: done. Test's exit code: $rc"
for pid in $(ps -o pid --no-headers --ppid $$); do
if [ -n "$(ps -p $pid -o pid=)" ]; then
kill -s HUP $pid
fi
done
local log_file_name="$STR_TEST_DASHED.log"
local log_file_path="$OPT_ARTIFACTS_DIR/$log_file_name"
local status
if [[ $rc -eq 127 ]]; then
status="ERROR"
elif grep -q "RESULT: WARN" "$log_file_path"; then
status="ERROR"
elif grep -q "RESULT: FAIL" "$log_file_path"; then
status="FAIL"
elif grep -q "RESULT: PASS" "$log_file_path"; then
status="PASS"
elif grep -q "FAIL" "$log_file_path"; then
status="FAIL"
elif grep -q "PASS" "$log_file_path"; then
status="PASS"
else
status="ERROR"
fi
echo "$status $OPT_ALIAS" >> "$OPT_ARTIFACTS_DIR/test.log"
mv "$log_file_path" "$OPT_ARTIFACTS_DIR/${status}-${log_file_name}"
local results="$OPT_ARTIFACTS_DIR/results.yml"
local result=$(echo $status | tr '[:upper:]' '[:lower:]')
test -f "$results" || echo 'results:' > "$results"
printf '%s\n' '' \
"- test: $OPT_ALIAS" \
" result: $result" \
" logs:" \
" - ${status}_${log_file_name}" \
>> "$results"
exit 0
}
trap clean_exit SIGINT SIGTERM SIGABRT EXIT
cachedir=`pkg-config --variable cachedir fontconfig`
tmpconfd=`mktemp --tmpdir -d fontsci.XXXXXXXX`
conf=$(for i in `rpm -ql $OPT_PACKAGE | grep conf.d`; do
echo "<include>$i</include>"
done)
cat <<_EOF_> $tmpconfd/fonts.conf
<fontconfig>
<dir>/usr/share/fonts</dir>
$conf
<cachedir>$cachedir</cachedir>
</fontconfig>
_EOF_
debug "Config: `cat $tmpconfd/fonts.conf`"
mkdir -p "$OPT_ARTIFACTS_DIR"
export OUTPUTFILE="$(realpath "$OPT_ARTIFACTS_DIR")/$STR_TEST_DASHED-out.log"
logfile="$OPT_ARTIFACTS_DIR/$STR_TEST_DASHED.log"
logfile="$(realpath "$logfile")"
exec > >(tee -a "$logfile") 2>&1
debug "Check family assignment"
res=`FONTCONFIG_FILE=$tmpconfd/fonts.conf fc-match -f "%{family[0]}" :family=$OPT_ALIAS:lang=$OPT_LANG`
ret=0
if [ "x$res" = "x$OPT_FAMILY" ]; then
echo "RESULT: PASS: $OPT_FAMILY was assigned to $OPT_ALIAS as expected"
else
echo "RESULT: FAIL: $OPT_FAMILY wasn't assigned to $OPT_ALIAS (actual result: $res)"
ret=1
fi
rm -rf $tmpconfd
exit $ret

View File

@ -0,0 +1,252 @@
#! /bin/bash -efu
debug() {
if [ -n "$DEBUG" ]; then
echo "$*" >&2
fi
}
msg_usage() {
cat <<_EOF_
Run language coverage test.
Usage:
$PROG <options>
Options:
-h, --help Display this help and exit
-v, --verbose Turn on debug
-l, --lang=LANG Test LANG language coverage (default: en)
-p, --path=PATH Test fonts on PATH
-k, --package=PACKAGE Specify PACKAGE to obtain some information
-n, --name=NAME Set NAME to store a log file.
-a, --artifactsdir=DIR test environment dir to store artifacts
-e, --exclude=FILE Exclude FILE to check.
-i, --include=FILE Include File to check.
_EOF_
}
PROG="${PROG:-${0##*/}}"
DEBUG="${DEBUG:-}"
OPT_LANG="${OPT_LANG:-en}"
OPT_PATH=()
OPT_PACKAGE=()
OPT_ARTIFACTS_DIR="${OPT_ARTIFACTS_DIR:-}"
OPT_EXCLUDE=()
OPT_INCLUDE=()
OPT_NAME="${OPT_NAME:-}"
opt=$(getopt -n "$0" --options "hvl:p:k:n:a:e:i:" --longoptions "help,verbose,lang:,path:,package:,name:,artifactsdir:,exclude:,include:" -- "$@")
eval set -- "$opt"
while [[ $# -gt 0 ]]; do
case "$1" in
-n|--name)
OPT_NAME="$2"
shift 2
;;
-i|--include)
OPT_INCLUDE+=("$2")
shift 2
;;
-e|--exclude)
OPT_EXCLUDE+=("$2")
shift 2
;;
-a|--artifactsdir)
OPT_ARTIFACTS_DIR="$2"
shift 2
;;
-p|--path)
OPT_PATH+=("$2")
shift 2
;;
-k|--package)
OPT_PACKAGE+=("$2")
shift 2
;;
-l|--lang)
OPT_LANG="$2"
shift 2
;;
-v|--verbose)
DEBUG="-v"
shift
;;
-h|--help)
msg_usage
exit 0
;;
--)
shift
;;
*)
msg_usage
exit 1
esac
done
if [ -z "$OPT_ARTIFACTS_DIR" ] || [ -z "$OPT_LANG" ] || [ ! -v OPT_PATH ] && [ ! -v OPT_PACKAGE ]; then
echo "Use: $PROG -h for help."
exit 0
fi
STR_TEST_DASHED=$(echo "${OPT_NAME:-$OPT_LANG}" | sed -e 's/\//-/g')
clean_exit() {
rc=$?;
trap - SIGINT SIGTERM SIGABRT EXIT
echo "Run test $OPT_LANG: done. Test's exit code: $rc"
for pid in $(ps -o pid --no-headers --ppid $$); do
if [ -n "$(ps -p $pid -o pid=)" ]; then
kill -s HUP $pid
fi
done
local log_file_name="$STR_TEST_DASHED.log"
local log_file_path="$OPT_ARTIFACTS_DIR/$log_file_name"
local status
if [[ $rc -eq 127 ]]; then
status="ERROR"
elif grep -q "RESULT: WARN" "$log_file_path"; then
status="ERROR"
elif grep -q "RESULT: FAIL" "$log_file_path"; then
status="FAIL"
elif grep -q "RESULT: PASS" "$log_file_path"; then
status="PASS"
elif grep -q "WARN" "$log_file_path"; then
status="ERROR"
elif grep -q "FAIL" "$log_file_path"; then
status="FAIL"
elif grep -q "PASS" "$log_file_path"; then
status="PASS"
else
status="ERROR"
fi
echo "$status $OPT_LANG" >> "$OPT_ARTIFACTS_DIR/test.log"
mv "$log_file_path" "$OPT_ARTIFACTS_DIR/${status}-${log_file_name}"
local results="$OPT_ARTIFACTS_DIR/results.yml"
local result=$(echo $status | tr '[:upper:]' '[:lower:]')
test -f "$results" || echo 'results:' > "$results"
printf '%s\n' '' \
"- test: $OPT_LANG" \
" result: $result" \
" logs:" \
" - ${status}_${log_file_name}" \
>> "$results"
exit 0
}
trap clean_exit SIGINT SIGTERM SIGABRT EXIT
mkdir -p "$OPT_ARTIFACTS_DIR"
export OUTPUTFILE="$(realpath "$OPT_ARTIFACTS_DIR")/$STR_TEST_DASHED-out.log"
logfile="$OPT_ARTIFACTS_DIR/$STR_TEST_DASHED.log"
logfile="$(realpath "$logfile")"
exec > >(tee -a "$logfile") 2>&1
for pkg in ${OPT_PACKAGE[@]}; do
if ! rpm -q ${pkg} > /dev/null 2>&1; then
echo "Package isn't installed or maybe a typo: ${pkg}"
exit 127
fi
d=$(for d in $(rpm -ql ${pkg}|grep /usr/share/fonts); do
dirname $d
done | sort | uniq | grep /usr/share/fonts/)
if [[ ! " ${OPT_PATH[@]} " =~ " ${d} " ]]; then
OPT_PATH+=("$d")
fi
done
expand_regex() {
local p ret=()
local regex="$1"
shift
debug "Expanding $regex"
for p; do
set +f
debug "$p: $regex"
(cd $p;
local x=$(find -regextype posix-egrep -regex "./$regex" -print|sed -e 's,^\./,,g')
debug "$x"
ret+=($x)
set -f
echo -n ${ret[@]}
)
done
echo -n ${ret[@]}
}
iv=()
ev=()
x=()
for p in ${OPT_INCLUDE[@]}; do
x=$(expand_regex $p ${OPT_PATH[@]})
if [ "x$x" == "x" ]; then
echo "RESULT: WARN: No matches on \"$p\". maybe typo or something changed?"
continue
fi
iv=("${iv[@]}" "${x[@]}")
done
for p in ${OPT_EXCLUDE[@]}; do
x=$(expand_regex $p ${OPT_PATH[@]})
if [ "x$x" == "x" ]; then
echo "RESULT: WARN: No matches on \"$p\". maybe typo or something changed?"
continue
fi
ev=("${ev[@]}" "${x[@]}")
done
OPT_EXCLUDE=(${ev[@]})
OPT_INCLUDE=(${iv[@]})
debug "Path: ${OPT_PATH[@]}"
debug "Lang: $OPT_LANG"
debug "Artifacts dir: $OPT_ARTIFACTS_DIR"
debug "Exclude: ${#OPT_EXCLUDE[@]}: ${OPT_EXCLUDE[@]}"
debug "Include: ${#OPT_INCLUDE[@]}: ${OPT_INCLUDE[@]}"
contains() {
local e match="$1"
shift
for e; do [[ "$e" == "$match" ]] && return 1; done
return 0
}
debug "Check language coverage"
ret=0
set +f
for p in ${OPT_PATH[@]}; do
for i in `find $p -regex '.*/*\.\(t1\)?\(ttf\)?\(otf\)?\(ttc\)?\(pcf.*\)?\(pfa\)?'`; do
set -f
debug "$i"
if test -f $i; then
n=`basename $i`
set +e
contains "$n" "${OPT_EXCLUDE[@]}"
r=$?
set -e
if [ $r -eq 1 ]; then
debug "ignoring $i"
continue
fi
if [ ${#OPT_INCLUDE[@]} -ne 0 ]; then
set +e
contains "$n" "${OPT_INCLUDE[@]}"
r=$?
set -e
if [ $r -eq 0 ]; then
debug "$i isn't targeted file"
continue
fi
NOT_MATCHED=("${NOT_MATCHED[@]/$n}")
fi
debug " $i"
res=`fc-validate -l $OPT_LANG $i || :`
if echo $res | grep -q Missing; then
echo "RESULT: FAIL: $i doesn't satisfy $OPT_LANG language coverage."
ret=1
else
echo "RESULT: PASS: $i satisfy $OPT_LANG language coverage."
fi
fi
done
done
exit $ret

View File

@ -0,0 +1,4 @@
---
dependencies:
- role: str-common-init

View File

@ -0,0 +1,48 @@
---
- block:
- name: language coverage
environment:
LANG: "en_US.UTF-8"
script: run-lang-coverage-test --lang "{{ item }}" {% if path_prefix is defined %} --path {{ path_prefix }} {% elif coverage.values is not defined or coverage[item].path_prefix is not defined %} {% else %} {{ '--path "' + (coverage[item].path_prefix | join('" --path "')) + '"' }} {% endif %} --artifactsdir "{{ remote_artifacts }}" {% if coverage.values is not defined or coverage[item].name is not defined %} {% else %} {{ "--name " + coverage[item].name }} {% endif %} {% if coverage.values is not defined or coverage[item].exclude is not defined %} {% else %} {{ '--exclude "' + (coverage[item].exclude | join('" --exclude "')) + '"' }} {% endif %} {% if coverage.values is not defined or coverage[item].include is not defined %} {% else %} {{ '--include "' + (coverage[item].include | join('" --include "')) + '"' }} {% endif %} {% if path_prefix is defined or coverage.values is defined and coverage[item].path_prefix is defined %} {% else %} {{ '--package "' + (required_packages|join('" --package "')) + '"' }} {% endif %}
with_items:
- "{{ coverage if coverage.keys is not defined else coverage.keys()|list }}"
- name: generic family assignment
environment:
LANG: "en_US.UTF-8"
when: families is defined
script: run-family-test --lang {{ item.lang }} --family '{{ item.family }}' --alias {{ item.alias }} --artifactsdir {{ remote_artifacts }} --package {{ package if item.package is not defined else item.package }}
with_items:
- "{{ families }}"
- name: Check the results
shell: |
log="{{ remote_artifacts }}/test.log"
if [ ! -f "$log" ]; then
echo ERROR
echo "Test results not found." 1>&2
elif grep ^ERROR "$log" 1>&2; then
echo ERROR
elif grep ^FAIL "$log" 1>&2; then
echo FAIL
elif grep -q ^PASS "$log"; then
echo PASS
else
echo ERROR
echo "No test results found." 1>&2
fi
register: test_results
- name: Set role result
set_fact:
role_result: "{{ test_results.stdout }}"
role_message: "{{ test_results.stderr|d('test execution error.') }}"
role_result_failed: "{{ test_results.stdout != 'PASS' }}"
role_result_msg: "{{ test_results.stderr|d('test execution error.') }}"
- include_role:
name: str-common-final
- name: Validate the result
shell: echo "test_results.stdout"
failed_when: test_results.stdout != 'PASS'

82
tests/tests.yml Normal file
View File

@ -0,0 +1,82 @@
- hosts: localhost
tags:
- classic
roles:
- role: custom-test-fonts
required_packages:
- google-noto-sans-cjk-ttc-fonts
- google-noto-serif-cjk-ttc-fonts
coverage:
ja:
path_prefix:
- /usr/share/fonts/google-noto-cjk
include:
- NotoSansCJK-.*ttc
- NotoSerifCJK-.*ttc
ko:
path_prefix:
- /usr/share/fonts/google-noto-cjk
include:
- NotoSansCJK-.*ttc
- NotoSerifCJK-.*ttc
zh-cn:
path_prefix:
- /usr/share/fonts/google-noto-cjk
include:
- NotoSansCJK-.*ttc
- NotoSerifCJK-.*ttc
zh-tw:
path_prefix:
- /usr/share/fonts/google-noto-cjk
include:
- NotoSansCJK-.*ttc
- NotoSerifCJK-.*ttc
families:
- lang: ja
package: google-noto-sans-cjk-ttc-fonts
alias: sans-serif
family: Noto Sans CJK JP
- lang: ko
package: google-noto-sans-cjk-ttc-fonts
alias: sans-serif
family: Noto Sans CJK KR
- lang: zh-cn
package: google-noto-sans-cjk-ttc-fonts
alias: sans-serif
family: Noto Sans CJK SC
- lang: zh-tw
package: google-noto-sans-cjk-ttc-fonts
alias: sans-serif
family: Noto Sans CJK TC
- lang: ja
package: google-noto-serif-cjk-ttc-fonts
alias: serif
family: Noto Serif CJK JP
- lang: ko
package: google-noto-serif-cjk-ttc-fonts
alias: serif
family: Noto Serif CJK KR
- lang: zh-cn
package: google-noto-serif-cjk-ttc-fonts
alias: serif
family: Noto Serif CJK SC
- lang: zh-tw
package: google-noto-serif-cjk-ttc-fonts
alias: serif
family: Noto Serif CJK TC
- lang: ja
package: google-noto-sans-cjk-ttc-fonts
alias: monospace
family: Noto Sans Mono CJK JP
- lang: ko
package: google-noto-sans-cjk-ttc-fonts
alias: monospace
family: Noto Sans Mono CJK KR
- lang: zh-cn
package: google-noto-sans-cjk-ttc-fonts
alias: monospace
family: Noto Sans Mono CJK SC
- lang: zh-tw
package: google-noto-sans-cjk-ttc-fonts
alias: monospace
family: Noto Sans Mono CJK TC