eac_launcher 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (188) hide show
  1. checksums.yaml +4 -4
  2. data/lib/eac_launcher.rb +3 -0
  3. data/lib/eac_launcher/version.rb +1 -1
  4. data/vendor/git-subrepo/Changes +51 -0
  5. data/vendor/git-subrepo/Intro.pod +508 -0
  6. data/vendor/git-subrepo/License +21 -0
  7. data/vendor/git-subrepo/Makefile +80 -0
  8. data/vendor/git-subrepo/Meta +28 -0
  9. data/vendor/git-subrepo/ReadMe.pod +695 -0
  10. data/vendor/git-subrepo/doc/comparison.swim +35 -0
  11. data/vendor/git-subrepo/doc/git-subrepo.swim +611 -0
  12. data/vendor/git-subrepo/doc/intro-to-subrepo.swim +387 -0
  13. data/vendor/git-subrepo/ext/bashplus/Changes +15 -0
  14. data/vendor/git-subrepo/ext/bashplus/License +21 -0
  15. data/vendor/git-subrepo/ext/bashplus/Makefile +45 -0
  16. data/vendor/git-subrepo/ext/bashplus/Meta +28 -0
  17. data/vendor/git-subrepo/ext/bashplus/ReadMe.pod +77 -0
  18. data/vendor/git-subrepo/ext/bashplus/bin/bash+ +43 -0
  19. data/vendor/git-subrepo/ext/bashplus/doc/bash+.swim +61 -0
  20. data/vendor/git-subrepo/ext/bashplus/lib/bash+.bash +92 -0
  21. data/vendor/git-subrepo/ext/bashplus/man/man1/bash+.1 +134 -0
  22. data/vendor/git-subrepo/ext/bashplus/man/man3/bash+.3 +134 -0
  23. data/vendor/git-subrepo/ext/bashplus/test/base.t +12 -0
  24. data/vendor/git-subrepo/ext/bashplus/test/fcopy.t +22 -0
  25. data/vendor/git-subrepo/ext/bashplus/test/lib/foo/bar.bash +3 -0
  26. data/vendor/git-subrepo/ext/bashplus/test/lib/foo/foo.bash +3 -0
  27. data/vendor/git-subrepo/ext/bashplus/test/source-bash+-std.t +18 -0
  28. data/vendor/git-subrepo/ext/bashplus/test/source-bash+.t +23 -0
  29. data/vendor/git-subrepo/ext/bashplus/test/test.bash +70 -0
  30. data/vendor/git-subrepo/ext/bashplus/test/use.t +19 -0
  31. data/vendor/git-subrepo/ext/test-more-bash/Changes +15 -0
  32. data/vendor/git-subrepo/ext/test-more-bash/License +21 -0
  33. data/vendor/git-subrepo/ext/test-more-bash/Makefile +20 -0
  34. data/vendor/git-subrepo/ext/test-more-bash/Meta +30 -0
  35. data/vendor/git-subrepo/ext/test-more-bash/ReadMe.pod +115 -0
  36. data/vendor/git-subrepo/ext/test-more-bash/doc/test-more.swim +89 -0
  37. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/Changes +15 -0
  38. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/License +21 -0
  39. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/Makefile +45 -0
  40. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/Meta +28 -0
  41. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/ReadMe.pod +77 -0
  42. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/bin/bash+ +43 -0
  43. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/doc/bash+.swim +61 -0
  44. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/lib/bash+.bash +92 -0
  45. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/man/man1/bash+.1 +134 -0
  46. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/man/man3/bash+.3 +134 -0
  47. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/test/base.t +12 -0
  48. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/test/fcopy.t +22 -0
  49. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/test/lib/foo/bar.bash +3 -0
  50. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/test/lib/foo/foo.bash +3 -0
  51. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/test/source-bash+-std.t +18 -0
  52. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/test/source-bash+.t +23 -0
  53. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/test/test.bash +70 -0
  54. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/test/use.t +19 -0
  55. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/Changes +15 -0
  56. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/License +21 -0
  57. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/Makefile +37 -0
  58. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/Meta +28 -0
  59. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/ReadMe.pod +66 -0
  60. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/doc/test-tap.swim +48 -0
  61. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/lib/test/tap.bash +153 -0
  62. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/man/man3/test-tap.3 +119 -0
  63. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/bail_out.t +13 -0
  64. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/done.t +10 -0
  65. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/fail.t +20 -0
  66. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/fail_fast.t +15 -0
  67. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/helper.bash +9 -0
  68. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/pass.t +9 -0
  69. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/plan.t +10 -0
  70. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/skip_all.t +20 -0
  71. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/tap.t +13 -0
  72. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/test/bail.t +14 -0
  73. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/test/fail.t +7 -0
  74. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/test/fail_fast.t +12 -0
  75. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/test/skip-all-init.t +8 -0
  76. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/test/skip-all-plan.t +9 -0
  77. data/vendor/git-subrepo/ext/test-more-bash/lib/test/more.bash +95 -0
  78. data/vendor/git-subrepo/ext/test-more-bash/man/man3/test-more.3 +173 -0
  79. data/vendor/git-subrepo/ext/test-more-bash/test/fail.t +20 -0
  80. data/vendor/git-subrepo/ext/test-more-bash/test/more.t +20 -0
  81. data/vendor/git-subrepo/ext/test-more-bash/test/pass.t +9 -0
  82. data/vendor/git-subrepo/ext/test-more-bash/test/setup +8 -0
  83. data/vendor/git-subrepo/ext/test-more-bash/test/skip_all.t +11 -0
  84. data/vendor/git-subrepo/ext/test-more-bash/test/test/fail1.t +12 -0
  85. data/vendor/git-subrepo/ext/test-more-bash/test/test/skip_all.t +10 -0
  86. data/vendor/git-subrepo/lib/git-subrepo +1891 -0
  87. data/vendor/git-subrepo/lib/git-subrepo.d/bash+.bash +1 -0
  88. data/vendor/git-subrepo/lib/git-subrepo.d/help-functions.bash +343 -0
  89. data/vendor/git-subrepo/man/man1/git-subrepo.1 +746 -0
  90. data/vendor/git-subrepo/note/0.4.0 +12 -0
  91. data/vendor/git-subrepo/note/AllGitCmds +148 -0
  92. data/vendor/git-subrepo/note/Cases +32 -0
  93. data/vendor/git-subrepo/note/Commands +33 -0
  94. data/vendor/git-subrepo/note/Dags +199 -0
  95. data/vendor/git-subrepo/note/Gists +7 -0
  96. data/vendor/git-subrepo/note/Links +25 -0
  97. data/vendor/git-subrepo/note/Plugins +10 -0
  98. data/vendor/git-subrepo/note/Spec +39 -0
  99. data/vendor/git-subrepo/note/Story1 +57 -0
  100. data/vendor/git-subrepo/note/ToDo +55 -0
  101. data/vendor/git-subrepo/note/design.swim +137 -0
  102. data/vendor/git-subrepo/note/design2.swim +85 -0
  103. data/vendor/git-subrepo/note/init-test +38 -0
  104. data/vendor/git-subrepo/note/pull-dance.txt +18 -0
  105. data/vendor/git-subrepo/note/recreate-rebase-conflict.sh +56 -0
  106. data/vendor/git-subrepo/note/subtree-rebase-fail-example/test.bash +29 -0
  107. data/vendor/git-subrepo/note/test-subrepo-push.sh +69 -0
  108. data/vendor/git-subrepo/note/test.sh +58 -0
  109. data/vendor/git-subrepo/pkg/bin/generate-completion.pl +210 -0
  110. data/vendor/git-subrepo/pkg/bin/generate-help-functions.pl +89 -0
  111. data/vendor/git-subrepo/share/completion.bash +42 -0
  112. data/vendor/git-subrepo/share/enable-completion.sh +50 -0
  113. data/vendor/git-subrepo/share/git-completion.bash +2738 -0
  114. data/vendor/git-subrepo/share/zsh-completion/_git-subrepo +82 -0
  115. data/vendor/git-subrepo/test/branch-all.t +41 -0
  116. data/vendor/git-subrepo/test/branch-rev-list-one-path.t +43 -0
  117. data/vendor/git-subrepo/test/branch-rev-list.t +47 -0
  118. data/vendor/git-subrepo/test/branch.t +52 -0
  119. data/vendor/git-subrepo/test/clean.t +43 -0
  120. data/vendor/git-subrepo/test/clone-annotated-tag.t +45 -0
  121. data/vendor/git-subrepo/test/clone.t +107 -0
  122. data/vendor/git-subrepo/test/compile.t +19 -0
  123. data/vendor/git-subrepo/test/config.t +58 -0
  124. data/vendor/git-subrepo/test/encode.t +91 -0
  125. data/vendor/git-subrepo/test/error.t +171 -0
  126. data/vendor/git-subrepo/test/fetch.t +43 -0
  127. data/vendor/git-subrepo/test/gitignore.t +61 -0
  128. data/vendor/git-subrepo/test/init.t +64 -0
  129. data/vendor/git-subrepo/test/issue29.t +98 -0
  130. data/vendor/git-subrepo/test/issue95.t +98 -0
  131. data/vendor/git-subrepo/test/issue96.t +96 -0
  132. data/vendor/git-subrepo/test/pull-all.t +38 -0
  133. data/vendor/git-subrepo/test/pull-merge.t +113 -0
  134. data/vendor/git-subrepo/test/pull-message.t +88 -0
  135. data/vendor/git-subrepo/test/pull-new-branch.t +58 -0
  136. data/vendor/git-subrepo/test/pull-ours.t +90 -0
  137. data/vendor/git-subrepo/test/pull-theirs.t +82 -0
  138. data/vendor/git-subrepo/test/pull-twice.t +44 -0
  139. data/vendor/git-subrepo/test/pull.t +99 -0
  140. data/vendor/git-subrepo/test/push-after-init.t +51 -0
  141. data/vendor/git-subrepo/test/push-force.t +56 -0
  142. data/vendor/git-subrepo/test/push-new-branch.t +61 -0
  143. data/vendor/git-subrepo/test/push-no-changes.t +29 -0
  144. data/vendor/git-subrepo/test/push-squash.t +56 -0
  145. data/vendor/git-subrepo/test/push.t +176 -0
  146. data/vendor/git-subrepo/test/reclone.t +45 -0
  147. data/vendor/git-subrepo/test/repo/bar/HEAD +1 -0
  148. data/vendor/git-subrepo/test/repo/bar/config +4 -0
  149. data/vendor/git-subrepo/test/repo/bar/objects/1f/0c4b264caed0126814a0ede851a1e0b4e16ae6 +0 -0
  150. data/vendor/git-subrepo/test/repo/bar/objects/87/46903fdb1b9c2101377880125917c2e05b4d69 +0 -0
  151. data/vendor/git-subrepo/test/repo/bar/objects/94/c86ffc745232d89f78c6f895e11e71272518db +0 -0
  152. data/vendor/git-subrepo/test/repo/bar/objects/c6/76c57b6576743fa56278527aa60ebd2e202a7c +0 -0
  153. data/vendor/git-subrepo/test/repo/bar/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 +0 -0
  154. data/vendor/git-subrepo/test/repo/bar/objects/f6/2a8ff3feadf39b0a98f1a86ec6d1eb33858ee9 +0 -0
  155. data/vendor/git-subrepo/test/repo/bar/refs/heads/master +1 -0
  156. data/vendor/git-subrepo/test/repo/bar/refs/tags/A +1 -0
  157. data/vendor/git-subrepo/test/repo/foo/HEAD +1 -0
  158. data/vendor/git-subrepo/test/repo/foo/config +4 -0
  159. data/vendor/git-subrepo/test/repo/foo/objects/a0/f4cdaaf533a936296cdebbed8206c3b9ededa8 +0 -0
  160. data/vendor/git-subrepo/test/repo/foo/objects/e2/1291a1ad392a9d4c51dd9586804f1467b28afd +0 -0
  161. data/vendor/git-subrepo/test/repo/foo/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 +0 -0
  162. data/vendor/git-subrepo/test/repo/foo/refs/heads/master +1 -0
  163. data/vendor/git-subrepo/test/repo/init/HEAD +1 -0
  164. data/vendor/git-subrepo/test/repo/init/config +5 -0
  165. data/vendor/git-subrepo/test/repo/init/objects/11/523f5dcf03b4c89b592dc8a3d0308f68da2386 +0 -0
  166. data/vendor/git-subrepo/test/repo/init/objects/14/2addf8ec5f37334e837440122c62f2c68a29ad +0 -0
  167. data/vendor/git-subrepo/test/repo/init/objects/32/5180321750a21cd7a4e7ecda319e557a4f6a09 +2 -0
  168. data/vendor/git-subrepo/test/repo/init/objects/3d/918c6901c02f43af5d31779dd5e1f9166aeb36 +0 -0
  169. data/vendor/git-subrepo/test/repo/init/objects/3e/4cb596066dce63ba4d047abddb677389b65e19 +0 -0
  170. data/vendor/git-subrepo/test/repo/init/objects/4b/6e53022e7a04f07887697e4f3d7c377fd9822b +0 -0
  171. data/vendor/git-subrepo/test/repo/init/objects/58/931fc1bd559b59c41ea738fc7ad04f9ad01bd3 +0 -0
  172. data/vendor/git-subrepo/test/repo/init/objects/5e/c0c28e1b806f25efdca18fcf7a74b49c3755bd +0 -0
  173. data/vendor/git-subrepo/test/repo/init/objects/75/fa6584e748f57eff06eebdc55e9ac21d4fcbf2 +1 -0
  174. data/vendor/git-subrepo/test/repo/init/objects/80/2d5edbd5e1cb7fca82b5bd38e7c8a0a496fb20 +0 -0
  175. data/vendor/git-subrepo/test/repo/init/objects/94/7b3d714c38791e95ad6f928b48c98bb8708acd +0 -0
  176. data/vendor/git-subrepo/test/repo/init/objects/95/e1f2df3f4d5f3d7a60588c25a7ca8a913d3c2a +1 -0
  177. data/vendor/git-subrepo/test/repo/init/objects/b1/5f4a7666baf40d949548ead946a3370e273479 +0 -0
  178. data/vendor/git-subrepo/test/repo/init/objects/c3/ee8978c4c5d84c3b7d00ba8e5906933d027882 +0 -0
  179. data/vendor/git-subrepo/test/repo/init/objects/c8/b0bffbc405ef3fad7354ff833fbec36d67ddfa +3 -0
  180. data/vendor/git-subrepo/test/repo/init/objects/dd/8bdb934ec848137f011fe423b185505c343626 +2 -0
  181. data/vendor/git-subrepo/test/repo/init/objects/e2/9be58c767cfeb27235c995d293a7d71aac0135 +2 -0
  182. data/vendor/git-subrepo/test/repo/init/objects/ee/1224401fc6aac595145fa727dcf6706ac8aec1 +1 -0
  183. data/vendor/git-subrepo/test/repo/init/objects/f1/cc1a657b2e805c400f5dcaaa76bd29c6178b1b +0 -0
  184. data/vendor/git-subrepo/test/repo/init/refs/heads/master +1 -0
  185. data/vendor/git-subrepo/test/setup +205 -0
  186. data/vendor/git-subrepo/test/status.t +68 -0
  187. data/vendor/git-subrepo/test/submodule.t +45 -0
  188. metadata +186 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7c5a7b375361961ba04d494e5951f67f9a3fef5b
4
- data.tar.gz: 8346f75d6b450beaca58be9b77a8468fff5b115b
3
+ metadata.gz: 1d410f2c08231928e1531dda72287207d04477d1
4
+ data.tar.gz: 40a329c0dbbddf47ff95cdb18d147eebca5ca5df
5
5
  SHA512:
6
- metadata.gz: eb45c7cffc1795bf357ed5eaafa1110d95ca070e5ea7b816881d75b44af0b77337a05125c29520277fcb6cc37e5dad27624ee8cfa7e7bc5a09a75182bea5f988
7
- data.tar.gz: 2b0e5822b3addeee9bbf09619569caba0f5def8bc2843a4ef8ab33c3b5732aa05cd2591ee1c7e2ed23dde7457741a96e84cc5e572e414b5c3e2d5dbf0f0f4a5a
6
+ metadata.gz: e1261386616cfd588ac8aa9ef95172c0592f4f01516fcee710b27bc1ff3ef283dc5a32cb4d888b73c85460d8c02366693f247e9f7c2bddc124bfaa7af7b6c912
7
+ data.tar.gz: 8daf62a7b0877999962ab27bd10f4cb3b54248a38a56bb72540ddfc061d7ca6f80e9c8c6e5769e92df86d63c9f8ad03df85d125a2ed2c22725da09d1e6325cf9
@@ -12,6 +12,9 @@ require('rubygems')
12
12
  require('shellwords')
13
13
  require('yaml')
14
14
 
15
+ GIT_SUBREPO_LIB = ::File.join(::File.dirname(__dir__), 'vendor', 'git-subrepo', 'lib')
16
+ ENV['PATH'] = "#{GIT_SUBREPO_LIB}#{::File::PATH_SEPARATOR}#{ENV['PATH']}"
17
+
15
18
  module EacLauncher
16
19
  require 'eac_launcher/context'
17
20
  require 'eac_launcher/paths/logical'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EacLauncher
4
- VERSION = '0.3.0'.freeze
4
+ VERSION = '0.3.1'.freeze
5
5
  end
@@ -0,0 +1,51 @@
1
+ ---
2
+ version: 0.3.1
3
+ date: Tue Jan 3 23:08:56 PST 2017
4
+ changes:
5
+ - Updated release for homebrew
6
+ - Fix #192
7
+ ---
8
+ version: 0.3.0
9
+ date: Wed Dec 2 19:19:43 PST 2015
10
+ changes:
11
+ - Fix issue #98 and host of others (89, 91, 95, 96)
12
+ - Adds support for the merge-base command
13
+ - Adds stability to many commands
14
+ - Command completion updates
15
+ - Rename `init` to `.rc`
16
+ - @grimmySwe++ @dzzh++ @jrosdahl++ @perlpunk++
17
+ ---
18
+ version: 0.2.3
19
+ date: Sun Aug 9 13:44:22 PDT 2015
20
+ changes:
21
+ - Fix issues #75 and #76
22
+ ---
23
+ version: 0.2.2
24
+ date: Wed Jul 22 09:45:13 PDT 2015
25
+ changes:
26
+ - Added the `init` subcommand
27
+ - Applied doc fixes
28
+ ---
29
+ version: 0.2.1
30
+ date: Sat Mar 28 07:52:22 PDT 2015
31
+ changes:
32
+ - Allows subrepo clone to clone to an empty branch; fixes #26.
33
+ - Refs in status
34
+ - Empty parent set to 'none' in .gitrepo file.
35
+ - Bug fixes
36
+ ---
37
+ version: 0.2.0
38
+ date: Sat Jan 24 06:22:05 PST 2015
39
+ changes:
40
+ - Massive overhaul
41
+ - .gitrepo files remain the same so backwards compatible
42
+ - Introduce the branch and commit subcommands
43
+ - The checkout subcommand goes away
44
+ - Operations work much smoother like normal Git flow
45
+ - Much more testing
46
+ - Better doc
47
+ ---
48
+ version: 0.1.0
49
+ date: Fri Feb 21 12:25:53 2014 -0800
50
+ changes:
51
+ - First version
@@ -0,0 +1,508 @@
1
+ =pod
2
+
3
+ =for comment
4
+ DO NOT EDIT. This Pod was generated by Swim v0.1.41.
5
+ See http://github.com/ingydotnet/swim-pm#readme
6
+
7
+ =encoding utf8
8
+
9
+ =head1 Introducing Git Subrepos
10
+
11
+ There is a new git command called C<subrepo> that is meant to be a solid
12
+ alternative to the C<submodule> and C<subtree> commands. All 3 of these
13
+ commands allow you to include external repositories (pinned to specific
14
+ commits) in your main repository. This is an often needed feature for project
15
+ development under a source control system like Git. Unfortunately, the
16
+ C<submodule> command is severely lacking, and the C<subtree> command (an
17
+ attempt to make things better) is also very flawed. Fortunately, the
18
+ C<subrepo> command is here to save the day.
19
+
20
+ This article will discuss how the previous commands work, and where they go
21
+ wrong, while explaining how the new C<subrepo> command fixes the issues.
22
+
23
+ It should be noted that there are 3 distinct roles (ways people use repos)
24
+ involved in discussing this topic:
25
+
26
+ =over
27
+
28
+ =item * B<owner> — The primary author and repo owner
29
+
30
+ =item * B<collaborators> — Other developers who contribute to the repo
31
+
32
+ =item * B<users> — People who simply use the repo software
33
+
34
+ =back
35
+
36
+ =head2 Introducing C<subrepo>
37
+
38
+ While the main point is to show how subrepo addresses the shortcomings
39
+ of submodule and subtree, I'll start by giving a quick intro to the
40
+ subrepo command.
41
+
42
+ Let's say that you have a project repo called 'freebird' and you want to have
43
+ it include 2 other external repos, 'lynyrd' and 'skynyrd'. You would do the
44
+ following:
45
+
46
+ git clone git@github.com/you/freebird
47
+ cd freebird
48
+ git subrepo clone git@github.com/you/lynyrd ext/lynyrd
49
+ git subrepo clone git@github.com/you/skynyrd ext/skynyrd --branch=1975
50
+
51
+ What these commands do (at a high level) should be obvious. They "clone" (add)
52
+ the repos content into the subdirectories you told them to. The details of
53
+ what is happening to your repo will be discussed later, but adding new
54
+ subrepos is easy. If you need to update the subrepos later:
55
+
56
+ git subrepo pull ext/lynyrd
57
+ git subrepo pull ext/skynyrd --branch=1976
58
+
59
+ The lynyrd repo is tracking the upstream master branch, and you've changed the
60
+ skynyrd subrepo to the 1976 branch. Since these subrepos are owned by 'you',
61
+ you might want to change them in the context of your freebird repo. When
62
+ things are working, you can push the subrepo changes back:
63
+
64
+ git subrepo push ext/lynyrd
65
+ git subrepo push ext/skynyrd
66
+
67
+ Looks simple right? It's supposed to be. The intent of C<subrepo> is to do the
68
+ right things, and to not cause problems.
69
+
70
+ Of course there's more to it under the hood, and that's what the rest of this
71
+ article is about.
72
+
73
+ =head2 Git Submodules
74
+
75
+ Submodules tend to receive a lot of bad press. Here's some of it:
76
+
77
+ =over
78
+
79
+ =item * L<http://ayende.com/blog/4746/the-problem-with-git-submodules>
80
+
81
+ =item * L<http://somethingsinistral.net/blog/git-submodules-are-probably-not-the-answer/>
82
+
83
+ =item * L<http://codingkilledthecat.wordpress.com/2012/04/28/why-your-company-shouldnt-use-git-submodules/>
84
+
85
+ =back
86
+
87
+ A quick recap of some of the good and bad things about submodules:
88
+
89
+ Good:
90
+
91
+ =over
92
+
93
+ =item * Use an external repo in a dedicated subdir of your project.
94
+
95
+ =item * Pin the external repo to a specific commit.
96
+
97
+ =item * The C<git-submodule> command is a core part of the Git project.
98
+
99
+ =back
100
+
101
+ Bad:
102
+
103
+ =over
104
+
105
+ =item * Users have to know a repo has submodules.
106
+
107
+ =item * Users have to get the subrepos manually.
108
+
109
+ =item * Pulling a repo with submodules won't pull in the new submodule changes.
110
+
111
+ =item * A submodule will break if the referenced repo goes away.
112
+
113
+ =item * A submodule will break if a forced push removes the referenced commit.
114
+
115
+ =item * Can't use different submodules/commits per main project branch.
116
+
117
+ =item * Can't "try out" a submodule on alternate branch.
118
+
119
+ =item * Main repo can be pushed upstream pointing to unpushed submod commits.
120
+
121
+ =item * Command capability differs across Git versions.
122
+
123
+ =item * Often need to change remote url, to push submodule changes upstream.
124
+
125
+ =item * Removing or renaming a submodule requires many steps.
126
+
127
+ =back
128
+
129
+ Internally, submodules are a real mess. They give the strong impression of
130
+ being bolted on, well after Git was designed. Some commands are aware of the
131
+ existence of submodules (although usually half-heartedly), and many commands
132
+ are oblivious. For instance the git-clone command has a C<--recursive> option
133
+ to clone all subrepos, but it's not a default, so you still need to be aware
134
+ of the need. The git-checkout command does nothing with the submodules, even
135
+ if they are intended to differ across branches.
136
+
137
+ Let's talk a bit about how submodules are implemented in Git. Information
138
+ about them is stored in 3 different places (in the top level repo directory):
139
+
140
+ =over
141
+
142
+ =item * C<.gitmodules>
143
+
144
+ =item * C<.git/config>
145
+
146
+ =item * C<.git/modules> — The submodule repo's meta data (refs/objects)
147
+
148
+ =back
149
+
150
+ So some of the information lives in the repo history (.gitmodules), but other
151
+ info (.git/) is only known to the local repo.
152
+
153
+ In addition, the submodule introduces a new low level concept, to the
154
+ commitI<tree>blob graph. Normally a git tree object points to blob (file)
155
+ objects and more tree (directory) objects. Submodules have tree objects point
156
+ to B<commit> objects. While this seems clever and somewhat reasonable, it also
157
+ means that every other git command (which was built on the super clean Git
158
+ data model) has to be aware of this new possibility (and deal with it
159
+ appropriately).
160
+
161
+ The point is that, while submodules are a real need, and a lot of work has
162
+ gone into making them work decently, they are essentially a kludge to the Git
163
+ model, and it is quite understandable why they haven't worked out as well as
164
+ people would expect.
165
+
166
+ NOTE: Submodules I<are> getting better with each release of Git, but it's
167
+ still an endless catch up game.
168
+
169
+ =head2 Git Subtrees
170
+
171
+ One day, someone decided to think different. Instead of pointing to external
172
+ repos, why not just include them into the main repo (but also allow them to be
173
+ pulled and pushed separately as needed)?
174
+
175
+ At first this may feel like a wasteful approach. Why keep other repos
176
+ physically inside your main one? But if you think about it abstractly, what's
177
+ the difference? You want your users and collaborators to have all this code
178
+ because your project needs it. So why worry about how it happens? In the end,
179
+ the choice is yours, but I've grown very comfortable with this concept and
180
+ I'll try to justify it well. I should note that the first paragraph of the
181
+ C<submodule> doc suggests considering this alternative.
182
+
183
+ The big win here is that you can do this using the existing git model. Nothing
184
+ new is added. You are just adding commits to a history. You can do it
185
+ different on every branch. You can merge branches sensibly.
186
+
187
+ The git-subtree command seems to have been inspired by Git's subtree merge
188
+ strategy, which it uses internally, and possibly got its name from. A subtree
189
+ merge allows you to take a completely separate Git history and make it be a
190
+ subdirectory of your repo.
191
+
192
+ Adding a subtree was the easy part. All that needed to be done after that was
193
+ to figure out a way to pull upstream changes and push local ones back
194
+ upstream. And that's what the C<git-subtree> command does.
195
+
196
+ So what's the problem with git-subtree then?
197
+
198
+ Well unfortunately, it drops a few balls. The main problems come down to an
199
+ overly complicated commandline UX, poor collaborator awareness, and a fragile
200
+ and messy implementation.
201
+
202
+ Good:
203
+
204
+ =over
205
+
206
+ =item * Use an external repo in a dedicated subdir of your project.
207
+
208
+ =item * Pin the external repo to a specific commit.
209
+
210
+ =item * Users get everything with a normal clone command.
211
+
212
+ =item * Users don't need to know that subtrees are involved.
213
+
214
+ =item * Can use different submodules/commits per main project branch.
215
+
216
+ =item * Users don't need the subtree command. Only owners and collaborators.
217
+
218
+ =back
219
+
220
+ Bad:
221
+
222
+ =over
223
+
224
+ =item * The remote url and branch info is not saved (except in the history).
225
+
226
+ =item * Owners and collaborators have to enter the remote for every command.
227
+
228
+ =item * Collaborators aren't made aware that subtrees are involved.
229
+
230
+ =item * Pulled history is not squashed by default.
231
+
232
+ =item * Creates a messy historical view. (See below)
233
+
234
+ =item * Bash code is complicated.
235
+
236
+ =item * Only one test file. Currently is failing.
237
+
238
+ =back
239
+
240
+ As you can see, subtree makes quite a few things better, but after trying it
241
+ for a while, the experience was more annoying than submodules. For example,
242
+ consider this usage:
243
+
244
+ $ git subtree add --squash --prefix=foo git@github.com:my/thing mybranch
245
+ # weeks go by…
246
+ $ git subtree pull --squash --prefix=foo git@github.com:my/thing mybranch
247
+ # time to push local subtree changes back upstream
248
+ $ git subtree push --prefix=foo git@github.com:my/thing mybranch
249
+
250
+ The first thing you notice is the overly verbose syntax. It's justified in the
251
+ first command, but in the other 2 commands I really don't want to have to
252
+ remember what the remote and branch are that I'm using.
253
+
254
+ Moreover, my collaborators have no idea that subtrees are involved, let alone
255
+ where they came from.
256
+
257
+ Consider the equivalent subrepo commands:
258
+
259
+ $ git subrepo clone git@github.com:my/thing foo -b mybranch
260
+ $ git subrepo pull foo
261
+ $ git subrepo push foo
262
+
263
+ Collaborators see a file called 'foo/.gitrepo', and know that the subdir is a
264
+ subrepo. The file contains all the information needed by future commands
265
+ applied to that subrepo.
266
+
267
+ =head2 Git Subrepos
268
+
269
+ Now is a good time to dive into the techinical aspects of the C<subrepo>
270
+ command, but first let me explain how it came about.
271
+
272
+ As you may have surmised by now, I am the author of git-subrepo. I'd used
273
+ submodules on and off for years, and when I became aware of subtree I gave it
274
+ a try, but I quickly realized its problems. I decided maybe it could be
275
+ improved. I decided to write down my expected commandline usage and my ideals
276
+ of what it would and would not do. Then I set off to implement it. It's been a
277
+ long road, but what I ended up with was even better than what I wanted from
278
+ the start.
279
+
280
+ Let's review the Goods and Bads:
281
+
282
+ Good:
283
+
284
+ =over
285
+
286
+ =item * Use an external repo in a dedicated subdir of your project.
287
+
288
+ =item * Pin the external repo to a specific commit.
289
+
290
+ =item * Users get everything with a normal clone command.
291
+
292
+ =item * Users don't need to know that subrepos are involved.
293
+
294
+ =item * Can use different submodules/commits per main project branch.
295
+
296
+ =item * Meta info is kept in an obvious place.
297
+
298
+ =item * Everyone knows when a subdir is a subrepo.
299
+
300
+ =item * Commandline UX is minimal and intuitive.
301
+
302
+ =item * Pulled history is always squashed out locally.
303
+
304
+ =item * Pushed history is kept intact.
305
+
306
+ =item * Creates a clean historical view. (See below)
307
+
308
+ =item * Bash code is very simple and easy to follow.
309
+
310
+ =item * Comprehensive test suite. Currently passing on travis:
311
+
312
+ =back
313
+
314
+ <badge travis ingydotnet/git-subrepo>
315
+
316
+ Bad:
317
+
318
+ =over
319
+
320
+ =item * --Subrepo is very new.-- (no longer true)
321
+
322
+ =item * --Not well tested in the wild.-- (no longer true)
323
+
324
+ =back
325
+
326
+ This review may seem somewhat slanted, but I honestly am not aware of any
327
+ "bad" points that I'm not disclosing. That said, I am sure time will reveal
328
+ bugs and shortcomings. Those can usually be fixed. Hopefully the B<model> is
329
+ correct, because that's harder to fix down the road.
330
+
331
+ OK. So how does it all work?
332
+
333
+ There are 3 main commands: cloneI<pull>push. Let's start with the clone
334
+ command. This is the easiest part. You give it a remote url, possibly a new
335
+ subdir to put it, and possibly a remote branch to use. I say possibly, because
336
+ the command can guess the subdir name (just like the git-clone command does),
337
+ and the branch can be the upstream default branch.
338
+
339
+ Given this we do the following steps internally:
340
+
341
+ =over
342
+
343
+ =item * Fetch the remote content (for a specific refspec)
344
+
345
+ =item * Read the remote head tree into the index
346
+
347
+ =item * Checkout the index into the new subdir
348
+
349
+ =item * Create a new subrepo commit object for the subdir content
350
+
351
+ =item * Add a state file called .gitrepo to the new subrepo/subdir
352
+
353
+ =item * Amend the merge commit with this new file
354
+
355
+ =back
356
+
357
+ This process adds something like this to the top of your history:
358
+
359
+ * 9b6ddc9 git subrepo clone git@github.com:you/foo.git foo/
360
+ * 37c61a5 Previous head commit of your repo
361
+
362
+ The entire history has been squashed down into one commit, and placed on
363
+ top of your history. This is important as it keeps your history as clean
364
+ as possible. You don't need to have the subrepo history in your main
365
+ project, since it is immutably available elsewhere, and you have a pointer
366
+ to that place.
367
+
368
+ The new foo/.gitrepo file looks like this:
369
+
370
+ [subrepo]
371
+ remote = git@github.com:you/foo.git
372
+ branch = master
373
+ commit = 14c96c6931b41257b2d42b2edc67ddc659325823
374
+ parent = 37c61a5a234f5dd6f5c2aec037509f50d3a79b8f
375
+ cmdver = 0.1.0
376
+
377
+ It contains all the info needed now and later. Note that the repo url is the
378
+ generally pushable form, rather than the publically readable (L<https://…)>
379
+ form. This is the best practice. Users of your repo don't need access to this
380
+ url, because the content is already in your repo. Only you and your
381
+ collaborators need this url to pull/push in the future.
382
+
383
+ The next command is the pull command. Normally you just give it the subrepo's
384
+ subdir path (although you can change the branch with -b), and it will get the
385
+ other info from the subdir/.gitrepo file.
386
+
387
+ The pull command does these steps:
388
+
389
+ =over
390
+
391
+ =item * Fetch the upstream content
392
+
393
+ =item * Check if anything needs pulling
394
+
395
+ =item * Create a branch of local subrepo commits since last pull
396
+
397
+ =item * Rebase this branch onto the upstream commits
398
+
399
+ =item * Commit the HEAD of the rebased content
400
+
401
+ =item * Update/amend the .gitrepo file
402
+
403
+ =back
404
+
405
+ =head3 Clean History
406
+
407
+ I've talked a bit about clean history but let me show you a comparison between
408
+ subrepo and subtree. Let's run this command sequence using both methods. Note
409
+ the differences between I<both> the command syntax required, and the branch
410
+ history produced.
411
+
412
+ Subrepo first:
413
+
414
+ $ git subrepo clone git@github.com:user/abc
415
+ $ git subrepo clone git@github.com:user/def xyz
416
+ $ git subrepo pull abc
417
+ $ git subrepo pull xyz
418
+
419
+ The resulting history is:
420
+
421
+ * b1f60cc subrepo pull xyz
422
+ * 4fb0276 subrepo pull abc
423
+ * bcef2a0 subrepo clone git@github.com:user/def xyz
424
+ * bebf0db subrepo clone git@github.com:user/abc
425
+ * 64eeaa6 (origin/master, origin/HEAD) O HAI FREND
426
+
427
+ Compare that to B<subtree>. This:
428
+
429
+ $ git subrepo add abc git@github.com:user/abc master
430
+ $ git subrepo add xyz git@github.com:user/def master
431
+ $ git subrepo pull abc git@github.com:user/abc master
432
+ $ git subrepo pull xyz git@github.com:user/def master
433
+
434
+ Produces this:
435
+
436
+ * 739e45a (HEAD, master) Merge commit '5f563469d886d53e19cb908b3a64e4229f88a2d1'
437
+ |\
438
+ | * 5f56346 Squashed 'xyz/' changes from 08c7421..365409f
439
+ * | 641f5e5 Merge commit '8d88e90ce5f653ed2e7608a71b8693a2174ea62a'
440
+ |\ \
441
+ | * | 8d88e90 Squashed 'abc/' changes from 08c7421..365409f
442
+ * | | 1703ed2 Merge commit '0e091b672c4bbbbf6bc4f6694c475d127ffa21eb' as 'xyz'
443
+ |\ \ \
444
+ | | |/
445
+ | |/|
446
+ | * | 0e091b6 Squashed 'xyz/' content from commit 08c7421
447
+ | /
448
+ * | 07b77e7 Merge commit 'cd2b30a0229d931979ed4436b995875ec563faea' as 'abc'
449
+ |\ \
450
+ | |/
451
+ | * cd2b30a Squashed 'abc/' content from commit 08c7421
452
+ * 64eeaa6 (origin/master, origin/HEAD) O HAI FREND
453
+
454
+ This was from a minimal case. Subtree history (when viewed this way at least)
455
+ gets unreasonably ugly fast. Subrepo history, by contrast, always looks as
456
+ clean as shown.
457
+
458
+ The final command, push, bascially just does the pull/rebase dance above
459
+ described, and pushes the resulting history back. It does not squash the
460
+ commits made locally, because it assumed that when you changed the local
461
+ subrepo, you made messages that were intended to eventually be published
462
+ back upstream.
463
+
464
+ =head2 Conflict Resolution
465
+
466
+ The commands described above can also be done "by hand". If something fails
467
+ during a pull or push (generally in the rebasing) then the command will tell
468
+ you what to do to finish up.
469
+
470
+ You might choose to do everything by hand, and do your own merging strategies.
471
+ This is perfectly reasonable. The C<subrepo> command offers a few other helper
472
+ commands to help you get the job done:
473
+
474
+ =over
475
+
476
+ =item * C<fetch> - Fetch the upstream and create a C<< subrepo/remote/<subdir> >> ref.
477
+
478
+ =item * C<branch> - Create a branch of local subdir commits since the last pull, called C<< subrepo/<subdir> >>.
479
+
480
+ =item * C<commit> - Commit a merged branch's HEAD back into your repo.
481
+
482
+ =item * C<status> - Show lots of useful info about the current state of the subrepos.
483
+
484
+ =item * C<clean> - Remove branches, ref and remotes created by subrepo commands.
485
+
486
+ =item * C<help> - Read the complete documentation!
487
+
488
+ =back
489
+
490
+ =head2 Conclusion
491
+
492
+ Hopefully by now, you see that submodules are a painful choice with a dubious
493
+ future, and that subtree, while a solid idea has many usage issues.
494
+
495
+ Give C<subrepo> a try. It's painless, easily revertable and just might be what
496
+ the doctor ordered.
497
+
498
+ =head2 Reference Links
499
+
500
+ =over
501
+
502
+ =item * L<http://longair.net/blog/2010/06/02/git-submodules-explained/>
503
+
504
+ =item * L<http://blogs.atlassian.com/2013/05/alternatives-to-git-submodule-git-subtree/>
505
+
506
+ =back
507
+
508
+ =cut