├── .gitattributes ├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── LICENSE ├── README.md ├── build.gradle.kts ├── changelog.mustache ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle.kts └── src ├── doc └── images │ ├── gradle-example.gif │ └── s1_linear_with_only_annotated_tags_autoIncrement.gif ├── main └── java │ └── fr │ └── brouillard │ └── oss │ └── gradle │ └── plugins │ ├── JGitverLazyVersionHolder.java │ ├── JGitverPlugin.java │ ├── JGitverPluginExtension.java │ ├── JGitverPluginExtensionBranchPolicy.java │ └── JGitverVersionTask.java └── test └── integration ├── contexts ├── distance-default │ ├── expectation.txt │ ├── git-history.sh │ └── jgitver.gradle ├── distance-depth │ ├── expectation.txt │ ├── git-history.sh │ └── jgitver.gradle ├── distance-first_parent │ ├── expectation.txt │ ├── git-history.sh │ └── jgitver.gradle ├── distance-log │ ├── expectation.txt │ ├── git-history.sh │ └── jgitver.gradle ├── maven-like │ ├── git-history.sh │ └── jgitver.gradle ├── merged-branches │ ├── git-history.sh │ └── jgitver.gradle ├── policy-latest │ ├── expectation.txt │ ├── git-history.sh │ └── jgitver.gradle ├── policy-max │ ├── expectation.txt │ ├── git-history.sh │ └── jgitver.gradle ├── policy-nearest │ ├── expectation.txt │ ├── git-history.sh │ └── jgitver.gradle ├── tag-regexp │ ├── git-history.sh │ └── jgitver.gradle ├── v1.2-tags-regexp │ ├── git-history.sh │ └── jgitver.gradle ├── version-strategy-normal │ ├── git-history.sh │ └── jgitver.gradle └── version-strategy-tag │ ├── git-history.sh │ └── jgitver.gradle └── test ├── .gitignore ├── base-build.gradle ├── build.sh ├── clean.sh ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitattributes: -------------------------------------------------------------------------------- 1 | # see https://gist.github.com/ArminVieweg/c0fe55fe2fb25cd44772 2 | 3 | # Autodetect text files 4 | * text=auto 5 | 6 | # Force the following filetypes to have unix eols, so Windows does not break them 7 | *.sh text eol=lf 8 | gradlew text eol=lf 9 | 10 | # Force images/fonts to be handled as binaries 11 | *.jpg binary 12 | *.jpeg binary 13 | *.gif binary 14 | *.png binary 15 | *.t3x binary 16 | *.t3d binary 17 | *.exe binary 18 | *.data binary 19 | *.ttf binary 20 | *.eof binary 21 | *.eot binary 22 | *.swf binary 23 | *.mov binary 24 | *.mp4 binary 25 | *.mp3 binary 26 | *.ogg binary 27 | *.flv binary -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | bin/ 2 | build/ 3 | .classpath 4 | .project 5 | .gradle/ 6 | .settings/ 7 | .okhttpcache/ 8 | src/test/integration/test/.git/ 9 | src/test/integration/test/build/ 10 | src/test/integration/test/.gradle/ 11 | src/test/integration/test/build.gradle 12 | src/test/integration/test/content 13 | .idea/ 14 | *.iml -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: java 2 | 3 | jdk: 4 | - openjdk8 5 | 6 | before_cache: 7 | - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock 8 | - rm -fr $HOME/.gradle/caches/*/plugin-resolution/ 9 | cache: 10 | directories: 11 | - $HOME/.gradle/caches/ 12 | - $HOME/.gradle/wrapper/ -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # jgitver gradle plugin 2 | 3 | Changelog of [jgitver gradle plugin](https://github.com/jgitver/gradle-jgitver-plugin) 4 | 5 | ## 0.3.2 6 | ### GitHub [#10](https://github.com/jgitver/gradle-jgitver-plugin/issues/10) upload and use 0.3.1 to bypass failed release 0.3.0 7 | 8 | **update to gradle-jgitver-plugin 0.3.1** 9 | 10 | * closes #9, closes #10 11 | 12 | [6857b31afe715ef](https://github.com/jgitver/gradle-jgitver-plugin/commit/6857b31afe715ef) Matthieu Brouillard *2017-09-19 11:18:17* 13 | 14 | 15 | ### GitHub [#7](https://github.com/jgitver/gradle-jgitver-plugin/issues/7) enhance configuration options 16 | 17 | **add configuration capabilities** 18 | 19 | * also update to jgitver 0.5.0 20 | * fixes #7 21 | 22 | [7c0228056a22ce6](https://github.com/jgitver/gradle-jgitver-plugin/commit/7c0228056a22ce6) Matthieu Brouillard *2017-11-25 11:14:24* 23 | 24 | 25 | ### GitHub [#9](https://github.com/jgitver/gradle-jgitver-plugin/issues/9) missing artifacts for 0.3.0 release 26 | 27 | **update to gradle-jgitver-plugin 0.3.1** 28 | 29 | * closes #9, closes #10 30 | 31 | [6857b31afe715ef](https://github.com/jgitver/gradle-jgitver-plugin/commit/6857b31afe715ef) Matthieu Brouillard *2017-09-19 11:18:17* 32 | 33 | 34 | ## 0.3.1 35 | ### GitHub [#8](https://github.com/jgitver/gradle-jgitver-plugin/issues/8) provide changelog file 36 | 37 | **introduction of a changelog file** 38 | 39 | * using git-changelog-gradle-plugin, a CHANGELOG.md file can now be 40 | * generated. Entering `gradle changelog` will update/generate the project 41 | * changelog file. 42 | * fixes #8 43 | 44 | [8bc40727c2a0bbb](https://github.com/jgitver/gradle-jgitver-plugin/commit/8bc40727c2a0bbb) Matthieu Brouillard *2017-09-15 11:34:05* 45 | 46 | 47 | ### GitHub [#9](https://github.com/jgitver/gradle-jgitver-plugin/issues/9) missing artifacts for 0.3.0 release 48 | 49 | **update Gradle Publishing Plugin to 0.9.7** 50 | 51 | * see #9 52 | 53 | [ed582d856aa22a1](https://github.com/jgitver/gradle-jgitver-plugin/commit/ed582d856aa22a1) Matthieu Brouillard *2017-09-19 10:34:24* 54 | 55 | 56 | ## 0.3.0 57 | ### GitHub [#5](https://github.com/jgitver/gradle-jgitver-plugin/issues/5) update to jgitver 0.4.0 58 | 59 | **update jgitver dependency to 0.4.0** 60 | 61 | * fixes #5 62 | 63 | [164de0ec141e564](https://github.com/jgitver/gradle-jgitver-plugin/commit/164de0ec141e564) Matthieu Brouillard *2017-09-14 09:11:24* 64 | 65 | 66 | ### GitHub [#6](https://github.com/jgitver/gradle-jgitver-plugin/issues/6) expose jgitver metadatas 67 | 68 | **expose jgitver metadatas as project extension properties** 69 | 70 | * jgitver metadatas are accessible using the syntax 'project.ext.metadata' where metadata is a jgitver metadata name in lowercase 71 | * for example 'project.ext.git_sha1_full' 72 | * fixes #6 73 | 74 | [e5fc7fe1c857001](https://github.com/jgitver/gradle-jgitver-plugin/commit/e5fc7fe1c857001) Matthieu Brouillard *2017-09-14 09:11:27* 75 | 76 | 77 | ### No issue 78 | 79 | **update gradle version to 2.14.1** 80 | 81 | 82 | [8f79de66c95add9](https://github.com/jgitver/gradle-jgitver-plugin/commit/8f79de66c95add9) Matthieu Brouillard *2017-09-14 09:11:26* 83 | 84 | **switch to gradle-jgitver-plugin 0.2.0** 85 | 86 | 87 | [6ea13e08703bcda](https://github.com/jgitver/gradle-jgitver-plugin/commit/6ea13e08703bcda) Matthieu Brouillard *2016-06-06 08:32:18* 88 | 89 | 90 | ## 0.2.0 91 | ### GitHub [#2](https://github.com/jgitver/gradle-jgitver-plugin/issues/2) expose configuration to control jgitver 92 | 93 | **allow plugin configuration, closes #2** 94 | 95 | 96 | [8555d675ea8d762](https://github.com/jgitver/gradle-jgitver-plugin/commit/8555d675ea8d762) Matthieu Brouillard *2016-06-03 13:16:33* 97 | 98 | 99 | ## 0.1.0 100 | ### GitHub [#1](https://github.com/jgitver/gradle-jgitver-plugin/issues/1) use gradle-jgitver-plugin inside gradle-jgitver-plugin 101 | 102 | **use the plugin to build the plugin itself, closes #1** 103 | 104 | 105 | [7c6a927daa050db](https://github.com/jgitver/gradle-jgitver-plugin/commit/7c6a927daa050db) Matthieu Brouillard *2016-04-27 15:09:50* 106 | 107 | 108 | ### No issue 109 | 110 | **enhance release paragraph in README** 111 | 112 | 113 | [2a762587653078e](https://github.com/jgitver/gradle-jgitver-plugin/commit/2a762587653078e) Matthieu Brouillard *2016-05-13 20:42:15* 114 | 115 | **add a show version task to build.gradle & to README** 116 | 117 | 118 | [c5c56f45f47ddeb](https://github.com/jgitver/gradle-jgitver-plugin/commit/c5c56f45f47ddeb) Matthieu Brouillard *2016-05-13 20:37:23* 119 | 120 | **enhance readme with gradle 2.1 syntax** 121 | 122 | 123 | [82d48a1f9709e01](https://github.com/jgitver/gradle-jgitver-plugin/commit/82d48a1f9709e01) Matthieu Brouillard *2016-05-13 20:32:28* 124 | 125 | **move to jgitver 0.1.0, enhance documentation** 126 | 127 | 128 | [8122019f4631244](https://github.com/jgitver/gradle-jgitver-plugin/commit/8122019f4631244) Matthieu Brouillard *2016-05-13 20:25:39* 129 | 130 | **enhance README with an example from jgitver** 131 | 132 | 133 | [3bf9763f805dc97](https://github.com/jgitver/gradle-jgitver-plugin/commit/3bf9763f805dc97) Matthieu Brouillard *2016-04-27 15:15:49* 134 | 135 | 136 | ## v0.0.1 137 | ### No issue 138 | 139 | **prepare for release 0.0.1** 140 | 141 | 142 | [edf1a99ce0ca183](https://github.com/jgitver/gradle-jgitver-plugin/commit/edf1a99ce0ca183) Matthieu Brouillard *2016-04-27 14:57:13* 143 | 144 | 145 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | 203 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # gradle-jgitver-plugin 2 | 3 | [![Build Status](https://travis-ci.org/jgitver/gradle-jgitver-plugin.svg?branch=master)](https://travis-ci.org/jgitver/gradle-jgitver-plugin) 4 | 5 | gradle plugin to define project version using [jgitver](https://github.com/jgitver/jgitver). 6 | 7 | In order to find the latest version published of [gradle-jgitver-plugin](https://github.com/jgitver/gradle-jgitver-plugin), go to the [gradle plugin portal](https://plugins.gradle.org/plugin/fr.brouillard.oss.gradle.jgitver). 8 | 9 | ## Usage 10 | 11 | see the project [build.gradle.kts](build.gradle.kts) to see how the project is using itself to manage its own versions. 12 | 13 | Find latest version of the plugin: [click here](https://plugins.gradle.org/plugin/fr.brouillard.oss.gradle.jgitver) 14 | 15 | ### Usage for modern gradle versions _(>= 2.1)_ 16 | 17 | ``` 18 | plugins { 19 | id "fr.brouillard.oss.gradle.jgitver" version "0.9.1" 20 | } 21 | ``` 22 | 23 | ### Usage for all gradle versions _(including < 2.1)_ 24 | ``` 25 | buildscript { 26 | repositories { 27 | maven { 28 | url "https://plugins.gradle.org/m2/" 29 | } 30 | } 31 | dependencies { 32 | classpath "gradle.plugin.fr.brouillard.oss.gradle:gradle-jgitver-plugin:0.9.1" 33 | } 34 | } 35 | 36 | apply plugin: 'fr.brouillard.oss.gradle.jgitver' 37 | ``` 38 | 39 | 40 | ## Documentation 41 | 42 | See [jgitver](https://github.com/jgitver/jgitver) for a full understanding of the possibilities and usage. 43 | 44 | You can also have a look at the maven equivalent: [jgitver-maven-plugin](https://github.com/jgitver/jgitver-maven-plugin). 45 | 46 | Finally have a look at the [configuration](#configuration) paragraph to have full control on the plugin. 47 | 48 | ![Gradle Example](src/doc/images/gradle-example.gif?raw=true "Gradle Example") 49 | 50 | ### Tasks 51 | 52 | #### Version 53 | 54 | Since 0.2.0 the plugin automatically registers a task `version` which you can call to print out the calculated version of your project: 55 | 56 | ``` 57 | $ ./gradlew version 58 | :version 59 | Version: 0.0.2-4 60 | 61 | BUILD SUCCESSFUL 62 | 63 | Total time: 5.769 secs 64 | ``` 65 | 66 | Before 0.2.0, in order to know the current version of your project, just print out the version in a task looking like the following: 67 | 68 | ``` 69 | task version { 70 | doLast { 71 | println 'Version: ' + version 72 | } 73 | } 74 | ``` 75 | 76 | then just call the task 77 | 78 | ``` 79 | $ ./gradlew version 80 | :version 81 | Version: 0.0.2-4 82 | 83 | BUILD SUCCESSFUL 84 | 85 | Total time: 5.769 secs 86 | ``` 87 | 88 | ### Configuration 89 | 90 | #### version >= 0.2.0 91 | 92 | Starting from `0.2.0` it is possible to configure the plugin inside the `build.gradle`. 93 | 94 | ~~~~ 95 | jgitver { 96 | strategy MAVEN | CONFIGURABLE | PATTERN 97 | mavenLike true/false (deprecated, use strategy instead) 98 | policy MAX | LATEST | NEAREST 99 | autoIncrementPatch true/false 100 | useDistance true/false 101 | useDirty true/false 102 | useSnapshot true/false 103 | failIfDirty true/false 104 | useGitCommitTimestamp true/false 105 | useGitCommitID true/false 106 | gitCommitIDLength integer 107 | maxDepth integer ( >= 0.7.0) 108 | nonQualifierBranches string (comma separated list of branches) 109 | versionPattern string (only for PATTERN strategy, >= 0.6.0) 110 | tagVersionPattern string (only for PATTERN strategy >= 0.6.0) 111 | policy { repeatable closure 112 | pattern string (regexp with capturing group) 113 | transformations array (array of string) 114 | } 115 | distanceCalculatorKind FIRST_PARENT | LOG | DEPTH 116 | } 117 | 118 | ~~~~ 119 | 120 | If you do not provide such a configuration (or fill only partial configuration) the following defaults will be used 121 | - _strategy_: `CONFIGURABLE` 122 | - _mavenLike_: `false` 123 | - _policy_: `MAX` 124 | - _autoIncrementPatch_: `true` 125 | - _useDistance_: `true` 126 | - _useDirty_: `false` 127 | - _useSnapshot_: `false` 128 | - _failIfDirty_: `false` 129 | - _useGitCommitTimestamp_: `false` 130 | - _useGitCommitID_: `false` 131 | - _gitCommitIDLength_: `8` 132 | - _maxDepth_: `Integer.MAX_VALUE` 133 | - _nonQualifierBranches_: `'master'` 134 | - _versionPattern_: no default value 135 | - _tagVersionPattern_: no default value 136 | - _regexVersionTag_: `'Java regexp pattern'` 137 | - if non set or null then [jgitver](https://github.com/jgitver/jgitver) default applies 138 | - the pattern must be a regular Java [Pattern](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html) string with one matching group 139 | - distanceCalculatorKind: `FIRST_PARENT` 140 | 141 | #### version < 0.2.0 142 | 143 | Before `0.2.0` no configuration was possible. 144 | The plugin used [jgitver](https://github.com/McFoggy/jgitver) with the following settings: 145 | 146 | - _mavenLike_: `false` 147 | - _autoIncrementPatch_: `true` 148 | - _nonQualifierBranches_: `'master'` 149 | - _useDistance_: `true` 150 | - _useGitCommitId_: `false` 151 | 152 | #### Configuration examples 153 | 154 | ##### provide specific branch policies 155 | 156 | Given the following configuration 157 | ``` 158 | jgitver { 159 | policy { 160 | pattern = 'feature_(.*)' 161 | transformations = ['REMOVE_UNEXPECTED_CHARS', 'UPPERCASE'] 162 | } 163 | policy { 164 | pattern = '(master)' 165 | transformations = ['IGNORE'] 166 | } 167 | } 168 | ``` 169 | 170 | when on branch `feature_login-page`, 3 commits after tag `1.0.0` then version resolution will be `1.0.1-3-LOGINPAGE` 171 | 172 | ``` 173 | $ gradlew version 174 | 175 | > Task :version 176 | Version: 1.0.1-3-LOGINPAGE 177 | ``` 178 | 179 | ### Metadatas 180 | 181 | Since `0.3.0`, jgitver [Metadatas](https://github.com/jgitver/jgitver/blob/master/src/main/java/fr/brouillard/oss/jgitver/metadata/Metadatas.java#L25) are exposed via gradle extension properties using the Metadata name in lower case. 182 | 183 | For example, one could enhance it's jar Manifest with the git commit id using: 184 | 185 | ``` 186 | apply plugin: 'java' 187 | apply plugin: 'fr.brouillard.oss.gradle.jgitver' 188 | 189 | jar { 190 | doFirst { 191 | manifest { 192 | manifest.attributes 'X-GIT-SHA1': "$project.ext.git_sha1_full" 193 | } 194 | } 195 | } 196 | ``` 197 | 198 | ### Building on detached HEAD 199 | 200 | When working on a __detached HEAD__, as often on CI environments behind a SCM webhook, no branch information exists anymore from git. 201 | Since `0.4.1` it now possible to provide externally the branch information via a system property or an environment variable. 202 | 203 | - all operating systems/shells: `gradlew version -Djgitver.branch=mybranch` 204 | - bash only (_zsh?_) one line: `JGITVER_BRANCH=mybranch && gradlew version` 205 | - *nix shell: 206 | - `export JGITVER_BRANCH=mybranch` 207 | - `gradlew version` 208 | - windows: 209 | - `SET JGITVER_BRANCH=mybranch` 210 | - `gradlew version` 211 | 212 | ## Local build & sample test project 213 | 214 | - `$ ./gradlew install version` will install the current version inside the local maven repository and will print the published version 215 | - minimal test project `build.gradle` file 216 | ````gradle 217 | buildscript { 218 | repositories { 219 | mavenLocal() 220 | } 221 | dependencies { 222 | classpath "fr.brouillard.oss.gradle:gradle-jgitver-plugin:0.3.2" 223 | } 224 | } 225 | apply plugin: 'fr.brouillard.oss.gradle.jgitver' 226 | ```` 227 | - test project `build.gradle` file with Maven like versioning 228 | ````gradle 229 | buildscript { 230 | repositories { 231 | mavenLocal() 232 | } 233 | dependencies { 234 | classpath "fr.brouillard.oss.gradle:gradle-jgitver-plugin:0.3.2" 235 | } 236 | } 237 | apply plugin: 'fr.brouillard.oss.gradle.jgitver' 238 | 239 | jgitver { 240 | mavenLike true 241 | } 242 | ```` 243 | 244 | ## Integration tests 245 | 246 | Some integration tests are available to make some manual trials/verifications of the plugin. 247 | 248 | ```` 249 | ./gradlew install version 250 | cd src/test/integration/test 251 | ./build.sh CONTEXT JGITVER_GRADLE_VERSION EXPECTED_COMPUTED_VERSION 252 | # example ./build.sh tag-regexp 0.5.1-2 2.0.1-1 253 | ```` 254 | 255 | ## Linux environment for windows users 256 | 257 | The easiest way to get started from Windows is to launch a docker container: 258 | 259 | - `docker -v run --rm -it -v %CD%:/project -w /project adoptopenjdk/openjdk8 /bin/bash` 260 | - `$ apt-get update && apt-get install -y git` 261 | 262 | ## Release 263 | 264 | - `git tag -a -s -m "release X.Y.Z, additionnal reason" X.Y.Z`: tag the current HEAD with the given tag name. The tag is signed by the author of the release. Adapt with gpg key of maintainer. 265 | - Matthieu Brouillard command: `git tag -a -s -u 2AB5F258 -m "release X.Y.Z, additionnal reason" X.Y.Z` 266 | - Matthieu Brouillard [public key](https://sks-keyservers.net/pks/lookup?op=get&search=0x8139E8632AB5F258) 267 | - `./gradlew publishPlugins` 268 | - `git push --follow-tags origin master` 269 | -------------------------------------------------------------------------------- /build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.gradle.plugin-publish") version "0.12.0" 3 | id("fr.brouillard.oss.gradle.jgitver") version "0.9.1" 4 | id("java-gradle-plugin") 5 | id("maven") // for local tests 6 | id("se.bjurr.gitchangelog.git-changelog-gradle-plugin") version "1.64" 7 | } 8 | 9 | group = "fr.brouillard.oss.gradle" 10 | 11 | jgitver { 12 | useDirty = true 13 | } 14 | 15 | repositories { 16 | mavenCentral() 17 | jcenter() 18 | maven { 19 | url = uri("https://oss.sonatype.org/content/groups/public/") 20 | } 21 | } 22 | 23 | gradlePlugin { 24 | plugins { 25 | create("jgitverPlugin") { 26 | displayName = "jgitver Gradle plugin" 27 | id = "fr.brouillard.oss.gradle.jgitver" 28 | implementationClass = "fr.brouillard.oss.gradle.plugins.JGitverPlugin" 29 | } 30 | } 31 | } 32 | 33 | pluginBundle { 34 | website = "https://github.com/jgitver/gradle-jgitver-plugin" 35 | vcsUrl = "https://github.com/jgitver/gradle-jgitver-plugin" 36 | description = "gradle plugin that defines automatically project version using jgitver" 37 | tags = listOf("versioning", "jgitver", "git") 38 | } 39 | 40 | dependencies { 41 | implementation("fr.brouillard.oss:jgitver:0.12.0") 42 | } 43 | 44 | java { 45 | sourceCompatibility = JavaVersion.VERSION_1_8 46 | targetCompatibility = JavaVersion.VERSION_1_8 47 | } 48 | 49 | tasks.register("changelog", se.bjurr.gitchangelog.plugin.gradle.GitChangelogTask::class) { 50 | file("CHANGELOG.md") 51 | } 52 | 53 | tasks.withType { 54 | options.isDeprecation = true 55 | } 56 | -------------------------------------------------------------------------------- /changelog.mustache: -------------------------------------------------------------------------------- 1 | # jgitver gradle plugin 2 | 3 | Changelog of [jgitver gradle plugin](https://github.com/jgitver/gradle-jgitver-plugin) 4 | 5 | {{#tags}} 6 | ## {{name}} 7 | {{#issues}} 8 | {{#hasIssue}} 9 | {{#hasLink}} 10 | ### {{name}} [{{issue}}]({{link}}) {{title}} 11 | {{/hasLink}} 12 | {{^hasLink}} 13 | ### {{name}} {{issue}} {{title}} 14 | {{/hasLink}} 15 | {{/hasIssue}} 16 | {{^hasIssue}} 17 | ### {{name}} 18 | {{/hasIssue}} 19 | 20 | {{#commits}} 21 | **{{{messageTitle}}}** 22 | 23 | {{#messageBodyItems}} 24 | * {{.}} 25 | {{/messageBodyItems}} 26 | 27 | [{{hash}}](https://github.com/jgitver/gradle-jgitver-plugin/commit/{{hash}}) {{authorName}} *{{commitTime}}* 28 | 29 | {{/commits}} 30 | 31 | {{/issues}} 32 | {{/tags}} -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgitver/gradle-jgitver-plugin/f266598a1d9daea1a6edd3d1012cceb7e1b40c8f/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-all.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS="" 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn ( ) { 37 | echo "$*" 38 | } 39 | 40 | die ( ) { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 158 | function splitJvmOpts() { 159 | JVM_OPTS=("$@") 160 | } 161 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 162 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 163 | 164 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 165 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | rootProject.name = "gradle-jgitver-plugin" 2 | -------------------------------------------------------------------------------- /src/doc/images/gradle-example.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgitver/gradle-jgitver-plugin/f266598a1d9daea1a6edd3d1012cceb7e1b40c8f/src/doc/images/gradle-example.gif -------------------------------------------------------------------------------- /src/doc/images/s1_linear_with_only_annotated_tags_autoIncrement.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgitver/gradle-jgitver-plugin/f266598a1d9daea1a6edd3d1012cceb7e1b40c8f/src/doc/images/s1_linear_with_only_annotated_tags_autoIncrement.gif -------------------------------------------------------------------------------- /src/main/java/fr/brouillard/oss/gradle/plugins/JGitverLazyVersionHolder.java: -------------------------------------------------------------------------------- 1 | package fr.brouillard.oss.gradle.plugins; 2 | 3 | import fr.brouillard.oss.jgitver.BranchingPolicy; 4 | import fr.brouillard.oss.jgitver.GitVersionCalculator; 5 | import fr.brouillard.oss.jgitver.Strategies; 6 | import fr.brouillard.oss.jgitver.metadata.MetadataProvider; 7 | import org.gradle.api.Project; 8 | 9 | import java.util.List; 10 | import java.util.Objects; 11 | import java.util.Optional; 12 | import java.util.function.Consumer; 13 | import java.util.stream.Collectors; 14 | 15 | public class JGitverLazyVersionHolder { 16 | private final Project project; 17 | private final JGitverPluginExtension jgitverConfiguration; 18 | private final Consumer versionConsumer; 19 | private GitVersionCalculator versionCalculator; 20 | 21 | public JGitverLazyVersionHolder( 22 | Project project, 23 | JGitverPluginExtension jgitverExtension, 24 | Consumer metadataConsumer 25 | ) { 26 | this.project = Objects.requireNonNull(project); 27 | this.jgitverConfiguration = Objects.requireNonNull(jgitverExtension); 28 | this.versionConsumer = Objects.requireNonNull(metadataConsumer); 29 | } 30 | 31 | public String toString() { 32 | computeVersion(); 33 | 34 | return versionCalculator.getVersion(); 35 | } 36 | 37 | public synchronized void computeVersion() { 38 | if (versionCalculator == null) { 39 | Optional oldDistanceKindSystemProperty = Optional.ofNullable(jgitverConfiguration.distanceCalculatorKind) 40 | .map(kind -> System.setProperty("jgitver.calculator.kind", kind.name())); 41 | 42 | try { 43 | versionCalculator = GitVersionCalculator.location(project.getRootDir()); 44 | 45 | if (Boolean.TRUE.equals(jgitverConfiguration.mavenLike)) { 46 | project.getLogger().info( 47 | "usage of deprecated 'mavenLike' parameter takes precedence over 'strategy: {}'", 48 | jgitverConfiguration.strategy 49 | ); 50 | versionCalculator.setStrategy(Strategies.MAVEN); 51 | } else { 52 | versionCalculator.setStrategy(jgitverConfiguration.strategy); 53 | } 54 | 55 | if (jgitverConfiguration.policy != null) { 56 | versionCalculator.setLookupPolicy(jgitverConfiguration.policy); 57 | } 58 | 59 | versionCalculator 60 | .setMaxDepth(jgitverConfiguration.maxDepth) 61 | .setAutoIncrementPatch(jgitverConfiguration.autoIncrementPatch) 62 | .setUseDistance(jgitverConfiguration.useDistance) 63 | .setUseDirty(jgitverConfiguration.useDirty) 64 | .setUseGitCommitTimestamp(jgitverConfiguration.useGitCommitTimestamp) 65 | .setUseGitCommitId(jgitverConfiguration.useGitCommitID) 66 | .setGitCommitIdLength(jgitverConfiguration.gitCommitIDLength) 67 | .setVersionPattern(jgitverConfiguration.versionPattern) 68 | .setTagVersionPattern(jgitverConfiguration.tagVersionPattern) 69 | .setNonQualifierBranches(jgitverConfiguration.nonQualifierBranches) 70 | .setUseSnapshot(jgitverConfiguration.useSnapshot); 71 | 72 | if (!jgitverConfiguration.policies.isEmpty()) { 73 | List branchingPolicies = jgitverConfiguration.policies.stream() 74 | .map(JGitverLazyVersionHolder::toBranchingPolicy) 75 | .collect(Collectors.toList()); 76 | versionCalculator.setQualifierBranchingPolicies(branchingPolicies); 77 | } 78 | 79 | if (jgitverConfiguration.regexVersionTag != null) { 80 | versionCalculator = versionCalculator.setFindTagVersionPattern(jgitverConfiguration.regexVersionTag); 81 | } 82 | 83 | versionCalculator.getVersion(true); 84 | versionConsumer.accept(versionCalculator); 85 | } finally { 86 | oldDistanceKindSystemProperty.ifPresent(oldVAlue -> System.setProperty("jgitver.calculator.kind", oldVAlue)); 87 | } 88 | } 89 | } 90 | 91 | private static BranchingPolicy toBranchingPolicy(JGitverPluginExtensionBranchPolicy gradleBranchPolicy) { 92 | return new BranchingPolicy(gradleBranchPolicy.pattern, gradleBranchPolicy.transformations); 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /src/main/java/fr/brouillard/oss/gradle/plugins/JGitverPlugin.java: -------------------------------------------------------------------------------- 1 | package fr.brouillard.oss.gradle.plugins; 2 | 3 | import java.time.ZonedDateTime; 4 | import java.time.format.DateTimeFormatter; 5 | import java.util.Arrays; 6 | import java.util.List; 7 | import java.util.Locale; 8 | import java.util.Optional; 9 | import java.util.function.Consumer; 10 | import java.util.stream.Collectors; 11 | 12 | import fr.brouillard.oss.jgitver.BranchingPolicy; 13 | import fr.brouillard.oss.jgitver.metadata.MetadataProvider; 14 | import org.gradle.api.Action; 15 | import org.gradle.api.Plugin; 16 | import org.gradle.api.Project; 17 | import org.gradle.tooling.BuildException; 18 | 19 | import fr.brouillard.oss.jgitver.GitVersionCalculator; 20 | import fr.brouillard.oss.jgitver.Strategies; 21 | import fr.brouillard.oss.jgitver.metadata.Metadatas; 22 | 23 | public class JGitverPlugin implements Plugin { 24 | @Override 25 | public void apply(Project project) { 26 | project.getExtensions().create("jgitver", JGitverPluginExtension.class, project); 27 | project.getTasks().create("version", JGitverVersionTask.class); 28 | 29 | JGitverPluginExtension jgitverConfiguration = project.getExtensions().findByType(JGitverPluginExtension.class); 30 | 31 | Consumer versionCalculatorConsumer = versionCalculator -> { 32 | boolean isDirty = versionCalculator 33 | .meta(Metadatas.DIRTY) 34 | .map(Boolean::parseBoolean) 35 | .orElse(Boolean.FALSE); 36 | 37 | if (jgitverConfiguration.useDirty && jgitverConfiguration.failIfDirty && isDirty) { 38 | IllegalStateException cause = new IllegalStateException("jgitver detected a dirty state, project is configured to fail"); 39 | throw new BuildException("jgitver stopped the build for a git dirty state", cause); 40 | } 41 | 42 | for (Metadatas metadata: Metadatas.values()) { 43 | versionCalculator.meta(metadata).ifPresent(metadataValue -> { 44 | project.getExtensions().getExtraProperties().set(metadata.name().toLowerCase(Locale.ENGLISH), metadataValue); 45 | project.getAllprojects().forEach( 46 | subproject -> subproject.getExtensions().getExtraProperties().set(metadata.name().toLowerCase(Locale.ENGLISH), metadataValue)); 47 | }); 48 | } 49 | }; 50 | 51 | JGitverLazyVersionHolder versionHolder = new JGitverLazyVersionHolder(project, jgitverConfiguration, versionCalculatorConsumer); 52 | project.setVersion(versionHolder); 53 | project.getAllprojects().forEach(subproject -> subproject.setVersion(versionHolder)); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/main/java/fr/brouillard/oss/gradle/plugins/JGitverPluginExtension.java: -------------------------------------------------------------------------------- 1 | package fr.brouillard.oss.gradle.plugins; 2 | 3 | import fr.brouillard.oss.jgitver.LookupPolicy; 4 | import fr.brouillard.oss.jgitver.Strategies; 5 | import fr.brouillard.oss.jgitver.impl.DistanceCalculator; 6 | import groovy.lang.Closure; 7 | import org.gradle.api.Project; 8 | 9 | import javax.inject.Inject; 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | 13 | public class JGitverPluginExtension { 14 | public Strategies strategy = Strategies.CONFIGURABLE; 15 | public LookupPolicy policy = LookupPolicy.MAX; 16 | @Deprecated 17 | public Boolean mavenLike = null; 18 | public Boolean autoIncrementPatch = Boolean.TRUE; 19 | public Boolean useDistance = Boolean.TRUE; 20 | public Boolean useDirty = Boolean.FALSE; 21 | public Boolean failIfDirty = Boolean.FALSE; 22 | public Boolean useGitCommitTimestamp = Boolean.FALSE; 23 | public Boolean useGitCommitID = Boolean.FALSE; 24 | public Boolean useSnapshot = Boolean.FALSE; 25 | public int gitCommitIDLength = 8; 26 | public int maxDepth = Integer.MAX_VALUE; 27 | public String nonQualifierBranches = "master"; 28 | public String versionPattern = null; 29 | public String tagVersionPattern = null; 30 | public String regexVersionTag = null; 31 | public DistanceCalculator.CalculatorKind distanceCalculatorKind = null; 32 | public List policies; 33 | private Project project; 34 | 35 | @Inject 36 | public JGitverPluginExtension(Project project) { 37 | this.project = project; 38 | this.policies = new ArrayList<>(); 39 | } 40 | 41 | public void policy(LookupPolicy policy) { 42 | this.policy = policy; 43 | } 44 | 45 | public void policy(String policy) { 46 | policy(LookupPolicy.valueOf(policy)); 47 | } 48 | 49 | public void strategy(Strategies strategy) { 50 | this.strategy = strategy; 51 | } 52 | 53 | public void strategy(String strategy) { 54 | strategy(Strategies.valueOf(strategy)); 55 | } 56 | 57 | public void mavenLike(boolean mavenLike) { 58 | this.mavenLike = mavenLike; 59 | } 60 | 61 | public void autoIncrementPatch(boolean autoIncrementPatch) { 62 | this.autoIncrementPatch = autoIncrementPatch; 63 | } 64 | 65 | public void useDistance(boolean useDistance) { 66 | this.useDistance = useDistance; 67 | } 68 | 69 | public void useDirty(boolean useDirty) { 70 | this.useDirty = useDirty; 71 | } 72 | 73 | public void failIfDirty(boolean failIfDirty) { 74 | this.failIfDirty = failIfDirty; 75 | } 76 | 77 | public void useGitCommitTimestamp(boolean useGitCommitTimestamp) { 78 | this.useGitCommitTimestamp = useGitCommitTimestamp; 79 | } 80 | 81 | public void regexVersionTag(String regexVersionTag) { 82 | this.regexVersionTag = regexVersionTag; 83 | } 84 | 85 | public void useGitCommitID(boolean useGitCommitID) { 86 | this.useGitCommitID = useGitCommitID; 87 | } 88 | 89 | public void useSnapshot(boolean useSnapshot) { 90 | this.useSnapshot = useSnapshot; 91 | } 92 | 93 | public void gitCommitIDLength(int gitCommitIDLength) { 94 | this.gitCommitIDLength = gitCommitIDLength; 95 | } 96 | 97 | public void maxDepth(int maxDepth) { 98 | this.maxDepth = maxDepth; 99 | } 100 | 101 | public void nonQualifierBranches(String nonQualifierBranches) { 102 | this.nonQualifierBranches = nonQualifierBranches; 103 | } 104 | 105 | public void versionPattern(String pattern) { 106 | this.versionPattern = pattern; 107 | } 108 | 109 | public void tagVersionPattern(String pattern) { 110 | this.tagVersionPattern = pattern; 111 | } 112 | 113 | public void policy(Closure closure) { 114 | JGitverPluginExtensionBranchPolicy policy = new JGitverPluginExtensionBranchPolicy(); 115 | project.configure(policy, closure); 116 | this.policies.add(policy); 117 | } 118 | 119 | public void distanceCalculatorKind(String kind) { 120 | this.distanceCalculatorKind = DistanceCalculator.CalculatorKind.valueOf(kind); 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /src/main/java/fr/brouillard/oss/gradle/plugins/JGitverPluginExtensionBranchPolicy.java: -------------------------------------------------------------------------------- 1 | package fr.brouillard.oss.gradle.plugins; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class JGitverPluginExtensionBranchPolicy { 7 | public String pattern; 8 | public List transformations = new ArrayList<>(); 9 | 10 | public void pattern(String pattern) { 11 | this.pattern = pattern; 12 | } 13 | public void transformations(List transformations) { 14 | if (transformations != null) { 15 | this.transformations = new ArrayList<>(transformations); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/fr/brouillard/oss/gradle/plugins/JGitverVersionTask.java: -------------------------------------------------------------------------------- 1 | package fr.brouillard.oss.gradle.plugins; 2 | 3 | import org.gradle.api.DefaultTask; 4 | import org.gradle.api.tasks.TaskAction; 5 | 6 | public class JGitverVersionTask extends DefaultTask { 7 | @TaskAction 8 | public void version() { 9 | System.out.println(String.format("Version: %s", getProject().getVersion())); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/test/integration/contexts/distance-default/expectation.txt: -------------------------------------------------------------------------------- 1 | ./build.sh distance-default $JGITVER_GRADLE_PLUGIN_VERSION 2.0.1-3 -------------------------------------------------------------------------------- /src/test/integration/contexts/distance-default/git-history.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | git --version 3 | rm -rf .git 4 | git init 5 | git config user.name nobody 6 | git config user.email nobody@nowhere.com 7 | dd if=/dev/urandom of=content bs=512 count=2 8 | git add . 9 | git commit --message=A_initial_commit_master 10 | git tag -a 2.0.0 --message=release_2.0.0 11 | git tag t0 12 | dd if=/dev/urandom of=content bs=512 count=2 13 | git add -u 14 | git commit --message=B_master 15 | dd if=/dev/urandom of=content bs=512 count=2 16 | git add -u 17 | git commit --message=C_master 18 | git checkout -b bugfix 2.0.0 19 | dd if=/dev/urandom of=content bs=512 count=2 20 | git add -u 21 | git commit --message=D_branch_bugfix 22 | git tag t2 23 | dd if=/dev/urandom of=content bs=512 count=2 24 | git add -u 25 | git commit --message=E_branch_bugfix 26 | dd if=/dev/urandom of=content bs=512 count=2 27 | git add -u 28 | git commit --message=F_branch_bugfix 29 | git tag t1 30 | git tag -a 1.0.0 --message=release_1.0.0 31 | sleep 2 32 | git tag -a 1.1.0 --message=release_1.1.0 t2 33 | git checkout master 34 | git merge --strategy-option theirs --message=merge_bugfix bugfix 35 | git status 36 | git log --graph --oneline --decorate=full -------------------------------------------------------------------------------- /src/test/integration/contexts/distance-default/jgitver.gradle: -------------------------------------------------------------------------------- 1 | jgitver { 2 | } -------------------------------------------------------------------------------- /src/test/integration/contexts/distance-depth/expectation.txt: -------------------------------------------------------------------------------- 1 | ./build.sh distance-depth $JGITVER_GRADLE_PLUGIN_VERSION 2.0.1-3 -------------------------------------------------------------------------------- /src/test/integration/contexts/distance-depth/git-history.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | git --version 3 | rm -rf .git 4 | git init 5 | git config user.name nobody 6 | git config user.email nobody@nowhere.com 7 | dd if=/dev/urandom of=content bs=512 count=2 8 | git add . 9 | git commit --message=A_initial_commit_master 10 | git tag -a 2.0.0 --message=release_2.0.0 11 | git tag t0 12 | dd if=/dev/urandom of=content bs=512 count=2 13 | git add -u 14 | git commit --message=B_master 15 | dd if=/dev/urandom of=content bs=512 count=2 16 | git add -u 17 | git commit --message=C_master 18 | git checkout -b bugfix 2.0.0 19 | dd if=/dev/urandom of=content bs=512 count=2 20 | git add -u 21 | git commit --message=D_branch_bugfix 22 | git tag t2 23 | dd if=/dev/urandom of=content bs=512 count=2 24 | git add -u 25 | git commit --message=E_branch_bugfix 26 | dd if=/dev/urandom of=content bs=512 count=2 27 | git add -u 28 | git commit --message=F_branch_bugfix 29 | git tag t1 30 | git tag -a 1.0.0 --message=release_1.0.0 31 | sleep 2 32 | git tag -a 1.1.0 --message=release_1.1.0 t2 33 | git checkout master 34 | git merge --strategy-option theirs --message=merge_bugfix bugfix 35 | git status 36 | git log --graph --oneline --decorate=full -------------------------------------------------------------------------------- /src/test/integration/contexts/distance-depth/jgitver.gradle: -------------------------------------------------------------------------------- 1 | jgitver { 2 | distanceCalculatorKind "DEPTH" 3 | } -------------------------------------------------------------------------------- /src/test/integration/contexts/distance-first_parent/expectation.txt: -------------------------------------------------------------------------------- 1 | ./build.sh distance-first_parent $JGITVER_GRADLE_PLUGIN_VERSION 2.0.1-3 -------------------------------------------------------------------------------- /src/test/integration/contexts/distance-first_parent/git-history.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | git --version 3 | rm -rf .git 4 | git init 5 | git config user.name nobody 6 | git config user.email nobody@nowhere.com 7 | dd if=/dev/urandom of=content bs=512 count=2 8 | git add . 9 | git commit --message=A_initial_commit_master 10 | git tag -a 2.0.0 --message=release_2.0.0 11 | git tag t0 12 | dd if=/dev/urandom of=content bs=512 count=2 13 | git add -u 14 | git commit --message=B_master 15 | dd if=/dev/urandom of=content bs=512 count=2 16 | git add -u 17 | git commit --message=C_master 18 | git checkout -b bugfix 2.0.0 19 | dd if=/dev/urandom of=content bs=512 count=2 20 | git add -u 21 | git commit --message=D_branch_bugfix 22 | git tag t2 23 | dd if=/dev/urandom of=content bs=512 count=2 24 | git add -u 25 | git commit --message=E_branch_bugfix 26 | dd if=/dev/urandom of=content bs=512 count=2 27 | git add -u 28 | git commit --message=F_branch_bugfix 29 | git tag t1 30 | git tag -a 1.0.0 --message=release_1.0.0 31 | sleep 2 32 | git tag -a 1.1.0 --message=release_1.1.0 t2 33 | git checkout master 34 | git merge --strategy-option theirs --message=merge_bugfix bugfix 35 | git status 36 | git log --graph --oneline --decorate=full -------------------------------------------------------------------------------- /src/test/integration/contexts/distance-first_parent/jgitver.gradle: -------------------------------------------------------------------------------- 1 | jgitver { 2 | distanceCalculatorKind "FIRST_PARENT" 3 | } -------------------------------------------------------------------------------- /src/test/integration/contexts/distance-log/expectation.txt: -------------------------------------------------------------------------------- 1 | ./build.sh distance-log $JGITVER_GRADLE_PLUGIN_VERSION 2.0.1-6 -------------------------------------------------------------------------------- /src/test/integration/contexts/distance-log/git-history.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | git --version 3 | rm -rf .git 4 | git init 5 | git config user.name nobody 6 | git config user.email nobody@nowhere.com 7 | dd if=/dev/urandom of=content bs=512 count=2 8 | git add . 9 | git commit --message=A_initial_commit_master 10 | git tag -a 2.0.0 --message=release_2.0.0 11 | git tag t0 12 | dd if=/dev/urandom of=content bs=512 count=2 13 | git add -u 14 | git commit --message=B_master 15 | dd if=/dev/urandom of=content bs=512 count=2 16 | git add -u 17 | git commit --message=C_master 18 | git checkout -b bugfix 2.0.0 19 | dd if=/dev/urandom of=content bs=512 count=2 20 | git add -u 21 | git commit --message=D_branch_bugfix 22 | git tag t2 23 | dd if=/dev/urandom of=content bs=512 count=2 24 | git add -u 25 | git commit --message=E_branch_bugfix 26 | dd if=/dev/urandom of=content bs=512 count=2 27 | git add -u 28 | git commit --message=F_branch_bugfix 29 | git tag t1 30 | git tag -a 1.0.0 --message=release_1.0.0 31 | sleep 2 32 | git tag -a 1.1.0 --message=release_1.1.0 t2 33 | git checkout master 34 | git merge --strategy-option theirs --message=merge_bugfix bugfix 35 | git status 36 | git log --graph --oneline --decorate=full -------------------------------------------------------------------------------- /src/test/integration/contexts/distance-log/jgitver.gradle: -------------------------------------------------------------------------------- 1 | jgitver { 2 | distanceCalculatorKind "LOG" 3 | } -------------------------------------------------------------------------------- /src/test/integration/contexts/maven-like/git-history.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | git --version 4 | rm -rf .git 5 | git init 6 | git config user.name nobody 7 | git config user.email nobody@nowhere.com 8 | dd if=/dev/urandom of=content bs=512 count=2 9 | git add . 10 | git commit --message=initial_commit 11 | git status 12 | git log --graph --oneline --decorate=full 13 | -------------------------------------------------------------------------------- /src/test/integration/contexts/maven-like/jgitver.gradle: -------------------------------------------------------------------------------- 1 | jgitver { 2 | mavenLike true 3 | } -------------------------------------------------------------------------------- /src/test/integration/contexts/merged-branches/git-history.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | git --version 4 | rm -rf .git 5 | git init 6 | git config user.name nobody 7 | git config user.email nobody@nowhere.com 8 | dd if=/dev/urandom of=content bs=512 count=2 9 | git add . 10 | git commit --message=initial_commit 11 | git tag -a 1.0.0 --message=release_1.0.0 12 | git checkout -b bugfix 13 | dd if=/dev/urandom of=content bs=512 count=2 14 | git add -u 15 | git commit --message=modif_on_C 16 | git tag -a 1.1.0 --message=release_1.1.0 17 | git checkout master 18 | dd if=/dev/urandom of=content bs=512 count=2 19 | git add -u 20 | git commit --message=modif_on_B 21 | git tag -a 2.0.0 --message=release_2.0.0 22 | git merge --strategy-option theirs --message=merge_bugfix bugfix 23 | git status 24 | git log --graph --oneline --decorate=full 25 | -------------------------------------------------------------------------------- /src/test/integration/contexts/merged-branches/jgitver.gradle: -------------------------------------------------------------------------------- 1 | jgitver { 2 | mavenLike false 3 | } -------------------------------------------------------------------------------- /src/test/integration/contexts/policy-latest/expectation.txt: -------------------------------------------------------------------------------- 1 | ./build.sh policy-latest $JGITVER_GRADLE_PLUGIN_VERSION 1.1.1-2 -------------------------------------------------------------------------------- /src/test/integration/contexts/policy-latest/git-history.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | git --version 3 | rm -rf .git 4 | git init 5 | git config user.name nobody 6 | git config user.email nobody@nowhere.com 7 | dd if=/dev/urandom of=content bs=512 count=2 8 | git add . 9 | git commit --message=A_initial_commit_master 10 | git tag -a 2.0.0 --message=release_2.0.0 11 | git tag t0 12 | dd if=/dev/urandom of=content bs=512 count=2 13 | git add -u 14 | git commit --message=B_master 15 | dd if=/dev/urandom of=content bs=512 count=2 16 | git add -u 17 | git commit --message=C_master 18 | git checkout -b bugfix 2.0.0 19 | dd if=/dev/urandom of=content bs=512 count=2 20 | git add -u 21 | git commit --message=D_branch_bugfix 22 | git tag t2 23 | dd if=/dev/urandom of=content bs=512 count=2 24 | git add -u 25 | git commit --message=E_branch_bugfix 26 | git tag t1 27 | git tag -a 1.0.0 --message=release_1.0.0 28 | sleep 2 29 | git tag -a 1.1.0 --message=release_1.1.0 t2 30 | git checkout master 31 | git merge --strategy-option theirs --message=merge_bugfix bugfix 32 | git status 33 | git log --graph --oneline --decorate=full -------------------------------------------------------------------------------- /src/test/integration/contexts/policy-latest/jgitver.gradle: -------------------------------------------------------------------------------- 1 | jgitver { 2 | policy "LATEST" 3 | } -------------------------------------------------------------------------------- /src/test/integration/contexts/policy-max/expectation.txt: -------------------------------------------------------------------------------- 1 | ./build.sh policy-max $JGITVER_GRADLE_PLUGIN_VERSION 2.0.1-3 -------------------------------------------------------------------------------- /src/test/integration/contexts/policy-max/git-history.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | git --version 3 | rm -rf .git 4 | git init 5 | git config user.name nobody 6 | git config user.email nobody@nowhere.com 7 | dd if=/dev/urandom of=content bs=512 count=2 8 | git add . 9 | git commit --message=A_initial_commit_master 10 | git tag -a 2.0.0 --message=release_2.0.0 11 | git tag t0 12 | dd if=/dev/urandom of=content bs=512 count=2 13 | git add -u 14 | git commit --message=B_master 15 | dd if=/dev/urandom of=content bs=512 count=2 16 | git add -u 17 | git commit --message=C_master 18 | git checkout -b bugfix 2.0.0 19 | dd if=/dev/urandom of=content bs=512 count=2 20 | git add -u 21 | git commit --message=D_branch_bugfix 22 | git tag t2 23 | dd if=/dev/urandom of=content bs=512 count=2 24 | git add -u 25 | git commit --message=E_branch_bugfix 26 | git tag t1 27 | git tag -a 1.0.0 --message=release_1.0.0 28 | sleep 2 29 | git tag -a 1.1.0 --message=release_1.1.0 t2 30 | git checkout master 31 | git merge --strategy-option theirs --message=merge_bugfix bugfix 32 | git status 33 | git log --graph --oneline --decorate=full -------------------------------------------------------------------------------- /src/test/integration/contexts/policy-max/jgitver.gradle: -------------------------------------------------------------------------------- 1 | jgitver { 2 | } -------------------------------------------------------------------------------- /src/test/integration/contexts/policy-nearest/expectation.txt: -------------------------------------------------------------------------------- 1 | ./build.sh policy-nearest $JGITVER_GRADLE_PLUGIN_VERSION 1.0.1-1 -------------------------------------------------------------------------------- /src/test/integration/contexts/policy-nearest/git-history.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | git --version 3 | rm -rf .git 4 | git init 5 | git config user.name nobody 6 | git config user.email nobody@nowhere.com 7 | dd if=/dev/urandom of=content bs=512 count=2 8 | git add . 9 | git commit --message=A_initial_commit_master 10 | git tag -a 2.0.0 --message=release_2.0.0 11 | git tag t0 12 | dd if=/dev/urandom of=content bs=512 count=2 13 | git add -u 14 | git commit --message=B_master 15 | dd if=/dev/urandom of=content bs=512 count=2 16 | git add -u 17 | git commit --message=C_master 18 | git checkout -b bugfix 2.0.0 19 | dd if=/dev/urandom of=content bs=512 count=2 20 | git add -u 21 | git commit --message=D_branch_bugfix 22 | git tag t2 23 | dd if=/dev/urandom of=content bs=512 count=2 24 | git add -u 25 | git commit --message=E_branch_bugfix 26 | git tag t1 27 | git tag -a 1.0.0 --message=release_1.0.0 28 | sleep 2 29 | git tag -a 1.1.0 --message=release_1.1.0 t2 30 | git checkout master 31 | git merge --strategy-option theirs --message=merge_bugfix bugfix 32 | git status 33 | git log --graph --oneline --decorate=full -------------------------------------------------------------------------------- /src/test/integration/contexts/policy-nearest/jgitver.gradle: -------------------------------------------------------------------------------- 1 | jgitver { 2 | policy "NEAREST" 3 | } -------------------------------------------------------------------------------- /src/test/integration/contexts/tag-regexp/git-history.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | git --version 4 | rm -rf .git 5 | git init 6 | git config user.name nobody 7 | git config user.email nobody@nowhere.com 8 | dd if=/dev/urandom of=content bs=512 count=2 9 | git add . 10 | git commit --message=initial_commit 11 | git tag -a -m "1.0" 1.0 12 | dd if=/dev/urandom of=content bs=512 count=2 13 | git add . 14 | git commit --message=second_commit 15 | git tag -a -m "r2.0" r2.0 16 | dd if=/dev/urandom of=content bs=512 count=2 17 | git add . 18 | git commit --message=third_commit 19 | git tag -a -m "v3.0" v3.0 20 | git status 21 | git log --graph --oneline --decorate=full 22 | -------------------------------------------------------------------------------- /src/test/integration/contexts/tag-regexp/jgitver.gradle: -------------------------------------------------------------------------------- 1 | jgitver { 2 | mavenLike false 3 | regexVersionTag 'r(.*)' 4 | } -------------------------------------------------------------------------------- /src/test/integration/contexts/v1.2-tags-regexp/git-history.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | git --version 4 | rm -rf .git 5 | git init 6 | git config user.name nobody 7 | git config user.email nobody@nowhere.com 8 | dd if=/dev/urandom of=content bs=512 count=2 9 | git add . 10 | git commit --message=initial_commit 11 | git tag -a -m "v1.1.0" v1.1.0 12 | dd if=/dev/urandom of=content bs=512 count=2 13 | git add . 14 | git commit --message=commit_1_2_0 15 | git tag -a -m "v1.2.0" v1.2.0 16 | dd if=/dev/urandom of=content bs=512 count=2 17 | git add . 18 | git commit --message=commit_1_2_1 19 | git tag -a -m "v1.2.1" v1.2.1 20 | dd if=/dev/urandom of=content bs=512 count=2 21 | git add . 22 | git commit --message=commit_1_2_2 23 | git tag -a -m "v1.2.2" v1.2.2 24 | dd if=/dev/urandom of=content bs=512 count=2 25 | git add . 26 | git commit --message=third_commit 27 | git tag -a -m "v1.3.0" v1.3.0 28 | git status 29 | git log --graph --oneline --decorate=full 30 | -------------------------------------------------------------------------------- /src/test/integration/contexts/v1.2-tags-regexp/jgitver.gradle: -------------------------------------------------------------------------------- 1 | jgitver { 2 | mavenLike false 3 | regexVersionTag 'v(1\\.2.*)' 4 | } -------------------------------------------------------------------------------- /src/test/integration/contexts/version-strategy-normal/git-history.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | git --version 4 | rm -rf .git 5 | git init 6 | git config user.name nobody 7 | git config user.email nobody@nowhere.com 8 | dd if=/dev/urandom of=content bs=512 count=2 9 | git add . 10 | git commit --message=initial_commit_A 11 | git tag -a --message=tag_1.0.0 1.0.0 12 | dd if=/dev/urandom of=content bs=512 count=2 13 | git add -u 14 | git commit --message=commit_B 15 | git status 16 | git log --graph --oneline --decorate=full 17 | -------------------------------------------------------------------------------- /src/test/integration/contexts/version-strategy-normal/jgitver.gradle: -------------------------------------------------------------------------------- 1 | jgitver { 2 | strategy "PATTERN" 3 | versionPattern "\${v}-standard" 4 | tagVersionPattern "\${v}-tag" 5 | } -------------------------------------------------------------------------------- /src/test/integration/contexts/version-strategy-tag/git-history.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | git --version 4 | rm -rf .git 5 | git init 6 | git config user.name nobody 7 | git config user.email nobody@nowhere.com 8 | dd if=/dev/urandom of=content bs=512 count=2 9 | git add . 10 | git commit --message=initial_commit_A 11 | git tag -a --message=tag_1.0.0 1.0.0 12 | dd if=/dev/urandom of=content bs=512 count=2 13 | git add -u 14 | git commit --message=commit_B 15 | git tag -a --message=tag_2.0.0 2.0.0 16 | git status 17 | git log --graph --oneline --decorate=full 18 | -------------------------------------------------------------------------------- /src/test/integration/contexts/version-strategy-tag/jgitver.gradle: -------------------------------------------------------------------------------- 1 | jgitver { 2 | strategy "PATTERN" 3 | versionPattern "\${v}-standard" 4 | tagVersionPattern "\${v}-tag" 5 | } -------------------------------------------------------------------------------- /src/test/integration/test/.gitignore: -------------------------------------------------------------------------------- 1 | build.gradle-* 2 | .gradle/ 3 | -------------------------------------------------------------------------------- /src/test/integration/test/base-build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | repositories { 3 | mavenLocal() 4 | maven { 5 | url "https://plugins.gradle.org/m2/" 6 | } 7 | jcenter() 8 | } 9 | dependencies { 10 | classpath "fr.brouillard.oss.gradle:gradle-jgitver-plugin:${System.env.JGITVER_GRADLE_VERSION}" 11 | } 12 | } 13 | 14 | repositories { 15 | jcenter() 16 | } 17 | apply plugin: 'fr.brouillard.oss.gradle.jgitver' 18 | 19 | -------------------------------------------------------------------------------- /src/test/integration/test/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # find the scripts directory, cd to it and back after the script run 4 | # this will work if it is not symlinked, see for details here: 5 | # https://stackoverflow.com/questions/59895/how-to-get-the-source-directory-of-a-bash-script-from-within-the-script-itself 6 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" 7 | pushd $DIR 8 | trap "popd" EXIT 9 | 10 | if [[ $# -ne 3 ]] ; then 11 | echo 'Usage: bash build.sh CONTEXT JGITVER_GRADLE_VERSION EXPECTED_COMPUTED_VERSION' 12 | echo '' 13 | echo 'Example: bash build.sh merged-branches 0.5.1-2 2.0.1-1' 14 | echo '' 15 | exit 1 16 | fi 17 | 18 | if [[ -f ../contexts/$1/jgitver.gradle ]] ; then 19 | if [[ -f ../contexts/$1/git-history.sh ]] ; then 20 | ../contexts/$1/git-history.sh 21 | cat base-build.gradle ../contexts/$1/jgitver.gradle > build.gradle 22 | (export JGITVER_GRADLE_VERSION=$2 && ./gradlew -b build.gradle version) | tee build.log 23 | COMPUTED_VERSION=`grep Version: build.log | cut -f 2 -d ' '` 24 | rm build.log 25 | if [ "$COMPUTED_VERSION" != "$3" ]; then 26 | echo Error: computed version $COMPUTED_VERSION differs from expected version $3 27 | exit 2 28 | fi 29 | else 30 | echo Missing build-$1.sh found 31 | fi 32 | else 33 | echo Missing build.gradle-$1 found 34 | fi -------------------------------------------------------------------------------- /src/test/integration/test/clean.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | rm -rf .git 4 | rm -rf .gradle 5 | rm -f ./content 6 | rm -f ./build.gradle -------------------------------------------------------------------------------- /src/test/integration/test/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgitver/gradle-jgitver-plugin/f266598a1d9daea1a6edd3d1012cceb7e1b40c8f/src/test/integration/test/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /src/test/integration/test/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-all.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /src/test/integration/test/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS="" 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn ( ) { 37 | echo "$*" 38 | } 39 | 40 | die ( ) { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 158 | function splitJvmOpts() { 159 | JVM_OPTS=("$@") 160 | } 161 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 162 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 163 | 164 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 165 | -------------------------------------------------------------------------------- /src/test/integration/test/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /src/test/integration/test/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jgitver/gradle-jgitver-plugin/f266598a1d9daea1a6edd3d1012cceb7e1b40c8f/src/test/integration/test/settings.gradle --------------------------------------------------------------------------------