eac_git 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (190) hide show
  1. checksums.yaml +4 -4
  2. data/lib/eac_git/executables.rb +24 -4
  3. data/lib/eac_git/rspec.rb +17 -0
  4. data/lib/eac_git/version.rb +1 -1
  5. data/vendor/git-subrepo/Changes +110 -0
  6. data/vendor/git-subrepo/Intro.pod +509 -0
  7. data/vendor/git-subrepo/License +21 -0
  8. data/vendor/git-subrepo/Makefile +82 -0
  9. data/vendor/git-subrepo/Meta +28 -0
  10. data/vendor/git-subrepo/ReadMe.pod +698 -0
  11. data/vendor/git-subrepo/doc/comparison.swim +35 -0
  12. data/vendor/git-subrepo/doc/git-subrepo.swim +608 -0
  13. data/vendor/git-subrepo/doc/intro-to-subrepo.swim +387 -0
  14. data/vendor/git-subrepo/ext/bashplus/Changes +15 -0
  15. data/vendor/git-subrepo/ext/bashplus/License +21 -0
  16. data/vendor/git-subrepo/ext/bashplus/Makefile +45 -0
  17. data/vendor/git-subrepo/ext/bashplus/Meta +28 -0
  18. data/vendor/git-subrepo/ext/bashplus/ReadMe.pod +77 -0
  19. data/vendor/git-subrepo/ext/bashplus/bin/bash+ +43 -0
  20. data/vendor/git-subrepo/ext/bashplus/doc/bash+.swim +61 -0
  21. data/vendor/git-subrepo/ext/bashplus/lib/bash+.bash +92 -0
  22. data/vendor/git-subrepo/ext/bashplus/man/man1/bash+.1 +134 -0
  23. data/vendor/git-subrepo/ext/bashplus/man/man3/bash+.3 +134 -0
  24. data/vendor/git-subrepo/ext/bashplus/test/base.t +12 -0
  25. data/vendor/git-subrepo/ext/bashplus/test/fcopy.t +22 -0
  26. data/vendor/git-subrepo/ext/bashplus/test/lib/foo/bar.bash +3 -0
  27. data/vendor/git-subrepo/ext/bashplus/test/lib/foo/foo.bash +3 -0
  28. data/vendor/git-subrepo/ext/bashplus/test/source-bash+-std.t +18 -0
  29. data/vendor/git-subrepo/ext/bashplus/test/source-bash+.t +23 -0
  30. data/vendor/git-subrepo/ext/bashplus/test/test.bash +70 -0
  31. data/vendor/git-subrepo/ext/bashplus/test/use.t +19 -0
  32. data/vendor/git-subrepo/ext/test-more-bash/Changes +15 -0
  33. data/vendor/git-subrepo/ext/test-more-bash/License +21 -0
  34. data/vendor/git-subrepo/ext/test-more-bash/Makefile +20 -0
  35. data/vendor/git-subrepo/ext/test-more-bash/Meta +30 -0
  36. data/vendor/git-subrepo/ext/test-more-bash/ReadMe.pod +115 -0
  37. data/vendor/git-subrepo/ext/test-more-bash/doc/test-more.swim +89 -0
  38. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/Changes +15 -0
  39. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/License +21 -0
  40. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/Makefile +45 -0
  41. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/Meta +28 -0
  42. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/ReadMe.pod +77 -0
  43. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/bin/bash+ +43 -0
  44. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/doc/bash+.swim +61 -0
  45. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/lib/bash+.bash +92 -0
  46. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/man/man1/bash+.1 +134 -0
  47. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/man/man3/bash+.3 +134 -0
  48. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/test/base.t +12 -0
  49. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/test/fcopy.t +22 -0
  50. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/test/lib/foo/bar.bash +3 -0
  51. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/test/lib/foo/foo.bash +3 -0
  52. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/test/source-bash+-std.t +18 -0
  53. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/test/source-bash+.t +23 -0
  54. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/test/test.bash +70 -0
  55. data/vendor/git-subrepo/ext/test-more-bash/ext/bashplus/test/use.t +19 -0
  56. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/Changes +15 -0
  57. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/License +21 -0
  58. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/Makefile +37 -0
  59. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/Meta +28 -0
  60. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/ReadMe.pod +66 -0
  61. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/doc/test-tap.swim +48 -0
  62. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/lib/test/tap.bash +153 -0
  63. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/man/man3/test-tap.3 +119 -0
  64. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/bail_out.t +13 -0
  65. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/done.t +10 -0
  66. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/fail.t +20 -0
  67. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/fail_fast.t +15 -0
  68. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/helper.bash +9 -0
  69. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/pass.t +9 -0
  70. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/plan.t +10 -0
  71. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/skip_all.t +20 -0
  72. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/tap.t +13 -0
  73. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/test/bail.t +14 -0
  74. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/test/fail.t +7 -0
  75. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/test/fail_fast.t +12 -0
  76. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/test/skip-all-init.t +8 -0
  77. data/vendor/git-subrepo/ext/test-more-bash/ext/test-tap-bash/test/test/skip-all-plan.t +9 -0
  78. data/vendor/git-subrepo/ext/test-more-bash/lib/test/more.bash +95 -0
  79. data/vendor/git-subrepo/ext/test-more-bash/man/man3/test-more.3 +173 -0
  80. data/vendor/git-subrepo/ext/test-more-bash/test/fail.t +20 -0
  81. data/vendor/git-subrepo/ext/test-more-bash/test/more.t +20 -0
  82. data/vendor/git-subrepo/ext/test-more-bash/test/pass.t +9 -0
  83. data/vendor/git-subrepo/ext/test-more-bash/test/setup +8 -0
  84. data/vendor/git-subrepo/ext/test-more-bash/test/skip_all.t +11 -0
  85. data/vendor/git-subrepo/ext/test-more-bash/test/test/fail1.t +12 -0
  86. data/vendor/git-subrepo/ext/test-more-bash/test/test/skip_all.t +10 -0
  87. data/vendor/git-subrepo/lib/git-subrepo +1901 -0
  88. data/vendor/git-subrepo/lib/git-subrepo.d/bash+.bash +1 -0
  89. data/vendor/git-subrepo/lib/git-subrepo.d/help-functions.bash +339 -0
  90. data/vendor/git-subrepo/man/man1/git-subrepo.1 +743 -0
  91. data/vendor/git-subrepo/note/0.4.0 +12 -0
  92. data/vendor/git-subrepo/note/AllGitCmds +148 -0
  93. data/vendor/git-subrepo/note/Cases +32 -0
  94. data/vendor/git-subrepo/note/Commands +33 -0
  95. data/vendor/git-subrepo/note/Dags +199 -0
  96. data/vendor/git-subrepo/note/Gists +7 -0
  97. data/vendor/git-subrepo/note/Links +25 -0
  98. data/vendor/git-subrepo/note/Plugins +10 -0
  99. data/vendor/git-subrepo/note/Spec +39 -0
  100. data/vendor/git-subrepo/note/Story1 +57 -0
  101. data/vendor/git-subrepo/note/ToDo +55 -0
  102. data/vendor/git-subrepo/note/design.swim +137 -0
  103. data/vendor/git-subrepo/note/design2.swim +85 -0
  104. data/vendor/git-subrepo/note/init-test +38 -0
  105. data/vendor/git-subrepo/note/pull-dance.txt +18 -0
  106. data/vendor/git-subrepo/note/recreate-rebase-conflict.sh +56 -0
  107. data/vendor/git-subrepo/note/subtree-rebase-fail-example/test.bash +29 -0
  108. data/vendor/git-subrepo/note/test-subrepo-push.sh +69 -0
  109. data/vendor/git-subrepo/note/test.sh +58 -0
  110. data/vendor/git-subrepo/pkg/bin/generate-completion.pl +210 -0
  111. data/vendor/git-subrepo/pkg/bin/generate-help-functions.pl +89 -0
  112. data/vendor/git-subrepo/share/completion.bash +42 -0
  113. data/vendor/git-subrepo/share/enable-completion.sh +50 -0
  114. data/vendor/git-subrepo/share/git-completion.bash +2738 -0
  115. data/vendor/git-subrepo/share/zsh-completion/_git-subrepo +81 -0
  116. data/vendor/git-subrepo/test/branch-all.t +41 -0
  117. data/vendor/git-subrepo/test/branch-rev-list-one-path.t +43 -0
  118. data/vendor/git-subrepo/test/branch-rev-list.t +47 -0
  119. data/vendor/git-subrepo/test/branch.t +52 -0
  120. data/vendor/git-subrepo/test/clean.t +43 -0
  121. data/vendor/git-subrepo/test/clone-annotated-tag.t +45 -0
  122. data/vendor/git-subrepo/test/clone.t +107 -0
  123. data/vendor/git-subrepo/test/compile.t +19 -0
  124. data/vendor/git-subrepo/test/config.t +58 -0
  125. data/vendor/git-subrepo/test/encode.t +91 -0
  126. data/vendor/git-subrepo/test/error.t +171 -0
  127. data/vendor/git-subrepo/test/fetch.t +43 -0
  128. data/vendor/git-subrepo/test/gitignore.t +61 -0
  129. data/vendor/git-subrepo/test/init.t +64 -0
  130. data/vendor/git-subrepo/test/issue29.t +98 -0
  131. data/vendor/git-subrepo/test/issue95.t +98 -0
  132. data/vendor/git-subrepo/test/issue96.t +96 -0
  133. data/vendor/git-subrepo/test/pull-all.t +38 -0
  134. data/vendor/git-subrepo/test/pull-merge.t +113 -0
  135. data/vendor/git-subrepo/test/pull-message.t +88 -0
  136. data/vendor/git-subrepo/test/pull-new-branch.t +58 -0
  137. data/vendor/git-subrepo/test/pull-ours.t +90 -0
  138. data/vendor/git-subrepo/test/pull-theirs.t +82 -0
  139. data/vendor/git-subrepo/test/pull-twice.t +44 -0
  140. data/vendor/git-subrepo/test/pull-worktree.t +40 -0
  141. data/vendor/git-subrepo/test/pull.t +99 -0
  142. data/vendor/git-subrepo/test/push-after-init.t +51 -0
  143. data/vendor/git-subrepo/test/push-force.t +56 -0
  144. data/vendor/git-subrepo/test/push-new-branch.t +61 -0
  145. data/vendor/git-subrepo/test/push-no-changes.t +29 -0
  146. data/vendor/git-subrepo/test/push-squash.t +56 -0
  147. data/vendor/git-subrepo/test/push.t +176 -0
  148. data/vendor/git-subrepo/test/reclone.t +45 -0
  149. data/vendor/git-subrepo/test/repo/bar/HEAD +1 -0
  150. data/vendor/git-subrepo/test/repo/bar/config +4 -0
  151. data/vendor/git-subrepo/test/repo/bar/objects/1f/0c4b264caed0126814a0ede851a1e0b4e16ae6 +0 -0
  152. data/vendor/git-subrepo/test/repo/bar/objects/87/46903fdb1b9c2101377880125917c2e05b4d69 +0 -0
  153. data/vendor/git-subrepo/test/repo/bar/objects/94/c86ffc745232d89f78c6f895e11e71272518db +0 -0
  154. data/vendor/git-subrepo/test/repo/bar/objects/c6/76c57b6576743fa56278527aa60ebd2e202a7c +0 -0
  155. data/vendor/git-subrepo/test/repo/bar/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 +0 -0
  156. data/vendor/git-subrepo/test/repo/bar/objects/f6/2a8ff3feadf39b0a98f1a86ec6d1eb33858ee9 +0 -0
  157. data/vendor/git-subrepo/test/repo/bar/refs/heads/master +1 -0
  158. data/vendor/git-subrepo/test/repo/bar/refs/tags/A +1 -0
  159. data/vendor/git-subrepo/test/repo/foo/HEAD +1 -0
  160. data/vendor/git-subrepo/test/repo/foo/config +4 -0
  161. data/vendor/git-subrepo/test/repo/foo/objects/a0/f4cdaaf533a936296cdebbed8206c3b9ededa8 +0 -0
  162. data/vendor/git-subrepo/test/repo/foo/objects/e2/1291a1ad392a9d4c51dd9586804f1467b28afd +0 -0
  163. data/vendor/git-subrepo/test/repo/foo/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 +0 -0
  164. data/vendor/git-subrepo/test/repo/foo/refs/heads/master +1 -0
  165. data/vendor/git-subrepo/test/repo/init/HEAD +1 -0
  166. data/vendor/git-subrepo/test/repo/init/config +5 -0
  167. data/vendor/git-subrepo/test/repo/init/objects/11/523f5dcf03b4c89b592dc8a3d0308f68da2386 +0 -0
  168. data/vendor/git-subrepo/test/repo/init/objects/14/2addf8ec5f37334e837440122c62f2c68a29ad +0 -0
  169. data/vendor/git-subrepo/test/repo/init/objects/32/5180321750a21cd7a4e7ecda319e557a4f6a09 +2 -0
  170. data/vendor/git-subrepo/test/repo/init/objects/3d/918c6901c02f43af5d31779dd5e1f9166aeb36 +0 -0
  171. data/vendor/git-subrepo/test/repo/init/objects/3e/4cb596066dce63ba4d047abddb677389b65e19 +0 -0
  172. data/vendor/git-subrepo/test/repo/init/objects/4b/6e53022e7a04f07887697e4f3d7c377fd9822b +0 -0
  173. data/vendor/git-subrepo/test/repo/init/objects/58/931fc1bd559b59c41ea738fc7ad04f9ad01bd3 +0 -0
  174. data/vendor/git-subrepo/test/repo/init/objects/5e/c0c28e1b806f25efdca18fcf7a74b49c3755bd +0 -0
  175. data/vendor/git-subrepo/test/repo/init/objects/75/fa6584e748f57eff06eebdc55e9ac21d4fcbf2 +1 -0
  176. data/vendor/git-subrepo/test/repo/init/objects/80/2d5edbd5e1cb7fca82b5bd38e7c8a0a496fb20 +0 -0
  177. data/vendor/git-subrepo/test/repo/init/objects/94/7b3d714c38791e95ad6f928b48c98bb8708acd +0 -0
  178. data/vendor/git-subrepo/test/repo/init/objects/95/e1f2df3f4d5f3d7a60588c25a7ca8a913d3c2a +1 -0
  179. data/vendor/git-subrepo/test/repo/init/objects/b1/5f4a7666baf40d949548ead946a3370e273479 +0 -0
  180. data/vendor/git-subrepo/test/repo/init/objects/c3/ee8978c4c5d84c3b7d00ba8e5906933d027882 +0 -0
  181. data/vendor/git-subrepo/test/repo/init/objects/c8/b0bffbc405ef3fad7354ff833fbec36d67ddfa +3 -0
  182. data/vendor/git-subrepo/test/repo/init/objects/dd/8bdb934ec848137f011fe423b185505c343626 +2 -0
  183. data/vendor/git-subrepo/test/repo/init/objects/e2/9be58c767cfeb27235c995d293a7d71aac0135 +2 -0
  184. data/vendor/git-subrepo/test/repo/init/objects/ee/1224401fc6aac595145fa727dcf6706ac8aec1 +1 -0
  185. data/vendor/git-subrepo/test/repo/init/objects/f1/cc1a657b2e805c400f5dcaaa76bd29c6178b1b +0 -0
  186. data/vendor/git-subrepo/test/repo/init/refs/heads/master +1 -0
  187. data/vendor/git-subrepo/test/setup +205 -0
  188. data/vendor/git-subrepo/test/status.t +68 -0
  189. data/vendor/git-subrepo/test/submodule.t +45 -0
  190. metadata +188 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 950c9a3032c7b567df429f08449a4c3cc79cf09088c34baff66a091c5e8b4cc8
4
- data.tar.gz: 645347929c4062d2dd982909d03919629d1327790f0a707ec108f9d2715cf3b5
3
+ metadata.gz: d73549410f4839f94dd14de3eba6c184467a96e9e984b59bf4db1f3b95993f68
4
+ data.tar.gz: 424c428bd4d3c6b47fae518ede0c1e9aa6fbba78d3431833008d368c645da0fe
5
5
  SHA512:
6
- metadata.gz: 59eb9e3bd7d20d5345768ee7d6c1837169f24b7fa48cc14f4f241677ada1d770974ce90901caa04ed08323c221bd15891829f29f104ed14f4718f8b096b926d7
7
- data.tar.gz: 368ef48ac16375e6387e1ace60f61e6e03ecb09a070af72da64b88262d6f9e19960123aea81faafece3e832e4bc38140da7a60d8780f58dbf1bc409b9c215522
6
+ metadata.gz: 10e25c6d1b5364ea1015c59642815823b5c35752e7ef1c0bc59a434a3a2229c3fb124a75d5a1b2ebdf2d729bc45379e6b0f78dd0df79454ef4739e71dff007ce
7
+ data.tar.gz: ea40762796eb6152094a124bc44b54784b4c4efaeb9580a095266182a7544350990b9cd95bafbea2723c17e296730f6898bfeb78f81d30f844f8e0c5b9d1be3d
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'eac_ruby_utils/core_ext'
3
4
  require 'eac_ruby_utils/envs'
4
- require 'eac_ruby_utils/simple_cache'
5
5
 
6
6
  module EacGit
7
7
  module Executables
@@ -14,9 +14,29 @@ module EacGit
14
14
 
15
15
  private
16
16
 
17
- %w[git].each do |program|
18
- define_method(program.underscore + '_uncached') do
19
- env.executable(program, '--version')
17
+ def git_uncached
18
+ r = env.executable('git', '--version')
19
+ r.extend(GitCommandExtensions)
20
+ r
21
+ end
22
+
23
+ module GitCommandExtensions
24
+ def command(*args)
25
+ super(*args).envvar('PATH', path_with_git_subrepo)
26
+ end
27
+
28
+ def gem_root
29
+ '../..'.to_pathname.expand_path(__dir__)
30
+ end
31
+
32
+ def git_subrepo_root
33
+ gem_root.join('vendor', 'git-subrepo')
34
+ end
35
+
36
+ def path_with_git_subrepo
37
+ ([git_subrepo_root.join('lib').to_path] +
38
+ ENV['PATH'].if_present('').split(::File::PATH_SEPARATOR))
39
+ .join(::File::PATH_SEPARATOR)
20
40
  end
21
41
  end
22
42
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/rspec/conditional'
4
+ require 'eac_git/executables'
5
+
6
+ module EacGit
7
+ module Rspec
8
+ class << self
9
+ def configure
10
+ ::EacRubyUtils::Rspec::Conditional.default.add(:git) do
11
+ ::EacGit::Executables.git.validate
12
+ end
13
+ RSpec.configure { |config| ::EacRubyUtils::Rspec::Conditional.default.configure(config) }
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EacGit
4
- VERSION = '0.1.0'
4
+ VERSION = '0.2.0'
5
5
  end
@@ -0,0 +1,110 @@
1
+ ---
2
+ version: 0.4.1
3
+ date: Thu Jan 9 17:11:21 CST 2020
4
+ - Fix Bash version error messages and add to .rc
5
+ - Nicer YAML formatting in .travis.yml
6
+ - Wrap a long line
7
+ - Update the docs
8
+ - Force `make update` to always update docs
9
+ - Don't use XXX in perl stuff
10
+ - Add testing on MacOS
11
+ - Remove conflicting -C from install -d commands.
12
+ - Update version requirement documentation
13
+ - Correct error message in branch
14
+ - Use topo-order in subrepo branch
15
+ - Make “git subrepo clean -f ...” delete refs correctly
16
+ - Fix #410 Push empty repositories with recent git versions
17
+ - Make subrepo work when run in a worktree
18
+ - Simplify finding subrepos
19
+ - Ask git to find the .gitrepo files
20
+ - Doc: fix sentence repetition
21
+ - Fix typos
22
+ - Fixed typo
23
+ - Travis CI not checking out a branch.
24
+ ---
25
+ version: 0.4.0
26
+ date: Thu Nov 8 12:26:38 CET 2018
27
+ changes:
28
+ - Fix #325 Do not squash main repo commits
29
+ - Improve error message for worktree handling
30
+ - Make version checking portable. #307
31
+ - #307, improve version check
32
+ - #307, update version requirement
33
+ - Fix part #308, Add stderr output if commands fail
34
+ - Fix #306: Add check to prevent following commits with no .gitrepo
35
+ - Remove dry-run flag as it's not implemented. Make sure branch --force delete worktree
36
+ - Fix #296, Replace --first-parent with --ancestry-path
37
+ - Fix #291, specify Trusty host to get new 2.x git
38
+ - Fix #258, add --no-tags to git fetch
39
+ - Test that no remotes are created during clone
40
+ - #257 Remove remote creation to avoid problems with fetch --all
41
+ - (origin/issue/150_to_0.4.0) Fix remove-worktree, remove unused parameters
42
+ - Regenerate completion files
43
+ - filter-branch operation should not be done on HEAD
44
+ - Cleanup push and add hint to push directly after pull
45
+ - Simplify cleanup and add worktree to status
46
+ - Add --method option to init/clone, add a 'config' command
47
+ - Updated unit tests to support the new logic
48
+ - Use 'git worktree' for merge/rebase
49
+ - Update docs to reflect how things should work
50
+ - Make it possible to specify commit messages
51
+ - Redesign, trash the tree hash approach and use merges instead
52
+ - Add release branches to travis-ci
53
+ - Add --method option to init/clone, add a 'config' command
54
+ - Detect multiple pulls, use -u flag to decide
55
+ - Don't reuse previous commit message when using --all
56
+ - Update the docs for pull and push
57
+ - Update error messages when failing merge/rebase
58
+ - Fix env var bug in test/push.t
59
+ - Do not overwrite author information
60
+ ---
61
+ version: 0.3.1
62
+ date: Tue Jan 3 23:08:56 PST 2017
63
+ changes:
64
+ - Updated release for homebrew
65
+ - Fix #192
66
+ ---
67
+ version: 0.3.0
68
+ date: Wed Dec 2 19:19:43 PST 2015
69
+ changes:
70
+ - Fix issue #98 and host of others (89, 91, 95, 96)
71
+ - Adds support for the merge-base command
72
+ - Adds stability to many commands
73
+ - Command completion updates
74
+ - Rename `init` to `.rc`
75
+ - @grimmySwe++ @dzzh++ @jrosdahl++ @perlpunk++
76
+ ---
77
+ version: 0.2.3
78
+ date: Sun Aug 9 13:44:22 PDT 2015
79
+ changes:
80
+ - Fix issues #75 and #76
81
+ ---
82
+ version: 0.2.2
83
+ date: Wed Jul 22 09:45:13 PDT 2015
84
+ changes:
85
+ - Added the `init` subcommand
86
+ - Applied doc fixes
87
+ ---
88
+ version: 0.2.1
89
+ date: Sat Mar 28 07:52:22 PDT 2015
90
+ changes:
91
+ - Allows subrepo clone to clone to an empty branch; fixes #26.
92
+ - Refs in status
93
+ - Empty parent set to 'none' in .gitrepo file.
94
+ - Bug fixes
95
+ ---
96
+ version: 0.2.0
97
+ date: Sat Jan 24 06:22:05 PST 2015
98
+ changes:
99
+ - Massive overhaul
100
+ - .gitrepo files remain the same so backwards compatible
101
+ - Introduce the branch and commit subcommands
102
+ - The checkout subcommand goes away
103
+ - Operations work much smoother like normal Git flow
104
+ - Much more testing
105
+ - Better doc
106
+ ---
107
+ version: 0.1.0
108
+ date: Fri Feb 21 12:25:53 2014 -0800
109
+ changes:
110
+ - First version
@@ -0,0 +1,509 @@
1
+ =pod
2
+
3
+ =for comment
4
+ DO NOT EDIT. This Pod was generated by Swim v0.1.48.
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
+ =for html
315
+ <a href="https://travis-ci.org/ingydotnet/git-subrepo"><img src="https://travis-ci.org/ingydotnet/git-subrepo.png" alt="git-subrepo"></a>
316
+
317
+ Bad:
318
+
319
+ =over
320
+
321
+ =item * --Subrepo is very new.-- (no longer true)
322
+
323
+ =item * --Not well tested in the wild.-- (no longer true)
324
+
325
+ =back
326
+
327
+ This review may seem somewhat slanted, but I honestly am not aware of any
328
+ "bad" points that I'm not disclosing. That said, I am sure time will reveal
329
+ bugs and shortcomings. Those can usually be fixed. Hopefully the B<model> is
330
+ correct, because that's harder to fix down the road.
331
+
332
+ OK. So how does it all work?
333
+
334
+ There are 3 main commands: cloneI<pull>push. Let's start with the clone
335
+ command. This is the easiest part. You give it a remote url, possibly a new
336
+ subdir to put it, and possibly a remote branch to use. I say possibly, because
337
+ the command can guess the subdir name (just like the git-clone command does),
338
+ and the branch can be the upstream default branch.
339
+
340
+ Given this we do the following steps internally:
341
+
342
+ =over
343
+
344
+ =item * Fetch the remote content (for a specific refspec)
345
+
346
+ =item * Read the remote head tree into the index
347
+
348
+ =item * Checkout the index into the new subdir
349
+
350
+ =item * Create a new subrepo commit object for the subdir content
351
+
352
+ =item * Add a state file called .gitrepo to the new subrepo/subdir
353
+
354
+ =item * Amend the merge commit with this new file
355
+
356
+ =back
357
+
358
+ This process adds something like this to the top of your history:
359
+
360
+ * 9b6ddc9 git subrepo clone git@github.com:you/foo.git foo/
361
+ * 37c61a5 Previous head commit of your repo
362
+
363
+ The entire history has been squashed down into one commit, and placed on
364
+ top of your history. This is important as it keeps your history as clean
365
+ as possible. You don't need to have the subrepo history in your main
366
+ project, since it is immutably available elsewhere, and you have a pointer
367
+ to that place.
368
+
369
+ The new foo/.gitrepo file looks like this:
370
+
371
+ [subrepo]
372
+ remote = git@github.com:you/foo.git
373
+ branch = master
374
+ commit = 14c96c6931b41257b2d42b2edc67ddc659325823
375
+ parent = 37c61a5a234f5dd6f5c2aec037509f50d3a79b8f
376
+ cmdver = 0.1.0
377
+
378
+ It contains all the info needed now and later. Note that the repo url is the
379
+ generally pushable form, rather than the publically readable (L<https://…)>
380
+ form. This is the best practice. Users of your repo don't need access to this
381
+ url, because the content is already in your repo. Only you and your
382
+ collaborators need this url to pull/push in the future.
383
+
384
+ The next command is the pull command. Normally you just give it the subrepo's
385
+ subdir path (although you can change the branch with -b), and it will get the
386
+ other info from the subdir/.gitrepo file.
387
+
388
+ The pull command does these steps:
389
+
390
+ =over
391
+
392
+ =item * Fetch the upstream content
393
+
394
+ =item * Check if anything needs pulling
395
+
396
+ =item * Create a branch of local subrepo commits since last pull
397
+
398
+ =item * Rebase this branch onto the upstream commits
399
+
400
+ =item * Commit the HEAD of the rebased content
401
+
402
+ =item * Update/amend the .gitrepo file
403
+
404
+ =back
405
+
406
+ =head3 Clean History
407
+
408
+ I've talked a bit about clean history but let me show you a comparison between
409
+ subrepo and subtree. Let's run this command sequence using both methods. Note
410
+ the differences between I<both> the command syntax required, and the branch
411
+ history produced.
412
+
413
+ Subrepo first:
414
+
415
+ $ git subrepo clone git@github.com:user/abc
416
+ $ git subrepo clone git@github.com:user/def xyz
417
+ $ git subrepo pull abc
418
+ $ git subrepo pull xyz
419
+
420
+ The resulting history is:
421
+
422
+ * b1f60cc subrepo pull xyz
423
+ * 4fb0276 subrepo pull abc
424
+ * bcef2a0 subrepo clone git@github.com:user/def xyz
425
+ * bebf0db subrepo clone git@github.com:user/abc
426
+ * 64eeaa6 (origin/master, origin/HEAD) O HAI FREND
427
+
428
+ Compare that to B<subtree>. This:
429
+
430
+ $ git subtree add abc git@github.com:user/abc master
431
+ $ git subtree add xyz git@github.com:user/def master
432
+ $ git subtree pull abc git@github.com:user/abc master
433
+ $ git subtree pull xyz git@github.com:user/def master
434
+
435
+ Produces this:
436
+
437
+ * 739e45a (HEAD, master) Merge commit '5f563469d886d53e19cb908b3a64e4229f88a2d1'
438
+ |\
439
+ | * 5f56346 Squashed 'xyz/' changes from 08c7421..365409f
440
+ * | 641f5e5 Merge commit '8d88e90ce5f653ed2e7608a71b8693a2174ea62a'
441
+ |\ \
442
+ | * | 8d88e90 Squashed 'abc/' changes from 08c7421..365409f
443
+ * | | 1703ed2 Merge commit '0e091b672c4bbbbf6bc4f6694c475d127ffa21eb' as 'xyz'
444
+ |\ \ \
445
+ | | |/
446
+ | |/|
447
+ | * | 0e091b6 Squashed 'xyz/' content from commit 08c7421
448
+ | /
449
+ * | 07b77e7 Merge commit 'cd2b30a0229d931979ed4436b995875ec563faea' as 'abc'
450
+ |\ \
451
+ | |/
452
+ | * cd2b30a Squashed 'abc/' content from commit 08c7421
453
+ * 64eeaa6 (origin/master, origin/HEAD) O HAI FREND
454
+
455
+ This was from a minimal case. Subtree history (when viewed this way at least)
456
+ gets unreasonably ugly fast. Subrepo history, by contrast, always looks as
457
+ clean as shown.
458
+
459
+ The final command, push, bascially just does the pull/rebase dance above
460
+ described, and pushes the resulting history back. It does not squash the
461
+ commits made locally, because it assumed that when you changed the local
462
+ subrepo, you made messages that were intended to eventually be published
463
+ back upstream.
464
+
465
+ =head2 Conflict Resolution
466
+
467
+ The commands described above can also be done "by hand". If something fails
468
+ during a pull or push (generally in the rebasing) then the command will tell
469
+ you what to do to finish up.
470
+
471
+ You might choose to do everything by hand, and do your own merging strategies.
472
+ This is perfectly reasonable. The C<subrepo> command offers a few other helper
473
+ commands to help you get the job done:
474
+
475
+ =over
476
+
477
+ =item * C<fetch> - Fetch the upstream and create a C<< subrepo/remote/<subdir> >> ref.
478
+
479
+ =item * C<branch> - Create a branch of local subdir commits since the last pull, called C<< subrepo/<subdir> >>.
480
+
481
+ =item * C<commit> - Commit a merged branch's HEAD back into your repo.
482
+
483
+ =item * C<status> - Show lots of useful info about the current state of the subrepos.
484
+
485
+ =item * C<clean> - Remove branches, ref and remotes created by subrepo commands.
486
+
487
+ =item * C<help> - Read the complete documentation!
488
+
489
+ =back
490
+
491
+ =head2 Conclusion
492
+
493
+ Hopefully by now, you see that submodules are a painful choice with a dubious
494
+ future, and that subtree, while a solid idea has many usage issues.
495
+
496
+ Give C<subrepo> a try. It's painless, easily revertable and just might be what
497
+ the doctor ordered.
498
+
499
+ =head2 Reference Links
500
+
501
+ =over
502
+
503
+ =item * L<http://longair.net/blog/2010/06/02/git-submodules-explained/>
504
+
505
+ =item * L<http://blogs.atlassian.com/2013/05/alternatives-to-git-submodule-git-subtree/>
506
+
507
+ =back
508
+
509
+ =cut