gitee-cli 0.2.1 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +25 -1
- data/README.md +13 -7
- data/lib/gitee/cli/{Rakefile → front.rb} +72 -13
- data/lib/gitee/cli.rb +19 -13
- data/lib/gitee/gitee4cli/api.rb +179 -86
- data/lib/gitee-cli.rb +3 -5
- metadata +36 -9
- data/lib/gitee/gitee4cli.rb +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 39860a8249020b6e74c1eacd9946717adb47c63dfb8f70f9deaa258f600a7448
|
4
|
+
data.tar.gz: b3a7435c1690810d877c32ba94d0e9f3b00dca2bf822f4675d4a7828248f2f79
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 257b5dd80bd85e09afade814b48ae956398a8e861f157016e889c1ffe46c3f6d3f459baf188c330b29bc9ea3e7c290ab4cc73454fae7ff5e22812d163cdab420
|
7
|
+
data.tar.gz: d066127d841af74c3b735e527d428d405b49ffbbef1cbb4c62e26ca3a41056ce1c907ac64ad03112ca8b808d6112f107f6161c20bc9c62a8b1e62b44b222faec
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,30 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
-
## [Unreleased](#) (2023-05-
|
3
|
+
## [Unreleased](#) (2023-05-31)
|
4
|
+
|
5
|
+
<br>
|
6
|
+
|
7
|
+
## [v0.2.3](#) (2023-05-31)
|
8
|
+
|
9
|
+
### New features:
|
10
|
+
|
11
|
+
- Support
|
12
|
+
|
13
|
+
- `gist:list`
|
14
|
+
- `gist:create`
|
15
|
+
|
16
|
+
### Enhancements:
|
17
|
+
|
18
|
+
- Use similar output as `gh` for `repo:create` and `gist:create`
|
19
|
+
|
20
|
+
<br>
|
21
|
+
|
22
|
+
## [v0.2.2](#) (2023-05-19)
|
23
|
+
|
24
|
+
### Enhancements:
|
25
|
+
|
26
|
+
- Distinguish `gitee help` from `gitee -h`
|
27
|
+
- Use `standard_path` to make corss-platform path
|
4
28
|
|
5
29
|
<br>
|
6
30
|
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
# Gitee CLI
|
1
|
+
# Gitee CLI
|
2
2
|
|
3
|
-

|
4
4
|
|
5
5
|
Work with [Gitee](https://gitee.com/) from the command line.
|
6
6
|
|
@@ -12,9 +12,13 @@ $ gem install gitee-cli
|
|
12
12
|
|
13
13
|
## Usage
|
14
14
|
|
15
|
-
|
15
|
+
> **Note**
|
16
|
+
> 1. 此客户端当前仅在`Windows`上测试运行良好。`Linux`和`macOS`理论上可运行。
|
17
|
+
> 2. 命令行接口与GitHub的`gh`不太一致
|
18
|
+
> 3. 当前API仅实现了较小一部分(我目前需要的)
|
19
|
+
> 4. 如果您想要使`gitee`命令与`gh`命令保持兼容,或者需要提供对多平台的支持,或者发现有API需要补充,请考虑捐赠此项目并发起issue。
|
16
20
|
|
17
|
-
|
21
|
+
---
|
18
22
|
|
19
23
|
使用`gitee-cli`需要`Gitee Access Token`,我们可以通过以下两种方式实现:
|
20
24
|
|
@@ -43,7 +47,7 @@ http://localhost
|
|
43
47
|
|
44
48
|
# Logo上传gitee-cli的logo即可
|
45
49
|
# 使用下面命令下载
|
46
|
-
curl -fsSL https://gitee.com/ccmywish/gitee-cli/raw/main/images/AppLogo.jpg -o
|
50
|
+
curl -fsSL https://gitee.com/ccmywish/gitee-cli/raw/main/images/AppLogo.jpg -o GiteeCLIAppLogo.jpg
|
47
51
|
```
|
48
52
|
|
49
53
|
注册完成后,我们会得到`Client ID`和`Client Secret`。最后一步,在命令行上运行:
|
@@ -58,7 +62,7 @@ $ gitee auth:apply[id, secret]
|
|
58
62
|
|
59
63
|
### 方式2(临时)
|
60
64
|
|
61
|
-
|
65
|
+
如果您只想临时使用,或者不方便将`token`等关键信息存储在本机,请运行:
|
62
66
|
```bash
|
63
67
|
$ gitee auth:temp_apply
|
64
68
|
```
|
@@ -72,7 +76,9 @@ $ gitee repo:branches[ccmywish, gitee-cli] GITEE_TOKEN=xxx
|
|
72
76
|
## 命令行
|
73
77
|
|
74
78
|
```bash
|
75
|
-
gitee -
|
79
|
+
gitee -h # 快速帮助
|
80
|
+
|
81
|
+
gitee help [pattern] # 显示可执行命令,可以使用pattern来搜索相关命令
|
76
82
|
|
77
83
|
gitee auth:apply[id,secret] # Apply for an access token using Gitee app
|
78
84
|
gitee auth:temp_apply # Apply for an access token temporarily
|
@@ -1,15 +1,17 @@
|
|
1
1
|
# ---------------------------------------------------------------
|
2
|
-
# File :
|
2
|
+
# File : front.rb
|
3
3
|
# Authors : Aoran Zeng <ccmywish@qq.com>
|
4
4
|
# Created on : <2023-04-29>
|
5
|
-
# Last modified : <2023-05-
|
5
|
+
# Last modified : <2023-05-31>
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# front:
|
8
8
|
#
|
9
9
|
# This file makes use of Rake and handle results of API calls
|
10
|
-
#
|
11
10
|
# ---------------------------------------------------------------
|
12
11
|
|
12
|
+
require 'rainbow/refinement'
|
13
|
+
using Rainbow
|
14
|
+
|
13
15
|
# desc "Print help" # Comment to hide this in help info
|
14
16
|
task :help do end # Just an empty task to be specified by default
|
15
17
|
|
@@ -18,9 +20,9 @@ namespace "repo" do
|
|
18
20
|
desc "Create a repository under your space"
|
19
21
|
task :create, [:repo] do |t, repo:|
|
20
22
|
res = Gitee::Gitee4CLI::API::Repositories.create(repo)
|
21
|
-
if res.
|
22
|
-
|
23
|
-
puts
|
23
|
+
if res.success?
|
24
|
+
puts "#{'✓'.green} Created repository #{repo.blue} on Gitee"
|
25
|
+
puts res.content['html_url']
|
24
26
|
else
|
25
27
|
$stderr.puts "Error: " + res.why_failed
|
26
28
|
end
|
@@ -30,8 +32,8 @@ namespace "repo" do
|
|
30
32
|
desc "Delete the '<user>/<repo>' repository"
|
31
33
|
task :delete, [:user, :repo] do |t, user:, repo:|
|
32
34
|
res = Gitee::Gitee4CLI::API::Repositories.delete(user,repo)
|
33
|
-
if res.
|
34
|
-
puts "Deleted successfully!"
|
35
|
+
if res.success?
|
36
|
+
puts "Deleted repository #{user}}/#{repo} successfully!"
|
35
37
|
else
|
36
38
|
$stderr.puts "Error: " + res.why_failed
|
37
39
|
end
|
@@ -42,7 +44,7 @@ namespace "repo" do
|
|
42
44
|
task :branches, [:user, :repo] do |t, args|
|
43
45
|
user, repo = args.user, args.repo
|
44
46
|
res = Gitee::Gitee4CLI::API::Repositories.all_branches(user, repo)
|
45
|
-
if res.
|
47
|
+
if res.success?
|
46
48
|
res.content.each do |br|
|
47
49
|
puts br['name']
|
48
50
|
end
|
@@ -55,7 +57,7 @@ namespace "repo" do
|
|
55
57
|
desc "View the repository's README"
|
56
58
|
task :view, [:user, :repo] do |t, user:, repo:|
|
57
59
|
res = Gitee::Gitee4CLI::API::Repositories.readme(user, repo)
|
58
|
-
if res.
|
60
|
+
if res.success?
|
59
61
|
require 'base64'
|
60
62
|
require 'tty-markdown'
|
61
63
|
# res.content['content'] is UTF-8
|
@@ -73,7 +75,7 @@ namespace "repo" do
|
|
73
75
|
task :list, [:user] do |t, args|
|
74
76
|
user = args.user
|
75
77
|
res = Gitee::Gitee4CLI::API::Repositories.list_for_user(user)
|
76
|
-
if res.
|
78
|
+
if res.success?
|
77
79
|
# res.content is_a? Array => true
|
78
80
|
res.content.each_with_index do |repo, i|
|
79
81
|
print "#{i+1}. ".ljust(3), repo['full_name'].ljust(30)
|
@@ -114,7 +116,7 @@ namespace "auth" do
|
|
114
116
|
task :apply, [:id, :secret] do |t, id:, secret:|
|
115
117
|
redirect_uri = "http://localhost"
|
116
118
|
res = Gitee::Gitee4CLI::API::Authorization.apply(id, secret, redirect_uri)
|
117
|
-
if res.
|
119
|
+
if res.success?
|
118
120
|
puts "Success to apply, you can run any command now"
|
119
121
|
else
|
120
122
|
$stderr.puts "Error: " + res.why_failed
|
@@ -123,4 +125,61 @@ namespace "auth" do
|
|
123
125
|
|
124
126
|
end
|
125
127
|
|
128
|
+
namespace "issue" do
|
129
|
+
desc "List issues in a repository"
|
130
|
+
task :list, [:user, :repo] do |t, args|
|
131
|
+
user, repo = args.user, args.repo
|
132
|
+
res1 = Gitee::Gitee4CLI::API::Issues.all(user, repo, 'open')
|
133
|
+
res2 = Gitee::Gitee4CLI::API::Issues.all(user, repo, 'progressing')
|
134
|
+
printer = lambda do |res, state, color|
|
135
|
+
if res.success?
|
136
|
+
res.content.each do |issue|
|
137
|
+
print "[#{state}]".bold.send(color), ' '
|
138
|
+
puts issue['title']
|
139
|
+
puts issue['url']
|
140
|
+
puts
|
141
|
+
end
|
142
|
+
else
|
143
|
+
$stderr.puts "Error: " + res.why_failed
|
144
|
+
end
|
145
|
+
end
|
146
|
+
printer.call res1, '待处理', 'yellow'
|
147
|
+
printer.call res2, '进行中', 'green'
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
|
152
|
+
namespace "gist" do
|
153
|
+
|
154
|
+
desc "Create a new gist"
|
155
|
+
task :create, [:path, :desc] do |t, args|
|
156
|
+
path, desc = args.path, args.desc
|
157
|
+
require 'pathname'
|
158
|
+
path = Pathname.new path
|
159
|
+
|
160
|
+
res = Gitee::Gitee4CLI::API::Gists.create(path, desc)
|
161
|
+
if res.success?
|
162
|
+
puts "#{'✓'.green} Created gist #{path.basename.to_s.blue}"
|
163
|
+
puts res.content['html_url']
|
164
|
+
else
|
165
|
+
$stderr.puts "Error: " + res.why_failed
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
|
170
|
+
desc "List your gists"
|
171
|
+
task :list do |t|
|
172
|
+
res = Gitee::Gitee4CLI::API::Gists.list
|
173
|
+
if res.success?
|
174
|
+
res.content.each_with_index do |gist, i|
|
175
|
+
puts gist['description']
|
176
|
+
puts gist['html_url']
|
177
|
+
puts
|
178
|
+
end
|
179
|
+
else
|
180
|
+
$stderr.puts "Error: " + res.why_failed
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
126
185
|
task default: :help
|
data/lib/gitee/cli.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# File : cli.rb
|
3
3
|
# Authors : Aoran Zeng <ccmywish@qq.com>
|
4
4
|
# Created on : <2023-04-28>
|
5
|
-
# Last modified : <2023-05-
|
5
|
+
# Last modified : <2023-05-31>
|
6
6
|
#
|
7
7
|
# cli:
|
8
8
|
#
|
@@ -10,12 +10,13 @@
|
|
10
10
|
# ---------------------------------------------------------------
|
11
11
|
|
12
12
|
require 'rake'
|
13
|
+
require 'standard_path'
|
13
14
|
|
14
15
|
# Add method for Rake application
|
15
16
|
#
|
16
17
|
class Rake::Application
|
17
18
|
def run_gitee_cli(args)
|
18
|
-
opt = ['--rakefile', File.join(__FILE__, '..', 'cli', '
|
19
|
+
opt = ['--rakefile', File.join(__FILE__, '..', 'cli', 'front.rb') ]
|
19
20
|
standard_exception_handling do
|
20
21
|
argv = args.push *opt
|
21
22
|
init "gitee", argv
|
@@ -31,9 +32,9 @@ module Gitee
|
|
31
32
|
module CLI
|
32
33
|
|
33
34
|
# gitee-cli version
|
34
|
-
VERSION = "0.2.
|
35
|
+
VERSION = "0.2.3"
|
35
36
|
|
36
|
-
DEFAULT_TOKEN_DIR =
|
37
|
+
DEFAULT_TOKEN_DIR = StandardPath.app_data "Gitee CLI in Ruby"
|
37
38
|
DEFAULT_TOKEN_FILE = File.join DEFAULT_TOKEN_DIR, "sec.json"
|
38
39
|
|
39
40
|
# Read token from local or environment variable
|
@@ -41,14 +42,14 @@ module Gitee
|
|
41
42
|
# @return [Array<String, String>] Arrary of access token and refresh token for Gitee API
|
42
43
|
#
|
43
44
|
# @note The token file is a JSON file, with the content being like:
|
44
|
-
#
|
45
|
-
#
|
46
|
-
#
|
47
|
-
#
|
48
|
-
#
|
49
|
-
#
|
50
|
-
#
|
51
|
-
#
|
45
|
+
# {
|
46
|
+
# "access_token": "xxxxxxxxxxxxxxxxxxxxxx",
|
47
|
+
# "token_type": "bearer",
|
48
|
+
# "expires_in": 86400,
|
49
|
+
# "refresh_token": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
|
50
|
+
# "scope": "user_info projects",
|
51
|
+
# "created_at": 1683393781
|
52
|
+
# }
|
52
53
|
#
|
53
54
|
def self.get_token
|
54
55
|
if tok = ENV['GITEE_TOKEN']
|
@@ -82,7 +83,7 @@ module Gitee
|
|
82
83
|
def self.run
|
83
84
|
argv = ARGV.dup
|
84
85
|
|
85
|
-
help_opts = ['-h', '-H', '--help'
|
86
|
+
help_opts = ['-h', '-H', '--help']
|
86
87
|
version_opts = ['-v', '-V', '--version']
|
87
88
|
|
88
89
|
if argv.empty?
|
@@ -92,6 +93,11 @@ module Gitee
|
|
92
93
|
argv -= help_opts
|
93
94
|
puts help_banner
|
94
95
|
argv << '-T'
|
96
|
+
elsif argv[0] == 'help'
|
97
|
+
help_what = argv[1]
|
98
|
+
argv.clear
|
99
|
+
argv << '-D'
|
100
|
+
argv << help_what if not help_what.nil?
|
95
101
|
elsif argv.intersect? version_opts
|
96
102
|
argv -= version_opts
|
97
103
|
puts version_banner
|
data/lib/gitee/gitee4cli/api.rb
CHANGED
@@ -2,21 +2,26 @@
|
|
2
2
|
# File : api.rb
|
3
3
|
# Authors : Aoran Zeng <ccmywish@qq.com>
|
4
4
|
# Created on : <2023-04-28>
|
5
|
-
# Last modified : <2023-05-
|
5
|
+
# Last modified : <2023-05-31>
|
6
6
|
#
|
7
7
|
# api:
|
8
8
|
#
|
9
9
|
# APIs for Gitee
|
10
|
-
#
|
11
10
|
# ---------------------------------------------------------------
|
12
11
|
|
12
|
+
module Gitee
|
13
|
+
module Gitee4CLI
|
14
|
+
URL = "https://gitee.com"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
13
18
|
# All APIs reside here
|
14
19
|
#
|
15
20
|
# @!macro [new] param_owner
|
16
|
-
# @param [String]
|
21
|
+
# @param owner [String] 仓库所属空间地址(企业、组织或个人的地址path)
|
17
22
|
#
|
18
23
|
# @!macro [new] param_repo
|
19
|
-
# @param [String]
|
24
|
+
# @param repo [String] 仓库路径(path)
|
20
25
|
#
|
21
26
|
module Gitee::Gitee4CLI::API
|
22
27
|
|
@@ -38,19 +43,19 @@ module Gitee::Gitee4CLI::API
|
|
38
43
|
|
39
44
|
# New a Result object with successful info and its content or failed reason
|
40
45
|
#
|
41
|
-
# @param [Boolean]
|
42
|
-
# @param
|
46
|
+
# @param success_or_fail [Boolean] If the API call succeeded
|
47
|
+
# @param generic [String] Content or failed reason
|
43
48
|
#
|
44
|
-
def initialize(
|
45
|
-
@status =
|
46
|
-
if
|
49
|
+
def initialize(success_or_fail, generic)
|
50
|
+
@status = success_or_fail
|
51
|
+
if @status
|
47
52
|
@content = generic
|
48
53
|
else
|
49
54
|
@why_failed = generic
|
50
55
|
end
|
51
56
|
end
|
52
57
|
|
53
|
-
def
|
58
|
+
def success?
|
54
59
|
@status
|
55
60
|
end
|
56
61
|
|
@@ -98,7 +103,7 @@ module Gitee::Gitee4CLI::API
|
|
98
103
|
#
|
99
104
|
# @return [String] New access token
|
100
105
|
#
|
101
|
-
# @HTTP
|
106
|
+
# @HTTP [POST] https://gitee.com/oauth/token?grant_type=refresh_token&refresh_token={refresh_token}
|
102
107
|
#
|
103
108
|
def refresh_access_token
|
104
109
|
url = Gitee::Gitee4CLI::URL + "/oauth/token?grant_type=refresh_token"
|
@@ -135,8 +140,8 @@ module Gitee::Gitee4CLI::API
|
|
135
140
|
# Make a direct request, not being wrapped
|
136
141
|
#
|
137
142
|
# @return
|
138
|
-
# 1. [Status]
|
139
|
-
# 2. [String]
|
143
|
+
# 1. `@status` [Status] status
|
144
|
+
# 2. `@body` [String] response body string
|
140
145
|
#
|
141
146
|
# @note 这个函数不同于`make_api_request`,后者经过包装,请求路径均相对于API,会读取本地的token。
|
142
147
|
# 而此函数的请求将相对于Gitee根路径,不会读取本地token。
|
@@ -145,7 +150,7 @@ module Gitee::Gitee4CLI::API
|
|
145
150
|
require 'http'
|
146
151
|
url = [Gitee::Gitee4CLI::URL, @path].join('/')
|
147
152
|
instance_exec {
|
148
|
-
res = HTTP.send @
|
153
|
+
res = HTTP.send @method.to_sym, url, :form => @params
|
149
154
|
@status, @body = res.status, res.to_s
|
150
155
|
}
|
151
156
|
end
|
@@ -153,8 +158,8 @@ module Gitee::Gitee4CLI::API
|
|
153
158
|
# Make a request for some specific API
|
154
159
|
#
|
155
160
|
# @return
|
156
|
-
# 1. [Status]
|
157
|
-
# 2. [String]
|
161
|
+
# 1. `@status` [Status] status
|
162
|
+
# 2. `@body` [String] response body string
|
158
163
|
#
|
159
164
|
# @note This is only called by module functions
|
160
165
|
#
|
@@ -190,7 +195,15 @@ module Gitee::Gitee4CLI::API
|
|
190
195
|
|
191
196
|
loop do
|
192
197
|
|
193
|
-
|
198
|
+
if @json_data
|
199
|
+
res = HTTP.send @method.to_sym, url, :json => @json_data
|
200
|
+
elsif @form_data
|
201
|
+
res = HTTP.send @method.to_sym, url, :form => @form_data
|
202
|
+
else
|
203
|
+
# Always use ':form' if we directly use a simple @params
|
204
|
+
res = HTTP.send @method.to_sym, url, :form => @params
|
205
|
+
end
|
206
|
+
|
194
207
|
@status, @body = res.status, res.to_s
|
195
208
|
|
196
209
|
break if @status.code != HttpStatusCode::Unauthorized
|
@@ -212,11 +225,12 @@ module Gitee::Gitee4CLI::API
|
|
212
225
|
$stderr.puts <<~ERR
|
213
226
|
Error: The local access token is not outdated (Will expire at #{will_expire_at_for_HUMAN}).
|
214
227
|
But Gitee returned '401 Unauthorized', so we've refreshed access token and re-request.
|
215
|
-
However Gitee returned the same again. Please check the refresh token.
|
228
|
+
However Gitee returned the same again. Please check the refresh token.
|
216
229
|
ERR
|
217
230
|
end
|
231
|
+
puts
|
218
232
|
err_json_hash.each do |k, v|
|
219
|
-
$stderr.puts "
|
233
|
+
$stderr.puts " #{k}: #{v}"
|
220
234
|
end
|
221
235
|
exit
|
222
236
|
end
|
@@ -231,6 +245,25 @@ module Gitee::Gitee4CLI::API
|
|
231
245
|
|
232
246
|
end
|
233
247
|
|
248
|
+
|
249
|
+
# Generate(Return) successful or failed response to pass to front
|
250
|
+
#
|
251
|
+
# @param expected_success_status_code [Integer]
|
252
|
+
#
|
253
|
+
# @return [Result] result
|
254
|
+
#
|
255
|
+
def return_response_which_expect(expected_success_status_code)
|
256
|
+
body = JSON.parse @body
|
257
|
+
if @status.code == expected_success_status_code
|
258
|
+
Result[true, body]
|
259
|
+
else
|
260
|
+
$stderr.print "Response Error Message: "
|
261
|
+
# force_debug @body
|
262
|
+
$stderr.puts body['message']
|
263
|
+
Result[false, @status.to_s]
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
234
267
|
end
|
235
268
|
|
236
269
|
# Make it only accessible from inside
|
@@ -247,15 +280,21 @@ module Gitee::Gitee4CLI::API
|
|
247
280
|
|
248
281
|
# Apply for a for a Gitee Application
|
249
282
|
#
|
250
|
-
# @param [String] Client ID
|
251
|
-
# @param [String] Client Secret
|
252
|
-
# @param [String] Redirect URI
|
283
|
+
# @param client_id [String] Client ID
|
284
|
+
# @param client_secret [String] Client Secret
|
285
|
+
# @param redirect_uri [String] Redirect URI
|
253
286
|
#
|
254
287
|
# @return [Result] JSON响应体
|
255
288
|
#
|
256
|
-
# @HTTP
|
289
|
+
# @HTTP [GET]
|
290
|
+
# URL:
|
291
|
+
# https://gitee.com/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code
|
292
|
+
# This is the first step, launched in web browser
|
257
293
|
#
|
258
|
-
# @HTTP
|
294
|
+
# @HTTP [POST]
|
295
|
+
# URL:
|
296
|
+
# https://gitee.com/oauth/token?grant_type=authorization_code&code={code}&client_id={client_id}&redirect_uri={redirect_uri}&client_secret={client_secret}
|
297
|
+
# This is the second step, posted by ourself
|
259
298
|
#
|
260
299
|
def self.apply(client_id, client_secret, redirect_uri)
|
261
300
|
|
@@ -299,7 +338,7 @@ module Gitee::Gitee4CLI::API
|
|
299
338
|
code: grant_auth_code,
|
300
339
|
client_id:, redirect_uri:, client_secret:
|
301
340
|
}
|
302
|
-
@
|
341
|
+
@method = 'post'
|
303
342
|
make_direct_request
|
304
343
|
|
305
344
|
# @body is the JSON string
|
@@ -328,12 +367,13 @@ module Gitee::Gitee4CLI::API
|
|
328
367
|
#
|
329
368
|
# @!macro param_repo
|
330
369
|
# @!macro param_owner
|
331
|
-
# @param [String] sha 文件的 Blob SHA,可通过[获取仓库具体路径下的内容(tree)]API获取
|
332
|
-
# @param [Boolean] recursive 赋值为1递归获取目录
|
333
370
|
#
|
334
|
-
# @
|
371
|
+
# @param sha [String] 文件的 Blob SHA,可通过[获取仓库具体路径下的内容(tree)]API获取
|
372
|
+
# @param recursive [Boolean] 赋值为1递归获取目录
|
373
|
+
#
|
374
|
+
# @return [String] JSON响应体
|
335
375
|
#
|
336
|
-
# @HTTP
|
376
|
+
# @HTTP [GET] https://gitee.com/api/v5/repos/{owner}/{repo}/git/blobs/{sha}
|
337
377
|
#
|
338
378
|
def self.blob(owner, repo, sha, recursive = true)
|
339
379
|
access_token = get_token
|
@@ -341,20 +381,20 @@ module Gitee::Gitee4CLI::API
|
|
341
381
|
@params = {access_token:, recursive:}
|
342
382
|
@path = sprintf "repos/%s/%s/git/blobs/%s", owner, repo, sha
|
343
383
|
make_api_request
|
384
|
+
return_response_which_expect HttpStatusCode::Ok
|
344
385
|
end
|
345
386
|
|
346
387
|
# Get directory Tree
|
347
388
|
#
|
348
389
|
# @!macro param_owner
|
349
390
|
# @!macro param_repo
|
350
|
-
# @param [String] sha 可以是分支名(如master)、Commit或者目录Tree的SHA值
|
351
|
-
# @param [Boolean] recursive 赋值为1递归获取目录
|
352
391
|
#
|
353
|
-
# @
|
392
|
+
# @param sha [String] 可以是分支名(如master)、Commit或者目录Tree的SHA值
|
393
|
+
# @param recursive [Boolean] 赋值为1递归获取目录
|
354
394
|
#
|
355
|
-
# @
|
395
|
+
# @return [Result] JSON响应体
|
356
396
|
#
|
357
|
-
# @
|
397
|
+
# @HTTP [Get] https://gitee.com/api/v5/repos/{owner}/{repo}/git/trees/{sha}
|
358
398
|
#
|
359
399
|
def self.tree(owner, repo, sha, recursive = true)
|
360
400
|
access_token = get_token
|
@@ -371,18 +411,16 @@ module Gitee::Gitee4CLI::API
|
|
371
411
|
#
|
372
412
|
# @return [Result] JSON响应体
|
373
413
|
#
|
374
|
-
# @HTTP
|
375
|
-
#
|
376
|
-
# @example [URL] https://gitee.com/api/v5/repos/ccmywish/gitee-cli/git/gitee_metrics?access_token=abc
|
414
|
+
# @HTTP [GET] https://gitee.com/api/v5/repos/{owner}/{repo}/git/gitee_metrics
|
377
415
|
#
|
378
416
|
def self.gitee_metrics(owner, repo)
|
379
417
|
access_token = get_token
|
380
418
|
@params = {access_token:}
|
381
419
|
@path = sprintf "repos/%s/%s/git/gitee_metrics", owner, repo
|
382
|
-
@
|
420
|
+
@method = 'get'
|
383
421
|
make_api_request
|
422
|
+
return_response_which_expect HttpStatusCode::Ok
|
384
423
|
end
|
385
|
-
|
386
424
|
end
|
387
425
|
|
388
426
|
|
@@ -401,40 +439,36 @@ module Gitee::Gitee4CLI::API
|
|
401
439
|
# @!macro param_owner
|
402
440
|
# @!macro param_repo
|
403
441
|
#
|
404
|
-
# @return
|
442
|
+
# @return [Result] JSON响应体
|
405
443
|
#
|
406
|
-
# @HTTP
|
444
|
+
# @HTTP [GET] https://gitee.com/api/v5/repos/{owner}/{repo}/branches
|
407
445
|
#
|
408
446
|
def self.all_branches(owner, repo)
|
409
447
|
access_token = get_token
|
410
448
|
@params = {access_token:}
|
411
449
|
@path = sprintf "repos/%s/%s/branches", owner, repo
|
412
|
-
@
|
450
|
+
@method = 'get'
|
413
451
|
make_api_request
|
414
|
-
|
415
|
-
# 'json' is already required somewhere, maybe from 'http.rb'
|
416
|
-
Result[true, JSON.parse(@body)]
|
417
|
-
else
|
418
|
-
Result[false, @status.to_s]
|
419
|
-
end
|
452
|
+
return_response_which_expect HttpStatusCode::Ok
|
420
453
|
end
|
421
454
|
|
422
455
|
# @todo
|
423
456
|
# Create a new branch from a owner's repo
|
424
457
|
#
|
425
|
-
#
|
426
458
|
# @!macro param_owner
|
427
459
|
# @!macro param_repo
|
428
460
|
#
|
429
|
-
# @return
|
461
|
+
# @return [Result] JSON响应体
|
430
462
|
#
|
431
|
-
# @HTTP
|
463
|
+
# @HTTP [POST] https://gitee.com/api/v5/repos/{owner}/{repo}/branches
|
432
464
|
#
|
433
465
|
def self.new_branch(owner, repo)
|
434
466
|
access_token = get_token
|
435
467
|
@params = {access_token:}
|
436
468
|
@path = sprintf "repos/%s/%s/branches", owner, repo
|
469
|
+
@method = 'post'
|
437
470
|
make_api_request
|
471
|
+
return_response_which_expect HttpStatusCode::Created
|
438
472
|
# TODO post the request
|
439
473
|
end
|
440
474
|
|
@@ -443,18 +477,20 @@ module Gitee::Gitee4CLI::API
|
|
443
477
|
#
|
444
478
|
# @!macro param_owner
|
445
479
|
# @!macro param_repo
|
446
|
-
# @param [String] branch 分支名称
|
447
480
|
#
|
448
|
-
# @
|
481
|
+
# @param branch [String] 分支名称
|
449
482
|
#
|
450
|
-
# @
|
483
|
+
# @return [Result] JSON响应体
|
484
|
+
#
|
485
|
+
# @HTTP [GET] https://gitee.com/api/v5/repos/{owner}/{repo}/branches/{branch}
|
451
486
|
#
|
452
487
|
def self.get_branch(owner, repo, branch)
|
453
488
|
access_token = get_token
|
454
489
|
@params = {access_token:}
|
455
490
|
@path = sprintf "repos/%s/%s/branches/%s", owner, repo, branch
|
456
|
-
@
|
491
|
+
@method = 'get'
|
457
492
|
make_api_request
|
493
|
+
return_response_which_expect HttpStatusCode::Ok
|
458
494
|
end
|
459
495
|
|
460
496
|
# Delete a owner's repo
|
@@ -464,19 +500,15 @@ module Gitee::Gitee4CLI::API
|
|
464
500
|
#
|
465
501
|
# @return [Result] JSON响应体
|
466
502
|
#
|
467
|
-
# @HTTP
|
503
|
+
# @HTTP [DELETE] https://gitee.com/api/v5/repos/{owner}/{repo}
|
468
504
|
#
|
469
505
|
def self.delete(owner, repo)
|
470
506
|
access_token = get_token
|
471
507
|
@params = {access_token:}
|
472
508
|
@path = sprintf "repos/%s/%s", owner, repo
|
473
|
-
@
|
509
|
+
@method = 'delete'
|
474
510
|
make_api_request
|
475
|
-
|
476
|
-
Result[true, nil]
|
477
|
-
else
|
478
|
-
Result[false, @status.to_s]
|
479
|
-
end
|
511
|
+
return_response_which_expect HttpStatusCode::NoContent
|
480
512
|
end
|
481
513
|
|
482
514
|
# @todo
|
@@ -487,13 +519,13 @@ module Gitee::Gitee4CLI::API
|
|
487
519
|
#
|
488
520
|
# @return [String] JSON响应体
|
489
521
|
#
|
490
|
-
# @HTTP
|
522
|
+
# @HTTP [PUT] https://gitee.com/api/v5/repos/{owner}/{repo}/clear
|
491
523
|
#
|
492
524
|
def self.clear(owner, repo)
|
493
525
|
access_token = get_token
|
494
526
|
@params = {access_token:}
|
495
527
|
@path = sprintf "repos/%s/%s/clear", owner, repo
|
496
|
-
@
|
528
|
+
@method = 'put'
|
497
529
|
make_api_request
|
498
530
|
# TODO: put
|
499
531
|
end
|
@@ -504,19 +536,15 @@ module Gitee::Gitee4CLI::API
|
|
504
536
|
#
|
505
537
|
# @return [Result] JSON响应体
|
506
538
|
#
|
507
|
-
# @HTTP
|
539
|
+
# @HTTP [POST] https://gitee.com/api/v5/user/repos
|
508
540
|
#
|
509
541
|
def self.create(repo)
|
510
542
|
access_token = get_token
|
511
543
|
@params = {access_token:, name: repo}
|
512
544
|
@path = "user/repos"
|
513
|
-
@
|
545
|
+
@method = 'post'
|
514
546
|
make_api_request
|
515
|
-
|
516
|
-
Result[true, JSON.parse(@body)]
|
517
|
-
else
|
518
|
-
Result[false, @status.to_s]
|
519
|
-
end
|
547
|
+
return_response_which_expect HttpStatusCode::Created
|
520
548
|
end
|
521
549
|
|
522
550
|
# Get the README from a owner's repo
|
@@ -526,42 +554,107 @@ module Gitee::Gitee4CLI::API
|
|
526
554
|
#
|
527
555
|
# @return [Result] JSON响应体
|
528
556
|
#
|
529
|
-
# @HTTP
|
557
|
+
# @HTTP [GET] https://gitee.com/api/v5/repos/{owner}/{repo}/readme
|
530
558
|
#
|
531
559
|
def self.readme(owner, repo)
|
532
560
|
access_token = get_token
|
533
561
|
@params = {access_token:}
|
534
562
|
@path = sprintf "repos/%s/%s/readme", owner, repo
|
535
|
-
@
|
563
|
+
@method = 'get'
|
536
564
|
make_api_request
|
537
|
-
|
538
|
-
Result[true, JSON.parse(@body)]
|
539
|
-
else
|
540
|
-
Result[false, @status.to_s]
|
541
|
-
end
|
565
|
+
return_response_which_expect HttpStatusCode::Ok
|
542
566
|
end
|
543
567
|
|
544
568
|
# List repos from a user
|
545
569
|
#
|
546
|
-
# @param
|
570
|
+
# @param username [String] 用户名
|
547
571
|
#
|
548
572
|
# @return [Result] JSON响应体
|
549
573
|
#
|
550
|
-
# @HTTP
|
574
|
+
# @HTTP [GET] https://gitee.com/api/v5/users/{username}/repos
|
551
575
|
#
|
552
576
|
def self.list_for_user(username)
|
553
577
|
access_token = get_token
|
554
578
|
@params = {access_token:, per_page: 50} # default per_page set to 50 (max 100)
|
555
579
|
@path = sprintf "users/%s/repos", username
|
556
|
-
@
|
580
|
+
@method = 'get'
|
557
581
|
make_api_request
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
582
|
+
return_response_which_expect HttpStatusCode::Ok
|
583
|
+
end
|
584
|
+
end
|
585
|
+
|
586
|
+
|
587
|
+
# Issues APIs
|
588
|
+
#
|
589
|
+
# @see https://gitee.com/api/v5/swagger#/getV5ReposOwnerRepoIssues
|
590
|
+
#
|
591
|
+
module Issues
|
592
|
+
|
593
|
+
extend CommonUtilities
|
594
|
+
|
595
|
+
# Get all issues
|
596
|
+
#
|
597
|
+
# @HTTP [GET] https://gitee.com/api/v5/repos/{owner}/{repo}/issues
|
598
|
+
#
|
599
|
+
def self.all(owner, repo, state)
|
600
|
+
access_token = get_token
|
601
|
+
@params = {access_token:, state:}
|
602
|
+
@path = sprintf "repos/%s/%s/issues", owner, repo
|
603
|
+
@method = 'get'
|
604
|
+
make_api_request
|
605
|
+
return_response_which_expect HttpStatusCode::Ok
|
606
|
+
end
|
607
|
+
end
|
608
|
+
|
609
|
+
|
610
|
+
# Gists APIs
|
611
|
+
#
|
612
|
+
module Gists
|
613
|
+
extend CommonUtilities
|
614
|
+
|
615
|
+
# Create a gist
|
616
|
+
#
|
617
|
+
# @param path [Pathname] 文件路径,Gitee提供的API同时支持多个文件,但是我们为了方便,只传一个文件
|
618
|
+
# @param desc [String] gist的描述
|
619
|
+
#
|
620
|
+
# @HTTP [POST] https://gitee.com/api/v5/gists
|
621
|
+
#
|
622
|
+
def self.create(path, description)
|
623
|
+
access_token = get_token
|
624
|
+
|
625
|
+
begin
|
626
|
+
file = path.read
|
627
|
+
rescue => e
|
628
|
+
puts %(Error: #{e.message})
|
629
|
+
return
|
562
630
|
end
|
631
|
+
|
632
|
+
# 如果文件有后缀,Gitee Gist 自动识别文件类型
|
633
|
+
files = { path.basename.to_s => {"content" => file }}
|
634
|
+
|
635
|
+
# 这个只能使用 HTTP.post :json 和这个files[Hash]搭配发送请求,
|
636
|
+
# 而用 HTTP.post :form 以及 files.to_json 发送请求有bug
|
637
|
+
@json_data = {access_token:, files:, description:}
|
638
|
+
|
639
|
+
@path = "gists"
|
640
|
+
@method = 'post'
|
641
|
+
make_api_request
|
642
|
+
return_response_which_expect HttpStatusCode::Created
|
563
643
|
end
|
564
644
|
|
645
|
+
|
646
|
+
# List your gists
|
647
|
+
#
|
648
|
+
# @HTTP [GET] https://gitee.com/api/v5/gists
|
649
|
+
#
|
650
|
+
def self.list
|
651
|
+
access_token = get_token
|
652
|
+
@params = {access_token:}
|
653
|
+
@path = "gists"
|
654
|
+
@method = 'get'
|
655
|
+
make_api_request
|
656
|
+
return_response_which_expect HttpStatusCode::Ok
|
657
|
+
end
|
565
658
|
end
|
566
659
|
|
567
|
-
end
|
660
|
+
end # End of module Gitee::Gitee4CLI::API
|
data/lib/gitee-cli.rb
CHANGED
@@ -1,15 +1,13 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
1
|
# ---------------------------------------------------------------
|
3
2
|
# File : gitee-cli.rb
|
4
3
|
# Authors : Aoran Zeng <ccmywish@qq.com>
|
5
4
|
# Created on : <2023-04-29>
|
6
|
-
# Last modified : <2023-
|
5
|
+
# Last modified : <2023-05-31>
|
7
6
|
#
|
8
7
|
# gitee-cli:
|
9
8
|
#
|
10
9
|
# Require two lib files
|
11
|
-
#
|
12
10
|
# ---------------------------------------------------------------
|
13
11
|
|
14
|
-
|
15
|
-
|
12
|
+
require_relative 'gitee/cli'
|
13
|
+
require_relative 'gitee/gitee4cli/api'
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gitee-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aoran Zeng
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-05-
|
11
|
+
date: 2023-05-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 13.0.6
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 13.0.6
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: http
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,6 +66,34 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0.7'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: standard_path
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.1'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.1'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rainbow
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.1'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3.1'
|
69
97
|
description: 'Work with Gitee from the command line.
|
70
98
|
|
71
99
|
'
|
@@ -84,8 +112,7 @@ files:
|
|
84
112
|
- images/banner.jpg
|
85
113
|
- lib/gitee-cli.rb
|
86
114
|
- lib/gitee/cli.rb
|
87
|
-
- lib/gitee/cli/
|
88
|
-
- lib/gitee/gitee4cli.rb
|
115
|
+
- lib/gitee/cli/front.rb
|
89
116
|
- lib/gitee/gitee4cli/api.rb
|
90
117
|
homepage: https://gitee.com/ccmywish
|
91
118
|
licenses:
|
@@ -101,7 +128,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
101
128
|
requirements:
|
102
129
|
- - ">="
|
103
130
|
- !ruby/object:Gem::Version
|
104
|
-
version: 3.
|
131
|
+
version: 3.0.0
|
105
132
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
133
|
requirements:
|
107
134
|
- - ">="
|
data/lib/gitee/gitee4cli.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
# ---------------------------------------------------------------
|
2
|
-
# File : gitee4cli.rb
|
3
|
-
# Authors : Aoran Zeng <ccmywish@qq.com>
|
4
|
-
# Created on : <2023-04-29>
|
5
|
-
# Last modified : <2023-04-29>
|
6
|
-
#
|
7
|
-
# gitee4cli:
|
8
|
-
#
|
9
|
-
# Third party Gitee modules for Ruby
|
10
|
-
#
|
11
|
-
# ---------------------------------------------------------------
|
12
|
-
|
13
|
-
module Gitee
|
14
|
-
|
15
|
-
module Gitee4CLI
|
16
|
-
URL = "https://gitee.com"
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
20
|
-
|
21
|
-
require 'gitee/gitee4cli/api'
|