├── .gitignore ├── .travis.yml ├── CHANGES.md ├── LICENSE.md ├── Makefile ├── README.md ├── dune-project ├── nosetup.opam └── src ├── dune ├── merlin_parser.ml ├── merlin_parser.mli └── nosetup.ml /.gitignore: -------------------------------------------------------------------------------- 1 | /_build/ 2 | /_opam/ 3 | *.install 4 | .merlin 5 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: c 2 | sudo: required 3 | install: wget https://raw.githubusercontent.com/ocaml/ocaml-ci-scripts/master/.travis-opam.sh 4 | script: bash -ex .travis-opam.sh 5 | env: 6 | global: 7 | - TESTS=false 8 | - PACKAGE=nosetup 9 | matrix: 10 | - OCAML_VERSION=4.07 11 | - OCAML_VERSION=4.06 12 | - OCAML_VERSION=4.05 13 | - OCAML_VERSION=4.04 14 | - OCAML_VERSION=4.03 15 | -------------------------------------------------------------------------------- /CHANGES.md: -------------------------------------------------------------------------------- 1 | * Restrict OCaml versions to support the syntax we use 2 | * Do not export all the private cruft from the Merlin parser 3 | 4 | v0.8.1 2016-12-29 5 | ----------------- 6 | 7 | * Add some more data and rewrite `README.md` for `topkg` to happily generate 8 | `opam` releases. 9 | 10 | v0.8.0 2016-12-29 11 | ----------------- 12 | 13 | First release. 14 | 15 | * Can discover/parse `.merlin` files 16 | * `#requires` `findlib` packages into Toplevel/UTop 17 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Apache License 2 | ============== 3 | 4 | _Version 2.0, January 2004_ 5 | _<>_ 6 | 7 | ### Terms and Conditions for use, reproduction, and distribution 8 | 9 | #### 1. Definitions 10 | 11 | “License” shall mean the terms and conditions for use, reproduction, and 12 | distribution as defined by Sections 1 through 9 of this document. 13 | 14 | “Licensor” shall mean the copyright owner or entity authorized by the copyright 15 | owner that is granting the License. 16 | 17 | “Legal Entity” shall mean the union of the acting entity and all other entities 18 | that control, are controlled by, or are under common control with that entity. 19 | For the purposes of this definition, “control” means **(i)** the power, direct or 20 | indirect, to cause the direction or management of such entity, whether by 21 | contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the 22 | outstanding shares, or **(iii)** beneficial ownership of such entity. 23 | 24 | “You” (or “Your”) shall mean an individual or Legal Entity exercising 25 | permissions granted by this License. 26 | 27 | “Source” form shall mean the preferred form for making modifications, including 28 | but not limited to software source code, documentation source, and configuration 29 | files. 30 | 31 | “Object” form shall mean any form resulting from mechanical transformation or 32 | translation of a Source form, including but not limited to compiled object code, 33 | generated documentation, and conversions to other media types. 34 | 35 | “Work” shall mean the work of authorship, whether in Source or Object form, made 36 | available under the License, as indicated by a copyright notice that is included 37 | in or attached to the work (an example is provided in the Appendix below). 38 | 39 | “Derivative Works” shall mean any work, whether in Source or Object form, that 40 | is based on (or derived from) the Work and for which the editorial revisions, 41 | annotations, elaborations, or other modifications represent, as a whole, an 42 | original work of authorship. For the purposes of this License, Derivative Works 43 | shall not include works that remain separable from, or merely link (or bind by 44 | name) to the interfaces of, the Work and Derivative Works thereof. 45 | 46 | “Contribution” shall mean any work of authorship, including the original version 47 | of the Work and any modifications or additions to that Work or Derivative Works 48 | thereof, that is intentionally submitted to Licensor for inclusion in the Work 49 | by the copyright owner or by an individual or Legal Entity authorized to submit 50 | on behalf of the copyright owner. For the purposes of this definition, 51 | “submitted” means any form of electronic, verbal, or written communication sent 52 | to the Licensor or its representatives, including but not limited to 53 | communication on electronic mailing lists, source code control systems, and 54 | issue tracking systems that are managed by, or on behalf of, the Licensor for 55 | the purpose of discussing and improving the Work, but excluding communication 56 | that is conspicuously marked or otherwise designated in writing by the copyright 57 | owner as “Not a Contribution.” 58 | 59 | “Contributor” shall mean Licensor and any individual or Legal Entity on behalf 60 | of whom a Contribution has been received by Licensor and subsequently 61 | incorporated within the Work. 62 | 63 | #### 2. Grant of Copyright License 64 | 65 | Subject to the terms and conditions of this License, each Contributor hereby 66 | grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, 67 | irrevocable copyright license to reproduce, prepare Derivative Works of, 68 | publicly display, publicly perform, sublicense, and distribute the Work and such 69 | Derivative Works in Source or Object form. 70 | 71 | #### 3. Grant of Patent License 72 | 73 | Subject to the terms and conditions of this License, each Contributor hereby 74 | grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, 75 | irrevocable (except as stated in this section) patent license to make, have 76 | made, use, offer to sell, sell, import, and otherwise transfer the Work, where 77 | such license applies only to those patent claims licensable by such Contributor 78 | that are necessarily infringed by their Contribution(s) alone or by combination 79 | of their Contribution(s) with the Work to which such Contribution(s) was 80 | submitted. If You institute patent litigation against any entity (including a 81 | cross-claim or counterclaim in a lawsuit) alleging that the Work or a 82 | Contribution incorporated within the Work constitutes direct or contributory 83 | patent infringement, then any patent licenses granted to You under this License 84 | for that Work shall terminate as of the date such litigation is filed. 85 | 86 | #### 4. Redistribution 87 | 88 | You may reproduce and distribute copies of the Work or Derivative Works thereof 89 | in any medium, with or without modifications, and in Source or Object form, 90 | provided that You meet the following conditions: 91 | 92 | * **(a)** You must give any other recipients of the Work or Derivative Works a copy of 93 | this License; and 94 | * **(b)** You must cause any modified files to carry prominent notices stating that You 95 | changed the files; and 96 | * **(c)** You must retain, in the Source form of any Derivative Works that You distribute, 97 | all copyright, patent, trademark, and attribution notices from the Source form 98 | of the Work, excluding those notices that do not pertain to any part of the 99 | Derivative Works; and 100 | * **(d)** If the Work includes a “NOTICE” text file as part of its distribution, then any 101 | Derivative Works that You distribute must include a readable copy of the 102 | attribution notices contained within such NOTICE file, excluding those notices 103 | that do not pertain to any part of the Derivative Works, in at least one of the 104 | following places: within a NOTICE text file distributed as part of the 105 | Derivative Works; within the Source form or documentation, if provided along 106 | with the Derivative Works; or, within a display generated by the Derivative 107 | Works, if and wherever such third-party notices normally appear. The contents of 108 | the NOTICE file are for informational purposes only and do not modify the 109 | License. You may add Your own attribution notices within Derivative Works that 110 | You distribute, alongside or as an addendum to the NOTICE text from the Work, 111 | provided that such additional attribution notices cannot be construed as 112 | modifying the License. 113 | 114 | You may add Your own copyright statement to Your modifications and may provide 115 | additional or different license terms and conditions for use, reproduction, or 116 | distribution of Your modifications, or for any such Derivative Works as a whole, 117 | provided Your use, reproduction, and distribution of the Work otherwise complies 118 | with the conditions stated in this License. 119 | 120 | #### 5. Submission of Contributions 121 | 122 | Unless You explicitly state otherwise, any Contribution intentionally submitted 123 | for inclusion in the Work by You to the Licensor shall be under the terms and 124 | conditions of this License, without any additional terms or conditions. 125 | Notwithstanding the above, nothing herein shall supersede or modify the terms of 126 | any separate license agreement you may have executed with Licensor regarding 127 | such Contributions. 128 | 129 | #### 6. Trademarks 130 | 131 | This License does not grant permission to use the trade names, trademarks, 132 | service marks, or product names of the Licensor, except as required for 133 | reasonable and customary use in describing the origin of the Work and 134 | reproducing the content of the NOTICE file. 135 | 136 | #### 7. Disclaimer of Warranty 137 | 138 | Unless required by applicable law or agreed to in writing, Licensor provides the 139 | Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, 140 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, 141 | including, without limitation, any warranties or conditions of TITLE, 142 | NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are 143 | solely responsible for determining the appropriateness of using or 144 | redistributing the Work and assume any risks associated with Your exercise of 145 | permissions under this License. 146 | 147 | #### 8. Limitation of Liability 148 | 149 | In no event and under no legal theory, whether in tort (including negligence), 150 | contract, or otherwise, unless required by applicable law (such as deliberate 151 | and grossly negligent acts) or agreed to in writing, shall any Contributor be 152 | liable to You for damages, including any direct, indirect, special, incidental, 153 | or consequential damages of any character arising as a result of this License or 154 | out of the use or inability to use the Work (including but not limited to 155 | damages for loss of goodwill, work stoppage, computer failure or malfunction, or 156 | any and all other commercial damages or losses), even if such Contributor has 157 | been advised of the possibility of such damages. 158 | 159 | #### 9. Accepting Warranty or Additional Liability 160 | 161 | While redistributing the Work or Derivative Works thereof, You may choose to 162 | offer, and charge a fee for, acceptance of support, warranty, indemnity, or 163 | other liability obligations and/or rights consistent with this License. However, 164 | in accepting such obligations, You may act only on Your own behalf and on Your 165 | sole responsibility, not on behalf of any other Contributor, and only if You 166 | agree to indemnify, defend, and hold each Contributor harmless for any liability 167 | incurred by, or claims asserted against, such Contributor by reason of your 168 | accepting any such warranty or additional liability. 169 | 170 | _END OF TERMS AND CONDITIONS_ 171 | 172 | ### APPENDIX: How to apply the Apache License to your work 173 | 174 | To apply the Apache License to your work, attach the following boilerplate 175 | notice, with the fields enclosed by brackets `[]` replaced with your own 176 | identifying information. (Don't include the brackets!) The text should be 177 | enclosed in the appropriate comment syntax for the file format. We also 178 | recommend that a file or class name and description of purpose be included on 179 | the same “printed page” as the copyright notice for easier identification within 180 | third-party archives. 181 | 182 | Copyright [yyyy] [name of copyright owner] 183 | 184 | Licensed under the Apache License, Version 2.0 (the "License"); 185 | you may not use this file except in compliance with the License. 186 | You may obtain a copy of the License at 187 | 188 | http://www.apache.org/licenses/LICENSE-2.0 189 | 190 | Unless required by applicable law or agreed to in writing, software 191 | distributed under the License is distributed on an "AS IS" BASIS, 192 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 193 | See the License for the specific language governing permissions and 194 | limitations under the License. 195 | 196 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: all 2 | all: 3 | dune build 4 | 5 | .PHONY: clean 6 | clean: 7 | dune clean 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # nosetup - An `.ocamlinit` helper to `#require` packages in an OCaml toplevels 2 | 3 | `nosetup` helps you to load the dependencies of your project into your toplevel 4 | of choice (OCaml Toplevel as well as UTOP) so you don't have to `#require` your 5 | dependencies yourself. It does so by finding your project metadata (even if you 6 | are in a subdirectory, similar to `git`), parsing it and then using `findlib` 7 | to load it into your toplevel session. 8 | 9 | Currently it supports Merlin's `.merlin` files, though there is no limitation 10 | of which files *could* be supported as long as the `findlib` package names can 11 | be parsed. 12 | 13 | ## Naming 14 | 15 | You can call it `no-setup` or `nose-tup`. In the latter case you can use 16 | `(👃,👃)` as logo. 17 | 18 | ## Installation 19 | 20 | Be sure to have installed: 21 | 22 | ```sh 23 | opam switch create . --deps-only ocaml-base-compiler.4.07.1 24 | ``` 25 | 26 | then building the source can be done with a simple incantation: 27 | 28 | ```sh 29 | make 30 | ``` 31 | 32 | ## Usage 33 | 34 | You need to add a bit to your `.ocamlinit`: 35 | 36 | ```ocaml 37 | #require "nosetup";; 38 | ``` 39 | 40 | Now every `utop` you'll start will have all the `findlib` packages from your 41 | `.merlin` file preloaded. No need to do anything more. 42 | 43 | ## License 44 | 45 | As you can see in the `LICENSE.md`, it is Apache 2.0 licensed. 46 | -------------------------------------------------------------------------------- /dune-project: -------------------------------------------------------------------------------- 1 | (lang dune 1.0) 2 | (name nosetup) 3 | -------------------------------------------------------------------------------- /nosetup.opam: -------------------------------------------------------------------------------- 1 | opam-version: "1.2" 2 | maintainer: "Marek Kubica " 3 | author: "Marek Kubica " 4 | homepage: "https://github.com/Leonidas-from-XIV/nosetup" 5 | doc: "https://leonidas-from-xiv.github.io/nosetup/api" 6 | bug-reports: "https://github.com/Leonidas-from-XIV/nosetup/issues" 7 | dev-repo: "https://github.com/Leonidas-from-XIV/nosetup.git" 8 | depends: [ 9 | "ocamlfind" 10 | "dune" {build & >= "1.0"} 11 | "angstrom" {>= "0.7.0"} 12 | "containers" 13 | ] 14 | build: ["dune" "build" "-p" name "-j" jobs] 15 | available: [ ocaml-version >= "4.03.0" ] 16 | -------------------------------------------------------------------------------- /src/dune: -------------------------------------------------------------------------------- 1 | (library 2 | (name nosetup) 3 | (public_name nosetup) 4 | (libraries containers angstrom findlib.top)) 5 | -------------------------------------------------------------------------------- /src/merlin_parser.ml: -------------------------------------------------------------------------------- 1 | open Angstrom 2 | 3 | let is_not_end_line c = c <> '\n' 4 | let pkg_name c = c <> ' ' && c <> '\n' 5 | 6 | let pkg_line = string "PKG " *> sep_by (char ' ') (take_while1 pkg_name) 7 | let skip_line = skip_while is_not_end_line *> return [] 8 | 9 | let any_line = pkg_line <|> skip_line 10 | 11 | let parser = sep_by (char '\n') any_line 12 | 13 | let parse content = 14 | match parse_string parser content with 15 | | Error _ -> 16 | [] 17 | | Ok lines -> 18 | List.flatten lines 19 | -------------------------------------------------------------------------------- /src/merlin_parser.mli: -------------------------------------------------------------------------------- 1 | val parse : string -> string list 2 | -------------------------------------------------------------------------------- /src/nosetup.ml: -------------------------------------------------------------------------------- 1 | open Containers 2 | (* TODO: add support for _tags file as well *) 3 | 4 | let rec locate_till_root path filename = 5 | let candidate = Filename.concat path filename in 6 | match Unix.access candidate [Unix.R_OK] with 7 | | _ -> Some candidate 8 | | exception Unix.Unix_error _ -> 9 | let parent = Filename.concat path Filename.parent_dir_name in 10 | match (Unix.stat path, Unix.stat parent) with 11 | | ({ st_ino = this_ino; _}, { st_ino = parent_ino; _}) when this_ino = parent_ino -> 12 | None 13 | | _ -> locate_till_root parent filename 14 | 15 | let locate_merlin_file path = 16 | locate_till_root path ".merlin" 17 | 18 | let parse_merlin_packages path = 19 | IO.with_in path IO.read_all 20 | |> Merlin_parser.parse 21 | 22 | let main () = 23 | let open Option.Infix in 24 | locate_merlin_file Filename.current_dir_name 25 | >|= parse_merlin_packages 26 | |> Option.get_or ~default:[] 27 | |> Topfind.load_deeply 28 | 29 | let () = 30 | main () 31 | --------------------------------------------------------------------------------