motion-sparkle-sandbox 0.7.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.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/Gemfile +6 -0
- data/LICENSE +21 -0
- data/README.md +260 -0
- data/Rakefile +8 -0
- data/lib/motion-sparkle-sandbox.rb +11 -0
- data/lib/motion/project/appcast.rb +127 -0
- data/lib/motion/project/appcast/release_notes.content.html +22 -0
- data/lib/motion/project/appcast/release_notes.template.erb +19 -0
- data/lib/motion/project/install.rb +75 -0
- data/lib/motion/project/package.rb +44 -0
- data/lib/motion/project/project.rb +59 -0
- data/lib/motion/project/rake_tasks.rb +89 -0
- data/lib/motion/project/setup.rb +96 -0
- data/lib/motion/project/sparkle.rb +189 -0
- data/lib/motion/project/templates.rb +34 -0
- data/motion-sparkle-sandbox.gemspec +21 -0
- data/spec/sparkle_spec.rb +90 -0
- data/spec/spec_helper.rb +35 -0
- data/vendor/README.md +24 -0
- data/vendor/Sparkle.zip +0 -0
- data/vendor/codesign_xpc +46 -0
- data/vendor/generate_appcast +0 -0
- metadata +67 -0
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'erb'
|
2
|
+
require 'rexml/document'
|
3
|
+
|
4
|
+
module Motion::Project
|
5
|
+
class Sparkle
|
6
|
+
|
7
|
+
TEMPLATE_PATHS = [
|
8
|
+
File.expand_path(File.join(__FILE__, '../appcast'))
|
9
|
+
]
|
10
|
+
|
11
|
+
def all_templates
|
12
|
+
@all_templates ||= begin
|
13
|
+
templates = {}
|
14
|
+
TEMPLATE_PATHS.map { |path| Dir.glob(path + '/*') }.flatten.each do |template_path|
|
15
|
+
templates[File.basename(template_path)] = template_path
|
16
|
+
end
|
17
|
+
templates
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def copy_templates(force=false)
|
22
|
+
all_templates.each_pair do |tmpl, path|
|
23
|
+
result = "#{sparkle_config_path}/#{tmpl}"
|
24
|
+
if File.exist?(result) and !force
|
25
|
+
App.info 'Exists', result
|
26
|
+
else
|
27
|
+
FileUtils.cp(path, "#{sparkle_config_path}/")
|
28
|
+
App.info 'Create', "./#{sparkle_config_path}/#{tmpl.to_s}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# This is just so that the source file can be loaded.
|
2
|
+
module ::Motion; module Project; class Config
|
3
|
+
def self.variable(*); end
|
4
|
+
end; end; end
|
5
|
+
|
6
|
+
require 'date'
|
7
|
+
$:.unshift File.expand_path('../lib', __FILE__)
|
8
|
+
|
9
|
+
Gem::Specification.new do |spec|
|
10
|
+
spec.name = 'motion-sparkle-sandbox'
|
11
|
+
spec.version = '0.7.0'
|
12
|
+
spec.date = Date.today
|
13
|
+
spec.summary = 'Sparkle (sandboxed) integration for Rubymotion projects'
|
14
|
+
spec.description = "motion-sparkle-sandbox makes it easy to use the sandboxed version of Sparkle in your RubyMotion OS X apps"
|
15
|
+
spec.author = 'Brett Walker'
|
16
|
+
spec.email = 'github@digitalmoksha.com'
|
17
|
+
spec.homepage = 'https://github.com/digitalmoksha/motion-sparkle-sandbox'
|
18
|
+
spec.license = 'MIT'
|
19
|
+
spec.files = `git ls-files`.split("\n")
|
20
|
+
spec.require_paths = ['lib']
|
21
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
module Motion; module Project;
|
4
|
+
class Config
|
5
|
+
attr_writer :project_dir
|
6
|
+
end
|
7
|
+
end; end
|
8
|
+
|
9
|
+
describe "motion-sparkle-sandbox" do
|
10
|
+
extend SpecHelper::TemporaryDirectory
|
11
|
+
|
12
|
+
before do
|
13
|
+
unless @completed_setup
|
14
|
+
teardown_temporary_directory
|
15
|
+
setup_temporary_directory
|
16
|
+
|
17
|
+
FileUtils.mkdir_p(temporary_directory + 'resources')
|
18
|
+
FileUtils.mkdir_p(temporary_directory + 'vendor')
|
19
|
+
FileUtils.touch(temporary_directory + '.gitignore')
|
20
|
+
|
21
|
+
@config = App.config
|
22
|
+
@config.project_dir = temporary_directory.to_s
|
23
|
+
@config.instance_eval do
|
24
|
+
sparkle do
|
25
|
+
release :base_url, 'http://example.com'
|
26
|
+
release :public_key, 'public_key.pem'
|
27
|
+
release :version, '1.0'
|
28
|
+
# Optional config options
|
29
|
+
release :feed_base_url, 'http://rss.example.com'
|
30
|
+
release :feed_filename, 'example.xml'
|
31
|
+
release :notes_base_url, 'http://www.example.com'
|
32
|
+
release :notes_filename, 'example.html'
|
33
|
+
release :package_base_url, 'http://download.example.com'
|
34
|
+
release :package_filename, 'example.zip'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
Rake::Task['sparkle:setup'].invoke
|
38
|
+
Rake::Task['sparkle:setup_certificates'].invoke
|
39
|
+
@completed_setup = true
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
it "Sparkle's release base url should be set correctly" do
|
44
|
+
@config.sparkle.appcast.base_url.should.equal 'http://example.com'
|
45
|
+
end
|
46
|
+
|
47
|
+
it "Sparkle's feed url should be set correctly" do
|
48
|
+
@config.info_plist['SUFeedURL'].should.equal 'http://rss.example.com/example.xml'
|
49
|
+
end
|
50
|
+
|
51
|
+
it "Sparkle's release notes url should be set correctly" do
|
52
|
+
@config.sparkle.appcast.notes_url.should.equal 'http://www.example.com/example.html'
|
53
|
+
end
|
54
|
+
|
55
|
+
it "Sparkle's appcast package url should be set correctly" do
|
56
|
+
@config.sparkle.appcast.package_url.should.equal 'http://download.example.com/example.zip'
|
57
|
+
end
|
58
|
+
|
59
|
+
it "Sparkle's public key should have custom name" do
|
60
|
+
@config.info_plist['SUPublicDSAKeyFile'].should.equal 'public_key.pem'
|
61
|
+
end
|
62
|
+
|
63
|
+
it "Version and short version should be set correctly" do
|
64
|
+
@config.version.should.equal '1.0'
|
65
|
+
@config.short_version.should.equal '1.0'
|
66
|
+
end
|
67
|
+
|
68
|
+
it "Version should be same for short_version and version" do
|
69
|
+
@config.version.should.equal @config.short_version
|
70
|
+
end
|
71
|
+
|
72
|
+
it "Sparkle framework should be embedded" do
|
73
|
+
sparkle_framework_path = ROOT + "tmp/vendor/Sparkle/Sparkle.framework"
|
74
|
+
@config.embedded_frameworks.include?(sparkle_framework_path).should.equal true
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should create private certificate" do
|
78
|
+
File.exist?(@config.sparkle.private_key_path.to_s).should.equal true
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should create public certificate" do
|
82
|
+
File.exist?(@config.sparkle.public_key_path.to_s).should.equal true
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should add files to gitignore" do
|
86
|
+
a = `cat .gitignore`
|
87
|
+
a.strip.should.not.equal ''
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'rake'
|
4
|
+
require 'rubygems'
|
5
|
+
require 'bundler/setup'
|
6
|
+
require 'bacon'
|
7
|
+
|
8
|
+
ROOT = Pathname.new(File.expand_path('../../', __FILE__))
|
9
|
+
$:.unshift(ENV['RUBYMOTION_CHECKOUT'] || "/Library/RubyMotion/lib")
|
10
|
+
$:.unshift((ROOT + 'lib').to_s)
|
11
|
+
require 'motion/project/template/osx'
|
12
|
+
require 'motion-sparkle-sandbox'
|
13
|
+
|
14
|
+
Bacon.summary_at_exit
|
15
|
+
|
16
|
+
module SpecHelper
|
17
|
+
def self.temporary_directory
|
18
|
+
TemporaryDirectory.temporary_directory
|
19
|
+
end
|
20
|
+
|
21
|
+
module TemporaryDirectory
|
22
|
+
def temporary_directory
|
23
|
+
ROOT + 'tmp'
|
24
|
+
end
|
25
|
+
module_function :temporary_directory
|
26
|
+
|
27
|
+
def setup_temporary_directory
|
28
|
+
temporary_directory.mkpath
|
29
|
+
end
|
30
|
+
|
31
|
+
def teardown_temporary_directory
|
32
|
+
temporary_directory.rmtree if temporary_directory.exist?
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/vendor/README.md
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
## Building the Sparkle.zip
|
2
|
+
|
3
|
+
The structure of `Sparkle.zip` is:
|
4
|
+
|
5
|
+
```
|
6
|
+
Sparkle
|
7
|
+
codesign_xpc
|
8
|
+
Sparkle.framework
|
9
|
+
XPCServices
|
10
|
+
org.sparkle-project.InstallerConnection.xpc
|
11
|
+
org.sparkle-project.InstallerLauncher.xpc
|
12
|
+
org.sparkle-project.InstallerStatus.xpc
|
13
|
+
```
|
14
|
+
|
15
|
+
In order to get xpc services to be signed and work properly, they need to be copied into an `XPCServices` folder in `MyApp.app/Contents`
|
16
|
+
|
17
|
+
The `codesign_xpc` can properly sign these files once they have been copied into place.
|
18
|
+
|
19
|
+
1. Fetch the `ui-separation-and-xpc` branch
|
20
|
+
2. Copy the `bin/codesign_xpc` into the `Sparkle` folder
|
21
|
+
3. Run `make release` and change to the output folder
|
22
|
+
4. Copy the `Sparkle.framework` into the `Sparkle` folder
|
23
|
+
5. Copy each of the above xpc files into the `XPCServices` folder
|
24
|
+
6. compress the `Sparkle` folder
|
data/vendor/Sparkle.zip
ADDED
Binary file
|
data/vendor/codesign_xpc
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
|
3
|
+
import os, sys, subprocess
|
4
|
+
|
5
|
+
def log_message(message):
|
6
|
+
sys.stderr.write(message + "\n")
|
7
|
+
|
8
|
+
#Surround a token with double quotes if it has a space in it
|
9
|
+
def sanitize(argument):
|
10
|
+
return ('"' + argument + '"' if ' ' in argument else argument)
|
11
|
+
|
12
|
+
def _codesign_service(identity, path, entitlements_path=None):
|
13
|
+
command = ["codesign", "-fs", identity, path] + ([] if entitlements_path is None else ["--entitlements", entitlements_path])
|
14
|
+
log_message(" ".join(map(sanitize, command)))
|
15
|
+
|
16
|
+
process = subprocess.Popen(command, stdout=subprocess.PIPE)
|
17
|
+
process.communicate()
|
18
|
+
if process.returncode != 0:
|
19
|
+
log_message("Error: Failed to codesign %s" % (path))
|
20
|
+
sys.exit(1)
|
21
|
+
|
22
|
+
def codesign_service(service_name, identity, path, entitlements_path=None):
|
23
|
+
#Sign the auxiliary executables (if any)
|
24
|
+
executables_path = os.path.join(path, "Contents/MacOS/")
|
25
|
+
if os.path.exists(executables_path):
|
26
|
+
for executable in os.listdir(executables_path):
|
27
|
+
if executable != service_name:
|
28
|
+
_codesign_service(identity, os.path.join(executables_path, executable), entitlements_path)
|
29
|
+
|
30
|
+
#Sign the service bundle
|
31
|
+
_codesign_service(identity, path, entitlements_path)
|
32
|
+
|
33
|
+
if __name__ == "__main__":
|
34
|
+
if len(sys.argv) < 3:
|
35
|
+
log_message("Usage:\n\t%s code-signing-identity xpc-service xpc-service2 ..." % (sys.argv[0]))
|
36
|
+
log_message("Example:\n\t%s \"Developer ID Application\" ./XPCServices/*.xpc" % (sys.argv[0]))
|
37
|
+
sys.exit(1)
|
38
|
+
|
39
|
+
signing_identity = sys.argv[1]
|
40
|
+
xpc_services = sys.argv[2:]
|
41
|
+
|
42
|
+
for xpc_service in xpc_services:
|
43
|
+
parent, child = os.path.split(xpc_service)
|
44
|
+
service_name = os.path.splitext(child)[0]
|
45
|
+
entitlements_path = os.path.join(parent, service_name + ".entitlements")
|
46
|
+
codesign_service(service_name, signing_identity, xpc_service, None if not os.path.exists(entitlements_path) else entitlements_path)
|
Binary file
|
metadata
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: motion-sparkle-sandbox
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.7.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Brett Walker
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-03-17 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: motion-sparkle-sandbox makes it easy to use the sandboxed version of
|
14
|
+
Sparkle in your RubyMotion OS X apps
|
15
|
+
email: github@digitalmoksha.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- ".gitignore"
|
21
|
+
- Gemfile
|
22
|
+
- LICENSE
|
23
|
+
- README.md
|
24
|
+
- Rakefile
|
25
|
+
- lib/motion-sparkle-sandbox.rb
|
26
|
+
- lib/motion/project/appcast.rb
|
27
|
+
- lib/motion/project/appcast/release_notes.content.html
|
28
|
+
- lib/motion/project/appcast/release_notes.template.erb
|
29
|
+
- lib/motion/project/install.rb
|
30
|
+
- lib/motion/project/package.rb
|
31
|
+
- lib/motion/project/project.rb
|
32
|
+
- lib/motion/project/rake_tasks.rb
|
33
|
+
- lib/motion/project/setup.rb
|
34
|
+
- lib/motion/project/sparkle.rb
|
35
|
+
- lib/motion/project/templates.rb
|
36
|
+
- motion-sparkle-sandbox.gemspec
|
37
|
+
- spec/sparkle_spec.rb
|
38
|
+
- spec/spec_helper.rb
|
39
|
+
- vendor/README.md
|
40
|
+
- vendor/Sparkle.zip
|
41
|
+
- vendor/codesign_xpc
|
42
|
+
- vendor/generate_appcast
|
43
|
+
homepage: https://github.com/digitalmoksha/motion-sparkle-sandbox
|
44
|
+
licenses:
|
45
|
+
- MIT
|
46
|
+
metadata: {}
|
47
|
+
post_install_message:
|
48
|
+
rdoc_options: []
|
49
|
+
require_paths:
|
50
|
+
- lib
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
requirements: []
|
62
|
+
rubyforge_project:
|
63
|
+
rubygems_version: 2.7.6
|
64
|
+
signing_key:
|
65
|
+
specification_version: 4
|
66
|
+
summary: Sparkle (sandboxed) integration for Rubymotion projects
|
67
|
+
test_files: []
|