zz-export-pull-requests 0.3.6 → 0.3.11

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 (3) hide show
  1. checksums.yaml +4 -4
  2. data/bin/epr +69 -8
  3. metadata +24 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1bcbc5858a831bb7f50953a659eea6800e843aad238205d1f1bdd4ca45e2deb7
4
- data.tar.gz: 93469b0eaa9bf4791779906e2dc6aecd4aa29d5956769ee5181430b9ee6014a6
3
+ metadata.gz: ec23970f15be8703f88796fd826581b0cb275913be1cbe31620659da0de5e580
4
+ data.tar.gz: 0caf623b5619c463baa10d45cdd3fedb61912058b980bbd3f77d2bf845e3f09e
5
5
  SHA512:
6
- metadata.gz: 5e37eff10c88699a30e532c9b39d807c1187c6474922055b673d307b58543752652ddf6cd6d30dac1dcda0f56f332296b79651921b41aa79250290c8311150fd
7
- data.tar.gz: 99b821c8ca3c1d5812ed8c207d1ec0707565a380dcfa6cd53870aac3feb5ec10535f528a19ed5f8efeb819208229ce58872c678fb96ffa7d9cbd3aca959a5283
6
+ metadata.gz: 88f774bc035801a5def78caaf335f0a26be167544c0b24a7147a2fa402edd5b06831c52e24e8b00a5a154e050b8cad05a1ca3302e9d1e403ba02a831b5c7d7df
7
+ data.tar.gz: 54b5aa18b655620e74642ec2607cd47047c6a81fd054262104abbc365ee72cd903cbe709bbb5835554d5445efa80c0cfafe42fe8d75d600a679bd63111ad9dd2
data/bin/epr CHANGED
@@ -4,12 +4,13 @@ require "csv"
4
4
  require "optparse"
5
5
  require "time"
6
6
  require "logger"
7
+ require 'redis'
7
8
 
8
9
  require "github_api"
9
10
  require "gitlab"
10
11
  require "bitbucket_rest_api"
11
12
 
12
- VERSION = "0.3.6"
13
+ VERSION = "0.3.11"
13
14
  SERVICES = %w[github gitlab bitbucket]
14
15
  GIT_CONFIGS = %w[epr.token github.oauth-token]
15
16
 
@@ -22,6 +23,16 @@ EXPORT_PRS = "pr"
22
23
  EXPORT_PR_COMMENTS = "pr_comments"
23
24
 
24
25
  DEFAULT_BODY_LENGTH = 2 ** 32 - 1
26
+ BITBUCKET_RATE_LIMIT = 950 # actually, it's 1000 - we play safe here
27
+
28
+ # To store rate limit information for fast read & write.
29
+ # Data will persist in Redis DB/server until we shut it down.
30
+ # Docs: https://www.rubydoc.info/github/redis/redis-rb/master/frames
31
+ # Read: https://www.mikeperham.com/2015/09/24/storing-data-with-redis/#databases
32
+ $redisLogger = Logger.new(STDOUT)
33
+ $redisLogger.info("HELLO FROM REDIS LOGGER")
34
+ $redis = Redis.new(host: "localhost", db: 15)
35
+ $redis.set("bb-executed", 0) if $redis.get("bb-executed").nil?
25
36
 
26
37
  def localtime(t)
27
38
  # MM/DD/YY HH:MM:SS
@@ -55,6 +66,45 @@ def lookup_token
55
66
  end
56
67
  end
57
68
 
69
+ # extract "a3351540a2da" from
70
+ # given "https://api.bitbucket.org/2.0/repositories/hellogold/walletfactory/diff/hellogold/walletfactory:a3351540a2da..05675a5ae8ed?path=go%2Fwalletfactory%2F.gitignore"
71
+ def extract_hash_from_diff(user, repo, diff_link)
72
+ str1 = diff_link.split("..")
73
+ str2 = str1[0].split(":")
74
+ short_hash = str2[2]
75
+ long_hash = get_full_hash(user, repo, short_hash)
76
+ return long_hash
77
+ end
78
+
79
+ def get_full_hash(user, repo, short_hash)
80
+ sleep_if_limit_reached
81
+
82
+ begin
83
+ result = $bitbucket.repos.commit.get_one(user, repo, short_hash)
84
+ $redis.incr("bb-executed")
85
+ return result["hash"]
86
+ rescue
87
+ $redis.incr("bb-executed")
88
+ return "bb-import-commit-not-found"
89
+ end
90
+ end
91
+
92
+ def sleep_if_limit_reached
93
+ executions = $redis.get("bb-executed").to_i
94
+ $redisLogger.info("We have called the API for #{executions} times")
95
+
96
+ if executions >= BITBUCKET_RATE_LIMIT
97
+ now = Time.now
98
+ now_formatted = now.strftime("%I:%M:%S")
99
+ one_hour = 1*60*60
100
+ later = now + one_hour
101
+ later_formatted = later.strftime("%I:%M:%S")
102
+ $redisLogger.info("#{now_formatted} - Rate limit reached. Will pause for an hour and will resume at #{later_formatted}.")
103
+ sleep one_hour
104
+ $redis.set("bb-executed", 0)
105
+ end
106
+ end
107
+
58
108
  def bitbucket(user, repo)
59
109
  # TODO: make sure no need to translate any states
60
110
  # https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D/pullrequests
@@ -73,6 +123,7 @@ def bitbucket(user, repo)
73
123
 
74
124
  loop do
75
125
  page += 1
126
+ sleep_if_limit_reached
76
127
 
77
128
  prs = $bitbucket.repos.pull_request.all(user, repo, :page => page, :state => $filter.upcase)
78
129
  prs["values"].each do |pr|
@@ -90,15 +141,17 @@ def bitbucket(user, repo)
90
141
  pr["links"].html.href,
91
142
  pr.summary.raw,
92
143
  pr.summary.html,
93
- !pr.source.commit.nil? ? pr.source.commit["hash"] : "",
94
- !pr.destination.commit.nil? ? pr.destination.commit["hash"] : "",
144
+ !pr.source.commit.nil? ? get_full_hash(user, repo, pr.source.commit["hash"]) : "",
145
+ !pr.destination.commit.nil? ? get_full_hash(user, repo, pr.destination.commit["hash"]) : "",
95
146
  !pr.source.branch.nil? ? pr.source.branch.name : "",
96
147
  !pr.destination.branch.nil? ? pr.destination.branch.name : "",
97
148
  !pr.reason.nil? ? pr.reason : "",
98
- !pr.merge_commit.nil? ? pr.merge_commit["hash"] : ""
149
+ !pr.merge_commit.nil? ? pr.merge_commit["hash"] : "",
150
+ !pr.closed_by.nil? ? pr.closed_by.display_name : ""
99
151
  ]
100
152
  end
101
153
 
154
+ $redis.incr("bb-executed")
102
155
  break unless prs["next"]
103
156
  end
104
157
  end
@@ -108,12 +161,15 @@ def bitbucket(user, repo)
108
161
 
109
162
  loop do
110
163
  pr_page += 1
164
+ sleep_if_limit_reached
111
165
  prs = $bitbucket.repos.pull_request.all(user, repo, :page => pr_page, :state => $filter.upcase)
112
166
 
113
167
  prs["values"].each do |pr|
114
168
  comment_page = 0
115
169
  loop do
116
170
  comment_page += 1
171
+ sleep_if_limit_reached
172
+
117
173
  comments = $bitbucket.repos.pull_request.comments(user, repo, pr.id, :page => comment_page)
118
174
  comments["values"].each do |comment|
119
175
  rows << [
@@ -122,6 +178,7 @@ def bitbucket(user, repo)
122
178
  comment.pullrequest.id,
123
179
  comment.user? ? comment.user.display_name : no_user,
124
180
  comment.inline? ? "inline" : "normal",
181
+ comment.id,
125
182
  comment.content.raw,
126
183
  comment.content.html,
127
184
  localtime(comment.updated_on),
@@ -129,13 +186,17 @@ def bitbucket(user, repo)
129
186
  comment.inline? ? comment.inline.to : "",
130
187
  comment.inline? ? comment.inline.from : "",
131
188
  comment.inline? ? comment.inline.path : "",
132
- comment["links"].code? ? comment["links"].code.href : ""
189
+ comment["links"].code? ? comment["links"].code.href : "",
190
+ comment.parent? ? comment.parent.id : "",
191
+ comment["links"].code? ? extract_hash_from_diff(user, repo, comment["links"].code.href) : ""
133
192
  ]
134
193
  end
194
+ $redis.incr("bb-executed")
135
195
  break unless comments["next"]
136
196
  end
137
197
  end
138
-
198
+
199
+ $redis.incr("bb-executed")
139
200
  break unless prs["next"]
140
201
  end
141
202
  end
@@ -281,9 +342,9 @@ def export_repos(argv)
281
342
  rows = []
282
343
 
283
344
  if $export == EXPORT_PR_COMMENTS
284
- rows << %w[Repository Type PRNumber User CommentType BodyRaw BodyHTML CreatedAt IsDeleted ToLine FromLine FilePath Diff]
345
+ rows << %w[Repository Type PRNumber User CommentType CommentID BodyRaw BodyHTML CreatedAt IsDeleted ToLine FromLine FilePath Diff ParentID CommitHash]
285
346
  else
286
- rows << %w[Repository Type # User Title State CreatedAt UpdatedAt URL BodyRaw BodyHTML SourceCommit DestinationCommit SourceBranch DestinationBranch DeclineReason MergeCommit]
347
+ rows << %w[Repository Type # User Title State CreatedAt UpdatedAt URL BodyRaw BodyHTML SourceCommit DestinationCommit SourceBranch DestinationBranch DeclineReason MergeCommit ClosedBy]
287
348
  end
288
349
 
289
350
  rows[-1].insert(4, "Body") if $body
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zz-export-pull-requests
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.6
4
+ version: 0.3.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zulhilmi Zainudin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-17 00:00:00.000000000 Z
11
+ date: 2019-12-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: github_api
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 0.1.8
47
+ version: 0.1.11
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 0.1.8
54
+ version: 0.1.11
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +66,26 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0.9'
69
+ - !ruby/object:Gem::Dependency
70
+ name: redis
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '4.1'
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: 4.1.3
79
+ type: :development
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - "~>"
84
+ - !ruby/object:Gem::Version
85
+ version: '4.1'
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: 4.1.3
69
89
  description: Program to export GitHub, GitLab, or Bitbucket pull requests/merge requests
70
90
  and issues to CSV a file. This is forked version of https://github.com/sshaw/export-pull-requests
71
91
  project.