├── .gitignore ├── deps.edn ├── CONTRIBUTING.md ├── src ├── main │ ├── dotnet │ │ └── packager │ │ │ └── clojure.tools.gitlibs.csproj │ └── clojure │ │ └── clojure │ │ └── tools │ │ ├── gitlibs │ │ ├── config.cljr │ │ └── impl.cljr │ │ └── gitlibs.cljc └── test │ └── clojure │ └── clojure │ └── tools │ ├── gitlibs │ └── impl_test.cljc │ └── gitlibs_test.cljc ├── project.clj ├── README.md ├── LICENSE └── epl-v10.html /.gitignore: -------------------------------------------------------------------------------- 1 | pom.xml 2 | /lib/ 3 | /classes/ 4 | /targets/ 5 | /target 6 | /classes 7 | /checkouts 8 | *.jar 9 | *.class 10 | *.dll 11 | *.pdb 12 | *.exe 13 | .lein-deps-sum 14 | .lein-failures 15 | .lein-plugins 16 | 17 | .cpcache 18 | 19 | #Visual Studio artifacts 20 | bin/ 21 | obj/ 22 | .vs/ 23 | *.user 24 | *.suo 25 | *.nupkg -------------------------------------------------------------------------------- /deps.edn: -------------------------------------------------------------------------------- 1 | { 2 | :paths ["src/main/clojure"] 3 | :aliases 4 | {:test 5 | {:extra-paths ["src/test/clojure"] 6 | :extra-deps {io.github.dmiller/test-runner {:git/sha "c055ea13d19c6a9b9632aa2370fcc2215c8043c3"}} 7 | ;; :main-opts ["-m" "cognitect.test-runner" "-d" "src/test/clojure"] 8 | :exec-fn cognitect.test-runner.api/test 9 | :exec-args {:dirs ["src/test/clojure"]}}} 10 | } 11 | 12 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | This is a [Clojure contrib] project. 2 | 3 | Under the Clojure contrib [guidelines], this project cannot accept 4 | pull requests. All patches must be submitted via [JIRA]. 5 | 6 | See [Contributing] on the Clojure website for 7 | more information on how to contribute. 8 | 9 | [Clojure contrib]: https://clojure.org/community/contrib_libs 10 | [Contributing]: https://clojure.org/community/contributing 11 | [JIRA]: https://clojure.atlassian.net/browse/DJSON 12 | [guidelines]: https://clojure.org/community/contrib_howto -------------------------------------------------------------------------------- /src/main/dotnet/packager/clojure.tools.gitlibs.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netstandard2.0;netstandard2.1 5 | 6 | 7 | 8 | clojure.tools.gitlibs 9 | clojure.tools 10 | clojure.tools.gitlibs 11 | clojure.tools.gitlibs 12 | clojure.tools.gitlibs 13 | ClojureCLR Contributors 14 | An API for retrieving, caching, and programatically accessing git libraries. 15 | Copyright © Rich Hickey, ClojureCLR contributors 16 | EPL-1.0 17 | https://github.com/clojure/clr.tools.gitlibs 18 | ClojureCLR contributors 19 | Clojure;ClojureCLR 20 | 2.5.198 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/test/clojure/clojure/tools/gitlibs/impl_test.cljc: -------------------------------------------------------------------------------- 1 | (ns clojure.tools.gitlibs.impl-test 2 | (:require 3 | [clojure.test :refer :all] 4 | [clojure.tools.gitlibs.impl :as impl])) 5 | 6 | (deftest test-clean-url 7 | (are [url expected-path] 8 | (= expected-path (#'impl/clean-url url)) 9 | 10 | ;; url formats - don't use user or port 11 | "ssh://git@gitlab.com:3333/org/repo.git" "ssh/gitlab.com/org/repo" 12 | "ssh://git@gitlab.org.net/org/repo.git" "ssh/gitlab.org.net/org/repo" 13 | "ssh://user@host.xz/~user/repo.git/" "ssh/host.xz/_TILDE_user/repo" 14 | "https://github.com/org/repo.git" "https/github.com/org/repo" 15 | "git://host.xz/path/to/repo.git/" "git/host.xz/path/to/repo" 16 | 17 | ;; scp style url (most common github ssh url format) 18 | "git@github.com:org/repo.git" "ssh/github.com/org/repo" 19 | "git@github.com:dotted.org/dotted.repo.git" "ssh/github.com/dotted.org/dotted.repo" 20 | "host.xz:~user/path/to/repo.git/" "ssh/host.xz/_TILDE_user/path/to/repo" 21 | 22 | ;; file scheme 23 | "file:///Users/me/code/repo.git" "file/Users/me/code/repo" 24 | "file://../foo.git" "file/REL/_DOTDOT_/foo" 25 | "file://~/path/repo.git" "file/REL/_TILDE_/path/repo" 26 | 27 | ;; file repos - handle relative vs absolute, handle . .. ~ 28 | "/Users/me/code/repo.git" "file/Users/me/code/repo" 29 | "../foo.git" "file/REL/_DOTDOT_/foo" 30 | "./foo.git" "file/REL/_DOT_/foo" 31 | "~user/foo.git" "file/REL/_TILDE_user/foo" 32 | 33 | ;; git - unknown transport with url rewrite in gitconfig (unusual, but do something useful) 34 | "work:repo.git" "ssh/work/repo")) 35 | -------------------------------------------------------------------------------- /project.clj: -------------------------------------------------------------------------------- 1 | (defproject org.clojure.clr/tools.gitlibs "2.5.198" 2 | :description "Port of clojure.org/tools.gitlibs to ClojureCLR" 3 | :url "https://github.com/clojure/clr.tools.gitlibs" 4 | :license {:name "Eclipse Public License" 5 | :url "http://www.eclipse.org/legal/epl-v10.html"} 6 | :dependencies [] 7 | :source-paths ["src/main/clojure"] 8 | :test-paths ["src/test/clojure"] 9 | :min-lein-version "2.0.0" 10 | :plugins [[lein-clr "0.2.0"]] 11 | :deploy-repositories [["clojars" {:url "https://clojars.org/repo/" 12 | :sign-releases false}]] 13 | :clr {:cmd-templates {:clj-exe [#_"mono" [CLJCLR15_40 %1]] 14 | :clj-dep [#_"mono" ["target/clr/clj/Debug 4.0" %1]] 15 | :clj-url "https://github.com/downloads/clojure/clojure-clr/clojure-clr-1.4.0-Debug-4.0.zip" 16 | :clj-zip "clojure-clr-1.4.0-Debug-4.0.zip" 17 | :curl ["curl" "--insecure" "-f" "-L" "-o" %1 %2] 18 | :nuget-ver [#_"mono" [*PATH "nuget.exe"] "install" %1 "-Version" %2] 19 | :nuget-any [#_"mono" [*PATH "nuget.exe"] "install" %1] 20 | :unzip ["unzip" "-d" %1 %2] 21 | :wget ["wget" "--no-check-certificate" "--no-clobber" "-O" %1 %2]} 22 | ;; for automatic download/unzip of ClojureCLR, 23 | ;; 1. make sure you have curl or wget installed and on PATH, 24 | ;; 2. uncomment deps in :deps-cmds, and 25 | ;; 3. use :clj-dep instead of :clj-exe in :main-cmd and :compile-cmd 26 | :deps-cmds [; [:wget :clj-zip :clj-url] ; edit to use :curl instead of :wget 27 | ; [:unzip "../clj" :clj-zip] 28 | ] 29 | :main-cmd [:clj-exe "Clojure.Main.exe"] 30 | :compile-cmd [:clj-exe "Clojure.Compile.exe"]}) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # clr.tools.gitlibs 2 | 3 | A port of [clojure/tools.gitlibs](https://github.com/clojure/tools.gitlibs) library to ClojureCLR. 4 | 5 | > An API for retrieving, caching, and programatically accessing git libraries. 6 | 7 | > To access git dependencies (for example, via tools.deps), one must download git directories and working trees as indicated by git shas. This library provides this functionality and also keeps a cache of git dirs and working trees that can be reused. 8 | 9 | ## Usage 10 | 11 | See the ClojureJVM library repo linked to above. 12 | 13 | For configuration, the environment variables referenced are the same. 14 | Instead of Java system properties, this version will look at the `app.config` data. 15 | The equivalent of `~/.gitlibs` on Windows is the the `.gitlibs` directory in the user's home directory, typically `C:/Users/`. 16 | 17 | # Releases 18 | 19 | deps.edn reference: 20 | 21 | ``` 22 | {io.github.clojure/clr.tools.gitlibs {:git/tag "v2.5.198" sha "3d561c2"}} 23 | ``` 24 | 25 | Nuget reference: 26 | 27 | ``` 28 | PM> Install-Package clojure.tools.gitlibs -Version 2.5.198 29 | ``` 30 | 31 | Leiningen/Clojars reference: 32 | 33 | ``` 34 | [org.clojure.clr/tools.gitlibs "2.5.198"] 35 | ``` 36 | 37 | ## Contributing 38 | 39 | [Contributing to Clojure projects](https://clojure.org/community/contributing) requires a signed Contributor Agreement. 40 | 41 | 42 | # Copyright and License 43 | 44 | Per the ClojureJVM version: 45 | 46 | 47 | > Copyright © 2018-2023 Rich Hickey, Alex Miller, and contributors 48 | > 49 | > All rights reserved. The use and 50 | > distribution terms for this software are covered by the 51 | > [Eclipse Public License 1.0] which can be found in the file 52 | > epl-v10.html at the root of this distribution. By using this software 53 | > in any fashion, you are agreeing to be bound by the terms of this 54 | > license. You must not remove this notice, or any other, from this 55 | > software. 56 | > 57 | > [Eclipse Public License 1.0]: http://opensource.org/licenses/eclipse-1.0.php -------------------------------------------------------------------------------- /src/test/clojure/clojure/tools/gitlibs_test.cljc: -------------------------------------------------------------------------------- 1 | ; Copyright (c) Rich Hickey. All rights reserved. 2 | ; The use and distribution terms for this software are covered by the 3 | ; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) 4 | ; which can be found in the file epl-v10.html at the root of this distribution. 5 | ; By using this software in any fashion, you are agreeing to be bound by 6 | ; the terms of this license. 7 | ; You must not remove this notice, or any other, from this software. 8 | 9 | (ns clojure.tools.gitlibs-test 10 | (:require 11 | [clojure.clr.io :as cio] ;;; [clojure.java.io :as jio] 12 | [clojure.test :refer :all] 13 | [clojure.tools.gitlibs :as gl])) 14 | 15 | (def repo-url "https://github.com/clojure/spec.alpha.git") 16 | 17 | (deftest test-resolve 18 | (is (= (gl/resolve repo-url "739c1af5") 19 | "739c1af56dae621aedf1bb282025a0d676eff713"))) 20 | 21 | (deftest test-procure 22 | (let [wt1 (gl/procure repo-url 'org.clojure/spec.alpha "739c1af") 23 | wt2 (gl/procure repo-url 'org.clojure/spec.alpha "6a56327")] 24 | (is (.Exists (cio/dir-info (gl/cache-dir) "_repos" "https" "github.com" "clojure" "spec.alpha"))) ;;; .exists jio/file 25 | (is (= wt1 (.FullName (cio/file-info (gl/cache-dir) "libs" "org.clojure" "spec.alpha" "739c1af56dae621aedf1bb282025a0d676eff713")))) ;;; jio/file .getAbsolutePath 26 | (is (= wt2 (.FullName (cio/file-info (gl/cache-dir) "libs" "org.clojure" "spec.alpha" "6a56327446c909db0d11ecf93a3c3d659b739be9")))))) ;;; jio/file .getAbsolutePath 27 | 28 | (deftest test-descendant-fixed 29 | (is (= (gl/descendant repo-url ["607aef0" "739c1af"]) 30 | "739c1af56dae621aedf1bb282025a0d676eff713")) 31 | (is (= (gl/descendant repo-url ["739c1af" "607aef0"]) 32 | "739c1af56dae621aedf1bb282025a0d676eff713")) 33 | (is (= (gl/descendant repo-url ["607aef0" "607aef0"]) 34 | "607aef0643f6cf920293130d45e6160d93fda908")) 35 | 36 | (is (nil? (gl/descendant repo-url nil))) 37 | (is (nil? (gl/descendant repo-url []))) 38 | (is (nil? (gl/descendant repo-url ["abcdef" "123456"])))) 39 | 40 | (deftest test-descendant-combos 41 | (let [m (gl/resolve repo-url "master") 42 | m' (gl/resolve repo-url "master~1") 43 | m'' (gl/resolve repo-url "master~2")] 44 | (are [rs d] (= d (gl/descendant repo-url rs)) 45 | [m] m 46 | [m m''] m 47 | [m' m''] m' 48 | [m'' m' m] m))) -------------------------------------------------------------------------------- /src/main/clojure/clojure/tools/gitlibs/config.cljr: -------------------------------------------------------------------------------- 1 | ; Copyright (c) Rich Hickey. All rights reserved. 2 | ; The use and distribution terms for this software are covered by the 3 | ; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) 4 | ; which can be found in the file epl-v10.html at the root of this distribution. 5 | ; By using this software in any fashion, you are agreeing to be bound by 6 | ; the terms of this license. 7 | ; You must not remove this notice, or any other, from this software. 8 | 9 | (ns clojure.tools.gitlibs.config 10 | "Implementation, use at your own risk" 11 | (:require 12 | [clojure.clr.io :as cio] ;;; [clojure.java.io :as jio] 13 | [clojure.string :as str])) 14 | 15 | (set! *warn-on-reflection* true) 16 | 17 | (defn- read-config-value 18 | "Read a config value from each of these in order, taking the first value found: 19 | * Java system property 20 | * env variable 21 | * default value" 22 | [property env default] 23 | (or 24 | #_(.get_Item System.Configuration.ConfigurationManager/AppSettings ^String property) ;;; (System/getProperty property) 25 | (Environment/GetEnvironmentVariable env) ;;; (System/getenv env) 26 | default)) 27 | 28 | (defn- init-config 29 | [] 30 | {:gitlibs/dir 31 | (.FullName ;;; .getCanonicalPath 32 | (let [lib-dir (read-config-value "clojure.gitlibs.dir" "GITLIBS" nil)] ;;; (or (System/getProperty "clojure.gitlibs.dir") (System/getenv "GITLIBS")) 33 | (if (str/blank? lib-dir) 34 | (System.IO.DirectoryInfo. (System.IO.Path/Join (Environment/GetFolderPath System.Environment+SpecialFolder/UserProfile) ".gitlibs")) ;;; (jio/file (System/getProperty "user.home") ".gitlibs") 35 | (System.IO.DirectoryInfo. lib-dir)))) ;;; jio/file 36 | 37 | :gitlibs/command 38 | (read-config-value "clojure.gitlibs.command" "GITLIBS_COMMAND" "git") ;;; (or (System/getProperty "clojure.gitlibs.command") (System/getenv "GITLIBS_COMMAND") "git") 39 | 40 | :gitlibs/debug 41 | (Boolean/Parse ^String (read-config-value "clojure.gitlibs.debug" "GITLIBS_DEBUG" "false")) ;;; parseBoolean (or (System/getProperty "clojure.gitlibs.debug") (System/getenv "GITLIBS_DEBUG") "false") 42 | 43 | :gitlibs/terminal 44 | (Boolean/Parse ^String (read-config-value "clojure.gitlibs.terminal" "GITLIBS_TERMINAL" "false"))}) ;;; parseBoolean (or (System/getProperty "clojure.gitlibs.terminal") (System/getenv "GITLIBS_TERMINAL") "false") 45 | 46 | (def CONFIG 47 | "Config map - deref to access" 48 | (delay (init-config))) -------------------------------------------------------------------------------- /src/main/clojure/clojure/tools/gitlibs.cljc: -------------------------------------------------------------------------------- 1 | ; Copyright (c) Rich Hickey. All rights reserved. 2 | ; The use and distribution terms for this software are covered by the 3 | ; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) 4 | ; which can be found in the file epl-v10.html at the root of this distribution. 5 | ; By using this software in any fashion, you are agreeing to be bound by 6 | ; the terms of this license. 7 | ; You must not remove this notice, or any other, from this software. 8 | 9 | (ns clojure.tools.gitlibs 10 | "An API for retrieving and caching git repos and working trees. 11 | 12 | The git url can be either an https url for anonymous checkout or an ssh url 13 | for private access. revs can be either full sha, prefix sha, or tag name." 14 | (:refer-clojure :exclude [resolve]) 15 | (:require 16 | [clojure.clr.io :as cio] ;;; [clojure.java.io :as jio] 17 | [clojure.tools.gitlibs.config :as config] 18 | [clojure.tools.gitlibs.impl :as impl]) 19 | (:import [System.IO DirectoryInfo Path]) 20 | ) 21 | 22 | (set! *warn-on-reflection* true) 23 | 24 | (defn cache-dir 25 | "Return the root gitlibs cache directory. By default ~/.gitlibs or 26 | override by setting the environment variable GITLIBS." 27 | [] 28 | (:gitlibs/dir @config/CONFIG)) 29 | 30 | ;; Possible new API, internal for now 31 | (defn- resolve-all 32 | "Takes a git url and a coll of revs, and returns the full commit shas. 33 | Each rev may be a partial sha, full sha, or tag name. Returns nil for 34 | unresolveable revs." 35 | [url revs] 36 | (let [git-dir (impl/ensure-git-dir url)] 37 | (reduce 38 | (fn [rs r] 39 | (if-let [res (impl/git-rev-parse git-dir r)] 40 | (conj rs res) 41 | (do ;; could not resolve - fetch and try again 42 | (impl/git-fetch (cio/as-dir git-dir)) ;;; jio/file 43 | (conj rs (impl/git-rev-parse git-dir r))))) 44 | [] revs))) 45 | 46 | (defn resolve 47 | "Takes a git url and a rev, and returns the full commit sha or nil if can't 48 | resolve. rev may be a partial sha, full sha, or tag name." 49 | [url rev] 50 | (first (resolve-all url [rev]))) 51 | 52 | (defn object-type 53 | "Takes a git url and rev, and returns the object type, one of :tag :tree 54 | :commit or :blob, or nil if not known or ambiguous." 55 | [url rev] 56 | (let [git-dir (impl/ensure-git-dir url)] 57 | (if-let [type (impl/git-type git-dir rev)] 58 | type 59 | (do 60 | (impl/git-fetch (DirectoryInfo. git-dir)) ;;; jio/file 61 | (impl/git-type git-dir rev))))) 62 | 63 | (defn procure 64 | "Procure a working tree at rev for the git url representing the library lib, 65 | returns the directory path. lib is a qualified symbol where the qualifier is a 66 | controlled or conveyed identity, or nil if rev is unknown." 67 | [url lib rev] 68 | (let [lib-dir (impl/lib-dir lib) 69 | git-dir-path (impl/ensure-git-dir url) 70 | sha (or (impl/match-exact lib-dir rev) (impl/match-prefix lib-dir rev) (resolve url rev))] 71 | (when sha 72 | (let [sha-dir (DirectoryInfo. (Path/Join (.FullName lib-dir) ^String sha))] ;;; jio/file 73 | (when-not (.Exists sha-dir) ;;; .exists 74 | (impl/printerrln "Checking out:" url "at" rev) 75 | (impl/git-checkout git-dir-path lib-dir sha)) 76 | (.FullName sha-dir))))) ;;; .getCanonicalPath 77 | 78 | (defn descendant 79 | "Returns rev in git url which is a descendant of all other revs, 80 | or nil if no such relationship can be established." 81 | [url revs] 82 | (when (seq revs) 83 | (let [shas (resolve-all url revs)] 84 | (if (seq (filter nil? shas)) 85 | nil ;; can't resolve all shas in this repo 86 | (let [git-dir (impl/ensure-git-dir url)] 87 | (->> shas (sort (partial impl/commit-comparator git-dir)) first)))))) 88 | 89 | (defn tags 90 | "Fetches, then returns coll of tags in git url" 91 | [url] 92 | (impl/tags (impl/ensure-git-dir url))) 93 | 94 | (defn commit-sha 95 | "Returns unpeeled full commit sha, given a rev (which may be tag, branch, etc)" 96 | [url rev] 97 | (impl/git-rev-parse (impl/ensure-git-dir url) rev)) 98 | 99 | (comment 100 | 101 | 102 | (System/setProperty "clojure.gitlibs.debug" "true") 103 | (resolve "git@github.com:clojure/tools.gitlibs.git" "11fc774") 104 | (descendant "https://github.com/clojure/tools.gitlibs.git" ["5e2797a487c" "11fc774" "d82adc29" "815e312310"]) 105 | 106 | (println 107 | @(future (procure "https://github.com/clojure/tools.gitlibs.git" 'org.clojure/tools.gitlibs "11fc77496f013871c8af3514bbba03de0af28061")) 108 | @(future (procure "https://github.com/clojure/tools.gitlibs.git" 'org.clojure/tools.gitlibs "11fc77496f013871c8af3514bbba03de0af28061"))) 109 | 110 | (println 111 | @(future (procure "https://github.com/cognitect-labs/test-runner.git" 'cognitect-labs/test-runner "b6b3193fcc42659d7e46ecd1884a228993441182")) 112 | @(future (procure "https://github.com/cognitect-labs/test-runner.git" 'cognitect-labs/test-runner "cb96e80f6f3d3b307c59cbeb49bb0dcb3a2a780b")) 113 | @(future (procure "https://github.com/cognitect-labs/test-runner.git" 'cognitect-labs/test-runner "9e1098965f2089c8cf492d23c0b7520f8690440a"))) 114 | 115 | (tags "https://github.com/clojure/tools.gitlibs.git") 116 | 117 | ;; big output 118 | (tags "https://github.com/confluentinc/kafka-streams-examples.git") 119 | ) -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Eclipse Public License - v 1.0 2 | 3 | THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC 4 | LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM 5 | 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 code and documentation 12 | distributed under this Agreement, and 13 | b) in the case of each subsequent Contributor: 14 | i) changes to the Program, and 15 | ii) additions to the Program; 16 | 17 | where such changes and/or additions to the Program originate from and are 18 | distributed by that particular Contributor. A Contribution 'originates' 19 | from a Contributor if it was added to the Program by such Contributor 20 | itself or anyone acting on such Contributor's behalf. Contributions do not 21 | include additions to the Program which: (i) are separate modules of 22 | software distributed in conjunction with the Program under their own 23 | license agreement, and (ii) are not derivative works of the Program. 24 | 25 | "Contributor" means any person or entity that distributes the Program. 26 | 27 | "Licensed Patents" mean patent claims licensable by a Contributor which are 28 | necessarily infringed by the use or sale of its Contribution alone or when 29 | combined with the Program. 30 | 31 | "Program" means the Contributions distributed in accordance with this 32 | Agreement. 33 | 34 | "Recipient" means anyone who receives the Program under this Agreement, 35 | including all Contributors. 36 | 37 | 2. GRANT OF RIGHTS 38 | a) Subject to the terms of this Agreement, each Contributor hereby grants 39 | Recipient a non-exclusive, worldwide, royalty-free copyright license to 40 | reproduce, prepare derivative works of, publicly display, publicly 41 | perform, distribute and sublicense the Contribution of such Contributor, 42 | if any, and such derivative works, in source code and object code form. 43 | b) Subject to the terms of this Agreement, each Contributor hereby grants 44 | Recipient a non-exclusive, worldwide, royalty-free patent license under 45 | Licensed Patents to make, use, sell, offer to sell, import and otherwise 46 | transfer the Contribution of such Contributor, if any, in source code and 47 | object code form. This patent license shall apply to the combination of 48 | the Contribution and the Program if, at the time the Contribution is 49 | added by the Contributor, such addition of the Contribution causes such 50 | combination to be covered by the Licensed Patents. The patent license 51 | shall not apply to any other combinations which include the Contribution. 52 | No hardware per se is licensed hereunder. 53 | c) Recipient understands that although each Contributor grants the licenses 54 | to its Contributions set forth herein, no assurances are provided by any 55 | Contributor that the Program does not infringe the patent or other 56 | intellectual property rights of any other entity. Each Contributor 57 | disclaims any liability to Recipient for claims brought by any other 58 | entity based on infringement of intellectual property rights or 59 | otherwise. As a condition to exercising the rights and licenses granted 60 | hereunder, each Recipient hereby assumes sole responsibility to secure 61 | any other intellectual property rights needed, if any. For example, if a 62 | third party patent license is required to allow Recipient to distribute 63 | the Program, it is Recipient's responsibility to acquire that license 64 | before distributing the Program. 65 | d) Each Contributor represents that to its knowledge it has sufficient 66 | copyright rights in its Contribution, if any, to grant the copyright 67 | license set forth in this Agreement. 68 | 69 | 3. REQUIREMENTS 70 | 71 | A Contributor may choose to distribute the Program in object code form under 72 | its own license agreement, provided that: 73 | 74 | a) it complies with the terms and conditions of this Agreement; and 75 | b) its license agreement: 76 | i) effectively disclaims on behalf of all Contributors all warranties 77 | and conditions, express and implied, including warranties or 78 | conditions of title and non-infringement, and implied warranties or 79 | conditions of merchantability and fitness for a particular purpose; 80 | ii) effectively excludes on behalf of all Contributors all liability for 81 | damages, including direct, indirect, special, incidental and 82 | consequential damages, such as lost profits; 83 | iii) states that any provisions which differ from this Agreement are 84 | offered by that Contributor alone and not by any other party; and 85 | iv) states that source code for the Program is available from such 86 | Contributor, and informs licensees how to obtain it in a reasonable 87 | manner on or through a medium customarily used for software exchange. 88 | 89 | When the Program is made available in source code form: 90 | 91 | a) it must be made available under this Agreement; and 92 | b) a copy of this Agreement must be included with each copy of the Program. 93 | Contributors may not remove or alter any copyright notices contained 94 | within the Program. 95 | 96 | Each Contributor must identify itself as the originator of its Contribution, 97 | if 98 | any, in a manner that reasonably allows subsequent Recipients to identify the 99 | originator of the Contribution. 100 | 101 | 4. COMMERCIAL DISTRIBUTION 102 | 103 | Commercial distributors of software may accept certain responsibilities with 104 | respect to end users, business partners and the like. While this license is 105 | intended to facilitate the commercial use of the Program, the Contributor who 106 | includes the Program in a commercial product offering should do so in a manner 107 | which does not create potential liability for other Contributors. Therefore, 108 | if a Contributor includes the Program in a commercial product offering, such 109 | Contributor ("Commercial Contributor") hereby agrees to defend and indemnify 110 | every other Contributor ("Indemnified Contributor") against any losses, 111 | damages and costs (collectively "Losses") arising from claims, lawsuits and 112 | other legal actions brought by a third party against the Indemnified 113 | Contributor to the extent caused by the acts or omissions of such Commercial 114 | Contributor in connection with its distribution of the Program in a commercial 115 | product offering. The obligations in this section do not apply to any claims 116 | or Losses relating to any actual or alleged intellectual property 117 | infringement. In order to qualify, an Indemnified Contributor must: 118 | a) promptly notify the Commercial Contributor in writing of such claim, and 119 | b) allow the Commercial Contributor to control, and cooperate with the 120 | Commercial Contributor in, the defense and any related settlement 121 | negotiations. The Indemnified Contributor may participate in any such claim at 122 | its own expense. 123 | 124 | For example, a Contributor might include the Program in a commercial product 125 | offering, Product X. That Contributor is then a Commercial Contributor. If 126 | that Commercial Contributor then makes performance claims, or offers 127 | warranties related to Product X, those performance claims and warranties are 128 | such Commercial Contributor's responsibility alone. Under this section, the 129 | Commercial Contributor would have to defend claims against the other 130 | Contributors related to those performance claims and warranties, and if a 131 | court requires any other Contributor to pay any damages as a result, the 132 | Commercial Contributor must pay those damages. 133 | 134 | 5. NO WARRANTY 135 | 136 | EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN 137 | "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR 138 | IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, 139 | NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each 140 | Recipient is solely responsible for determining the appropriateness of using 141 | and distributing the Program and assumes all risks associated with its 142 | exercise of rights under this Agreement , including but not limited to the 143 | risks and costs of program errors, compliance with applicable laws, damage to 144 | or loss of data, programs or equipment, and unavailability or interruption of 145 | operations. 146 | 147 | 6. DISCLAIMER OF LIABILITY 148 | 149 | EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY 150 | CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, 151 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION 152 | LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 153 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 154 | ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE 155 | EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY 156 | OF SUCH DAMAGES. 157 | 158 | 7. GENERAL 159 | 160 | If any provision of this Agreement is invalid or unenforceable under 161 | applicable law, it shall not affect the validity or enforceability of the 162 | remainder of the terms of this Agreement, and without further action by the 163 | parties hereto, such provision shall be reformed to the minimum extent 164 | necessary to make such provision valid and enforceable. 165 | 166 | If Recipient institutes patent litigation against any entity (including a 167 | cross-claim or counterclaim in a lawsuit) alleging that the Program itself 168 | (excluding combinations of the Program with other software or hardware) 169 | infringes such Recipient's patent(s), then such Recipient's rights granted 170 | under Section 2(b) shall terminate as of the date such litigation is filed. 171 | 172 | All Recipient's rights under this Agreement shall terminate if it fails to 173 | comply with any of the material terms or conditions of this Agreement and does 174 | not cure such failure in a reasonable period of time after becoming aware of 175 | such noncompliance. If all Recipient's rights under this Agreement terminate, 176 | Recipient agrees to cease use and distribution of the Program as soon as 177 | reasonably practicable. However, Recipient's obligations under this Agreement 178 | and any licenses granted by Recipient relating to the Program shall continue 179 | and survive. 180 | 181 | Everyone is permitted to copy and distribute copies of this Agreement, but in 182 | order to avoid inconsistency the Agreement is copyrighted and may only be 183 | modified in the following manner. The Agreement Steward reserves the right to 184 | publish new versions (including revisions) of this Agreement from time to 185 | time. No one other than the Agreement Steward has the right to modify this 186 | Agreement. The Eclipse Foundation is the initial Agreement Steward. The 187 | Eclipse Foundation may assign the responsibility to serve as the Agreement 188 | Steward to a suitable separate entity. Each new version of the Agreement will 189 | be given a distinguishing version number. The Program (including 190 | Contributions) may always be distributed subject to the version of the 191 | Agreement under which it was received. In addition, after a new version of the 192 | Agreement is published, Contributor may elect to distribute the Program 193 | (including its Contributions) under the new version. Except as expressly 194 | stated in Sections 2(a) and 2(b) above, Recipient receives no rights or 195 | licenses to the intellectual property of any Contributor under this Agreement, 196 | whether expressly, by implication, estoppel or otherwise. All rights in the 197 | Program not expressly granted under this Agreement are reserved. 198 | 199 | This Agreement is governed by the laws of the State of New York and the 200 | intellectual property laws of the United States of America. No party to this 201 | Agreement will bring a legal action under this Agreement more than one year 202 | after the cause of action arose. Each party waives its rights to a jury trial in 203 | any resulting litigation. 204 | 205 | -------------------------------------------------------------------------------- /src/main/clojure/clojure/tools/gitlibs/impl.cljr: -------------------------------------------------------------------------------- 1 | ; Copyright (c) Rich Hickey. All rights reserved. 2 | ; The use and distribution terms for this software are covered by the 3 | ; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) 4 | ; which can be found in the file epl-v10.html at the root of this distribution. 5 | ; By using this software in any fashion, you are agreeing to be bound by 6 | ; the terms of this license. 7 | ; You must not remove this notice, or any other, from this software. 8 | 9 | (ns clojure.tools.gitlibs.impl 10 | "Implementation, use at your own risk" 11 | (:require 12 | [clojure.clr.io :as cio] ;;; [clojure.java.io :as jio] 13 | [clojure.string :as str] 14 | [clojure.tools.gitlibs.config :as config]) 15 | (:import 16 | [System.Diagnostics ProcessStartInfo Process] ;;; [java.lang ProcessBuilder$Redirect] 17 | [System.IO Stream StringWriter FileInfo DirectoryInfo Path IOException] ;;; [java.io File FilenameFilter InputStream IOException StringWriter] 18 | [System.Threading Thread ThreadStart])) 19 | (set! *warn-on-reflection* true) 20 | 21 | ;; io util 22 | 23 | (defn printerrln [& msgs] 24 | (binding [*out* *err*] 25 | (apply println msgs))) 26 | 27 | (defn- capture 28 | "Reads from input-stream until EOF and returns a String (or nil if 0 length)." 29 | [^Stream input-stream] ;;; ^InputStream 30 | (let [writer (StringWriter.)] 31 | (cio/copy input-stream writer) ;;; jio/copy 32 | (let [s (str/trim (.ToString writer))] ;;; .toString 33 | (when-not (zero? (.Length s)) ;;; .length 34 | s)))) 35 | 36 | (defmacro background 37 | [& body] 38 | `(let [result# (promise)] 39 | (doto (Thread. ^ThreadStart (gen-delegate ThreadStart [] (deliver result# (do ~@body)))) ;;; (fn [] (deliver result# (do ~@body))) 40 | (.set_IsBackground true) ;;; .setDaemon 41 | (.Start)) ;;; .start 42 | result#)) 43 | 44 | (defn- run-git 45 | [& args] 46 | (let [{:gitlibs/keys [command debug terminal]} @config/CONFIG 47 | command-args (cons command args)] 48 | (when debug 49 | (apply printerrln command-args)) 50 | (let [proc-builder 51 | (doto (ProcessStartInfo. ^String command ^String (clojure.string/join " " args)) ;;; (ProcessBuilder. ^java.util.List command-args) 52 | (.set_RedirectStandardError true) 53 | (.set_RedirectStandardOutput true)) 54 | ;;; (.redirectError proc-builder ProcessBuilder$Redirect/INHERIT) 55 | ;;; ;;; _ (when-not terminal (.put (.environment proc-builder) "GIT_TERMINAL_PROMPT" "0")) 56 | proc (Process/Start proc-builder) ;;; (.start proc-builder) 57 | out (background (capture (.StandardOutput proc))) ;;; .getInputStream 58 | err (background (capture (.StandardError proc))) ;; if debug is true, stderr will be redirected instead .getErrorStream 59 | exit (do (.WaitForExit proc) (.ExitCode proc))] ;;; .waitFor -- but .WaitForExit returns void, so we have to add the ExitCode call 60 | {:args command-args, :exit exit, :out @out, :err @err}))) 61 | 62 | ;; dirs 63 | 64 | (defn lib-dir 65 | ^DirectoryInfo [lib] ;;; ^File 66 | (cio/dir-info (:gitlibs/dir @config/CONFIG) "libs" (namespace lib) (name lib))) ;;; jio/file 67 | 68 | (def ^:private git-url-regex 69 | #"([a-z0-9+.-]+):\/\/(?:(?:(?:[^@]+?)@)?([^/]+?)(?::[0-9]*)?)?(/[^:]+)") 70 | 71 | (def ^:private git-scp-regex 72 | #"(?:(?:[^@]+?)@)?(.+?):([^:]+)") 73 | 74 | (defn- clean-url 75 | "Convert url into a safe relative path (this is not a reversible transformation) 76 | based on scheme, host, and path (drop user and port). 77 | 78 | Examples: 79 | ssh://git@gitlab.com:3333/org/repo.git => ssh/gitlab.com/org/repo 80 | git@github.com:dotted.org/dotted.repo.git => ssh/github.com/dotted.org/dotted.repo 81 | file://../foo => file/REL/_DOTDOT_/foo 82 | file:///Users/user/foo.git => file/Users/user/foo 83 | ../foo => file/REL/_DOTDOT_/foo 84 | ~user/foo.git => file/REL/_TILDE_user/foo 85 | 86 | * https://git-scm.com/docs/git-clone#_git_urls 87 | * https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols 88 | " 89 | [url] 90 | (let [[scheme host path] (cond 91 | (str/starts-with? url "file://") ["file" nil (-> url (subs 7) (str/replace #"^([^/])" "REL/$1"))] 92 | (str/includes? url "://") (let [[_ s h p] (re-matches git-url-regex url)] [s h p]) 93 | (str/includes? url ":") (let [[_ h p] (re-matches git-scp-regex url)] ["ssh" h p]) 94 | :local-repo ["file" nil (str/replace url #"^([^/])" "REL/$1")]) 95 | clean-path (-> path 96 | (str/replace #"\.git/?$" "") ;; remove trailing .git or .git/ 97 | (str/replace #"~" "_TILDE_")) ;; replace ~ with _TILDE_ 98 | dir-parts (->> (concat [scheme host] (str/split clean-path #"/")) ;; split on / 99 | (remove str/blank?) ;; remove any missing path segments 100 | (map #(-> % ({"." "_DOT_", ".." "_DOTDOT_"} %))))] ;; replace . or .. segments 101 | (str/join "/" dir-parts))) 102 | 103 | (defn git-dir 104 | ^DirectoryInfo [url] ;;; ^File 105 | (cio/dir-info (:gitlibs/dir @config/CONFIG) "_repos" (clean-url url))) ;;; jio/file 106 | 107 | (defn git-try-fetch 108 | "Try to fetch and return the error code (0=success)" 109 | [^FileInfo git-dir] ;;; ^File 110 | (let [git-path (.FullName git-dir) ;;; .getCanonicalPath 111 | ;; NOTE: --prune-tags would be desirable here but was added in git 2.17.0 112 | {:keys [exit]} (run-git "--git-dir" git-path 113 | "fetch" "--quiet" "--all" "--tags" "--prune")] 114 | exit)) 115 | 116 | (defn git-fetch 117 | [^DirectoryInfo git-dir] ;;; ^File 118 | (let [git-path (.FullName git-dir) ;;; .getCanonicalPath 119 | ;; NOTE: --prune-tags would be desirable here but was added in git 2.17.0 120 | {:keys [exit err] :as ret} (run-git "--git-dir" git-path 121 | "fetch" "--quiet" "--all" "--tags" "--prune")] 122 | (when-not (zero? exit) 123 | (throw (ex-info (format "Unable to fetch %s%n%s" git-path err) ret))))) 124 | 125 | ;; TODO: restrict clone to an optional refspec? 126 | (defn git-clone-bare 127 | [url ^DirectoryInfo git-dir] ;;; ^File 128 | (printerrln "Cloning:" url) 129 | (let [git-path (.FullName git-dir) ;;; .getCanonicalPath 130 | {:keys [exit err] :as ret} (run-git "clone" "--quiet" "--mirror" url git-path)] 131 | (when-not (zero? exit) 132 | (throw (ex-info (format "Unable to clone %s%n%s" git-path err) ret))) 133 | git-dir)) 134 | 135 | (defn ensure-git-dir 136 | "Ensure the bare git dir for the specified url, return the path to the git dir." 137 | [url] 138 | (let [git-dir-file (git-dir url) 139 | config-file (cio/file-info git-dir-file "config")] ;;; jio/file 140 | (when-not (.Exists config-file) ;;; .exists 141 | (git-clone-bare url git-dir-file)) 142 | (.FullName git-dir-file))) ;;; .getCanonicalPath 143 | 144 | (defn git-checkout 145 | [git-dir-path ^DirectoryInfo lib-dir ^String rev] ;;; ^File 146 | (let [rev-file (cio/file-info lib-dir rev)] ;;; jio/file 147 | (when-not (.Exists rev-file) ;;; .exists 148 | (let [{:keys [exit err] :as ret} 149 | (run-git "--git-dir" git-dir-path 150 | "worktree" "add" "--force" "--detach" 151 | (.FullName rev-file) rev)] ;;; .getCanonicalPath 152 | (when-not (zero? exit) 153 | (throw (ex-info (format "Unable to checkout %s%n%s" rev err) ret))))))) 154 | 155 | (defn git-rev-parse 156 | [git-dir rev] 157 | (let [{:keys [exit out]} (run-git "--git-dir" git-dir "rev-parse" (str rev "^{commit}"))] 158 | (when (zero? exit) 159 | (str/trimr out)))) 160 | 161 | (defn git-type 162 | [git-dir rev] 163 | (let [{:keys [exit out]} (run-git "--git-dir" git-dir "cat-file" "-t" rev)] 164 | (when (zero? exit) 165 | (keyword (str/trimr out))))) 166 | 167 | ;; git merge-base --is-ancestor 168 | (defn- ancestor? 169 | [git-dir x y] 170 | (let [{:keys [exit err] :as ret} (run-git "--git-dir" git-dir "merge-base" "--is-ancestor" x y)] 171 | (condp = exit 172 | 0 true 173 | 1 false 174 | (throw (ex-info (format "Unable to compare commits %s%n%s" git-dir err) ret))))) 175 | 176 | (defn commit-comparator 177 | [git-dir x y] 178 | (cond 179 | (= x y) 0 180 | (ancestor? git-dir x y) 1 181 | (ancestor? git-dir y x) -1 182 | :else (throw (ex-info "" {})))) 183 | 184 | (defn match-exact 185 | "In dir, match file in dir with exact, nil if doesn't exist" 186 | [^DirectoryInfo dir exact] ;;; ^File 187 | (when (.Exists (cio/file-info dir exact)) ;;; .exists jio/file 188 | exact)) 189 | 190 | (defn match-prefix 191 | "In dir, match file in dir with prefix, nil if not found, exception if more than one." 192 | [^DirectoryInfo dir prefix] ;;; ^File 193 | (when (.Exists dir) ;;; .exists 194 | (if (.Exists (cio/file-info dir prefix)) ;;; .exists jio/file 195 | prefix 196 | (let [matches (.GetFiles dir (str name "*"))] ;;; (.listFiles dir 197 | ;;; (reify FilenameFilter 198 | ;;; (accept [_this _dir name] 199 | ;;; (str/starts-with? name prefix))))] 200 | (case (alength matches) ;;; alength 201 | 0 nil 202 | 1 (.Name ^FileInfo (first matches)) ;;; (.getName ^File (aget matches 0)) 203 | (throw (IOException. (str "Prefix not unique: " prefix)))))))) 204 | 205 | (defn tags 206 | "Fetch, then return all tags in the git dir." 207 | [git-dir] 208 | (git-try-fetch (cio/as-dir git-dir)) ;;; jio/file 209 | (let [{:keys [exit out err] :as ret} (run-git "--git-dir" git-dir "tag" "--sort=v:refname")] 210 | (when-not (zero? exit) 211 | (throw (ex-info (format "Unable to get tags %s%n%s" git-dir err) ret))) 212 | (remove str/blank? (str/split-lines out)))) -------------------------------------------------------------------------------- /epl-v10.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Eclipse Public License - Version 1.0 8 | 25 | 26 | 27 | 28 | 29 | 30 |

Eclipse Public License - v 1.0

31 | 32 |

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE 33 | PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR 34 | DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS 35 | AGREEMENT.

36 | 37 |

1. DEFINITIONS

38 | 39 |

"Contribution" means:

40 | 41 |

a) in the case of the initial Contributor, the initial 42 | code and documentation distributed under this Agreement, and

43 |

b) in the case of each subsequent Contributor:

44 |

i) changes to the Program, and

45 |

ii) additions to the Program;

46 |

where such changes and/or additions to the Program 47 | originate from and are distributed by that particular Contributor. A 48 | Contribution 'originates' from a Contributor if it was added to the 49 | Program by such Contributor itself or anyone acting on such 50 | Contributor's behalf. Contributions do not include additions to the 51 | Program which: (i) are separate modules of software distributed in 52 | conjunction with the Program under their own license agreement, and (ii) 53 | are not derivative works of the Program.

54 | 55 |

"Contributor" means any person or entity that distributes 56 | the Program.

57 | 58 |

"Licensed Patents" mean patent claims licensable by a 59 | Contributor which are necessarily infringed by the use or sale of its 60 | Contribution alone or when combined with the Program.

61 | 62 |

"Program" means the Contributions distributed in accordance 63 | with this Agreement.

64 | 65 |

"Recipient" means anyone who receives the Program under 66 | this Agreement, including all Contributors.

67 | 68 |

2. GRANT OF RIGHTS

69 | 70 |

a) Subject to the terms of this Agreement, each 71 | Contributor hereby grants Recipient a non-exclusive, worldwide, 72 | royalty-free copyright license to reproduce, prepare derivative works 73 | of, publicly display, publicly perform, distribute and sublicense the 74 | Contribution of such Contributor, if any, and such derivative works, in 75 | source code and object code form.

76 | 77 |

b) Subject to the terms of this Agreement, each 78 | Contributor hereby grants Recipient a non-exclusive, worldwide, 79 | royalty-free patent license under Licensed Patents to make, use, sell, 80 | offer to sell, import and otherwise transfer the Contribution of such 81 | Contributor, if any, in source code and object code form. This patent 82 | license shall apply to the combination of the Contribution and the 83 | Program if, at the time the Contribution is added by the Contributor, 84 | such addition of the Contribution causes such combination to be covered 85 | by the Licensed Patents. The patent license shall not apply to any other 86 | combinations which include the Contribution. No hardware per se is 87 | licensed hereunder.

88 | 89 |

c) Recipient understands that although each Contributor 90 | grants the licenses to its Contributions set forth herein, no assurances 91 | are provided by any Contributor that the Program does not infringe the 92 | patent or other intellectual property rights of any other entity. Each 93 | Contributor disclaims any liability to Recipient for claims brought by 94 | any other entity based on infringement of intellectual property rights 95 | or otherwise. As a condition to exercising the rights and licenses 96 | granted hereunder, each Recipient hereby assumes sole responsibility to 97 | secure any other intellectual property rights needed, if any. For 98 | example, if a third party patent license is required to allow Recipient 99 | to distribute the Program, it is Recipient's responsibility to acquire 100 | that license before distributing the Program.

101 | 102 |

d) Each Contributor represents that to its knowledge it 103 | has sufficient copyright rights in its Contribution, if any, to grant 104 | the copyright license set forth in this Agreement.

105 | 106 |

3. REQUIREMENTS

107 | 108 |

A Contributor may choose to distribute the Program in object code 109 | form under its own license agreement, provided that:

110 | 111 |

a) it complies with the terms and conditions of this 112 | Agreement; and

113 | 114 |

b) its license agreement:

115 | 116 |

i) effectively disclaims on behalf of all Contributors 117 | all warranties and conditions, express and implied, including warranties 118 | or conditions of title and non-infringement, and implied warranties or 119 | conditions of merchantability and fitness for a particular purpose;

120 | 121 |

ii) effectively excludes on behalf of all Contributors 122 | all liability for damages, including direct, indirect, special, 123 | incidental and consequential damages, such as lost profits;

124 | 125 |

iii) states that any provisions which differ from this 126 | Agreement are offered by that Contributor alone and not by any other 127 | party; and

128 | 129 |

iv) states that source code for the Program is available 130 | from such Contributor, and informs licensees how to obtain it in a 131 | reasonable manner on or through a medium customarily used for software 132 | exchange.

133 | 134 |

When the Program is made available in source code form:

135 | 136 |

a) it must be made available under this Agreement; and

137 | 138 |

b) a copy of this Agreement must be included with each 139 | copy of the Program.

140 | 141 |

Contributors may not remove or alter any copyright notices contained 142 | within the Program.

143 | 144 |

Each Contributor must identify itself as the originator of its 145 | Contribution, if any, in a manner that reasonably allows subsequent 146 | Recipients to identify the originator of the Contribution.

147 | 148 |

4. COMMERCIAL DISTRIBUTION

149 | 150 |

Commercial distributors of software may accept certain 151 | responsibilities with respect to end users, business partners and the 152 | like. While this license is intended to facilitate the commercial use of 153 | the Program, the Contributor who includes the Program in a commercial 154 | product offering should do so in a manner which does not create 155 | potential liability for other Contributors. Therefore, if a Contributor 156 | includes the Program in a commercial product offering, such Contributor 157 | ("Commercial Contributor") hereby agrees to defend and 158 | indemnify every other Contributor ("Indemnified Contributor") 159 | against any losses, damages and costs (collectively "Losses") 160 | arising from claims, lawsuits and other legal actions brought by a third 161 | party against the Indemnified Contributor to the extent caused by the 162 | acts or omissions of such Commercial Contributor in connection with its 163 | distribution of the Program in a commercial product offering. The 164 | obligations in this section do not apply to any claims or Losses 165 | relating to any actual or alleged intellectual property infringement. In 166 | order to qualify, an Indemnified Contributor must: a) promptly notify 167 | the Commercial Contributor in writing of such claim, and b) allow the 168 | Commercial Contributor to control, and cooperate with the Commercial 169 | Contributor in, the defense and any related settlement negotiations. The 170 | Indemnified Contributor may participate in any such claim at its own 171 | expense.

172 | 173 |

For example, a Contributor might include the Program in a commercial 174 | product offering, Product X. That Contributor is then a Commercial 175 | Contributor. If that Commercial Contributor then makes performance 176 | claims, or offers warranties related to Product X, those performance 177 | claims and warranties are such Commercial Contributor's responsibility 178 | alone. Under this section, the Commercial Contributor would have to 179 | defend claims against the other Contributors related to those 180 | performance claims and warranties, and if a court requires any other 181 | Contributor to pay any damages as a result, the Commercial Contributor 182 | must pay those damages.

183 | 184 |

5. NO WARRANTY

185 | 186 |

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS 187 | PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 188 | OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, 189 | ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY 190 | OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely 191 | responsible for determining the appropriateness of using and 192 | distributing the Program and assumes all risks associated with its 193 | exercise of rights under this Agreement , including but not limited to 194 | the risks and costs of program errors, compliance with applicable laws, 195 | damage to or loss of data, programs or equipment, and unavailability or 196 | interruption of operations.

197 | 198 |

6. DISCLAIMER OF LIABILITY

199 | 200 |

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT 201 | NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, 202 | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING 203 | WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF 204 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 205 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR 206 | DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED 207 | HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

208 | 209 |

7. GENERAL

210 | 211 |

If any provision of this Agreement is invalid or unenforceable under 212 | applicable law, it shall not affect the validity or enforceability of 213 | the remainder of the terms of this Agreement, and without further action 214 | by the parties hereto, such provision shall be reformed to the minimum 215 | extent necessary to make such provision valid and enforceable.

216 | 217 |

If Recipient institutes patent litigation against any entity 218 | (including a cross-claim or counterclaim in a lawsuit) alleging that the 219 | Program itself (excluding combinations of the Program with other 220 | software or hardware) infringes such Recipient's patent(s), then such 221 | Recipient's rights granted under Section 2(b) shall terminate as of the 222 | date such litigation is filed.

223 | 224 |

All Recipient's rights under this Agreement shall terminate if it 225 | fails to comply with any of the material terms or conditions of this 226 | Agreement and does not cure such failure in a reasonable period of time 227 | after becoming aware of such noncompliance. If all Recipient's rights 228 | under this Agreement terminate, Recipient agrees to cease use and 229 | distribution of the Program as soon as reasonably practicable. However, 230 | Recipient's obligations under this Agreement and any licenses granted by 231 | Recipient relating to the Program shall continue and survive.

232 | 233 |

Everyone is permitted to copy and distribute copies of this 234 | Agreement, but in order to avoid inconsistency the Agreement is 235 | copyrighted and may only be modified in the following manner. The 236 | Agreement Steward reserves the right to publish new versions (including 237 | revisions) of this Agreement from time to time. No one other than the 238 | Agreement Steward has the right to modify this Agreement. The Eclipse 239 | Foundation is the initial Agreement Steward. The Eclipse Foundation may 240 | assign the responsibility to serve as the Agreement Steward to a 241 | suitable separate entity. Each new version of the Agreement will be 242 | given a distinguishing version number. The Program (including 243 | Contributions) may always be distributed subject to the version of the 244 | Agreement under which it was received. In addition, after a new version 245 | of the Agreement is published, Contributor may elect to distribute the 246 | Program (including its Contributions) under the new version. Except as 247 | expressly stated in Sections 2(a) and 2(b) above, Recipient receives no 248 | rights or licenses to the intellectual property of any Contributor under 249 | this Agreement, whether expressly, by implication, estoppel or 250 | otherwise. All rights in the Program not expressly granted under this 251 | Agreement are reserved.

252 | 253 |

This Agreement is governed by the laws of the State of New York and 254 | the intellectual property laws of the United States of America. No party 255 | to this Agreement will bring a legal action under this Agreement more 256 | than one year after the cause of action arose. Each party waives its 257 | rights to a jury trial in any resulting litigation.

258 | 259 | 260 | 261 | 262 | --------------------------------------------------------------------------------