squash_ios_symbolicator 1.0.1 → 1.1.1
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.
- data/README.md +7 -0
- data/bin/squash_release +12 -5
- data/bin/symbolicate +4 -4
- data/lib/squash/symbolicator.rb +1 -0
- data/lib/squash/symbolicator/lines.rb +19 -4
- data/lib/squash/symbolicator/symbols.rb +20 -7
- metadata +27 -11
data/README.md
CHANGED
@@ -38,6 +38,13 @@ This gem uses `dwarfdump` to perform its symbolication. You'll therefore need
|
|
38
38
|
the Xcode Command Line tools installed on the machine that will be performing
|
39
39
|
the symbolication upload.
|
40
40
|
|
41
|
+
If you wish to use the symbolication tools provided in your own Ruby program,
|
42
|
+
you will need to add this gem to your Gemfile:
|
43
|
+
|
44
|
+
```` ruby
|
45
|
+
gem 'squash_ios_symbolicator', :require => 'squash/symbolicator'
|
46
|
+
````
|
47
|
+
|
41
48
|
Usage
|
42
49
|
-----
|
43
50
|
|
data/bin/squash_release
CHANGED
@@ -17,6 +17,7 @@
|
|
17
17
|
require 'optparse'
|
18
18
|
require 'rubygems'
|
19
19
|
require 'squash/uploader'
|
20
|
+
require 'plist'
|
20
21
|
|
21
22
|
def git_revision(dir)
|
22
23
|
head = File.read(File.join(dir, '.git', 'HEAD')).chomp
|
@@ -27,25 +28,31 @@ def git_revision(dir)
|
|
27
28
|
end
|
28
29
|
end
|
29
30
|
|
31
|
+
infoplist = Plist.parse_xml(ENV['INFOPLIST_FILE'])
|
32
|
+
|
30
33
|
project_dir = Dir.getwd
|
31
34
|
revision = nil
|
32
|
-
|
35
|
+
build = infoplist['CFBundleVersion']
|
36
|
+
version = infoplist['CFBundleShortVersionString']
|
37
|
+
options = {:success => [Net::HTTPSuccess, 422]}
|
33
38
|
|
34
39
|
parser = OptionParser.new do |parser|
|
35
|
-
parser.banner = "Usage: squash_release [options] YOUR_SQUASH_HOST YOUR_API_KEY ENVIRONMENT
|
40
|
+
parser.banner = "Usage: squash_release [options] YOUR_SQUASH_HOST YOUR_API_KEY ENVIRONMENT"
|
36
41
|
parser.on('-o', '--open-timeout N', Integer, "HTTP connection open timeout") { |ot| options[:open_timeout] = ot }
|
37
42
|
parser.on('-r', '--read-timeout N', Integer, "HTTP connection data received timeout") { |rt| options[:read_timeout] = rt }
|
38
43
|
parser.on('-k', '--[no-]skip-verification', "Do not perform SSL peer verification") { |sv| options[:skip_verification] = sv }
|
39
44
|
|
40
45
|
parser.on('-p', '--project-dir F', "Specify a custom project directory (default current directory)") { |pd| project_dir = pd }
|
41
46
|
parser.on('-r', '--revision R', "Specify a code revision that was deployed (default current revision)") { |r| revision = r }
|
47
|
+
parser.on('-b', '--build B', "Specify a machine-readble build number that was deployed (default from Info.plist)") { |b| build = b }
|
48
|
+
parser.on('-v', '--product-version V', "Specify a human-readable version that was deployed (default from Info.plist)") { |v| version = v }
|
42
49
|
|
43
50
|
parser.on('-h', '--help', "Show this message") { puts parser; exit }
|
44
51
|
parser.on('--version', "Display version number of this program") { puts "1.0.0"; exit }
|
45
52
|
end
|
46
53
|
parser.parse!(ARGV)
|
47
54
|
|
48
|
-
if ARGV.size !=
|
55
|
+
if ARGV.size != 3
|
49
56
|
puts parser
|
50
57
|
exit 1
|
51
58
|
end
|
@@ -53,7 +60,6 @@ end
|
|
53
60
|
host = ARGV.shift
|
54
61
|
api_key = ARGV.shift
|
55
62
|
environment = ARGV.shift
|
56
|
-
build = ARGV.shift
|
57
63
|
revision = revision || git_revision(project_dir)
|
58
64
|
|
59
65
|
Squash::Uploader.new(host, options).transmit '/api/1.0/deploy.json',
|
@@ -63,6 +69,7 @@ Squash::Uploader.new(host, options).transmit '/api/1.0/deploy.json',
|
|
63
69
|
'deploy' => {
|
64
70
|
'deployed_at' => Time.now,
|
65
71
|
'revision' => revision,
|
66
|
-
'build' => build
|
72
|
+
'build' => build,
|
73
|
+
'version' => version
|
67
74
|
}
|
68
75
|
}
|
data/bin/symbolicate
CHANGED
@@ -21,7 +21,7 @@ require 'yaml'
|
|
21
21
|
|
22
22
|
require 'rubygems'
|
23
23
|
require 'squash/uploader'
|
24
|
-
require '
|
24
|
+
require 'squash/symbolicator'
|
25
25
|
|
26
26
|
def git_revision(dir)
|
27
27
|
head = File.read(File.join(dir, '.git', 'HEAD')).chomp
|
@@ -66,7 +66,7 @@ else
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
|
-
sym = Symbolicator.new(dsym_file, project_dir)
|
69
|
+
sym = Squash::Symbolicator.new(dsym_file, project_dir)
|
70
70
|
archs = sym.architectures
|
71
71
|
uuids = Hash.new
|
72
72
|
archs.each do |arch, uuid|
|
@@ -75,10 +75,10 @@ end
|
|
75
75
|
|
76
76
|
Squash::Uploader.new(host, options).transmit '/api/1.0/symbolication.json',
|
77
77
|
'symbolications' =>
|
78
|
-
uuids.map
|
78
|
+
uuids.map { |uuid, (symbols, lines)|
|
79
79
|
{
|
80
80
|
'uuid' => uuid,
|
81
81
|
'symbols' => Base64.encode64(Zlib::Deflate.deflate(symbols.to_yaml)),
|
82
82
|
'lines' => Base64.encode64(Zlib::Deflate.deflate(lines.to_yaml))
|
83
83
|
}
|
84
|
-
|
84
|
+
}
|
data/lib/squash/symbolicator.rb
CHANGED
@@ -78,6 +78,7 @@ module Squash
|
|
78
78
|
|
79
79
|
current_subprogram[tag] = value
|
80
80
|
elsif line =~ /^0x[0-9a-f]+:\s+TAG_(\w+)/
|
81
|
+
next unless %w(low_pc high_pc decl_file decl_line name).all? { |k| current_subprogram.include? k }
|
81
82
|
current_subprogram['decl_file'].sub!(/^#{Regexp.escape @project_dir}\//, '') if @project_dir
|
82
83
|
symbolications.add current_subprogram['low_pc'],
|
83
84
|
current_subprogram['high_pc'],
|
@@ -12,14 +12,25 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
+
require 'serialbox'
|
16
|
+
|
17
|
+
Squash::Symbolicator::Line = Struct.new(:start_address, :file, :line, :column)
|
18
|
+
|
15
19
|
# An address ranged mapped to a specific line of code, as part of a {Lines}
|
16
20
|
# aggregation. No symbol data is included.
|
17
21
|
|
18
|
-
Squash::Symbolicator::Line
|
22
|
+
class Squash::Symbolicator::Line
|
23
|
+
include SerialBox
|
24
|
+
serialize_with :JSON
|
25
|
+
serialize_fields do |s|
|
26
|
+
s.serialize :start_address, :file, :line, :column
|
27
|
+
end
|
19
28
|
|
20
|
-
|
21
|
-
|
22
|
-
|
29
|
+
# @private
|
30
|
+
def <=>(other)
|
31
|
+
raise ArgumentError unless other.kind_of?(Squash::Symbolicator::Line)
|
32
|
+
start_address <=> other.start_address
|
33
|
+
end
|
23
34
|
end
|
24
35
|
|
25
36
|
# An aggregation of the `Symbolicator::Line`s of a binary class. This class
|
@@ -28,6 +39,10 @@ end
|
|
28
39
|
class Squash::Symbolicator::Lines
|
29
40
|
include Enumerable
|
30
41
|
|
42
|
+
include SerialBox
|
43
|
+
serialize_with :JSON
|
44
|
+
serialize_fields { |s| s.serialize :@lines }
|
45
|
+
|
31
46
|
# Creates a new empty aggregation.
|
32
47
|
|
33
48
|
def initialize
|
@@ -12,18 +12,27 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
+
Squash::Symbolicator::Symbol = Struct.new(:start_address, :end_address, :file, :line, :ios_method)
|
16
|
+
|
15
17
|
# An address ranged mapped to a symbol (method or function name), as part of a
|
16
18
|
# {Symbols} aggregation. The file and line where the symbol is declared is also
|
17
19
|
# included.
|
18
20
|
|
19
|
-
Squash::Symbolicator::Symbol
|
21
|
+
class Squash::Symbolicator::Symbol
|
22
|
+
include SerialBox
|
23
|
+
serialize_with :JSON
|
24
|
+
serialize_fields do |s|
|
25
|
+
s.serialize :start_address, :end_address, :file, :line, :ios_method
|
26
|
+
end
|
20
27
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
28
|
+
# @private
|
29
|
+
def <=>(other)
|
30
|
+
raise ArgumentError unless other.kind_of?(Squash::Symbolicator::Symbol)
|
31
|
+
if start_address == other.start_address
|
32
|
+
end_address <=> other.end_address
|
33
|
+
else
|
34
|
+
start_address <=> other.start_address
|
35
|
+
end
|
27
36
|
end
|
28
37
|
end
|
29
38
|
|
@@ -33,6 +42,10 @@ end
|
|
33
42
|
class Squash::Symbolicator::Symbols
|
34
43
|
include Enumerable
|
35
44
|
|
45
|
+
include SerialBox
|
46
|
+
serialize_with :JSON
|
47
|
+
serialize_fields { |s| s.serialize :@symbols }
|
48
|
+
|
36
49
|
# Creates a new empty aggregation.
|
37
50
|
|
38
51
|
def initialize
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: squash_ios_symbolicator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
-
- 0
|
9
8
|
- 1
|
10
|
-
|
9
|
+
- 1
|
10
|
+
version: 1.1.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Tim Morgan
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2013-01-
|
18
|
+
date: 2013-01-18 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
requirement: &id001 !ruby/object:Gem::Requirement
|
@@ -42,7 +42,7 @@ dependencies:
|
|
42
42
|
- 0
|
43
43
|
version: "0"
|
44
44
|
version_requirements: *id002
|
45
|
-
name:
|
45
|
+
name: serialbox
|
46
46
|
prerelease: false
|
47
47
|
type: :runtime
|
48
48
|
- !ruby/object:Gem::Dependency
|
@@ -51,14 +51,16 @@ dependencies:
|
|
51
51
|
requirements:
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
hash:
|
54
|
+
hash: 21
|
55
55
|
segments:
|
56
|
+
- 1
|
56
57
|
- 0
|
57
|
-
|
58
|
+
- 1
|
59
|
+
version: 1.0.1
|
58
60
|
version_requirements: *id003
|
59
|
-
name:
|
61
|
+
name: squash_uploader
|
60
62
|
prerelease: false
|
61
|
-
type: :
|
63
|
+
type: :runtime
|
62
64
|
- !ruby/object:Gem::Dependency
|
63
65
|
requirement: &id004 !ruby/object:Gem::Requirement
|
64
66
|
none: false
|
@@ -70,7 +72,7 @@ dependencies:
|
|
70
72
|
- 0
|
71
73
|
version: "0"
|
72
74
|
version_requirements: *id004
|
73
|
-
name:
|
75
|
+
name: rspec
|
74
76
|
prerelease: false
|
75
77
|
type: :development
|
76
78
|
- !ruby/object:Gem::Dependency
|
@@ -84,7 +86,7 @@ dependencies:
|
|
84
86
|
- 0
|
85
87
|
version: "0"
|
86
88
|
version_requirements: *id005
|
87
|
-
name:
|
89
|
+
name: yard
|
88
90
|
prerelease: false
|
89
91
|
type: :development
|
90
92
|
- !ruby/object:Gem::Dependency
|
@@ -98,6 +100,20 @@ dependencies:
|
|
98
100
|
- 0
|
99
101
|
version: "0"
|
100
102
|
version_requirements: *id006
|
103
|
+
name: redcarpet
|
104
|
+
prerelease: false
|
105
|
+
type: :development
|
106
|
+
- !ruby/object:Gem::Dependency
|
107
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
108
|
+
none: false
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
hash: 3
|
113
|
+
segments:
|
114
|
+
- 0
|
115
|
+
version: "0"
|
116
|
+
version_requirements: *id007
|
101
117
|
name: jeweler
|
102
118
|
prerelease: false
|
103
119
|
type: :development
|