geet 0.3.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +3 -3
- data/README.md +25 -24
- data/bin/geet +21 -3
- data/geet.gemspec +2 -2
- data/lib/geet/commandline/configuration.rb +5 -5
- data/lib/geet/git/repository.rb +34 -15
- data/lib/geet/services/abstract_create_issue.rb +33 -0
- data/lib/geet/services/create_gist.rb +6 -4
- data/lib/geet/services/create_issue.rb +33 -87
- data/lib/geet/services/create_label.rb +7 -6
- data/lib/geet/services/create_pr.rb +42 -86
- data/lib/geet/services/list_issues.rb +13 -14
- data/lib/geet/services/list_labels.rb +4 -3
- data/lib/geet/services/list_milestones.rb +12 -11
- data/lib/geet/services/list_prs.rb +4 -3
- data/lib/geet/services/merge_pr.rb +12 -11
- data/lib/geet/shared/constants.rb +9 -0
- data/lib/geet/utils/attributes_selection_manager.rb +87 -0
- data/lib/geet/utils/manual_list_selection.rb +41 -27
- data/lib/geet/utils/string_matching_selection.rb +32 -0
- data/lib/geet/version.rb +1 -1
- data/spec/integration/create_gist_spec.rb +4 -4
- data/spec/integration/create_issue_spec.rb +6 -6
- data/spec/integration/create_label_spec.rb +3 -3
- data/spec/integration/create_pr_spec.rb +13 -13
- data/spec/integration/list_issues_spec.rb +5 -5
- data/spec/integration/list_labels_spec.rb +3 -3
- data/spec/integration/list_milestones_spec.rb +2 -2
- data/spec/integration/list_prs_spec.rb +2 -2
- data/spec/integration/merge_pr_spec.rb +2 -2
- data/spec/vcr_cassettes/create_issue_upstream.yml +1 -1
- data/spec/vcr_cassettes/create_pr.yml +181 -102
- data/spec/vcr_cassettes/create_pr_in_auto_mode_create_upstream.yml +1 -1
- data/spec/vcr_cassettes/create_pr_in_auto_mode_with_push.yml +1 -1
- data/spec/vcr_cassettes/create_pr_upstream.yml +2 -2
- metadata +8 -5
- data/lib/geet/utils/pattern_matching_selection.rb +0 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e527c60073723a00c502f04f5546b599f708cb71
|
4
|
+
data.tar.gz: efd1663ae8d3673833302dff6a1ffaf14ff61f87
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b7f2f095998602114752cf4ce083384715ac6d22a9bfe6814dc783a4f92ba581907f1212ce787b1af5345a59f68d3989150cc89bcd595ae53b3e7170fb0409e7
|
7
|
+
data.tar.gz: 438049ec26fedbf656f2909b1b307f91901b5d91a1f9e90d23f6dc64817f10461c7c4319786963a0af8949d9f371aa00495883556ef46bc1b813caebaff2cf02
|
data/Gemfile.lock
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
geet (0.3.
|
5
|
-
simple_scripting (~> 0.9.
|
4
|
+
geet (0.3.1)
|
5
|
+
simple_scripting (~> 0.9.4)
|
6
6
|
temp-fork-tp-filter (= 0.0.3)
|
7
7
|
|
8
8
|
GEM
|
@@ -52,7 +52,7 @@ GEM
|
|
52
52
|
unicode-display_width (~> 1.0, >= 1.0.1)
|
53
53
|
ruby-progressbar (1.9.0)
|
54
54
|
safe_yaml (1.0.4)
|
55
|
-
simple_scripting (0.9.
|
55
|
+
simple_scripting (0.9.4)
|
56
56
|
parseconfig (~> 1.0)
|
57
57
|
temp-fork-tp-filter (0.0.3)
|
58
58
|
necromancer (~> 0.4.0)
|
data/README.md
CHANGED
@@ -47,38 +47,19 @@ The default editor will be used for title/description:
|
|
47
47
|
|
48
48
|
![Issue creation editing screenshot](/extra/issue_editing.png?raw=true)
|
49
49
|
|
50
|
-
|
51
|
-
|
52
|
-
$ geet issue create --label-patterns bug,wip --assignee-patterns john
|
53
|
-
|
54
|
-
patterns are partial matches, so, for example, `johncarmack` will be matched as assignee in the first case.
|
55
|
-
|
56
|
-
After creation, the issue page will be automatically opened in the default browser.
|
57
|
-
|
58
|
-
### Using menus for options selection
|
59
|
-
|
60
|
-
Geet supports selecting options (labels, collaborators, etc.), using the `-` parameter:
|
61
|
-
|
62
|
-
$ geet issue create --label-patterns -
|
63
|
-
|
64
|
-
This will show a menu like the following:
|
50
|
+
Labels, milestone and assignees will be asked with menu selection:
|
65
51
|
|
66
52
|
Please select the label(s): (Use arrow keys, press Space to select and Enter to finish, and alphanumeric/underscore characters to filter)
|
67
53
|
‣ ⬡ bug
|
68
54
|
⬡ enhancement
|
69
55
|
⬡ not_an_issue
|
70
56
|
⬡ requires_design
|
71
|
-
⬡ technical_debt
|
72
|
-
⬡ top_priority
|
73
|
-
⬡ ux
|
74
57
|
|
75
|
-
|
58
|
+
Labels, milestone and assignees can be directly specified with the respective parameters:
|
76
59
|
|
77
|
-
|
78
|
-
‣ ⬡ bug
|
79
|
-
⬡ technical_debt
|
60
|
+
$ geet issue create --labels bug,wip --assignees johncarmark --milestone 1.0
|
80
61
|
|
81
|
-
|
62
|
+
After creation, the issue page will be automatically opened in the default browser.
|
82
63
|
|
83
64
|
### Create a PR (with label, reviewers, and assigned to self)
|
84
65
|
|
@@ -92,7 +73,7 @@ The default editor will be used for title/description:
|
|
92
73
|
|
93
74
|
More advanced PR creation, with label and reviewers, assigned to self:
|
94
75
|
|
95
|
-
$ geet pr create --
|
76
|
+
$ geet pr create --labels "code review" --reviewers kevin,tom,adrian
|
96
77
|
|
97
78
|
After creation, the issue page will be automatically opened in the default browser.
|
98
79
|
|
@@ -143,6 +124,26 @@ Create a public gist, with description:
|
|
143
124
|
|
144
125
|
$ geet gist create --public /path/to/myfile 'Gist description'
|
145
126
|
|
127
|
+
### Using menus for options selection
|
128
|
+
|
129
|
+
Menus can be used for selecting attributes (labels, collaborators, milestones...).
|
130
|
+
|
131
|
+
This is an example of multiple choice selection:
|
132
|
+
|
133
|
+
Please select the label(s): (Use arrow keys, press Space to select and Enter to finish, and alphanumeric/underscore characters to filter)
|
134
|
+
‣ ⬡ bug
|
135
|
+
⬡ enhancement
|
136
|
+
⬡ not_an_issue
|
137
|
+
⬡ requires_design
|
138
|
+
|
139
|
+
Typing alphanumeric keys and underscore will enable filtering:
|
140
|
+
|
141
|
+
Please select the label(s): (Filter: "b")
|
142
|
+
‣ ⬡ bug
|
143
|
+
⬡ technical_debt
|
144
|
+
|
145
|
+
When a filter is active, use `Backspace` to cancel the last character, and `Canc` to reset it.
|
146
|
+
|
146
147
|
### Help
|
147
148
|
|
148
149
|
Display the help:
|
data/bin/geet
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
+
require 'simple_scripting/configuration'
|
4
5
|
require_relative '../lib/geet/commandline/configuration.rb'
|
5
6
|
require_relative '../lib/geet/commandline/commands.rb'
|
6
7
|
require_relative '../lib/geet/commandline/editor.rb'
|
7
8
|
require_relative '../lib/geet/git/repository.rb'
|
8
9
|
require_relative '../lib/geet/helpers/summary_helper.rb'
|
10
|
+
require_relative '../lib/geet/shared/constants.rb'
|
9
11
|
require_relative '../lib/geet/utils/git_client.rb'
|
10
12
|
Dir[File.join(__dir__, '../lib/geet/services/*.rb')].each { |filename| require filename }
|
11
13
|
|
@@ -19,7 +21,7 @@ class GeetLauncher
|
|
19
21
|
def launch
|
20
22
|
command, options = Commandline::Configuration.new.decode_argv || exit
|
21
23
|
|
22
|
-
repository = Git::Repository.new(upstream: !!options[:upstream])
|
24
|
+
repository = Git::Repository.new(upstream: !!options[:upstream], protected_repositories: protected_repositories)
|
23
25
|
|
24
26
|
case command
|
25
27
|
when GIST_CREATE_COMMAND
|
@@ -31,7 +33,7 @@ class GeetLauncher
|
|
31
33
|
summary = options[:summary] || Commandline::Editor.new.edit_content(help: SUMMARY_TEMPLATE)
|
32
34
|
title, description = split_summary(summary)
|
33
35
|
|
34
|
-
options
|
36
|
+
options = default_to_manual_selection(options, :labels, :milestone, :assignees)
|
35
37
|
|
36
38
|
Services::CreateIssue.new(repository).execute(title, description, options)
|
37
39
|
when LABEL_CREATE_COMMAND
|
@@ -39,6 +41,8 @@ class GeetLauncher
|
|
39
41
|
|
40
42
|
Services::CreateLabel.new(repository).execute(name, options)
|
41
43
|
when ISSUE_LIST_COMMAND
|
44
|
+
options = default_to_manual_selection(options, :assignee)
|
45
|
+
|
42
46
|
Services::ListIssues.new(repository).execute(options)
|
43
47
|
when LABEL_LIST_COMMAND
|
44
48
|
Services::ListLabels.new(repository).execute
|
@@ -48,7 +52,7 @@ class GeetLauncher
|
|
48
52
|
summary = options[:summary] || edit_pr_summary
|
49
53
|
title, description = split_summary(summary)
|
50
54
|
|
51
|
-
options
|
55
|
+
options = default_to_manual_selection(options, :labels, :milestone, :reviewers)
|
52
56
|
|
53
57
|
Services::CreatePr.new(repository).execute(title, description, options)
|
54
58
|
when PR_LIST_COMMAND
|
@@ -77,6 +81,20 @@ class GeetLauncher
|
|
77
81
|
Commandline::Editor.new.edit_content(help: SUMMARY_TEMPLATE)
|
78
82
|
end
|
79
83
|
end
|
84
|
+
|
85
|
+
def default_to_manual_selection(options, *params)
|
86
|
+
params.each do |param|
|
87
|
+
options[param] ||= Shared::Constants::MANUAL_LIST_SELECTION_FLAG
|
88
|
+
end
|
89
|
+
|
90
|
+
options
|
91
|
+
end
|
92
|
+
|
93
|
+
def protected_repositories
|
94
|
+
configuration = SimpleScripting::Configuration.load
|
95
|
+
|
96
|
+
configuration.protected_repositories.to_s.split(':')
|
97
|
+
end
|
80
98
|
end
|
81
99
|
|
82
100
|
GeetLauncher.new.launch if $PROGRAM_NAME == __FILE__
|
data/geet.gemspec
CHANGED
@@ -10,14 +10,14 @@ Gem::Specification.new do |s|
|
|
10
10
|
s.platform = Gem::Platform::RUBY
|
11
11
|
s.required_ruby_version = '>= 2.3.0'
|
12
12
|
s.authors = ['Saverio Miroddi']
|
13
|
-
s.date = '2018-01-
|
13
|
+
s.date = '2018-01-28'
|
14
14
|
s.email = ['saverio.pub2@gmail.com']
|
15
15
|
s.homepage = 'https://github.com/saveriomiroddi/geet'
|
16
16
|
s.summary = 'Commandline interface for performing SCM (eg. GitHub) operations (eg. PR creation).'
|
17
17
|
s.description = 'Commandline interface for performing SCM (eg. GitHub) operations (eg. PR creation).'
|
18
18
|
s.license = 'GPL-3.0'
|
19
19
|
|
20
|
-
s.add_runtime_dependency 'simple_scripting', '~> 0.9.
|
20
|
+
s.add_runtime_dependency 'simple_scripting', '~> 0.9.4'
|
21
21
|
s.add_runtime_dependency 'temp-fork-tp-filter', '= 0.0.3'
|
22
22
|
|
23
23
|
s.add_development_dependency 'rake', '~> 12.3.0'
|
@@ -22,9 +22,9 @@ module Geet
|
|
22
22
|
# rubocop:disable Style/MutableConstant
|
23
23
|
ISSUE_CREATE_OPTIONS = [
|
24
24
|
['-n', '--no-open-issue', "Don't open the issue link in the browser after creation"],
|
25
|
-
['-l', '--
|
25
|
+
['-l', '--labels "bug,help wanted"', 'Labels'],
|
26
26
|
['-m', '--milestone 1.5.0', 'Milestone title pattern'],
|
27
|
-
['-a', '--
|
27
|
+
['-a', '--assignees john,tom,adrian,kevin', 'Assignee logins'],
|
28
28
|
['-s', '--summary title_and_description', 'Set the summary (title and optionally description'],
|
29
29
|
['-u', '--upstream', 'Create on the upstream repository'],
|
30
30
|
long_help: 'The default editor will be opened for editing title and description.'
|
@@ -37,7 +37,7 @@ module Geet
|
|
37
37
|
].freeze
|
38
38
|
|
39
39
|
ISSUE_LIST_OPTIONS = [
|
40
|
-
['-a', '--assignee
|
40
|
+
['-a', '--assignee john', 'Assignee login'],
|
41
41
|
['-u', '--upstream', 'List on the upstream repository'],
|
42
42
|
].freeze
|
43
43
|
|
@@ -52,9 +52,9 @@ module Geet
|
|
52
52
|
PR_CREATE_OPTIONS = [
|
53
53
|
['-A', '--automated-mode', "Automate the branch operations (see long help)"],
|
54
54
|
['-n', '--no-open-pr', "Don't open the PR link in the browser after creation"],
|
55
|
-
['-l', '--
|
55
|
+
['-l', '--labels "legacy,code review"', 'Labels'],
|
56
56
|
['-m', '--milestone 1.5.0', 'Milestone title pattern'],
|
57
|
-
['-r', '--
|
57
|
+
['-r', '--reviewers john,tom,adrian,kevin', 'Reviewer logins'],
|
58
58
|
['-s', '--summary title_and_description', 'Set the summary (title and optionally description'],
|
59
59
|
['-u', '--upstream', 'Create on the upstream repository'],
|
60
60
|
long_help: <<~STR
|
data/lib/geet/git/repository.rb
CHANGED
@@ -8,18 +8,26 @@ module Geet
|
|
8
8
|
# This class represents, for convenience, both the local and the remote repository, but the
|
9
9
|
# remote code is separated in each provider module.
|
10
10
|
class Repository
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
LOCAL_ACTION_ON_UPSTREAM_REPOSITORY_MESSAGE = <<~STR
|
12
|
+
The action will be performed on a fork, but an upstream repository has been found!
|
13
|
+
STR
|
14
|
+
|
15
|
+
ACTION_ON_PROTECTED_REPOSITORY_MESSAGE = <<~STR
|
16
|
+
This action will be performed on a protected repository!
|
14
17
|
STR
|
15
18
|
|
16
19
|
DEFAULT_GIT_CLIENT = Geet::Utils::GitClient.new
|
17
20
|
|
18
|
-
|
21
|
+
# warnings: disable all the warnings.
|
22
|
+
# protected_repositories: warn when creating an issue/pr on this repositories (entry format:
|
23
|
+
# `owner/repo`).
|
24
|
+
#
|
25
|
+
def initialize(upstream: false, git_client: DEFAULT_GIT_CLIENT, warnings: true, protected_repositories: [])
|
19
26
|
@upstream = upstream
|
20
27
|
@git_client = git_client
|
21
28
|
@api_token = extract_env_api_token
|
22
29
|
@warnings = warnings
|
30
|
+
@protected_repositories = protected_repositories
|
23
31
|
end
|
24
32
|
|
25
33
|
# REMOTE FUNCTIONALITIES (REPOSITORY)
|
@@ -33,7 +41,9 @@ module Geet
|
|
33
41
|
end
|
34
42
|
|
35
43
|
def create_issue(title, description)
|
36
|
-
|
44
|
+
confirm(LOCAL_ACTION_ON_UPSTREAM_REPOSITORY_MESSAGE) if local_action_on_upstream_repository? && @warnings
|
45
|
+
confirm(ACTION_ON_PROTECTED_REPOSITORY_MESSAGE) if action_on_protected_repository? && @warnings
|
46
|
+
|
37
47
|
attempt_provider_call(:Issue, :create, title, description, api_interface)
|
38
48
|
end
|
39
49
|
|
@@ -62,7 +72,9 @@ module Geet
|
|
62
72
|
end
|
63
73
|
|
64
74
|
def create_pr(title, description, head)
|
65
|
-
|
75
|
+
confirm(LOCAL_ACTION_ON_UPSTREAM_REPOSITORY_MESSAGE) if local_action_on_upstream_repository? && @warnings
|
76
|
+
confirm(ACTION_ON_PROTECTED_REPOSITORY_MESSAGE) if action_on_protected_repository? && @warnings
|
77
|
+
|
66
78
|
attempt_provider_call(:PR, :create, title, description, head, api_interface)
|
67
79
|
end
|
68
80
|
|
@@ -87,7 +99,6 @@ module Geet
|
|
87
99
|
# PROVIDER
|
88
100
|
|
89
101
|
def extract_env_api_token
|
90
|
-
provider_name = @git_client.provider_domain[/(.*)\.\w+/, 1]
|
91
102
|
env_variable_name = "#{provider_name.upcase}_API_TOKEN"
|
92
103
|
|
93
104
|
ENV[env_variable_name] || raise("#{env_variable_name} not set!")
|
@@ -121,22 +132,30 @@ module Geet
|
|
121
132
|
Dir[files_pattern].each { |filename| require filename }
|
122
133
|
end
|
123
134
|
|
124
|
-
#
|
135
|
+
# WARNINGS
|
125
136
|
|
126
|
-
def
|
127
|
-
|
128
|
-
|
137
|
+
def confirm(message)
|
138
|
+
full_message = "WARNING! #{message.strip}\nPress Enter to continue, or Ctrl+C to exit now."
|
139
|
+
print full_message
|
140
|
+
gets
|
129
141
|
end
|
130
142
|
|
131
|
-
def
|
132
|
-
|
133
|
-
|
143
|
+
def action_on_protected_repository?
|
144
|
+
path = @git_client.path(upstream: @upstream)
|
145
|
+
@protected_repositories.include?(path)
|
134
146
|
end
|
135
147
|
|
136
|
-
def
|
148
|
+
def local_action_on_upstream_repository?
|
137
149
|
@git_client.remote_defined?('upstream') && !@upstream
|
138
150
|
end
|
139
151
|
|
152
|
+
# OTHER HELPERS
|
153
|
+
|
154
|
+
def api_interface
|
155
|
+
path = @git_client.path(upstream: @upstream)
|
156
|
+
attempt_provider_call(:ApiInterface, :new, @api_token, repo_path: path, upstream: @upstream)
|
157
|
+
end
|
158
|
+
|
140
159
|
# Bare downcase provider name, eg. `github`
|
141
160
|
#
|
142
161
|
def provider_name
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'tmpdir'
|
4
|
+
|
5
|
+
require_relative '../helpers/os_helper'
|
6
|
+
require_relative '../utils/attributes_selection_manager'
|
7
|
+
require_relative '../utils/manual_list_selection'
|
8
|
+
require_relative '../utils/string_matching_selection'
|
9
|
+
|
10
|
+
module Geet
|
11
|
+
module Services
|
12
|
+
class AbstractCreateIssue
|
13
|
+
include Geet::Helpers::OsHelper
|
14
|
+
|
15
|
+
SUMMARY_BACKUP_FILENAME = File.join(Dir.tmpdir, 'last_geet_edited_summary.md')
|
16
|
+
|
17
|
+
def initialize(repository, out: $stdout)
|
18
|
+
@repository = repository
|
19
|
+
@out = out
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def save_summary(title, description)
|
25
|
+
summary = "#{title}\n\n#{description}".strip + "\n"
|
26
|
+
|
27
|
+
IO.write(SUMMARY_BACKUP_FILENAME, summary)
|
28
|
+
|
29
|
+
@out.puts "Error! Saved summary to #{SUMMARY_BACKUP_FILENAME}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -12,7 +12,9 @@ module Geet
|
|
12
12
|
API_TOKEN_KEY = 'GITHUB_API_TOKEN'
|
13
13
|
DEFAULT_GIT_CLIENT = Geet::Utils::GitClient.new
|
14
14
|
|
15
|
-
def initialize
|
15
|
+
def initialize(out: $stdout)
|
16
|
+
@out = out
|
17
|
+
|
16
18
|
api_token = extract_env_api_token
|
17
19
|
@api_interface = Geet::Github::ApiInterface.new(api_token)
|
18
20
|
end
|
@@ -22,17 +24,17 @@ module Geet
|
|
22
24
|
# :publik: defaults to false
|
23
25
|
# :no_browse defaults to false
|
24
26
|
#
|
25
|
-
def execute(full_filename, description: nil, publik: false, no_browse: false
|
27
|
+
def execute(full_filename, description: nil, publik: false, no_browse: false)
|
26
28
|
content = IO.read(full_filename)
|
27
29
|
|
28
30
|
gist_access = publik ? 'public' : 'private'
|
29
|
-
|
31
|
+
@out.puts "Creating a #{gist_access} gist..."
|
30
32
|
|
31
33
|
filename = File.basename(full_filename)
|
32
34
|
gist = Geet::Github::Gist.create(filename, content, @api_interface, description: description, publik: publik)
|
33
35
|
|
34
36
|
if no_browse
|
35
|
-
|
37
|
+
@out.puts "Gist address: #{gist.link}"
|
36
38
|
else
|
37
39
|
open_file_with_default_application(gist.link)
|
38
40
|
end
|
@@ -1,55 +1,36 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
require_relative '../helpers/os_helper.rb'
|
5
|
-
require_relative '../utils/manual_list_selection.rb'
|
6
|
-
require_relative '../utils/pattern_matching_selection.rb'
|
3
|
+
require_relative 'abstract_create_issue'
|
7
4
|
|
8
5
|
module Geet
|
9
6
|
module Services
|
10
|
-
class CreateIssue
|
11
|
-
include Geet::Helpers::OsHelper
|
12
|
-
|
13
|
-
MANUAL_LIST_SELECTION_FLAG = '-'.freeze
|
14
|
-
|
15
|
-
SUMMARY_BACKUP_FILENAME = File.join(Dir.tmpdir, 'last_geet_edited_summary.md')
|
16
|
-
|
17
|
-
def initialize(repository)
|
18
|
-
@repository = repository
|
19
|
-
end
|
20
|
-
|
7
|
+
class CreateIssue < AbstractCreateIssue
|
21
8
|
# options:
|
22
|
-
# :
|
23
|
-
# :
|
24
|
-
# :
|
9
|
+
# :labels
|
10
|
+
# :milestone: number or description pattern.
|
11
|
+
# :assignees
|
25
12
|
# :no_open_issue
|
26
13
|
#
|
27
14
|
def execute(
|
28
15
|
title, description,
|
29
|
-
|
30
|
-
|
16
|
+
labels: nil, milestone: nil, assignees: nil, no_open_issue: nil,
|
17
|
+
**
|
31
18
|
)
|
32
|
-
|
33
|
-
label_patterns, milestone_pattern, assignee_patterns, output
|
34
|
-
)
|
35
|
-
|
36
|
-
labels = select_entries('label', all_labels, label_patterns, :multiple, :name) if label_patterns
|
37
|
-
milestone, _ = select_entries('milestone', all_milestones, milestone_pattern, :single, :title) if milestone_pattern
|
38
|
-
assignees = select_entries('assignee', all_collaborators, assignee_patterns, :multiple, nil) if assignee_patterns
|
19
|
+
selected_labels, selected_milestone, selected_assignees = find_and_select_attributes(labels, milestone, assignees)
|
39
20
|
|
40
|
-
issue = create_issue(title, description
|
21
|
+
issue = create_issue(title, description)
|
41
22
|
|
42
|
-
edit_issue(issue,
|
23
|
+
edit_issue(issue, selected_labels, selected_milestone, selected_assignees)
|
43
24
|
|
44
25
|
if no_open_issue
|
45
|
-
|
26
|
+
@out.puts "Issue address: #{issue.link}"
|
46
27
|
else
|
47
28
|
open_file_with_default_application(issue.link)
|
48
29
|
end
|
49
30
|
|
50
31
|
issue
|
51
32
|
rescue => error
|
52
|
-
save_summary(title, description
|
33
|
+
save_summary(title, description) if title
|
53
34
|
raise
|
54
35
|
end
|
55
36
|
|
@@ -57,50 +38,33 @@ module Geet
|
|
57
38
|
|
58
39
|
# Internal actions
|
59
40
|
|
60
|
-
def
|
61
|
-
|
62
|
-
output.puts 'Finding labels...'
|
63
|
-
labels_thread = Thread.new { @repository.labels }
|
64
|
-
end
|
65
|
-
|
66
|
-
if milestone_pattern
|
67
|
-
output.puts 'Finding milestone...'
|
68
|
-
milestone_thread = Thread.new { @repository.milestones }
|
69
|
-
end
|
70
|
-
|
71
|
-
if assignee_patterns
|
72
|
-
output.puts 'Finding collaborators...'
|
73
|
-
assignees_thread = Thread.new { @repository.collaborators }
|
74
|
-
end
|
41
|
+
def find_and_select_attributes(labels, milestone, assignees)
|
42
|
+
selection_manager = Geet::Utils::AttributesSelectionManager.new(@repository, out: @out)
|
75
43
|
|
76
|
-
labels
|
77
|
-
milestones
|
78
|
-
assignees
|
44
|
+
selection_manager.add_attribute(:labels, 'label', labels, :multiple, name_method: :name) if labels
|
45
|
+
selection_manager.add_attribute(:milestones, 'milestone', milestone, :single, name_method: :title) if milestone
|
46
|
+
selection_manager.add_attribute(:collaborators, 'assignee', assignees, :multiple) if assignees
|
79
47
|
|
80
|
-
|
81
|
-
raise "No milestones found!" if milestone_pattern && milestones.empty?
|
82
|
-
raise "No collaborators found!" if assignee_patterns && assignees.empty?
|
83
|
-
|
84
|
-
[labels, milestones, assignees]
|
48
|
+
selection_manager.select_attributes
|
85
49
|
end
|
86
50
|
|
87
|
-
def create_issue(title, description
|
88
|
-
|
51
|
+
def create_issue(title, description)
|
52
|
+
@out.puts 'Creating the issue...'
|
89
53
|
|
90
54
|
issue = @repository.create_issue(title, description)
|
91
55
|
end
|
92
56
|
|
93
|
-
def edit_issue(issue, labels, milestone, assignees
|
57
|
+
def edit_issue(issue, labels, milestone, assignees)
|
94
58
|
# labels can be nil (parameter not passed) or empty array (parameter passed, but nothing
|
95
59
|
# selected)
|
96
|
-
add_labels_thread = add_labels(issue, labels
|
97
|
-
set_milestone_thread = set_milestone(issue, milestone
|
60
|
+
add_labels_thread = add_labels(issue, labels) if labels && !labels.empty?
|
61
|
+
set_milestone_thread = set_milestone(issue, milestone) if milestone
|
98
62
|
|
99
63
|
# same considerations as above, but with additional upstream case.
|
100
64
|
if assignees
|
101
|
-
assign_users_thread = assign_users(issue, assignees
|
65
|
+
assign_users_thread = assign_users(issue, assignees) if !assignees.empty?
|
102
66
|
elsif !@repository.upstream?
|
103
|
-
assign_users_thread = assign_authenticated_user(issue
|
67
|
+
assign_users_thread = assign_authenticated_user(issue)
|
104
68
|
end
|
105
69
|
|
106
70
|
add_labels_thread&.join
|
@@ -108,57 +72,39 @@ module Geet
|
|
108
72
|
assign_users_thread&.join
|
109
73
|
end
|
110
74
|
|
111
|
-
def add_labels(issue, selected_labels
|
75
|
+
def add_labels(issue, selected_labels)
|
112
76
|
labels_list = selected_labels.map(&:name).join(', ')
|
113
77
|
|
114
|
-
|
78
|
+
@out.puts "Adding labels #{labels_list}..."
|
115
79
|
|
116
80
|
Thread.new do
|
117
81
|
issue.add_labels(selected_labels.map(&:name))
|
118
82
|
end
|
119
83
|
end
|
120
84
|
|
121
|
-
def set_milestone(issue, milestone
|
122
|
-
|
85
|
+
def set_milestone(issue, milestone)
|
86
|
+
@out.puts "Setting milestone #{milestone.title}..."
|
123
87
|
|
124
88
|
Thread.new do
|
125
89
|
issue.edit(milestone: milestone.number)
|
126
90
|
end
|
127
91
|
end
|
128
92
|
|
129
|
-
def assign_users(issue, users
|
130
|
-
|
93
|
+
def assign_users(issue, users)
|
94
|
+
@out.puts "Assigning users #{users.join(', ')}..."
|
131
95
|
|
132
96
|
Thread.new do
|
133
97
|
issue.assign_users(users)
|
134
98
|
end
|
135
99
|
end
|
136
100
|
|
137
|
-
def assign_authenticated_user(issue
|
138
|
-
|
101
|
+
def assign_authenticated_user(issue)
|
102
|
+
@out.puts 'Assigning authenticated user...'
|
139
103
|
|
140
104
|
Thread.new do
|
141
105
|
issue.assign_users(@repository.authenticated_user)
|
142
106
|
end
|
143
107
|
end
|
144
|
-
|
145
|
-
def save_summary(title, description, output)
|
146
|
-
summary = "#{title}\n\n#{description}".strip + "\n"
|
147
|
-
|
148
|
-
IO.write(SUMMARY_BACKUP_FILENAME, summary)
|
149
|
-
|
150
|
-
output.puts "Error! Saved summary to #{SUMMARY_BACKUP_FILENAME}"
|
151
|
-
end
|
152
|
-
|
153
|
-
# Generic helpers
|
154
|
-
|
155
|
-
def select_entries(entry_type, entries, raw_patterns, selection_type, instance_method)
|
156
|
-
if raw_patterns == MANUAL_LIST_SELECTION_FLAG
|
157
|
-
Geet::Utils::ManualListSelection.new.select(entry_type, entries, selection_type, instance_method: instance_method)
|
158
|
-
else
|
159
|
-
Geet::Utils::PatternMatchingSelection.new.select(entry_type, entries, raw_patterns, instance_method: instance_method)
|
160
|
-
end
|
161
|
-
end
|
162
108
|
end
|
163
109
|
end
|
164
110
|
end
|