|
; # Semantic commits |
|
; |
|
; Writing commits is a fast and simple process which we do all day. |
|
; Imagine them becoming powerful for us which finally give them some attention. |
|
; The following semantic commits will do so and have the aim to: |
|
; |
|
; - Generate a changelog with commits for end-user |
|
; - Generate a speaking summary for customer |
|
; - Generate a easy to read list of changes for developer |
|
; - In general: Make commits parseable by some script |
|
; |
|
; This is solved by the easy trick to use a well known structure (esp. PHP): |
|
; |
|
; - Class names and Methods can be detected by using their semantic. |
|
; - Functions have a leading "()" which is obvious to detect. |
|
; - More fuzzy commits without one particular target can get a "tag". |
|
; |
|
; Please leave a comment below if you are missing something in this prequel or in the ABNF. |
|
; |
|
; |
|
; ## Example |
|
; |
|
; I just thought this would be nice as a commit message (almost full example): |
|
; |
|
; \Foo_Class::barMethod() can now print a baz (#123) |
|
; |
|
; In order to work as a human, I need to move in any SITUATION. |
|
; But this meant a big load of work for humanity, which is a PROBLEM. |
|
; As a human, I want to have a SOLUTION so that I can be lazy again. |
|
; |
|
; - funcPrint42() has been deleted |
|
; - \Meh\Output has been extended for that purpose |
|
; - \Foo_Class::barMethod() will pass "baz" to the output |
|
; if it is in a good mood |
|
; - /url/path has no need for human interaction till that |
|
; - humanity: is no longer disturbed by work |
|
; because we all like to be lazy |
|
; - Except writing these lines one time |
|
; |
|
; The header describes in general where the change is, what and give some reference. |
|
; After that follows an optional short text |
|
; about the situation before (which can be a user story), |
|
; the problems with that and what the solution now is |
|
; (also possible user story) - feel free to add the pros and cons. |
|
; In the end follows a list of changes that can be extended by describing if-clauses |
|
; or the matter (because) why the change needed to happen. |
|
; You might note that functions, classes, methods and URLs can be referenced as well as |
|
; tags (followed by colon) and non-referencing simple sentences. |
|
; It is very flexible because an user story can be |
|
; the classic ones from Connextra, |
|
; the simpler ones by Mike Cohn, |
|
; the "Feature Injection Stories" by Chris Matts |
|
; or a user story that would answer the proven "Five Ws". |
|
; |
|
; |
|
; |
|
; # Benefit |
|
; |
|
; Imagine a parser running through your code, mapping the references to according sections |
|
; in an documentation and generating whole diff or manuals for developers. |
|
; It can fetch the "long descriptions" / "paper questions part" to give your customer |
|
; a brief text of what has been done to his website or application. |
|
; For the most out there the heading is enough to gather text for a changelog. |
|
; |
|
; |
|
; ## Mapping |
|
; |
|
; You can output the "tags" directly or filter them like this: |
|
; |
|
; [ |
|
; '\Class_Foo' => 'Usability', |
|
; '\Class_Foo::someMethod()' => 'Hints for customer', |
|
; 'humanity' => 'Human interaction' |
|
; ] |
|
; |
|
; |
|
; ## Generate changelogs for end-user |
|
; |
|
; With appropriate commits that follow the "Semantic Commits" as described you can generate this: |
|
; |
|
; # Usability |
|
; |
|
; - Customer can now login more easily |
|
; |
|
; ## Hints for customer |
|
; |
|
; - Reseller get a security question when kicking customer |
|
; - Customer get a notice via mail when they have been kicked |
|
; |
|
; This was the example of three commits getting together through some tool |
|
; generating a changelog or feature list for end-user. |
|
; |
|
; |
|
; ## Give your client a text he understands |
|
; |
|
; The client you service the application for might want to see the problem |
|
; and how it has been solved: |
|
; |
|
; # Usability |
|
; |
|
; As a customer five steps are too much for logging in. |
|
; Therefore we put everything on one page and eliminate the obvious. |
|
; |
|
; # Hints for customer |
|
; |
|
; Reseller may accidentally kick customer from their list. |
|
; To avoid that a security question is nagging before. |
|
; |
|
; Kicked customer won't recognize that they have no account any more. |
|
; As a customer who got deleted from the system, |
|
; I receive an E-Mail because I want to be informed. |
|
; |
|
; Still the same three commits as before but a total different view of things |
|
; for a total different person with other needs. |
|
; |
|
; Have fun writing ad-hoc documentations, changelog, |
|
; feature lists, comments on user stories .......... |
|
; |
|
; |
|
; # Technical part |
|
; |
|
; Recent commits to the Repository of the VCS GIT brought me the idea |
|
; and had big influence on the structure. |
|
; If you find something in capital letters not defined here |
|
; then it's probably part of ABNF: http://tools.ietf.org/html/rfc2234 |
|
; |
|
; Special: |
|
; |
|
; - VCHAR means all of them except LF and CR |
|
; - SP are not explicit written |
|
; - If SP is written then only those SP count in that line |
|
; |
|
; |
|
|
|
|
|
; Let's start with the technical part here. |
|
commit = headline, |
|
[2LF paper_questions] |
|
[2LF notes] |
|
|
|
; |
|
; The commit |
|
|
|
headline = title [tracking_code] |
|
paper_questions = [situation LF] [problem LF] solution |
|
notes = 1*20enumeration_item |
|
|
|
; |
|
; The headline |
|
title = prefix[":"] short_message |
|
tracking_code = "(" *VCHAR [SP "-" SP tracking_system] ")" |
|
|
|
; |
|
; The paper_questions - living text describing the issue (for the commit) |
|
; How it was / is solved before the commit and what alternatives you had: |
|
; What the problem of this was |
|
; And how you solved it |
|
|
|
situation = (*160VCHAR / user_story) "." |
|
problem = *160VCHAR "." |
|
solution = (*160VCHAR / user_story ) "." |
|
|
|
; |
|
; The notes |
|
|
|
enumeration_item = *indent "-" SP title [LF *indent addendum] LF |
|
|
|
; |
|
; The title |
|
|
|
prefix = class_name / method_name / function_name / url_path / descriptive_word |
|
short_message = *VCHAR |
|
|
|
; |
|
; The tracking_code |
|
|
|
tracking_system = *VCHAR |
|
|
|
; |
|
; The user_story |
|
|
|
user_story = connextra_story / mike_cohn_story |
|
|
|
; |
|
; The enumeration_item |
|
|
|
indent = 4SP |
|
; explain on what it depends or why this particular change happened |
|
addendum = ("if") / ("because" / "due to") *VCHAR |
|
|
|
; |
|
; The prefix |
|
|
|
; Goes hand in hand with the PEAR Coding Standard where classes are Upper_Snake_Case |
|
; or with a "\" for namespaces in between. |
|
; It starts with a slash to show parser the presence of a class here |
|
class_name = "\"(ALPHA / "_" / "\") |
|
|
|
; method names are like "\Class_Name::methodName_123()" |
|
method_name = class_name"::"function_name |
|
|
|
; function names are like "methodName_123()" |
|
; the trailing "()" is the indicator for parser that it's a function |
|
function_name = ["\"]*(ALPHA / "_" / DIGIT / "\")"()" |
|
|
|
; url paths are the relative link to a page callable in the browser |
|
; so the changes will change the behaviour of that page in general |
|
; the trailing "/" shows parser the presence of an URL |
|
url_path = "/"*VCHAR |
|
|
|
; descriptive words help if your commit has grown to big and is to fuzzy |
|
; the end of it is marked with a ":" for the parser |
|
descriptive_word = *VCHAR":" |
|
|
|
; |
|
; The user_story |
|
connextra_story = mike_cohn_story " so that " benefit |
|
mike_cohn_story = "As a " role ", I want " goal_desire |
|
chris_matts_story = "In order to " benefit " as a " role ", I want " goal_desire |
|
five_w_story = "As " fw_who SP fw_when SP fw_where ", I " fw_what " because " fw_why |
|
|
|
role = *VCHAR |
|
goal_desire = *VCHAR |
|
benefit = *VCHAR |
|
fw_who = *VCHAR |
|
fw_when = *VCHAR |
|
fw_where = *VCHAR |
|
fw_what = *VCHAR |
|
fw_why = *VCHAR |
|
|
|
; Version History |
|
; |
|
; 0.1.0 - First thoughts in dirty BNF |
|
; 0.2.0 - Some scribbled extensions |
|
; 0.3.0 - More likely the way in proper ABNF |
|
; - ABNF has been chosen as it is good for defining documentation and protocols |
|
; - Big text has been added to describe the situation, the target and the solution to it |
|
; 0.3.1 - The paper_questions changed |
|
; - As the solution is the only one of interest to a customer the situation has become optional. |
|
; The interest in general is: solution > situation > problem, which shall be documented. |
|
; 0.4.0 - The enumeration_item gets keywords to introduce the reason of a change or its conditions (called `addendum`). |
|
; 0.4.1 - Typos fixed, paper_questions have a better delimiter, |
|
; indent is 4SP long because some MD-Parser had problems with 2SP lists |
|
; 0.5.0 - Compatibility with user stories and issue systems |
|
; - Connextra user stories added |
|
; - User stories by Mike Cohn added |
|
; - User stories like Feature Injection by Chris Matts added |
|
; - User stories in form if the "Five Ws" added |
|
; - Issue tracking changed from HEX to VCHAR |
|
; and big change in syntax of tracking_code |
|
; - Enhanced documentation by new user stories |
|
; |
|
; Issues |
|
; - Document the interest "solution > situation > problem" with the how and why |
|
; - It's not known if the addendum needs different words to introduce a condition |
|
; - The brace for the issue-number does not support magic commits like "(github #2 fixed)" |
|
; |
Thanks for this @NewbiZ. Never took a look at those but it's quiet interesting. It is way much better than usual commits and tells more about it. I think especially the reference to an author is missing in my proposal.
@seanjensengrey that would be up to the tool I guess :)