choctop 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 (174) hide show
  1. data/History.txt +4 -0
  2. data/Manifest.txt +173 -0
  3. data/README.rdoc +130 -0
  4. data/Rakefile +28 -0
  5. data/app_generators/install_choctop/install_choctop_generator.rb +47 -0
  6. data/app_generators/install_choctop/templates/Rakefile.erb +17 -0
  7. data/assets/DefaultVolumeIcon.icns +0 -0
  8. data/assets/default_background.jpg +0 -0
  9. data/bin/install_choctop +24 -0
  10. data/features/development.feature +13 -0
  11. data/features/dmg.feature +16 -0
  12. data/features/fixtures/SampleApp-AlreadyBuilt/SampleApp.xcodeproj/drnic.mode1v3 +1370 -0
  13. data/features/fixtures/SampleApp-AlreadyBuilt/SampleApp.xcodeproj/drnic.pbxuser +134 -0
  14. data/features/fixtures/SampleApp/English.lproj/InfoPlist.strings +0 -0
  15. data/features/fixtures/SampleApp/English.lproj/MainMenu.xib +3034 -0
  16. data/features/fixtures/SampleApp/Info.plist +28 -0
  17. data/features/fixtures/SampleApp/SampleApp.xcodeproj/TemplateIcon.icns +0 -0
  18. data/features/fixtures/SampleApp/SampleApp.xcodeproj/drnic.mode1v3 +1370 -0
  19. data/features/fixtures/SampleApp/SampleApp.xcodeproj/drnic.pbxuser +134 -0
  20. data/features/fixtures/SampleApp/SampleApp.xcodeproj/project.pbxproj +284 -0
  21. data/features/fixtures/SampleApp/SampleApp_Prefix.pch +7 -0
  22. data/features/fixtures/SampleApp/build/Debug/SampleApp.app/Contents/Info.plist +26 -0
  23. data/features/fixtures/SampleApp/build/Debug/SampleApp.app/Contents/MacOS/SampleApp +0 -0
  24. data/features/fixtures/SampleApp/build/Debug/SampleApp.app/Contents/PkgInfo +1 -0
  25. data/features/fixtures/SampleApp/build/Debug/SampleApp.app/Contents/Resources/English.lproj/InfoPlist.strings +0 -0
  26. data/features/fixtures/SampleApp/build/Debug/SampleApp.app/Contents/Resources/English.lproj/MainMenu.nib +0 -0
  27. data/features/fixtures/SampleApp/build/Release/SampleApp.app.dSYM/Contents/Info.plist +27 -0
  28. data/features/fixtures/SampleApp/build/Release/SampleApp.app.dSYM/Contents/Resources/DWARF/SampleApp +0 -0
  29. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Sparkle +0 -0
  30. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Headers/SUAppcast.h +33 -0
  31. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h +47 -0
  32. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Headers/SUUpdater.h +118 -0
  33. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h +27 -0
  34. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Headers/Sparkle.h +21 -0
  35. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/Info.plist +24 -0
  36. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/License.txt +7 -0
  37. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist +174 -0
  38. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/SUStatus.nib/classes.nib +56 -0
  39. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/SUStatus.nib/info.nib +20 -0
  40. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/SUStatus.nib/keyedobjects.nib +0 -0
  41. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/classes.nib +50 -0
  42. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/info.nib +20 -0
  43. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib +0 -0
  44. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/classes.nib +67 -0
  45. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/info.nib +20 -0
  46. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/keyedobjects.nib +0 -0
  47. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/classes.nib +59 -0
  48. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/info.nib +20 -0
  49. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib +0 -0
  50. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings +0 -0
  51. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/classes.nib +50 -0
  52. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/info.nib +20 -0
  53. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib +0 -0
  54. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/classes.nib +67 -0
  55. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/info.nib +20 -0
  56. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/keyedobjects.nib +0 -0
  57. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/classes.nib +59 -0
  58. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/info.nib +21 -0
  59. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib +0 -0
  60. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings +0 -0
  61. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/classes.nib +50 -0
  62. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/info.nib +20 -0
  63. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib +0 -0
  64. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/classes.nib +67 -0
  65. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/info.nib +20 -0
  66. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/keyedobjects.nib +0 -0
  67. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/classes.nib +59 -0
  68. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/info.nib +20 -0
  69. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib +0 -0
  70. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings +0 -0
  71. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/classes.nib +50 -0
  72. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/info.nib +16 -0
  73. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib +0 -0
  74. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/classes.nib +67 -0
  75. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/info.nib +16 -0
  76. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/keyedobjects.nib +0 -0
  77. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.nib +59 -0
  78. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/info.nib +16 -0
  79. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib +0 -0
  80. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings +0 -0
  81. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/classes.nib +50 -0
  82. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/info.nib +20 -0
  83. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib +0 -0
  84. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/classes.nib +67 -0
  85. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/info.nib +20 -0
  86. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/keyedobjects.nib +0 -0
  87. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/classes.nib +59 -0
  88. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/info.nib +20 -0
  89. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib +0 -0
  90. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings +0 -0
  91. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/classes.nib +50 -0
  92. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/info.nib +18 -0
  93. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib +0 -0
  94. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/classes.nib +67 -0
  95. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/info.nib +16 -0
  96. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/keyedobjects.nib +0 -0
  97. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/classes.nib +59 -0
  98. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/info.nib +16 -0
  99. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib +0 -0
  100. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings +0 -0
  101. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/relaunch +0 -0
  102. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/classes.nib +50 -0
  103. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/info.nib +20 -0
  104. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib +0 -0
  105. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/classes.nib +67 -0
  106. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/info.nib +20 -0
  107. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/keyedobjects.nib +0 -0
  108. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/classes.nib +59 -0
  109. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/info.nib +18 -0
  110. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib +0 -0
  111. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings +0 -0
  112. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/classes.nib +50 -0
  113. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/info.nib +20 -0
  114. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib +0 -0
  115. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/classes.nib +39 -0
  116. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/info.nib +18 -0
  117. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/keyedobjects.nib +0 -0
  118. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/classes.nib +59 -0
  119. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/info.nib +20 -0
  120. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib +0 -0
  121. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings +0 -0
  122. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Frameworks/Sparkle.framework/Versions/A/Sparkle +0 -0
  123. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Info.plist +26 -0
  124. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/MacOS/SampleApp +0 -0
  125. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/PkgInfo +1 -0
  126. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Resources/English.lproj/InfoPlist.strings +0 -0
  127. data/features/fixtures/SampleApp/build/Release/SampleApp.app/Contents/Resources/English.lproj/MainMenu.nib +0 -0
  128. data/features/fixtures/SampleApp/build/SampleApp.build/Debug/SampleApp.build/Objects-normal/i386/SampleApp.LinkFileList +1 -0
  129. data/features/fixtures/SampleApp/build/SampleApp.build/Debug/SampleApp.build/SampleApp-all-target-headers.hmap +0 -0
  130. data/features/fixtures/SampleApp/build/SampleApp.build/Debug/SampleApp.build/SampleApp-generated-files.hmap +0 -0
  131. data/features/fixtures/SampleApp/build/SampleApp.build/Debug/SampleApp.build/SampleApp-own-target-headers.hmap +0 -0
  132. data/features/fixtures/SampleApp/build/SampleApp.build/Debug/SampleApp.build/SampleApp-project-headers.hmap +0 -0
  133. data/features/fixtures/SampleApp/build/SampleApp.build/Debug/SampleApp.build/SampleApp.dep +8 -0
  134. data/features/fixtures/SampleApp/build/SampleApp.build/Debug/SampleApp.build/SampleApp.hmap +0 -0
  135. data/features/fixtures/SampleApp/build/SampleApp.build/Release/SampleApp.build/Objects-normal/i386/SampleApp +0 -0
  136. data/features/fixtures/SampleApp/build/SampleApp.build/Release/SampleApp.build/Objects-normal/i386/SampleApp.LinkFileList +1 -0
  137. data/features/fixtures/SampleApp/build/SampleApp.build/Release/SampleApp.build/Objects-normal/ppc/SampleApp +0 -0
  138. data/features/fixtures/SampleApp/build/SampleApp.build/Release/SampleApp.build/Objects-normal/ppc/SampleApp.LinkFileList +1 -0
  139. data/features/fixtures/SampleApp/build/SampleApp.build/Release/SampleApp.build/SampleApp-all-target-headers.hmap +0 -0
  140. data/features/fixtures/SampleApp/build/SampleApp.build/Release/SampleApp.build/SampleApp-generated-files.hmap +0 -0
  141. data/features/fixtures/SampleApp/build/SampleApp.build/Release/SampleApp.build/SampleApp-own-target-headers.hmap +0 -0
  142. data/features/fixtures/SampleApp/build/SampleApp.build/Release/SampleApp.build/SampleApp-project-headers.hmap +0 -0
  143. data/features/fixtures/SampleApp/build/SampleApp.build/Release/SampleApp.build/SampleApp.dep +16 -0
  144. data/features/fixtures/SampleApp/build/SampleApp.build/Release/SampleApp.build/SampleApp.hmap +0 -0
  145. data/features/fixtures/SampleApp/build/SampleApp.build/Release/SampleApp.build/SampleApp~.dep +16 -0
  146. data/features/fixtures/SampleApp/build/SampleApp.build/SampleApp.pbxindex/categories.pbxbtree +0 -0
  147. data/features/fixtures/SampleApp/build/SampleApp.build/SampleApp.pbxindex/cdecls.pbxbtree +0 -0
  148. data/features/fixtures/SampleApp/build/SampleApp.build/SampleApp.pbxindex/decls.pbxbtree +0 -0
  149. data/features/fixtures/SampleApp/build/SampleApp.build/SampleApp.pbxindex/files.pbxbtree +0 -0
  150. data/features/fixtures/SampleApp/build/SampleApp.build/SampleApp.pbxindex/imports.pbxbtree +0 -0
  151. data/features/fixtures/SampleApp/build/SampleApp.build/SampleApp.pbxindex/pbxindex.header +0 -0
  152. data/features/fixtures/SampleApp/build/SampleApp.build/SampleApp.pbxindex/protocols.pbxbtree +0 -0
  153. data/features/fixtures/SampleApp/build/SampleApp.build/SampleApp.pbxindex/refs.pbxbtree +0 -0
  154. data/features/fixtures/SampleApp/build/SampleApp.build/SampleApp.pbxindex/strings.pbxstrings/control +0 -0
  155. data/features/fixtures/SampleApp/build/SampleApp.build/SampleApp.pbxindex/strings.pbxstrings/strings +0 -0
  156. data/features/fixtures/SampleApp/build/SampleApp.build/SampleApp.pbxindex/subclasses.pbxbtree +0 -0
  157. data/features/fixtures/SampleApp/build/SampleApp.build/SampleApp.pbxindex/symbols0.pbxsymbols +0 -0
  158. data/features/fixtures/SampleApp/main.m +14 -0
  159. data/features/fixtures/design/background.jpg +0 -0
  160. data/features/fixtures/design/ds_store +0 -0
  161. data/features/initial_generator.feature +26 -0
  162. data/features/rake_tasks.feature +44 -0
  163. data/features/steps/common.rb +242 -0
  164. data/features/steps/dmg_steps.rb +31 -0
  165. data/features/steps/env.rb +8 -0
  166. data/features/steps/generator.rb +39 -0
  167. data/features/steps/remote.rb +20 -0
  168. data/lib/choctop.rb +185 -0
  169. data/lib/choctop/appcast.rb +54 -0
  170. data/lib/choctop/dmg.rb +112 -0
  171. data/script/console +10 -0
  172. data/script/destroy +14 -0
  173. data/script/generate +14 -0
  174. metadata +271 -0
@@ -0,0 +1,31 @@
1
+ When /^dmg '(.*)' is mounted as '(.*)'$/ do |dmg, name|
2
+ @stdout = File.expand_path(File.join(@tmp_root, "hdiutil.out"))
3
+ in_project_folder do
4
+ @mountpoint = ChocTop.new.mountpoint
5
+ FileUtils.mkdir_p @mountpoint
6
+ @volume_path = "#{@mountpoint}/#{name}"
7
+ `hdiutil attach '#{dmg}' -mountpoint '#{@volume_path}' -noautoopen > #{@stdout}`
8
+ end
9
+ end
10
+
11
+ def in_mounted_volume(&block)
12
+ FileUtils.chdir(@volume_path, &block)
13
+ end
14
+
15
+ Then %r{^folder '(.*)' in mounted volume (is|is not) created} do |folder, is|
16
+ in_mounted_volume do
17
+ File.exists?(folder).should(is == 'is' ? be_true : be_false)
18
+ end
19
+ end
20
+
21
+ Then %r{^file '(.*)' in mounted volume (is|is not) created} do |file, is|
22
+ in_mounted_volume do
23
+ File.exists?(file).should(is == 'is' ? be_true : be_false)
24
+ end
25
+ end
26
+
27
+ Then /^file '(.*)' in mounted volume (is|is not) invisible$/ do |file, is|
28
+ in_mounted_volume do
29
+ `GetFileInfo -aV '#{@volume_path}/#{file}'`.to_i.should_not == (is == 'is' ? 0 : 1)
30
+ end
31
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + "/../../lib/choctop"
2
+
3
+ gem 'cucumber'
4
+ require 'cucumber'
5
+ gem 'rspec'
6
+ require 'spec'
7
+
8
+ require "activesupport"
@@ -0,0 +1,39 @@
1
+ Given /^a Cocoa app that does not have an existing Rakefile$/ do
2
+ Given "a safe folder"
3
+ setup_active_project_folder "sample_app"
4
+ end
5
+
6
+ Given /^a Cocoa app that does have an existing Rakefile$/ do
7
+ Given "a Cocoa app that does not have an existing Rakefile"
8
+ in_project_folder do
9
+ File.open("Rakefile", "w") do |f|
10
+ f << <<-RUBY.gsub(/^ /, '')
11
+ require "rubygems"
12
+ require "rake"
13
+ RUBY
14
+ end
15
+ end
16
+ end
17
+
18
+ Given /Rakefile wired to use development code instead of installed RubyGem/ do
19
+ in_project_folder do
20
+ prepend_to_file "Rakefile", "$:.unshift('#{@lib_path}')"
21
+ end
22
+ end
23
+
24
+ Given /Rakefile constants rewired for local rsync/ do
25
+ end
26
+
27
+ Given /^a Cocoa app with choctop installed$/ do
28
+ Given "a safe folder"
29
+ @remote_folder = File.expand_path(File.join(@tmp_root, 'website'))
30
+ FileUtils.rm_rf @remote_folder
31
+ FileUtils.mkdir_p @remote_folder
32
+ `cp -r #{File.dirname(__FILE__) + "/../fixtures/SampleApp"} #{@tmp_root}/ 2> /dev/null`
33
+ `rm -rf #{@tmp_root}/SampleApp/build`
34
+ setup_active_project_folder "SampleApp"
35
+ Given "I run local executable 'install_choctop' with arguments '.'"
36
+ Given "Rakefile wired to use development code instead of installed RubyGem"
37
+ Given "Rakefile constants rewired for local rsync"
38
+ ENV['NO_FINDER'] = 'YES' # disable Finder during tests
39
+ end
@@ -0,0 +1,20 @@
1
+ Then %r{^remote folder '(.*)' is created} do |folder|
2
+ FileUtils.chdir @remote_folder do
3
+ File.exists?(folder).should be_true
4
+ end
5
+ end
6
+
7
+ Then %r{^remote file '(.*)' (is|is not) created} do |file, is|
8
+ FileUtils.chdir @remote_folder do
9
+ File.exists?(file).should(is == 'is' ? be_true : be_false)
10
+ end
11
+ end
12
+
13
+ Given /^ChocTop config is configured for local rsync$/ do
14
+ in_project_folder do
15
+ append_to_file "Rakefile", <<-RUBY.gsub(/^ /, '')
16
+ $sparkle.host = ""
17
+ $sparkle.remote_dir = #{@remote_folder.inspect}
18
+ RUBY
19
+ end
20
+ end
data/lib/choctop.rb ADDED
@@ -0,0 +1,185 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require "fileutils"
5
+ require "yaml"
6
+ require "rubygems"
7
+ require "builder"
8
+ require "active_support"
9
+ require "osx/cocoa"
10
+
11
+ class ChocTop
12
+ VERSION = '0.9.0'
13
+
14
+ # The name of the Cocoa application
15
+ # Default: info_plist['CFBundleExecutable']
16
+ attr_accessor :name
17
+
18
+ # The version of the Cocoa application
19
+ # Default: info_plist['CFBundleVersion']
20
+ attr_accessor :version
21
+
22
+ # The target name of the distributed DMG file
23
+ # Default: #{name}.app
24
+ attr_accessor :target
25
+
26
+ # The host name, e.g. some-domain.com
27
+ attr_accessor :host
28
+
29
+ # The url from where the xml + dmg files will be downloaded
30
+ # Default: http://#{host}
31
+ attr_writer :base_url
32
+ def base_url
33
+ @base_url ||= "http://#{host}"
34
+ end
35
+
36
+ # The url to display the release notes for the latest release
37
+ # Default: base_url
38
+ attr_writer :release_notes_link
39
+ def release_notes_link
40
+ @release_notes_link ||= base_url
41
+ end
42
+
43
+ # The name of the local xml file containing the Sparkle item details
44
+ # Default: info_plist['SUFeedURL'] or linker_appcast.xml
45
+ attr_accessor :appcast_filename
46
+
47
+ # The remote directory where the xml + dmg files will be rsync'd
48
+ attr_accessor :remote_dir
49
+
50
+ # The argument flags passed to rsync
51
+ # Default: -aCv
52
+ attr_accessor :rsync_args
53
+
54
+ # Generated filename for a distribution, from name, version and .dmg
55
+ # e.g. MyApp-1.0.0.dmg
56
+ def pkg_name
57
+ "#{name}-#{version}.dmg"
58
+ end
59
+
60
+ # Path to generated package DMG
61
+ def pkg
62
+ "appcast/build/#{pkg_name}"
63
+ end
64
+
65
+ # Path to designed DMG and frozen assets for reuse in generated DMGs
66
+ def design_path
67
+ "appcast/design"
68
+ end
69
+
70
+ def mountpoint
71
+ # @mountpoint ||= "/tmp/build/mountpoint#{rand(10000000)}"
72
+ @mountpoint ||= "/Volumes"
73
+ end
74
+
75
+ # Path to Volume when DMG is mounted
76
+ def volume_path
77
+ "#{mountpoint}/#{name}"
78
+ end
79
+
80
+ #
81
+ # Custom DMG properties
82
+ #
83
+
84
+ # Path to background .icns image file for custom DMG
85
+ # Value should be file path relative to root of project
86
+ # Default: a choctop supplied background image
87
+ # that matches to default app_icon_position + applications_icon_position
88
+ # To have no custom background, set value to +nil+
89
+ attr_accessor :background_file
90
+
91
+ # x, y position of this project's icon on the custom DMG
92
+ # Default: a useful position for the icon against the default background
93
+ attr_accessor :app_icon_position
94
+
95
+ # x, y position of the Applications symlink icon on the custom DMG
96
+ # Default: a useful position for the icon against the default background
97
+ attr_accessor :applications_icon_position
98
+
99
+ # Path to an .icns file for the DMG's volume icon (looks like a disk or drive)
100
+ # Default: a DMG icon provided within choctop
101
+ # To get default, boring blank DMG volume icon, set value to +nil+
102
+ attr_accessor :volume_icon
103
+
104
+ # Size of icons, in pixels, within custom DMG (between 16 and 128)
105
+ # Default: 104 - this is nice and big
106
+ attr_accessor :icon_size
107
+
108
+ # The url for the remote package, without the protocol + host
109
+ # e.g. if absolute url is http://mydomain.com/downloads/MyApp-1.0.dmg
110
+ # then pkg_relative_url is /downloads/MyApp-1.0.dmg
111
+ def pkg_relative_url
112
+ _base_url = base_url.gsub(%r{/$}, '')
113
+ "#{_base_url}/#{pkg_name}".gsub(%r{^.*#{host}}, '')
114
+ end
115
+
116
+ def info_plist
117
+ @info_plist ||= OSX::NSDictionary.dictionaryWithContentsOfFile(File.expand_path('Info.plist')) || {}
118
+ end
119
+
120
+ def initialize
121
+ $sparkle = self # define a global variable for this object
122
+
123
+ # Defaults
124
+ @name = info_plist['CFBundleExecutable']
125
+ @version = info_plist['CFBundleVersion']
126
+ @target = "#{name}.app"
127
+ @appcast_filename = info_plist['SUFeedURL'] ? File.basename(info_plist['SUFeedURL']) : 'linker_appcast.xml'
128
+ @rsync_args = '-aCv'
129
+
130
+ @background_file = File.dirname(__FILE__) + "/../assets/default_background.jpg"
131
+ @app_icon_position = [50, 90]
132
+ @applications_icon_position = [150, 90]
133
+ @volume_icon = File.dirname(__FILE__) + "/../assets/DefaultVolumeIcon.icns"
134
+ @icon_size = 104
135
+
136
+ yield self if block_given?
137
+
138
+ define_tasks
139
+ end
140
+
141
+ def define_tasks
142
+ return unless Object.const_defined?("Rake")
143
+
144
+ desc "Build Xcode Release"
145
+ task :build => "build/Release/#{target}/Contents/Info.plist"
146
+
147
+ task "build/Release/#{target}/Contents/Info.plist" do
148
+ make_build
149
+ end
150
+
151
+ desc "Create the dmg file for appcasting"
152
+ task :dmg => :build do
153
+ detach_dmg
154
+ make_dmg
155
+ detach_dmg
156
+ convert_dmg_readonly
157
+ add_eula
158
+ end
159
+
160
+ desc "Create/update the appcast file"
161
+ task :feed => :dmg do
162
+ make_appcast
163
+ make_index_redirect
164
+ end
165
+
166
+ desc "Upload the appcast file to the host"
167
+ task :upload => :feed do
168
+ upload_appcast
169
+ end
170
+
171
+ desc "Create dmg, update appcast file, and upload to host"
172
+ task :appcast => %w[force_build dmg force_feed upload]
173
+
174
+ task :detach_dmg do
175
+ detach_dmg
176
+ end
177
+
178
+ task :size do
179
+ puts configure_dmg_window
180
+ end
181
+ end
182
+ end
183
+ require "choctop/appcast"
184
+ require "choctop/dmg"
185
+
@@ -0,0 +1,54 @@
1
+ module ChocTop::Appcast
2
+ def make_build
3
+ sh "xcodebuild -configuration Release"
4
+ end
5
+
6
+ def make_appcast
7
+ app_name = File.basename(File.expand_path('.'))
8
+
9
+ FileUtils.mkdir_p "appcast/build"
10
+ appcast = File.open("appcast/build/#{appcast_filename}", 'w')
11
+
12
+ xml = Builder::XmlMarkup.new(:target => appcast, :indent => 2)
13
+
14
+ xml.instruct!
15
+ xml.rss('xmlns:atom' => "http://www.w3.org/2005/Atom",
16
+ 'xmlns:sparkle' => "http://www.andymatuschak.org/xml-namespaces/sparkle",
17
+ :version => "2.0") do
18
+ xml.channel do
19
+ xml.title(app_name)
20
+ xml.description("#{app_name} updates")
21
+ xml.link(base_url)
22
+ xml.language('en')
23
+ xml.pubDate Time.now.to_s(:rfc822)
24
+ # xml.lastBuildDate(Time.now.rfc822)
25
+ xml.atom(:link, :href => "#{base_url}/#{appcast_filename}",
26
+ :rel => "self", :type => "application/rss+xml")
27
+
28
+ xml.item do
29
+ xml.title("#{name} #{version}")
30
+ xml.tag! "sparkle:releaseNotesLink", release_notes_link
31
+ xml.pubDate Time.now.to_s(:rfc822) #(File.mtime(pkg))
32
+ xml.guid("#{name}-#{version}", :isPermaLink => "false")
33
+ xml.enclosure(:url => "#{base_url}/#{pkg_name}",
34
+ :length => "#{File.size(pkg)}",
35
+ :type => "application/dmg",
36
+ :"sparkle:version" => version)
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ def make_index_redirect
43
+ File.open("appcast/build/index.php", 'w') do |f|
44
+ f << %Q{<?php header("Location: #{pkg_relative_url}"); ?>}
45
+ end
46
+ end
47
+
48
+ def upload_appcast
49
+ _host = host.blank? ? "" : "#{host}:"
50
+ sh %{rsync -aCv appcast/build/ #{_host}#{remote_dir}}
51
+ end
52
+
53
+ end
54
+ ChocTop.send(:include, ChocTop::Appcast)
@@ -0,0 +1,112 @@
1
+ module ChocTop::Dmg
2
+ def make_dmg
3
+ FileUtils.rm_rf pkg
4
+ FileUtils.mkdir_p(File.dirname(pkg))
5
+ FileUtils.mkdir_p(mountpoint)
6
+ sh "hdiutil create -format UDRW -quiet -volname '#{name}' -srcfolder 'build/Release/#{target}' '#{pkg}'"
7
+ sh "hdiutil attach '#{pkg}' -mountpoint '#{volume_path}' -noautoopen -quiet"
8
+ sh "bless --folder #{volume_path} --openfolder #{volume_path}"
9
+ sh "ln -s /Applications '#{volume_path}/Applications'"
10
+ sh "sleep 1"
11
+ if volume_icon
12
+ FileUtils.cp(volume_icon, "#{volume_path}/.VolumeIcon.icns")
13
+ sh "SetFile -a C #{volume_path}"
14
+ end
15
+ target_background = "#{volume_path}/#{volume_background}"
16
+ FileUtils.cp(background_file, target_background) if background_file
17
+ configure_dmg_window
18
+ sh "SetFile -a V #{target_background}" if background_file
19
+ end
20
+
21
+ def volume_background
22
+ "background#{File.extname(background_file)}"
23
+ end
24
+
25
+ def window_position
26
+ [50, 100]
27
+ end
28
+
29
+ def window_bounds
30
+ window_position +
31
+ window_position.zip(background_bounds).map { |w, b| w + b }
32
+ end
33
+
34
+ def background_bounds
35
+ return [400, 300] unless background_file
36
+ background = OSX::NSImage.alloc.initByReferencingFile(background_file).size.to_a
37
+ [background.first, background.last + statusbar_height]
38
+ end
39
+
40
+ def statusbar_height
41
+ 20
42
+ end
43
+
44
+ def configure_dmg_window
45
+ applescript = <<-SCRIPT
46
+ tell application "Finder"
47
+ set mountpoint to POSIX file ("#{volume_path}" as string) as alias
48
+ tell folder mountpoint
49
+ open
50
+ tell container window
51
+ set toolbar visible to false
52
+ set statusbar visible to false -- doesn't do anything at DMG open time
53
+ set current view to icon view
54
+ delay 1 -- Sync
55
+ set the bounds to {#{window_bounds.join(", ")}}
56
+ end tell
57
+ delay 1 -- Sync
58
+ set icon size of the icon view options of container window to #{icon_size}
59
+ set arrangement of the icon view options of container window to not arranged
60
+ set position of item "#{target}" to {#{app_icon_position.join(", ")}}
61
+ set position of item "Applications" to {#{applications_icon_position.join(", ")}}
62
+ set the bounds of the container window to {#{window_bounds.join(", ")}}
63
+ set background picture of the icon view options of container window to file "#{File.basename volume_background}"
64
+ update without registering applications
65
+ delay 5 -- Sync
66
+ close
67
+ end tell
68
+ -- Sync
69
+ delay 5
70
+ end tell
71
+ SCRIPT
72
+ File.open(scriptfile = "/tmp/choctop-script", "w") do |f|
73
+ f << applescript
74
+ end
75
+ sh("osascript #{scriptfile}") do |ok, res|
76
+ if ! ok
77
+ p res
78
+ puts volume_path
79
+ exit 1
80
+ end
81
+ end
82
+ applescript
83
+ end
84
+
85
+ def detach_dmg
86
+ mounted_paths = `hdiutil info | grep '#{volume_path}' | grep "Apple_HFS"`.split("\n").map { |e| e.split(" ").first }
87
+ mounted_paths.each do |path|
88
+ begin
89
+ sh "hdiutil detach '#{path}' -quiet -force"
90
+ rescue StandardError => e
91
+ p e
92
+ end
93
+ end
94
+ end
95
+
96
+ def convert_dmg_readonly
97
+ tmp_path = "/tmp/rw.dmg"
98
+ FileUtils.mv(pkg, tmp_path)
99
+ sh "hdiutil convert '#{tmp_path}' -format UDZO -imagekey zlib-level=9 -o '#{pkg}'"
100
+ end
101
+
102
+ def add_eula
103
+ # TODO support EULA
104
+ # hdiutil unflatten $@
105
+ # /Developer/Tools/DeRez -useDF SLAResources.rsrc > build/temp/sla.r
106
+ # /Developer/Tools/Rez -a build/temp/sla.r -o $@
107
+ # hdiutil flatten $@
108
+
109
+ end
110
+ end
111
+ ChocTop.send(:include, ChocTop::Dmg)
112
+