osdn-cli 0.1.0 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b112818b94a14506ce16587ecca79060d8fd447e
4
- data.tar.gz: 15c6f3d06ca910ebae2dda3abd5d8b22c1c2169b
3
+ metadata.gz: 3759e4938c466aabe1fe7785b08a4ca5f4a806bd
4
+ data.tar.gz: 4c43e36f2d32cc72b762ac806ad671a94253c690
5
5
  SHA512:
6
- metadata.gz: 4820389e4c6957b86eaec4f07707764560a29d7b586c1419208a881b3b323dba5517fad4716470ffb4a81310ca507d3a277d421594baa4f76de76870e03cb583
7
- data.tar.gz: 6650387119977cda48219b8e1c75d685d0591d3fbd78220e4d845986529caabc32d5badbdc77d49b89ed1c6e4427f9bd7ae497d99bf0afc5a88e52ea23a3ace9
6
+ metadata.gz: 7bdf87b13b4232df6fe9adc06156d6ea715b626d170b4dc783311751a51650781be4c76005e82b3a03cf9b319f2fe7932fa85e9752c72582c5f981c6ccd3ccbe
7
+ data.tar.gz: 153e2c964252820c5050972c0ea138afb8730a4e8fd55814237d844cfc89d85381aedfc5e6ca3dc99e36e8fe86ad82a34832290c04e63071cd8125c9d422b1f0
data/ChangeLog CHANGED
@@ -1,3 +1,8 @@
1
+ 2016-05-10 Tatsuki Sugiura <sugi@nemui.org>
2
+
3
+ * Version 0.1.1
4
+ * frs_uplaod: Support partial upload.
5
+
1
6
  2016-03-25 Tatsuki Sugiura <sugi@nemui.org>
2
7
 
3
8
  * Version 0.1.0
data/README.md CHANGED
@@ -49,3 +49,8 @@ To get command list use help.
49
49
 
50
50
  Bug reports and pull requests are welcome on OSDN at https://osdn.jp/projects/osdn-codes/ticket/
51
51
 
52
+ ## License
53
+
54
+ Copyright (c) 2016 OSDN
55
+
56
+ Source files and gem are distributed under MIT License.
@@ -5,8 +5,8 @@ module OSDN; module CLI; module Command
5
5
  puts "Options:"
6
6
  puts " -n --dry-run Do noting (use with global -v to inspect)"
7
7
  puts " -p --project=<project> Target project (numeric id or name)"
8
- #puts " --package=<project> Target package (numeric id)"
9
- #puts " --release=<project> Target release (numeric id)"
8
+ puts " --package=<package-id> Target package (numeric id)"
9
+ puts " --release=<release-id> Target release (numeric id)"
10
10
  puts " -v --visibility=<public|private|hidden>"
11
11
  puts " Default visibility for newly created items"
12
12
  puts " --force-digest Calc local file digest forcely"
@@ -17,7 +17,8 @@ module OSDN; module CLI; module Command
17
17
  opts = GetoptLong.new(
18
18
  [ '--dry-run', '-n', GetoptLong::NO_ARGUMENT ],
19
19
  [ '--project', '-p', GetoptLong::REQUIRED_ARGUMENT ],
20
- [ '--release', '-r', GetoptLong::REQUIRED_ARGUMENT ],
20
+ [ '--package', GetoptLong::REQUIRED_ARGUMENT ],
21
+ [ '--release', GetoptLong::REQUIRED_ARGUMENT ],
21
22
  [ '--visibility', '-v', GetoptLong::REQUIRED_ARGUMENT ],
22
23
  [ '--force-digest', GetoptLong::NO_ARGUMENT],
23
24
  )
@@ -26,12 +27,12 @@ module OSDN; module CLI; module Command
26
27
  when '--project'
27
28
  arg.empty? or
28
29
  @target_proj = arg
29
- #when '--release'
30
- # arg.empty? or
31
- # @target_release = arg
32
- #when '--package'
33
- # arg.empty? or
34
- # @target_package = arg
30
+ when '--release'
31
+ arg.empty? or
32
+ @target_release = arg
33
+ when '--package'
34
+ arg.empty? or
35
+ @target_package = arg
35
36
  when '--visibility'
36
37
  unless %w(public private hidden).member?(arg)
37
38
  logger.fatal "Invalid visibility status: #{arg}"
@@ -48,127 +49,147 @@ module OSDN; module CLI; module Command
48
49
  @target_dir = Pathname.new(ARGV.shift || '.')
49
50
  proj_info = api.get_project target_proj # check project existance
50
51
 
51
- Pathname.glob(@target_dir+'*').sort.each do |pdir|
52
- if cur_pkgid = load_variables(pdir).package_id
53
- # check package existance on server
52
+ vars = load_variables(@target_dir)
53
+
54
+ if @target_release || vars.release_id
55
+ process_release(@target_dir)
56
+ elsif @target_package || vars.package_id
57
+ process_package(@target_dir)
58
+ else
59
+ Pathname.glob(@target_dir+'*').sort.each do |pdir|
60
+ process_package(pdir)
61
+ end
62
+ end
63
+ end
64
+
65
+ def self.description
66
+ "Upload local file tree and create package/release implicitly."
67
+ end
68
+
69
+ def process_package(pdir)
70
+ if cur_pkgid = load_variables(pdir).package_id
71
+ # check package existance on server
72
+ begin
73
+ api.get_package target_proj, target_package(pdir)
74
+ rescue OSDNClient::ApiError => e
54
75
  begin
55
- api.get_package target_proj, target_package(pdir)
56
- rescue OSDNClient::ApiError => e
57
- begin
58
- err = JSON.parse(e.response_body)
59
- rescue
60
- raise e
61
- end
62
- if err['status'] == 404
63
- logger.warn "Package ##{cur_pkgid} has been deleted on server and local directory '#{pdir}' remains. You can delete the local directory or delete '#{pdir}/.osdn.vars' file to create a package again with new ID."
64
- next
65
- end
76
+ err = JSON.parse(e.response_body)
77
+ rescue
66
78
  raise e
67
79
  end
68
- else
69
- logger.info "Createing new package '#{pdir.basename}'"
70
- if @dry_run
71
- pinfo = Hashie::Mash.new id: '(dry-run)', name: pdir.basename, url: '(dry-run)'
72
- else
73
- pinfo = api.create_package target_proj, pdir.basename, visibility: @visibility
74
- update_variables pdir, package_id: pinfo.id
80
+ if err['status'] == 404
81
+ logger.warn "Package ##{cur_pkgid} has been deleted on server and local directory '#{pdir}' remains. You can delete the local directory or delete '#{pdir}/.osdn.vars' file to create a package again with new ID."
82
+ return false
75
83
  end
76
- $stdout.puts "New package '#{pinfo.name}' has been created; #{pinfo.url}"
84
+ raise e
77
85
  end
86
+ else
87
+ logger.info "Createing new package '#{pdir.basename}'"
88
+ if @dry_run
89
+ pinfo = Hashie::Mash.new id: '(dry-run)', name: pdir.basename, url: '(dry-run)'
90
+ else
91
+ pinfo = api.create_package target_proj, pdir.basename, visibility: @visibility
92
+ update_variables pdir, package_id: pinfo.id
93
+ end
94
+ $stdout.puts "New package '#{pinfo.name}' has been created; #{pinfo.url}"
95
+ end
78
96
 
79
- Pathname.glob(pdir + '*').sort.each do |rdir|
80
- if !rdir.directory?
81
- logger.warn "Skip normal file '#{rdir}' in release level"
82
- next
83
- end
97
+ Pathname.glob(pdir + '*').sort.each do |rdir|
98
+ process_release(rdir)
99
+ end
100
+ end
101
+
102
+ def process_release(rdir)
103
+ if !rdir.directory?
104
+ logger.warn "Skip normal file '#{rdir}' in release level"
105
+ return false
106
+ end
84
107
 
85
- vars = load_variables(rdir)
86
- rinfo = nil
87
- if vars.release_id
88
- begin
89
- rinfo = api.get_release target_proj, target_package(rdir), target_release(rdir)
90
- rescue OSDNClient::ApiError => e
91
- begin
92
- err = JSON.parse(e.response_body)
93
- rescue
94
- raise e
95
- end
96
- if err['status'] == 404
97
- logger.warn "Release ##{vars.release_id} has been deleted on server and local directory '#{rdir}' remains. You can delete the local directory or delete '#{rdir}/.osdn.vars' file to create a release again with new ID."
98
- next
99
- end
100
- raise e
101
- end
102
- else vars.release_id
103
- logger.info "Createing new release '#{rdir.basename}'"
104
- if @dry_run
105
- rinfo = Hashie::Mash.new id: '(dry-run)', name: rdir.basename, url: '(dry-run)', files: []
106
- else
107
- rinfo = api.create_release target_proj, target_package(rdir), rdir.basename, visibility: @visibility
108
- update_variables rdir, release_id: rinfo.id
109
- end
110
- $stdout.puts "New release '#{rinfo.name}' has been created; #{rinfo.url}"
108
+ vars = load_variables(rdir)
109
+ rinfo = nil
110
+ if vars.release_id
111
+ begin
112
+ rinfo = api.get_release target_proj, target_package(rdir), target_release(rdir)
113
+ rescue OSDNClient::ApiError => e
114
+ begin
115
+ err = JSON.parse(e.response_body)
116
+ rescue
117
+ raise e
111
118
  end
112
-
113
- Pathname.glob(rdir + '*').sort.each do |file|
114
- if file.directory?
115
- logger.error "Skip direcotry #{file}"
116
- next
117
- end
118
-
119
- vars = load_variables(rdir)
120
- digests = nil
121
- if !@force_digest && vars.local_file_info &&
122
- vars.local_file_info[file.basename.to_s]
123
- finfo = vars.local_file_info[file.basename.to_s]
124
- if finfo[:size] == file.size && finfo.mtime == file.mtime
125
- digests = vars.local_file_info[file.basename.to_s].digests
126
- end
127
- end
128
-
129
- unless digests
130
- logger.info "Calculating digest for #{file}..."
131
- digests = {
132
- sha256: hexdigest(Digest::SHA256, file),
133
- sha1: hexdigest(Digest::SHA1, file),
134
- md5: hexdigest(Digest::MD5, file),
135
- }
136
- update_variables rdir, {local_file_info: {file.basename.to_s => {digests: digests, mtime: file.mtime, size: file.size}}}
137
- end
138
- if remote_f = rinfo.files.find { |f| f.name == file.basename.to_s }
139
- if digests.find { |type, dig| dig != remote_f.send("digest_#{type}") }
140
- logger.error "#{file} was changed from remote file! Please delete remote file before uploading new one."
141
- end
142
- logger.info "Skip already uploaded file '#{file}'"
143
- else
144
- logger.info "Uploading file #{file} (#{file.size} bytes)"
145
- if @dry_run
146
- finfo = Hashie::Mash.new id: '(dry-run)', url: '(dry-run)'
147
- else
148
- logger.level <= Logger::INFO and
149
- OSDN::CLI._show_progress = true
150
- fio = file.open
151
- logger.info "Starting upload #{file}..."
152
- finfo = api.create_release_file target_proj, target_package(rdir), target_release(rdir), fio, visibility: @visibility
153
- fio.close
154
- OSDN::CLI._show_progress = false
155
- if digests.find { |type, dig| dig != finfo.send("digest_#{type}") }
156
- logger.error "File digests are mismatch! Upload file #{file} may be broken! Please check."
157
- else
158
- logger.info "Upload complete."
159
- end
160
- end
161
- $stdout.puts "New file '#{file}' has been uploaded; #{finfo.url}"
162
- end
119
+ if err['status'] == 404
120
+ logger.warn "Release ##{vars.release_id} has been deleted on server and local directory '#{rdir}' remains. You can delete the local directory or delete '#{rdir}/.osdn.vars' file to create a release again with new ID."
121
+ return false
163
122
  end
123
+ raise e
164
124
  end
125
+ else vars.release_id
126
+ logger.info "Createing new release '#{rdir.basename}'"
127
+ if @dry_run
128
+ rinfo = Hashie::Mash.new id: '(dry-run)', name: rdir.basename, url: '(dry-run)', files: []
129
+ else
130
+ rinfo = api.create_release target_proj, target_package(rdir), rdir.basename, visibility: @visibility
131
+ update_variables rdir, release_id: rinfo.id
132
+ end
133
+ $stdout.puts "New release '#{rinfo.name}' has been created; #{rinfo.url}"
134
+ end
135
+ Pathname.glob(rdir + '*').sort.each do |file|
136
+ process_file(file, rdir, rinfo)
165
137
  end
166
138
  end
167
139
 
168
- def self.description
169
- "Upload local file tree and create package/release implicitly."
170
- end
140
+ def process_file(file, rdir, rinfo)
141
+ if file.directory?
142
+ logger.error "Skip direcotry #{file}"
143
+ return false
144
+ end
145
+
146
+ vars = load_variables(rdir)
147
+ digests = nil
148
+ if !@force_digest && vars.local_file_info &&
149
+ vars.local_file_info[file.basename.to_s]
150
+ finfo = vars.local_file_info[file.basename.to_s]
151
+ if finfo[:size] == file.size && finfo.mtime == file.mtime
152
+ digests = vars.local_file_info[file.basename.to_s].digests
153
+ end
154
+ end
155
+
156
+ unless digests
157
+ logger.info "Calculating digest for #{file}..."
158
+ digests = {
159
+ sha256: hexdigest(Digest::SHA256, file),
160
+ sha1: hexdigest(Digest::SHA1, file),
161
+ md5: hexdigest(Digest::MD5, file),
162
+ }
163
+ update_variables rdir, {local_file_info: {file.basename.to_s => {digests: digests, mtime: file.mtime, size: file.size}}}
164
+ end
165
+ if remote_f = rinfo.files.find { |f| f.name == file.basename.to_s }
166
+ if digests.find { |type, dig| dig != remote_f.send("digest_#{type}") }
167
+ logger.error "#{file} was changed from remote file! Please delete remote file before uploading new one."
168
+ end
169
+ logger.info "Skip already uploaded file '#{file}'"
170
+ return
171
+ end
171
172
 
173
+ logger.info "Uploading file #{file} (#{file.size} bytes)"
174
+ if @dry_run
175
+ finfo = Hashie::Mash.new id: '(dry-run)', url: '(dry-run)'
176
+ else
177
+ logger.level <= Logger::INFO and
178
+ OSDN::CLI._show_progress = true
179
+ fio = file.open
180
+ logger.info "Starting upload #{file}..."
181
+ finfo = api.create_release_file target_proj, target_package(rdir), target_release(rdir), fio, visibility: @visibility
182
+ fio.close
183
+ OSDN::CLI._show_progress = false
184
+ if digests.find { |type, dig| dig != finfo.send("digest_#{type}") }
185
+ logger.error "File digests are mismatch! Upload file #{file} may be broken! Please check."
186
+ else
187
+ logger.info "Upload complete."
188
+ end
189
+ end
190
+ $stdout.puts "New file '#{file}' has been uploaded; #{finfo.url}"
191
+ end
192
+
172
193
  private
173
194
  def target_proj
174
195
  @target_proj and return @target_proj
@@ -10,7 +10,7 @@ module OSDN; module CLI; module Command
10
10
  puts "Options:"
11
11
  puts " -f --format=<pretty|json> Set output format"
12
12
  puts " -p --project=<project> Target project (numeric id or name)"
13
- puts " --package=<project> Target package (numeric id)"
13
+ puts " --package=<package-id> Target package (numeric id)"
14
14
  puts " -v --visibility=<public|private|hidden>"
15
15
  end
16
16
 
@@ -11,8 +11,8 @@ module OSDN; module CLI; module Command
11
11
  puts "Options:"
12
12
  puts " -f --format=<pretty|json> Set output format"
13
13
  puts " -p --project=<project> Target project (numeric id or name)"
14
- puts " --package=<project> Target package (numeric id)"
15
- puts " --release=<project> Target release (numeric id)"
14
+ puts " --package=<package-id> Target package (numeric id)"
15
+ puts " --release=<release-id> Target release (numeric id)"
16
16
  puts " -v --visibility=<public|private|hidden>"
17
17
  puts " --force-digest Calc local file digest forcely"
18
18
  end
@@ -1,5 +1,5 @@
1
1
  module OSDN
2
2
  module CLI
3
- VERSION = "0.1.0"
3
+ VERSION = "0.1.1"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: osdn-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - OSDN
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-03-25 00:00:00.000000000 Z
11
+ date: 2016-05-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -59,6 +59,9 @@ dependencies:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: 0.0.20160304
62
+ - - "<"
63
+ - !ruby/object:Gem::Version
64
+ version: 1.0.0
62
65
  type: :runtime
63
66
  prerelease: false
64
67
  version_requirements: !ruby/object:Gem::Requirement
@@ -66,6 +69,9 @@ dependencies:
66
69
  - - ">="
67
70
  - !ruby/object:Gem::Version
68
71
  version: 0.0.20160304
72
+ - - "<"
73
+ - !ruby/object:Gem::Version
74
+ version: 1.0.0
69
75
  - !ruby/object:Gem::Dependency
70
76
  name: hashie
71
77
  requirement: !ruby/object:Gem::Requirement
@@ -104,7 +110,8 @@ files:
104
110
  - lib/osdn/cli/runner.rb
105
111
  - lib/osdn/cli/version.rb
106
112
  homepage: https://osdn.jp/projects/osdn-codes/wiki/CommandLineInterface
107
- licenses: []
113
+ licenses:
114
+ - MIT
108
115
  metadata: {}
109
116
  post_install_message:
110
117
  rdoc_options: []