(window.webpackJsonp=window.webpackJsonp||[]).push([[47],{114:function(e,t,r){"use strict";r.r(t),r.d(t,"frontMatter",(function(){return a})),r.d(t,"metadata",(function(){return c})),r.d(t,"toc",(function(){return s})),r.d(t,"default",(function(){return u}));var o=r(3),i=r(7),n=(r(0),r(144)),a={title:"Guide for Apache Submarine Committers"},c={unversionedId:"community/HowToCommit",id:"community/HowToCommit",isDocsHomePage:!1,title:"Guide for Apache Submarine Committers",description:"\x3c!--",source:"@site/docs/community/HowToCommit.md",slug:"/community/HowToCommit",permalink:"/docs/community/HowToCommit",editUrl:"https://github.com/apache/submarine/edit/master/website/docs/community/HowToCommit.md",version:"current",sidebar:"docs",previous:{title:"Apache Submarine Community",permalink:"/docs/community/README"},next:{title:"How To Contribute to Submarine",permalink:"/docs/community/contributing"}},s=[{value:"New committers",id:"new-committers",children:[]},{value:"Review",id:"review",children:[]},{value:"Reject",id:"reject",children:[]},{value:"Commit individual patches",id:"commit-individual-patches",children:[]},{value:"Adding Contributors role",id:"adding-contributors-role",children:[]}],m={toc:s};function u(e){var t=e.components,r=Object(i.a)(e,["components"]);return Object(n.b)("wrapper",Object(o.a)({},m,r,{components:t,mdxType:"MDXLayout"}),Object(n.b)("p",null,"This page contains Hadoop Core-specific guidelines for committers."),Object(n.b)("h2",{id:"new-committers"},"New committers"),Object(n.b)("p",null,"New committers are encouraged to first read Apache's generic committer documentation:"),Object(n.b)("ul",null,Object(n.b)("li",{parentName:"ul"},Object(n.b)("a",{parentName:"li",href:"http://www.apache.org/dev/new-committers-guide.html"},"Apache New Committer Guide")),Object(n.b)("li",{parentName:"ul"},Object(n.b)("a",{parentName:"li",href:"http://www.apache.org/dev/committers.html"},"Apache Committer FAQ"))),Object(n.b)("p",null,"The first act of a new core committer is typically to add their name to the\ncredits page. This requires changing the site source in\n",Object(n.b)("a",{parentName:"p",href:"https://github.com/apache/submarine-site/blob/master/community/member.md"},"https://github.com/apache/submarine-site/blob/master/community/member.md"),". Once done,\nupdate the Submarine website as described\n",Object(n.b)("a",{parentName:"p",href:"https://github.com/apache/submarine-site/blob/asf-site/README.md"},"here"),"\n(TLDR; don't forget to regenerate the site with hugo, and commit the generated\nresults, too)."),Object(n.b)("h2",{id:"review"},"Review"),Object(n.b)("p",null,"Submarine committers should, as often as possible, attempt to review patches\nsubmitted by others. Ideally every submitted patch will get reviewed by a\ncommitter within a few days. If a committer reviews a patch they've not\nauthored, and believe it to be of sufficient quality, then they can commit the\npatch, otherwise the patch should be cancelled with a clear explanation for why\nit was rejected."),Object(n.b)("p",null,"The list of submitted patches can be found in the GitHub\n",Object(n.b)("a",{parentName:"p",href:"https://github.com/apache/submarine/pulls"},"Pull Requests")," page.\nCommitters should scan the list from top-to-bottom,\nlooking for patches that they feel qualified to review and possibly commit."),Object(n.b)("p",null,"For non-trivial changes, it is best to get another committer to review & approve\nyour own patches before commit."),Object(n.b)("h2",{id:"reject"},"Reject"),Object(n.b)("p",null,"Patches should be rejected which do not adhere to the guidelines in\n",Object(n.b)("a",{parentName:"p",href:"/docs/community/contributing"},"Contribution Guidelines"),". Committers should always be\npolite to contributors and try to instruct and encourage them to contribute\nbetter patches. If a committer wishes to improve an unacceptable patch, then it\nshould first be rejected, and a new patch should be attached by the committer\nfor review."),Object(n.b)("h2",{id:"commit-individual-patches"},"Commit individual patches"),Object(n.b)("p",null,"Submarine uses git for source code version control. The writable repo is at -\n",Object(n.b)("a",{parentName:"p",href:"https://gitbox.apache.org/repos/asf/submarine.git"},"https://gitbox.apache.org/repos/asf/submarine.git")),Object(n.b)("p",null,"It is strongly recommended to use the cicd script to merge the PRs.\nSee the instructions at\n",Object(n.b)("a",{parentName:"p",href:"https://github.com/apache/submarine/tree/master/dev-support/cicd"},"https://github.com/apache/submarine/tree/master/dev-support/cicd")),Object(n.b)("h2",{id:"adding-contributors-role"},"Adding Contributors role"),Object(n.b)("p",null,"There are three roles (Administrators, Committers, Contributors) in the project."),Object(n.b)("ul",null,Object(n.b)("li",{parentName:"ul"},"Contributors who have Contributors role can become assignee of the issues in the project."),Object(n.b)("li",{parentName:"ul"},"Committers who have Committers role can set arbitrary roles in addition to Contributors role."),Object(n.b)("li",{parentName:"ul"},"Committers who have Administrators role can edit or delete all comments, or even delete issues in addition to Committers role.")),Object(n.b)("p",null,"How to set roles"),Object(n.b)("ol",null,Object(n.b)("li",{parentName:"ol"},"Login to ASF JIRA"),Object(n.b)("li",{parentName:"ol"},"Go to the project page (e.g. ",Object(n.b)("a",{parentName:"li",href:"https://issues.apache.org/jira/browse/SUBMARINE"},"https://issues.apache.org/jira/browse/SUBMARINE")," )"),Object(n.b)("li",{parentName:"ol"},'Hit "Administration" tab'),Object(n.b)("li",{parentName:"ol"},'Hit "Roles" tab in left side'),Object(n.b)("li",{parentName:"ol"},"Add Administrators/Committers/Contributors role")))}u.isMDXComponent=!0},144:function(e,t,r){"use strict";r.d(t,"a",(function(){return l})),r.d(t,"b",(function(){return d}));var o=r(0),i=r.n(o);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function c(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,o,i=function(e,t){if(null==e)return{};var r,o,i={},n=Object.keys(e);for(o=0;o<n.length;o++)r=n[o],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(o=0;o<n.length;o++)r=n[o],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var m=i.a.createContext({}),u=function(e){var t=i.a.useContext(m),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},l=function(e){var t=u(e.components);return i.a.createElement(m.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},p=i.a.forwardRef((function(e,t){var r=e.components,o=e.mdxType,n=e.originalType,a=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),l=u(r),p=o,d=l["".concat(a,".").concat(p)]||l[p]||b[p]||n;return r?i.a.createElement(d,c(c({ref:t},m),{},{components:r})):i.a.createElement(d,c({ref:t},m))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var n=r.length,a=new Array(n);a[0]=p;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:o,a[1]=c;for(var m=2;m<n;m++)a[m]=r[m];return i.a.createElement.apply(null,a)}return i.a.createElement.apply(null,r)}p.displayName="MDXCreateElement"}}]);