From 7af157eb972b051a9b9fa5e226c1cfd0d3915e23 Mon Sep 17 00:00:00 2001 From: Erik LaBianca Date: Tue, 10 Dec 2013 12:24:01 -0500 Subject: [PATCH 1/8] add camelcase: false to .jshintrc --- book/standards/javascript/jshintrc.json | 1 + 1 file changed, 1 insertion(+) diff --git a/book/standards/javascript/jshintrc.json b/book/standards/javascript/jshintrc.json index 170342f..6649df0 100644 --- a/book/standards/javascript/jshintrc.json +++ b/book/standards/javascript/jshintrc.json @@ -8,6 +8,7 @@ "jquery": true, "latedef": true, "newcap": true, + "camelcase": false, "noarg": true, "node": true, "nonew": true, From b8698119ed4995a6e02272ffd7b9218043f5b866 Mon Sep 17 00:00:00 2001 From: Jimmy Ha Date: Tue, 17 Dec 2013 20:13:40 -0500 Subject: [PATCH 2/8] updating css standards --- book/standards/css/00index.adoc | 83 +++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/book/standards/css/00index.adoc b/book/standards/css/00index.adoc index e69de29..e2d9d1e 100644 --- a/book/standards/css/00index.adoc +++ b/book/standards/css/00index.adoc @@ -0,0 +1,83 @@ +== CSS & Less Guide + +The new site for Wiser Health is going to contain many services and applications built by many teams; we will need a set of fundamental goals and constraints to ensure long term success. Our five topics will be: + +. How do we handle core and/or external CSS frameworks versus custom work? +. How do we manage cross-browser compatibility? +. What is the relationship between our markup and our styling? +. What are the considerations for modularity, hierarchies, and best practices? +. How do we design to be device-agnostic? + +The quantifiable benchmarks are: + +. The CSS or LESS will be manageable, instead of being too large, cumbersome, or undocumented. +. There will be few if any instances of redundant work or cross-contamination. +. Uniformity of styling will be such that authorship is anonymous and irrelevant. +. Developers can enter or leave the project at any time with minimal on-boarding or knowledge sharing. +. The visual presentation of the site maintains a consistent and cohesive design aesthetic. + +=== CSS & LESS Rules and Principles + +==== I. Frameworks Versus Custom Styling + +Our core framework will be Twitter Bootstrap (currently in v.3.0.2). As we may be using newer versions of Boostrap, the component itself will go untouched. Any work that is developed must be done to build upon or complement Boostrap, or any other framework. For example, Bootstrap's grid system is defined in grids.less and mixins.less. We can create a new breakpoint that can add to the current list of breakpoints, without having to completely rewrite grids.less. + +There will be one main.less file that each page calls. Inside main.less, we will import the parts of Bootstrap as needed, along with any other custom styling. Custom styling will live in a static directory independent from external components. + +==== II. Cross-Browser Compatibility and Fallbacks + +We will design for a fictionally ideal browser that is completely standards-compliant. Obviously, this cannot work in practice. *_Any other styling used as a fallback must be placed in a separate file._* Such a file can be named something like ie_navbar.less to contrast with the ideal navbar.less file. We are doing this because there will come a day when we no longer have to support any number of older browsers, and it must be easy to remove styling for unsupported browsers. Redundant work today, easy of transitition tomorrow. + +*_We will not be using IE conditional comments at top of any file_*, as they pollute the declaration. IE conditional comments are allowable to include JS files, or at the declaration. + +==== III. HTML Markup and Styling + +Structured Outline:: Using a combination of appropriate and semantic HTML5 tags and heading hierarchies, *_the page must maintain structured outline._* There will be no untitled sections, and the outlining structure must make semantic sense. See http://html5doctor.com/outlines/ or http://coding.smashingmagazine.com/2011/08/16/html5-and-the-document-outlining-algorithm/ for reference. + +Respect ARIA Roles:: Pages will have landmark roles (banner, contentinfo, search, main) and we ought to develop CSS around those roles. Additionally, define CSS around widget and document roles where applicable. See http://www.w3.org/TR/wai-aria/roles. + +==== IV. Best Practices: Modularity, Hierarchies, Naming Conventions, Etc. + +Modularity Based shared components and layout pieces:: Since the compiler will combine all the CSS into one file, we have an opportunity to make as many stylesheets as we need, each serving a singular purpose. There will be three kinds of CSS files. + . Global resets and variables such as a normalize, typography and/or utilities + . component parts like the styling for buttons, forms, or tables + . Page or application features like a navigation menu, data table, or footers + +Include description in every file:: The risk of moving to pre-process CSS changes such that instead of worrying about giant bloated files, we now have to worry about too many files, of which we may lose track. *_All LESS files must contain a summary of purpose at the top._* + +Naming Conventions:: Even though LESS allows for deep nesting, we will *_avoid nesting too deep_*, as it taxes resources and creates cumbersome styling. Take advantage of uniquely occurring (once per page) #IDs to keep nesting as shallow as possible. Currently we will say that nesting should not go past 5 layers. + +* If a feature on a page exists only once, then identify that feature with an #id {} and nest all properties of elements of that feature within. +* If the feature requires classes, prefix the class names with the id name or nest them under the id. +** For example, if there is sidebar for blog links, all elements for that sidebar will be under #blog_links_sidebar {} which can contain nested classes such as .primary_link {}. In such a manner, the class .primary_link {} will not interfere with anything else on the page that may coincidentally share the same class name. On the hand if we don't want to nest this class and have out of #blog_links_sidebar {} then the class must be named .blog_links_sidebar_primary_link {}. + +Sizing:: With the exception of global resets for font sizing and defining breakpoints, *_do not define anything using pixels._* Use EMs or REMs, depending on context or relevancy. Be wary of REMS as even though they are very useful, the do not have full browser support. + +==== V. Device-Agnostic and Responsive Design + +The styling for all pages and applications will assume that we do not have control over the browser, viewport, or device being used. Breakpoints must be defined such that there is coherent presentation and behavior regardless of screen size or available user interaction (e.g. touch screens versus mouse control). + +=== Benchmarks for Success + +==== I. Managable, Well-Documented CSS and Styling + +How do I change the font size of the menu items in the global navigation? How do I add styling for error messages on the membership form? These questions should be solvable without excessive hunting or asking for help from previous developers. + +Our living KSS style guide will reflect what the site looks like. + +==== II. Concurrent Work without Overlapping + +Work submitted from one project will not interfere with work from another project, now or in the future (This is where proper naming conventions becomes highly relevant). If there is commonly shared component across multiple pages or applications, there, only one CSS file is generating that visual presentation. + +==== III. Anonymous and Uniform Authorship + +The mark of good coding or scripting is nobody determine who wrote it. To achieve this, all developers entering into the various projects of WiserHealth will have agreed on best practices, and all peer reviews will take measures to enforce such practices. We do not ownership of parts of the code. We do not want information silos. + +==== IV. Flexible Entry and Exit for Developers + +We will be using contractors depending on projects, and WiserTogether will have developers coming in and out of projects, or leaving or being hired. New people should not have spend weeks familiarizing themselves with the CSS and LESS frameworks, and people leaving should have to devote too much time explaining or training replacements. + +==== V. Consistent Visual Design Implementation and Aesthetic + +What separates a passable site from a professionally done site is attention to detail. The typography cannot look a certain way on one page and be slightly off on another page. Transitions and interactions will behave the same way, every time. In other words the true measure of success is achieving a singular, identifiable "look and feel." + From 2af727a47b11312e4e43f3a36f143074fee77c7b Mon Sep 17 00:00:00 2001 From: Jimmy Ha Date: Thu, 6 Feb 2014 15:29:38 -0500 Subject: [PATCH 3/8] guidelines for legacy support and structred outlining --- book/standards/css/00index.adoc | 48 ++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/book/standards/css/00index.adoc b/book/standards/css/00index.adoc index e2d9d1e..6eba187 100644 --- a/book/standards/css/00index.adoc +++ b/book/standards/css/00index.adoc @@ -28,11 +28,57 @@ There will be one main.less file that each page calls. Inside main.less, we will We will design for a fictionally ideal browser that is completely standards-compliant. Obviously, this cannot work in practice. *_Any other styling used as a fallback must be placed in a separate file._* Such a file can be named something like ie_navbar.less to contrast with the ideal navbar.less file. We are doing this because there will come a day when we no longer have to support any number of older browsers, and it must be easy to remove styling for unsupported browsers. Redundant work today, easy of transitition tomorrow. -*_We will not be using IE conditional comments at top of any file_*, as they pollute the declaration. IE conditional comments are allowable to include JS files, or at the declaration. +*_We will not be using IE conditional comments at top of any file_*, as they pollute the declaration. IE conditional comments are allowable to include JS files, or at the declaration. The current implementation of conditional commenting is: + +---- + + + + + + + +---- + +CSS to capture only IE7 + +---- +.ie7 {} +---- + +CSS to capture only IE8 + +---- +.ie8 {} +---- + +CSS to capture only IE9 + +---- +.ie9 {} +---- + +CSS to capture both IE7 and IE8 (The majority of fallback CSS should come from this class) + +---- +.ie7_8 {} +---- + +CSS to capture IE7, IE8, and IE9 +---- +.ie {} +---- ==== III. HTML Markup and Styling Structured Outline:: Using a combination of appropriate and semantic HTML5 tags and heading hierarchies, *_the page must maintain structured outline._* There will be no untitled sections, and the outlining structure must make semantic sense. See http://html5doctor.com/outlines/ or http://coding.smashingmagazine.com/2011/08/16/html5-and-the-document-outlining-algorithm/ for reference. + * The essential test for structured outline is available via http://gsnedders.html5.org/outliner/ It will show a visual representation of the page's sectioned content and the names of each part. Sections that have been improperly defined will be listed as _"Untitled Section."_ + * The steps to correct improper sectioning are prioritized as: + ** Reduce the amount of HTML nesting and hierarchy + ** Reduce the amount of CSS nesting and hierarchy, and define attributes based on classes and names + ** Determine whether a block element is for actual sectioning or just for visual presentation and alignment. Convert sectioning elements to DIVs, or vice versa. + ** create header elements that are set to display:none; in CSS + * The metric for properly structured HTML is a much leaner amount of templating needed to generate page features. Likewise, the amount of CSS needed to style the features will be significantly reduced as well. Respect ARIA Roles:: Pages will have landmark roles (banner, contentinfo, search, main) and we ought to develop CSS around those roles. Additionally, define CSS around widget and document roles where applicable. See http://www.w3.org/TR/wai-aria/roles. From ff3e3ce40831b7f1837fca97fbd38162375b7e24 Mon Sep 17 00:00:00 2001 From: Jimmy Ha Date: Thu, 6 Feb 2014 15:49:03 -0500 Subject: [PATCH 4/8] breakpoint definitions --- book/standards/css/00index.adoc | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/book/standards/css/00index.adoc b/book/standards/css/00index.adoc index 6eba187..fd68bee 100644 --- a/book/standards/css/00index.adoc +++ b/book/standards/css/00index.adoc @@ -97,12 +97,34 @@ Naming Conventions:: Even though LESS allows for deep nesting, we will *_avoid n * If the feature requires classes, prefix the class names with the id name or nest them under the id. ** For example, if there is sidebar for blog links, all elements for that sidebar will be under #blog_links_sidebar {} which can contain nested classes such as .primary_link {}. In such a manner, the class .primary_link {} will not interfere with anything else on the page that may coincidentally share the same class name. On the hand if we don't want to nest this class and have out of #blog_links_sidebar {} then the class must be named .blog_links_sidebar_primary_link {}. -Sizing:: With the exception of global resets for font sizing and defining breakpoints, *_do not define anything using pixels._* Use EMs or REMs, depending on context or relevancy. Be wary of REMS as even though they are very useful, the do not have full browser support. +Sizing:: With the exception of global resets for font sizing, legacy browser support, and defining breakpoints, *_do not define anything using pixels._* Use EMs or REMs, depending on context or relevancy. ==== V. Device-Agnostic and Responsive Design The styling for all pages and applications will assume that we do not have control over the browser, viewport, or device being used. Breakpoints must be defined such that there is coherent presentation and behavior regardless of screen size or available user interaction (e.g. touch screens versus mouse control). +*Responsiveness is going to use breakpoints that go from smallest to largest,* not largest to smallest. The definitions are as follows: + +* Browser widths *below 768 pixels*: currently out of scope + +* Browser widths at *768 to 991 pixels* + ** Covers screen resolutions of 768 and 960 (tablet space) + ** Content width fixed at 768: 12 columns of 64 pixels + +* Browser widths at *992 to 1199 pixels* + ** Covers screen resolutions of 1014 and 1152 (landscape tablets and small monitors) + ** Content width fixed at 960 pixels: 12 columns of 80 pixels + +* Browser widths at *1200 to 1329 pixels* + ** Covers screen resolution of 1280 (standard desktop monitors) + ** Content width fixed at 1152 pixels: 12 columns of 96 pixels + +* Browser widths at *1300 pixels and higher* + ** Covers screen resolutions of 1366, 1440, and up (standard laptop screens, Macbook screens, and large monitors) + ** Content width fixed at 1296 pixels: 12 columns of 108 pixels + +Consequently, the width of the content of the site will never exceed 1296 pixels. + === Benchmarks for Success ==== I. Managable, Well-Documented CSS and Styling From 8dc98b9bcb527018a024b5076873f2ae79d66964 Mon Sep 17 00:00:00 2001 From: JasonHo Date: Mon, 6 Jan 2014 18:23:08 +0900 Subject: [PATCH 5/8] Added documentation on router view standards --- book/standards/javascript/00index.adoc | 55 ++++++++++++++++++++++++++ book/standards/javascript/router.js | 16 ++++++++ book/standards/javascript/views.js | 53 +++++++++++++++++++++++++ 3 files changed, 124 insertions(+) create mode 100644 book/standards/javascript/router.js create mode 100644 book/standards/javascript/views.js diff --git a/book/standards/javascript/00index.adoc b/book/standards/javascript/00index.adoc index b46c144..cac58bd 100644 --- a/book/standards/javascript/00index.adoc +++ b/book/standards/javascript/00index.adoc @@ -163,3 +163,58 @@ This is recommended jsformat settings when using Sublime Text 2 ---- include::jsformat_recommend.js[] ---- + +[[Backbone Patterns]] + +Here is a list of good patterns and pratices while developing and +building Backbone applications. + +File structure: + +In most projects in wiser it is recommended to follow this type of structure: + +/... + + /collections + /handlebars + /models + /templates + /views + app.js + router.js + views.js + +Views: + +The /views folder should be seperated by module name in larger projects + +e.g. + +/views + /header + /nav + /module1 + /module2 + base.js + mixins.js + +Following best practices it is better to not do any rendering code within the +view class unless there is good reason. + +---- +include::views.js[] +---- + +For view cleanup because this is not handled automatically by backbone you should +make sure that view.remove() gets called before you render or navigate to a different +page. This will allow objects/bindings/events to cleanup before you render the new +view Please see below for example of how to do this. This code would be used in +the router for example by all views which will render the view. + +Also render should only be called by this structure ALWAYS: + + $("#page-layout").html(view.render().el); // there is numerous reasons for this. + +---- +include::router.js[] +---- diff --git a/book/standards/javascript/router.js b/book/standards/javascript/router.js new file mode 100644 index 0000000..1ba98c5 --- /dev/null +++ b/book/standards/javascript/router.js @@ -0,0 +1,16 @@ + // Navigates to a page and adds the view to be removed later + navigatePage: function (view) { + that.closeViews(); + that.views.push(view); + $("#page-layout").html(view.render().el); + + }, + closeViews: function () { + // Call remove on the views currently loaded to clean up + if (this.views.length > 0) { + _(this.views).each(function (view) { + view.remove(); + }); + this.views = []; + } + } \ No newline at end of file diff --git a/book/standards/javascript/views.js b/book/standards/javascript/views.js new file mode 100644 index 0000000..cb6dc5f --- /dev/null +++ b/book/standards/javascript/views.js @@ -0,0 +1,53 @@ +// Good example + +/*global define*/ +define(function (require) { + 'use strict'; + + var Template = require('hbs!../../templates/static/contact_us'), + Base = require("nagini/views/base"), + _ = require('underscore'); + + return Base.extend({ + template: Template, + events: { + 'click button': 'sendQuestion' + }, + initialize: function () { + var args = _.clone(arguments); + this.listenTo(this, 'sendZendeskTicket', this.sendZendeskTicket); + Base.prototype.initialize.apply(this, arguments); + }, + sendQuestion: function (e) { + var ticketParams = this.getZendeskParams(); + ticketParams.tag = 'contact-us'; + e.preventDefault(); + this.trigger('sendZendeskTicket', ticketParams); + } + }); +}); + +// Bad example + +/*global define*/ +define(function (require) { +'use strict'; + +var Template = require('hbs!../../templates/static/contact_us'), + Base = require("nagini/views/base"), + _ = require('underscore'); + + return Base.extend({ + el: $('body'), // Don't reference the el object in a view like this + tagName: 'header', + initialize: function () { + this.render(); // Don't call render within initialize if you have to do this the view is setup wrong. + }, + render: function () { + // Don't add a require statement within render and any function which overrides a base class + // needs to make sure it calls its parent class always. + // Base.prototype.render.apply(this, arguments); + this.$el.append(require('hbs!templates/header')); + } + }); +}); From 2607d9c23990c5ff833a1c2aeb8e5c3a491a7bfc Mon Sep 17 00:00:00 2001 From: JasonHo Date: Wed, 19 Feb 2014 02:03:26 +0700 Subject: [PATCH 6/8] Added Developer Squash Commit Workflow --- book/processes/00index.adoc | 1 + book/processes/branch_history.png | Bin 0 -> 9032 bytes book/processes/commit1.png | Bin 0 -> 19996 bytes book/processes/commit2.png | Bin 0 -> 18985 bytes book/processes/commit3.png | Bin 0 -> 22084 bytes book/processes/commit4.png | Bin 0 -> 5797 bytes book/processes/github-squash-commit.adoc | 53 +++++++++++++++++++++++ 7 files changed, 54 insertions(+) create mode 100644 book/processes/branch_history.png create mode 100644 book/processes/commit1.png create mode 100644 book/processes/commit2.png create mode 100644 book/processes/commit3.png create mode 100644 book/processes/commit4.png create mode 100644 book/processes/github-squash-commit.adoc diff --git a/book/processes/00index.adoc b/book/processes/00index.adoc index e3997a3..40991eb 100644 --- a/book/processes/00index.adoc +++ b/book/processes/00index.adoc @@ -2,5 +2,6 @@ include::code-merging.adoc[] include::github-create-pr.adoc[] +include::github-squash-commit.adoc[] include::github-pr-merge-squash.adoc[] include::quality-engineering.adoc[] diff --git a/book/processes/branch_history.png b/book/processes/branch_history.png new file mode 100644 index 0000000000000000000000000000000000000000..170bf81b890f52d0d588d8924c2ad783838f1302 GIT binary patch literal 9032 zcmZvCbzGC}+cz<~Mhv8JbVx}^Go-tFfHV?YU*3awF4zza&U5M6Jx z{Y;H2u4b*CL%!$LXd!9Nn01uA7VXMqjDv)Oub)U)po*<7B+rok{P-6Sa~af5X6t&X zZ0_Y%m!w^!`~6_&;I`3}^+bn5uQZ{mcqHpaGT<`N+`sX!o%#JCOzLhr@OGr_7XEOJ z7q5TS{xC)n6WOO-25#`;w_LR%#&x@Ti1T*qFM*c}6B3UP)%Z2;$p5%|OYrnyL#CmT zd$o<9*yZ#i9Ji|tl<)rZ*m^yN{aM%D=a`CEcJs-%Z9&~lw@a&L+>8sO8=P&x2V<9) z>jQDAm##JaGvbt2mWzHva<2OxAPSWqCR(jzt0BH^a!sHPa1zfd$CF(aWtxjKidAqj zm1Uy$oVI%CjUWXn98#7`j7ywa++@s~Xhp`bxWC&FX&xXQdV2_`zdc>L_j>7uAHv`b zmAt>aS&F6vK!8tNzR-s1(2>({Yiy)Ay{tq~pQxde8|=7upnwHQsbBxXt}K~T{GR4IS#jbx8_wbwC-&}5q8KjL(>i; zCmu}gOwM;D$nk_XsF3@ft#f)-!z%JK9iStTeN}k=q zEC{Y%7)#5nP0;pWRQaGe!4hs0Usl*4+I_4#5#ABX?bfYcV~^P}?p6x(^X6J%v`$wk z^aF)fNve!_%AtwHSQ}Cnt#)LC8;Bs%=~YuzG1Nxk?7*}614p?JrK?Za5G?y;(D}i# z)Er7KV70d}7qZ;Sk$712eCOSq*~;+dQ|-+AUkO!joVNz|gNybCc%Hv` zpC3J>G}=NIx;&V%eZ{wSx!ORw=S5fi;U%M6 zR;8m#=IH+r?{t+WR(5-$vDD?GA{lV1 zSE4|C;fM!oGf#PTabUD{dC%By^+N*-@^^9ljQDWG!pH0O*r$@dS7l-gMi2Y30z2!s zXKi$tEDEo5K$x%68GYFc7+U4Ns4QV6D&wU%<*(XpEP@p|7salcf6w#osQ!J=wo_w! zA=SW>emG5Px!ZT;IDp!=)CrHRZuN2`<#3J<_jKm`h33_HVdoEjtfWyCP&JBlH|ADa zxHEG;c6xfSidFMCQ9r-1KRI$JF17j*Wx7CDRws1fviz`gWf82X+(c!9u4gj`SMq2`^9x$Q{Tb(67W*N-?^y!+%|?i zuY{R`NEsU7*SgP%f^#|R{U@4(92uOB#}x2Ww+#D z?hBR!_^a#zfqrT}&vG>Y%v<(WGH+ybZH1#(T&k`EuY-2=mDX?nd_?pbw*~9g(=nI% zjPD)?^kEJZ@x$`_VT!bh5n+la4Mi{q6xGyWN@qV0 zia>rL=LaAbR5g=v@m$a@En`k8gXQ3Zb1PzlFh)di?c@BNZSc_Z(cnK^i7$OZZfxGj zKB$TOInNnhb}QE!Mi7P8>KiOwnWjleam!t5GxMDP93)}ie)Fa}I*pKG!k7r1lMWBA z@GuupN@1F@Fl7wKM0EEwuf8}4n?4BHvB@J4Bk{jVx6Piy;~sW#ELB0@w_Jm|Ngl*$ z@{O;A81HsuPh_VMKNBM-s3=8maiZWLxXsfh&}0r3SYEmAAi8`;l`24Y`CBZ3jQi7NwddS=?bg+ky{8OT8TP@Z+tv+W9O$3 z#cDD42gH#$@Z8}$A>LSGz!(pvPxv*1)Q2q|pP$v>I%3^8^O6B3#ZD_!w8?T4weTDf zJEXe%%kHd0mK<1e50IKqQq-5fJZ5xv@D?~vU%HF^ zw^uiuR-B0Pb(6UE{9O6073cVVJ<(B^P1F=~85;da-}*%_b=Iuz0~ol}jBnuQh4~P` zlB}rOt4&#CpG6o@(iKm&za!U1N|eWO1Cp$hssx;6i|N83T~M4#GL>!o|Pv(O<1K+tQ(Zy{%& zBw&ST2yk$&T`u2VKIZR(GR5qzMsj&*Mwq zBw&z6N@s*opHn#%!4}mJMEw!}vx%E_U-QixzI}mdy8tbQnYGWz%o})#5$qK+)~(JD z7!K)Up0ZI2SqK_#!#q}6(2b(}^qO|Rs$=~TR@1au>pvCzBuyl4cLWT?v{6qg)i$-s z9^mfx`ROOj0uv64SdA9EW;`TJArN9BF2Y&cx3n^6xIfPjqkN*CtH7fnD%|WC^u=MK zLPr^B9?kR8+<$^y%p0uPcnWk7c2U<8-KG6m6QfAlvFA0+3HITf7mQ^RcPi#=vS<2u z60D|(piXriM<|{%gPjK(=_#ECR2aa{vZAcA9HaUY<0wB+5Y9jxdrcoo(VefYf9Cp> z-6L2s zxBN$|a&X>$2hto`iO;OCE-sQhowl%C7eR z@oA9CF>$&V29PvfYnXv1#ozf8$?>c?O(#MY%u11M_#hOecs5vDfLf(n)@=9U^jUlz zt$o6Z(_VvVT(Fw-ZJ44wSzzy$N#mS!`H-5ws(X{J{1K0y_76e2Dnhg55xg39OMP~< z%vT1wHF~#2ygnjZUslGtxvkHYKH)W)(#grtj(Q&AIZ-LN*9V)Wi}^ng?}kQZkx7jI zB9kVLe3PA8JGDm@`&;oz7`K+3r=YYg=@BV-;ara*uLlG1-Ynk^J;^~(1Yd??v@W;S zSDLrH|6Eywyh|g}gSudos;D>Q5=XB@ow%^rE`h3?I~%R5ZU2M2)z7)o6fP-Zsi)d* zluXr8m-U93ucU9Y(;fX)$2S+(78Mk^h~-zE;CN6=9fwrRq|&aP=s8DD)m+TqVRtWU zn$e?qPgS+o^mO68p)V*H_~$tGiYW!C2`qJr2s;sD8Enazp8@tf27rlfcKdG}C%_%v zQ~Z828wwdH&C8;fPgl!>e+eK$&fm(x8Ns0mViHnK%i&R;Il5F%xMjc7tRD<@%E-6g z(i`p;Pg|hthx#z{it^ZwZ<)+a)Ju8mF#RsdR_!7RpNR}6( z-d{r&rRa|*AK##o_rf0?BXfTH%FT$8LUu=5lu1^Ugp&Q~7NqoRjQ9&YskUN73g-~@Rr*bQg5Y7$I9D-s%;ejQ2KwV;7z zw0GEgb1+xGD8>CpLea+$@vd-cXQy{zkN>2gQlO!l;-~)RzHX9%N%Q?Ar6IvqUWy$< z;4Fsn%@oqC;jg3an^}pVCrC+I(&ps{i9n}ht0=BjtZ@>SS%}r_f1}Kajt+R`jKRcA zMF6e}4)3sp&`m3asvMFq(V;!ASX9(4nf-s<7*S0tabH74-J0v&&)-#oLCf+@rwW+N z$?R)!4K?;|x7TNX15=AnxECL6dyhp$+(Nnds5_nRZycY+_4XMY|7Nn> zVB@2%-nzRQ%wZyZ>c0AJ}D)Tw@K04>2r0Df}@qAJD2_;5XWno^Hsa{IKJ9 zRfL_ZD?uyqaBn5*`|L(#U7O6zd&ueP5XhAkx_CoR7uf$WAuE-5|COvmV)pD%DuuqL zvJaj>0f789b}EBOtE}hquhMD^{93*f4K=#$DvM*^Mc1;V{3u~k7CR#_@h0F5>`Eb0tR!^ zBAw9`OQH#LOaJM{$n$!_4E>h2nrC%5KMpM034baa2m8~}bXfR{lb7Ao?Qw(*b!tZw zh{e>LDt!F8$?pF>vz?V(na>7m->y)d!I*ZRXc@oKBlNe{`d#J236 z7F)AwV+X5m`!^MW@c!hSyi8X(+hCfX@`Cf(ZpvN(i$e$u2^OQ%E6C>7ri|Y~pZ!Ve zE#|>=v3SxHtkf7>IySRNY4n!XC0Rbzd1p}QL#CCd7gCzA-<;i3mVuhW0Ya`X8%VvA z7;o;U_60`9@)a>W+Ov+HY2}r9^CNE(?xxu5 z95TUz`tu_cn~_?1%;*qU0G0jxYmNuA)eY@&D4h6@Se^>uCHNf9IPvn7)GD`gy(gG! zXT(-{aygw`UL^0HS4_-vqx(oVPa6)?(j280hzzWA1+EIX@i?7KT1w8T*joHt;IFt5mRxKw)A89#YhibH)06Xe}0+f*2Q^Vu?%qt=wl3(P*A z!w%KjKD3nUj`P@t&7)@h@jjI*n0(*SJ?mWR>5vU|`oTHek@@!=y7iwoWdQ1)2#MGq z3KF2Fd*$!5Y3I^R$8mLHTRFkGf~0$W1Y_+D$1tpN1U+ZrXU}b(yn{5Ak3|`0rSXi3zS5%|oGq=9eE&4p<=*j{S%mIbzbvv%}HhFLG39bJiHhgf9djKFR`J;`E3axZFu zgj6nn!D?hbo74+yelcb4q%xlh=Bl{`Z5ovxx z$JAqp0@)&ocadZG-q%x&_gNFrjT3UiZ%98L;$`4GeIr8A;(ua*QS%sMid$V-ST58ds_t`qBN z=mP(|@K@H6_CGZa15dMgzum~ZCySXw99V9{Xsql4JXqgT*ptqXg<6P)p7A|XuD71I zYOyqk)N7YO?^=pD=)B{J_6fSg5G4n0lRHrRJB<1C4F1*L&)|IyY`c1^JMo-=;@ux& zqD+Bn%no(B+uIlNR#p{Jku@;(qP+m}zL(%1@Ts(%U=Q_30bHIQGp2Ep_#K`IFu^XG zZ2>KS$nJ+^foH5|xk_MVJ@`}_B)q%MbrFFMjm0|WhWb4f5d z`l7Bcd54W?zFK1ill-@=ZzL>h#LqM!Qb`z@A^P|n1TMwa^onjN7ksmkQN!z$Ax1iw zzQ|Q92ygn)b*k4NZOZO8U8N(l_^(;<@mZqO>AL*EKPJRL1)E;oU+m`-Gqfb@`liVF_ny%&TuI{O6#I3M3}oqAr~?BGjp z*RX$eX|-PhO3LMEkMnTwFbJ(V2~z7|-g~SB9;INJE~1cSZt=a%={kV*hDCB^tBdtl zvCoDHu4c5%cn60w=n24re6;lT0_4@0V(wZY5)ak}(d&vQq84BV3Hdy*FhYXwv}dZF z-I*F)FInSSA;7(rS0k|Mie#BQEhZJ2JW&!ju!wp;-;OGXC&CK|fY~5d)H#-w!r$9y z59?rmvbXSllPj)k!04Hw%iq@ub!9AApQW%v#Hx3%h<(MJ-#9JXWU=}ZDt>5^7AOT3 zp@0k&-Y6i}?~0J=hx&Zwfe$L=Z=LF;-yKvYLvk<0Wkwb$iE-k&k@=9lbzXb=M@!}z z+%646VWh~!*|k-pbb4krZw5r3#DD$@fK)_$Lka<;GKc(7@sHgsVZg2<`8UYbdJMk( zIHc~@Mm)gE$pSKHyUJB5;pxADojO#<4!bkg|~XR0YL%6WhfDOG(Svcl>ju^0pa)%2$hI*3 z{x3LL3`G`7N_?|^&yrl@ebvP)gPJ7NIBwt>K9xUYwk5W{!JisB?;W%6h^(MO?82DD z8H9n{llOF6xgO`9pqM%|%=S_DxGJ~|GP1)Fi%twemXlc~G9I%0;I^@1T2|+zMPdLD zq!sx5>$P-T@SucpIFg(7sp8Y+_wv4}JhNTR|G6PEmhTDprRwo}jHQAdlc&?dUsa{U zpJE@%Tvaf9q0a@cz5BVRPwYStMVATK_A3`j>Ie@{{BpzXX%QZE%KpBn(2k1x;HSK} z$JiFNI6KkJ{nwJBla`Hs8)n%Z`KB{xP;;#;A`*!&9!&g5sVsTkrY%?H#3et*`czv6 z^yo}&5gl`nu)fnlHEGi{BcZ}!;!`19dKTbSuz+ZxU9w+zI2L=pM<0p5IqQSEe_*P( z4>Gj1fKPtRmU#a+VefrFSAude?yjwoSsxwNLM0$d5mXuHRRq;wOr|Z{TWoz&UmhKY zBmp7>ZO!u}^s@_$$PSU|At1c_-ki;`y=`M(Sb-Q z+9EJcpA!G+ztHH_(fFH1E&PyW>_;}+a|Q?G>Po*v5~6aqcAfS=#I~N}VxqH$G8K*xig&P&Aj9 z%3zppL|;oLQ2*3xyIp?Ltd2(xJocF_KqfCtFOEIKCf;w^@UF2jcoxWo{ zT5X>r2v9X|?ZnfmlL31%q4xSoH*%TZAxHcA0u%DL$HT9c5GiU@Zm%0|QCH5sJx4D1 zp`sc6RSe_y*VC)^`uuIx9AKGR@6V%Tql1Vbv^&NrV14=J9S2*%yxCafU0 zVI2D3uqP&;E5#X5AW3oQ{O9cOEs23FNo{E%*MhjjODp?4^+qHNQV$|G4#&xweakP1 zN$?`$U)aUqa90)ysG|4lTY7fy*MeBILhXOvKSeB{B4LfC=!oOHN-87+Kn4yVJ)gwi zl1s;|EYgj5QeHRs-im+gT;6(Mk5f_I&al)26%%FNb^hLzOS96>YT{?`a9L zJcqLr|H%>xqW@Qxz(7PfL$t-Lk3n5QH8_Ox^~6#rt~FWB|0Z#I68lWR^vQoT^4zcOiPLIFV|~L+i$8g%iySQ&u@r0Hl-&L?Wts zB-sxM;WNHcd@f69Z_M4*E{}P@+TlKlwf*7F`Hg$&AmT!@}TZUK;>=qbYj^Np-0}`VUCPVG@&!gF> zb)MPqeVKgvcMWf`mp_gj5ISKtSUOvevk_o6#jX$v2)!3e9$J%sGz1e(4fYlChyz_y z(a!5ioHNUisLS!|^sEP(P4j>Ui3LZu+l`fr>=X5+Ku8yfI5HdvVfTB8Sc;mwxl?!+ zBZkZeENnO{yZ*@szPN4t%3lIIci?Q@Uk%1HlW>~+uZ-XeZsVy*-m@2|CIJBwMY8?P z)_*g8LGeR`+aGij0v~=?-T21OSY-uXvkaRYAAK#il%S1_wtql(6>gpIO zX!LznuO{pR+d`_RKc@Yp4fmFp-(6$66wlYt6NS}XRA0-KmdS^-cqjuwYbB?jWos5ci!0X zaB{I^5@QpRXcZ&*HD+exh*rW~$E_6iIcvDjUaev9&bm0nJ+V*}qRsy}}*|7kT3qq;V_ tc1_r3PV^L#vBIy;57KCd^E?nSkSXbgx<{uY|NVlZB&RN0CSwuu{{Ta`MdAPe literal 0 HcmV?d00001 diff --git a/book/processes/commit1.png b/book/processes/commit1.png new file mode 100644 index 0000000000000000000000000000000000000000..641b27e59c5c55e67a8cb8853d3e5d46dd454fd8 GIT binary patch literal 19996 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 literal 0 HcmV?d00001 diff --git a/book/processes/commit2.png b/book/processes/commit2.png new file mode 100644 index 0000000000000000000000000000000000000000..8048f303d781a78ebdeb13f028ee203a0bd99115 GIT binary patch literal 18985 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 B-edp( literal 0 HcmV?d00001 diff --git a/book/processes/commit4.png b/book/processes/commit4.png new file mode 100644 index 0000000000000000000000000000000000000000..8bc85fe22009b2f8ef49fddf2c945561605dfe7d GIT binary patch literal 5797 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 + +git rebase -i master + +image::processes/commit2.png[Commit2] + +It is recommended to do your first commit as the commit message you want +to use. In our example we use fixup to discard the commit message but squash +the changes into the previous commit. Hence the reason why the first commit +message should be the sensible one you want to use + +image::processes/commit3.png[Commit3] + +You should exit the editor and execute the rebase by doing :wq (in windows) + +You should see a screen like this if everything is successful. + +image::processes/commit4.png[Commit4] + +Finally you can double check the branch history has squashed or fixed all commits +into one by visualisaing the branch history you should see just one commit line +like this: + +image::processes/branch_history.png[BranchHistory] From ffe289fb9b50863b86648762e7f6077430690c16 Mon Sep 17 00:00:00 2001 From: Johnny Dobbins Date: Wed, 19 Feb 2014 07:58:57 -0600 Subject: [PATCH 7/8] Updating PR merge doc to match the process that has been being used --- book/processes/github-pr-merge-squash.adoc | 74 ++++------------------ 1 file changed, 13 insertions(+), 61 deletions(-) diff --git a/book/processes/github-pr-merge-squash.adoc b/book/processes/github-pr-merge-squash.adoc index 550b72c..b16a93d 100644 --- a/book/processes/github-pr-merge-squash.adoc +++ b/book/processes/github-pr-merge-squash.adoc @@ -1,6 +1,6 @@ == GitHub PR-merge-squash Workflow -When using GitHub there are a variety of possible workflows. Each has their +When using GitHub there are a variety of possible workflows. Each has their own merits, but for a large, long-running project with a number of committers it is worth considering taking the extra time to follow a fork, merge-squash strategy. @@ -10,14 +10,14 @@ roles may not necessarily filled by different people, but for the sake of clarit step is assigned to one of them. Product Management:: - Product Management tasked with understanding the long term goals of the project and - measuring progress towards them. These people are also responsible for outlining the work + Product Management tasked with understanding the long term goals of the project and + measuring progress towards them. These people are also responsible for outlining the work to be done and verifying that changes made work as expected. Maintainers:: Maintainers are the technical staff responsible for maintaining the repository. They are responsible for approving the code and keeping it moving through the pipeline. Contributor:: - Contributors are the technical staff responsible for implementing features. + Contributors are the technical staff responsible for implementing features. === Steps @@ -26,14 +26,13 @@ a. If necessary, the project management team creates Milestones and perhaps Issu representing the work to be completed. .Contributor -1. fork the master repository to their own local repositories. -2. clone their personal fork to their local workstation -3. create branches for each line of work on their local repository -4. write code, committing it to their branch frequently -5. push their local feature-branch to their personal fork on github -6. use GitHub's "Compare and Pull Request" feature to open a pull request against +1. create a branch from the master branch in the wisertogether repository. +2. clone their branch to their local workstation +3. write code, committing it to their branch frequently +4. push their local feature-branch to the wisertogether repository +5. use GitHub's "Compare and Pull Request" feature to open a pull request against the master repository -7. update the pull request's description field with an accurate description of the +6. update the pull request's description field with an accurate description of the change, conforming to the commit message guidelines * the first line of the message shoul be 58 char or less and contain the milestone number * the 3rd and subsequent lines should contain the text "fixes #xxx" where xxx is the @@ -50,54 +49,7 @@ a. If necessary, the project management team creates Milestones and perhaps Issu 2. provide updated commits to their branch as needed. Once the pull request meets the feature requirements, code review, and is otherwise -deemed to be complete, the Maintainer will squash-merge the commit and close the associated -issues and the pull request itself. - -In order to facilitate this, the maintainer should edit their ".git/config" file and add the -following line to the `[origin]` section: `fetch = +refs/pull/*/head:refs/remotes/origin/pr/*`. -Doing that will allow you to run `git remote update --prune && git fetch` and then `git branch -r`. - -Your `git branch -r` output should look like the following, with a new "branch" for each pull request. - ----- - - * [new ref] refs/pull/10/head -> origin/pr/10 - * [new ref] refs/pull/11/head -> origin/pr/11 - ----- - -You can use `git log origin/pr/10` to view the changelog for the PR, `git diff origin/pr/10` to see the changes. - -To merge the change, use `git merge --squash origin/pr/10 -m 'COMMIT MESSAGE'` - -For the commit messge, copy the description from the pull request. It should look something like this: - ----- - - M1 - implement new frob-nizz feature - - - lint all the files, fixes #1 - - add some huge dependencies, fixes #2 - - implement new frobb-nizz features, fixes #10 - ----- - -In particular, you'll need to add the last line, (fixes #10) to mark the pull request as closed. - -Once the Maintainer is happy with the commit and commit message, simply push it back to the origin repo -with `git push origin master`. When GitHub sees the commit and the fixes #xxx lines in the commit message, -it will automatically close out all the associated issues. - -There is also a short script to help with handling this. Copy the following script to someplace on your path, -for instance `$HOME/bin/git-mergepr` and mark it as executable. Then you can simple execute `git mergepr 10` or -`git mergepr` to see a list of the available pull requests. - -[source,ruby] ----- -include::git-mergepr.rb[] ----- - -Once the Contributor sees their pull request has been closed, they can simply delete their branch with the -"delete branch" button in the GitHub UI, and pull the updated master branch to their local repository to base -future work upon. +deemed to be complete, the Maintainer will merge the pullrequest and close the associated +issues and the pull request itself by including `fixes #000` in the pull request. +The maintainer, upon merging the pull request, should also delete the feature branch that the pull request was created from. From 9652a39d0469eae924f105c0748a1c7e6f38239b Mon Sep 17 00:00:00 2001 From: JasonHo Date: Thu, 20 Feb 2014 22:13:36 +0700 Subject: [PATCH 8/8] Removed pr-merge-squash fixed images in squash-commit --- book/processes/00index.adoc | 1 - book/processes/github-squash-commit.adoc | 10 +++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/book/processes/00index.adoc b/book/processes/00index.adoc index 40991eb..78e3fac 100644 --- a/book/processes/00index.adoc +++ b/book/processes/00index.adoc @@ -3,5 +3,4 @@ include::code-merging.adoc[] include::github-create-pr.adoc[] include::github-squash-commit.adoc[] -include::github-pr-merge-squash.adoc[] include::quality-engineering.adoc[] diff --git a/book/processes/github-squash-commit.adoc b/book/processes/github-squash-commit.adoc index 58eecca..ebe759a 100644 --- a/book/processes/github-squash-commit.adoc +++ b/book/processes/github-squash-commit.adoc @@ -12,7 +12,7 @@ git checkout master git pull origin master -image::processes/commit1.png[Commit1] +image::commit1.png[Commit1] You may need to update the archery sub-module folder. @@ -31,23 +31,23 @@ git checkout git rebase -i master -image::processes/commit2.png[Commit2] +image::commit2.png[Commit2] It is recommended to do your first commit as the commit message you want to use. In our example we use fixup to discard the commit message but squash the changes into the previous commit. Hence the reason why the first commit message should be the sensible one you want to use -image::processes/commit3.png[Commit3] +image::commit3.png[Commit3] You should exit the editor and execute the rebase by doing :wq (in windows) You should see a screen like this if everything is successful. -image::processes/commit4.png[Commit4] +image::commit4.png[Commit4] Finally you can double check the branch history has squashed or fixed all commits into one by visualisaing the branch history you should see just one commit line like this: -image::processes/branch_history.png[BranchHistory] +image::branch_history.png[BranchHistory]