zz-export-pull-requests 0.3.9 → 0.3.14

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 +54 -6
  3. metadata +22 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: beed724fb1aff96563cc82b34e991f10060e6ea7fe9c0387297e73b2c28bc762
4
- data.tar.gz: 67c5554c4ccd7fb44d3357fee122a2afe11c527a7f6638a7bf19d7fcd730db0e
3
+ metadata.gz: de96b36aca31b822e84ccecae880661cf195490d51c4c2179ec728d8cff2e29a
4
+ data.tar.gz: a80cc917dc3f7223ad2a11012e0c8438e07192a69bb7a723b1ab3b1c403020b7
5
5
  SHA512:
6
- metadata.gz: f268c94678fd04cf6c1ea572eff9a892afda085c847d83251e4349c6712a478ee65eeea3e414f508d9deb56dbe04794c0c666c357061c166ab173747792615cc
7
- data.tar.gz: afaa31d97c97e9719c1692e7a14f495da21ad83e163d23c59c91e69ab4d3e972e73d7da7ea1070542062e7f689abb52a831f9baf9661da7d3828bb01e011efb3
6
+ metadata.gz: afa41b1d13284145982e6de17470762c997b8db2d0b392643dde5d34c57aa36bd5cf8c52fc401a1f6e892fe65ec10255abb8d075662b8fd907909180570268b4
7
+ data.tar.gz: 0c9ca291ab505c0e4a5cda68ebf1277cb6931c671abe0514ce6b7bd452a520a6896503fcc426c6118c643062b2c81bb309049222b3d9bf2f5401eaca983e1a21
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.9"
13
+ VERSION = "0.3.14"
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(STDERR)
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,17 +68,45 @@ 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"
58
73
  def extract_hash_from_diff(user, repo, diff_link)
59
74
  str1 = diff_link.split("..")
60
- str2 = str1[1].split("?")
61
- short_hash = str2[0]
75
+ str2 = str1[0].split(":")
76
+ short_hash = str2[2]
62
77
  long_hash = get_full_hash(user, repo, short_hash)
63
78
  return long_hash
64
79
  end
65
80
 
66
81
  def get_full_hash(user, repo, short_hash)
67
- result = $bitbucket.repos.commit.get_one(user, repo, short_hash)
68
- 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") if ENV['SHOW_LOGS']
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
+ if ENV['SHOW_LOGS']
105
+ $redisLogger.info("#{now_formatted} - Rate limit reached. Will pause for an hour and will resume at #{later_formatted}.")
106
+ end
107
+ sleep one_hour
108
+ $redis.set("bb-executed", 0)
109
+ end
69
110
  end
70
111
 
71
112
  def bitbucket(user, repo)
@@ -86,6 +127,7 @@ def bitbucket(user, repo)
86
127
 
87
128
  loop do
88
129
  page += 1
130
+ sleep_if_limit_reached
89
131
 
90
132
  prs = $bitbucket.repos.pull_request.all(user, repo, :page => page, :state => $filter.upcase)
91
133
  prs["values"].each do |pr|
@@ -113,6 +155,7 @@ def bitbucket(user, repo)
113
155
  ]
114
156
  end
115
157
 
158
+ $redis.incr("bb-executed")
116
159
  break unless prs["next"]
117
160
  end
118
161
  end
@@ -122,12 +165,15 @@ def bitbucket(user, repo)
122
165
 
123
166
  loop do
124
167
  pr_page += 1
168
+ sleep_if_limit_reached
125
169
  prs = $bitbucket.repos.pull_request.all(user, repo, :page => pr_page, :state => $filter.upcase)
126
170
 
127
171
  prs["values"].each do |pr|
128
172
  comment_page = 0
129
173
  loop do
130
174
  comment_page += 1
175
+ sleep_if_limit_reached
176
+
131
177
  comments = $bitbucket.repos.pull_request.comments(user, repo, pr.id, :page => comment_page)
132
178
  comments["values"].each do |comment|
133
179
  rows << [
@@ -149,10 +195,12 @@ def bitbucket(user, repo)
149
195
  comment["links"].code? ? extract_hash_from_diff(user, repo, comment["links"].code.href) : ""
150
196
  ]
151
197
  end
198
+ $redis.incr("bb-executed")
152
199
  break unless comments["next"]
153
200
  end
154
201
  end
155
-
202
+
203
+ $redis.incr("bb-executed")
156
204
  break unless prs["next"]
157
205
  end
158
206
  end
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.9
4
+ version: 0.3.14
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-22 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.