• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# UniProton 代码&文档贡献指南
2-   [编程规范](#编程规范)
3    - [总体原则](#总体原则)
4    - [目录结构](#目录结构)
5    - [命名](#命名)
6    - [排版与格式](#排版与格式)
7    - [注释](#注释)
8    - [宏](#宏)
9    - [头文件](#头文件)
10    - [数据类型](#数据类型)
11    - [变量](#变量)
12    - [函数](#函数)
13    - [可移植性](#可移植性)
14    - [业界编程规范](#业界编程规范)
15-   [文档写作规范](#文档写作规范)
16-   [Commit message规范](#Commitmessage规范)
17-   [贡献流程](#贡献流程)
18-   [协议](#协议)
19-   [加入我们](#加入我们)
20
21<h2 id="编程规范">编程规范</h2>
22此编程规范在业界通用的编程规范基础上进行了整理,供开发者参考使用。
23
24### 总体原则
25-   清晰,易于维护、易于重构。
26-   简洁,易于理解,并且易于实现。
27-   风格统一,代码整体风格保持统一。
28-   通用性,遵循业界通用的编程规范。
29
30### 目录结构
31建议将工程按照功能模块划分子目录(可参考UniProton的功能模块划分),子目录再定义头文件和源文件目录。
32
33### 命名
34- 使用驼峰风格进行命名,此风格大小写字母混用,不同单词间通过单词首字母大写来分开,具体规则如下:
35    |           类型              |         命名风格                 |         形式              |
36    | --------------------------- | -------------------------------- | ------------------------- |
37    | 函数,自定义的类型          |  大驼峰,或带有模块前缀的大驼峰  | AaaBbb, XXX_AaaBbb        |
38    | 局部变量,函数参数,宏参数,结构体成员,联合体成员  |  小驼峰  | aaaBbb                    |
39    | 全局变量                    |  带'g_'前缀的小驼峰              | g_aaaBbb                  |
40    | 宏,枚举值                  |  全大写并下划线分割              | AAA_BBB                   |
41    | 内核头文件中防止重复包含的宏变量  |  带'PRT'前缀和'H'后缀,中间为大写模块名,以下划线分割 | PRT_MODULE_H  |
42- 全局函数、全局变量、宏、类型名、枚举名的命名,应当准确描述并全局唯一。
43- 在能够准确表达含义的前提下,局部变量,或结构体、联合体的成员变量,其命名应尽可能简短。
44- UniProton的对外API使用PRT_\<Module\>\<Func\>的方式,如果有动词和宾语,则采用PRT_\<Module\>\<Verb\>\<Object\>,比如:
45    ```
46    PRT_TaskCreate
47    PRT_SemPend
48    PRT_TickGetCount
49    PRT_TaskGetStatus
50    ```
51   kernel目录下内部模块间接口使用Os\<Module\>\<Func\>的方式,比如:
52    ```
53    OsTaskScan
54    OsSwTmrCtrlInit
55    ```
56
57### 排版与格式
58-   程序块采用缩进风格编写,使用空格而不是制表符('\t')进行缩进,每级缩进为4个空格。
59-   采用K&R风格作为大括号换行风格,即函数左大括号另起一行放行首,并独占一行,其他左大括号跟随语句放行末,
60    右大括号独占一行,除非后面跟着同一语句的剩余部分,如if语句的else/else if或者分号,比如:
61    ```c
62    struct MyType {   // 左大括号跟随语句放行末,前置1个空格
63        ...
64    };                // 右大括号后面紧跟分号
65    ```
66    ```c
67    int Foo(int a)
68    {                 // 函数左大括号独占一行,放行首
69        if (a > 0) {  // 左大括号跟随语句放行末,前置1个空格
70            ...
71        } else {      // 右大括号、"else"、以及后续的左大括号均在同一行
72            ...
73        }             // 右大括号独占一行
74        ...
75    }
76    ```
77-   条件、循环语句使用大括号,比如:
78    ```c
79    if (objectIsNotExist) { // 单行条件语句也加大括号
80        return CreateNewObject();
81    }
82    ```
83    ```c
84    while (condition) {} // 即使循环体是空,也应使用大括号
85    ```
86    ```c
87    while (condition) {
88        continue;        // continue表示空逻辑,使用大括号
89    }
90    ```
91-   case/default语句相对switch缩进一层,缩进风格如下:
92    ```c
93    switch (var) {
94        case 0:             // 缩进一层
95            DoSomething1(); // 缩进一层
96            break;
97        case 1:
98            DoSomething2();
99            break;
100        default:
101            break;
102    }
103    ```
104-   一行只写一条语句。
105-   一条语句不能过长,建议不超过120个字符,如不能缩短语句则需要分行写。
106-   换行时将操作符留在行末,新行进行同类对齐或缩进一层,比如:
107    ```c
108    // 假设下面第一行不满足行宽要求
109    if (currentValue > MIN && // 换行后,布尔操作符放在行末
110        currentValue < MAX) { // 与(&&)操作符的两个操作数同类对齐
111        DoSomething();
112        ...
113    }
114    ```
115    ```c
116    // 假设下面的函数调用不满足行宽要求,需要换行
117    ReturnType result = FunctionName(paramName1,
118                                     paramName2,
119                                     paramName3); // 保持与上方参数对齐
120    ```
121    ```c
122    ReturnType result = VeryVeryVeryLongFunctionName( // 写入第1个参数后导致过长,直接换行
123        paramName1, paramName2, paramName3);          // 换行后,4空格缩进一层
124    ```
125    ```c
126    // 每行的参数代表一组相关性较强的数据结构,放在一行便于理解,此时可理解性优先于格式排版要求
127    int result = DealWithStructLikeParams(left.x, left.y,    // 表示一组相关参数
128                                          right.x, right.y); // 表示另外一组相关参数
129    ```
130-   声明定义函数时,函数的返回类型以及其他修饰符,与函数名同行。
131-   指针类型"*"应该靠右跟随变量或者函数名,比如:
132    ```c
133    int *p1;  // Good:右跟随变量,和左边的类型隔了1个空格
134    int* p2;  // Bad:左跟随类型
135    int*p3;   // Bad:两边都没空格
136    int * p4; // Bad:两边都有空格
137    ```
138    当"*"与变量或函数名之间有其他修饰符,无法跟随时,此时也不要跟随修饰符,比如:
139    ```c
140    char * const VERSION = "V100";    // Good:当有const修饰符时,"*"两边都有空格
141    int Foo(const char * restrict p); // Good:当有restrict修饰符时,"*"两边都有空格
142    ```
143-   根据上下内容的相关程度,合理安排空行,但不要使用连续3个或更多空行。
144-   编译预处理的"#"统一放在行首,无需缩进。嵌套编译预处理语句时,"#"可以进行缩进,比如:
145    ```c
146    #if defined(__x86_64__) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16) // 位于行首,不缩进
147        #define ATOMIC_X86_HAS_CMPXCHG16B 1                                 // 缩进一层,区分层次,便于阅读
148    #else
149        #define ATOMIC_X86_HAS_CMPXCHG16B 0
150    #endif
151    ```
152
153### 注释
154-   注释的内容要清楚、明了,含义准确,防止注释二义性。
155-   在代码的功能、意图层次上进行注释,即注释解释代码难以直接表达的意图,而不是仅仅重复描述代码。
156-   函数声明处注释描述函数功能、性能及用法,包括输入和输出参数、函数返回值、可重入的要求等;定义处详细描述函数功能和实现要点,如实现的简要步骤、实现的理由、设计约束等。
157-   全局变量要有较详细的注释,包括对其功能、取值范围以及存取时注意事项等的说明。
158-   避免在注释中使用缩写,除非是业界通用或子系统内标准化的缩写。
159-   文件头部要进行注释,建议注释列出:版权说明、版本号、生成日期、作者姓名、功能说明、与其它文件的关系、修改日志等。
160-   注释风格要统一,建议优先选择/* */的方式,注释符与注释内容之间要有1空格,单行、多行注释风格如下:
161    ```c
162    /* 单行注释 */
163    ```
164    ```c
165    /*
166     * 多行注释
167     * 第二行
168     */
169    ```
170-   注释应放在其代码上方或右方。
171
172    上方的注释,与代码行之间无空行,保持与代码一样的缩进。
173    右边的注释,与代码之间至少相隔1个空格。如果有多条右置注释,上下对齐会更加美观,比如:
174    ```c
175    #define A_CONST 100         // 此处两行注释属于同类
176    #define ANOTHER_CONST 200   // 可保持左侧对齐
177    ```
178
179### 宏
180-   代码片段使用宏隔离时,统一通过#ifdef的方式,例如:
181    ```c
182    #ifdef PRTCFG_XXX
183    ...
184    #endif
185    ```
186-   定义宏时,要使用完备的括号,比如:
187    ```c
188    #define SUM(a, b) a + b       // 不符合本条要求
189    #define SUM(a, b) ((a) + (b)) // 符合本条要求
190    ```
191    但是也要避免滥用括号,比如单独的数字或标识符加括号毫无意义:
192    ```c
193    #define SOME_CONST  100         // 单独的数字无需括号
194    #define ANOTHER_CONST   (-1)    // 负数需要使用括号
195    #define THE_CONST   SOME_CONST  // 单独的标识符无需括号
196    ```
197-   包含多条语句的函数式宏的实现语句必须放在do-while(0)中,例如:
198    ```c
199    #define FOO(x) do { \
200        (void)printf("arg is %d\n", (x)); \
201        DoSomething((x)); \
202    } while (0)
203    ```
204-   禁止宏调用参数中出现预编译指令。
205-   宏定义不以分号结尾。
206
207### 头文件
208-   设计原则
209    -   头文件应当职责单一。
210    -   一个模块通常包含多个.c文件,建议放在同一个目录下,目录名即为模块名;如果一个模块包含多个子模块,则建议每一个子模块提供一个对外的.h,文件名为子模块名。
211    -   建议每一个.c文件应有一个同名.h文件,用于声明需要对外公开的接口。
212    -   头文件中适合放置接口的声明,不适合放置实现。
213    -   不要在头文件中定义变量。
214    -   禁止头文件循环依赖,循环依赖指a.h包含b.hb.h包含c.hc.h包含a.h215    -   头文件应当自包含,即任意一个头文件均可独立编译,但同时也要避免包含用不到的头文件。
216    -   头文件必须用#define保护,防止重复包含,比如内核中统一使用以下宏定义保护:
217        ```c
218        #ifndef PRT_<MODULE>_H  // 比如 PRT_TASK_H
219        #define PRT_<MODULE>_H
220        ...
221        #endif
222        ```
223    -   禁止通过声明的方式引用外部函数接口、变量,只能通过包含头文件的方式使用其他模块或文件提供的接口。
224    -   禁止在 extern "C" 中包含头文件。
225    -   按照合理的顺序包含头文件:
226        1) 源文件对应的头文件
227        2) C标准库
228        3) 需要包含的OS其他头文件
229-   版权声明
230    -   头文件版权声明一致,放在头文件置顶位置。
231    -   如果提交的代码是在开源软件基础上修改所编写或衍生的代码,请遵循开源许可协议要求,并且已履行被修改软件的许可证义务。
232
233### 数据类型
234基础类型定义统一使用prt_typedef.h中定义的类型,比如定义无符号32位整型变量使用U32。
235
236### 变量
237-   一个变量只有一个功能,不要把一个变量用作多种用途。
238-   防止局部变量与全局变量同名。
239-   不用或者少用全局变量。
240-   定义函数的局部变量时,控制变量的占用空间,避免因占用过多栈空间导致程序运行失败。比如需要一个大数组,可以通过动态分配内存的方式来避免栈空间占用过大。
241-   在首次使用前初始化变量。
242-   指向资源句柄或描述符的变量,在资源释放后立即赋予新值,包括指针、文件描述符以及其它指向资源的变量。
243-   禁止将局部变量的地址返回到其作用域以外,下面是一个**错误示例:**
244    ```c
245    int *Func(void)
246    {
247        int localVar = 0;
248        ...
249        return &localVar;  // 错误
250    }
251
252    void Caller(void)
253    {
254        int *p = Func();
255        ...
256        int x = *p;       // 程序产生未定义行为
257    }
258    ```
259    **正确代码示例:**
260    ```c
261    int Func(void)
262    {
263        int localVar = 0;
264        ...
265        return localVar;
266    }
267
268    void Caller(void)
269    {
270        int x = Func();
271        ...
272    }
273    ```
274-   如果要使用其他模块的变量,应尽量避免直接对变量进行访问,而是通过统一的函数封装或者宏封装的方式,比如mutex模块中:
275    ```c
276    // 私有头文件中引入全局变量,但要避免直接使用
277    extern struct TagQueCb *g_allQueue;
278    // 通过GET_QUEUE_HANDLE的方式对g_allQueue进行访问
279    #define GET_QUEUE_HANDLE(queueId) (((struct TagQueCb *)g_allQueue) + (queueId))
280    ```
281
282### 函数
283-   重复代码应该尽可能提炼成函数。
284-   避免函数过长,新增函数不超过 40-50 行。
285-   内联函数要尽可能短,避免超过 10 行(非空非注释)。
286-   避免函数的代码块嵌套过深。
287-   函数应避免使用全局变量、静态局部变量和I/O操作,不可避免的地方应集中使用。
288
289### 可移植性
290不使用与硬件或操作系统关系很大的语句,而使用建议的标准语句,以提高软件的可移植性和可重用性。
291
292### 业界编程规范
293C语言编程规范参考资料较多,大家可以自行了解,本文不再过多赘述。
294
295
296<h2 id="文档写作规范">文档写作规范</h2>
297
298UniProton欢迎开发者参与到开源社区的贡献中来,本文主要介绍参与UniProton文档贡献的写作规范,如果贡献者提交文档的修改或提交新的文档,请参照此规范。
299
300### 命名规范
301
302如需提交新的文档,在<a href="https://gitee.com/openeuler/UniProton" target="_blank">UniProton代码仓</a>doc目录下创建新的.md文件,命名需遵循 xxx\_xxx.md 格式,根据文档的内容来声明。
303
304比如介绍写作规范的文档,可以命名为 UniProton\_doc\_write\_standard.md305
306### 内容规范
307
308以简洁、直观地表达所述内容为目的,介绍性文档言简意赅介绍原理、架构、设计思路等,操作类文档写明关键步骤,以便能对其他开发者起到帮助。可以优先使用中文,建议中英文都支持,UniProton也将持续更新,保证中英文的同步。
309
3101.  **标题**
311
312    建议标题层级不超过三级。
313
3142.  **正文**
315    -   操作类文档以移植为例,文档结构可以参考如下:
316        1.  目的(简述操作目的,如移植到哪款型号的单板)
317        2.  软硬件环境准备
318        3.  移植具体步骤
319        4.  结果验证
320
321    -   介绍性文档以开发指南某一功能为例,文档结构可以参考如下:
322        1.  概述(概念及原理介绍)
323        2.  功能(支持的接口列表)
324        3.  开发流程(如何使用及相应步骤)
325        4.  编程实例(提供具体代码示例)
326        5.  注意事项
327        6.  其他
328
3293.  **图片**
330
331    图片统一存放到文档同级目录下的images文件夹中(英文文档对应images-en),如 UniProton/doc/getting\_started.md 中使用的图片,统一放置到  UniProton/doc/images 目录下,文档中使用相对路径引用图片。图片建议根据内容命名,只用数字序列不利于后续图片的继承。
332    <!--
333    >![](public_sys-resources/icon-note.gif) **说明:**
334    >引用方式:
335    >!\[\]\(./images/images-standard.png\)
336    -->
337    **说明:**  图
338    如果是自制图片,配色请参考如下,格式不限,png/jpg/gif...均可,如果是截图或者其他地方引用图片,风格不做限制。
339    <!--
340    ![](images/contribute/picture_color_in_document_writing.png)
341    -->
342    **说明:**  图
3434.  **表格**
344
345    在md文件中可以按照如下形式插入表格。
346
347    ```
348    | Tables      | Type          | Note  |
349    | ----------- |:-------------:| -----:|
350    | first       | standard      |  None |
351    | second      | outstanding   |     5 |
352    | third       | inside        |  with |
353    ```
354
3555.  **代码**
356
357    正文中插入代码段,可以在段落前后加上符号 \`\`\`。
358    <blockquote>
359    ```c
360
361    int size = 10;
362
363    \```
364    </blockquote>
365
366
367<h2 id="Commitmessage规范">Commit message规范</h2>
368
369### 概要说明
370
371目前,社区有多种 Commit message 的写法规范。UniProton采用的是Angular规范,这是目前使用最广的写法,比较合理和系统化,并且有配套的工具。
372
373### Commit message的作用
374
375格式化的Commit message有几个好处:
376
377- 提供更多的历史信息,方便快速浏览
378- 可以过滤某些commit(比如文档改动),便于快速查找信息
379- 可以直接从commit生成Change log
380
381### UniProton Commit message的格式
382
383每次提交,Commit message 都包括三个部分:Header,Body 和 Footer。
384```
385<header>
386空一行
387<body>
388空一行
389<footer>
390```
391
392比如:
393
394```
395fix(stm32f411): fix stm32f411 migration guide file error
396
397fix some error in stm32f411re migration guide file.
398
399Close #75
400```
401
402-   **Header格式**
403
404    Header部分只有一行,格式为:
405
406    ```
407    <type>(<scope>): <subject>
408    ```
409
410    Header部分共包括三个字段:type(必需)、scope(可选)和subject(必需)。
411
412    -   type
413
414        type用于说明 commit 的类别,只允许使用下面7个标识。
415
416        ```
417        feat:feature的缩写,表示这是一个新功能
418        fix:修补bug
419        docs:documentation的缩写,表示修改的是文档
420        style: 格式修改,是不影响代码运行的变动
421        refactor:重构,它即不是新增功能,也不是修改bug
422        test:增加测试
423        chore:构建过程或辅助工具的变动
424        ```
425
426    -   scope
427
428        scope用于说明 commit 影响的范围,比如对UniProton Kernel的base的修改会影响全部代码,所以填写all。如果只修改STM32F411的代码,则填写STM32F411。
429
430    -   subject
431
432        subject用于简短描述 commit 目的,不超过50个字符。subject以动词开头,使用第一人称现在时,比如change,而不是changed或changes。subject的第一个字母小写,结尾不加英文句号(.)。
433
434-   **Body格式**
435
436    Body 部分是对本次 commit 的详细描述,可以分成多行,下面是一个范例。
437
438    ```
439    Add porting contest board projects to UniProton
440    Board list:
441    Arduino-M0-PRO
442    ATSAM4S-XPRO
443    ATSAMD21-XPRO
444    EFM32-SLSTK3400A
445    EFM32-SLSTK3401A
446    EFM32-STK3700
447    FRDM-KL26Z
448    FRDM-KW41Z
449    ```
450
451    有两个注意点:
452
453    -   使用第一人称现在时,比如使用change而不是changed或changes。
454    -   应该说明代码变动的动机,以及与以前行为的对比。
455
456-   **Footer格式**
457
458    Footer 部分只用于两种情况。
459
460    -   不兼容变动
461
462        如果当前代码与上一个版本不兼容,则 Footer 部分以BREAKING CHANGE开头,后面是对变动的描述、以及变动理由和迁移方法。
463
464        ```
465        BREAKING CHANGE: isolate scope bindings definition has changed.
466        To migrate the code follow the example below:
467        Before:
468        scope: {
469            myAttr: 'attribute',
470        }
471        After:
472        scope: {
473            myAttr: '@',
474        }
475        The removed `inject` wasn't generaly useful for directives so there should be no code using it.
476        ```
477
478    -   关闭 Issue
479
480        如果当前 commit 针对某个issue,那么可以在 Footer 部分关闭这个 issue 。
481
482        ```
483        Closes #16, #24, #92
484        ```
485
486### 更多参考
487
488更详细的commit规则请参考原始的规范说明:<a href="https://github.com/mychaser/docgather/blob/master/GitCommitMessageConventions.pdf" target="_blank">Angular规范</a>。
489
490
491<h2 id="贡献流程">贡献流程</h2>
492
493UniProton的代码仓托管在gitee上,因此代码贡献者需要在gitee上注册账号才能贡献代码。注册账号可以参考<a href="https://gitee.com/help/articles/4113#article-header0" target="_blank">注册Gitee账号</a>。
494
495代码贡献可以分为**在线修改**和**本地提交**两种。
496
497### 方法一:在线修改
498
499在线修改适用于修改量较少的情况,方便快捷,点击页面“编辑”按钮,跳转到对应的编辑页面。
500<!--
501![](./images/contribute/gitee_online_edit.png)
502-->
503**说明:**  图
504编辑修改后,点击页面下方“提交”按钮,即提交修改到 UniProton 工程,静候工作人员审核即可。
505<!--
506![](./images/contribute/gitee_online_submit.png)
507-->
508**说明:**  图
509
510### 方法二:本地提交
511
512本地提交适用于修改量较大的情况,主要说明如何参与UniProton开源代码贡献。进行UniProton的代码贡献可以遵循以下流程:
513
5141.  下载Git工具。
5152.  配置SSH公钥。
5163.  配置本地Git账户信息。
5174.  fork UniProton源代码。
5185.  同步UniProton仓库代码到fork的仓库。
5196.  提交本地修改到fork的仓库。
5207.  提交Pull Request到UniProton官方主仓库。
5218.  查看Pull Request的状态。
522
523#### **1 下载Git工具**
524请至<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>。
525
526#### **2 配置SSH公钥**
5271\) 先查看本地是否有公钥。如果存在公钥,则返回类似如下显示的一对文件,一般文件名为 id\_rsa 和 id\_rsa.pub,其中 .pub 后缀的文件是公钥,另一个文件是密钥。
528
529```
530$ ls ~/.ssh
531id_rsa id_rsa.pub
532```
533
534如果系统内没有公钥文件,可以执行如下命令生成,公钥文件一般默认存放在 \~/.ssh路径下:
535
536```
537$ ssh-keygen -t rsa -C "your-email@youremail.com"  //其中的邮箱为注册gitee账户时使用的邮箱
538```
539
5402\) 配置gitee账户的SSH公钥,参考<a href="https://gitee.com/help/articles/4191#article-header0" target="_blank">gitee上SSH公钥设置</a>。
541
542#### **3 配置本地Git账户信息**
543账户信息即用户名和邮箱,注意此处的用户名和邮箱指的是注册gitee账户所使用的账户名和邮箱。配置以后,每次Git提交都会使用该信息:
544
545```
546$ git config --global user.name "your-username"
547$ git config --global user.email "your-email@youremail.com"
548```
549
550如果本地pc上已经存储了账户信息,可以在“控制面板-\>用户帐户-\>凭据管理器”中确认保存的gitee账号密码是否正确,如果错误会导致无法提交修改到远程仓库。如果无法在本地pc上确认或修改为正确的账号信息,可以执行如下命令,不使用本地pc中保存的账号密码:
551
552```
553$ git config --global --unset credential.helper
554```
555
556查看git的所有配置信息,可以使用如下命令:
557
558```
559$ git config --list
560```
561
562#### **4 fork UniProton源代码**
5631\) 使用个人gitee账号登陆gitee。
564
5652\) 进入UniProton官方主仓库(master分支):<a href="https://gitee.com/openeuler/UniProton" target="_blank">UniProton源码仓</a>。
566
5673\) 点击右上角fork按钮,将UniProton的代码fork到个人账号下,在弹出的窗口中选择要fork到的个人账号,点击确认后,稍等一会就会自动跳转到刚刚fork出来的个人账号下的UniProton仓库。
568<!--
569![](./images/contribute/gitee_fork.png)
570**说明:** 图
571-->
572
573#### **5 同步UniProton仓库代码到fork的仓库**
574开发代码前,首先需要确保当前个人账号下的UniProton代码和UniProton官方仓库是一致的。 因为从fork代码到现在,UniProton官方仓库可能已经更新了内容,所以开发代码前需要先同步UniProton仓库代码到fork的仓库。如果仓库刚刚fork,可以跳过此步。
575<!--
576![](./images/contribute/gitee_fork4.png)
577**说明:** 图
578-->
579
580点击上图中红框中的按钮从UniProton官方仓库拉取代码到个人账号fork的仓库,此时会弹出一个对话框以确定同步动作,如下图所示:
581<!--
582![](./images/contribute/gitee_fork5.png)
583**说明:** 图
584-->
585
586点击确定后,gitee就会开始同步代码,用户无需再做其他操作。
587
588#### **6 提交本地修改到fork的仓库**
5891\) 开发的第一步,是clone代码到本地pc。
590
591```
592git clone https://gitee.com/gitee账户名/UniProton.git    //个人账号fork的仓库地址,clone下来后仓库名默认为origin
593```
594
595基于UniProton的远程master分支,创建并切换到本地分支,例如本地分支名也是master:
596
597```
598git checkout -b master origin/master
599```
600
6012\) 在本地分支上进行开发。开发完成之后,git add 添加代码到本地仓库,并git commit 提交到本地仓库,具体commit信息的填写规范,请参考[Commit message规范](#Commitmessage规范)。
602
6033\) 执行git push origin master操作,将代码提交到gitee上自己个人账号的master分支。
604
605**说明:** 所有git命令相关操作,如果不熟悉,请自行上网查找。
606
607#### **7 提交Pull Request到UniProton官方主仓库**
608
609通过上述步骤,修改已经提交到个人远程仓库中,此时就可以向UniProton官方主仓库master分支提交Pull Request,该操作在gitee网页上进行。
610
6111\) 进入个人账号下fork的UniProton仓库首页,点击下图红框中的“+ Pull Request”。
612<!--
613![](./images/contribute/gitee_fork6.png)
614**说明:** 图
615-->
616
6172\) 之后gitee会跳转到创建Pull Request的详细页面,并给出对应的源分支和要修改的目标分支,目标分支为UniProton官方主仓库master分支,如下图。
618<!--
619![](./images/contribute/gitee_fork7.png)
620**说明:** 图
621-->
622
623如果代码没有冲突则会显示下图红框中“可自动合并”的提示,否则需要先解决冲突然后再重新创建Pull Request。在线解决代码冲突可以参考<a href="https://gitee.com/help/articles/4305" target="_blank">在线解决代码冲突</a>。
624<!--
625![](./images/contribute/gitee_fork8.png)
626**说明:** 图
627-->
628
629填入Pull Request的标题和说明,点击“创建”,就可以提交一个Pull Request。右边的审查人员、测试人员、里程碑、标签、优先级是可选项,不选择也不影响Pull Request的创建。
630<!--
631>![](public_sys-resources/icon-note.gif)
632**说明:** 图
633-->
634
635**说明:**
636>-   如果提交的代码是为了解决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>。
637>-   如果提交的Pull Request中有新增意见,需要在评论里回复,并@提意见的人说明已经解决。
638
639
640#### **8 查看Pull Request的状态**
6411\) 进入<a href="https://gitee.com/openeuler/UniProton" target="_blank">UniProton主仓库</a>首页。
642
6432\) 点击下图中的“Pull Requests”,可以看到当前UniProton主仓库上所有的Pull Request。
644<!--
645![](./images/contribute/gitee_pr.png)
646**说明:** 图
647-->
648
649“开启的”表示这个Pull Request的代码还没有合入,“已合并”表示这个Pull Request的代码已经合入,“已关闭”表示这个Pull Request虽然已经关闭但是代码没有被合入。
650
651现在就静候UniProton主仓库管理员review代码吧,验证ok就会合入修改,恭喜您成为Contributor,感谢您为开源社区做出的贡献。
652
653
654<h2 id="协议">协议</h2>
655
656### 知识共享许可协议
657
658**您可以自由地:**
659
660**分享** — 在任何媒介以任何形式复制、发行本文档。
661
662**演绎** — 修改、转换或以本文档为基础进行创作。
663
664只要你遵守许可协议条款,许可人就无法收回你的这些权利。
665
666**惟须遵守下列条件:**
667
668**署名** — 您必须提供适当的证书,提供一个链接到许可证,并指示是否作出更改。您可以以任何合理的方式这样做,但不是以任何方式表明,许可方赞同您或您的使用。
669
670**非商业性使用** — 您不得将本文档用于商业目的。
671
672**相同方式共享** — 如果您的修改、转换,或以本文档为基础进行创作,仅得依本素材的授权条款来散布您的贡献作品。
673
674**没有附加限制** — 您不能增设法律条款或科技措施,来限制别人依授权条款本已许可的作为。
675
676**声明:**
677
678当您使用本素材中属于公众领域的元素,或当法律有例外或限制条款允许您的使用,则您不需要遵守本授权条款。
679
680未提供保证。本授权条款未必能完全提供您预期用途所需要的所有许可。例如:形象权、隐私权、著作人格权等其他权利,可能限制您如何使用本素材。
681<!--
682>![](public_sys-resources/icon-notice.gif)
683说明:图
684-->
685**须知:**
686>为了方便用户理解,这是协议的概述。您可以访问网址http://license.coscl.org.cn/MulanPSL2 了解完整协议内容。
687
688### 知识产权政策
689
6901.  定义
691
692    **1.1  关联公司:** 是指就一个实体而言,该实体直接或间接控制的另一实体,或者,直接或间接控制该实体的另一实体,或者与该实体被某一实体共同控制的其他实体;这里的“控制”是指直接或间接拥有一个实体中多于50%份额的投票权或表决权或者以任何其他方式直接或间接控制该实体50%以上的具有该实体决策权的所有者权益。
693
694    **1.2  遵从软件:** 是指由华为技术有限公司(后称“华为”)正式发布且未经过修改的UniProton,或者虽经修改,但能通过认证测试的UniProton。
695
696    **1.3  认证测试:** 是指为了确保UniProton与其一起使用的软件或硬件的兼容性和接口一致性而由华为开发的测试。认证测试套件及相关要求和指导将在UniProton官网公布。
697
698    **1.4  贡献:** 是指由任何人提交给UniProton将其纳入或建议纳入UniProton中的任何信息或资料,包括软件源代码,文档或相关材料。
699
700    **1.5  贡献者:** 是指提交贡献给UniProton的人。
701
702    **1.6  您:** 是指任何个人,公司,合作企业,共同控股公司,有限合伙,协会,有限责任公司或企业或实体。
703
704    **1.7  UniProton:** 是指由华为主导开发、管理、并由华为在openEuler官网上发布的可用于芯片,嵌入式领域的轻量开源操作系统项目。华为可能会对该软件不断进行更新。
705
706    **1.8  承诺的专利权利要求:** 是指专利或专利申请的一个或多个权利要求,且满足如下条件:(i)由贡献者或其关联公司现在或将来拥有控制的,或其他有权许可且无需向无关联的第三方支付费用的,且(ii)会因接受者制造,使用,许诺销售,销售,进口或以其他方式转移贡献者提交给UniProton的贡献单独或将该贡献与前述UniProton的结合所必然且直接侵犯。
707
708    **1.9  政策:** 是指本UniProton知识产权政策。
709
710    **1.10   接收者:** 是指接受本政策并享有本政策下许可的个人或法律实体。
711
712    **1.11  承诺者:** 是指贡献者及其关联公司。
713
7142.  许可
715
716    UniProton的代码将以MulanPSL2 License,除非华为另选其他许可证 (“可适用的许可证”)。接收者可以访问  [http://license.coscl.org.cn/MulanPSL2](http://license.coscl.org.cn/MulanPSL2)查看该许可证的详细内容。
717
7183.  专利不诉承诺
719
720    3.1 在接收者遵守本政策的前提下,每个承诺者许诺不对任何接收者就其制造,使用,许诺销售,销售,进口或以其他方式转移遵从软件的行为发起指控,诉讼或其他法律程序指控其侵犯该承诺者的承诺专利权利主张。前述承诺不适用于因以下原因引起的侵犯承诺专利权利主张的指控:i. 由其他方提交的贡献;ii 承诺者贡献代码后其他人对该贡献的修改;iii 该贡献与硬件的结合或者与不属于贡献所针对的UniProton的其他代码的结合;或者 iv 不属于遵从软件的软件。前述承诺也不适用于集成在个人便携产品(如手机,便携电脑,可穿戴设备等)中的遵从软件。
721
722    3.2 这是每个承诺者对接收者的个人承诺。
723
724    3.3 每个承诺者理解并同意专利不诉承诺是具有法律约束力且不可撤回的(根据第4条撤回的除外),而且对该承诺者、其继受者、受让方以及有权对第三方实施该承诺专利主张的任何独占被许可人都是有约束力的。
725
7264.  终止许可及专利不诉承诺的权利
727
728    在满足可适用许可证规定的前提下,如果贡献者或其关联公司向其他基于第3条享有专利不诉承诺权益且未根据本条终止的接收者发起指控,诉讼或其他法律程序,指控其制造,使用,许诺销售,销售,进口或者以其他形式转移遵从软件构成对其专利直接侵权或帮助侵权的,那么该接收者及其关联公司本政策下所有的许可以及专利不诉承诺将立即终止。
729
7305.  无其他权利
731
732    5.1 本政策并不授予接收者使用华为的贸易名称,商标,服务标记或产品名称的许可。
733
734    5.2 除本政策和可使用许可证明确约定外,没有其他明示或默示的专利,商标,版权或其他知识产权的许可授予接收者,不论是通过默示,放弃,禁止反言或其他形式。
735
7366.  无担保
737
738    除非适用法强制规定或者双方有明确书面约定, UniProton, 遵从软件以及任何贡献均如是提供,无任何形式的担保,不论是明示还是默示,包括但不限于不侵权,适销性或满足特定目的的担保。
739
7407.  责任限制
741
742    除非适用法强制规定,在任何情况下,不论是基于侵权,合同或其他,华为及其关联公司或任何贡献者均不对其他贡献者,接收者或第三方因本政策或因使用或未能使用华为发布的UniProton或者对UniProton的任何贡献导致的损失,包括任何直接的,间接的,特别的,偶然的损失或者数据丢失等,即使该方已经被建议该种可能的损失。
743
7448.  可分离性
745
746    如果本政策内的任何条款被认定为无效,不可实施或者与适用法冲突,本政策中的其他条款继续有效。
747
7489.  修改
749
750    华为有权自行决定修改本政策。该修改后的政策从其在UniProton官网上公布之日起生效,并仅适用于同时或此后发布的UniProton软件版本。
751
75210. 适用法和争议解决
753
754    本政策适用中华人民共和国法律。任何因本政策引起或与本政策相关的纠纷应提交到北京中国国际经济贸易仲裁委员会。该仲裁裁决是终局的并对仲裁双方具有法律约束力。
755
756
757<h2 id="联系我们">联系我们</h2>
758
759* 技术支持
760
761  欢迎<a href="https://gitee.com/openeuler/UniProton/issues" target="_blank">提交issue</a>对关心的问题发起讨论,欢迎到<a href="https://bbs.huaweicloud.com/" target="_blank">UniProton论坛</a>交流。
762  您也可以发送问题至邮箱UniProtonSupport@huawei.com。
763
764* 参与贡献
765
766  如您有兴趣参与开源贡献,欢迎提交PR参与特性建设,可至<a href="https://gitee.com/openeuler/UniProton " target="_blank">UniProton gitee源码仓</a>下载开源代码。
767
768* 技术合作
769
770  如您有合作意向,希望加入UniProton生态合作伙伴,请发邮件至UniProtonSupport@huawei.com,或访问<a href="https://www.openeuler.org/zh/" target="_blank">openEuler官网</a>,进一步了解详细信息。
771