cp8_cli 4.2.1 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f2109ea21b64b97b4f7c9893b7e1e7f230414385
4
- data.tar.gz: 1c8a960a0321583368219a23ff3b6d39dc1a17f1
3
+ metadata.gz: 52294a714b6bd0654d9cb7f60eb97a286ba8c152
4
+ data.tar.gz: 18ef704f6df37d5866ccde786ee27e712f253508
5
5
  SHA512:
6
- metadata.gz: b39fb6c6a5c005b8037465a2b15e861d5e26abfc45725c653185563c03d2359b61e9667eefe0cb96ab73f4233644274846fcd81b6c40e3bd64093ec06d9a29dc
7
- data.tar.gz: 0e0f2cd42cf703fa6e5e845b0e671ec210670eefcacafcf635ebd1eb516d9982b6bfe57bf06e372638f39539adcb9c2657ce7bceefbc63c5ec3fa816ada7bf7e
6
+ metadata.gz: 6f785602e968326fd1686181205530c3fcaa026a5d81e7ec5cad97e06653c02a98a7c746479281cb526d4dddd6f945017b52472c22bc872c06cfa35a83d5c160
7
+ data.tar.gz: 147d685bf54fb2cc96601c07f731e9328b58f0ee771cb0b6046439a6076098783f800c63f6d63e49ed050881b6cf10005a45145262cc1ca20644c30cf37425f5
data/exe/cp8 CHANGED
@@ -7,7 +7,7 @@ require "cp8_cli"
7
7
 
8
8
  module Cp8Cli
9
9
  class App < Thor
10
- desc "start [URL|NAME]", "Assign self to story and create new branch"
10
+ desc "start [URL|TITLE]", "Assign self to story and create new branch"
11
11
  def start(name = nil)
12
12
  main.start(name)
13
13
  end
data/exe/git-cleanup CHANGED
@@ -4,4 +4,5 @@ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
4
4
 
5
5
  require "cp8_cli"
6
6
 
7
+ puts "git cleanup is DEPRECATED, please use cp8 cleanup".red
7
8
  Cp8Cli::Main.new.cleanup
data/exe/git-finish CHANGED
@@ -16,4 +16,5 @@ EOS
16
16
  opt :wip, "Open [WIP] PR"
17
17
  end
18
18
 
19
+ puts "git finish is DEPRECATED, please use cp8 submit".red
19
20
  Cp8Cli::Main.new.submit(options)
data/exe/git-open CHANGED
@@ -4,4 +4,5 @@ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
4
4
 
5
5
  require "cp8_cli"
6
6
 
7
+ puts "git open is DEPRECATED, please use cp8 open".red
7
8
  Cp8Cli::Main.new.open
data/exe/git-start CHANGED
@@ -4,4 +4,5 @@ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
4
4
 
5
5
  require "cp8_cli"
6
6
 
7
+ puts "git start is DEPRECATED, please use cp8 start".red
7
8
  Cp8Cli::Main.new.start(ARGV.first)
data/lib/cp8_cli.rb CHANGED
@@ -2,7 +2,6 @@ require "cp8_cli/version"
2
2
  require "cp8_cli/command"
3
3
  require "cp8_cli/table"
4
4
  require "cp8_cli/branch"
5
- require "cp8_cli/cleanup"
6
5
  require "cp8_cli/main"
7
6
 
8
7
  module Cp8Cli
@@ -0,0 +1,56 @@
1
+ require "cp8_cli/storyable"
2
+
3
+ module Cp8Cli
4
+ class AdhocStory
5
+ include Storyable
6
+ attr_reader :title
7
+
8
+ def initialize(title)
9
+ @title = title
10
+ end
11
+
12
+ def summary
13
+ nil # noop for now
14
+ end
15
+
16
+ def start
17
+ create_empty_commit
18
+ push_branch
19
+ create_wip_pull_request
20
+ end
21
+
22
+ def short_link
23
+ nil # noop for now
24
+ end
25
+
26
+ def pr_title
27
+ PullRequestTitle.new(title, prefixes: [:wip]).run
28
+ end
29
+
30
+ private
31
+
32
+ def create_empty_commit
33
+ Command.run "git commit --allow-empty -m\"#{commit_message}\""
34
+ end
35
+
36
+ def commit_message
37
+ "Started: #{escaped_title}"
38
+ end
39
+
40
+ def escaped_title
41
+ title.gsub('"', '\"')
42
+ end
43
+
44
+ def push_branch
45
+ branch.push
46
+ end
47
+
48
+ def create_wip_pull_request
49
+ Github::PullRequest.create(
50
+ title: pr_title,
51
+ from: branch.name,
52
+ to: branch.target
53
+ )
54
+ end
55
+ end
56
+ end
@@ -1,11 +1,17 @@
1
1
  require "active_support/core_ext/string/inflections"
2
2
  require "cp8_cli/ci"
3
- require "cp8_cli/pull_request"
3
+ require "cp8_cli/github/pull_request"
4
4
  require "cp8_cli/branch_name"
5
+ require "cp8_cli/current_user"
5
6
  require "cp8_cli/story_query"
7
+ require "cp8_cli/pull_request_title"
8
+ require "cp8_cli/pull_request_body"
6
9
 
7
10
  module Cp8Cli
8
11
  class Branch
12
+
13
+ attr_reader :name
14
+
9
15
  def initialize(name)
10
16
  @name = name
11
17
  end
@@ -14,14 +20,23 @@ module Cp8Cli
14
20
  new Command.read("git rev-parse --abbrev-ref HEAD")
15
21
  end
16
22
 
17
- def self.from_story(user:, story:)
23
+ def self.suggestion
24
+ new("suggestion-#{SecureRandom.hex(8)}")
25
+ end
26
+
27
+ def self.from_story(story)
18
28
  new BranchName.new(
19
- user: user,
20
- target: current.target,
21
- story: story
29
+ user: CurrentUser.new,
30
+ target: current,
31
+ title: story.title,
32
+ short_link: story.short_link
22
33
  ).to_s
23
34
  end
24
35
 
36
+ def story
37
+ @_story ||= StoryQuery.new(short_link).find if short_link
38
+ end
39
+
25
40
  def checkout
26
41
  Command.run "git checkout #{name} >/dev/null 2>&1 || git checkout -b #{name}"
27
42
  end
@@ -30,29 +45,24 @@ module Cp8Cli
30
45
  Command.run "git push origin #{name} -u"
31
46
  end
32
47
 
33
- def open_pull_request(options = {})
34
- pr = PullRequest.new options.reverse_merge(story: current_story, from: name, target: pull_request_target)
35
- pr.open
36
- end
37
-
38
48
  def open_ci
39
49
  Ci.new(branch_name: name, repo: Repo.current).open
40
50
  end
41
51
 
42
52
  def open_story_in_browser
43
- if current_story
44
- Command.open_url current_story.url
53
+ if story
54
+ Command.open_url story.url
45
55
  else
46
56
  Command.error "Not currently on story branch"
47
57
  end
48
58
  end
49
59
 
50
60
  def target
51
- name_parts[2] || name
61
+ name_parts[2] || "master"
52
62
  end
53
63
 
54
64
  def reset
55
- if Command.read("git status --porcelain")
65
+ if dirty?
56
66
  Command.error "Dirty working directory, not resetting."
57
67
  else
58
68
  Command.run("git reset --hard origin/#{name}")
@@ -65,30 +75,22 @@ module Cp8Cli
65
75
 
66
76
  private
67
77
 
68
- attr_reader :name
78
+ def short_link
79
+ return unless linked_branch?
69
80
 
70
- def current_story
71
- @_current_story ||= StoryQuery.new(short_link).find if short_link
81
+ name_parts.last
72
82
  end
73
83
 
74
- def short_link
75
- name_parts[3]
84
+ def linked_branch?
85
+ name_parts.size == 4
76
86
  end
77
87
 
78
88
  def name_parts
79
89
  @_name_parts ||= name.split(".")
80
90
  end
81
91
 
82
- def pull_request_target
83
- if plain_branch?
84
- "master"
85
- else
86
- target
87
- end
88
- end
89
-
90
- def plain_branch?
91
- name_parts.size == 1
92
+ def dirty?
93
+ Command.read("git status --porcelain")
92
94
  end
93
95
  end
94
96
  end
@@ -1,9 +1,10 @@
1
1
  module Cp8Cli
2
2
  class BranchName
3
- def initialize(user:, target:, story:)
3
+ def initialize(user:, target:, title:, short_link: nil)
4
4
  @user = user
5
5
  @target = target
6
- @story = story
6
+ @title = title
7
+ @short_link = short_link
7
8
  end
8
9
 
9
10
  def to_s
@@ -12,19 +13,15 @@ module Cp8Cli
12
13
 
13
14
  private
14
15
 
15
- attr_reader :user, :target, :story
16
+ attr_reader :user, :target, :title, :short_link
16
17
 
17
18
  def parts
18
19
  parts = []
19
20
  parts << user.initials.downcase
20
- parts << title
21
+ parts << title.parameterize[0..50]
21
22
  parts << target
22
- parts << story.short_link
23
- parts
24
- end
25
-
26
- def title
27
- story.title.parameterize[0..50]
23
+ parts << short_link
24
+ parts.compact
28
25
  end
29
26
  end
30
27
  end
@@ -0,0 +1,36 @@
1
+ module Cp8Cli
2
+ module Commands
3
+ class Cleanup
4
+ def run
5
+ Command.title "Cleaning merged story branches for [#{target}]"
6
+ update_remotes
7
+ remove_fully_merged_local_branches
8
+ remove_fully_merged_remote_branches
9
+ Command.success "Deleted branches merged with [#{target}]"
10
+ end
11
+
12
+ private
13
+
14
+ def target
15
+ @_target ||= Branch.current.target
16
+ end
17
+
18
+ def update_remotes
19
+ Command.run "git fetch"
20
+ Command.run "git remote prune origin"
21
+ end
22
+
23
+ def remove_fully_merged_local_branches
24
+ Command.run "git branch --merged origin/#{target} | grep '#{filter}' | xargs git branch -D"
25
+ end
26
+
27
+ def remove_fully_merged_remote_branches
28
+ Command.run "git branch -r --merged origin/#{target} | sed 's/ *origin\\///' | grep '#{filter}' | xargs -I% git push origin :%"
29
+ end
30
+
31
+ def filter
32
+ "\\.#{target}\\."
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,46 @@
1
+ require "cp8_cli/adhoc_story"
2
+ require "cp8_cli/github/issue"
3
+
4
+ module Cp8Cli
5
+ module Commands
6
+ class Start
7
+ def initialize(name)
8
+ @name = name
9
+ end
10
+
11
+ def run
12
+ check_version
13
+ story.branch.checkout
14
+ story.start
15
+ rescue Trello::Error => error
16
+ Command.error(error.message)
17
+ end
18
+
19
+ private
20
+
21
+ attr_reader :name
22
+
23
+ def check_version
24
+ unless Version.latest?
25
+ Command.error "Your `cp8_cli` version is out of date. Please run `gem update cp8_cli`."
26
+ end
27
+ end
28
+
29
+ def story
30
+ @_story ||= find_or_create_story
31
+ end
32
+
33
+ def find_or_create_story
34
+ if name.to_s.start_with?("https://github.com")
35
+ Github::Issue.find_by_url(name)
36
+ elsif name.to_s.start_with?("http")
37
+ Trello::Card.find_by_url(name)
38
+ elsif name.present?
39
+ AdhocStory.new(name)
40
+ else
41
+ Command.error "No name/url provided"
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,31 @@
1
+ module Cp8Cli
2
+ module Commands
3
+ class Submit
4
+ def initialize(options = {})
5
+ @options = options
6
+ end
7
+
8
+ def run
9
+ branch.push
10
+ pull_request.open
11
+ end
12
+
13
+ private
14
+
15
+ attr_reader :options
16
+
17
+ def branch
18
+ @_branch ||= Branch.current
19
+ end
20
+
21
+ def pull_request
22
+ Github::PullRequest.new(
23
+ from: branch,
24
+ to: branch.target,
25
+ title: PullRequestTitle.new(branch.story&.pr_title, prefixes: options.keys).run,
26
+ body: PullRequestBody.new(branch.story).run
27
+ )
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,39 @@
1
+ module Cp8Cli
2
+ module Commands
3
+ class Suggest
4
+
5
+ def run
6
+ cache_original_branch
7
+
8
+ suggestion_branch.checkout
9
+ suggestion_branch.push
10
+ pull_request.open(expand: nil)
11
+
12
+ original_branch.checkout
13
+ original_branch.reset
14
+ end
15
+
16
+ private
17
+
18
+ def cache_original_branch
19
+ original_branch # Keep reference for later
20
+ end
21
+
22
+ def original_branch
23
+ @_original_branch ||= Branch.current
24
+ end
25
+
26
+ def suggestion_branch
27
+ @_suggestion_branch ||= Branch.suggestion
28
+ end
29
+
30
+ def pull_request
31
+ Github::PullRequest.new(
32
+ from: suggestion_branch,
33
+ to: original_branch,
34
+ )
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -1,5 +1,9 @@
1
1
  module Cp8Cli
2
2
  class CurrentUser
3
+ def current
4
+ @_current ||= new
5
+ end
6
+
3
7
  def initials
4
8
  git_user_name.parameterize(separator: " ").split.map(&:first).join
5
9
  end
@@ -1,3 +1,4 @@
1
+ require "active_support"
1
2
  require "octokit"
2
3
 
3
4
  module Cp8Cli
@@ -1,10 +1,13 @@
1
1
  require "cp8_cli/github/base"
2
2
  require "cp8_cli/github/parsed_url"
3
3
  require "cp8_cli/github/parsed_short_link"
4
+ require "cp8_cli/storyable"
4
5
 
5
6
  module Cp8Cli
6
7
  module Github
7
8
  class Issue < Base
9
+ include Storyable
10
+
8
11
  def initialize(number:, repo:, attributes:)
9
12
  @number = number
10
13
  @repo = repo
@@ -44,49 +47,22 @@ module Cp8Cli
44
47
  end
45
48
 
46
49
  def start
47
- # noop for now
48
- end
49
-
50
- def finish
51
- # noop for now
52
- end
53
-
54
- def accept
55
- # noop for now
56
- end
57
-
58
- def assign(user)
59
- # add_assignes not released as gem yet https://github.com/octokit/octokit.rb/pull/894
60
- client.post "#{Octokit::Repository.path repo}/issues/#{number}/assignees", assignees: [user.github_login]
61
- end
62
-
63
- def add_label(label)
64
- self.class.request(:post, "cards/#{id}/idLabels", value: label.id)
65
- end
66
-
67
- def attach(url:)
68
- self.class.request(:post, "cards/#{id}/attachments", url: url)
50
+ assign CurrentUser.new
69
51
  end
70
52
 
71
53
  def short_link
72
54
  "#{repo}##{number}"
73
55
  end
74
56
 
75
- def short_url
76
- attributes[:shortUrl]
77
- end
78
-
79
57
  private
80
58
 
81
59
  attr_reader :number, :repo, :attributes
82
60
 
83
- def move_to(list)
84
- self.class.with("cards/:id/idList").where(id: id, value: list.id).put
61
+ def assign(user)
62
+ # add_assignes not released as gem yet https://github.com/octokit/octokit.rb/pull/894
63
+ client.post "#{Octokit::Repository.path repo}/issues/#{number}/assignees", assignees: [user.github_login]
85
64
  end
86
65
 
87
- def member_ids
88
- attributes["idMembers"] || []
89
- end
90
66
  end
91
67
  end
92
68
  end
@@ -0,0 +1,59 @@
1
+ require "cp8_cli/github/base"
2
+ require "cp8_cli/repo"
3
+
4
+ module Cp8Cli
5
+ module Github
6
+ class PullRequest < Base
7
+ def self.create(attributes = {})
8
+ new(attributes).save
9
+ end
10
+
11
+ def initialize(from:, to:, title: nil, body: nil)
12
+ @title = title
13
+ @body = body
14
+ @from = from
15
+ @to = to
16
+ end
17
+
18
+ def open(expand: 1)
19
+ query = base_query.merge(expand: expand)
20
+ url = "#{base_url}?#{query.compact.to_query}"
21
+
22
+ Command.open_url(url)
23
+ end
24
+
25
+ def save
26
+ client.create_pull_request(
27
+ repo.shorthand,
28
+ to,
29
+ from,
30
+ title,
31
+ body
32
+ )
33
+ end
34
+
35
+ private
36
+
37
+ attr_reader :from, :to, :title, :body
38
+
39
+ def base_url
40
+ repo.url + "/compare/#{escape to}...#{escape from}"
41
+ end
42
+
43
+ def base_query
44
+ {
45
+ title: title,
46
+ body: body,
47
+ }
48
+ end
49
+
50
+ def escape(text)
51
+ CGI.escape(text.to_s.strip)
52
+ end
53
+
54
+ def repo
55
+ @_repo ||= Repo.current
56
+ end
57
+ end
58
+ end
59
+ end
data/lib/cp8_cli/main.rb CHANGED
@@ -1,88 +1,39 @@
1
1
  require "cp8_cli/version"
2
- require "cp8_cli/local_config"
3
2
  require "cp8_cli/global_config"
4
- require "cp8_cli/github/issue"
5
- require "cp8_cli/current_user"
3
+ require "cp8_cli/commands/cleanup"
4
+ require "cp8_cli/commands/start"
5
+ require "cp8_cli/commands/submit"
6
+ require "cp8_cli/commands/suggest"
6
7
 
7
8
  module Cp8Cli
8
9
  class Main
9
- def initialize(global_config = GlobalConfig.new, local_config = LocalConfig.new)
10
+ def initialize(global_config = GlobalConfig.new)
10
11
  Trello::Base.configure(key: global_config.trello_key, token: global_config.trello_token)
11
12
  Github::Base.configure(token: global_config.github_token)
12
- @local_config = local_config
13
13
  end
14
14
 
15
15
  def start(name)
16
- Command.error "Your `cp8_cli` version is out of date. Please run `gem update cp8_cli`." unless Version.latest?
17
- story = create_or_pick_story(name)
18
- story.assign(current_user)
19
- story.start
20
- Branch.from_story(user: current_user, story: story).checkout
21
- rescue Trello::Error => error
22
- Command.error(error.message)
16
+ Commands::Start.new(name).run
23
17
  end
24
18
 
25
19
  def open
26
- Branch.current.open_story_in_browser
20
+ Branch.current.open_story_in_browser # TODO: move to /commands
27
21
  end
28
22
 
29
23
  def submit(options = {})
30
- branch = Branch.current
31
- branch.push
32
- branch.open_pull_request(options)
24
+ Commands::Submit.new(options).run
33
25
  end
34
26
 
35
27
  def ci
36
- Branch.current.open_ci
28
+ Branch.current.open_ci # TODO: move to /commands
37
29
  end
38
30
 
39
31
  def suggest
40
- original_branch = Branch.current
41
- suggestion_branch = Branch.new("suggestion-#{SecureRandom.hex(8)}")
42
- suggestion_branch.checkout
43
- suggestion_branch.push
44
- suggestion_branch.open_pull_request(target: original_branch, expand: false)
45
- original_branch.checkout
46
- original_branch.reset
32
+ Commands::Suggest.new.run
47
33
  end
48
34
 
49
35
  def cleanup
50
- Cleanup.new(Branch.current.target).run
36
+ Commands::Cleanup.new.run
51
37
  end
52
-
53
- private
54
-
55
- attr_reader :local_config
56
-
57
- def board
58
- @_board ||= local_config.board
59
- end
60
-
61
- def create_or_pick_story(name)
62
- if name.to_s.start_with?("https://github.com")
63
- Github::Issue.find_by_url(name)
64
- elsif name.to_s.start_with?("http")
65
- Trello::Card.find_by_url(name)
66
- elsif name.present?
67
- create_new_card(name)
68
- else
69
- pick_existing_card
70
- end
71
- end
72
-
73
- def create_new_card(name)
74
- label = Table.pick board.labels, caption: "Add label:"
75
- card = board.lists.backlog.cards.create name: name
76
- card.add_label(label) if label
77
- card
78
- end
79
-
80
- def pick_existing_card
81
- Table.pick board.lists.backlog.cards
82
- end
83
-
84
- def current_user
85
- @_current_user ||= CurrentUser.new
86
- end
87
38
  end
88
39
  end
@@ -0,0 +1,25 @@
1
+ module Cp8Cli
2
+ class PullRequestBody
3
+ def initialize(story)
4
+ @story = story
5
+ end
6
+
7
+ def run
8
+ return unless story
9
+
10
+ summary_with_release_note
11
+ end
12
+
13
+ private
14
+
15
+ attr_reader :story
16
+
17
+ def summary_with_release_note
18
+ story.summary + release_note
19
+ end
20
+
21
+ def release_note
22
+ "\n\n_Release note: #{story.title}_"
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,27 @@
1
+ module Cp8Cli
2
+ class PullRequestTitle
3
+ def initialize(title, prefixes: [])
4
+ @title = title
5
+ @prefixes = prefixes
6
+ end
7
+
8
+ def run
9
+ title_with_prefixes.presence
10
+ end
11
+
12
+ private
13
+
14
+ attr_reader :title, :prefixes
15
+
16
+ def title_with_prefixes
17
+ "#{prefixes_to_text} #{title}".strip
18
+ end
19
+
20
+
21
+ def prefixes_to_text
22
+ prefixes.map do |prefix|
23
+ "[#{prefix.to_s.upcase}]"
24
+ end.join(" ")
25
+ end
26
+ end
27
+ end
data/lib/cp8_cli/repo.rb CHANGED
@@ -17,8 +17,12 @@ module Cp8Cli
17
17
  path.split('/').last
18
18
  end
19
19
 
20
+ def shorthand
21
+ "#{user}/#{name}"
22
+ end
23
+
20
24
  def url
21
- "https://github.com/#{user}/#{name}"
25
+ "https://github.com/#{shorthand}"
22
26
  end
23
27
 
24
28
  private
@@ -0,0 +1,7 @@
1
+ module Cp8Cli
2
+ module Storyable
3
+ def branch
4
+ @_branch ||= Branch.from_story(self)
5
+ end
6
+ end
7
+ end
@@ -1,6 +1,10 @@
1
+ require "cp8_cli/storyable"
2
+
1
3
  module Cp8Cli
2
4
  module Trello
3
5
  class Card < Base
6
+ include Storyable
7
+
4
8
  belongs_to :board, foreign_key: "idBoard"
5
9
 
6
10
  def self.fields
@@ -26,38 +30,28 @@ module Cp8Cli
26
30
 
27
31
  def start
28
32
  move_to board.lists.started
33
+ assign CurrentUser.new
29
34
  end
30
35
 
31
- def finish
32
- move_to board.lists.finished
33
- end
34
-
35
- def accept
36
- move_to board.lists.accepted
37
- end
38
-
39
- def assign(user)
40
- return if member_ids.include?(user.trello_id)
41
- self.class.request(:post, "cards/#{id}/members", value: user.trello_id)
42
- end
43
-
44
- def add_label(label)
45
- self.class.request(:post, "cards/#{id}/idLabels", value: label.id)
36
+ def short_link
37
+ url.scan(/\/c\/(.+)\//).flatten.first
46
38
  end
47
39
 
40
+ # Used by CP-8 bot
48
41
  def attach(url:)
49
42
  self.class.request(:post, "cards/#{id}/attachments", url: url)
50
43
  end
51
44
 
52
- def short_link
53
- url.scan(/\/c\/(.+)\//).flatten.first
54
- end
45
+ private
55
46
 
56
- def short_url
57
- attributes[:shortUrl]
58
- end
47
+ def short_url
48
+ attributes[:shortUrl]
49
+ end
59
50
 
60
- private
51
+ def assign(user)
52
+ return if member_ids.include?(user.trello_id)
53
+ self.class.request(:post, "cards/#{id}/members", value: user.trello_id)
54
+ end
61
55
 
62
56
  def move_to(list)
63
57
  self.class.with("cards/:id/idList").where(id: id, value: list.id).put
@@ -1,5 +1,5 @@
1
1
  module Cp8Cli
2
- VERSION = "4.2.1"
2
+ VERSION = "5.0.0"
3
3
 
4
4
  class Version
5
5
  def self.latest?
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cp8_cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.2.1
4
+ version: 5.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jens Balvig
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-11-22 00:00:00.000000000 Z
11
+ date: 2017-12-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -302,23 +302,29 @@ files:
302
302
  - exe/git-open
303
303
  - exe/git-start
304
304
  - lib/cp8_cli.rb
305
+ - lib/cp8_cli/adhoc_story.rb
305
306
  - lib/cp8_cli/branch.rb
306
307
  - lib/cp8_cli/branch_name.rb
307
308
  - lib/cp8_cli/ci.rb
308
- - lib/cp8_cli/cleanup.rb
309
309
  - lib/cp8_cli/command.rb
310
+ - lib/cp8_cli/commands/cleanup.rb
311
+ - lib/cp8_cli/commands/start.rb
312
+ - lib/cp8_cli/commands/submit.rb
313
+ - lib/cp8_cli/commands/suggest.rb
310
314
  - lib/cp8_cli/config_store.rb
311
315
  - lib/cp8_cli/current_user.rb
312
316
  - lib/cp8_cli/github/base.rb
313
317
  - lib/cp8_cli/github/issue.rb
314
318
  - lib/cp8_cli/github/parsed_short_link.rb
315
319
  - lib/cp8_cli/github/parsed_url.rb
320
+ - lib/cp8_cli/github/pull_request.rb
316
321
  - lib/cp8_cli/global_config.rb
317
- - lib/cp8_cli/local_config.rb
318
322
  - lib/cp8_cli/main.rb
319
- - lib/cp8_cli/pull_request.rb
323
+ - lib/cp8_cli/pull_request_body.rb
324
+ - lib/cp8_cli/pull_request_title.rb
320
325
  - lib/cp8_cli/repo.rb
321
326
  - lib/cp8_cli/story_query.rb
327
+ - lib/cp8_cli/storyable.rb
322
328
  - lib/cp8_cli/table.rb
323
329
  - lib/cp8_cli/table/row.rb
324
330
  - lib/cp8_cli/trello/base.rb
@@ -351,7 +357,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
351
357
  version: '0'
352
358
  requirements: []
353
359
  rubyforge_project:
354
- rubygems_version: 2.6.11
360
+ rubygems_version: 2.6.13
355
361
  signing_key:
356
362
  specification_version: 4
357
363
  summary: Cookpad Global CLI.
@@ -1,36 +0,0 @@
1
- module Cp8Cli
2
- class Cleanup
3
- def initialize(target)
4
- @target = target
5
- end
6
-
7
- def run
8
- Command.title "Cleaning merged story branches for [#{target}]"
9
- update_remotes
10
- remove_fully_merged_local_branches
11
- remove_fully_merged_remote_branches
12
- Command.success "Deleted branches merged with [#{target}]"
13
- end
14
-
15
- private
16
-
17
- attr_reader :target
18
-
19
- def update_remotes
20
- Command.run "git fetch"
21
- Command.run "git remote prune origin"
22
- end
23
-
24
- def remove_fully_merged_local_branches
25
- Command.run "git branch --merged origin/#{target} | grep '#{filter}' | xargs git branch -D"
26
- end
27
-
28
- def remove_fully_merged_remote_branches
29
- Command.run "git branch -r --merged origin/#{target} | sed 's/ *origin\\///' | grep '#{filter}' | xargs -I% git push origin :%"
30
- end
31
-
32
- def filter
33
- "\\.#{target}\\."
34
- end
35
- end
36
- end
@@ -1,29 +0,0 @@
1
- module Cp8Cli
2
- class LocalConfig
3
- PATH = ".trello_flow"
4
-
5
- def initialize(store = nil)
6
- @store = store || ConfigStore.new(PATH)
7
- end
8
-
9
- def board
10
- @_board ||= Trello::Board.find(board_id)
11
- end
12
-
13
- private
14
-
15
- attr_reader :store
16
-
17
- def board_id
18
- @_board_id ||= store[:board_id] || configure_board_id
19
- end
20
-
21
- def configure_board_id
22
- store.save :board_id, Table.pick(trello_user.boards.active).id
23
- end
24
-
25
- def trello_user
26
- Trello::Member.current
27
- end
28
- end
29
- end
@@ -1,70 +0,0 @@
1
- require "cp8_cli/repo"
2
-
3
- module Cp8Cli
4
- class PullRequest
5
- def initialize(from:, target:, story: nil, expand: true, **options)
6
- @story = story
7
- @from = from
8
- @target = target.to_s
9
- @expand = expand
10
- @options = options
11
- end
12
-
13
- def open
14
- Command.open_url url
15
- end
16
-
17
- private
18
-
19
- attr_reader :story, :from, :target, :expand, :options
20
-
21
- def url
22
- repo.url + "/compare/#{target}...#{escape from}?title=#{escape title_with_prefixes}&body=#{escape body}#{expand_query}"
23
- end
24
-
25
- def expand_query
26
- if expand
27
- "&expand=1"
28
- end
29
- end
30
-
31
- def title
32
- return unless story
33
- story.pr_title
34
- end
35
-
36
- def body
37
- return unless story
38
- body = story.summary
39
- body << release_note unless release_branch?
40
- body
41
- end
42
-
43
- def release_note
44
- "\n\n_Release note: #{story.title}_"
45
- end
46
-
47
- def prefixes
48
- prefixes = []
49
- prefixes << "[WIP]" if options[:wip]
50
- prefixes << "[#{target.titleize}]" if release_branch?
51
- prefixes.join(" ")
52
- end
53
-
54
- def release_branch?
55
- target != "master"
56
- end
57
-
58
- def title_with_prefixes
59
- "#{prefixes} #{title}".strip
60
- end
61
-
62
- def escape(text)
63
- CGI.escape(text.to_s.strip)
64
- end
65
-
66
- def repo
67
- @_repo ||= Repo.current
68
- end
69
- end
70
- end