zz-export-pull-requests 0.3.7 → 0.3.12

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 +66 -8
  3. metadata +22 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: be7b000b9a74af6fdd565e31d64fd3f2b052e369578dbcd01876c8bf4cc88a4f
4
- data.tar.gz: 178f6ca624aa7403a60dc1281bdb933215656e6ce57d29f2367e7d25e9de287d
3
+ metadata.gz: ad7da2494c7c8ad182157844df4558d731231afc7c3c8453b4cd0cf128e56be5
4
+ data.tar.gz: 9b990c531f0a9beb4c93c8d188459c15381c6f36762a373a34e00d305e7e3cb1
5
5
  SHA512:
6
- metadata.gz: 64c90071b5df93136716ea5b1c5752f2658efe3e14472059dd6f465eef8a65ec5d03c82cb8958d1498e5706f1c079297ae9d9ffb3cb6260ec50f14194648d717
7
- data.tar.gz: 666a29249a87ca270e211527c60d8dc1ad557c36d7de14a3f51af97f20f70fdebb16c82648bd5dbe67a22aded505daab198c0407c166ec542c4e6f9808afb74a
6
+ metadata.gz: 644f2764fe9702db374e77e78f382fc8da73a246a5762702ea6586a4353585db6d1e56a8c474b970e7be2594d8f556fd6dceff66793fa20803b8bac5f82427dd
7
+ data.tar.gz: 0bd92c548197b23b1298a7c9b09755efc8656228104970b94d8237425dcddc88ffedea58e6e5007e030e3d80e1312617eb03657efb7a1831c713331fdcaef714
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.7"
13
+ VERSION = "0.3.12"
13
14
  SERVICES = %w[github gitlab bitbucket]
14
15
  GIT_CONFIGS = %w[epr.token github.oauth-token]
15
16
 
@@ -22,6 +23,18 @@ 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.formatter = proc {|severity, datetime, progname, msg|
34
+ "[#{datetime.strftime('%d/%m/%Y %H:%M:%S')}] EPR-#{severity} - #{msg}\n"
35
+ }
36
+ $redis = Redis.new(host: "localhost", db: 15)
37
+ $redis.set("bb-executed", 0) if $redis.get("bb-executed").nil?
25
38
 
26
39
  def localtime(t)
27
40
  # MM/DD/YY HH:MM:SS
@@ -55,9 +68,43 @@ def lookup_token
55
68
  end
56
69
  end
57
70
 
71
+ # extract "a3351540a2da" from
72
+ # given "https://api.bitbucket.org/2.0/repositories/hellogold/walletfactory/diff/hellogold/walletfactory:a3351540a2da..05675a5ae8ed?path=go%2Fwalletfactory%2F.gitignore"
73
+ def extract_hash_from_diff(user, repo, diff_link)
74
+ str1 = diff_link.split("..")
75
+ str2 = str1[0].split(":")
76
+ short_hash = str2[2]
77
+ long_hash = get_full_hash(user, repo, short_hash)
78
+ return long_hash
79
+ end
80
+
58
81
  def get_full_hash(user, repo, short_hash)
59
- result = $bitbucket.repos.commit.get_one(user, repo, short_hash)
60
- return result["hash"]
82
+ sleep_if_limit_reached
83
+
84
+ begin
85
+ result = $bitbucket.repos.commit.get_one(user, repo, short_hash)
86
+ $redis.incr("bb-executed")
87
+ return result["hash"]
88
+ rescue
89
+ $redis.incr("bb-executed")
90
+ return "bb-import-commit-not-found"
91
+ end
92
+ end
93
+
94
+ def sleep_if_limit_reached
95
+ executions = $redis.get("bb-executed").to_i
96
+ $redisLogger.info("We have called the API for #{executions} times")
97
+
98
+ if executions >= BITBUCKET_RATE_LIMIT
99
+ now = Time.now
100
+ now_formatted = now.strftime("%I:%M:%S")
101
+ one_hour = 1*60*60
102
+ later = now + one_hour
103
+ later_formatted = later.strftime("%I:%M:%S")
104
+ $redisLogger.info("#{now_formatted} - Rate limit reached. Will pause for an hour and will resume at #{later_formatted}.")
105
+ sleep one_hour
106
+ $redis.set("bb-executed", 0)
107
+ end
61
108
  end
62
109
 
63
110
  def bitbucket(user, repo)
@@ -78,6 +125,7 @@ def bitbucket(user, repo)
78
125
 
79
126
  loop do
80
127
  page += 1
128
+ sleep_if_limit_reached
81
129
 
82
130
  prs = $bitbucket.repos.pull_request.all(user, repo, :page => page, :state => $filter.upcase)
83
131
  prs["values"].each do |pr|
@@ -100,10 +148,12 @@ def bitbucket(user, repo)
100
148
  !pr.source.branch.nil? ? pr.source.branch.name : "",
101
149
  !pr.destination.branch.nil? ? pr.destination.branch.name : "",
102
150
  !pr.reason.nil? ? pr.reason : "",
103
- !pr.merge_commit.nil? ? pr.merge_commit["hash"] : ""
151
+ !pr.merge_commit.nil? ? pr.merge_commit["hash"] : "",
152
+ !pr.closed_by.nil? ? pr.closed_by.display_name : ""
104
153
  ]
105
154
  end
106
155
 
156
+ $redis.incr("bb-executed")
107
157
  break unless prs["next"]
108
158
  end
109
159
  end
@@ -113,12 +163,15 @@ def bitbucket(user, repo)
113
163
 
114
164
  loop do
115
165
  pr_page += 1
166
+ sleep_if_limit_reached
116
167
  prs = $bitbucket.repos.pull_request.all(user, repo, :page => pr_page, :state => $filter.upcase)
117
168
 
118
169
  prs["values"].each do |pr|
119
170
  comment_page = 0
120
171
  loop do
121
172
  comment_page += 1
173
+ sleep_if_limit_reached
174
+
122
175
  comments = $bitbucket.repos.pull_request.comments(user, repo, pr.id, :page => comment_page)
123
176
  comments["values"].each do |comment|
124
177
  rows << [
@@ -127,6 +180,7 @@ def bitbucket(user, repo)
127
180
  comment.pullrequest.id,
128
181
  comment.user? ? comment.user.display_name : no_user,
129
182
  comment.inline? ? "inline" : "normal",
183
+ comment.id,
130
184
  comment.content.raw,
131
185
  comment.content.html,
132
186
  localtime(comment.updated_on),
@@ -134,13 +188,17 @@ def bitbucket(user, repo)
134
188
  comment.inline? ? comment.inline.to : "",
135
189
  comment.inline? ? comment.inline.from : "",
136
190
  comment.inline? ? comment.inline.path : "",
137
- comment["links"].code? ? comment["links"].code.href : ""
191
+ comment["links"].code? ? comment["links"].code.href : "",
192
+ comment.parent? ? comment.parent.id : "",
193
+ comment["links"].code? ? extract_hash_from_diff(user, repo, comment["links"].code.href) : ""
138
194
  ]
139
195
  end
196
+ $redis.incr("bb-executed")
140
197
  break unless comments["next"]
141
198
  end
142
199
  end
143
-
200
+
201
+ $redis.incr("bb-executed")
144
202
  break unless prs["next"]
145
203
  end
146
204
  end
@@ -286,9 +344,9 @@ def export_repos(argv)
286
344
  rows = []
287
345
 
288
346
  if $export == EXPORT_PR_COMMENTS
289
- rows << %w[Repository Type PRNumber User CommentType BodyRaw BodyHTML CreatedAt IsDeleted ToLine FromLine FilePath Diff]
347
+ rows << %w[Repository Type PRNumber User CommentType CommentID BodyRaw BodyHTML CreatedAt IsDeleted ToLine FromLine FilePath Diff ParentID CommitHash]
290
348
  else
291
- rows << %w[Repository Type # User Title State CreatedAt UpdatedAt URL BodyRaw BodyHTML SourceCommit DestinationCommit SourceBranch DestinationBranch DeclineReason MergeCommit]
349
+ rows << %w[Repository Type # User Title State CreatedAt UpdatedAt URL BodyRaw BodyHTML SourceCommit DestinationCommit SourceBranch DestinationBranch DeclineReason MergeCommit ClosedBy]
292
350
  end
293
351
 
294
352
  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.7
4
+ version: 0.3.12
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-19 00:00:00.000000000 Z
11
+ date: 2019-12-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: github_api
@@ -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.