heal 0.0.1 → 0.0.2

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
  SHA256:
3
- metadata.gz: 284d2d18c3b978e9c3a13c4d08ee21ecca8c3c807d74ae1d605b50786cd116d1
4
- data.tar.gz: 2edea805c253d6ac5f3141b2a33d3b7a604c31ffdf34b171067f2f6712d5de28
3
+ metadata.gz: 7df98db2bf9734c0746ba355d93805baf195a517874f338b23dcc41043f3a55f
4
+ data.tar.gz: 8c3d7e97f5b79ce75b0ee3176a55cb2afa0b6e465838c0663afadffd1cc9b329
5
5
  SHA512:
6
- metadata.gz: f0941269ea4162a1f06115776b11c44cac9f82e6453ae63f0798b0e8c4158cf2e767cc76481c76e248f66db42c6bd4d7765ac68607868a31a718d7499adbf15a
7
- data.tar.gz: af3dab7f02fdb587d593898d29a9dcc7c2f2d3648c0dbf6469af4c158fc32c20c55f5617054a0eab4166546fbda91e9ad592c3d979925d801e5c59f459655428
6
+ metadata.gz: d08e1649677f4ec313d2a41a93e62a6d373d7a1d8f59822291e2cf971ab9f5dd5ad46fb02437324805a7d79e20abd1a0e08a62f6b5db95c3899be75577e632d1
7
+ data.tar.gz: 5519454a9cbb3ef4f9fc2dee54380de79ccd999055a3a43493d437faa4a524653d761b566800302777fc02c569222472b8b42b8eb1c85933ed5fb72d3b491bec
data/README.md CHANGED
@@ -1,34 +1,132 @@
1
1
  # Heal
2
2
 
3
- TODO: Delete this and the text below, and describe your gem
4
-
5
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/heal`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ Heal is a command-line interface for managing Git workflows and configurations.
6
4
 
7
5
  ## Installation
8
6
 
9
- TODO: Replace `UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG` with your gem name right after releasing it to RubyGems.org. Please do not do it earlier due to security reasons. Alternatively, replace this section with instructions to install your gem from git if you don't plan to release to RubyGems.org.
10
-
11
- Install the gem and add to the application's Gemfile by executing:
12
-
13
- $ bundle add UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG
7
+ To install the Heal CLI, follow these steps:
8
+
9
+ 1. **Add the gem to your Gemfile**:
10
+ ```ruby
11
+ gem 'heal'
12
+ ```
13
+
14
+ 2. **Install the gem**:
15
+ Run the following command in your terminal:
16
+ ```bash
17
+ bundle install
18
+ ```
19
+
20
+ If you are not using Bundler, you can install the gem directly:
21
+ ```bash
22
+ gem install heal
23
+ ```
24
+
25
+ 3. **Verify the installation**:
26
+ After installation, you can verify that the Heal CLI is working by running:
27
+ ```bash
28
+ heal help
29
+ ```
30
+
31
+ ## Available Commands
32
+
33
+ ### Configuration
34
+
35
+ - **`config`**:
36
+ - **Description**: Displays the current configuration settings.
37
+ - **Usage**:
38
+ ```bash
39
+ heal config
40
+ ```
41
+
42
+ ### Commands
43
+
44
+ - **`delivery`**:
45
+ - **Description**: Delivers an issue to the test environment by checking out the relevant branches and cherry-picking commits associated with the specified issue ID.
46
+ - **Usage**:
47
+ ```bash
48
+ heal delivery
49
+ ```
50
+
51
+ - **`release`**:
52
+ - **Description**: Releases a feature to a production-ready branch by cherry-picking commits from issues under an EPIC.
53
+ - **Usage**:
54
+ ```bash
55
+ heal release
56
+ ```
57
+
58
+ - **`git cherry-pick-pr COMMIT_MESSAGE_IDENTIFIER REPO SOURCE_BRANCH TARGET_BRANCH THROWAWAY_BRANCH`**:
59
+ - **Description**: Cherry picks a PR based on a commit message identifier (like a JIRA key), source repository, source branch, target branch, and a throwaway branch used for creating a PR to the target branch.
60
+ - **Usage**:
61
+ ```bash
62
+ heal git cherry-pick-pr <COMMIT_MESSAGE_IDENTIFIER> <REPO> <SOURCE_BRANCH> <TARGET_BRANCH> <THROWAWAY_BRANCH>
63
+ ```
64
+
65
+ - **`git find-commits COMMIT_MESSAGE_IDENTIFIER`**:
66
+ - **Description**: Finds commit IDs based on an identifier in the commit message.
67
+ - **Usage**:
68
+ ```bash
69
+ heal git find-commits <COMMIT_MESSAGE_IDENTIFIER>
70
+ ```
71
+
72
+ - **`git create-pr REPO_NAME SOURCE_BRANCH TO_BRANCH`**:
73
+ - **Description**: Creates a PR from a source branch to a target branch in the specified repository.
74
+ - **Usage**:
75
+ ```bash
76
+ heal git create-pr <REPO_NAME> <SOURCE_BRANCH> <TO_BRANCH>
77
+ ```
78
+
79
+ ## Configuration File
80
+
81
+ The Heal CLI uses a configuration file to manage settings. By default, the configuration file is located at `~/.heal/config.yml`. You can specify a different path using the `-c` option.
82
+
83
+ ### Configuration Structure
84
+
85
+ The configuration file should include the following sections:
86
+
87
+ - **git**: Contains Git-related settings.
88
+ - **repos**: An array of repository paths that the CLI will manage.
89
+ - **directories**: An array of directories to search for Git repositories.
90
+ - **branch**: Contains branch settings.
91
+ - **prefix**: The prefix for branch names.
92
+ - **targets**: Specifies target branches for delivery and development.
93
+
94
+ ### Example Configuration
95
+
96
+ ```yaml
97
+ git:
98
+ repos:
99
+ - /path/to/repo1
100
+ - /path/to/repo2
101
+ directories:
102
+ - ~/projects
103
+ branch:
104
+ prefix: "feature"
105
+ targets:
106
+ test: "test-branch"
107
+ development: "dev-branch"
108
+ release: "release-branch"
109
+ ```
14
110
 
15
- If bundler is not being used to manage dependencies, install the gem by executing:
111
+ ## Usage
16
112
 
17
- $ gem install UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG
113
+ To use the Heal CLI, simply run the command followed by the desired subcommand. For example:
18
114
 
19
- ## Usage
115
+ ```bash
116
+ heal delivery
117
+ ```
20
118
 
21
- TODO: Write usage instructions here
119
+ This command will initiate the delivery process for the issue with the ID prompted by the user.
22
120
 
23
121
  ## Development
24
122
 
25
123
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
26
124
 
27
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
125
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `lib/heal/version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
28
126
 
29
127
  ## Contributing
30
128
 
31
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/heal. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/heal/blob/master/CODE_OF_CONDUCT.md).
129
+ Bug reports and pull requests are welcome on GitHub at https://github.com/jjatinggoyal/heal. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/jjatinggoyal/heal/blob/master/CODE_OF_CONDUCT.md).
32
130
 
33
131
  ## License
34
132
 
@@ -36,4 +134,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
36
134
 
37
135
  ## Code of Conduct
38
136
 
39
- Everyone interacting in the Heal project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/heal/blob/master/CODE_OF_CONDUCT.md).
137
+ Everyone interacting in the Heal project's codebases, issue trackers, chat rooms, and mailing lists is expected to follow the [code of conduct](https://github.com/jjatinggoyal/heal/blob/master/CODE_OF_CONDUCT.md).
data/build.sh CHANGED
@@ -1,2 +1,2 @@
1
1
  gem build heal.gemspec
2
- gem install heal-0.0.1.gem
2
+ gem install heal-0.0.2.gem
data/lib/heal/cli/git.rb CHANGED
@@ -1,45 +1,38 @@
1
1
  class Heal::Cli::Git < Heal::Cli::Base
2
2
 
3
- desc "delivery ISSUE_ID", "Deliver an issue to test environment"
4
- def delivery(issue_id)
5
- ask_repo_choices.each do |repo|
6
- prepare(repo) do
7
- checkout_and_pull development_branch(issue_id)
8
- commits = issue_commits issue_id
9
- checkout_and_pull delivery_branch
10
- git :checkout, :"-b", issue_branch(issue_id)
11
-
12
- cherry_pick_commits(commits.reverse)
13
-
14
- git :push, :origin, :"-f", issue_branch(issue_id)
15
- create_pr from: issue_branch(issue_id), to: delivery_branch
16
- end
3
+ desc "cherry-pick-pr COMMIT_MESSAGE_IDENTIFIER REPO SOURCE_BRANCH TARGET_BRANCH THROWAWAY_BRANCH",
4
+ "Cherry Pick a PR based on a commit message identifier (like jira key), source repository, source branch, target branch and a throwaway branch used for creating PR to target branch"
5
+ def cherry_pick_pr(commit_message_identifier, repo, source_branch, target_branch, throwaway_branch)
6
+ prepare repo do
7
+ checkout_and_pull source_branch
8
+ commits = invoke "heal:cli:git:find-commits", [commit_message_identifier]
9
+ checkout_and_pull target_branch
10
+ checkout_new_branch throwaway_branch
11
+
12
+ cherry_pick_commits(commits)
13
+
14
+ git :push, :origin, throwaway_branch
15
+ invoke "heal:cli:git:create-pr", [repo_name, throwaway_branch, target_branch]
17
16
  end
18
17
  end
19
18
 
20
- desc "release EPIC_ID", "Release an EPIC to a production ready branch"
21
- def release(epic_id)
22
-
19
+ desc "find-commits COMMIT_MESSAGE_IDENTIFIER", "Find commit ids based on an identifier in commit message"
20
+ def find_commits(commit_message_identifier)
21
+ p `#{git :log, :"--oneline", :"--grep", commit_message_identifier, execute: false}`.lines.map { |line| line.split.first }.reverse
23
22
  end
24
23
 
25
- private
26
-
27
- def ask_repo_choices
28
- choices = @config["git"]["repos"].map { |repo| { File.basename(repo) => repo } }
29
- PROMPT.multi_select("Choose repositories:", choices, filter: true)
30
- end
31
-
32
- def delivery_branch
33
- @config["git"]["branch"]["targets"]["test"]
34
- end
35
24
 
36
- def development_branch(issue_id)
37
- @config["git"]["branch"]["prefix"] + "/" + @config["git"]["branch"]["targets"]["development"] + "/" + issue_id
25
+ # Opens a link to create a PR from +source_branch+ to +target_branch+ in +repo_name+
26
+ #
27
+ # @param repository_name [String] name of the repository to create the PR in
28
+ # @param source_branch [String] name of the branch to create the PR from
29
+ # @param target_branch [String] name of the branch to create the PR to
30
+ desc "create-pr REPO_NAME SOURCE_BRANCH TO_BRANCH", "Create a PR from a source to a target branch"
31
+ def create_pr(repository_name, source_branch, target_branch)
32
+ `open #{format(@config["git"]["pr_link"], repository_name, source_branch, target_branch)}`
38
33
  end
39
34
 
40
- def issue_branch(issue_id)
41
- @config["git"]["branch"]["prefix"] + "/" + delivery_branch + "/" + issue_id
42
- end
35
+ private
43
36
 
44
37
  def prepare(repo_path)
45
38
  @path = repo_path
@@ -60,6 +53,35 @@ class Heal::Cli::Git < Heal::Cli::Base
60
53
  `#{git :log, :"--oneline", :"--grep", issue_id, execute: false}`.lines.map { |line| line.split.first }
61
54
  end
62
55
 
56
+ def checkout_new_branch(throwaway_branch)
57
+ branch_already_present = (git :"rev-parse", :"--verify", throwaway_branch) || (git :"rev-parse", :"--verify", "origin/#{throwaway_branch}")
58
+ if branch_already_present
59
+ git :checkout, throwaway_branch
60
+ else
61
+ git :checkout, :"-b", throwaway_branch
62
+ end
63
+ end
64
+
65
+ def cherry_pick_commits(commits)
66
+ commits.each do |commit|
67
+ result = git :"cherry-pick", :"-x", :"--no-merges", commit
68
+ unless result
69
+ say "Conflict occurred while cherry-picking commit #{commit}. Please resolve the conflict and press any key to continue.", :red
70
+
71
+ loop do
72
+ # Check if there are unresolved conflicts
73
+ if `#{git :status, execute: false}`.include?("Unmerged paths")
74
+ PROMPT.keypress("Please resolve the conflicts and then press any key to continue...", active_color: :red)
75
+ else
76
+ say "Conflict resolved. Continuing with cherry-picking.", :green
77
+ git :"cherry-pick", :"--continue"
78
+ break # Exit the loop if conflicts are resolved
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
84
+
63
85
  def current_branch
64
86
  `#{git :"rev-parse", :"--abbrev-ref", :HEAD, execute: false}`.strip
65
87
  end
@@ -74,10 +96,6 @@ class Heal::Cli::Git < Heal::Cli::Base
74
96
  false
75
97
  end
76
98
 
77
- def create_pr(from:, to:)
78
- `open #{format(@config["git"]["pr_link"], repo_name, from, to)}`
79
- end
80
-
81
99
  def repo_name
82
100
  `#{git :remote, :"get-url", :origin, execute: false}`.match(/.*\/(.*?)\.git/)[1]
83
101
  end
@@ -87,24 +105,4 @@ class Heal::Cli::Git < Heal::Cli::Base
87
105
  execute ? system(command) : command
88
106
  end
89
107
 
90
- def cherry_pick_commits(commits)
91
- commits.each do |commit|
92
- result = git :"cherry-pick", :"-x", :"--no-merges", commit
93
- unless result
94
- say "Conflict occurred while cherry-picking commit #{commit}. Please resolve the conflict and press any key to continue.", :red
95
-
96
- loop do
97
- # Check if there are unresolved conflicts
98
- if `#{git :status, execute: false}`.include?("Unmerged paths")
99
- PROMPT.keypress("Please resolve the conflicts and then press any key to continue...", active_color: :red)
100
- else
101
- say "Conflict resolved. Continuing with cherry-picking.", :green
102
- git :"cherry-pick", :"--continue"
103
- break # Exit the loop if conflicts are resolved
104
- end
105
- end
106
- end
107
- end
108
- end
109
-
110
108
  end
data/lib/heal/cli/main.rb CHANGED
@@ -5,7 +5,57 @@ class Heal::Cli::Main < Heal::Cli::Base
5
5
  puts @config.to_yaml
6
6
  end
7
7
 
8
+ desc "delivery", "Deliver an issue to test environment"
9
+ def delivery
10
+ issue_id = PROMPT.ask("Please enter the Issue key...\n", required: true)
11
+
12
+ source_branch = development_branch(issue_id)
13
+
14
+ ask_repo_choices.each do |repo|
15
+ invoke "heal:cli:git:cherry-pick-pr", [issue_id, repo, source_branch, delivery_branch, issue_branch(issue_id)]
16
+ end
17
+ end
18
+
19
+ desc "release", "Release a Feature to a production ready branch"
20
+ def release
21
+ feature_id = PROMPT.ask("Enter the Feature key...\n", required: true)
22
+ feature_issues = PROMPT.ask("Enter all issues under the EPIC: JIRA-1,JIRA-2,...\n", required: true, convert: :array)
23
+
24
+ ask_repo_choices.each do |repo|
25
+ feature_issues.each do |issue_id|
26
+ invoke "heal:cli:git:cherry-pick-pr", [issue_id, repo, issue_branch(issue_id), release_branch, feature_branch(feature_id)]
27
+ end
28
+ end
29
+ end
30
+
8
31
  desc "git", "Manage Git workflows"
9
32
  subcommand "git", Heal::Cli::Git
10
33
 
34
+ private
35
+
36
+ def ask_repo_choices
37
+ choices = @config["git"]["repos"].map { |repo| { File.basename(repo) => repo } }
38
+ PROMPT.multi_select("Choose repositories:", choices, filter: true)
39
+ end
40
+
41
+ def development_branch(issue_id)
42
+ @config["git"]["branch"]["prefix"]["test"] + "/" + @config["git"]["branch"]["targets"]["development"] + "/" + issue_id
43
+ end
44
+
45
+ def delivery_branch
46
+ @config["git"]["branch"]["targets"]["test"]
47
+ end
48
+
49
+ def release_branch
50
+ @config["git"]["branch"]["targets"]["release"]
51
+ end
52
+
53
+ def issue_branch(issue_id)
54
+ @config["git"]["branch"]["prefix"]["test"] + "/" + delivery_branch + "/" + issue_id
55
+ end
56
+
57
+ def feature_branch(feature_id)
58
+ @config["git"]["branch"]["prefix"]["release"] + "/" + feature_id
59
+ end
60
+
11
61
  end
@@ -6,7 +6,9 @@ git:
6
6
  development: dev
7
7
  test: integration
8
8
  release: master
9
- prefix: issue
9
+ prefix:
10
+ test: issue
11
+ release: feature
10
12
  repos:
11
13
  - ~/Projects/enlighten_manager_mvc
12
14
  pr_link: https://bitbucket.org/enphaseembedded/%s/pull-requests/new?source=%s&dest=%s/
data/lib/heal/cli.rb CHANGED
@@ -3,4 +3,4 @@ require "tty-prompt"
3
3
  module Heal::Cli
4
4
  end
5
5
 
6
- PROMPT = TTY::Prompt.new
6
+ PROMPT = TTY::Prompt.new(interrupt: :exit)
data/lib/heal/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Heal
4
- VERSION = "0.0.1"
4
+ VERSION = "0.0.2"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: heal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jatin Goyal
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-11-16 00:00:00.000000000 Z
11
+ date: 2024-11-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor