From 4e7a22270ff701de446ebbd05e699a94dedc12b9 Mon Sep 17 00:00:00 2001 From: anolis-bot Date: Thu, 27 Oct 2022 18:06:31 +0800 Subject: [PATCH 1/4] update to rpm-4.14.3-24.el8_6 Signed-off-by: anolis-bot --- 1000-rpm-anolis-support-loongarch.patch | 117 ------------ dist | 1 + ...4.3-fapolicyd-make-write-nonblocking.patch | 167 ++++++++++++++++++ rpm.spec | 22 +-- 4 files changed, 175 insertions(+), 132 deletions(-) delete mode 100644 1000-rpm-anolis-support-loongarch.patch create mode 100644 dist create mode 100644 rpm-4.14.3-fapolicyd-make-write-nonblocking.patch diff --git a/1000-rpm-anolis-support-loongarch.patch b/1000-rpm-anolis-support-loongarch.patch deleted file mode 100644 index 350516e..0000000 --- a/1000-rpm-anolis-support-loongarch.patch +++ /dev/null @@ -1,117 +0,0 @@ -From 0ff0feb65aa56ae673e0ec0554996a7ce2ff6a38 Mon Sep 17 00:00:00 2001 -From: chenguoqi -Date: Tue, 3 Aug 2021 07:35:19 +0000 -Subject: [PATCH] support loongarch for rpm - ---- - installplatform | 12 ++++++++++++ - lib/rpmrc.c | 6 ++++++ - rpmrc.in | 17 +++++++++++++++++ - 3 files changed, 35 insertions(+) - -diff --git a/installplatform b/installplatform -index 12339fc..74c50a2 100755 ---- a/installplatform -+++ b/installplatform -@@ -168,6 +168,18 @@ for ARCH in noarch `grep ^arch_canon $RPMRC | cut -d: -f2`; do - CANONARCH=mips64r6el - CANONCOLOR=3 - ;; -+ loongarch32) -+ ISANAME=loongarch -+ ISABITS=32 -+ CANONARCH=loongarch32 -+ CANONCOLOR=0 -+ ;; -+ loongarch64) -+ ISANAME=loongarch -+ ISABITS=64 -+ CANONARCH=loongarch64 -+ CANONCOLOR=3 -+ ;; - m68k) - ISANAME=m68k - ISABITS=32 -diff --git a/lib/rpmrc.c b/lib/rpmrc.c -index cada3f7..c4b13cc 100644 ---- a/lib/rpmrc.c -+++ b/lib/rpmrc.c -@@ -1241,6 +1241,12 @@ static void defaultMachine(rpmrcCtx ctx, const char ** arch, const char ** os) - } - # endif /* riscv */ - -+# if defined(__linux__) && defined(__loongarch64) -+ strcpy(un.machine, "loongarch64"); -+# elif defined(__linux__) && defined(__loongarch32) -+ strcpy(un.machine, "loongarch32"); -+# endif /* __loongarch64 */ -+ - # if defined(__GNUC__) && defined(__alpha__) - { - unsigned long amask, implver; -diff --git a/rpmrc.in b/rpmrc.in -index 3a5b1e6..425bb97 100644 ---- a/rpmrc.in -+++ b/rpmrc.in -@@ -67,6 +67,8 @@ optflags: mipsr6el -O2 -g - optflags: mips64r6 -O2 -g - optflags: mips64r6el -O2 -g - -+optflags: loongarch64 -O2 -g -+ - optflags: armv3l -O2 -g -march=armv3 - optflags: armv4b -O2 -g -march=armv4 - optflags: armv4l -O2 -g -march=armv4 -@@ -134,6 +136,9 @@ archcolor: mipsr6el 1 - archcolor: mips64r6 2 - archcolor: mips64r6el 2 - -+archcolor: loongarch32 1 -+archcolor: loongarch64 2 -+ - archcolor: m68k 1 - - archcolor: m68kmint 1 -@@ -252,6 +257,9 @@ arch_canon: mips64r6el: mips64r6el 21 - arch_canon: riscv: riscv64 22 - arch_canon: riscv64: riscv64 22 - -+arch_canon: loongarch32: loongarch32 25 -+arch_canon: loongarch64: loongarch64 26 -+ - ############################################################# - # Canonical OS names and numbers - -@@ -353,6 +361,9 @@ buildarchtranslate: mipsr6el: mipsr6el - buildarchtranslate: mips64r6: mips64r6 - buildarchtranslate: mips64r6el: mips64r6el - -+buildarchtranslate: loongarch32: loongarch32 -+buildarchtranslate: loongarch64: loongarch64 -+ - buildarchtranslate: m68k: m68k - - buildarchtranslate: atarist: m68kmint -@@ -442,6 +453,9 @@ arch_compat: mipsr6el: noarch - arch_compat: mips64r6: mipsr6 - arch_compat: mips64r6el: mipsr6el - -+arch_compat: loongarch32: noarch -+arch_compat: loongarch64: loongarch32 -+ - arch_compat: hppa2.0: hppa1.2 - arch_compat: hppa1.2: hppa1.1 - arch_compat: hppa1.1: hppa1.0 -@@ -577,6 +591,9 @@ buildarch_compat: mipsr6el: noarch - buildarch_compat: mips64r6: noarch - buildarch_compat: mips64r6el: noarch - -+buildarch_compat: loongarch32: noarch -+buildarch_compat: loongarch64: noarch -+ - buildarch_compat: armv4b: noarch - buildarch_compat: armv7l: armv6l - buildarch_compat: armv6l: armv5tejl --- -2.27.0 - diff --git a/dist b/dist new file mode 100644 index 0000000..0ee7539 --- /dev/null +++ b/dist @@ -0,0 +1 @@ +an8_6 diff --git a/rpm-4.14.3-fapolicyd-make-write-nonblocking.patch b/rpm-4.14.3-fapolicyd-make-write-nonblocking.patch new file mode 100644 index 0000000..343bd02 --- /dev/null +++ b/rpm-4.14.3-fapolicyd-make-write-nonblocking.patch @@ -0,0 +1,167 @@ +From 534fd1f0c84b12ba6080a46e07c57ef913c77cba Mon Sep 17 00:00:00 2001 +From: Radovan Sroka +Date: Thu, 25 Aug 2022 15:38:01 +0200 +Subject: [PATCH] fapolicyd: Make write() nonblocking + +- switch to read only and non blocking mode for pipe +- add 1 minute loop to wait for pipe to reappear + +Sometimes during the system update/upgrade fapolicyd +get restarted e.g. when systemd gets updated. +That can lead to the situation where fapolicyd pipe +has been removed and created again. +In such cases rpm-plugin-fapolicyd gets stuck on +write() to the pipe which does not exist anymore. +After switching to non blocking file descriptor +we can try to reopen the pipe if there is an error +from write(). Assuming that a new pipe should appear +when fapolicyd daemon starts again. +If not then after 1 minute of waiting we expect +fapolicyd daemon to be not active and we let the +transaction continue. + +Signed-off-by: Radovan Sroka +--- + plugins/fapolicyd.c | 74 +++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 65 insertions(+), 9 deletions(-) + +diff --git a/plugins/fapolicyd.c b/plugins/fapolicyd.c +index 1ff50c30f..6c6322941 100644 +--- a/plugins/fapolicyd.c ++++ b/plugins/fapolicyd.c +@@ -27,7 +27,7 @@ static rpmRC open_fifo(struct fapolicyd_data* state) + int fd = -1; + struct stat s; + +- fd = open(state->fifo_path, O_RDWR); ++ fd = open(state->fifo_path, O_WRONLY|O_NONBLOCK); + if (fd == -1) { + rpmlog(RPMLOG_DEBUG, "Open: %s -> %s\n", state->fifo_path, strerror(errno)); + goto bad; +@@ -55,15 +55,26 @@ static rpmRC open_fifo(struct fapolicyd_data* state) + } + + state->fd = fd; ++ + /* considering success */ + return RPMRC_OK; + + bad: + if (fd >= 0) + close(fd); ++ ++ state->fd = -1; + return RPMRC_FAIL; + } + ++static void close_fifo(struct fapolicyd_data* state) ++{ ++ if (state->fd > 0) ++ (void) close(state->fd); ++ ++ state->fd = -1; ++} ++ + static rpmRC write_fifo(struct fapolicyd_data* state, const char * str) + { + ssize_t len = strlen(str); +@@ -86,6 +97,54 @@ static rpmRC write_fifo(struct fapolicyd_data* state, const char * str) + return RPMRC_FAIL; + } + ++static void try_to_write_to_fifo(struct fapolicyd_data* state, const char * str) ++{ ++ int reload = 0; ++ int printed = 0; ++ ++ /* 1min/60s */ ++ const int timeout = 60; ++ ++ /* wait up to X seconds */ ++ for (int i = 0; i < timeout; i++) { ++ ++ if (reload) { ++ if (!printed) { ++ rpmlog(RPMLOG_WARNING, "rpm-plugin-fapolicyd: waiting for the service connection to resume, it can take up to %d seconds\n", timeout); ++ printed = 1; ++ } ++ ++ (void) close_fifo(state); ++ (void) open_fifo(state); ++ } ++ ++ if (state->fd >= 0) { ++ if (write_fifo(state, str) == RPMRC_OK) { ++ ++ /* write was successful after few reopens */ ++ if (reload) ++ rpmlog(RPMLOG_WARNING, "rpm-plugin-fapolicyd: the service connection has resumed\n"); ++ ++ break; ++ } ++ } ++ ++ /* failed write or reopen */ ++ reload = 1; ++ sleep(1); ++ ++ /* the last iteration */ ++ /* consider failure */ ++ if (i == timeout-1) { ++ rpmlog(RPMLOG_WARNING, "rpm-plugin-fapolicyd: the service connection has not resumed\n"); ++ rpmlog(RPMLOG_WARNING, "rpm-plugin-fapolicyd: continuing without the service\n"); ++ } ++ ++ } ++ ++} ++ ++ + static rpmRC fapolicyd_init(rpmPlugin plugin, rpmts ts) + { + if (rpmtsFlags(ts) & (RPMTRANS_FLAG_TEST|RPMTRANS_FLAG_BUILD_PROBS)) +@@ -102,10 +161,7 @@ static rpmRC fapolicyd_init(rpmPlugin plugin, rpmts ts) + + static void fapolicyd_cleanup(rpmPlugin plugin) + { +- if (fapolicyd_state.fd > 0) +- (void) close(fapolicyd_state.fd); +- +- fapolicyd_state.fd = -1; ++ (void) close_fifo(&fapolicyd_state); + } + + static rpmRC fapolicyd_tsm_post(rpmPlugin plugin, rpmts ts, int res) +@@ -116,9 +172,9 @@ static rpmRC fapolicyd_tsm_post(rpmPlugin plugin, rpmts ts, int res) + /* we are ready */ + if (fapolicyd_state.fd > 0) { + /* send a signal that transaction is over */ +- (void) write_fifo(&fapolicyd_state, "1\n"); ++ (void) try_to_write_to_fifo(&fapolicyd_state, "1\n"); + /* flush cache */ +- (void) write_fifo(&fapolicyd_state, "2\n"); ++ (void) try_to_write_to_fifo(&fapolicyd_state, "2\n"); + } + + end: +@@ -133,7 +189,7 @@ static rpmRC fapolicyd_scriptlet_pre(rpmPlugin plugin, const char *s_name, + + if (fapolicyd_state.changed_files > 0) { + /* send signal to flush cache */ +- (void) write_fifo(&fapolicyd_state, "2\n"); ++ (void) try_to_write_to_fifo(&fapolicyd_state, "2\n"); + + /* optimize flushing */ + /* flush only when there was an actual change */ +@@ -176,7 +232,7 @@ static rpmRC fapolicyd_fsm_file_prepare(rpmPlugin plugin, rpmfi fi, + char * sha = rpmfiFDigestHex(fi, NULL); + + snprintf(buffer, 4096, "%s %lu %64s\n", dest, size, sha); +- (void) write_fifo(&fapolicyd_state, buffer); ++ (void) try_to_write_to_fifo(&fapolicyd_state, buffer); + + free(sha); + +-- +2.37.3 + diff --git a/rpm.spec b/rpm.spec index 6c391bd..f314ded 100644 --- a/rpm.spec +++ b/rpm.spec @@ -1,5 +1,3 @@ -%define anolis_release .0.2 -%define _legacy_common_support 1 # build against xz? %bcond_without xz # just for giggles, option to build with internal Berkeley DB @@ -23,7 +21,7 @@ # build with readonly sqlite support? %bcond_without sqlite -%if 0%{?rhel} > 7 || 0%{?anolis} +%if 0%{?rhel} > 7 # Disable python2 build by default %bcond_with python2 %else @@ -34,7 +32,7 @@ %global rpmver 4.14.3 #global snapver rc2 -%global rel 23 +%global rel 24 %global srcver %{version}%{?snapver:-%{snapver}} %global srcdir %{?snapver:testing}%{!?snapver:%{name}-%(echo %{version} | cut -d'.' -f1-2).x} @@ -46,7 +44,7 @@ Summary: The RPM package management system Name: rpm Version: %{rpmver} -Release: %{?snapver:0.%{snapver}.}%{rel}%{anolis_release}%{?dist} +Release: %{?snapver:0.%{snapver}.}%{rel}%{?dist} Group: System Environment/Base Url: http://www.rpm.org/ Source0: http://ftp.rpm.org/releases/%{srcdir}/%{name}-%{srcver}.tar.bz2 @@ -116,6 +114,7 @@ Patch160: rpm-4.14.3-macroize-find-debuginfo-script-location.patch Patch161: rpm-4.14.3-validate-and-require-subkey-binding-sigs.patch Patch162: rpm-4.14.3-fix-spurious-transfiletriggerpostun-execution.patch Patch163: rpm-4.14.3-skip-recorded-symlinks-in-setperms.patch +Patch164: rpm-4.14.3-fapolicyd-make-write-nonblocking.patch # Python 3 string API sanity Patch500: 0001-In-Python-3-return-all-our-string-data-as-surrogate-.patch @@ -148,8 +147,6 @@ Patch1001: compile-with-Platform-Python-binary-where-relevant.patch # make unversioned %%__python an error unless explicitly overridden Patch1002: rpm-4.14.2-unversioned-python.patch -Patch2000: 1000-rpm-anolis-support-loongarch.patch - # Partially GPL/LGPL dual-licensed and some bits with BSD # SourceLicense: (GPLv2+ and LGPLv2+ with exceptions) and BSD License: GPLv2+ @@ -223,7 +220,7 @@ BuildRequires: libubsan %endif %if %{with libimaevm} -%if 0%{?fedora} >= 28 || 0%{?rhel} > 7 || 0%{?anolis} +%if 0%{?fedora} >= 28 || 0%{?rhel} > 7 %global imadevname ima-evm-utils-devel %else %global imadevname ima-evm-utils @@ -698,13 +695,8 @@ make check || cat tests/rpmtests.log %doc doc/librpm/html/* %changelog -* Thu Sep 15 2022 Liwei Ge - 4.14.3-23.0.2 -- Rebuild - -* Wed May 18 2022 Liwei Ge - 4.14.3-23.0.1 -- Rebrand for Anolis OS -- Fix gcc10 -fno-common compile issue for compatible with gcc10 build -- Support loongarch for rpm +* Tue Sep 13 2022 Michal Domonkos - 4.14.3-24 +- Make write() nonblocking in fapolicyd plugin (#2110787) * Tue Apr 05 2022 Michal Domonkos - 4.14.3-23 - Fix minor ABI regression in rpmcli.h (#1940895) -- Gitee From 4b2e6d9189da0f77309f53ea71791c2be4404f79 Mon Sep 17 00:00:00 2001 From: songmingliang Date: Wed, 18 May 2022 14:31:33 +0800 Subject: [PATCH 2/4] Rebrand for Anolis OS --- rpm.spec | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/rpm.spec b/rpm.spec index f314ded..0821191 100644 --- a/rpm.spec +++ b/rpm.spec @@ -1,3 +1,4 @@ +%define anolis_release .0.1 # build against xz? %bcond_without xz # just for giggles, option to build with internal Berkeley DB @@ -21,7 +22,7 @@ # build with readonly sqlite support? %bcond_without sqlite -%if 0%{?rhel} > 7 +%if 0%{?rhel} > 7 || 0%{?anolis} # Disable python2 build by default %bcond_with python2 %else @@ -44,7 +45,7 @@ Summary: The RPM package management system Name: rpm Version: %{rpmver} -Release: %{?snapver:0.%{snapver}.}%{rel}%{?dist} +Release: %{?snapver:0.%{snapver}.}%{rel}%{anolis_release}%{?dist} Group: System Environment/Base Url: http://www.rpm.org/ Source0: http://ftp.rpm.org/releases/%{srcdir}/%{name}-%{srcver}.tar.bz2 @@ -220,7 +221,7 @@ BuildRequires: libubsan %endif %if %{with libimaevm} -%if 0%{?fedora} >= 28 || 0%{?rhel} > 7 +%if 0%{?fedora} >= 28 || 0%{?rhel} > 7 || 0%{?anolis} %global imadevname ima-evm-utils-devel %else %global imadevname ima-evm-utils @@ -695,6 +696,9 @@ make check || cat tests/rpmtests.log %doc doc/librpm/html/* %changelog +* Fri Oct 28 2022 Liwei Ge - 4.14.3-24.0.1 +- Rebrand for Anolis OS + * Tue Sep 13 2022 Michal Domonkos - 4.14.3-24 - Make write() nonblocking in fapolicyd plugin (#2110787) -- Gitee From dd3c08e3ea2d589c324acf002f02a7efdc51cbd4 Mon Sep 17 00:00:00 2001 From: songmingliang Date: Wed, 18 May 2022 14:39:39 +0800 Subject: [PATCH 3/4] Fix gcc10 -fno-common compile issue until upstream fixes --- rpm.spec | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rpm.spec b/rpm.spec index 0821191..5ed9a75 100644 --- a/rpm.spec +++ b/rpm.spec @@ -1,4 +1,5 @@ %define anolis_release .0.1 +%define _legacy_common_support 1 # build against xz? %bcond_without xz # just for giggles, option to build with internal Berkeley DB @@ -698,6 +699,7 @@ make check || cat tests/rpmtests.log %changelog * Fri Oct 28 2022 Liwei Ge - 4.14.3-24.0.1 - Rebrand for Anolis OS +- Fix gcc10 -fno-common compile issue for compatible with gcc10 build * Tue Sep 13 2022 Michal Domonkos - 4.14.3-24 - Make write() nonblocking in fapolicyd plugin (#2110787) -- Gitee From 7e39ec30141c22f8da6670c1bf30cbdde9b7fee2 Mon Sep 17 00:00:00 2001 From: songmingliang Date: Wed, 18 May 2022 14:44:37 +0800 Subject: [PATCH 4/4] support loongarch --- 1000-rpm-anolis-support-loongarch.patch | 117 ++++++++++++++++++++++++ rpm.spec | 3 + 2 files changed, 120 insertions(+) create mode 100644 1000-rpm-anolis-support-loongarch.patch diff --git a/1000-rpm-anolis-support-loongarch.patch b/1000-rpm-anolis-support-loongarch.patch new file mode 100644 index 0000000..350516e --- /dev/null +++ b/1000-rpm-anolis-support-loongarch.patch @@ -0,0 +1,117 @@ +From 0ff0feb65aa56ae673e0ec0554996a7ce2ff6a38 Mon Sep 17 00:00:00 2001 +From: chenguoqi +Date: Tue, 3 Aug 2021 07:35:19 +0000 +Subject: [PATCH] support loongarch for rpm + +--- + installplatform | 12 ++++++++++++ + lib/rpmrc.c | 6 ++++++ + rpmrc.in | 17 +++++++++++++++++ + 3 files changed, 35 insertions(+) + +diff --git a/installplatform b/installplatform +index 12339fc..74c50a2 100755 +--- a/installplatform ++++ b/installplatform +@@ -168,6 +168,18 @@ for ARCH in noarch `grep ^arch_canon $RPMRC | cut -d: -f2`; do + CANONARCH=mips64r6el + CANONCOLOR=3 + ;; ++ loongarch32) ++ ISANAME=loongarch ++ ISABITS=32 ++ CANONARCH=loongarch32 ++ CANONCOLOR=0 ++ ;; ++ loongarch64) ++ ISANAME=loongarch ++ ISABITS=64 ++ CANONARCH=loongarch64 ++ CANONCOLOR=3 ++ ;; + m68k) + ISANAME=m68k + ISABITS=32 +diff --git a/lib/rpmrc.c b/lib/rpmrc.c +index cada3f7..c4b13cc 100644 +--- a/lib/rpmrc.c ++++ b/lib/rpmrc.c +@@ -1241,6 +1241,12 @@ static void defaultMachine(rpmrcCtx ctx, const char ** arch, const char ** os) + } + # endif /* riscv */ + ++# if defined(__linux__) && defined(__loongarch64) ++ strcpy(un.machine, "loongarch64"); ++# elif defined(__linux__) && defined(__loongarch32) ++ strcpy(un.machine, "loongarch32"); ++# endif /* __loongarch64 */ ++ + # if defined(__GNUC__) && defined(__alpha__) + { + unsigned long amask, implver; +diff --git a/rpmrc.in b/rpmrc.in +index 3a5b1e6..425bb97 100644 +--- a/rpmrc.in ++++ b/rpmrc.in +@@ -67,6 +67,8 @@ optflags: mipsr6el -O2 -g + optflags: mips64r6 -O2 -g + optflags: mips64r6el -O2 -g + ++optflags: loongarch64 -O2 -g ++ + optflags: armv3l -O2 -g -march=armv3 + optflags: armv4b -O2 -g -march=armv4 + optflags: armv4l -O2 -g -march=armv4 +@@ -134,6 +136,9 @@ archcolor: mipsr6el 1 + archcolor: mips64r6 2 + archcolor: mips64r6el 2 + ++archcolor: loongarch32 1 ++archcolor: loongarch64 2 ++ + archcolor: m68k 1 + + archcolor: m68kmint 1 +@@ -252,6 +257,9 @@ arch_canon: mips64r6el: mips64r6el 21 + arch_canon: riscv: riscv64 22 + arch_canon: riscv64: riscv64 22 + ++arch_canon: loongarch32: loongarch32 25 ++arch_canon: loongarch64: loongarch64 26 ++ + ############################################################# + # Canonical OS names and numbers + +@@ -353,6 +361,9 @@ buildarchtranslate: mipsr6el: mipsr6el + buildarchtranslate: mips64r6: mips64r6 + buildarchtranslate: mips64r6el: mips64r6el + ++buildarchtranslate: loongarch32: loongarch32 ++buildarchtranslate: loongarch64: loongarch64 ++ + buildarchtranslate: m68k: m68k + + buildarchtranslate: atarist: m68kmint +@@ -442,6 +453,9 @@ arch_compat: mipsr6el: noarch + arch_compat: mips64r6: mipsr6 + arch_compat: mips64r6el: mipsr6el + ++arch_compat: loongarch32: noarch ++arch_compat: loongarch64: loongarch32 ++ + arch_compat: hppa2.0: hppa1.2 + arch_compat: hppa1.2: hppa1.1 + arch_compat: hppa1.1: hppa1.0 +@@ -577,6 +591,9 @@ buildarch_compat: mipsr6el: noarch + buildarch_compat: mips64r6: noarch + buildarch_compat: mips64r6el: noarch + ++buildarch_compat: loongarch32: noarch ++buildarch_compat: loongarch64: noarch ++ + buildarch_compat: armv4b: noarch + buildarch_compat: armv7l: armv6l + buildarch_compat: armv6l: armv5tejl +-- +2.27.0 + diff --git a/rpm.spec b/rpm.spec index 5ed9a75..34fcaea 100644 --- a/rpm.spec +++ b/rpm.spec @@ -149,6 +149,8 @@ Patch1001: compile-with-Platform-Python-binary-where-relevant.patch # make unversioned %%__python an error unless explicitly overridden Patch1002: rpm-4.14.2-unversioned-python.patch +Patch2000: 1000-rpm-anolis-support-loongarch.patch + # Partially GPL/LGPL dual-licensed and some bits with BSD # SourceLicense: (GPLv2+ and LGPLv2+ with exceptions) and BSD License: GPLv2+ @@ -700,6 +702,7 @@ make check || cat tests/rpmtests.log * Fri Oct 28 2022 Liwei Ge - 4.14.3-24.0.1 - Rebrand for Anolis OS - Fix gcc10 -fno-common compile issue for compatible with gcc10 build +- Support loongarch for rpm * Tue Sep 13 2022 Michal Domonkos - 4.14.3-24 - Make write() nonblocking in fapolicyd plugin (#2110787) -- Gitee