├── release.edn ├── deps.edn ├── README.md ├── src └── applied_science │ └── deps_library.clj └── LICENSE /release.edn: -------------------------------------------------------------------------------- 1 | {:group-id "applied-science" 2 | :artifact-id "deps-library" 3 | :scm-url "https://github.com/applied-science/deps-library" 4 | 5 | ;; see deps-library.release/default-opts 6 | 7 | } -------------------------------------------------------------------------------- /deps.edn: -------------------------------------------------------------------------------- 1 | {:paths ["src"] 2 | :deps {seancorfield/depstar {:mvn/version "0.5.2"} 3 | com.workframe/garamond {:mvn/version "0.4.0"} 4 | deps-deploy {:mvn/version "0.0.9"}} 5 | :aliases 6 | {:release 7 | {:main-opts ["-m" "applied-science.deps-library" 8 | ;; options can also be passed in here: 9 | ; "--artifact-id" "applied-science" 10 | ; "--group-id" "deps-library" 11 | ; "--scm-url" "https://github.com/applied-science/deps-library" 12 | ]}}} -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # deps-library 2 | 3 | ![Version Badge](https://img.shields.io/clojars/v/applied-science/deps-library) 4 | 5 | To publish a small Clojure library to Clojars should be a simple thing. 6 | 7 | ---- 8 | 9 | As a library author, my needs are simple: 10 | 11 | 1. Bump the version when ready for a release 12 | 2. Ship the code to Clojars 13 | 14 | With `deps-library` this is possible using just one small config file. From that we 15 | create a `pom.xml` (using [garamond](https://github.com/workframers/garamond)) 16 | and thin jar (using [depstar](https://github.com/seancorfield/depstar)), and 17 | deploy to clojars (using [deps-deploy](https://github.com/slipset/deps-deploy)). 18 | 19 | This library is deployed using itself. 20 | 21 | ## Usage 22 | 23 | Create a `release.edn` file in your project root, eg: 24 | 25 | ```clj 26 | {:group-id "applied-science" 27 | :artifact-id "deps-library" 28 | :scm-url "https://github.com/applied-science/deps-library"} 29 | ``` 30 | 31 | Add a `:release` alias to your `deps.edn` as follows: 32 | 33 | ```clj 34 | :aliases 35 | {:release 36 | {:extra-deps {applied-science/deps-library {:mvn/version "VERSION"}} 37 | :main-opts ["-m" "applied-science.deps-library"]}} 38 | ``` 39 | 40 | Make sure `CLOJARS_USERNAME` and `CLOJARS_PASSWORD` environment variables are set 41 | (unless you are passing in `--clojars-username` and `--clojars-password` directly). 42 | For example, add the following to your `~/.bashrc` or `~/.zshrc` or equivalent: 43 | 44 | ```sh 45 | export CLOJARS_USERNAME="XYZ" 46 | export CLOJARS_PASSWORD="XYZ" 47 | ``` 48 | 49 | Create an initial version tag (if you haven't already) 50 | 51 | ```sh 52 | git tag v0.1.0 53 | ``` 54 | 55 | Release a new version (tag + pom + jar + deploy): 56 | 57 | ```sh 58 | clj -A:release --patch # patch, minor, or major 59 | ``` 60 | 61 | That's it. 62 | 63 | To release the current version (pom + jar + deploy): 64 | 65 | ```sh 66 | clj -A:release 67 | ``` 68 | 69 | To just tag a new version: 70 | 71 | ```sh 72 | clj -A:release tag --patch # patch, minor, or major 73 | ``` 74 | 75 | ## Rationale 76 | 77 | [tools.deps](https://github.com/clojure/tools.deps.alpha) brought "git deps" to Clojure, making it 78 | easy to consume small libraries without any extra effort. However, for production code we often want 79 | to depend only on pinned versions that are stored on reliable, public, immutable repositories like 80 | Clojars rather than rely on GitHub repositories, which are more easily moved/deleted. 81 | 82 | There are four distinct steps in the release process (tag, pom, jar, deploy). In isolation, each step 83 | is already adequately covered by a number of different tools. However, tying them all together is 84 | enough of a pain (~one page of code, understanding & configuring each tool) that it discourages versioned 85 | releases of small libraries. `deps-library` should make the process relatively painless. 86 | 87 | ## Versioning 88 | 89 | By default (via [garamond](https://github.com/workframers/garamond)), versions are managed 90 | via git tags and are not stored in source code. This means we can release new versions without making any 91 | extra commits to update version numbers. Versions created this way can be easily browsed on GitHub 92 | (be sure to push with `--follow-tags`) and major CI services are easily configured to run workflows triggered 93 | by tagged commits. 94 | 95 | Alternatively, you can pass a `--version` argument at the command line, or add a `:version` to your 96 | `release.edn` file (in which case you must handle incrementing the version yourself). 97 | 98 | ## CLI 99 | 100 | ### Commands 101 | 102 | eg. `clj -A:release <...options>` 103 | 104 | Core flow: 105 | 106 | - _default_ (no command) runs tag + pom + jar + deploy 107 | - **tag** - creates git tag. if an increment is specified, increments the version first. 108 | - **pom** - creates pom.xml file 109 | - **jar** - creates thin jar 110 | - **deploy** - deploys to clojars 111 | 112 | Other commands: 113 | 114 | - **install** - install version to local maven repo (runs tag + pom + jar) 115 | - **version** - prints version according to given options/environment 116 | 117 | ### Options 118 | 119 | The `release.edn` file itself is optional - all config can be also be passed in via the command line: 120 | 121 | ``` 122 | -v, --version VERSION Specify a fixed version 123 | -i, --incr INCREMENT Increment the current version 124 | --skip-tag Do not create a git tag for this version 125 | --prefix PREFIX v Version prefix for git tag 126 | --patch Increment patch version 127 | --minor Increment minor version 128 | --major Increment major version 129 | --config CONFIG release.edn Path to EDN options file 130 | --group-id GROUP-ID 131 | --artifact-id ARTIFACT-ID 132 | --scm-url SCM-URL The source control management URL (eg. github url) 133 | --clojars-username CLOJARS-USERNAME environment variable Your Clojars username 134 | --clojars-password CLOJARS-PASSWORD environment variable Your Clojars password 135 | --dry-run Print expected actions, avoiding any side effects 136 | -h, --help Print CLI options 137 | 138 | ``` 139 | 140 | All command-line args are also valid keys for inclusion in `release.edn` (except `--config` for obvious reasons). -------------------------------------------------------------------------------- /src/applied_science/deps_library.clj: -------------------------------------------------------------------------------- 1 | (ns applied-science.deps-library 2 | (:require [clojure.edn :as edn] 3 | [clojure.tools.cli :as cli] 4 | [clojure.java.io :as io] 5 | [deps-deploy.deps-deploy :as deps-deploy] 6 | [garamond.git :as git] 7 | [garamond.pom :as pom] 8 | [garamond.version :as v] 9 | [garamond.util :refer [exit]] 10 | [hf.depstar.uberjar :as uberjar] 11 | [clojure.string :as str] 12 | [taoensso.timbre :as timbre])) 13 | 14 | (defn default-options [{:as cli-options 15 | :keys [clojars-username clojars-password]}] 16 | (let [{:as status :keys [version prefix]} (try (git/current-status) 17 | (catch java.lang.NullPointerException e nil))] 18 | {:jar/path "target/project.jar" 19 | :jar/type :thin 20 | :git/status status 21 | :version version 22 | :prefix (or prefix "v") 23 | :skip-tag false 24 | :repository {"clojars" {:url "https://clojars.org/repo" 25 | :username (or clojars-username (System/getenv "CLOJARS_USERNAME")) 26 | :password (or clojars-password (System/getenv "CLOJARS_PASSWORD"))}}})) 27 | 28 | (defn sanitize-options 29 | "Removes sensitive details from options (for logging)" 30 | [options] 31 | (let [assoc-if (fn [m k v] (if (m k) (assoc m k v) m))] 32 | (-> options 33 | (assoc-if :clojars-password "XXXX") 34 | (update-in [:repository "clojars"] assoc-if :password "XXXX")))) 35 | 36 | (defn fail! [message options] 37 | (throw (ex-info (str "\n" message) (sanitize-options options)))) 38 | 39 | (defn parse-version [version prefix] 40 | (-> version 41 | (str/replace-first prefix "") 42 | (v/parse))) 43 | 44 | (defn tag [{:as options :keys [version git/status]}] 45 | (let [tag (v/to-string version options)] 46 | (println (str "Tag... " tag)) 47 | (when-not (:dry-run options) 48 | (try (git/tag! version options status) 49 | (catch Exception e 50 | (case (:code (ex-data e)) 51 | 128 (println (str " - tag already exists (" tag "), continuing")) 52 | (throw e)))))) 53 | options) 54 | 55 | (defn pom [{:as options :keys [version]}] 56 | (println (str "POM... " (str (:group-id options) "/" (:artifact-id options) 57 | " {:mvn/version \"" (:version options) "\"}"))) 58 | (when-not (:dry-run options) 59 | (pom/generate! version options)) 60 | options) 61 | 62 | (defn jar [{:as options :keys [jar/path jar/type]}] 63 | (println (str "JAR... " path " (" (name type) ")")) 64 | (when-not (:dry-run options) 65 | (uberjar/uber-main {:dest path :jar type} 66 | (:depstar/uber-main options))) 67 | options) 68 | 69 | (defn deploy [{:as options :keys [jar/path]}] 70 | (println (str "Deploy... " (-> options sanitize-options :repository ffirst))) 71 | (when-not (:dry-run options) 72 | (deps-deploy/-main "deploy" path)) 73 | options) 74 | 75 | (defn install [{:as options :keys [jar/path]}] 76 | (println (str "Install... ")) 77 | (when-not (:dry-run options) 78 | (deps-deploy/-main "install" path)) 79 | options) 80 | 81 | (def cmd-opts 82 | [["-v" "--version VERSION" "Specify a fixed version"] 83 | ["-i" "--incr INCREMENT" "Increment the current version"] 84 | [nil "--skip-tag" "Do not create a git tag for this version" 85 | :default-desc false] 86 | [nil "--prefix PREFIX" "Version prefix for git tag" 87 | :default-desc "v"] 88 | [nil "--patch" "Increment patch version"] 89 | [nil "--minor" "Increment minor version"] 90 | [nil "--major" "Increment major version"] 91 | [nil "--config CONFIG" "Path to EDN options file" 92 | :default "release.edn"] 93 | [nil "--group-id GROUP-ID"] 94 | [nil "--artifact-id ARTIFACT-ID"] 95 | [nil "--scm-url SCM-URL" "The source control management URL (eg. github url)"] 96 | [nil "--clojars-username CLOJARS-USERNAME" "Your Clojars username" 97 | :default-desc "environment variable"] 98 | [nil "--clojars-password CLOJARS-PASSWORD" "Your Clojars password" 99 | :default-desc "environment variable"] 100 | [nil "--dry-run" "Print expected actions, avoiding any side effects"] 101 | ["-h" "--help" "Print CLI options"]]) 102 | 103 | (defn main [& args] 104 | (let [{cli-options :options 105 | :keys [summary]} (cli/parse-opts args cmd-opts) 106 | file-options (some-> (:config cli-options) 107 | (io/file) 108 | (as-> file (when (.exists file) file)) 109 | (slurp) 110 | (edn/read-string)) 111 | options (merge (default-options cli-options) 112 | file-options 113 | cli-options) 114 | incr-type (cond (:incr options) (keyword (:incr options)) 115 | (:patch options) :patch 116 | (:minor options) :minor 117 | (:major options) :major) 118 | options (-> options 119 | (update :prefix #(or % "v")) 120 | (update :version #(cond-> % 121 | (string? %) (parse-version (:prefix options)) 122 | incr-type (v/increment incr-type)))) 123 | force-static-version (or (:version cli-options) 124 | (:version file-options)) 125 | COMMAND (first args)] 126 | (if (:help options) 127 | (println summary) 128 | (do 129 | (some-> (cond (nil? (:version options)) 130 | (if force-static-version 131 | (format "Invalid version: %s" force-static-version) 132 | (format (str "No version specified. " 133 | "Add a starting tag (eg. git tag v0.1.0), " 134 | "pass a --version argument, or include a :version " 135 | "in %s.") 136 | (:config cli-options))) 137 | 138 | (and incr-type force-static-version) 139 | (format "Cannot increment a version specified via CLI or file (%s - %s)" 140 | force-static-version incr-type) 141 | 142 | (and (-> options :git/status :git :dirty?) 143 | (not (:dry-run options)) 144 | (not (#{"install" 145 | "version"} COMMAND))) 146 | "Current repository has uncommitted work. Please commit your changes and retry.") 147 | (fail! options)) 148 | 149 | (when (:dry-run options) (println "DRY RUN")) 150 | 151 | (timbre/set-level! :warn) 152 | 153 | (case COMMAND 154 | "version" (println (v/to-string (:version options) options) 155 | (str "(" (or (some-> incr-type name) "no change") ")")) 156 | "tag" (tag options) 157 | "release" (-> options 158 | (cond-> (not (:skip-tag options)) (tag)) 159 | (pom) 160 | (jar) 161 | (deploy)) 162 | "pom" (pom options) 163 | "jar" (jar options) 164 | "deploy" (deploy options) 165 | "install" (-> options 166 | (pom) 167 | (jar) 168 | (install)) 169 | (apply main "release" args)))))) 170 | 171 | (defn -main [& args] 172 | (apply main args) 173 | (System/exit 0)) 174 | 175 | (comment 176 | (main "--dry-run")) 177 | 178 | ;; Examples 179 | ;; 180 | ;; TAG 181 | ;; 182 | ;; clj -A:release tag # current version 183 | ;; 184 | ;; clj -A:release tag --patch # incremented version 185 | ;; clj -A:release tag --minor 186 | ;; clj -A:release tag --major 187 | ;; 188 | ;; clj -A:release tag -v 0.1.2-alpha # force version 189 | ;; 190 | ;; RELEASE 191 | ;; 192 | ;; clj -A:release # current version 193 | ;; clj -A:release --patch # incremented version 194 | ;; clj -A:release -v 0.1.2 # force version 195 | 196 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Eclipse Public License - v 2.0 2 | 3 | THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE 4 | PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION 5 | OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. 6 | 7 | 1. DEFINITIONS 8 | 9 | "Contribution" means: 10 | 11 | a) in the case of the initial Contributor, the initial content 12 | Distributed under this Agreement, and 13 | 14 | b) in the case of each subsequent Contributor: 15 | i) changes to the Program, and 16 | ii) additions to the Program; 17 | where such changes and/or additions to the Program originate from 18 | and are Distributed by that particular Contributor. A Contribution 19 | "originates" from a Contributor if it was added to the Program by 20 | such Contributor itself or anyone acting on such Contributor's behalf. 21 | Contributions do not include changes or additions to the Program that 22 | are not Modified Works. 23 | 24 | "Contributor" means any person or entity that Distributes the Program. 25 | 26 | "Licensed Patents" mean patent claims licensable by a Contributor which 27 | are necessarily infringed by the use or sale of its Contribution alone 28 | or when combined with the Program. 29 | 30 | "Program" means the Contributions Distributed in accordance with this 31 | Agreement. 32 | 33 | "Recipient" means anyone who receives the Program under this Agreement 34 | or any Secondary License (as applicable), including Contributors. 35 | 36 | "Derivative Works" shall mean any work, whether in Source Code or other 37 | form, that is based on (or derived from) the Program and for which the 38 | editorial revisions, annotations, elaborations, or other modifications 39 | represent, as a whole, an original work of authorship. 40 | 41 | "Modified Works" shall mean any work in Source Code or other form that 42 | results from an addition to, deletion from, or modification of the 43 | contents of the Program, including, for purposes of clarity any new file 44 | in Source Code form that contains any contents of the Program. Modified 45 | Works shall not include works that contain only declarations, 46 | interfaces, types, classes, structures, or files of the Program solely 47 | in each case in order to link to, bind by name, or subclass the Program 48 | or Modified Works thereof. 49 | 50 | "Distribute" means the acts of a) distributing or b) making available 51 | in any manner that enables the transfer of a copy. 52 | 53 | "Source Code" means the form of a Program preferred for making 54 | modifications, including but not limited to software source code, 55 | documentation source, and configuration files. 56 | 57 | "Secondary License" means either the GNU General Public License, 58 | Version 2.0, or any later versions of that license, including any 59 | exceptions or additional permissions as identified by the initial 60 | Contributor. 61 | 62 | 2. GRANT OF RIGHTS 63 | 64 | a) Subject to the terms of this Agreement, each Contributor hereby 65 | grants Recipient a non-exclusive, worldwide, royalty-free copyright 66 | license to reproduce, prepare Derivative Works of, publicly display, 67 | publicly perform, Distribute and sublicense the Contribution of such 68 | Contributor, if any, and such Derivative Works. 69 | 70 | b) Subject to the terms of this Agreement, each Contributor hereby 71 | grants Recipient a non-exclusive, worldwide, royalty-free patent 72 | license under Licensed Patents to make, use, sell, offer to sell, 73 | import and otherwise transfer the Contribution of such Contributor, 74 | if any, in Source Code or other form. This patent license shall 75 | apply to the combination of the Contribution and the Program if, at 76 | the time the Contribution is added by the Contributor, such addition 77 | of the Contribution causes such combination to be covered by the 78 | Licensed Patents. The patent license shall not apply to any other 79 | combinations which include the Contribution. No hardware per se is 80 | licensed hereunder. 81 | 82 | c) Recipient understands that although each Contributor grants the 83 | licenses to its Contributions set forth herein, no assurances are 84 | provided by any Contributor that the Program does not infringe the 85 | patent or other intellectual property rights of any other entity. 86 | Each Contributor disclaims any liability to Recipient for claims 87 | brought by any other entity based on infringement of intellectual 88 | property rights or otherwise. As a condition to exercising the 89 | rights and licenses granted hereunder, each Recipient hereby 90 | assumes sole responsibility to secure any other intellectual 91 | property rights needed, if any. For example, if a third party 92 | patent license is required to allow Recipient to Distribute the 93 | Program, it is Recipient's responsibility to acquire that license 94 | before distributing the Program. 95 | 96 | d) Each Contributor represents that to its knowledge it has 97 | sufficient copyright rights in its Contribution, if any, to grant 98 | the copyright license set forth in this Agreement. 99 | 100 | e) Notwithstanding the terms of any Secondary License, no 101 | Contributor makes additional grants to any Recipient (other than 102 | those set forth in this Agreement) as a result of such Recipient's 103 | receipt of the Program under the terms of a Secondary License 104 | (if permitted under the terms of Section 3). 105 | 106 | 3. REQUIREMENTS 107 | 108 | 3.1 If a Contributor Distributes the Program in any form, then: 109 | 110 | a) the Program must also be made available as Source Code, in 111 | accordance with section 3.2, and the Contributor must accompany 112 | the Program with a statement that the Source Code for the Program 113 | is available under this Agreement, and informs Recipients how to 114 | obtain it in a reasonable manner on or through a medium customarily 115 | used for software exchange; and 116 | 117 | b) the Contributor may Distribute the Program under a license 118 | different than this Agreement, provided that such license: 119 | i) effectively disclaims on behalf of all other Contributors all 120 | warranties and conditions, express and implied, including 121 | warranties or conditions of title and non-infringement, and 122 | implied warranties or conditions of merchantability and fitness 123 | for a particular purpose; 124 | 125 | ii) effectively excludes on behalf of all other Contributors all 126 | liability for damages, including direct, indirect, special, 127 | incidental and consequential damages, such as lost profits; 128 | 129 | iii) does not attempt to limit or alter the recipients' rights 130 | in the Source Code under section 3.2; and 131 | 132 | iv) requires any subsequent distribution of the Program by any 133 | party to be under a license that satisfies the requirements 134 | of this section 3. 135 | 136 | 3.2 When the Program is Distributed as Source Code: 137 | 138 | a) it must be made available under this Agreement, or if the 139 | Program (i) is combined with other material in a separate file or 140 | files made available under a Secondary License, and (ii) the initial 141 | Contributor attached to the Source Code the notice described in 142 | Exhibit A of this Agreement, then the Program may be made available 143 | under the terms of such Secondary Licenses, and 144 | 145 | b) a copy of this Agreement must be included with each copy of 146 | the Program. 147 | 148 | 3.3 Contributors may not remove or alter any copyright, patent, 149 | trademark, attribution notices, disclaimers of warranty, or limitations 150 | of liability ("notices") contained within the Program from any copy of 151 | the Program which they Distribute, provided that Contributors may add 152 | their own appropriate notices. 153 | 154 | 4. COMMERCIAL DISTRIBUTION 155 | 156 | Commercial distributors of software may accept certain responsibilities 157 | with respect to end users, business partners and the like. While this 158 | license is intended to facilitate the commercial use of the Program, 159 | the Contributor who includes the Program in a commercial product 160 | offering should do so in a manner which does not create potential 161 | liability for other Contributors. Therefore, if a Contributor includes 162 | the Program in a commercial product offering, such Contributor 163 | ("Commercial Contributor") hereby agrees to defend and indemnify every 164 | other Contributor ("Indemnified Contributor") against any losses, 165 | damages and costs (collectively "Losses") arising from claims, lawsuits 166 | and other legal actions brought by a third party against the Indemnified 167 | Contributor to the extent caused by the acts or omissions of such 168 | Commercial Contributor in connection with its distribution of the Program 169 | in a commercial product offering. The obligations in this section do not 170 | apply to any claims or Losses relating to any actual or alleged 171 | intellectual property infringement. In order to qualify, an Indemnified 172 | Contributor must: a) promptly notify the Commercial Contributor in 173 | writing of such claim, and b) allow the Commercial Contributor to control, 174 | and cooperate with the Commercial Contributor in, the defense and any 175 | related settlement negotiations. The Indemnified Contributor may 176 | participate in any such claim at its own expense. 177 | 178 | For example, a Contributor might include the Program in a commercial 179 | product offering, Product X. That Contributor is then a Commercial 180 | Contributor. If that Commercial Contributor then makes performance 181 | claims, or offers warranties related to Product X, those performance 182 | claims and warranties are such Commercial Contributor's responsibility 183 | alone. Under this section, the Commercial Contributor would have to 184 | defend claims against the other Contributors related to those performance 185 | claims and warranties, and if a court requires any other Contributor to 186 | pay any damages as a result, the Commercial Contributor must pay 187 | those damages. 188 | 189 | 5. NO WARRANTY 190 | 191 | EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT 192 | PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" 193 | BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR 194 | IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF 195 | TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR 196 | PURPOSE. Each Recipient is solely responsible for determining the 197 | appropriateness of using and distributing the Program and assumes all 198 | risks associated with its exercise of rights under this Agreement, 199 | including but not limited to the risks and costs of program errors, 200 | compliance with applicable laws, damage to or loss of data, programs 201 | or equipment, and unavailability or interruption of operations. 202 | 203 | 6. DISCLAIMER OF LIABILITY 204 | 205 | EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT 206 | PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS 207 | SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 208 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST 209 | PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 210 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 211 | ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE 212 | EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE 213 | POSSIBILITY OF SUCH DAMAGES. 214 | 215 | 7. GENERAL 216 | 217 | If any provision of this Agreement is invalid or unenforceable under 218 | applicable law, it shall not affect the validity or enforceability of 219 | the remainder of the terms of this Agreement, and without further 220 | action by the parties hereto, such provision shall be reformed to the 221 | minimum extent necessary to make such provision valid and enforceable. 222 | 223 | If Recipient institutes patent litigation against any entity 224 | (including a cross-claim or counterclaim in a lawsuit) alleging that the 225 | Program itself (excluding combinations of the Program with other software 226 | or hardware) infringes such Recipient's patent(s), then such Recipient's 227 | rights granted under Section 2(b) shall terminate as of the date such 228 | litigation is filed. 229 | 230 | All Recipient's rights under this Agreement shall terminate if it 231 | fails to comply with any of the material terms or conditions of this 232 | Agreement and does not cure such failure in a reasonable period of 233 | time after becoming aware of such noncompliance. If all Recipient's 234 | rights under this Agreement terminate, Recipient agrees to cease use 235 | and distribution of the Program as soon as reasonably practicable. 236 | However, Recipient's obligations under this Agreement and any licenses 237 | granted by Recipient relating to the Program shall continue and survive. 238 | 239 | Everyone is permitted to copy and distribute copies of this Agreement, 240 | but in order to avoid inconsistency the Agreement is copyrighted and 241 | may only be modified in the following manner. The Agreement Steward 242 | reserves the right to publish new versions (including revisions) of 243 | this Agreement from time to time. No one other than the Agreement 244 | Steward has the right to modify this Agreement. The Eclipse Foundation 245 | is the initial Agreement Steward. The Eclipse Foundation may assign the 246 | responsibility to serve as the Agreement Steward to a suitable separate 247 | entity. Each new version of the Agreement will be given a distinguishing 248 | version number. The Program (including Contributions) may always be 249 | Distributed subject to the version of the Agreement under which it was 250 | received. In addition, after a new version of the Agreement is published, 251 | Contributor may elect to Distribute the Program (including its 252 | Contributions) under the new version. 253 | 254 | Except as expressly stated in Sections 2(a) and 2(b) above, Recipient 255 | receives no rights or licenses to the intellectual property of any 256 | Contributor under this Agreement, whether expressly, by implication, 257 | estoppel or otherwise. All rights in the Program not expressly granted 258 | under this Agreement are reserved. Nothing in this Agreement is intended 259 | to be enforceable by any entity that is not a Contributor or Recipient. 260 | No third-party beneficiary rights are created under this Agreement. 261 | 262 | Exhibit A - Form of Secondary Licenses Notice 263 | 264 | "This Source Code may also be made available under the following 265 | Secondary Licenses when the conditions for such availability set forth 266 | in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), 267 | version(s), and exceptions or additional permissions here}." 268 | 269 | Simply including a copy of this Agreement, including this Exhibit A 270 | is not sufficient to license the Source Code under Secondary Licenses. 271 | 272 | If it is not possible or desirable to put the notice in a particular 273 | file, then You may include the notice in a location (such as a LICENSE 274 | file in a relevant directory) where a recipient would be likely to 275 | look for such a notice. 276 | 277 | You may add additional accurate notices of copyright ownership. 278 | --------------------------------------------------------------------------------