github-auto-locker 1.0.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.
Files changed (5) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +20 -0
  3. data/bin/github-auto-locker +6 -0
  4. data/lib/locker.rb +106 -0
  5. metadata +48 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bc9273f3326183b6f148ea285e832a062f41ecbf
4
+ data.tar.gz: 8bd1bc2c80f9974e6e693283dc275d6d071cfb52
5
+ SHA512:
6
+ metadata.gz: abea29689d9933d08b0df9ffcbe5ed03a4d973bb951143530ebd36ac828bc7b4d5cd0104ce2cf921127f6ddc03b0b292ac062860702fc92cc007bd55a64bded9
7
+ data.tar.gz: 7cee629c8db329bf402bf34e9e6bed026bdaaca098b3561a3bfabc7b29e5dc1157dea0cbc5588de495491ad4d4173b9dbb8dce5181b49fe6684ee25f325777bb
@@ -0,0 +1,20 @@
1
+ ## GitHub AutoLocker
2
+
3
+ Automatically locks old GitHub issues that have already been closed.
4
+
5
+ By default it locks closed issues that are over 120 days old.
6
+
7
+ ### Usage
8
+
9
+ This requires Ruby.
10
+
11
+ * Clone or download repo
12
+ * Run `./bin/github-auto-locker USER REPO TOKEN [age in days]`
13
+
14
+ The age is optional.
15
+
16
+ `TOKEN` is a personal access token from [here](https://github.com/settings/tokens). It will require the 'repo' scope.
17
+
18
+ ### License
19
+
20
+ MIT
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative '../lib/locker'
3
+
4
+ abort "Usage: auto-lock [user] [repo] [token] [days]" unless ARGV[2]
5
+
6
+ Locker.new(ARGV[0], ARGV[1], ARGV[2], ARGV[3] || 120).lock
@@ -0,0 +1,106 @@
1
+ require 'json'
2
+ require 'date'
3
+ require 'net/http'
4
+ require 'base64'
5
+
6
+ # Automatically locks old issues that have been closed already
7
+ class Locker
8
+ def initialize user, repo, token, old_days = 120
9
+ @user = user
10
+ @repo = repo
11
+ @token = token
12
+ @old_days = old_days
13
+ end
14
+
15
+ # Locks old closed issues
16
+ def lock
17
+ notify "Getting closed issues..."
18
+ issues = get_closed_issues
19
+
20
+ if issues.empty?
21
+ notify "No issues to lock"
22
+ else
23
+ notify "Received #{issues.length} issues"
24
+ notify "Locking old closed issues..."
25
+ lock_old_closed_issues issues
26
+ end
27
+ end
28
+
29
+ # Fetches all closed, unlocked issues closed before cutoff date
30
+ def get_closed_issues
31
+ issues = []
32
+ path = "/repos/#@user/#@repo/issues?state=closed&access_token=#@token&sort=updated&direction=asc"
33
+ page = 1
34
+ http = Net::HTTP.start("api.github.com", 443, nil, nil, nil, nil, use_ssl: true)
35
+
36
+ loop do
37
+ notify "Retrieving page #{page}..."
38
+
39
+ resp = http.get(path)
40
+ new_issues = JSON.parse(resp.body)
41
+ issues += new_issues
42
+
43
+ # Pagination
44
+ if resp['Link'].match /<https:\/\/api\.github\.com(\/[^>]+)>; rel="next",/
45
+ path = $1
46
+ page = path.match(/page=(\d+)/)[1]
47
+ else
48
+ http.finish
49
+ break
50
+ end
51
+ end
52
+
53
+ cutoff_date = (Date.today - @old_days).iso8601
54
+
55
+ issues.reject do |issue|
56
+ issue["locked"] or
57
+ issue["closed_at"] > cutoff_date
58
+ end
59
+ end
60
+
61
+ # Expects array of issues from API call
62
+ def lock_old_closed_issues issues
63
+ headers = {'Accept' => 'application/vnd.github.the-key-preview+json', # required for new lock API
64
+ 'Content-Length' => '0', # required for PUT with no body
65
+ 'Authorization' => "Basic #{Base64.strict_encode64("#@user:#@token")}"}
66
+
67
+ Net::HTTP.start("api.github.com", 443, nil, nil, nil, nil, use_ssl: true) do |http|
68
+ total = issues.length
69
+
70
+ issues.each_with_index do |issue, i|
71
+ number = issue['number']
72
+ locking number, i, total
73
+
74
+ path = issue["url"][22..-1] # pull path from full URL
75
+ response = http.put("#{path}/lock", '', headers)
76
+
77
+ if response.code == "204" # 204 means it worked, apparently
78
+ locked
79
+ else
80
+ error response.inspect
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ # Print locking message
87
+ def locking number, item, total
88
+ print "[INFO] Locking #{number} (#{item + 1}/#{total})..."
89
+ end
90
+
91
+ # Print locked message
92
+ def locked
93
+ puts 'locked!'
94
+ end
95
+
96
+ # Print INFO message
97
+ def notify message
98
+ puts "[INFO] #{message}"
99
+ end
100
+
101
+ # Print ERROR message
102
+ def error message
103
+ warn "[ERROR] #{message}"
104
+ end
105
+ end
106
+
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: github-auto-locker
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Justin Collins
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-06-13 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: "Automatically locks GitHub issues older than a specified number of days.\nThis
14
+ forces people to open new issues instead of attaching themselves to old (typically
15
+ unrelated) issues. \n"
16
+ email:
17
+ executables:
18
+ - github-auto-locker
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - README.md
23
+ - bin/github-auto-locker
24
+ - lib/locker.rb
25
+ homepage: https://github.com/presidentbeef/github-auto-locker
26
+ licenses: []
27
+ metadata: {}
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 2.4.8
45
+ signing_key:
46
+ specification_version: 4
47
+ summary: Simple script to lock closed GitHub issues over a certain age.
48
+ test_files: []