geet 0.3.1 → 0.3.2
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.
- 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
|

|
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
|