Compare commits

..

212 Commits
0.0.2 ... 1.2.7

Author SHA1 Message Date
Petr Korolev
99d20bd8a9 Merge branch 'release/1.2.7' 2015-01-26 17:00:48 +02:00
Petr Korolev
f0e713d6ef Update gemspec to version 1.2.7 2015-01-26 17:00:45 +02:00
sue445
8dc50cf483 Add option: --compare-link 2015-01-26 17:00:36 +02:00
sue445
90c455ada4 regenerate CHANGELOG 2015-01-26 17:00:36 +02:00
sue445
088824aa05 Refactorings
* tweak indent
* rename variable name (tag_xxx -> newer_tag_xxx)
2015-01-26 17:00:36 +02:00
sue445
96977c8384 Add compare link between older version and newer version 2015-01-26 17:00:36 +02:00
Petr Korolev
1940974c4c Merge pull request #46 from sue445/feature/compare_link
Add compare link between older version and newer version
2015-01-26 16:58:34 +02:00
sue445
1fced7278e Add option: --compare-link 2015-01-26 21:30:27 +09:00
sue445
eb9bd59f26 regenerate CHANGELOG 2015-01-24 21:48:02 +09:00
sue445
41f43932e0 Refactorings
* tweak indent
* rename variable name (tag_xxx -> newer_tag_xxx)
2015-01-24 21:46:13 +09:00
sue445
4ba7bbcc90 Add compare link between older version and newer version 2015-01-24 21:44:12 +09:00
Petr Korolev
8505d340af Merge branch 'hotfix/update-changelog' into develop 2015-01-21 19:19:48 +01:00
Petr Korolev
f3c05bd01c Merge branch 'hotfix/update-changelog' 2015-01-21 19:19:48 +01:00
Petr Korolev
4bcf49175b Update changelog for version 1.2.6 2015-01-21 19:19:48 +01:00
Petr Korolev
6c28db6d4a Merge branch 'release/1.2.6' into develop 2015-01-21 19:19:24 +01:00
Petr Korolev
6f8aee6a4b Merge branch 'release/1.2.6' 2015-01-21 19:19:24 +01:00
Petr Korolev
3e3cc15592 Update gemspec to version 1.2.6 2015-01-21 19:19:23 +01:00
Petr Korolev
d5edb1f606 Update README.md 2015-01-21 19:19:18 +01:00
Petr Korolev
e6d0c3d791 Update README.md 2015-01-21 19:19:18 +01:00
sugamasao
c1d28d486f fix link tag format
Remove Extra Space.
2015-01-21 19:19:18 +01:00
Petr Korolev
fa713af816 Update README.md 2015-01-21 19:17:57 +01:00
Petr Korolev
17f7127de1 Update README.md 2015-01-21 19:14:31 +01:00
Petr Korolev
e1a264e2c9 Merge pull request #45 from sugamasao/fix/link-tag-format
fix link tag format
2015-01-21 19:13:13 +01:00
sugamasao
e4b79e75ca fix link tag format
Remove Extra Space.
2015-01-17 10:28:31 +09:00
Petr Korolev
c7a767451d Merge branch 'hotfix/update-changelog' into develop 2015-01-15 23:35:17 +01:00
Petr Korolev
01f44b8311 Merge branch 'hotfix/update-changelog' 2015-01-15 23:35:17 +01:00
Petr Korolev
c0015a2c22 Update changelog for version 1.2.5 2015-01-15 23:35:17 +01:00
Petr Korolev
49cb6589f7 Merge branch 'release/1.2.5' into develop 2015-01-15 23:34:48 +01:00
Petr Korolev
e139f839c9 Merge branch 'release/1.2.5' 2015-01-15 23:34:47 +01:00
Petr Korolev
a7a75a181e Update gemspec to version 1.2.5 2015-01-15 23:34:47 +01:00
Petr Korolev
6efa421816 Merge branch 'develop' 2015-01-15 23:30:00 +01:00
Petr Korolev
e8d59fe66a Merge branch 'master' into develop 2015-01-15 23:27:13 +01:00
Petr Korolev
6b5cf5ab2e Merge pull request #42 from glenlovett/enterprise_github
support enterprise github via command line options
2015-01-15 23:16:54 +01:00
Petr Korolev
de6763aa3a Merge pull request #43 from schwing/prettyprint
PrettyPrint class is included using lowercase 'pp'
2015-01-15 23:15:50 +01:00
John Schwinghammer
5f019482d2 PrettyPrint class is included using lowercase 'pp' 2015-01-14 13:56:44 -06:00
Petr Korolev
6da115c4b0 Fix #32 2014-12-22 15:51:45 +02:00
Petr Korolev
657ce0e838 add ability to disable milestones filtering 2014-12-22 15:41:20 +02:00
Petr Korolev
5304e4faf8 fix #22 2014-12-22 15:31:49 +02:00
Petr Korolev
e6bb728355 remove issues with other milstones 2014-12-22 15:14:01 +02:00
Petr Korolev
135c48a494 Merge branch 'glenlovett-enterprise_github' into develop 2014-12-22 14:27:40 +02:00
Lovett, Glen
6bad92e899 support enterprise github via command line options 2014-12-19 16:55:42 -05:00
Petr Korolev
ad4c20d8d8 Merge branch 'hotfix/update-changelog' 2014-12-16 17:53:18 +02:00
Petr Korolev
a5d9766aef Merge branch 'hotfix/update-changelog' into develop 2014-12-16 17:53:18 +02:00
Petr Korolev
a0cfaa66a2 Update changelog for version 1.2.4 2014-12-16 17:53:16 +02:00
Petr Korolev
d16f4f7cb5 Merge branch 'release/1.2.4' 2014-12-16 17:52:49 +02:00
Petr Korolev
1d6d6ab400 Merge branch 'release/1.2.4' into develop 2014-12-16 17:52:49 +02:00
Petr Korolev
5b07fc9614 Update gemspec to version 1.2.4 2014-12-16 17:52:47 +02:00
Petr Korolev
3437fbf278 fx 2014-12-16 17:43:24 +02:00
Petr Korolev
ba4db0e5f4 Merge branch 'hotfix/update-changelog' 2014-12-16 17:42:11 +02:00
Petr Korolev
abac1013f1 fx 2014-12-16 17:41:20 +02:00
Petr Korolev
28247edc7f Merge branch 'release/1.2.3' into develop 2014-12-16 17:25:12 +02:00
Petr Korolev
fcc1c608a2 Merge branch 'release/1.2.3' 2014-12-16 17:25:12 +02:00
Petr Korolev
46ae40f250 Update gemspec to version 1.2.3 2014-12-16 17:25:11 +02:00
Petr Korolev
00f98b8ca6 fix #30 2014-12-15 17:02:38 +02:00
Petr Korolev
5da838efee Merge branch 'feature/rails-crash' into develop 2014-12-15 17:02:11 +02:00
Petr Korolev
73b789ab82 fix 2014-12-15 16:23:30 +02:00
Petr Korolev
b5778b14a0 Revert "add rubymine files to gitignore"
This reverts commit 4488ac8cc6.
2014-12-15 15:55:48 +02:00
Petr Korolev
e29ff3c3a9 fix crash when user in NULL 2014-12-15 15:54:11 +02:00
Petr Korolev
9646b49add Merge branch 'feature/verboose-addition' into develop 2014-12-15 15:53:36 +02:00
Petr Korolev
a44b0bdd25 fix pagination issue + verboose. back to 30 per-pages 2014-12-15 15:53:02 +02:00
Petr Korolev
433d46d85b fx 2014-12-15 15:34:20 +02:00
Petr Korolev
950e8916d9 Merge branch 'feature/increase-per-page' into develop 2014-12-15 15:33:28 +02:00
Petr Korolev
87c6e33335 add verboose for issues 2014-12-15 15:24:46 +02:00
Petr Korolev
4488ac8cc6 add rubymine files to gitignore 2014-12-15 15:22:30 +02:00
Petr Korolev
c697c6be4a Increase per-page number of request + improve verbose mode (related with #33) 2014-12-15 15:19:56 +02:00
Petr Korolev
69dd5eadc2 implement async fetching tags 2014-12-15 14:15:39 +02:00
Petr Korolev
4ea1058cd5 fix #33 2014-12-12 16:55:26 +02:00
Petr Korolev
fcd78e6bc4 add parsing feature, fix #38 2014-12-11 18:11:08 +02:00
Petr Korolev
e6c0d49200 Merge branch 'master' into develop 2014-12-11 17:15:31 +02:00
Petr Korolev
0f5db97474 Update changelog for version 1.2.2 2014-12-10 14:08:59 +02:00
Petr Korolev
0901b38577 Update gemspec to version 1.2.2 2014-12-10 14:08:59 +02:00
Petr Korolev
2a24f49a83 improve script 2014-12-10 14:08:59 +02:00
Petr Korolev
2ad014d5c7 fix trimming for issues 2014-12-10 14:08:59 +02:00
Petr Korolev
188ba7e073 create class and implement encapsulation. This fix #34 2014-12-10 14:08:59 +02:00
Petr Korolev
6f53fe0a1d optimize script 2014-12-10 14:08:59 +02:00
Petr Korolev
2c7853cf9f Merge branch 'hotfix/update-changelog' into develop 2014-12-10 12:19:32 +02:00
Petr Korolev
6830ea49f2 Update changelog for version 1.2.2 2014-12-10 12:19:31 +02:00
Petr Korolev
5be1a2afaf Merge branch 'release/1.2.2' into develop 2014-12-10 12:18:58 +02:00
Petr Korolev
7be5021685 Merge branch 'release/1.2.2' 2014-12-10 12:18:58 +02:00
Petr Korolev
c3373b2343 Update gemspec to version 1.2.2 2014-12-10 12:18:56 +02:00
Petr Korolev
9aa156a02b improve script 2014-12-10 12:18:45 +02:00
Petr Korolev
68a8d8d2c8 fix trimming for issues 2014-12-10 12:18:45 +02:00
Petr Korolev
057fb488d5 create class and implement encapsulation. This fix #34 2014-12-10 12:18:45 +02:00
Petr Korolev
f1d9c839c7 optimize script 2014-12-10 12:18:44 +02:00
Petr Korolev
97d048d62f Merge branch 'develop' 2014-12-03 11:52:17 +02:00
Petr Korolev
7972ec0977 update yml 2014-12-03 11:51:59 +02:00
Petr Korolev
f55598825d Merge branch 'master' into develop 2014-12-03 11:43:00 +02:00
Petr Korolev
a678b52fe4 fc 2014-12-03 11:42:52 +02:00
Petr Korolev
aac04726ba Merge branch 'develop' 2014-12-03 11:42:02 +02:00
Petr Korolev
0c65035cde update readme 2014-12-03 11:40:54 +02:00
Petr Korolev
e038c7e680 Merge branch 'travis-update' into develop 2014-12-03 11:37:39 +02:00
Petr Korolev
bcecb4eb81 Revert "remove dep rake"
This reverts commit 326a067ac5.
2014-12-03 11:31:51 +02:00
Petr Korolev
52123885a1 add rakefile 2014-12-03 11:30:26 +02:00
Petr Korolev
326a067ac5 remove dep rake 2014-12-03 11:27:05 +02:00
Petr Korolev
5dcbef87d1 put back gem updates 2014-12-03 11:19:31 +02:00
Petr Korolev
caf264360b remove before install 2014-12-03 11:18:13 +02:00
Petr Korolev
bc13632545 add rake to gemfile 2014-12-03 11:09:11 +02:00
Petr Korolev
67b438f46b update gem 2014-12-02 18:09:18 +02:00
Petr Korolev
ff52291d2a Merge branch 'master' into travis-update
Conflicts:
	Gemfile
2014-12-02 18:03:55 +02:00
Petr Korolev
b2df1cfdcd Merge pull request #36 from bitdeli-chef/master
Add a Bitdeli Badge to README
2014-12-01 18:39:34 +02:00
Bitdeli Chef
f037a839ce Add a Bitdeli badge to README 2014-12-01 16:48:39 +00:00
Petr Korolev
5295389fcc update 2014-11-24 21:38:06 +02:00
Petr Korolev
8e5b4ed191 update 2014-11-24 21:37:10 +02:00
Petr Korolev
80cc3fc625 update parser 2014-11-24 21:33:03 +02:00
Petr Korolev
f087699d07 update readme 2014-11-24 21:20:46 +02:00
Petr Korolev
540df2ef51 UPdate changelog 2014-11-22 23:30:24 +02:00
Petr Korolev
54d029d8ea update readme 2014-11-22 23:18:17 +02:00
Petr Korolev
bec4fdef0e Update gemspec to version 1.2.1 2014-11-22 22:56:23 +02:00
Petr Korolev
b5d5615244 update readme 2014-11-21 10:59:12 +02:00
Petr Korolev
766569c27a update README 2014-11-19 22:16:41 +02:00
Petr Korolev
51e3c2ee54 Merge branch 'new-features' 2014-11-19 17:29:07 +02:00
Petr Korolev
e1e5de555b Issues for last tag not in list 2014-11-19 17:28:49 +02:00
Petr Korolev
0e4474bb2d Merge branch 'new-features' 2014-11-19 17:26:23 +02:00
Petr Korolev
fa4ccb7e9c gix bug in logic 2014-11-19 16:23:54 +02:00
Petr Korolev
36fbe509fa Merge branch 'new-features' 2014-11-19 15:59:39 +02:00
Petr Korolev
4c5ca562cf Disable default --filter-pull-requests option. 2014-11-19 15:58:14 +02:00
Petr Korolev
27432c3328 Merge branch 'new-features' 2014-11-19 15:49:42 +02:00
Petr Korolev
4a27872695 Update changelog for version 1.2.0 2014-11-19 15:49:22 +02:00
Petr Korolev
bf88bc0a0e Update gemspec to version 1.2.0 2014-11-19 15:48:32 +02:00
Petr Korolev
3b145bd7ed Merge branch 'filter-pull-requests' 2014-11-19 15:47:28 +02:00
Petr Korolev
97311bc5a0 add parse option --filter-pull-requests 2014-11-19 15:45:24 +02:00
Petr Korolev
bdc4657e2c add filter option 2014-11-19 15:04:10 +02:00
Petr Korolev
0c8a96aef8 update readme 2014-11-19 14:33:38 +02:00
Petr Korolev
c9462a6c9b Merge branch 'new-features' 2014-11-19 14:30:59 +02:00
Petr Korolev
0a43c25f8f Code refactoring 2014-11-19 14:30:18 +02:00
Petr Korolev
c58ec0dcbb Merge branch 'new-features' 2014-11-19 13:55:13 +02:00
Petr Korolev
7aa9b6ca47 Add ability to insert authors of pull-requests (--[no-]author option) 2014-11-19 13:53:36 +02:00
Petr Korolev
865a364dff pretty print for input options 2014-11-19 12:51:23 +02:00
Petr Korolev
062f3fd3f2 code cleanup 2014-11-19 12:43:55 +02:00
Petr Korolev
a4e9390283 Merge branch 'new-features' 2014-11-19 12:43:43 +02:00
Petr Korolev
09f5ac5d37 Don't receive issues in case of --no-isses flag specied 2014-11-19 12:42:23 +02:00
Petr Korolev
aed5c37559 Update changelog for version 1.1.4 2014-11-18 15:50:21 +02:00
Petr Korolev
9f9f237e96 Update gemspec to version 1.1.4 2014-11-18 15:48:27 +02:00
Petr Korolev
3e1abf928d remove dependency 2014-11-18 15:48:00 +02:00
Petr Korolev
7ce486085b Update changelog for version 1.1.3 2014-11-18 15:28:06 +02:00
Petr Korolev
bf17d9e284 Update gemspec to version 1.1.3 2014-11-18 15:27:43 +02:00
Petr Korolev
fadae1b714 remove httpparty from gem 2014-11-18 15:20:57 +02:00
Petr Korolev
a5cb604bc1 fix 2014-11-18 10:21:35 +02:00
Petr Korolev
7f89aae72e update gemspec 2014-11-18 10:17:01 +02:00
Petr Korolev
b6ec9bd8be update gemspec file 2014-11-17 18:14:44 +02:00
Petr Korolev
80de58779d Merge branch 'new-features' 2014-11-17 17:54:25 +02:00
Petr Korolev
07e0ec0cfb Move version to separate file 2014-11-17 17:54:13 +02:00
Petr Korolev
fab1e28e3e Merge branch 'new-features' 2014-11-17 17:54:02 +02:00
Petr Korolev
0ab44f79f7 Sort tag by date, not by name 2014-11-17 17:43:37 +02:00
Petr Korolev
269ab4e790 Merge branch 'new-features' 2014-11-17 16:55:25 +02:00
Petr Korolev
4fa903b5cd fix for #20 2014-11-17 16:53:47 +02:00
Petr Korolev
c018bf2db5 Merge branch 'new-features' 2014-11-13 09:35:31 +02:00
Petr Korolev
c830d6c1ef update readme 2014-11-13 09:22:32 +02:00
Petr Korolev
03bca478c8 Add token support, resolved #19.
Use CHANGELOG_GITHUB_TOKEN variable to specify token in the shell.
2014-11-13 09:09:12 +02:00
Petr Korolev
91229c7472 cleanup 2014-11-12 17:23:16 +02:00
Petr Korolev
7bd174126b fix date in gems 2014-11-12 11:19:11 +02:00
Petr Korolev
4b716645e5 update changelog 2014-11-12 11:19:04 +02:00
Petr Korolev
7b44c4aa78 Update to version 1.1.2 2014-11-12 11:06:21 +02:00
Petr Korolev
95bdd60c34 Merge branch 'new-features' 2014-11-12 11:06:01 +02:00
Petr Korolev
1357b3980d Fix bug with auto-detect project name, when there is dot signs in project name
add fix for username also
2014-11-12 11:05:03 +02:00
Petr Korolev
a5c4899360 add travis configs 2014-11-12 11:03:46 +02:00
Petr Korolev
b30587ce14 update 2014-11-11 18:07:52 +02:00
Petr Korolev
18e0f937ea typo in readme 2014-11-11 11:07:59 +02:00
Petr Korolev
1af8e18f9f update 2014-11-11 11:00:34 +02:00
Petr Korolev
a458a1e378 update readme 2014-11-11 10:58:56 +02:00
Petr Korolev
bc3af7fa93 update changelog 2014-11-10 17:06:40 +02:00
Petr Korolev
6682ffe452 Update to version 1.1.1 2014-11-10 17:04:02 +02:00
Petr Korolev
dbc7b3e567 update changelog 2014-11-10 17:02:01 +02:00
Petr Korolev
a96f74208c Merge branch 'new-features' 2014-11-10 17:01:57 +02:00
Petr Korolev
cdc009b4ad Remove duplicates of issues and pull-requests with same number 2014-11-10 17:00:48 +02:00
Petr Korolev
0046f344a9 Merge branch 'new-features' 2014-11-10 16:18:39 +02:00
Petr Korolev
1b792bc67b update changelog 2014-11-10 16:17:56 +02:00
Petr Korolev
f0716771b5 Sort issues by tags 2014-11-10 16:17:43 +02:00
Petr Korolev
50dd7b2ed6 update changelog 2014-11-10 16:03:01 +02:00
Petr Korolev
3797b3ac31 Merge branch 'new-features' 2014-11-10 15:38:48 +02:00
Petr Korolev
f08685b015 Add ability to add ot exclude issues wothout any labels 2014-11-10 15:37:43 +02:00
Petr Korolev
fc96007741 update changelog 2014-11-10 15:12:42 +02:00
Petr Korolev
7e2826e3b8 Update to version 1.1.0 2014-11-10 14:45:39 +02:00
Petr Korolev
c55881bdfa Merge branch 'new-features' 2014-11-10 14:45:15 +02:00
Petr Korolev
f6f9facc71 add changelog in lib to gitignore 2014-11-10 14:44:19 +02:00
Petr Korolev
807bacd95a formatting 2014-11-10 14:41:36 +02:00
Petr Korolev
936b191566 Fix bug with wrong credentials in 1.0.1 (fixed #12) 2014-11-10 14:40:10 +02:00
Petr Korolev
a33b52d6d0 typo fix 2014-11-10 14:39:31 +02:00
Petr Korolev
337c9a7d59 add option that close #11 2014-11-10 14:36:27 +02:00
Petr Korolev
8247fd8520 Merge branch 'new-features' 2014-11-10 14:15:53 +02:00
Petr Korolev
223cd2640c Merge remote-tracking branch 'origin/new-features' into new-features
Conflicts:
	lib/github_changelog_generator.rb

	Fix #9
2014-11-10 14:15:14 +02:00
Petr Korolev
459b0ec7ec Update to version 1.0.1 2014-11-10 13:36:15 +02:00
Petr Korolev
ea1c5c1f6d gem checks 2014-11-10 13:35:20 +02:00
Petr Korolev
86512d3606 impement revert option 2014-11-10 13:27:14 +02:00
Petr Korolev
b908b07e0a implement bump file 2014-11-10 13:11:35 +02:00
Petr Korolev
737774a164 implement find spec logic 2014-11-10 10:08:32 +02:00
Petr Korolev
62d9b7f4a6 rename 2014-11-10 09:21:02 +02:00
Petr Korolev
e75e358ef8 add bump script 2014-11-10 09:10:39 +02:00
Petr Korolev
3ac83e9ea7 Merge branch 'new-features' 2014-11-10 09:02:35 +02:00
Petr Korolev
70d3f63e89 fix for # 10 2014-11-10 09:02:11 +02:00
Petr Korolev
2db69dd27c small fix 2014-11-07 18:37:10 +02:00
Petr Korolev
5a7589f8ca update changelog 2014-11-07 18:35:59 +02:00
Petr Korolev
1adcd9918c update readme 2014-11-07 18:32:28 +02:00
Petr Korolev
afea098355 Bump major verion 2014-11-07 18:29:42 +02:00
Petr Korolev
d3c3b7850f Merge branch 'new-features' 2014-11-07 18:28:29 +02:00
Petr Korolev
502ae431b7 fix typo! 2014-11-07 18:24:02 +02:00
Petr Korolev
5882762800 tst cm 2014-11-07 18:14:56 +02:00
Petr Korolev
606fab4289 update Text for issues. (depends of what label placed) 2014-11-07 18:14:26 +02:00
Petr Korolev
3d25d1135f Merge branch 'new-features' 2014-11-07 18:00:08 +02:00
Petr Korolev
acd2daada3 Remove delimeter and fix parser. This final commit should close #6 enchantment! Yay! 2014-11-07 17:57:32 +02:00
Petr Korolev
381ffeb261 add support for issues 2014-11-07 17:47:42 +02:00
Petr Korolev
f9e6a076bc implement "issues" parsing + check for merged requests 2014-11-07 17:05:01 +02:00
Petr Korolev
8457b764bf update readme and bump gem 2014-11-07 13:52:23 +02:00
Petr Korolev
4237b751a0 clean gitignore file 2014-11-07 13:21:54 +02:00
Petr Korolev
3a78f97d61 add changelog file 2014-11-07 13:20:19 +02:00
Petr Korolev
24c5f66c65 Merge branch 'new-features' 2014-11-07 13:14:48 +02:00
Petr Korolev
9c4b68f779 Fix parsing bug 2014-11-07 12:53:24 +02:00
Petr Korolev
65e978f4a8 update readme 2014-11-07 12:00:01 +02:00
Petr Korolev
6b4333f98a Merge branch 'new-features' 2014-11-07 11:45:40 +02:00
Petr Korolev
675601880d Add changelog generation for last tag 2014-11-07 11:45:01 +02:00
Petr Korolev
e2aac3cb2c Merge branch 'new-features' 2014-11-07 11:29:36 +02:00
Petr Korolev
20095c571d add option for output file, update readme 2014-11-07 11:25:09 +02:00
14 changed files with 1061 additions and 267 deletions

3
.gitignore vendored
View File

@@ -1,2 +1 @@
constants.rb /lib/CHANGELOG.md
*.md

15
.travis.yml Normal file
View File

@@ -0,0 +1,15 @@
language: ruby
before_install:
- gem update --system
- gem --version
rvm:
- 2.1.0
gemfile:
- Gemfile
notifications:
email:
recipients:
- sky4winder+githubchangeloggenerator@gmail.com
on_success: never # [always|never|change]
on_failure: change # [always|never|change]

128
CHANGELOG.md Normal file
View File

@@ -0,0 +1,128 @@
# Changelog
## [1.2.6](https://github.com/skywinder/Github-Changelog-Generator/tree/1.2.6)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.2.5...1.2.6)
#### 21/01/15
- *Merged pull-request:* fix link tag format [\#45](https://github.com/skywinder/Github-Changelog-Generator/pull/45) ([sugamasao](https://github.com/sugamasao))
## [1.2.5](https://github.com/skywinder/Github-Changelog-Generator/tree/1.2.5)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.2.4...1.2.5)
#### 15/01/15
- *Merged pull-request:* PrettyPrint class is included using lowercase 'pp' [\#43](https://github.com/skywinder/Github-Changelog-Generator/pull/43) ([schwing](https://github.com/schwing))
- *Merged pull-request:* support enterprise github via command line options [\#42](https://github.com/skywinder/Github-Changelog-Generator/pull/42) ([glenlovett](https://github.com/glenlovett))
- *Implemented enhancement:* Use milestone to specify in which version bug was fixed [\#22](https://github.com/skywinder/Github-Changelog-Generator/issues/22)
- *Fixed bug:* Error when trying to generate log for repo without tags [\#32](https://github.com/skywinder/Github-Changelog-Generator/issues/32)
## [1.2.4](https://github.com/skywinder/Github-Changelog-Generator/tree/1.2.4)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.2.3...1.2.4)
#### 16/12/14
- *Merged pull-request:* Fix crash when user is NULL [\#40](https://github.com/skywinder/Github-Changelog-Generator/pull/40) ([skywinder](https://github.com/skywinder))
- *Merged pull-request:* Implement async fetching [\#39](https://github.com/skywinder/Github-Changelog-Generator/pull/39) ([skywinder](https://github.com/skywinder))
- *Implemented enhancement:* Add ability to run with one parameter instead -u -p [\#38](https://github.com/skywinder/Github-Changelog-Generator/issues/38)
- *Implemented enhancement:* Detailed output [\#33](https://github.com/skywinder/Github-Changelog-Generator/issues/33)
- *Fixed bug:* Docs lacking or basic behavior not as advertised [\#30](https://github.com/skywinder/Github-Changelog-Generator/issues/30)
- *Fixed bug:* Crash when try generate log for rails [\#35](https://github.com/skywinder/Github-Changelog-Generator/issues/35)
## [1.2.3](https://github.com/skywinder/Github-Changelog-Generator/tree/1.2.3)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.2.2...1.2.3)
#### 16/12/14
## [1.2.2](https://github.com/skywinder/Github-Changelog-Generator/tree/1.2.2)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.2.1...1.2.2)
#### 10/12/14
- *Merged pull-request:* Add a Bitdeli Badge to README [\#36](https://github.com/skywinder/Github-Changelog-Generator/pull/36) ([bitdeli-chef](https://github.com/bitdeli-chef))
- *Fixed bug:* Encapsulate \[ \> \* \_ \ \] signs in issues names [\#34](https://github.com/skywinder/Github-Changelog-Generator/issues/34)
## [1.2.1](https://github.com/skywinder/Github-Changelog-Generator/tree/1.2.1)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.2.0...1.2.1)
#### 22/11/14
- *Merged pull-request:* Issues for last tag not in list [\#29](https://github.com/skywinder/Github-Changelog-Generator/pull/29) ([skywinder](https://github.com/skywinder))
- *Merged pull-request:* Disable default --filter-pull-requests option. [\#28](https://github.com/skywinder/Github-Changelog-Generator/pull/28) ([skywinder](https://github.com/skywinder))
- *Fixed bug:* Script fills changelog only for first 30 tags. [\#20](https://github.com/skywinder/Github-Changelog-Generator/issues/20)
## [1.2.0](https://github.com/skywinder/Github-Changelog-Generator/tree/1.2.0)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.1.4...1.2.0)
#### 19/11/14
- *Merged pull-request:* Add filter for pull-requests labels. \(option --filter-pull-requests\) [\#27](https://github.com/skywinder/Github-Changelog-Generator/pull/27) ([skywinder](https://github.com/skywinder))
- *Merged pull-request:* Test Pull-Request SHOULD NOT APPEAR IN LOG! [\#26](https://github.com/skywinder/Github-Changelog-Generator/pull/26) ([skywinder](https://github.com/skywinder))
- *Merged pull-request:* Add ability to insert authors of pull-requests \(--\[no-\]author option\) [\#25](https://github.com/skywinder/Github-Changelog-Generator/pull/25) ([skywinder](https://github.com/skywinder))
- *Merged pull-request:* Don't receive issues in case of --no-isses flag specied [\#24](https://github.com/skywinder/Github-Changelog-Generator/pull/24) ([skywinder](https://github.com/skywinder))
## [1.1.4](https://github.com/skywinder/Github-Changelog-Generator/tree/1.1.4)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.1.2...1.1.4)
#### 18/11/14
- *Merged pull-request:* Sort tags by date [\#23](https://github.com/skywinder/Github-Changelog-Generator/pull/23) ([skywinder](https://github.com/skywinder))
- *Implemented enhancement:* Implement ability to retrieve GitHub token from ENV variable \(to not put it to script directly\) [\#19](https://github.com/skywinder/Github-Changelog-Generator/issues/19)
## [1.1.2](https://github.com/skywinder/Github-Changelog-Generator/tree/1.1.2)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.1.1...1.1.2)
#### 12/11/14
- *Merged pull-request:* Fix bug with dot signs in project name [\#18](https://github.com/skywinder/Github-Changelog-Generator/pull/18) ([skywinder](https://github.com/skywinder))
- *Merged pull-request:* Fix bug with dot signs in user name [\#17](https://github.com/skywinder/Github-Changelog-Generator/pull/17) ([skywinder](https://github.com/skywinder))
## [1.1.1](https://github.com/skywinder/Github-Changelog-Generator/tree/1.1.1)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.1.0...1.1.1)
#### 10/11/14
- *Merged pull-request:* Remove duplicates of issues and pull-requests with same number [\#15](https://github.com/skywinder/Github-Changelog-Generator/pull/15) ([skywinder](https://github.com/skywinder))
- *Merged pull-request:* Sort issues by tags [\#14](https://github.com/skywinder/Github-Changelog-Generator/pull/14) ([skywinder](https://github.com/skywinder))
- *Merged pull-request:* Add ability to add or exclude issues without any labels [\#13](https://github.com/skywinder/Github-Changelog-Generator/pull/13) ([skywinder](https://github.com/skywinder))
## [1.1.0](https://github.com/skywinder/Github-Changelog-Generator/tree/1.1.0)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.0.1...1.1.0)
#### 10/11/14
- *Implemented enhancement:* Detect username and project form origin [\#11](https://github.com/skywinder/Github-Changelog-Generator/issues/11)
- *Fixed bug:* Markdown formating in the last line wrong [\#9](https://github.com/skywinder/Github-Changelog-Generator/issues/9)
- *Fixed bug:* Bug with wrong credentials in 1.0.1 [\#12](https://github.com/skywinder/Github-Changelog-Generator/issues/12)
## [1.0.1](https://github.com/skywinder/Github-Changelog-Generator/tree/1.0.1)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.0.0...1.0.1)
#### 10/11/14
- *Merged pull-request:* Implement support of different tags. [\#8](https://github.com/skywinder/Github-Changelog-Generator/pull/8) ([skywinder](https://github.com/skywinder))
## [1.0.0](https://github.com/skywinder/Github-Changelog-Generator/tree/1.0.0)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/0.1.0...1.0.0)
#### 07/11/14
- *Merged pull-request:* Add support for issues in CHANGELOG [\#7](https://github.com/skywinder/Github-Changelog-Generator/pull/7) ([skywinder](https://github.com/skywinder))
- *Merged pull-request:* Fix parsing date of pull request [\#3](https://github.com/skywinder/Github-Changelog-Generator/pull/3) ([skywinder](https://github.com/skywinder))
- *Implemented enhancement:* Implement option to specify output filename [\#4](https://github.com/skywinder/Github-Changelog-Generator/issues/4)
- *Implemented enhancement:* Add support for fixed issues and implemented enchanments. [\#6](https://github.com/skywinder/Github-Changelog-Generator/issues/6)
- *Fixed bug:* Last tag not appeared in changelog [\#5](https://github.com/skywinder/Github-Changelog-Generator/issues/5)
## [0.1.0](https://github.com/skywinder/Github-Changelog-Generator/tree/0.1.0)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/0.0.2...0.1.0)
#### 07/11/14
- *Merged pull-request:* Add changelog generation for last tag [\#2](https://github.com/skywinder/Github-Changelog-Generator/pull/2) ([skywinder](https://github.com/skywinder))
- *Merged pull-request:* Add option \(-o --output\) to specify name of the output file. [\#1](https://github.com/skywinder/Github-Changelog-Generator/pull/1) ([skywinder](https://github.com/skywinder))
## [0.0.2](https://github.com/skywinder/Github-Changelog-Generator/tree/0.0.2)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/0.0.1...0.0.2)
#### 06/11/14
## [0.0.1](https://github.com/skywinder/Github-Changelog-Generator/tree/0.0.1)
#### 06/11/14
\* *This changelog was generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*

View File

@@ -1,3 +1,4 @@
source 'https://rubygems.org' source 'https://rubygems.org'
gem 'github_api' gem 'github_api'
gem 'httparty' gem 'colorize'
gem 'rake'

View File

@@ -2,6 +2,7 @@ GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
addressable (2.3.6) addressable (2.3.6)
colorize (0.7.4)
descendants_tracker (0.0.4) descendants_tracker (0.0.4)
thread_safe (~> 0.3, >= 0.3.1) thread_safe (~> 0.3, >= 0.3.1)
faraday (0.9.0) faraday (0.9.0)
@@ -14,17 +15,13 @@ GEM
multi_json (>= 1.7.5, < 2.0) multi_json (>= 1.7.5, < 2.0)
nokogiri (~> 1.6.3) nokogiri (~> 1.6.3)
oauth2 oauth2
hashie (3.3.1) hashie (3.3.2)
httparty (0.13.2) jwt (1.2.0)
json (~> 1.8)
multi_xml (>= 0.5.2)
json (1.8.1)
jwt (1.0.0)
mini_portile (0.6.1) mini_portile (0.6.1)
multi_json (1.10.1) multi_json (1.10.1)
multi_xml (0.5.5) multi_xml (0.5.5)
multipart-post (2.0.0) multipart-post (2.0.0)
nokogiri (1.6.4) nokogiri (1.6.5)
mini_portile (~> 0.6.0) mini_portile (~> 0.6.0)
oauth2 (1.0.0) oauth2 (1.0.0)
faraday (>= 0.8, < 0.10) faraday (>= 0.8, < 0.10)
@@ -33,11 +30,13 @@ GEM
multi_xml (~> 0.5) multi_xml (~> 0.5)
rack (~> 1.2) rack (~> 1.2)
rack (1.5.2) rack (1.5.2)
rake (10.4.2)
thread_safe (0.3.4) thread_safe (0.3.4)
PLATFORMS PLATFORMS
ruby ruby
DEPENDENCIES DEPENDENCIES
colorize
github_api github_api
httparty rake

View File

@@ -1,46 +1,89 @@
Github Changelog Generator GitHub Changelog Generator
================== ==================
[![Gem Version](https://badge.fury.io/rb/github_changelog_generator.svg)](http://badge.fury.io/rb/github_changelog_generator) [![Gem Version](https://badge.fury.io/rb/github_changelog_generator.svg)](http://badge.fury.io/rb/github_changelog_generator)
[![Build Status](https://travis-ci.org/skywinder/Github-Changelog-Generator.svg?branch=master)](https://travis-ci.org/skywinder/Github-Changelog-Generator)
Changelog generation has never been so easy.
This script automatically generate change-log from your tags and merged pull-requests. This script automatically generate change-log from your tags and merged pull-requests.
## Installation: ## Installation:
`gem install github_changelog_generator` You're almost done!
## Usage: [sudo] gem install github_changelog_generator
### Example usage: ## Usage
`github_changelog_generator -u github-username -p github-project` **It's really simple**:
In output you will get `[your_project]_CHANGELOG.md` file with *pretty Markdown-formatted* changelogs in your current directory. - If your **git remote** `origin` refer to your GitHub repo, then just go to your project folder and run:
github_changelog_generator
- or from anywhere:
github_changelog_generator -u github_username -p github_project
As output you will get `CHANGELOG.md` file with pretty *Markdown-formatted* changelog.
### Params: ### Params:
github_changelog_generator -u user_name -p project_name [-t 16-digit-GitHubToken] [options] Type `github_changelog_generator --help` for detailed usage.
-u, --user [USER] your username on GitHub
-p, --project [PROJECT] name of project on GitHub Usage: changelog_generator [options]
-t, --token [TOKEN] To make more than 50 requests this app required your OAuth token for GitHub. You can generate it on https://github.com/settings/applications -u, --user [USER] Username of the owner of target GitHub repo
-h, --help Displays Help -p, --project [PROJECT] Name of project on GitHub
-v, --[no-]verbose Run verbosely -t, --token [TOKEN] To make more than 50 requests this script required your OAuth token for GitHub. You can generate here: https://github.com/settings/tokens/new
-l, --last-changes generate log between last 2 tags -h, --help Displays Help
-f, --date-format [FORMAT] date format. default is %d/%m/%y --[no-]verbose Run verbosely. Default is true
--[no-]issues Include closed issues to changelog. Default is true
--[no-]issues-without-labels Include closed issues without any labels to changelog. Default is true
--[no-]pull-requests Include pull-requests to changelog. Default is true
-l, --last-changes Generate log between last 2 tags only
--[no-]author Add author of pull-request in the end. Default is true
-f, --date-format [FORMAT] Date format. Default is %d/%m/%y
-o, --output [NAME] Output file. Default is CHANGELOG.md
--labels x,y,z List of labels. Issues with that labels will be included to changelog. Default is 'bug,enhancement'
-v, --version Print version number
## Real examples: ### GitHub token
### [This changelog](https://github.com/skywinder/ActionSheetPicker-3.0/blob/master/CHANGELOG.md) was generated by
`github_changelog_generator -u skywinder -p ActionSheetPicker-3.0`: [ActionSheetPicker-3.0/CHANGELOG.md](https://github.com/skywinder/ActionSheetPicker-3.0/blob/master/CHANGELOG.md)
## FAQ Since GitHub allow to make only 50 requests without authentication it's recommended to run this script with token
Since GitHub allow to make only 50 requests without authentication it's recommended to run this scrip with key `-t [your 16 digit token]` that you can easily **[generate here](https://github.com/settings/applications)**.
**You can easily [generate it here](https://github.com/settings/applications)**.
And:
- Run with key `-t [your-16-digit-token]`
- Or set environment variable `CHANGELOG_GITHUB_TOKEN` and specify there your token.
i.e. add to your `~/.bash_profile` or `~/.zshrc` or any other place to load ENV variables string :
export CHANGELOG_GITHUB_TOKEN="your-40-digit-github-token"
So, if you got error like this: So, if you got error like this:
>! /Library/Ruby/Gems/2.0.0/gems/github_api-0.12.2/lib/github_api/response/raise_error.rb:14:in `on_complete': GET https://api.github.com/repos/skywinder/ActionSheetPicker-3.0/git/commits/89678f7d7f66873c858e6cb07bf697192aca6768: 403 API rate limit exceeded for 195.88.177.9. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.) (Github::Error::Forbidden) >! /Library/Ruby/Gems/2.0.0/gems/github_api-0.12.2/lib/github_api/response/raise_error.rb:14:in `on_complete'
Then you have to generate this token or wait for 1 hour It's time to create this token or wait for 1 hour before GitHub reset the counter for your IP.
## License ## Examples:
Github Changelog Generator is released under the [MIT License](http://www.opensource.org/licenses/MIT). - Look at **[CHANGELOG.md](https://github.com/skywinder/Github-Changelog-Generator/blob/master/CHANGELOG.md)** for **this** project
- [ActionSheetPicker-3.0/CHANGELOG.md](https://github.com/skywinder/ActionSheetPicker-3.0/blob/master/CHANGELOG.md) was generated by command:
github_changelog_generator -u skywinder -p ActionSheetPicker-3.0
## Projects using this library
[Wikipage with list of projects](https://github.com/skywinder/Github-Changelog-Generator/wiki/Projects-using-Github-Changelog-Generator)
*If you are using `github_changelog_generator` for generation chamgelog in your project or know of project that uses it, please add it to [this] (https://github.com/skywinder/Github-Changelog-Generator/wiki/Projects-using-Github-Changelog-Generator) list.*
## Am I missed some essential feature?
**Nothing is impossible!** Open an [issue](https://github.com/skywinder/Github-Changelog-Generator/issues/new) and let's make generator better together!
*Bug reports, feature requests, patches, well-wishes are always welcome!*
## Contributing ## Contributing
@@ -51,6 +94,10 @@ Github Changelog Generator is released under the [MIT License](http://www.openso
5. Push to the branch (`git push origin my-new-feature`) 5. Push to the branch (`git push origin my-new-feature`)
6. Create a new Pull Request 6. Create a new Pull Request
**Bug reports, feature requests, patches, well-wishes, and rap demo tapes are always welcome!** ## License
Github Changelog Generator is released under the [MIT License](http://www.opensource.org/licenses/MIT).
[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/skywinder/github-changelog-generator/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
*Improvements more than welcome - they are kindly requested! :)*

9
Rakefile Normal file
View File

@@ -0,0 +1,9 @@
require "rake/testtask"
task :default => [:test]
Rake::TestTask.new do |t|
t.verbose = true
t.libs.push("demo", "test")
t.pattern = "test/**/*_test.rb"
end

View File

@@ -1,5 +1,4 @@
#!/usr/bin/env ruby #! /usr/bin/env ruby
require 'github_changelog_generator' require 'github_changelog_generator'
GitHubChangelogGenerator::ChangelogGenerator.new.compund_changelog
ChangelogGenerator.new.compund_changelog

227
bump_gemfile.rb Executable file
View File

@@ -0,0 +1,227 @@
#!/usr/bin/env ruby
require 'optparse'
SPEC_TYPE = 'gemspec'
:major
:minor
:patch
@options = {:dry_run => false, :bump_number => :patch}
OptionParser.new { |opts|
opts.banner = 'Usage: bump.rb [options]'
opts.on('-d', '--dry-run', 'Dry run') do |v|
@options[:dry_run] = v
end
opts.on('-a', '--major', 'Bump major version') do |v|
@options[:bump_number] = :major
end
opts.on('-m', '--minor', 'Bump minor version') do |v|
@options[:bump_number] = :minor
end
opts.on('-p', '--patch', 'Bump patch version') do |v|
@options[:bump_number] = :patch
end
opts.on('-r', '--revert', 'Revert last bump') do |v|
@options[:revert] = v
end
}.parse!
p @options
def check_repo_is_clean_or_dry_run
value =%x[#{'git status --porcelain'}]
if value.empty?
puts 'Repo is clean -> continue'
else
if @options[:dry_run]
puts 'Repo not clean, "Dry run" enabled -> continue'
else
puts 'Repository not clean -> exit'
exit
end
end
end
def find_spec_file
list_of_specs = execute_line("find . -name '*.#{SPEC_TYPE}'")
arr = list_of_specs.split("\n")
spec_file = ''
case arr.count
when 0
puts "No #{SPEC_TYPE} files found. -> Exit."
exit
when 1
spec_file = arr[0]
else
puts 'Which spec should be used?'
arr.each_with_index { |file, index| puts "#{index+1}. #{file}" }
input_index = Integer(gets.chomp)
spec_file = arr[input_index-1]
end
if spec_file == nil
puts "Can't find specified spec file -> exit"
exit
end
spec_file.sub('./', '')
end
def find_current_gem_file
list_of_specs = execute_line("find . -name '*.gem'")
arr = list_of_specs.split("\n")
spec_file = ''
case arr.count
when 0
puts "No #{SPEC_TYPE} files found. -> Exit."
exit
when 1
spec_file = arr[0]
else
puts 'Which spec should be used?'
arr.each_with_index { |file, index| puts "#{index+1}. #{file}" }
input_index = Integer(gets.chomp)
spec_file = arr[input_index-1]
end
if spec_file == nil
puts "Can't find specified spec file -> exit"
exit
end
spec_file.sub('./', '')
end
def find_version_in_podspec(podspec)
readme = File.read(podspec)
#try to find version in format 1.22.333
re = /(\d+)\.(\d+)\.(\d+)/m
match_result = re.match(readme)
unless match_result
puts 'Not found any versions'
exit
end
puts "Found version #{match_result[0]}"
return match_result[0], match_result.captures
end
def bump_version(versions_array)
bumped_result = versions_array.dup
bumped_result.map! { |x| x.to_i }
case @options[:bump_number]
when :major
bumped_result[0] += 1
bumped_result[1] = 0
bumped_result[2] = 0
when :minor
bumped_result[1] += 1
bumped_result[2] = 0
when :patch
bumped_result[2] += 1
else
raise('unknown bump_number')
end
bumped_version = bumped_result.join('.')
puts "Bump version: #{versions_array.join('.')} -> #{bumped_version}"
bumped_version
end
def execute_line(line)
output = `#{line}`
check_exit_status(output)
output
end
def execute_line_if_not_dry_run(line)
if @options[:dry_run]
puts "Dry run: #{line}"
nil
else
puts line
value = %x[#{line}]
puts value
check_exit_status(value)
value
end
end
def check_exit_status(output)
if $?.exitstatus != 0
puts "Output:\n#{output}\nExit status = #{$?.exitstatus} ->Terminate script."
exit
end
end
def run_bumping_script
check_repo_is_clean_or_dry_run
spec_file = find_spec_file
result, versions_array = find_version_in_podspec(spec_file)
bumped_version = bump_version(versions_array)
unless @options[:dry_run]
puts 'Are you sure? Press Y to continue:'
str = gets.chomp
if str != 'Y'
puts '-> exit'
exit
end
end
execute_line_if_not_dry_run("sed -i \"\" \"s/#{result}/#{bumped_version}/\" README.md")
execute_line_if_not_dry_run("sed -i \"\" \"s/#{result}/#{bumped_version}/\" #{spec_file}")
execute_line_if_not_dry_run("git commit --all -m \"Update #{$SPEC_TYPE} to version #{bumped_version}\"")
execute_line_if_not_dry_run("git tag #{bumped_version}")
execute_line_if_not_dry_run('git push')
execute_line_if_not_dry_run('git push --tags')
execute_line_if_not_dry_run("gem build #{spec_file}")
gem = find_current_gem_file
execute_line_if_not_dry_run("gem push #{gem}")
# execute_line_if_not_dry_run("pod trunk push #{spec_file}")
end
def revert_last_bump
spec_file = find_spec_file
result, _ = find_version_in_podspec(spec_file)
puts "DELETE tag #{result} and HARD reset HEAD~1?\nPress Y to continue:"
str = gets.chomp
if str != 'Y'
puts '-> exit'
exit
end
execute_line_if_not_dry_run("git tag -d #{result}")
execute_line_if_not_dry_run('git reset --hard HEAD~1')
execute_line_if_not_dry_run("git push --delete origin #{result}")
end
if __FILE__ == $0
if @options[:revert]
revert_last_bump
else
run_bumping_script
end
end

View File

@@ -1,21 +1,32 @@
Gem::Specification.new do |s| # coding: utf-8
s.name = "github_changelog_generator"
s.version = "0.0.2"
s.default_executable = "github_changelog_generator"
s.required_ruby_version = '>= 1.9.3' lib = File.expand_path('../lib', __FILE__)
s.authors = ["Petr Korolev"] $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
s.date = %q{2014-10-10} require 'github_changelog_generator/version'
s.description = %q{Script, that automatically generate change-log from your tags and pull-requests}
s.email = %q{sky4winder+github_changelog_generator@gmail.com}
s.files = ["lib/github_changelog_generator.rb", "lib/github_changelog_generator/parser.rb", "bin/github_changelog_generator"]
s.homepage = %q{https://github.com/skywinder/Github-Changelog-Generator}
s.require_paths = ["lib"]
s.rubygems_version = %q{1.6.2}
s.summary = %q{Script, that automatically generate change-log from your tags and pull-requests.}
s.license = "MIT"
s.add_runtime_dependency(%q<httparty>, ["~> 0.13"])
s.add_runtime_dependency(%q<github_api>, ["~> 0.12"])
s.executables = %w(github_changelog_generator) Gem::Specification.new do |spec|
end spec.name = "github_changelog_generator"
spec.version = GitHubChangelogGenerator::VERSION
spec.default_executable = "github_changelog_generator"
spec.required_ruby_version = '>= 1.9.3'
spec.authors = ["Petr Korolev"]
spec.email = %q{sky4winder+github_changelog_generator@gmail.com}
spec.date = `date +"%Y-%m-%d"`.strip!
spec.summary = %q{Script, that automatically generate change-log from your tags and pull-requests.}
spec.description = %q{Script, that automatically generate change-log from your tags and pull-requests}
spec.homepage = %q{https://github.com/skywinder/Github-Changelog-Generator}
spec.license = "MIT"
spec.files = `git ls-files -z`.split("\x0")
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
spec.require_paths = ["lib"]
spec.add_development_dependency "bundler", "~> 1.7"
spec.add_development_dependency "rake", "~> 10.0"
spec.add_runtime_dependency(%q<github_api>, ["~> 0.12"])
spec.add_runtime_dependency(%q<colorize>, ["~> 0.7"])
end

View File

@@ -2,205 +2,468 @@
require 'github_api' require 'github_api'
require 'json' require 'json'
require 'httparty' require 'colorize'
require 'benchmark'
require_relative 'github_changelog_generator/parser' require_relative 'github_changelog_generator/parser'
require_relative 'github_changelog_generator/generator'
require_relative 'github_changelog_generator/version'
module GitHubChangelogGenerator
class ChangelogGenerator
class ChangelogGenerator attr_accessor :options, :all_tags, :github
attr_accessor :options, :all_tags PER_PAGE_NUMBER = 30
def initialize() def initialize
@options = Parser.parse_options @options = Parser.parse_options
if @options[:token]
@github = Github.new oauth_token: @options[:token]
else
@github = Github.new
end
@all_tags = self.get_all_tags
@pull_requests = self.get_all_closed_pull_requests
@tag_times_hash = {} if options[:verbose]
end puts 'Input options:'
pp options
puts ''
end
def print_json(json) github_token
puts JSON.pretty_generate(json)
end
def exec_command(cmd) github_options = {per_page: PER_PAGE_NUMBER}
exec_cmd = "cd #{$project_path} && #{cmd}" github_options[:oauth_token] = @github_token unless @github_token.nil?
%x[#{exec_cmd}] github_options[:endpoint] = options[:github_endpoint] unless options[:github_endpoint].nil?
end github_options[:site] = options[:github_endpoint] unless options[:github_site].nil?
@github = Github.new github_options
def get_all_closed_pull_requests @generator = Generator.new(@options)
@all_tags = self.get_all_tags
@pull_requests = self.get_all_closed_pull_requests
if @options[:issues]
@issues = self.get_all_issues
else
@issues = []
end
issues = @github.pull_requests.list @options[:user], @options[:project], :state => 'closed' @tag_times_hash = {}
json = issues.body
if @options[:verbose]
puts 'Receive all pull requests'
end end
json def print_json(json)
puts JSON.pretty_generate(json)
end
def compund_changelog
if @options[:verbose]
puts 'Generating changelog:'
end end
log = "# Changelog\n\n" def exec_command(cmd)
exec_cmd = "cd #{$project_path} and #{cmd}"
%x[#{exec_cmd}]
end
if @options[:last]
log += self.generate_log_between_tags(self.all_tags[0], self.all_tags[1])
elsif @options[:tag1] && @options[:tag2]
tag1 = @options[:tag1] def get_all_closed_pull_requests
tag2 = @options[:tag2]
tags_strings = []
self.all_tags.each { |x| tags_strings.push(x['name'])}
if tags_strings.include?(tag1) if @options[:verbose]
if tags_strings.include?(tag2) print "Fetching pull requests...\r"
hash = Hash[tags_strings.map.with_index.to_a] end
index1 = hash[tag1]
index2 = hash[tag2] response = @github.pull_requests.list @options[:user], @options[:project], :state => 'closed'
log += self.generate_log_between_tags(self.all_tags[index1], self.all_tags[index2])
pull_requests = []
page_i = 0
response.each_page do |page|
page_i += PER_PAGE_NUMBER
print "Fetching pull requests... #{page_i}\r"
pull_requests.concat(page)
end
print "\r"
if @options[:verbose]
puts "Received closed pull requests: #{pull_requests.count}"
end
unless @options[:pull_request_labels].nil?
if @options[:verbose]
puts 'Filter all pull requests by labels.'
end
filtered_pull_requests = pull_requests.select { |pull_request|
#We need issue to fetch labels
issue = @github.issues.get @options[:user], @options[:project], pull_request.number
#compare is there any labels from @options[:labels] array
select_no_label = !issue.labels.map { |label| label.name }.any?
if @options[:verbose]
puts "Filter request \##{issue.number}."
end
if @options[:pull_request_labels].any?
select_by_label = (issue.labels.map { |label| label.name } & @options[:pull_request_labels]).any?
else
select_by_label = false
end
select_by_label | select_no_label
}
if @options[:verbose]
puts "Filtered pull requests with specified labels and w/o labels: #{filtered_pull_requests.count}"
end
return filtered_pull_requests
end
pull_requests
end
def compund_changelog
if @options[:verbose]
puts 'Generating changelog:'
end
log = "# Changelog\n\n"
if @options[:last]
log += self.generate_log_between_tags(self.all_tags[0], self.all_tags[1])
elsif @options[:tag1] and @options[:tag2]
tag1 = @options[:tag1]
tag2 = @options[:tag2]
tags_strings = []
self.all_tags.each { |x| tags_strings.push(x['name']) }
if tags_strings.include?(tag1)
if tags_strings.include?(tag2)
hash = Hash[tags_strings.map.with_index.to_a]
index1 = hash[tag1]
index2 = hash[tag2]
log += self.generate_log_between_tags(self.all_tags[index1], self.all_tags[index2])
else
puts "Can't find tag #{tag2} -> exit"
exit
end
else else
puts "Can't find tag #{tag2} -> exit" puts "Can't find tag #{tag1} -> exit"
exit exit
end end
else else
puts "Can't find tag #{tag1} -> exit" log += self.generate_log_for_all_tags
exit
end end
else
log += self.generate_log_for_all_tags log += "\n\n\\* *This changelog was generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*"
output_filename = "#{@options[:output]}"
File.open(output_filename, 'w') { |file| file.write(log) }
puts "Done! Generated log placed in #{`pwd`.strip!}/#{output_filename}"
end end
def generate_log_for_all_tags
log = ''
if @options[:verbose] # Async fetching tags:
puts log threads = []
end @all_tags.each { |tag|
threads << Thread.new { self.get_time_of_tag(tag) }
}
threads.each { |thr| thr.join }
log += "\n\n*This file was generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*"
output_filename = "#{@options[:project]}_CHANGELOG.md"
File.open(output_filename, 'w') { |file| file.write(log) }
puts "Done! Generated log placed in #{output_filename}"
end
def generate_log_for_all_tags
log = ''
for index in 1 ... self.all_tags.size
log += self.generate_log_between_tags(self.all_tags[index-1], self.all_tags[index])
end
log
end
def is_megred(number)
@github.pull_requests.merged? @options[:user], @options[:project], number
end
def get_all_merged_pull_requests
json = self.get_all_closed_pull_requests
puts 'Check if the requests is merged... (it can take a while)'
json.delete_if { |req|
merged = self.is_megred(req[:number])
if @options[:verbose] if @options[:verbose]
puts "##{req[:number]} #{merged ? 'merged' : 'not merged'}" puts "Sorting tags.."
end end
!merged
} @all_tags.sort_by! { |x| self.get_time_of_tag(x) }.reverse!
if @options[:verbose]
puts "Generating log.."
end
(1 ... self.all_tags.size).each { |index|
log += self.generate_log_between_tags(self.all_tags[index], self.all_tags[index-1])
}
log += generate_log_between_tags(nil, self.all_tags.last)
log
end
def is_megred(number)
@github.pull_requests.merged? @options[:user], @options[:project], number
end
def get_all_tags
if @options[:verbose]
print "Fetching tags...\r"
end
response = @github.repos.tags @options[:user], @options[:project]
tags = []
page_i = 0
response.each_page do |page|
page_i += PER_PAGE_NUMBER
print "Fetching tags... #{page_i}\r"
tags.concat(page)
end
print "\r"
if @options[:verbose]
puts "Found #{tags.count} tags"
end
tags
end
def github_token
if @options[:token]
return @github_token ||= @options[:token]
end
env_var = ENV.fetch 'CHANGELOG_GITHUB_TOKEN', nil
unless env_var
puts "Warning: No token provided (-t option) and variable $CHANGELOG_GITHUB_TOKEN was not found.".yellow
puts "This script can make only 50 requests to GitHub API per hour without token!".yellow
end
@github_token ||= env_var
end
def generate_log_between_tags(older_tag, newer_tag)
if newer_tag.nil?
puts "Can't find tag -> terminate"
exit 1
end
newer_tag_time = self.get_time_of_tag(newer_tag)
newer_tag_name = newer_tag['name']
if older_tag.nil?
older_tag_name = nil
filtered_pull_requests = delete_by_time(@pull_requests, :merged_at, newer_tag_time)
filtered_issues = delete_by_time(@issues, :closed_at, newer_tag_time)
else
older_tag_time = self.get_time_of_tag(older_tag)
older_tag_name = older_tag['name']
filtered_pull_requests = delete_by_time(@pull_requests, :merged_at, newer_tag_time, older_tag_time)
filtered_issues = delete_by_time(@issues, :closed_at, newer_tag_time, older_tag_time)
end
if @options[:filter_issues_by_milestone]
#delete excess irrelevant issues (according milestones)
filtered_issues.select! { |issue|
if issue.milestone.nil?
true
else
#check, that this milestone in tag list:
milestone_is_tag = @all_tags.find { |tag|
tag.name == issue.milestone.title
}
milestone_is_tag.nil?
end
}
#add missed issues (according milestones)
issues_to_add = @issues.select { |issue|
if issue.milestone.nil?
false
else
#check, that this milestone in tag list:
milestone_is_tag = @all_tags.find { |tag|
tag.name == issue.milestone.title
}
if milestone_is_tag.nil?
false
else
issue.milestone.title == newer_tag_name
end
end
}
filtered_issues |= issues_to_add
end
self.create_log(filtered_pull_requests, filtered_issues, newer_tag_name, newer_tag_time, older_tag_name)
end
def delete_by_time(array, hash_key, newer_tag_time, older_tag_time = nil)
array.select { |req|
if req[hash_key]
t = Time.parse(req[hash_key]).utc
if older_tag_time.nil?
tag_in_range_old = true
else
tag_in_range_old = t > older_tag_time
end
tag_in_range_new = t <= newer_tag_time
tag_in_range = (tag_in_range_old) && (tag_in_range_new)
tag_in_range
else
false
end
}
end
# @param [Array] pull_requests
# @param [Array] issues
# @param [String] newer_tag_name
# @param [String] newer_tag_time
# @param [String] older_tag_name
# @return [String]
def create_log(pull_requests, issues, newer_tag_name, newer_tag_time, older_tag_name = nil)
github_site = options[:github_site] || 'https://github.com'
project_url = "#{github_site}/#{@options[:user]}/#{@options[:project]}"
# Generate tag name and link
log = "## [#{newer_tag_name}](#{project_url}/tree/#{newer_tag_name})\n"
if @options[:compare_link] && older_tag_name
# Generate compare link
log += "[Full Changelog](#{project_url}/compare/#{older_tag_name}...#{newer_tag_name})\n"
end
#Generate date string:
time_string = newer_tag_time.strftime @options[:format]
log += "#### #{time_string}\n"
if @options[:pulls]
# Generate pull requests:
pull_requests.each { |pull_request|
merge = @generator.get_string_for_pull_request(pull_request)
log += "- #{merge}"
} if pull_requests
end
if @options[:issues]
# Generate issues:
if issues
issues.sort! { |x, y|
if x.labels.any? && y.labels.any?
x.labels[0].name <=> y.labels[0].name
else
if x.labels.any?
1
else
if y.labels.any?
-1
else
0
end
end
end
}.reverse!
end
issues.each { |dict|
is_bug = false
is_enhancement = false
dict.labels.each { |label|
if label.name == 'bug'
is_bug = true
end
if label.name == 'enhancement'
is_enhancement = true
end
}
intro = 'Closed issue'
if is_bug
intro = 'Fixed bug'
end
if is_enhancement
intro = 'Implemented enhancement'
end
enc_string = @generator.encapsulate_string dict[:title]
merge = "*#{intro}:* #{enc_string} [\\##{dict[:number]}](#{dict.html_url})\n\n"
log += "- #{merge}"
}
end
log
end
def get_time_of_tag(prev_tag)
if @tag_times_hash[prev_tag['name']]
return @tag_times_hash[prev_tag['name']]
end
github_git_data_commits_get = @github.git_data.commits.get @options[:user], @options[:project], prev_tag['commit']['sha']
time_string = github_git_data_commits_get['committer']['date']
Time.parse(time_string)
@tag_times_hash[prev_tag['name']] = Time.parse(time_string)
end
def get_all_issues
if @options[:verbose]
print "Fetching closed issues...\r"
end
response = @github.issues.list user: @options[:user], repo: @options[:project], state: 'closed', filter: 'all', labels: nil
issues = []
page_i = 0
response.each_page do |page|
page_i += PER_PAGE_NUMBER
print "Fetching closed issues... #{page_i}\r"
issues.concat(page)
end
print "\r"
# remove pull request from issues:
issues.select! { |x|
x.pull_request == nil
}
if @options[:verbose]
puts "Received closed issues: #{issues.count}"
end
if @options[:verbose]
puts "Filtering issues with labels #{@options[:labels]}#{@options[:add_issues_wo_labels] ? ' and w/o labels' : ''}"
end
filtered_issues = issues.select { |issue|
#compare is there any labels from @options[:labels] array
(issue.labels.map { |label| label.name } & @options[:labels]).any?
}
if @options[:add_issues_wo_labels]
issues_wo_labels = issues.select {
# add issues without any labels
|issue| !issue.labels.map { |label| label.name }.any?
}
filtered_issues.concat(issues_wo_labels)
end
if @options[:verbose]
puts "Filtered issues: #{filtered_issues.count}"
end
filtered_issues
end
end end
def get_all_tags if __FILE__ == $0
GitHubChangelogGenerator::ChangelogGenerator.new.compund_changelog
url = "https://api.github.com/repos/#{@options[:user]}/#{@options[:project]}/tags"
if @options[:verbose]
puts "Receive tags for repo #{url}"
end
response = HTTParty.get(url,
:headers => {'Authorization' => 'token 8587bb22f6bf125454768a4a19dbcc774ea68d48',
'User-Agent' => 'Changelog-Generator'})
json_parse = JSON.parse(response.body)
if @options[:verbose]
puts "Found #{json_parse.count} tags"
end
json_parse
end
def generate_log_between_tags(since_tag, till_tag)
since_tag_time = self.get_time_of_tag(since_tag)
till_tag_time = self.get_time_of_tag(till_tag)
# if we mix up tags order - lits fix it!
if since_tag_time > till_tag_time
since_tag, till_tag = till_tag, since_tag
since_tag_time, till_tag_time = till_tag_time, since_tag_time
end
till_tag_name = till_tag['name']
pull_requests = Array.new(@pull_requests)
pull_requests.delete_if { |req|
t = Time.parse(req[:closed_at]).utc
true_classor_false_class = t > since_tag_time
classor_false_class = t < till_tag_time
in_range = (true_classor_false_class) && (classor_false_class)
!in_range
}
self.create_log(pull_requests, till_tag_name, till_tag_time)
end
def create_log(pull_requests, tag_name, tag_time)
trimmed_tag = tag_name.tr('v', '')
log = "## [#{trimmed_tag}] (https://github.com/#{@options[:user]}/#{@options[:project]}/tree/#{tag_name})\n"
time_string = tag_time.strftime @options[:format]
log += "#### #{time_string}\n"
pull_requests.each { |dict|
merge = "#{dict[:title]} [\\##{dict[:number]}](https://github.com/#{@options[:user]}/#{@options[:project]}/pull/#{dict[:number]})\n\n"
log += "- #{merge}"
}
log
end
def get_time_of_tag(prev_tag)
if @tag_times_hash[prev_tag['name']]
return @tag_times_hash[prev_tag['name']]
end
if @options[:verbose]
puts "Get time for tag #{prev_tag['name']}"
end
github_git_data_commits_get = @github.git_data.commits.get @options[:user], @options[:project], prev_tag['commit']['sha']
time_string = github_git_data_commits_get['committer']['date']
Time.parse(time_string)
@tag_times_hash[prev_tag['name']] = Time.parse(time_string)
end end
end end
if __FILE__ == $0
ChangelogGenerator.new.compund_changelog
end

View File

@@ -0,0 +1,38 @@
module GitHubChangelogGenerator
class Generator
def initialize(options = nil)
@options = options
end
def get_string_for_pull_request(pull_request)
encapsulated_title = self.encapsulate_string pull_request[:title]
merge = "#{@options[:merge_prefix]}#{encapsulated_title} [\\##{pull_request[:number]}](#{pull_request.html_url})"
if @options[:author]
if pull_request.user.nil?
merge += " ({Null user})\n\n"
else
merge += " ([#{pull_request.user.login}](#{pull_request.user.html_url}))\n\n"
end
else
merge += "\n\n"
end
merge
end
def encapsulate_string(string)
string.gsub! '\\', '\\\\'
encpas_chars = %w(> * _ \( \) [ ])
encpas_chars.each{ |char|
string.gsub! char, "\\#{char}"
}
string
end
end
end

View File

@@ -1,55 +1,110 @@
#!/usr/bin/env ruby #!/usr/bin/env ruby
require 'optparse' require 'optparse'
require 'pp'
require_relative 'version'
class Parser module GitHubChangelogGenerator
def self.parse_options class Parser
options = {:tag1 => nil, :tag2 => nil, :format => '%d/%m/%y'} def self.parse_options
options = {:tag1 => nil, :tag2 => nil, :format => '%d/%m/%y', :output => 'CHANGELOG.md', :labels => %w(bug enhancement), :pulls => true, :issues => true, :verbose => true, :add_issues_wo_labels => true, :merge_prefix => '*Merged pull-request:* ', :author => true, :pull_request_labels => nil, :filter_issues_by_milestone => true, :compare_link => true}
parser = OptionParser.new { |opts| parser = OptionParser.new { |opts|
opts.banner = 'Usage: changelog_generator -u user_name -p project_name [-t 16-digit-GitHubToken] [options]' opts.banner = 'Usage: changelog_generator [options]'
opts.on('-u', '--user [USER]', 'your username on GitHub') do |last| opts.on('-u', '--user [USER]', 'Username of the owner of target GitHub repo') do |last|
options[:user] = last options[:user] = last
end
opts.on('-p', '--project [PROJECT]', 'Name of project on GitHub') do |last|
options[:project] = last
end
opts.on('-t', '--token [TOKEN]', 'To make more than 50 requests per hour your GitHub token required. You can generate it here: https://github.com/settings/tokens/new') do |last|
options[:token] = last
end
opts.on('-f', '--date-format [FORMAT]', 'Date format. Default is %d/%m/%y') do |last|
options[:format] = last
end
opts.on('-o', '--output [NAME]', 'Output file. Default is CHANGELOG.md') do |last|
options[:output] = last
end
opts.on('--[no-]verbose', 'Run verbosely. Default is true') do |v|
options[:verbose] = v
end
opts.on('--[no-]issues', 'Include closed issues to changelog. Default is true') do |v|
options[:issues] = v
end
opts.on('--[no-]issues-without-labels', 'Include closed issues without any labels to changelog. Default is true') do |v|
options[:add_issues_wo_labels] = v
end
opts.on('--[no-]pull-requests', 'Include pull-requests to changelog. Default is true') do |v|
options[:pulls] = v
end
opts.on('--[no-]filter-issues-by-milestone', 'Use milestone to detect when issue was resolved. Default is true') do |last|
options[:filter_issues_by_milestone] = last
end
opts.on('--[no-]author', 'Add author of pull-request in the end. Default is true') do |author|
options[:last] = author
end
opts.on('--[no-]compare-link', 'Include compare link between older version and newer version. Default is true') do |v|
options[:compare_link] = v
end
opts.on('--labels x,y,z', Array, 'Issues with that labels will be included to changelog. Default is \'bug,enhancement\'') do |list|
options[:labels] = list
end
opts.on('--labels-pr x,y,z', Array, 'Only pull requests with specified labels will be included to changelog. Default is nil') do |list|
options[:pull_request_labels] = list
end
opts.on('--github-site [URL]', 'The Enterprise Github site on which your project is hosted.') do |last|
options[:github_site] = last
end
opts.on('--github-api [URL]', 'The enterprise endpoint to use for your Github API.') do |last|
options[:github_endpoint] = last
end
opts.on('-v', '--version', 'Print version number') do |v|
puts "Version: #{GitHubChangelogGenerator::VERSION}"
exit
end
opts.on('-h', '--help', 'Displays Help') do
puts opts
exit
end
}
parser.parse!
if ARGV[0] && !ARGV[1]
github_site = options[:github_site] ? options[:github_site] : 'github.com'
# this match should parse https://github.com/skywinder/Github-Changelog-Generator and skywinder/Github-Changelog-Generator to user and name
match = /(?:.+#{Regexp.escape(github_site)}\/)?(.+)\/(.+)/.match(ARGV[0])
if match[2].nil?
exit
else
options[:user] = match[1]
options[:project]= match[2]
end
end end
opts.on('-p', '--project [PROJECT]', 'name of project on GitHub') do |last|
options[:project] = last if !options[:user] && !options[:project]
remote = `git remote -vv`.split("\n")
match = /.*(?:[:\/])((?:-|\w|\.)*)\/((?:-|\w|\.)*)?(?:\.git).*/.match(remote[0])
if match && match[1] && match[2]
puts "Detected user:#{match[1]}, project:#{match[2]}"
options[:user], options[:project] = match[1], match[2]
end
end end
opts.on('-t', '--token [TOKEN]', 'To make more than 50 requests this app required your OAuth token for GitHub. You can generate it on https://github.com/settings/applications') do |last|
options[:token] = last
end if !options[:user] || !options[:project]
opts.on('-h', '--help', 'Displays Help') do puts parser.banner
puts opts
exit exit
end end
opts.on('-v', '--[no-]verbose', 'Run verbosely') do |v|
options[:verbose] = v if ARGV[1]
options[:tag1] = ARGV[0]
options[:tag2] = ARGV[1]
end end
opts.on('-l', '--last-changes', 'generate log between last 2 tags') do |last|
options[:last] = last
end
opts.on('-f', '--date-format [FORMAT]', 'date format. default is %d/%m/%y') do |last|
options[:format] = last
end
}
parser.parse! options
#udefined case with 1 parameter:
if ARGV[0] && !ARGV[1]
puts parser.banner
exit
end end
if !options[:user] || !options[:project]
puts parser.banner
exit
end
if ARGV[1]
options[:tag1] = ARGV[0]
options[:tag2] = ARGV[1]
end
options
end end
end end

View File

@@ -0,0 +1,3 @@
module GitHubChangelogGenerator
VERSION = '1.2.7'
end