154568cb3Sopenharmony_ci# UniProton 代码&文档贡献指南 254568cb3Sopenharmony_ci- [编程规范](#编程规范) 354568cb3Sopenharmony_ci - [总体原则](#总体原则) 454568cb3Sopenharmony_ci - [目录结构](#目录结构) 554568cb3Sopenharmony_ci - [命名](#命名) 654568cb3Sopenharmony_ci - [排版与格式](#排版与格式) 754568cb3Sopenharmony_ci - [注释](#注释) 854568cb3Sopenharmony_ci - [宏](#宏) 954568cb3Sopenharmony_ci - [头文件](#头文件) 1054568cb3Sopenharmony_ci - [数据类型](#数据类型) 1154568cb3Sopenharmony_ci - [变量](#变量) 1254568cb3Sopenharmony_ci - [函数](#函数) 1354568cb3Sopenharmony_ci - [可移植性](#可移植性) 1454568cb3Sopenharmony_ci - [业界编程规范](#业界编程规范) 1554568cb3Sopenharmony_ci- [文档写作规范](#文档写作规范) 1654568cb3Sopenharmony_ci- [Commit message规范](#Commitmessage规范) 1754568cb3Sopenharmony_ci- [贡献流程](#贡献流程) 1854568cb3Sopenharmony_ci- [协议](#协议) 1954568cb3Sopenharmony_ci- [加入我们](#加入我们) 2054568cb3Sopenharmony_ci 2154568cb3Sopenharmony_ci<h2 id="编程规范">编程规范</h2> 2254568cb3Sopenharmony_ci此编程规范在业界通用的编程规范基础上进行了整理,供开发者参考使用。 2354568cb3Sopenharmony_ci 2454568cb3Sopenharmony_ci### 总体原则 2554568cb3Sopenharmony_ci- 清晰,易于维护、易于重构。 2654568cb3Sopenharmony_ci- 简洁,易于理解,并且易于实现。 2754568cb3Sopenharmony_ci- 风格统一,代码整体风格保持统一。 2854568cb3Sopenharmony_ci- 通用性,遵循业界通用的编程规范。 2954568cb3Sopenharmony_ci 3054568cb3Sopenharmony_ci### 目录结构 3154568cb3Sopenharmony_ci建议将工程按照功能模块划分子目录(可参考UniProton的功能模块划分),子目录再定义头文件和源文件目录。 3254568cb3Sopenharmony_ci 3354568cb3Sopenharmony_ci### 命名 3454568cb3Sopenharmony_ci- 使用驼峰风格进行命名,此风格大小写字母混用,不同单词间通过单词首字母大写来分开,具体规则如下: 3554568cb3Sopenharmony_ci | 类型 | 命名风格 | 形式 | 3654568cb3Sopenharmony_ci | --------------------------- | -------------------------------- | ------------------------- | 3754568cb3Sopenharmony_ci | 函数,自定义的类型 | 大驼峰,或带有模块前缀的大驼峰 | AaaBbb, XXX_AaaBbb | 3854568cb3Sopenharmony_ci | 局部变量,函数参数,宏参数,结构体成员,联合体成员 | 小驼峰 | aaaBbb | 3954568cb3Sopenharmony_ci | 全局变量 | 带'g_'前缀的小驼峰 | g_aaaBbb | 4054568cb3Sopenharmony_ci | 宏,枚举值 | 全大写并下划线分割 | AAA_BBB | 4154568cb3Sopenharmony_ci | 内核头文件中防止重复包含的宏变量 | 带'PRT'前缀和'H'后缀,中间为大写模块名,以下划线分割 | PRT_MODULE_H | 4254568cb3Sopenharmony_ci- 全局函数、全局变量、宏、类型名、枚举名的命名,应当准确描述并全局唯一。 4354568cb3Sopenharmony_ci- 在能够准确表达含义的前提下,局部变量,或结构体、联合体的成员变量,其命名应尽可能简短。 4454568cb3Sopenharmony_ci- UniProton的对外API使用PRT_\<Module\>\<Func\>的方式,如果有动词和宾语,则采用PRT_\<Module\>\<Verb\>\<Object\>,比如: 4554568cb3Sopenharmony_ci ``` 4654568cb3Sopenharmony_ci PRT_TaskCreate 4754568cb3Sopenharmony_ci PRT_SemPend 4854568cb3Sopenharmony_ci PRT_TickGetCount 4954568cb3Sopenharmony_ci PRT_TaskGetStatus 5054568cb3Sopenharmony_ci ``` 5154568cb3Sopenharmony_ci kernel目录下内部模块间接口使用Os\<Module\>\<Func\>的方式,比如: 5254568cb3Sopenharmony_ci ``` 5354568cb3Sopenharmony_ci OsTaskScan 5454568cb3Sopenharmony_ci OsSwTmrCtrlInit 5554568cb3Sopenharmony_ci ``` 5654568cb3Sopenharmony_ci 5754568cb3Sopenharmony_ci### 排版与格式 5854568cb3Sopenharmony_ci- 程序块采用缩进风格编写,使用空格而不是制表符('\t')进行缩进,每级缩进为4个空格。 5954568cb3Sopenharmony_ci- 采用K&R风格作为大括号换行风格,即函数左大括号另起一行放行首,并独占一行,其他左大括号跟随语句放行末, 6054568cb3Sopenharmony_ci 右大括号独占一行,除非后面跟着同一语句的剩余部分,如if语句的else/else if或者分号,比如: 6154568cb3Sopenharmony_ci ```c 6254568cb3Sopenharmony_ci struct MyType { // 左大括号跟随语句放行末,前置1个空格 6354568cb3Sopenharmony_ci ... 6454568cb3Sopenharmony_ci }; // 右大括号后面紧跟分号 6554568cb3Sopenharmony_ci ``` 6654568cb3Sopenharmony_ci ```c 6754568cb3Sopenharmony_ci int Foo(int a) 6854568cb3Sopenharmony_ci { // 函数左大括号独占一行,放行首 6954568cb3Sopenharmony_ci if (a > 0) { // 左大括号跟随语句放行末,前置1个空格 7054568cb3Sopenharmony_ci ... 7154568cb3Sopenharmony_ci } else { // 右大括号、"else"、以及后续的左大括号均在同一行 7254568cb3Sopenharmony_ci ... 7354568cb3Sopenharmony_ci } // 右大括号独占一行 7454568cb3Sopenharmony_ci ... 7554568cb3Sopenharmony_ci } 7654568cb3Sopenharmony_ci ``` 7754568cb3Sopenharmony_ci- 条件、循环语句使用大括号,比如: 7854568cb3Sopenharmony_ci ```c 7954568cb3Sopenharmony_ci if (objectIsNotExist) { // 单行条件语句也加大括号 8054568cb3Sopenharmony_ci return CreateNewObject(); 8154568cb3Sopenharmony_ci } 8254568cb3Sopenharmony_ci ``` 8354568cb3Sopenharmony_ci ```c 8454568cb3Sopenharmony_ci while (condition) {} // 即使循环体是空,也应使用大括号 8554568cb3Sopenharmony_ci ``` 8654568cb3Sopenharmony_ci ```c 8754568cb3Sopenharmony_ci while (condition) { 8854568cb3Sopenharmony_ci continue; // continue表示空逻辑,使用大括号 8954568cb3Sopenharmony_ci } 9054568cb3Sopenharmony_ci ``` 9154568cb3Sopenharmony_ci- case/default语句相对switch缩进一层,缩进风格如下: 9254568cb3Sopenharmony_ci ```c 9354568cb3Sopenharmony_ci switch (var) { 9454568cb3Sopenharmony_ci case 0: // 缩进一层 9554568cb3Sopenharmony_ci DoSomething1(); // 缩进一层 9654568cb3Sopenharmony_ci break; 9754568cb3Sopenharmony_ci case 1: 9854568cb3Sopenharmony_ci DoSomething2(); 9954568cb3Sopenharmony_ci break; 10054568cb3Sopenharmony_ci default: 10154568cb3Sopenharmony_ci break; 10254568cb3Sopenharmony_ci } 10354568cb3Sopenharmony_ci ``` 10454568cb3Sopenharmony_ci- 一行只写一条语句。 10554568cb3Sopenharmony_ci- 一条语句不能过长,建议不超过120个字符,如不能缩短语句则需要分行写。 10654568cb3Sopenharmony_ci- 换行时将操作符留在行末,新行进行同类对齐或缩进一层,比如: 10754568cb3Sopenharmony_ci ```c 10854568cb3Sopenharmony_ci // 假设下面第一行不满足行宽要求 10954568cb3Sopenharmony_ci if (currentValue > MIN && // 换行后,布尔操作符放在行末 11054568cb3Sopenharmony_ci currentValue < MAX) { // 与(&&)操作符的两个操作数同类对齐 11154568cb3Sopenharmony_ci DoSomething(); 11254568cb3Sopenharmony_ci ... 11354568cb3Sopenharmony_ci } 11454568cb3Sopenharmony_ci ``` 11554568cb3Sopenharmony_ci ```c 11654568cb3Sopenharmony_ci // 假设下面的函数调用不满足行宽要求,需要换行 11754568cb3Sopenharmony_ci ReturnType result = FunctionName(paramName1, 11854568cb3Sopenharmony_ci paramName2, 11954568cb3Sopenharmony_ci paramName3); // 保持与上方参数对齐 12054568cb3Sopenharmony_ci ``` 12154568cb3Sopenharmony_ci ```c 12254568cb3Sopenharmony_ci ReturnType result = VeryVeryVeryLongFunctionName( // 写入第1个参数后导致过长,直接换行 12354568cb3Sopenharmony_ci paramName1, paramName2, paramName3); // 换行后,4空格缩进一层 12454568cb3Sopenharmony_ci ``` 12554568cb3Sopenharmony_ci ```c 12654568cb3Sopenharmony_ci // 每行的参数代表一组相关性较强的数据结构,放在一行便于理解,此时可理解性优先于格式排版要求 12754568cb3Sopenharmony_ci int result = DealWithStructLikeParams(left.x, left.y, // 表示一组相关参数 12854568cb3Sopenharmony_ci right.x, right.y); // 表示另外一组相关参数 12954568cb3Sopenharmony_ci ``` 13054568cb3Sopenharmony_ci- 声明定义函数时,函数的返回类型以及其他修饰符,与函数名同行。 13154568cb3Sopenharmony_ci- 指针类型"*"应该靠右跟随变量或者函数名,比如: 13254568cb3Sopenharmony_ci ```c 13354568cb3Sopenharmony_ci int *p1; // Good:右跟随变量,和左边的类型隔了1个空格 13454568cb3Sopenharmony_ci int* p2; // Bad:左跟随类型 13554568cb3Sopenharmony_ci int*p3; // Bad:两边都没空格 13654568cb3Sopenharmony_ci int * p4; // Bad:两边都有空格 13754568cb3Sopenharmony_ci ``` 13854568cb3Sopenharmony_ci 当"*"与变量或函数名之间有其他修饰符,无法跟随时,此时也不要跟随修饰符,比如: 13954568cb3Sopenharmony_ci ```c 14054568cb3Sopenharmony_ci char * const VERSION = "V100"; // Good:当有const修饰符时,"*"两边都有空格 14154568cb3Sopenharmony_ci int Foo(const char * restrict p); // Good:当有restrict修饰符时,"*"两边都有空格 14254568cb3Sopenharmony_ci ``` 14354568cb3Sopenharmony_ci- 根据上下内容的相关程度,合理安排空行,但不要使用连续3个或更多空行。 14454568cb3Sopenharmony_ci- 编译预处理的"#"统一放在行首,无需缩进。嵌套编译预处理语句时,"#"可以进行缩进,比如: 14554568cb3Sopenharmony_ci ```c 14654568cb3Sopenharmony_ci #if defined(__x86_64__) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16) // 位于行首,不缩进 14754568cb3Sopenharmony_ci #define ATOMIC_X86_HAS_CMPXCHG16B 1 // 缩进一层,区分层次,便于阅读 14854568cb3Sopenharmony_ci #else 14954568cb3Sopenharmony_ci #define ATOMIC_X86_HAS_CMPXCHG16B 0 15054568cb3Sopenharmony_ci #endif 15154568cb3Sopenharmony_ci ``` 15254568cb3Sopenharmony_ci 15354568cb3Sopenharmony_ci### 注释 15454568cb3Sopenharmony_ci- 注释的内容要清楚、明了,含义准确,防止注释二义性。 15554568cb3Sopenharmony_ci- 在代码的功能、意图层次上进行注释,即注释解释代码难以直接表达的意图,而不是仅仅重复描述代码。 15654568cb3Sopenharmony_ci- 函数声明处注释描述函数功能、性能及用法,包括输入和输出参数、函数返回值、可重入的要求等;定义处详细描述函数功能和实现要点,如实现的简要步骤、实现的理由、设计约束等。 15754568cb3Sopenharmony_ci- 全局变量要有较详细的注释,包括对其功能、取值范围以及存取时注意事项等的说明。 15854568cb3Sopenharmony_ci- 避免在注释中使用缩写,除非是业界通用或子系统内标准化的缩写。 15954568cb3Sopenharmony_ci- 文件头部要进行注释,建议注释列出:版权说明、版本号、生成日期、作者姓名、功能说明、与其它文件的关系、修改日志等。 16054568cb3Sopenharmony_ci- 注释风格要统一,建议优先选择/* */的方式,注释符与注释内容之间要有1空格,单行、多行注释风格如下: 16154568cb3Sopenharmony_ci ```c 16254568cb3Sopenharmony_ci /* 单行注释 */ 16354568cb3Sopenharmony_ci ``` 16454568cb3Sopenharmony_ci ```c 16554568cb3Sopenharmony_ci /* 16654568cb3Sopenharmony_ci * 多行注释 16754568cb3Sopenharmony_ci * 第二行 16854568cb3Sopenharmony_ci */ 16954568cb3Sopenharmony_ci ``` 17054568cb3Sopenharmony_ci- 注释应放在其代码上方或右方。 17154568cb3Sopenharmony_ci 17254568cb3Sopenharmony_ci 上方的注释,与代码行之间无空行,保持与代码一样的缩进。 17354568cb3Sopenharmony_ci 右边的注释,与代码之间至少相隔1个空格。如果有多条右置注释,上下对齐会更加美观,比如: 17454568cb3Sopenharmony_ci ```c 17554568cb3Sopenharmony_ci #define A_CONST 100 // 此处两行注释属于同类 17654568cb3Sopenharmony_ci #define ANOTHER_CONST 200 // 可保持左侧对齐 17754568cb3Sopenharmony_ci ``` 17854568cb3Sopenharmony_ci 17954568cb3Sopenharmony_ci### 宏 18054568cb3Sopenharmony_ci- 代码片段使用宏隔离时,统一通过#ifdef的方式,例如: 18154568cb3Sopenharmony_ci ```c 18254568cb3Sopenharmony_ci #ifdef PRTCFG_XXX 18354568cb3Sopenharmony_ci ... 18454568cb3Sopenharmony_ci #endif 18554568cb3Sopenharmony_ci ``` 18654568cb3Sopenharmony_ci- 定义宏时,要使用完备的括号,比如: 18754568cb3Sopenharmony_ci ```c 18854568cb3Sopenharmony_ci #define SUM(a, b) a + b // 不符合本条要求 18954568cb3Sopenharmony_ci #define SUM(a, b) ((a) + (b)) // 符合本条要求 19054568cb3Sopenharmony_ci ``` 19154568cb3Sopenharmony_ci 但是也要避免滥用括号,比如单独的数字或标识符加括号毫无意义: 19254568cb3Sopenharmony_ci ```c 19354568cb3Sopenharmony_ci #define SOME_CONST 100 // 单独的数字无需括号 19454568cb3Sopenharmony_ci #define ANOTHER_CONST (-1) // 负数需要使用括号 19554568cb3Sopenharmony_ci #define THE_CONST SOME_CONST // 单独的标识符无需括号 19654568cb3Sopenharmony_ci ``` 19754568cb3Sopenharmony_ci- 包含多条语句的函数式宏的实现语句必须放在do-while(0)中,例如: 19854568cb3Sopenharmony_ci ```c 19954568cb3Sopenharmony_ci #define FOO(x) do { \ 20054568cb3Sopenharmony_ci (void)printf("arg is %d\n", (x)); \ 20154568cb3Sopenharmony_ci DoSomething((x)); \ 20254568cb3Sopenharmony_ci } while (0) 20354568cb3Sopenharmony_ci ``` 20454568cb3Sopenharmony_ci- 禁止宏调用参数中出现预编译指令。 20554568cb3Sopenharmony_ci- 宏定义不以分号结尾。 20654568cb3Sopenharmony_ci 20754568cb3Sopenharmony_ci### 头文件 20854568cb3Sopenharmony_ci- 设计原则 20954568cb3Sopenharmony_ci - 头文件应当职责单一。 21054568cb3Sopenharmony_ci - 一个模块通常包含多个.c文件,建议放在同一个目录下,目录名即为模块名;如果一个模块包含多个子模块,则建议每一个子模块提供一个对外的.h,文件名为子模块名。 21154568cb3Sopenharmony_ci - 建议每一个.c文件应有一个同名.h文件,用于声明需要对外公开的接口。 21254568cb3Sopenharmony_ci - 头文件中适合放置接口的声明,不适合放置实现。 21354568cb3Sopenharmony_ci - 不要在头文件中定义变量。 21454568cb3Sopenharmony_ci - 禁止头文件循环依赖,循环依赖指a.h包含b.h,b.h包含c.h,c.h包含a.h。 21554568cb3Sopenharmony_ci - 头文件应当自包含,即任意一个头文件均可独立编译,但同时也要避免包含用不到的头文件。 21654568cb3Sopenharmony_ci - 头文件必须用#define保护,防止重复包含,比如内核中统一使用以下宏定义保护: 21754568cb3Sopenharmony_ci ```c 21854568cb3Sopenharmony_ci #ifndef PRT_<MODULE>_H // 比如 PRT_TASK_H 21954568cb3Sopenharmony_ci #define PRT_<MODULE>_H 22054568cb3Sopenharmony_ci ... 22154568cb3Sopenharmony_ci #endif 22254568cb3Sopenharmony_ci ``` 22354568cb3Sopenharmony_ci - 禁止通过声明的方式引用外部函数接口、变量,只能通过包含头文件的方式使用其他模块或文件提供的接口。 22454568cb3Sopenharmony_ci - 禁止在 extern "C" 中包含头文件。 22554568cb3Sopenharmony_ci - 按照合理的顺序包含头文件: 22654568cb3Sopenharmony_ci 1) 源文件对应的头文件 22754568cb3Sopenharmony_ci 2) C标准库 22854568cb3Sopenharmony_ci 3) 需要包含的OS其他头文件 22954568cb3Sopenharmony_ci- 版权声明 23054568cb3Sopenharmony_ci - 头文件版权声明一致,放在头文件置顶位置。 23154568cb3Sopenharmony_ci - 如果提交的代码是在开源软件基础上修改所编写或衍生的代码,请遵循开源许可协议要求,并且已履行被修改软件的许可证义务。 23254568cb3Sopenharmony_ci 23354568cb3Sopenharmony_ci### 数据类型 23454568cb3Sopenharmony_ci基础类型定义统一使用prt_typedef.h中定义的类型,比如定义无符号32位整型变量使用U32。 23554568cb3Sopenharmony_ci 23654568cb3Sopenharmony_ci### 变量 23754568cb3Sopenharmony_ci- 一个变量只有一个功能,不要把一个变量用作多种用途。 23854568cb3Sopenharmony_ci- 防止局部变量与全局变量同名。 23954568cb3Sopenharmony_ci- 不用或者少用全局变量。 24054568cb3Sopenharmony_ci- 定义函数的局部变量时,控制变量的占用空间,避免因占用过多栈空间导致程序运行失败。比如需要一个大数组,可以通过动态分配内存的方式来避免栈空间占用过大。 24154568cb3Sopenharmony_ci- 在首次使用前初始化变量。 24254568cb3Sopenharmony_ci- 指向资源句柄或描述符的变量,在资源释放后立即赋予新值,包括指针、文件描述符以及其它指向资源的变量。 24354568cb3Sopenharmony_ci- 禁止将局部变量的地址返回到其作用域以外,下面是一个**错误示例:** 24454568cb3Sopenharmony_ci ```c 24554568cb3Sopenharmony_ci int *Func(void) 24654568cb3Sopenharmony_ci { 24754568cb3Sopenharmony_ci int localVar = 0; 24854568cb3Sopenharmony_ci ... 24954568cb3Sopenharmony_ci return &localVar; // 错误 25054568cb3Sopenharmony_ci } 25154568cb3Sopenharmony_ci 25254568cb3Sopenharmony_ci void Caller(void) 25354568cb3Sopenharmony_ci { 25454568cb3Sopenharmony_ci int *p = Func(); 25554568cb3Sopenharmony_ci ... 25654568cb3Sopenharmony_ci int x = *p; // 程序产生未定义行为 25754568cb3Sopenharmony_ci } 25854568cb3Sopenharmony_ci ``` 25954568cb3Sopenharmony_ci **正确代码示例:** 26054568cb3Sopenharmony_ci ```c 26154568cb3Sopenharmony_ci int Func(void) 26254568cb3Sopenharmony_ci { 26354568cb3Sopenharmony_ci int localVar = 0; 26454568cb3Sopenharmony_ci ... 26554568cb3Sopenharmony_ci return localVar; 26654568cb3Sopenharmony_ci } 26754568cb3Sopenharmony_ci 26854568cb3Sopenharmony_ci void Caller(void) 26954568cb3Sopenharmony_ci { 27054568cb3Sopenharmony_ci int x = Func(); 27154568cb3Sopenharmony_ci ... 27254568cb3Sopenharmony_ci } 27354568cb3Sopenharmony_ci ``` 27454568cb3Sopenharmony_ci- 如果要使用其他模块的变量,应尽量避免直接对变量进行访问,而是通过统一的函数封装或者宏封装的方式,比如mutex模块中: 27554568cb3Sopenharmony_ci ```c 27654568cb3Sopenharmony_ci // 私有头文件中引入全局变量,但要避免直接使用 27754568cb3Sopenharmony_ci extern struct TagQueCb *g_allQueue; 27854568cb3Sopenharmony_ci // 通过GET_QUEUE_HANDLE的方式对g_allQueue进行访问 27954568cb3Sopenharmony_ci #define GET_QUEUE_HANDLE(queueId) (((struct TagQueCb *)g_allQueue) + (queueId)) 28054568cb3Sopenharmony_ci ``` 28154568cb3Sopenharmony_ci 28254568cb3Sopenharmony_ci### 函数 28354568cb3Sopenharmony_ci- 重复代码应该尽可能提炼成函数。 28454568cb3Sopenharmony_ci- 避免函数过长,新增函数不超过 40-50 行。 28554568cb3Sopenharmony_ci- 内联函数要尽可能短,避免超过 10 行(非空非注释)。 28654568cb3Sopenharmony_ci- 避免函数的代码块嵌套过深。 28754568cb3Sopenharmony_ci- 函数应避免使用全局变量、静态局部变量和I/O操作,不可避免的地方应集中使用。 28854568cb3Sopenharmony_ci 28954568cb3Sopenharmony_ci### 可移植性 29054568cb3Sopenharmony_ci不使用与硬件或操作系统关系很大的语句,而使用建议的标准语句,以提高软件的可移植性和可重用性。 29154568cb3Sopenharmony_ci 29254568cb3Sopenharmony_ci### 业界编程规范 29354568cb3Sopenharmony_ciC语言编程规范参考资料较多,大家可以自行了解,本文不再过多赘述。 29454568cb3Sopenharmony_ci 29554568cb3Sopenharmony_ci 29654568cb3Sopenharmony_ci<h2 id="文档写作规范">文档写作规范</h2> 29754568cb3Sopenharmony_ci 29854568cb3Sopenharmony_ciUniProton欢迎开发者参与到开源社区的贡献中来,本文主要介绍参与UniProton文档贡献的写作规范,如果贡献者提交文档的修改或提交新的文档,请参照此规范。 29954568cb3Sopenharmony_ci 30054568cb3Sopenharmony_ci### 命名规范 30154568cb3Sopenharmony_ci 30254568cb3Sopenharmony_ci如需提交新的文档,在<a href="https://gitee.com/openeuler/UniProton" target="_blank">UniProton代码仓</a>doc目录下创建新的.md文件,命名需遵循 xxx\_xxx.md 格式,根据文档的内容来声明。 30354568cb3Sopenharmony_ci 30454568cb3Sopenharmony_ci比如介绍写作规范的文档,可以命名为 UniProton\_doc\_write\_standard.md。 30554568cb3Sopenharmony_ci 30654568cb3Sopenharmony_ci### 内容规范 30754568cb3Sopenharmony_ci 30854568cb3Sopenharmony_ci以简洁、直观地表达所述内容为目的,介绍性文档言简意赅介绍原理、架构、设计思路等,操作类文档写明关键步骤,以便能对其他开发者起到帮助。可以优先使用中文,建议中英文都支持,UniProton也将持续更新,保证中英文的同步。 30954568cb3Sopenharmony_ci 31054568cb3Sopenharmony_ci1. **标题** 31154568cb3Sopenharmony_ci 31254568cb3Sopenharmony_ci 建议标题层级不超过三级。 31354568cb3Sopenharmony_ci 31454568cb3Sopenharmony_ci2. **正文** 31554568cb3Sopenharmony_ci - 操作类文档以移植为例,文档结构可以参考如下: 31654568cb3Sopenharmony_ci 1. 目的(简述操作目的,如移植到哪款型号的单板) 31754568cb3Sopenharmony_ci 2. 软硬件环境准备 31854568cb3Sopenharmony_ci 3. 移植具体步骤 31954568cb3Sopenharmony_ci 4. 结果验证 32054568cb3Sopenharmony_ci 32154568cb3Sopenharmony_ci - 介绍性文档以开发指南某一功能为例,文档结构可以参考如下: 32254568cb3Sopenharmony_ci 1. 概述(概念及原理介绍) 32354568cb3Sopenharmony_ci 2. 功能(支持的接口列表) 32454568cb3Sopenharmony_ci 3. 开发流程(如何使用及相应步骤) 32554568cb3Sopenharmony_ci 4. 编程实例(提供具体代码示例) 32654568cb3Sopenharmony_ci 5. 注意事项 32754568cb3Sopenharmony_ci 6. 其他 32854568cb3Sopenharmony_ci 32954568cb3Sopenharmony_ci3. **图片** 33054568cb3Sopenharmony_ci 33154568cb3Sopenharmony_ci 图片统一存放到文档同级目录下的images文件夹中(英文文档对应images-en),如 UniProton/doc/getting\_started.md 中使用的图片,统一放置到 UniProton/doc/images 目录下,文档中使用相对路径引用图片。图片建议根据内容命名,只用数字序列不利于后续图片的继承。 33254568cb3Sopenharmony_ci <!-- 33354568cb3Sopenharmony_ci > **说明:** 33454568cb3Sopenharmony_ci >引用方式: 33554568cb3Sopenharmony_ci >!\[\]\(./images/images-standard.png\) 33654568cb3Sopenharmony_ci --> 33754568cb3Sopenharmony_ci **说明:** 图 33854568cb3Sopenharmony_ci 如果是自制图片,配色请参考如下,格式不限,png/jpg/gif...均可,如果是截图或者其他地方引用图片,风格不做限制。 33954568cb3Sopenharmony_ci <!-- 34054568cb3Sopenharmony_ci  34154568cb3Sopenharmony_ci --> 34254568cb3Sopenharmony_ci **说明:** 图 34354568cb3Sopenharmony_ci4. **表格** 34454568cb3Sopenharmony_ci 34554568cb3Sopenharmony_ci 在md文件中可以按照如下形式插入表格。 34654568cb3Sopenharmony_ci 34754568cb3Sopenharmony_ci ``` 34854568cb3Sopenharmony_ci | Tables | Type | Note | 34954568cb3Sopenharmony_ci | ----------- |:-------------:| -----:| 35054568cb3Sopenharmony_ci | first | standard | None | 35154568cb3Sopenharmony_ci | second | outstanding | 5 | 35254568cb3Sopenharmony_ci | third | inside | with | 35354568cb3Sopenharmony_ci ``` 35454568cb3Sopenharmony_ci 35554568cb3Sopenharmony_ci5. **代码** 35654568cb3Sopenharmony_ci 35754568cb3Sopenharmony_ci 正文中插入代码段,可以在段落前后加上符号 \`\`\`。 35854568cb3Sopenharmony_ci <blockquote> 35954568cb3Sopenharmony_ci ```c 36054568cb3Sopenharmony_ci 36154568cb3Sopenharmony_ci int size = 10; 36254568cb3Sopenharmony_ci 36354568cb3Sopenharmony_ci \``` 36454568cb3Sopenharmony_ci </blockquote> 36554568cb3Sopenharmony_ci 36654568cb3Sopenharmony_ci 36754568cb3Sopenharmony_ci<h2 id="Commitmessage规范">Commit message规范</h2> 36854568cb3Sopenharmony_ci 36954568cb3Sopenharmony_ci### 概要说明 37054568cb3Sopenharmony_ci 37154568cb3Sopenharmony_ci目前,社区有多种 Commit message 的写法规范。UniProton采用的是Angular规范,这是目前使用最广的写法,比较合理和系统化,并且有配套的工具。 37254568cb3Sopenharmony_ci 37354568cb3Sopenharmony_ci### Commit message的作用 37454568cb3Sopenharmony_ci 37554568cb3Sopenharmony_ci格式化的Commit message有几个好处: 37654568cb3Sopenharmony_ci 37754568cb3Sopenharmony_ci- 提供更多的历史信息,方便快速浏览 37854568cb3Sopenharmony_ci- 可以过滤某些commit(比如文档改动),便于快速查找信息 37954568cb3Sopenharmony_ci- 可以直接从commit生成Change log 38054568cb3Sopenharmony_ci 38154568cb3Sopenharmony_ci### UniProton Commit message的格式 38254568cb3Sopenharmony_ci 38354568cb3Sopenharmony_ci每次提交,Commit message 都包括三个部分:Header,Body 和 Footer。 38454568cb3Sopenharmony_ci``` 38554568cb3Sopenharmony_ci<header> 38654568cb3Sopenharmony_ci空一行 38754568cb3Sopenharmony_ci<body> 38854568cb3Sopenharmony_ci空一行 38954568cb3Sopenharmony_ci<footer> 39054568cb3Sopenharmony_ci``` 39154568cb3Sopenharmony_ci 39254568cb3Sopenharmony_ci比如: 39354568cb3Sopenharmony_ci 39454568cb3Sopenharmony_ci``` 39554568cb3Sopenharmony_cifix(stm32f411): fix stm32f411 migration guide file error 39654568cb3Sopenharmony_ci 39754568cb3Sopenharmony_cifix some error in stm32f411re migration guide file. 39854568cb3Sopenharmony_ci 39954568cb3Sopenharmony_ciClose #75 40054568cb3Sopenharmony_ci``` 40154568cb3Sopenharmony_ci 40254568cb3Sopenharmony_ci- **Header格式** 40354568cb3Sopenharmony_ci 40454568cb3Sopenharmony_ci Header部分只有一行,格式为: 40554568cb3Sopenharmony_ci 40654568cb3Sopenharmony_ci ``` 40754568cb3Sopenharmony_ci <type>(<scope>): <subject> 40854568cb3Sopenharmony_ci ``` 40954568cb3Sopenharmony_ci 41054568cb3Sopenharmony_ci Header部分共包括三个字段:type(必需)、scope(可选)和subject(必需)。 41154568cb3Sopenharmony_ci 41254568cb3Sopenharmony_ci - type 41354568cb3Sopenharmony_ci 41454568cb3Sopenharmony_ci type用于说明 commit 的类别,只允许使用下面7个标识。 41554568cb3Sopenharmony_ci 41654568cb3Sopenharmony_ci ``` 41754568cb3Sopenharmony_ci feat:feature的缩写,表示这是一个新功能 41854568cb3Sopenharmony_ci fix:修补bug 41954568cb3Sopenharmony_ci docs:documentation的缩写,表示修改的是文档 42054568cb3Sopenharmony_ci style: 格式修改,是不影响代码运行的变动 42154568cb3Sopenharmony_ci refactor:重构,它即不是新增功能,也不是修改bug 42254568cb3Sopenharmony_ci test:增加测试 42354568cb3Sopenharmony_ci chore:构建过程或辅助工具的变动 42454568cb3Sopenharmony_ci ``` 42554568cb3Sopenharmony_ci 42654568cb3Sopenharmony_ci - scope 42754568cb3Sopenharmony_ci 42854568cb3Sopenharmony_ci scope用于说明 commit 影响的范围,比如对UniProton Kernel的base的修改会影响全部代码,所以填写all。如果只修改STM32F411的代码,则填写STM32F411。 42954568cb3Sopenharmony_ci 43054568cb3Sopenharmony_ci - subject 43154568cb3Sopenharmony_ci 43254568cb3Sopenharmony_ci subject用于简短描述 commit 目的,不超过50个字符。subject以动词开头,使用第一人称现在时,比如change,而不是changed或changes。subject的第一个字母小写,结尾不加英文句号(.)。 43354568cb3Sopenharmony_ci 43454568cb3Sopenharmony_ci- **Body格式** 43554568cb3Sopenharmony_ci 43654568cb3Sopenharmony_ci Body 部分是对本次 commit 的详细描述,可以分成多行,下面是一个范例。 43754568cb3Sopenharmony_ci 43854568cb3Sopenharmony_ci ``` 43954568cb3Sopenharmony_ci Add porting contest board projects to UniProton 44054568cb3Sopenharmony_ci Board list: 44154568cb3Sopenharmony_ci Arduino-M0-PRO 44254568cb3Sopenharmony_ci ATSAM4S-XPRO 44354568cb3Sopenharmony_ci ATSAMD21-XPRO 44454568cb3Sopenharmony_ci EFM32-SLSTK3400A 44554568cb3Sopenharmony_ci EFM32-SLSTK3401A 44654568cb3Sopenharmony_ci EFM32-STK3700 44754568cb3Sopenharmony_ci FRDM-KL26Z 44854568cb3Sopenharmony_ci FRDM-KW41Z 44954568cb3Sopenharmony_ci ``` 45054568cb3Sopenharmony_ci 45154568cb3Sopenharmony_ci 有两个注意点: 45254568cb3Sopenharmony_ci 45354568cb3Sopenharmony_ci - 使用第一人称现在时,比如使用change而不是changed或changes。 45454568cb3Sopenharmony_ci - 应该说明代码变动的动机,以及与以前行为的对比。 45554568cb3Sopenharmony_ci 45654568cb3Sopenharmony_ci- **Footer格式** 45754568cb3Sopenharmony_ci 45854568cb3Sopenharmony_ci Footer 部分只用于两种情况。 45954568cb3Sopenharmony_ci 46054568cb3Sopenharmony_ci - 不兼容变动 46154568cb3Sopenharmony_ci 46254568cb3Sopenharmony_ci 如果当前代码与上一个版本不兼容,则 Footer 部分以BREAKING CHANGE开头,后面是对变动的描述、以及变动理由和迁移方法。 46354568cb3Sopenharmony_ci 46454568cb3Sopenharmony_ci ``` 46554568cb3Sopenharmony_ci BREAKING CHANGE: isolate scope bindings definition has changed. 46654568cb3Sopenharmony_ci To migrate the code follow the example below: 46754568cb3Sopenharmony_ci Before: 46854568cb3Sopenharmony_ci scope: { 46954568cb3Sopenharmony_ci myAttr: 'attribute', 47054568cb3Sopenharmony_ci } 47154568cb3Sopenharmony_ci After: 47254568cb3Sopenharmony_ci scope: { 47354568cb3Sopenharmony_ci myAttr: '@', 47454568cb3Sopenharmony_ci } 47554568cb3Sopenharmony_ci The removed `inject` wasn't generaly useful for directives so there should be no code using it. 47654568cb3Sopenharmony_ci ``` 47754568cb3Sopenharmony_ci 47854568cb3Sopenharmony_ci - 关闭 Issue 47954568cb3Sopenharmony_ci 48054568cb3Sopenharmony_ci 如果当前 commit 针对某个issue,那么可以在 Footer 部分关闭这个 issue 。 48154568cb3Sopenharmony_ci 48254568cb3Sopenharmony_ci ``` 48354568cb3Sopenharmony_ci Closes #16, #24, #92 48454568cb3Sopenharmony_ci ``` 48554568cb3Sopenharmony_ci 48654568cb3Sopenharmony_ci### 更多参考 48754568cb3Sopenharmony_ci 48854568cb3Sopenharmony_ci更详细的commit规则请参考原始的规范说明:<a href="https://github.com/mychaser/docgather/blob/master/GitCommitMessageConventions.pdf" target="_blank">Angular规范</a>。 48954568cb3Sopenharmony_ci 49054568cb3Sopenharmony_ci 49154568cb3Sopenharmony_ci<h2 id="贡献流程">贡献流程</h2> 49254568cb3Sopenharmony_ci 49354568cb3Sopenharmony_ciUniProton的代码仓托管在gitee上,因此代码贡献者需要在gitee上注册账号才能贡献代码。注册账号可以参考<a href="https://gitee.com/help/articles/4113#article-header0" target="_blank">注册Gitee账号</a>。 49454568cb3Sopenharmony_ci 49554568cb3Sopenharmony_ci代码贡献可以分为**在线修改**和**本地提交**两种。 49654568cb3Sopenharmony_ci 49754568cb3Sopenharmony_ci### 方法一:在线修改 49854568cb3Sopenharmony_ci 49954568cb3Sopenharmony_ci在线修改适用于修改量较少的情况,方便快捷,点击页面“编辑”按钮,跳转到对应的编辑页面。 50054568cb3Sopenharmony_ci<!-- 50154568cb3Sopenharmony_ci 50254568cb3Sopenharmony_ci--> 50354568cb3Sopenharmony_ci**说明:** 图 50454568cb3Sopenharmony_ci编辑修改后,点击页面下方“提交”按钮,即提交修改到 UniProton 工程,静候工作人员审核即可。 50554568cb3Sopenharmony_ci<!-- 50654568cb3Sopenharmony_ci 50754568cb3Sopenharmony_ci--> 50854568cb3Sopenharmony_ci**说明:** 图 50954568cb3Sopenharmony_ci 51054568cb3Sopenharmony_ci### 方法二:本地提交 51154568cb3Sopenharmony_ci 51254568cb3Sopenharmony_ci本地提交适用于修改量较大的情况,主要说明如何参与UniProton开源代码贡献。进行UniProton的代码贡献可以遵循以下流程: 51354568cb3Sopenharmony_ci 51454568cb3Sopenharmony_ci1. 下载Git工具。 51554568cb3Sopenharmony_ci2. 配置SSH公钥。 51654568cb3Sopenharmony_ci3. 配置本地Git账户信息。 51754568cb3Sopenharmony_ci4. fork UniProton源代码。 51854568cb3Sopenharmony_ci5. 同步UniProton仓库代码到fork的仓库。 51954568cb3Sopenharmony_ci6. 提交本地修改到fork的仓库。 52054568cb3Sopenharmony_ci7. 提交Pull Request到UniProton官方主仓库。 52154568cb3Sopenharmony_ci8. 查看Pull Request的状态。 52254568cb3Sopenharmony_ci 52354568cb3Sopenharmony_ci#### **1 下载Git工具** 52454568cb3Sopenharmony_ci请至<a href="https://git-scm.com/download" target="_blank">git官网下载</a>,安装方法可以参考<a href="https://gitee.com/help/articles/4106#article-header0" target="_blank">Git的安装</a>。 52554568cb3Sopenharmony_ci 52654568cb3Sopenharmony_ci#### **2 配置SSH公钥** 52754568cb3Sopenharmony_ci1\) 先查看本地是否有公钥。如果存在公钥,则返回类似如下显示的一对文件,一般文件名为 id\_rsa 和 id\_rsa.pub,其中 .pub 后缀的文件是公钥,另一个文件是密钥。 52854568cb3Sopenharmony_ci 52954568cb3Sopenharmony_ci``` 53054568cb3Sopenharmony_ci$ ls ~/.ssh 53154568cb3Sopenharmony_ciid_rsa id_rsa.pub 53254568cb3Sopenharmony_ci``` 53354568cb3Sopenharmony_ci 53454568cb3Sopenharmony_ci如果系统内没有公钥文件,可以执行如下命令生成,公钥文件一般默认存放在 \~/.ssh路径下: 53554568cb3Sopenharmony_ci 53654568cb3Sopenharmony_ci``` 53754568cb3Sopenharmony_ci$ ssh-keygen -t rsa -C "your-email@youremail.com" //其中的邮箱为注册gitee账户时使用的邮箱 53854568cb3Sopenharmony_ci``` 53954568cb3Sopenharmony_ci 54054568cb3Sopenharmony_ci2\) 配置gitee账户的SSH公钥,参考<a href="https://gitee.com/help/articles/4191#article-header0" target="_blank">gitee上SSH公钥设置</a>。 54154568cb3Sopenharmony_ci 54254568cb3Sopenharmony_ci#### **3 配置本地Git账户信息** 54354568cb3Sopenharmony_ci账户信息即用户名和邮箱,注意此处的用户名和邮箱指的是注册gitee账户所使用的账户名和邮箱。配置以后,每次Git提交都会使用该信息: 54454568cb3Sopenharmony_ci 54554568cb3Sopenharmony_ci``` 54654568cb3Sopenharmony_ci$ git config --global user.name "your-username" 54754568cb3Sopenharmony_ci$ git config --global user.email "your-email@youremail.com" 54854568cb3Sopenharmony_ci``` 54954568cb3Sopenharmony_ci 55054568cb3Sopenharmony_ci如果本地pc上已经存储了账户信息,可以在“控制面板-\>用户帐户-\>凭据管理器”中确认保存的gitee账号密码是否正确,如果错误会导致无法提交修改到远程仓库。如果无法在本地pc上确认或修改为正确的账号信息,可以执行如下命令,不使用本地pc中保存的账号密码: 55154568cb3Sopenharmony_ci 55254568cb3Sopenharmony_ci``` 55354568cb3Sopenharmony_ci$ git config --global --unset credential.helper 55454568cb3Sopenharmony_ci``` 55554568cb3Sopenharmony_ci 55654568cb3Sopenharmony_ci查看git的所有配置信息,可以使用如下命令: 55754568cb3Sopenharmony_ci 55854568cb3Sopenharmony_ci``` 55954568cb3Sopenharmony_ci$ git config --list 56054568cb3Sopenharmony_ci``` 56154568cb3Sopenharmony_ci 56254568cb3Sopenharmony_ci#### **4 fork UniProton源代码** 56354568cb3Sopenharmony_ci1\) 使用个人gitee账号登陆gitee。 56454568cb3Sopenharmony_ci 56554568cb3Sopenharmony_ci2\) 进入UniProton官方主仓库(master分支):<a href="https://gitee.com/openeuler/UniProton" target="_blank">UniProton源码仓</a>。 56654568cb3Sopenharmony_ci 56754568cb3Sopenharmony_ci3\) 点击右上角fork按钮,将UniProton的代码fork到个人账号下,在弹出的窗口中选择要fork到的个人账号,点击确认后,稍等一会就会自动跳转到刚刚fork出来的个人账号下的UniProton仓库。 56854568cb3Sopenharmony_ci<!-- 56954568cb3Sopenharmony_ci 57054568cb3Sopenharmony_ci**说明:** 图 57154568cb3Sopenharmony_ci--> 57254568cb3Sopenharmony_ci 57354568cb3Sopenharmony_ci#### **5 同步UniProton仓库代码到fork的仓库** 57454568cb3Sopenharmony_ci开发代码前,首先需要确保当前个人账号下的UniProton代码和UniProton官方仓库是一致的。 因为从fork代码到现在,UniProton官方仓库可能已经更新了内容,所以开发代码前需要先同步UniProton仓库代码到fork的仓库。如果仓库刚刚fork,可以跳过此步。 57554568cb3Sopenharmony_ci<!-- 57654568cb3Sopenharmony_ci 57754568cb3Sopenharmony_ci**说明:** 图 57854568cb3Sopenharmony_ci--> 57954568cb3Sopenharmony_ci 58054568cb3Sopenharmony_ci点击上图中红框中的按钮从UniProton官方仓库拉取代码到个人账号fork的仓库,此时会弹出一个对话框以确定同步动作,如下图所示: 58154568cb3Sopenharmony_ci<!-- 58254568cb3Sopenharmony_ci 58354568cb3Sopenharmony_ci**说明:** 图 58454568cb3Sopenharmony_ci--> 58554568cb3Sopenharmony_ci 58654568cb3Sopenharmony_ci点击确定后,gitee就会开始同步代码,用户无需再做其他操作。 58754568cb3Sopenharmony_ci 58854568cb3Sopenharmony_ci#### **6 提交本地修改到fork的仓库** 58954568cb3Sopenharmony_ci1\) 开发的第一步,是clone代码到本地pc。 59054568cb3Sopenharmony_ci 59154568cb3Sopenharmony_ci``` 59254568cb3Sopenharmony_cigit clone https://gitee.com/gitee账户名/UniProton.git //个人账号fork的仓库地址,clone下来后仓库名默认为origin 59354568cb3Sopenharmony_ci``` 59454568cb3Sopenharmony_ci 59554568cb3Sopenharmony_ci基于UniProton的远程master分支,创建并切换到本地分支,例如本地分支名也是master: 59654568cb3Sopenharmony_ci 59754568cb3Sopenharmony_ci``` 59854568cb3Sopenharmony_cigit checkout -b master origin/master 59954568cb3Sopenharmony_ci``` 60054568cb3Sopenharmony_ci 60154568cb3Sopenharmony_ci2\) 在本地分支上进行开发。开发完成之后,git add 添加代码到本地仓库,并git commit 提交到本地仓库,具体commit信息的填写规范,请参考[Commit message规范](#Commitmessage规范)。 60254568cb3Sopenharmony_ci 60354568cb3Sopenharmony_ci3\) 执行git push origin master操作,将代码提交到gitee上自己个人账号的master分支。 60454568cb3Sopenharmony_ci 60554568cb3Sopenharmony_ci**说明:** 所有git命令相关操作,如果不熟悉,请自行上网查找。 60654568cb3Sopenharmony_ci 60754568cb3Sopenharmony_ci#### **7 提交Pull Request到UniProton官方主仓库** 60854568cb3Sopenharmony_ci 60954568cb3Sopenharmony_ci通过上述步骤,修改已经提交到个人远程仓库中,此时就可以向UniProton官方主仓库master分支提交Pull Request,该操作在gitee网页上进行。 61054568cb3Sopenharmony_ci 61154568cb3Sopenharmony_ci1\) 进入个人账号下fork的UniProton仓库首页,点击下图红框中的“+ Pull Request”。 61254568cb3Sopenharmony_ci<!-- 61354568cb3Sopenharmony_ci 61454568cb3Sopenharmony_ci**说明:** 图 61554568cb3Sopenharmony_ci--> 61654568cb3Sopenharmony_ci 61754568cb3Sopenharmony_ci2\) 之后gitee会跳转到创建Pull Request的详细页面,并给出对应的源分支和要修改的目标分支,目标分支为UniProton官方主仓库master分支,如下图。 61854568cb3Sopenharmony_ci<!-- 61954568cb3Sopenharmony_ci 62054568cb3Sopenharmony_ci**说明:** 图 62154568cb3Sopenharmony_ci--> 62254568cb3Sopenharmony_ci 62354568cb3Sopenharmony_ci如果代码没有冲突则会显示下图红框中“可自动合并”的提示,否则需要先解决冲突然后再重新创建Pull Request。在线解决代码冲突可以参考<a href="https://gitee.com/help/articles/4305" target="_blank">在线解决代码冲突</a>。 62454568cb3Sopenharmony_ci<!-- 62554568cb3Sopenharmony_ci 62654568cb3Sopenharmony_ci**说明:** 图 62754568cb3Sopenharmony_ci--> 62854568cb3Sopenharmony_ci 62954568cb3Sopenharmony_ci填入Pull Request的标题和说明,点击“创建”,就可以提交一个Pull Request。右边的审查人员、测试人员、里程碑、标签、优先级是可选项,不选择也不影响Pull Request的创建。 63054568cb3Sopenharmony_ci<!-- 63154568cb3Sopenharmony_ci> 63254568cb3Sopenharmony_ci**说明:** 图 63354568cb3Sopenharmony_ci--> 63454568cb3Sopenharmony_ci 63554568cb3Sopenharmony_ci**说明:** 63654568cb3Sopenharmony_ci>- 如果提交的代码是为了解决issue问题,记得将issue和此次代码提交相关联,关联方法请参考<a href="https://gitee.com/help/articles/4141" target="_blank">Commit关联Issue</a>和<a href="https://gitee.com/help/articles/4142" target="_blank">Pull Request关联Issue</a>。 63754568cb3Sopenharmony_ci>- 如果提交的Pull Request中有新增意见,需要在评论里回复,并@提意见的人说明已经解决。 63854568cb3Sopenharmony_ci 63954568cb3Sopenharmony_ci 64054568cb3Sopenharmony_ci#### **8 查看Pull Request的状态** 64154568cb3Sopenharmony_ci1\) 进入<a href="https://gitee.com/openeuler/UniProton" target="_blank">UniProton主仓库</a>首页。 64254568cb3Sopenharmony_ci 64354568cb3Sopenharmony_ci2\) 点击下图中的“Pull Requests”,可以看到当前UniProton主仓库上所有的Pull Request。 64454568cb3Sopenharmony_ci<!-- 64554568cb3Sopenharmony_ci 64654568cb3Sopenharmony_ci**说明:** 图 64754568cb3Sopenharmony_ci--> 64854568cb3Sopenharmony_ci 64954568cb3Sopenharmony_ci“开启的”表示这个Pull Request的代码还没有合入,“已合并”表示这个Pull Request的代码已经合入,“已关闭”表示这个Pull Request虽然已经关闭但是代码没有被合入。 65054568cb3Sopenharmony_ci 65154568cb3Sopenharmony_ci现在就静候UniProton主仓库管理员review代码吧,验证ok就会合入修改,恭喜您成为Contributor,感谢您为开源社区做出的贡献。 65254568cb3Sopenharmony_ci 65354568cb3Sopenharmony_ci 65454568cb3Sopenharmony_ci<h2 id="协议">协议</h2> 65554568cb3Sopenharmony_ci 65654568cb3Sopenharmony_ci### 知识共享许可协议 65754568cb3Sopenharmony_ci 65854568cb3Sopenharmony_ci**您可以自由地:** 65954568cb3Sopenharmony_ci 66054568cb3Sopenharmony_ci**分享** — 在任何媒介以任何形式复制、发行本文档。 66154568cb3Sopenharmony_ci 66254568cb3Sopenharmony_ci**演绎** — 修改、转换或以本文档为基础进行创作。 66354568cb3Sopenharmony_ci 66454568cb3Sopenharmony_ci只要你遵守许可协议条款,许可人就无法收回你的这些权利。 66554568cb3Sopenharmony_ci 66654568cb3Sopenharmony_ci**惟须遵守下列条件:** 66754568cb3Sopenharmony_ci 66854568cb3Sopenharmony_ci**署名** — 您必须提供适当的证书,提供一个链接到许可证,并指示是否作出更改。您可以以任何合理的方式这样做,但不是以任何方式表明,许可方赞同您或您的使用。 66954568cb3Sopenharmony_ci 67054568cb3Sopenharmony_ci**非商业性使用** — 您不得将本文档用于商业目的。 67154568cb3Sopenharmony_ci 67254568cb3Sopenharmony_ci**相同方式共享** — 如果您的修改、转换,或以本文档为基础进行创作,仅得依本素材的授权条款来散布您的贡献作品。 67354568cb3Sopenharmony_ci 67454568cb3Sopenharmony_ci**没有附加限制** — 您不能增设法律条款或科技措施,来限制别人依授权条款本已许可的作为。 67554568cb3Sopenharmony_ci 67654568cb3Sopenharmony_ci**声明:** 67754568cb3Sopenharmony_ci 67854568cb3Sopenharmony_ci当您使用本素材中属于公众领域的元素,或当法律有例外或限制条款允许您的使用,则您不需要遵守本授权条款。 67954568cb3Sopenharmony_ci 68054568cb3Sopenharmony_ci未提供保证。本授权条款未必能完全提供您预期用途所需要的所有许可。例如:形象权、隐私权、著作人格权等其他权利,可能限制您如何使用本素材。 68154568cb3Sopenharmony_ci<!-- 68254568cb3Sopenharmony_ci> 68354568cb3Sopenharmony_ci说明:图 68454568cb3Sopenharmony_ci--> 68554568cb3Sopenharmony_ci**须知:** 68654568cb3Sopenharmony_ci>为了方便用户理解,这是协议的概述。您可以访问网址http://license.coscl.org.cn/MulanPSL2 了解完整协议内容。 68754568cb3Sopenharmony_ci 68854568cb3Sopenharmony_ci### 知识产权政策 68954568cb3Sopenharmony_ci 69054568cb3Sopenharmony_ci1. 定义 69154568cb3Sopenharmony_ci 69254568cb3Sopenharmony_ci **1.1 关联公司:** 是指就一个实体而言,该实体直接或间接控制的另一实体,或者,直接或间接控制该实体的另一实体,或者与该实体被某一实体共同控制的其他实体;这里的“控制”是指直接或间接拥有一个实体中多于50%份额的投票权或表决权或者以任何其他方式直接或间接控制该实体50%以上的具有该实体决策权的所有者权益。 69354568cb3Sopenharmony_ci 69454568cb3Sopenharmony_ci **1.2 遵从软件:** 是指由华为技术有限公司(后称“华为”)正式发布且未经过修改的UniProton,或者虽经修改,但能通过认证测试的UniProton。 69554568cb3Sopenharmony_ci 69654568cb3Sopenharmony_ci **1.3 认证测试:** 是指为了确保UniProton与其一起使用的软件或硬件的兼容性和接口一致性而由华为开发的测试。认证测试套件及相关要求和指导将在UniProton官网公布。 69754568cb3Sopenharmony_ci 69854568cb3Sopenharmony_ci **1.4 贡献:** 是指由任何人提交给UniProton将其纳入或建议纳入UniProton中的任何信息或资料,包括软件源代码,文档或相关材料。 69954568cb3Sopenharmony_ci 70054568cb3Sopenharmony_ci **1.5 贡献者:** 是指提交贡献给UniProton的人。 70154568cb3Sopenharmony_ci 70254568cb3Sopenharmony_ci **1.6 您:** 是指任何个人,公司,合作企业,共同控股公司,有限合伙,协会,有限责任公司或企业或实体。 70354568cb3Sopenharmony_ci 70454568cb3Sopenharmony_ci **1.7 UniProton:** 是指由华为主导开发、管理、并由华为在openEuler官网上发布的可用于芯片,嵌入式领域的轻量开源操作系统项目。华为可能会对该软件不断进行更新。 70554568cb3Sopenharmony_ci 70654568cb3Sopenharmony_ci **1.8 承诺的专利权利要求:** 是指专利或专利申请的一个或多个权利要求,且满足如下条件:(i)由贡献者或其关联公司现在或将来拥有控制的,或其他有权许可且无需向无关联的第三方支付费用的,且(ii)会因接受者制造,使用,许诺销售,销售,进口或以其他方式转移贡献者提交给UniProton的贡献单独或将该贡献与前述UniProton的结合所必然且直接侵犯。 70754568cb3Sopenharmony_ci 70854568cb3Sopenharmony_ci **1.9 政策:** 是指本UniProton知识产权政策。 70954568cb3Sopenharmony_ci 71054568cb3Sopenharmony_ci **1.10 接收者:** 是指接受本政策并享有本政策下许可的个人或法律实体。 71154568cb3Sopenharmony_ci 71254568cb3Sopenharmony_ci **1.11 承诺者:** 是指贡献者及其关联公司。 71354568cb3Sopenharmony_ci 71454568cb3Sopenharmony_ci2. 许可 71554568cb3Sopenharmony_ci 71654568cb3Sopenharmony_ci UniProton的代码将以MulanPSL2 License,除非华为另选其他许可证 (“可适用的许可证”)。接收者可以访问 [http://license.coscl.org.cn/MulanPSL2](http://license.coscl.org.cn/MulanPSL2)查看该许可证的详细内容。 71754568cb3Sopenharmony_ci 71854568cb3Sopenharmony_ci3. 专利不诉承诺 71954568cb3Sopenharmony_ci 72054568cb3Sopenharmony_ci 3.1 在接收者遵守本政策的前提下,每个承诺者许诺不对任何接收者就其制造,使用,许诺销售,销售,进口或以其他方式转移遵从软件的行为发起指控,诉讼或其他法律程序指控其侵犯该承诺者的承诺专利权利主张。前述承诺不适用于因以下原因引起的侵犯承诺专利权利主张的指控:i. 由其他方提交的贡献;ii 承诺者贡献代码后其他人对该贡献的修改;iii 该贡献与硬件的结合或者与不属于贡献所针对的UniProton的其他代码的结合;或者 iv 不属于遵从软件的软件。前述承诺也不适用于集成在个人便携产品(如手机,便携电脑,可穿戴设备等)中的遵从软件。 72154568cb3Sopenharmony_ci 72254568cb3Sopenharmony_ci 3.2 这是每个承诺者对接收者的个人承诺。 72354568cb3Sopenharmony_ci 72454568cb3Sopenharmony_ci 3.3 每个承诺者理解并同意专利不诉承诺是具有法律约束力且不可撤回的(根据第4条撤回的除外),而且对该承诺者、其继受者、受让方以及有权对第三方实施该承诺专利主张的任何独占被许可人都是有约束力的。 72554568cb3Sopenharmony_ci 72654568cb3Sopenharmony_ci4. 终止许可及专利不诉承诺的权利 72754568cb3Sopenharmony_ci 72854568cb3Sopenharmony_ci 在满足可适用许可证规定的前提下,如果贡献者或其关联公司向其他基于第3条享有专利不诉承诺权益且未根据本条终止的接收者发起指控,诉讼或其他法律程序,指控其制造,使用,许诺销售,销售,进口或者以其他形式转移遵从软件构成对其专利直接侵权或帮助侵权的,那么该接收者及其关联公司本政策下所有的许可以及专利不诉承诺将立即终止。 72954568cb3Sopenharmony_ci 73054568cb3Sopenharmony_ci5. 无其他权利 73154568cb3Sopenharmony_ci 73254568cb3Sopenharmony_ci 5.1 本政策并不授予接收者使用华为的贸易名称,商标,服务标记或产品名称的许可。 73354568cb3Sopenharmony_ci 73454568cb3Sopenharmony_ci 5.2 除本政策和可使用许可证明确约定外,没有其他明示或默示的专利,商标,版权或其他知识产权的许可授予接收者,不论是通过默示,放弃,禁止反言或其他形式。 73554568cb3Sopenharmony_ci 73654568cb3Sopenharmony_ci6. 无担保 73754568cb3Sopenharmony_ci 73854568cb3Sopenharmony_ci 除非适用法强制规定或者双方有明确书面约定, UniProton, 遵从软件以及任何贡献均如是提供,无任何形式的担保,不论是明示还是默示,包括但不限于不侵权,适销性或满足特定目的的担保。 73954568cb3Sopenharmony_ci 74054568cb3Sopenharmony_ci7. 责任限制 74154568cb3Sopenharmony_ci 74254568cb3Sopenharmony_ci 除非适用法强制规定,在任何情况下,不论是基于侵权,合同或其他,华为及其关联公司或任何贡献者均不对其他贡献者,接收者或第三方因本政策或因使用或未能使用华为发布的UniProton或者对UniProton的任何贡献导致的损失,包括任何直接的,间接的,特别的,偶然的损失或者数据丢失等,即使该方已经被建议该种可能的损失。 74354568cb3Sopenharmony_ci 74454568cb3Sopenharmony_ci8. 可分离性 74554568cb3Sopenharmony_ci 74654568cb3Sopenharmony_ci 如果本政策内的任何条款被认定为无效,不可实施或者与适用法冲突,本政策中的其他条款继续有效。 74754568cb3Sopenharmony_ci 74854568cb3Sopenharmony_ci9. 修改 74954568cb3Sopenharmony_ci 75054568cb3Sopenharmony_ci 华为有权自行决定修改本政策。该修改后的政策从其在UniProton官网上公布之日起生效,并仅适用于同时或此后发布的UniProton软件版本。 75154568cb3Sopenharmony_ci 75254568cb3Sopenharmony_ci10. 适用法和争议解决 75354568cb3Sopenharmony_ci 75454568cb3Sopenharmony_ci 本政策适用中华人民共和国法律。任何因本政策引起或与本政策相关的纠纷应提交到北京中国国际经济贸易仲裁委员会。该仲裁裁决是终局的并对仲裁双方具有法律约束力。 75554568cb3Sopenharmony_ci 75654568cb3Sopenharmony_ci 75754568cb3Sopenharmony_ci<h2 id="联系我们">联系我们</h2> 75854568cb3Sopenharmony_ci 75954568cb3Sopenharmony_ci* 技术支持 76054568cb3Sopenharmony_ci 76154568cb3Sopenharmony_ci 欢迎<a href="https://gitee.com/openeuler/UniProton/issues" target="_blank">提交issue</a>对关心的问题发起讨论,欢迎到<a href="https://bbs.huaweicloud.com/" target="_blank">UniProton论坛</a>交流。 76254568cb3Sopenharmony_ci 您也可以发送问题至邮箱UniProtonSupport@huawei.com。 76354568cb3Sopenharmony_ci 76454568cb3Sopenharmony_ci* 参与贡献 76554568cb3Sopenharmony_ci 76654568cb3Sopenharmony_ci 如您有兴趣参与开源贡献,欢迎提交PR参与特性建设,可至<a href="https://gitee.com/openeuler/UniProton " target="_blank">UniProton gitee源码仓</a>下载开源代码。 76754568cb3Sopenharmony_ci 76854568cb3Sopenharmony_ci* 技术合作 76954568cb3Sopenharmony_ci 77054568cb3Sopenharmony_ci 如您有合作意向,希望加入UniProton生态合作伙伴,请发邮件至UniProtonSupport@huawei.com,或访问<a href="https://www.openeuler.org/zh/" target="_blank">openEuler官网</a>,进一步了解详细信息。 771