dapp 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. checksums.yaml +4 -4
  2. data/bin/dapp +5 -5
  3. data/config/en/common.yml +6 -4
  4. data/config/en/net_status.yml +8 -7
  5. data/lib/dapp.rb +157 -139
  6. data/lib/dapp/cli.rb +6 -16
  7. data/lib/dapp/cli/base.rb +3 -5
  8. data/lib/dapp/config/base.rb +19 -7
  9. data/lib/dapp/config/directive/base.rb +0 -1
  10. data/lib/dapp/config/error/config.rb +7 -0
  11. data/lib/dapp/core_ext/hash.rb +0 -2
  12. data/lib/dapp/core_ext/pathname.rb +1 -3
  13. data/lib/dapp/{project.rb → dapp.rb} +2 -21
  14. data/lib/dapp/{project → dapp}/chef.rb +2 -4
  15. data/lib/dapp/{project → dapp}/dappfile.rb +5 -7
  16. data/lib/dapp/{project → dapp}/deps/base.rb +3 -6
  17. data/lib/dapp/{project → dapp}/deps/gitartifact.rb +2 -5
  18. data/lib/dapp/{project → dapp}/git_artifact.rb +2 -4
  19. data/lib/dapp/{project → dapp}/lock.rb +3 -5
  20. data/lib/dapp/{project → dapp}/logging/base.rb +2 -5
  21. data/lib/dapp/{project → dapp}/logging/i18n.rb +2 -3
  22. data/lib/dapp/{project → dapp}/logging/paint.rb +2 -4
  23. data/lib/dapp/{project → dapp}/logging/process.rb +2 -5
  24. data/lib/dapp/{project → dapp}/shellout/base.rb +2 -4
  25. data/lib/dapp/{project → dapp}/shellout/streaming.rb +3 -8
  26. data/lib/dapp/{project → dapp}/ssh_agent.rb +6 -9
  27. data/lib/dapp/dimg.rb +1 -192
  28. data/lib/dapp/dimg/artifact.rb +24 -0
  29. data/lib/dapp/dimg/build/stage/after_install_artifact.rb +14 -0
  30. data/lib/dapp/dimg/build/stage/after_setup_artifact.rb +18 -0
  31. data/lib/dapp/dimg/build/stage/artifact_base.rb +80 -0
  32. data/lib/dapp/dimg/build/stage/artifact_default.rb +63 -0
  33. data/lib/dapp/dimg/build/stage/base.rb +210 -0
  34. data/lib/dapp/dimg/build/stage/before_install.rb +33 -0
  35. data/lib/dapp/dimg/build/stage/before_install_artifact.rb +14 -0
  36. data/lib/dapp/dimg/build/stage/before_setup.rb +31 -0
  37. data/lib/dapp/dimg/build/stage/before_setup_artifact.rb +14 -0
  38. data/lib/dapp/dimg/build/stage/build_artifact.rb +31 -0
  39. data/lib/dapp/dimg/build/stage/docker_instructions.rb +25 -0
  40. data/lib/dapp/dimg/build/stage/from.rb +50 -0
  41. data/lib/dapp/dimg/build/stage/ga_archive.rb +28 -0
  42. data/lib/dapp/dimg/build/stage/ga_archive_dependencies.rb +27 -0
  43. data/lib/dapp/dimg/build/stage/ga_artifact_patch.rb +22 -0
  44. data/lib/dapp/dimg/build/stage/ga_base.rb +80 -0
  45. data/lib/dapp/dimg/build/stage/ga_dependencies_base.rb +20 -0
  46. data/lib/dapp/dimg/build/stage/ga_latest_patch.rb +54 -0
  47. data/lib/dapp/dimg/build/stage/import_artifact.rb +64 -0
  48. data/lib/dapp/dimg/build/stage/install/ga_post_install_patch.rb +22 -0
  49. data/lib/dapp/dimg/build/stage/install/ga_post_install_patch_dependencies.rb +22 -0
  50. data/lib/dapp/dimg/build/stage/install/ga_pre_install_patch.rb +22 -0
  51. data/lib/dapp/dimg/build/stage/install/ga_pre_install_patch_dependencies.rb +22 -0
  52. data/lib/dapp/dimg/build/stage/install/install.rb +35 -0
  53. data/lib/dapp/dimg/build/stage/mod/group.rb +42 -0
  54. data/lib/dapp/dimg/build/stage/mod/logging.rb +101 -0
  55. data/lib/dapp/dimg/build/stage/setup/ga_post_setup_patch.rb +22 -0
  56. data/lib/dapp/dimg/build/stage/setup/ga_post_setup_patch_dependencies.rb +32 -0
  57. data/lib/dapp/dimg/build/stage/setup/ga_pre_setup_patch.rb +22 -0
  58. data/lib/dapp/dimg/build/stage/setup/ga_pre_setup_patch_dependencies.rb +22 -0
  59. data/lib/dapp/dimg/build/stage/setup/setup.rb +35 -0
  60. data/lib/dapp/dimg/builder.rb +6 -0
  61. data/lib/dapp/{builder → dimg/builder}/base.rb +4 -5
  62. data/lib/dapp/{builder → dimg/builder}/chef.rb +41 -33
  63. data/lib/dapp/dimg/builder/chef/berksfile.rb +121 -0
  64. data/lib/dapp/dimg/builder/chef/cookbook.rb +285 -0
  65. data/lib/dapp/dimg/builder/chef/cookbook_metadata.rb +106 -0
  66. data/lib/dapp/{builder → dimg/builder}/none.rb +4 -5
  67. data/lib/dapp/{builder → dimg/builder}/shell.rb +5 -6
  68. data/lib/dapp/dimg/cli/base.rb +16 -0
  69. data/lib/dapp/dimg/cli/bp.rb +37 -0
  70. data/lib/dapp/dimg/cli/build.rb +64 -0
  71. data/lib/dapp/dimg/cli/build_context.rb +18 -0
  72. data/lib/dapp/dimg/cli/build_context/export.rb +26 -0
  73. data/lib/dapp/dimg/cli/build_context/import.rb +17 -0
  74. data/lib/dapp/dimg/cli/cleanup.rb +22 -0
  75. data/lib/dapp/dimg/cli/cli.rb +1 -0
  76. data/lib/dapp/dimg/cli/dimg.rb +30 -0
  77. data/lib/dapp/dimg/cli/list.rb +17 -0
  78. data/lib/dapp/dimg/cli/mrproper.rb +26 -0
  79. data/lib/dapp/dimg/cli/push.rb +61 -0
  80. data/lib/dapp/dimg/cli/run.rb +59 -0
  81. data/lib/dapp/{cli → dimg/cli}/spush.rb +7 -7
  82. data/lib/dapp/dimg/cli/stage_image.rb +24 -0
  83. data/lib/dapp/dimg/cli/stages.rb +22 -0
  84. data/lib/dapp/dimg/cli/stages/cleanup_local.rb +44 -0
  85. data/lib/dapp/dimg/cli/stages/cleanup_repo.rb +26 -0
  86. data/lib/dapp/dimg/cli/stages/flush_local.rb +23 -0
  87. data/lib/dapp/dimg/cli/stages/flush_repo.rb +24 -0
  88. data/lib/dapp/dimg/cli/stages/pull.rb +28 -0
  89. data/lib/dapp/dimg/cli/stages/push.rb +24 -0
  90. data/lib/dapp/dimg/cli/tag.rb +24 -0
  91. data/lib/dapp/dimg/config/artifact_dimg.rb +17 -0
  92. data/lib/dapp/dimg/config/artifact_group.rb +47 -0
  93. data/lib/dapp/dimg/config/base.rb +7 -0
  94. data/lib/dapp/dimg/config/dimg.rb +24 -0
  95. data/lib/dapp/dimg/config/dimg/instance_methods.rb +177 -0
  96. data/lib/dapp/dimg/config/dimg/validation.rb +126 -0
  97. data/lib/dapp/dimg/config/dimg_group.rb +61 -0
  98. data/lib/dapp/dimg/config/dimg_group_base.rb +54 -0
  99. data/lib/dapp/dimg/config/dimg_group_main.rb +22 -0
  100. data/lib/dapp/dimg/config/directive/artifact.rb +70 -0
  101. data/lib/dapp/dimg/config/directive/artifact_base.rb +97 -0
  102. data/lib/dapp/dimg/config/directive/base.rb +9 -0
  103. data/lib/dapp/dimg/config/directive/chef.rb +68 -0
  104. data/lib/dapp/dimg/config/directive/docker/artifact.rb +15 -0
  105. data/lib/dapp/dimg/config/directive/docker/base.rb +22 -0
  106. data/lib/dapp/dimg/config/directive/docker/dimg.rb +82 -0
  107. data/lib/dapp/dimg/config/directive/git_artifact_local.rb +47 -0
  108. data/lib/dapp/dimg/config/directive/git_artifact_remote.rb +58 -0
  109. data/lib/dapp/dimg/config/directive/mount.rb +27 -0
  110. data/lib/dapp/dimg/config/directive/shell/artifact.rb +18 -0
  111. data/lib/dapp/dimg/config/directive/shell/dimg.rb +65 -0
  112. data/lib/dapp/dimg/dapp/command.rb +21 -0
  113. data/lib/dapp/dimg/dapp/command/bp.rb +20 -0
  114. data/lib/dapp/dimg/dapp/command/build.rb +22 -0
  115. data/lib/dapp/dimg/dapp/command/build_context/common.rb +27 -0
  116. data/lib/dapp/dimg/dapp/command/build_context/export.rb +55 -0
  117. data/lib/dapp/dimg/dapp/command/build_context/import.rb +71 -0
  118. data/lib/dapp/dimg/dapp/command/cleanup.rb +23 -0
  119. data/lib/dapp/dimg/dapp/command/common.rb +96 -0
  120. data/lib/dapp/dimg/dapp/command/list.rb +19 -0
  121. data/lib/dapp/dimg/dapp/command/mrproper.rb +75 -0
  122. data/lib/dapp/dimg/dapp/command/push.rb +27 -0
  123. data/lib/dapp/dimg/dapp/command/run.rb +15 -0
  124. data/lib/dapp/dimg/dapp/command/spush.rb +17 -0
  125. data/lib/dapp/dimg/dapp/command/stage_image.rb +14 -0
  126. data/lib/dapp/dimg/dapp/command/stages/cleanup_local.rb +137 -0
  127. data/lib/dapp/dimg/dapp/command/stages/cleanup_repo.rb +124 -0
  128. data/lib/dapp/dimg/dapp/command/stages/common.rb +85 -0
  129. data/lib/dapp/dimg/dapp/command/stages/flush_local.rb +21 -0
  130. data/lib/dapp/dimg/dapp/command/stages/flush_repo.rb +21 -0
  131. data/lib/dapp/dimg/dapp/command/stages/pull.rb +26 -0
  132. data/lib/dapp/dimg/dapp/command/stages/push.rb +22 -0
  133. data/lib/dapp/dimg/dapp/command/tag.rb +17 -0
  134. data/lib/dapp/dimg/dimg.rb +192 -0
  135. data/lib/dapp/dimg/dimg/git_artifact.rb +26 -0
  136. data/lib/dapp/dimg/dimg/path.rb +37 -0
  137. data/lib/dapp/dimg/dimg/stages.rb +60 -0
  138. data/lib/dapp/dimg/dimg/tags.rb +65 -0
  139. data/lib/dapp/dimg/docker_registry.rb +37 -0
  140. data/lib/dapp/dimg/docker_registry/base.rb +109 -0
  141. data/lib/dapp/dimg/docker_registry/base/authorization.rb +63 -0
  142. data/lib/dapp/dimg/docker_registry/base/request.rb +34 -0
  143. data/lib/dapp/dimg/docker_registry/default.rb +18 -0
  144. data/lib/dapp/dimg/error/base.rb +7 -0
  145. data/lib/dapp/dimg/error/build.rb +7 -0
  146. data/lib/dapp/dimg/error/chef.rb +11 -0
  147. data/lib/dapp/dimg/error/command.rb +7 -0
  148. data/lib/dapp/dimg/error/config.rb +7 -0
  149. data/lib/dapp/dimg/error/dimg.rb +7 -0
  150. data/lib/dapp/dimg/error/lock.rb +7 -0
  151. data/lib/dapp/dimg/error/registry.rb +7 -0
  152. data/lib/dapp/dimg/error/rugged.rb +7 -0
  153. data/lib/dapp/dimg/error/shellout.rb +7 -0
  154. data/lib/dapp/dimg/error/tar_writer.rb +7 -0
  155. data/lib/dapp/dimg/exception/base.rb +7 -0
  156. data/lib/dapp/dimg/exception/introspect_image.rb +7 -0
  157. data/lib/dapp/dimg/exception/registry.rb +7 -0
  158. data/lib/dapp/dimg/filelock.rb +43 -0
  159. data/lib/dapp/dimg/git_artifact.rb +241 -18
  160. data/lib/dapp/dimg/git_repo/base.rb +90 -0
  161. data/lib/dapp/dimg/git_repo/own.rb +39 -0
  162. data/lib/dapp/dimg/git_repo/remote.rb +50 -0
  163. data/lib/dapp/dimg/image/argument.rb +143 -0
  164. data/lib/dapp/dimg/image/docker.rb +127 -0
  165. data/lib/dapp/dimg/image/scratch.rb +32 -0
  166. data/lib/dapp/dimg/image/stage.rb +95 -0
  167. data/lib/dapp/dimg/lock/base.rb +51 -0
  168. data/lib/dapp/dimg/lock/file.rb +48 -0
  169. data/lib/dapp/error/base.rb +0 -1
  170. data/lib/dapp/error/dapp.rb +5 -0
  171. data/lib/dapp/error/dappfile.rb +0 -1
  172. data/lib/dapp/error/shellout.rb +0 -1
  173. data/lib/dapp/exception/base.rb +0 -1
  174. data/lib/dapp/helper/cli.rb +5 -6
  175. data/lib/dapp/helper/net_status.rb +0 -1
  176. data/lib/dapp/helper/sha256.rb +0 -1
  177. data/lib/dapp/helper/trivia.rb +0 -1
  178. data/lib/dapp/prctl.rb +0 -1
  179. data/lib/dapp/version.rb +1 -2
  180. metadata +172 -140
  181. data/lib/dapp/artifact.rb +0 -23
  182. data/lib/dapp/build/stage/after_install_artifact.rb +0 -13
  183. data/lib/dapp/build/stage/after_setup_artifact.rb +0 -17
  184. data/lib/dapp/build/stage/artifact_base.rb +0 -80
  185. data/lib/dapp/build/stage/artifact_default.rb +0 -63
  186. data/lib/dapp/build/stage/base.rb +0 -203
  187. data/lib/dapp/build/stage/before_install.rb +0 -32
  188. data/lib/dapp/build/stage/before_install_artifact.rb +0 -13
  189. data/lib/dapp/build/stage/before_setup.rb +0 -30
  190. data/lib/dapp/build/stage/before_setup_artifact.rb +0 -13
  191. data/lib/dapp/build/stage/build_artifact.rb +0 -36
  192. data/lib/dapp/build/stage/docker_instructions.rb +0 -24
  193. data/lib/dapp/build/stage/from.rb +0 -34
  194. data/lib/dapp/build/stage/ga_archive.rb +0 -27
  195. data/lib/dapp/build/stage/ga_archive_dependencies.rb +0 -26
  196. data/lib/dapp/build/stage/ga_artifact_patch.rb +0 -21
  197. data/lib/dapp/build/stage/ga_base.rb +0 -79
  198. data/lib/dapp/build/stage/ga_dependencies_base.rb +0 -19
  199. data/lib/dapp/build/stage/ga_latest_patch.rb +0 -53
  200. data/lib/dapp/build/stage/import_artifact.rb +0 -65
  201. data/lib/dapp/build/stage/install/ga_post_install_patch.rb +0 -21
  202. data/lib/dapp/build/stage/install/ga_post_install_patch_dependencies.rb +0 -21
  203. data/lib/dapp/build/stage/install/ga_pre_install_patch.rb +0 -21
  204. data/lib/dapp/build/stage/install/ga_pre_install_patch_dependencies.rb +0 -21
  205. data/lib/dapp/build/stage/install/install.rb +0 -40
  206. data/lib/dapp/build/stage/mod/group.rb +0 -42
  207. data/lib/dapp/build/stage/mod/logging.rb +0 -104
  208. data/lib/dapp/build/stage/setup/ga_post_setup_patch.rb +0 -21
  209. data/lib/dapp/build/stage/setup/ga_post_setup_patch_dependencies.rb +0 -31
  210. data/lib/dapp/build/stage/setup/ga_pre_setup_patch.rb +0 -21
  211. data/lib/dapp/build/stage/setup/ga_pre_setup_patch_dependencies.rb +0 -21
  212. data/lib/dapp/build/stage/setup/setup.rb +0 -40
  213. data/lib/dapp/builder/chef/berksfile.rb +0 -78
  214. data/lib/dapp/builder/chef/cookbook.rb +0 -257
  215. data/lib/dapp/builder/chef/cookbook_metadata.rb +0 -54
  216. data/lib/dapp/builder/chef/error.rb +0 -12
  217. data/lib/dapp/cli/bp.rb +0 -37
  218. data/lib/dapp/cli/build.rb +0 -60
  219. data/lib/dapp/cli/cleanup.rb +0 -22
  220. data/lib/dapp/cli/list.rb +0 -17
  221. data/lib/dapp/cli/mrproper.rb +0 -26
  222. data/lib/dapp/cli/push.rb +0 -61
  223. data/lib/dapp/cli/run.rb +0 -53
  224. data/lib/dapp/cli/stage_image.rb +0 -24
  225. data/lib/dapp/cli/stages.rb +0 -23
  226. data/lib/dapp/cli/stages/cleanup_local.rb +0 -44
  227. data/lib/dapp/cli/stages/cleanup_repo.rb +0 -26
  228. data/lib/dapp/cli/stages/flush_local.rb +0 -23
  229. data/lib/dapp/cli/stages/flush_repo.rb +0 -24
  230. data/lib/dapp/cli/stages/pull.rb +0 -28
  231. data/lib/dapp/cli/stages/push.rb +0 -24
  232. data/lib/dapp/cli/tag.rb +0 -24
  233. data/lib/dapp/config/artifact_dimg.rb +0 -20
  234. data/lib/dapp/config/artifact_group.rb +0 -56
  235. data/lib/dapp/config/dimg.rb +0 -23
  236. data/lib/dapp/config/dimg/instance_methods.rb +0 -194
  237. data/lib/dapp/config/dimg/validation.rb +0 -125
  238. data/lib/dapp/config/dimg_group.rb +0 -60
  239. data/lib/dapp/config/dimg_group_base.rb +0 -53
  240. data/lib/dapp/config/dimg_group_main.rb +0 -21
  241. data/lib/dapp/config/directive/artifact.rb +0 -69
  242. data/lib/dapp/config/directive/artifact_base.rb +0 -93
  243. data/lib/dapp/config/directive/chef.rb +0 -57
  244. data/lib/dapp/config/directive/docker/artifact.rb +0 -15
  245. data/lib/dapp/config/directive/docker/base.rb +0 -20
  246. data/lib/dapp/config/directive/docker/dimg.rb +0 -81
  247. data/lib/dapp/config/directive/git_artifact_local.rb +0 -13
  248. data/lib/dapp/config/directive/git_artifact_remote.rb +0 -57
  249. data/lib/dapp/config/directive/mount.rb +0 -26
  250. data/lib/dapp/config/directive/shell/artifact.rb +0 -17
  251. data/lib/dapp/config/directive/shell/dimg.rb +0 -65
  252. data/lib/dapp/dimg/path.rb +0 -37
  253. data/lib/dapp/dimg/stages.rb +0 -59
  254. data/lib/dapp/dimg/tags.rb +0 -65
  255. data/lib/dapp/docker_registry.rb +0 -36
  256. data/lib/dapp/docker_registry/base.rb +0 -109
  257. data/lib/dapp/docker_registry/default.rb +0 -18
  258. data/lib/dapp/docker_registry/mod/authorization.rb +0 -63
  259. data/lib/dapp/docker_registry/mod/request.rb +0 -32
  260. data/lib/dapp/error/build.rb +0 -6
  261. data/lib/dapp/error/config.rb +0 -6
  262. data/lib/dapp/error/dimg.rb +0 -6
  263. data/lib/dapp/error/image.rb +0 -6
  264. data/lib/dapp/error/project.rb +0 -6
  265. data/lib/dapp/error/registry.rb +0 -6
  266. data/lib/dapp/error/rugged.rb +0 -6
  267. data/lib/dapp/error/tar_writer.rb +0 -6
  268. data/lib/dapp/exception/introspect_image.rb +0 -6
  269. data/lib/dapp/exception/registry.rb +0 -6
  270. data/lib/dapp/filelock.rb +0 -43
  271. data/lib/dapp/git_artifact.rb +0 -241
  272. data/lib/dapp/git_repo/base.rb +0 -88
  273. data/lib/dapp/git_repo/own.rb +0 -38
  274. data/lib/dapp/git_repo/remote.rb +0 -49
  275. data/lib/dapp/image/argument.rb +0 -134
  276. data/lib/dapp/image/docker.rb +0 -115
  277. data/lib/dapp/image/scratch.rb +0 -32
  278. data/lib/dapp/image/stage.rb +0 -94
  279. data/lib/dapp/lock/base.rb +0 -51
  280. data/lib/dapp/lock/error.rb +0 -14
  281. data/lib/dapp/lock/file.rb +0 -45
  282. data/lib/dapp/project/command/bp.rb +0 -21
  283. data/lib/dapp/project/command/build.rb +0 -20
  284. data/lib/dapp/project/command/cleanup.rb +0 -24
  285. data/lib/dapp/project/command/common.rb +0 -96
  286. data/lib/dapp/project/command/list.rb +0 -20
  287. data/lib/dapp/project/command/mrproper.rb +0 -69
  288. data/lib/dapp/project/command/push.rb +0 -28
  289. data/lib/dapp/project/command/run.rb +0 -15
  290. data/lib/dapp/project/command/spush.rb +0 -18
  291. data/lib/dapp/project/command/stage_image.rb +0 -15
  292. data/lib/dapp/project/command/stages/cleanup_local.rb +0 -138
  293. data/lib/dapp/project/command/stages/cleanup_repo.rb +0 -125
  294. data/lib/dapp/project/command/stages/common.rb +0 -86
  295. data/lib/dapp/project/command/stages/flush_local.rb +0 -22
  296. data/lib/dapp/project/command/stages/flush_repo.rb +0 -22
  297. data/lib/dapp/project/command/stages/pull.rb +0 -27
  298. data/lib/dapp/project/command/stages/push.rb +0 -23
  299. data/lib/dapp/project/command/tag.rb +0 -18
@@ -0,0 +1,7 @@
1
+ module Dapp
2
+ module Dimg
3
+ module Error
4
+ class Base < ::Dapp::Error::Base; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Dapp
2
+ module Dimg
3
+ module Error
4
+ class Build < Base; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ module Dapp
2
+ module Dimg
3
+ module Error
4
+ class Chef < Base
5
+ def initialize(**net_status)
6
+ super(context: 'chef', **net_status)
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ module Dapp
2
+ module Dimg
3
+ module Error
4
+ class Command < Base; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Dapp
2
+ module Dimg
3
+ module Error
4
+ class Config < ::Dapp::Config::Error::Config; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Dapp
2
+ module Dimg
3
+ module Error
4
+ class Dimg < Base; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Dapp
2
+ module Dimg
3
+ module Error
4
+ class Lock < Base; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Dapp
2
+ module Dimg
3
+ module Error
4
+ class Registry < Base; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Dapp
2
+ module Dimg
3
+ module Error
4
+ class Rugged < Base; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Dapp
2
+ module Dimg
3
+ module Error
4
+ class Shellout < ::Dapp::Error::Shellout; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Dapp
2
+ module Dimg
3
+ module Error
4
+ class TarWriter < Base; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Dapp
2
+ module Dimg
3
+ module Exception
4
+ class Base < ::Dapp::Exception::Base; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Dapp
2
+ module Dimg
3
+ module Exception
4
+ class IntrospectImage < Base; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Dapp
2
+ module Dimg
3
+ module Exception
4
+ class Registry < Base; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,43 @@
1
+ module Dapp
2
+ module Dimg
3
+ module Filelock
4
+ def self.included(base)
5
+ base.extend(ClassMethods)
6
+ end
7
+
8
+ module ClassMethods
9
+ def filelocks
10
+ @filelocks ||= Hash.new(false)
11
+ end
12
+ end
13
+
14
+ def filelock(filelock, error_message: 'Already in use!', timeout: 10)
15
+ return yield if self.class.filelocks[filelock]
16
+
17
+ begin
18
+ self.class.filelocks[filelock] = true
19
+ filelock_lockfile(filelock, error_message: error_message, timeout: timeout) do
20
+ yield
21
+ end
22
+ ensure
23
+ self.class.filelocks[filelock] = false
24
+ end
25
+ end
26
+
27
+ protected
28
+
29
+ def filelock_lockfile(filelock, error_message: 'Already in use!', timeout: 10)
30
+ File.open(home_path(filelock), File::RDWR | File::CREAT, 0o644) do |file|
31
+ Timeout.timeout(timeout) do
32
+ file.flock(File::LOCK_EX)
33
+ end
34
+
35
+ yield
36
+ end
37
+ rescue Timeout::Error
38
+ STDERR.puts error_message
39
+ exit 1
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,26 +1,249 @@
1
1
  module Dapp
2
- # Dimg
3
- class Dimg
4
- # GitArtifact
5
- module GitArtifact
6
- def git_artifacts
7
- [*local_git_artifacts, *remote_git_artifacts].compact
2
+ module Dimg
3
+ # Git repo artifact
4
+ class GitArtifact
5
+ attr_reader :repo
6
+ attr_reader :name
7
+
8
+ # rubocop:disable Metrics/ParameterLists
9
+ def initialize(repo, to:, name: nil, branch: nil, commit: nil,
10
+ cwd: nil, include_paths: nil, exclude_paths: nil, owner: nil, group: nil,
11
+ stages_dependencies: {})
12
+ @repo = repo
13
+ @name = name
14
+
15
+ @branch = branch || repo.dimg.dapp.cli_options[:git_artifact_branch] || repo.branch
16
+ @commit = commit
17
+
18
+ @to = to
19
+ @cwd = begin
20
+ if cwd.nil? || cwd.empty?
21
+ ''
22
+ else
23
+ cwd = File.expand_path(File.join('/', cwd))[1..-1] # must be relative
24
+ "#{cwd.chomp('/')}/"
25
+ end
26
+ end
27
+ @include_paths = include_paths
28
+ @exclude_paths = exclude_paths
29
+ @owner = owner
30
+ @group = group
31
+
32
+ @stages_dependencies = stages_dependencies
33
+ end
34
+ # rubocop:enable Metrics/ParameterLists
35
+
36
+ def apply_archive_command(stage)
37
+ credentials = [:owner, :group].map { |attr| "--#{attr}=#{send(attr)}" unless send(attr).nil? }.compact
38
+
39
+ [].tap do |commands|
40
+ commands << "#{repo.dimg.dapp.install_bin} #{credentials.join(' ')} -d #{to}"
41
+ if any_changes?(nil, stage.layer_commit(self))
42
+ commands << "#{sudo}#{repo.dimg.dapp.tar_bin} -xf #{archive_file(stage.layer_commit(self))} -C #{to}"
43
+ end
44
+ end
45
+ end
46
+
47
+ def apply_patch_command(stage)
48
+ patch_command(stage.prev_g_a_stage.layer_commit(self), stage.layer_commit(self))
49
+ end
50
+
51
+ def apply_dev_patch_command(stage)
52
+ patch_command(stage.prev_g_a_stage.layer_commit(self), nil)
53
+ end
54
+
55
+ def stage_dependencies_checksums(stage)
56
+ return [] if (stage_dependencies = stages_dependencies[stage.name]).empty?
57
+
58
+ paths = include_paths(true) + base_paths(stage_dependencies, true)
59
+ diff_patches(nil, latest_commit, paths: paths).map do |patch|
60
+ delta_new_file = patch.delta.new_file
61
+ Digest::SHA256.hexdigest [delta_new_file[:path], repo.lookup_object(delta_new_file[:oid]).content].join(':::')
62
+ end
8
63
  end
9
64
 
10
- def local_git_artifacts
11
- @local_git_artifact_list ||= Array(config._git_artifact._local).map do |ga_config|
12
- repo = GitRepo::Own.new(self)
13
- Dapp::GitArtifact.new(repo, **ga_config._artifact_options)
65
+ def patch_size(from, to)
66
+ diff_patches(from, to).reduce(0) do |bytes, patch|
67
+ patch.hunks.each do |hunk|
68
+ hunk.lines.each do |l|
69
+ bytes +=
70
+ case l.line_origin
71
+ when :eof_newline_added, :eof_newline_removed then 1
72
+ when :addition, :deletion, :binary then l.content.size
73
+ else # :context, :file_header, :hunk_header, :eof_no_newline
74
+ 0
75
+ end
76
+ end
77
+ end
78
+ bytes
14
79
  end
15
80
  end
16
81
 
17
- def remote_git_artifacts
18
- @remote_git_artifact_list ||= Array(config._git_artifact._remote).map do |ga_config|
19
- repo = GitRepo::Remote.new(self, ga_config._name, url: ga_config._url)
20
- repo.fetch!(ga_config._branch)
21
- Dapp::GitArtifact.new(repo, **ga_config._artifact_options)
82
+ def dev_patch_hash(stage)
83
+ Digest::SHA256.hexdigest diff_patches(stage.prev_g_a_stage.layer_commit(self), nil).map(&:to_s).join(':::')
84
+ end
85
+
86
+ def latest_commit
87
+ @latest_commit ||= commit || repo.latest_commit(branch)
88
+ end
89
+
90
+ def paramshash
91
+ Digest::SHA256.hexdigest [full_name, to, cwd, *include_paths, *exclude_paths, owner, group].map(&:to_s).join(':::')
92
+ end
93
+
94
+ def full_name
95
+ "#{repo.name}#{name ? "_#{name}" : nil}"
96
+ end
97
+
98
+ def any_changes?(from, to = latest_commit)
99
+ diff_patches(from, to).any?
100
+ end
101
+
102
+ protected
103
+
104
+ attr_reader :to
105
+ attr_reader :commit
106
+ attr_reader :branch
107
+ attr_reader :cwd
108
+ attr_reader :owner
109
+ attr_reader :group
110
+ attr_reader :stages_dependencies
111
+
112
+ def patch_command(prev_commit, current_commit)
113
+ [].tap do |commands|
114
+ if any_changes?(prev_commit, current_commit)
115
+ commands << "#{sudo}#{repo.dimg.dapp.git_bin} apply --whitespace=nowarn --directory=#{to} --unsafe-paths " \
116
+ "#{patch_file(prev_commit, current_commit)}"
117
+ end
118
+ end
119
+ end
120
+
121
+ def sudo
122
+ repo.dimg.dapp.sudo_command(owner: owner, group: group)
123
+ end
124
+
125
+ def archive_file(commit)
126
+ create_file(repo.dimg.tmp_path('archives', archive_file_name(commit))) do |f|
127
+ Gem::Package::TarWriter.new(f) do |tar|
128
+ diff_patches(nil, commit).each do |patch|
129
+ entry = patch.delta.new_file
130
+ tar.add_file slice_cwd(entry[:path]), entry[:mode] do |tf|
131
+ tf.write repo.lookup_object(entry[:oid]).content
132
+ end
133
+ end
134
+ end
135
+ end
136
+ repo.dimg.container_tmp_path('archives', archive_file_name(commit))
137
+ rescue Gem::Package::TooLongFileName => e
138
+ raise Error::TarWriter, message: e.message
139
+ end
140
+
141
+ def slice_cwd(path)
142
+ return path if cwd.empty?
143
+ path
144
+ .reverse
145
+ .chomp(cwd.reverse)
146
+ .reverse
147
+ end
148
+
149
+ def archive_file_name(commit)
150
+ file_name(commit, 'tar')
151
+ end
152
+
153
+ def patch_file(from, to)
154
+ create_file(repo.dimg.tmp_path('patches', patch_file_name(from, to))) do |f|
155
+ diff_patches(from, to).each { |patch| f.write change_patch_new_file_path(patch) }
156
+ end
157
+ repo.dimg.container_tmp_path('patches', patch_file_name(from, to))
158
+ end
159
+
160
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
161
+ def change_patch_new_file_path(patch)
162
+ patch.to_s.lines.tap do |lines|
163
+ modify_patch_line = proc do |line_number, path_char|
164
+ action_part, path_part = lines[line_number].split
165
+ if (path_with_cwd = path_part.partition("#{path_char}/").last).start_with?(cwd)
166
+ path_with_cwd.sub(cwd, '').tap do |native_path|
167
+ expected_path = File.join(path_char, native_path)
168
+ lines[line_number] = [action_part, expected_path].join(' ') + "\n"
169
+ end
170
+ end
171
+ end
172
+
173
+ modify_patch = proc do |*modify_patch_line_args|
174
+ native_paths = modify_patch_line_args.map { |args| modify_patch_line.call(*args) }
175
+ unless (native_paths = native_paths.compact.uniq).empty?
176
+ raise Error::Build, code: :unsupported_patch_format, data: { patch: patch.to_s } unless native_paths.one?
177
+ native_path = native_paths.first
178
+ lines[0] = ['diff --git', File.join('a', native_path), File.join('b', native_path)].join(' ') + "\n"
179
+ end
180
+ end
181
+
182
+ case
183
+ when patch.delta.deleted? then modify_patch.call([3, 'a'])
184
+ when patch.delta.added? then modify_patch.call([4, 'b'])
185
+ when patch.delta.modified?
186
+ if patch_file_mode_changed?(patch)
187
+ modify_patch.call([4, 'a'], [5, 'b'])
188
+ else
189
+ modify_patch.call([2, 'a'], [3, 'b'])
190
+ end
191
+ else
192
+ raise
193
+ end
194
+ end.join
195
+ end
196
+ # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
197
+
198
+ def patch_file_mode_changed?(patch)
199
+ patch.delta.old_file[:mode] != patch.delta.new_file[:mode]
200
+ end
201
+
202
+ def patch_file_name(from, to)
203
+ file_name(from, to, 'patch')
204
+ end
205
+
206
+ def file_name(*args, ext)
207
+ "#{[full_name, args].flatten.join('_')}.#{ext}"
208
+ end
209
+
210
+ def create_file(file_path, &blk)
211
+ File.open(file_path, File::RDWR | File::CREAT, &blk)
212
+ end
213
+
214
+ def diff_patches(from, to, paths: include_paths_or_cwd)
215
+ (@diff_patches ||= {})[[from, to, paths]] = repo.patches(from, to, paths: paths, exclude_paths: exclude_paths(true))
216
+ end
217
+
218
+ def include_paths_or_cwd
219
+ case
220
+ when !include_paths(true).empty? then include_paths(true)
221
+ when !cwd.empty? then [cwd]
222
+ else
223
+ []
224
+ end
225
+ end
226
+
227
+ def exclude_paths(with_cwd = false)
228
+ base_paths(repo.exclude_paths + @exclude_paths, with_cwd)
229
+ end
230
+
231
+ def include_paths(with_cwd = false)
232
+ base_paths(@include_paths, with_cwd)
233
+ end
234
+
235
+ def base_paths(paths, with_cwd = false)
236
+ [paths].flatten.compact.map do |path|
237
+ if with_cwd && !cwd.empty?
238
+ File.join(cwd, path)
239
+ else
240
+ path
241
+ end
242
+ .chomp('/')
243
+ .reverse.chomp('/')
244
+ .reverse
22
245
  end
23
246
  end
24
- end # GitArtifact
25
- end # Dimg
26
- end # Dapp
247
+ end
248
+ end
249
+ end
@@ -0,0 +1,90 @@
1
+ module Dapp
2
+ module Dimg
3
+ module GitRepo
4
+ # Base class for any Git repo (remote, gitkeeper, etc)
5
+ class Base
6
+ attr_reader :dimg
7
+ attr_reader :name
8
+
9
+ def initialize(dimg, name)
10
+ @dimg = dimg
11
+ @name = name
12
+ end
13
+
14
+ def exclude_paths
15
+ []
16
+ end
17
+
18
+ def patches(from, to, exclude_paths: [], **kwargs)
19
+ diff(from, to, **kwargs).patches.select do |patch|
20
+ !exclude_paths.any? { |p| check_path?(patch.delta.new_file[:path], p) }
21
+ end
22
+ end
23
+
24
+ def diff(from, to, **kwargs)
25
+ if from.nil?
26
+ Rugged::Tree.diff(git, nil, to, **kwargs)
27
+ else
28
+ lookup_commit(from).diff(lookup_commit(to), **kwargs)
29
+ end
30
+ end
31
+
32
+ def commit_exists?(commit)
33
+ git.exists?(commit)
34
+ end
35
+
36
+ def latest_commit(_branch)
37
+ raise
38
+ end
39
+
40
+ def branch
41
+ git.head.name.sub(/^refs\/heads\//, '')
42
+ end
43
+
44
+ def commit_at(commit)
45
+ lookup_commit(commit).time.to_i
46
+ end
47
+
48
+ def find_commit_id_by_message(regex)
49
+ walker.each do |commit|
50
+ next unless commit.message =~ regex
51
+ return commit.oid
52
+ end
53
+ end
54
+
55
+ def walker
56
+ walker = Rugged::Walker.new(git)
57
+ walker.push(git.head.target_id)
58
+ walker
59
+ end
60
+
61
+ def lookup_object(oid)
62
+ git.lookup(oid)
63
+ end
64
+
65
+ def lookup_commit(commit)
66
+ git.lookup(commit)
67
+ end
68
+
69
+ protected
70
+
71
+ def git(**kwargs)
72
+ @git ||= Rugged::Repository.new(path, **kwargs)
73
+ end
74
+
75
+ private
76
+
77
+ def check_path?(path, format)
78
+ path_parts = path.split('/')
79
+ checking_path = nil
80
+
81
+ until path_parts.empty?
82
+ checking_path = [checking_path, path_parts.shift].compact.join('/')
83
+ return true if File.fnmatch(format, checking_path)
84
+ end
85
+ false
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end