delete_derived_data 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f80bfe4f6605d37411e9448fe83f8b51a49d3bf758ccb7e06825e2fe6202c508
4
+ data.tar.gz: 2a031dc848460a5250a578d522105cb654b36c72781ccb926202bb1eece66f85
5
+ SHA512:
6
+ metadata.gz: dde7195c24042679dae743e345663d488d8a3d72916719888ea5cf812b7a25164e6f78580ffd606662fdfed798f1c14ec43ee0715f8b7e608c2b21abe908be04
7
+ data.tar.gz: 527bf98c50f94d2c44e8a0c462955bf6ac099d55fab33920895b690417fba74011e92f0774cb0dd65192118f7b8c5005f2123e3217b232c4048c692b64ac32cc
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ if $PROGRAM_NAME == __FILE__
4
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
5
+ end
6
+
7
+ require 'delete_derived_data'
8
+ require 'optparse'
9
+
10
+ options = {}
11
+
12
+ OptionParser.new do |opts|
13
+ opts.banner = "Usage: delete_derived_data [options] | delete_derived_data"
14
+
15
+ opts.on('-d', '--directory PATH', "Directory that should be searching") do |path|
16
+ options[:root_dir] = path
17
+ end
18
+
19
+ opts.on('-a', '--archives', "Xcode Archives should be deleted") do |a|
20
+ options[:archives] = a
21
+ end
22
+
23
+ opts.on('-s', '--sempty', "Secure empty trash contents") do |s|
24
+ options[:sempty] = s
25
+ end
26
+
27
+ opts.on('-t', '--trash', "Empty trash contents") do |t|
28
+ options[:trash] = t
29
+ end
30
+
31
+ opts.on("-V", '--verbose', "Show more debugging information") do |v|
32
+ options[:verbose] = v
33
+ end
34
+
35
+ opts.on_tail('-h', '--help', 'Show this message') { puts opts; exit }
36
+ opts.on_tail("-v", "--version", "Show version") { puts DeleteDerivedData::VERSION; exit }
37
+ opts.parse!
38
+
39
+ end
40
+
41
+ DeleteDerivedData.delete(options)
@@ -0,0 +1,32 @@
1
+
2
+ require "find"
3
+ require "pathname"
4
+ require "tty-table"
5
+ require "tty-spinner"
6
+ require "delete_derived_data/trash"
7
+
8
+ require "tty-prompt"
9
+
10
+ module DeleteDerivedData
11
+ class Delete
12
+ def self.run(paths, options)
13
+ if paths == nil || paths.length <= 0
14
+ puts "No Data to be cleaning!"
15
+ return nil
16
+ end
17
+
18
+ paths.each {|d| Trash.move_to_trash(d)}
19
+
20
+ prompt = TTY::Prompt.new(enable_color: false, interrupt: :signal)
21
+ answer = options[:trash] || prompt.yes?("Are you sure you want to empty the trash (this cannot be undone)?")
22
+ return if !answer
23
+
24
+ if options[:sempty]
25
+ Trash.empty_securely_trash()
26
+ else
27
+ Trash.empty_trash()
28
+ end
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,97 @@
1
+
2
+ require "delete_derived_data/utils"
3
+
4
+ module DeleteDerivedData
5
+ class Search
6
+ attr_accessor :verbose, :root_dir
7
+
8
+ def initialize(options = {})
9
+ @verbose = options[:verbose]
10
+ @root_dir = options[:root_dir] || ENV["HOME"]
11
+ end
12
+
13
+ def to_s
14
+ "#{verbose} #{root_dir}"
15
+ end
16
+
17
+ def getDerivedDatas
18
+
19
+ directory_paths = get_directory_paths(root_dir)
20
+ derived_paths = []
21
+ threads = []
22
+
23
+ table = TTY::Table.new(["Directory paths to be search"], directory_paths.map { |f| [f] })
24
+ puts table.render(:ascii)
25
+
26
+ directory_paths.each do |folder|
27
+ threads << Thread.new {
28
+ begin
29
+ Find.find(folder, ignore_error: true) {|path| derived_paths << path if path =~ /.*\DerivedData$/}
30
+ rescue Exception => e
31
+ puts e.message
32
+ end
33
+ }
34
+ end
35
+
36
+ spinner = TTY::Spinner.new("[:spinner] Search Derived Data ...", format: :dots_2)
37
+ spinner.auto_spin
38
+
39
+ threads.each {|t| t.join}
40
+
41
+ derived_size = 0
42
+ data = [:separator]
43
+ derived_paths.each { |d|
44
+ size = Filesize.dirSize(d)
45
+ derived_size = derived_size + size
46
+ data << [d, Filesize.size(size)] if verbose
47
+ }
48
+ data << :separator
49
+ data << ["Derived Data total size", Filesize.size(derived_size)]
50
+
51
+ spinner.stop
52
+
53
+ table = TTY::Table.new(["DerivedData", "Size"], data)
54
+ puts table.render(:ascii, alignments: [:left, :right], padding: [0,1,0,1])
55
+
56
+ derived_paths
57
+
58
+ end
59
+
60
+ def getArchives
61
+
62
+ spinner = TTY::Spinner.new("[:spinner] Search Xcode Archives ...", format: :dots_2)
63
+ spinner.auto_spin
64
+
65
+ xcode_archives = []
66
+ data = []
67
+ xcode_archives_size = 0
68
+
69
+ data << :separator
70
+ Dir["#{ENV["HOME"]}/Library/Developer/Xcode/Archives/**"].select { |d|
71
+ size = Filesize.dirSize(d)
72
+ xcode_archives_size = xcode_archives_size + size
73
+ data << [d, Filesize.size(size)] if verbose
74
+ xcode_archives << d
75
+ }
76
+ data << :separator
77
+ data << ["Xcode Archives total size", Filesize.size(xcode_archives_size)]
78
+
79
+ spinner.stop
80
+
81
+ table = TTY::Table.new(["Xcode Archives", "Size"], data)
82
+ puts table.render(:ascii, alignments: [:left, :right], padding: [0,1,0,1])
83
+
84
+ xcode_archives
85
+
86
+ end
87
+
88
+ private
89
+
90
+ def get_directory_paths(root_dir)
91
+ Pathname.new(root_dir).children.select { |c|
92
+ c.directory? && c.zero? == false && c.blockdev? == false && c.basename.to_s[0] != '.'
93
+ }
94
+ end
95
+ end
96
+
97
+ end
@@ -0,0 +1,26 @@
1
+
2
+ module DeleteDerivedData
3
+ class Trash
4
+ def self.move_to_trash(file)
5
+ puts "Telling Finder to move the file #{file} to trash... "
6
+ IO.popen("osascript", "w") do |stdin|
7
+ stdin.puts %Q{tell app "Finder" to move the POSIX file "#{file}" to trash}
8
+ end
9
+ end
10
+
11
+ def self.empty_trash
12
+ puts "Telling Finder to empty trash... "
13
+ IO.popen("osascript", "w") do |stdin|
14
+ stdin.puts %Q{tell app "Finder" to empty trash}
15
+ end
16
+ end
17
+
18
+ def self.empty_securely_trash
19
+ puts "Telling Finder to securely empty trash... "
20
+ IO.popen("osascript", "w") do |stdin|
21
+ stdin.puts %Q{tell app "Finder" to empty trash with security}
22
+ end
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,18 @@
1
+
2
+ module DeleteDerivedData
3
+ class Filesize
4
+ def self.dirSize(path)
5
+ File.size(path) + Dir["#{path}/**/*"].select { |f| File.file?(f) }.sum { |f| File.size(f) }
6
+ end
7
+
8
+ def self.size(size)
9
+ units = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'Pib', 'EiB']
10
+
11
+ return '0.0 B' if size == 0
12
+ exp = (Math.log(size) / Math.log(1024)).to_i
13
+ exp = 6 if exp > 6
14
+
15
+ '%.1f %s' % [size.to_f / 1024 ** exp, units[exp]]
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ module DeleteDerivedData
2
+ VERSION = "0.0.2".freeze
3
+ end
@@ -0,0 +1,20 @@
1
+
2
+ require "delete_derived_data/search"
3
+ require "delete_derived_data/delete"
4
+ require "delete_derived_data/version"
5
+
6
+ module DeleteDerivedData
7
+ def self.delete(options = {})
8
+ search = Search.new(options)
9
+ derived_paths = search.getDerivedDatas
10
+ archives_paths = search.getArchives if options[:archives]
11
+
12
+ if !derived_paths.nil? && derived_paths.length > 0
13
+ Delete.run(derived_paths, options)
14
+ end
15
+
16
+ if !archives_paths.nil? && archives_paths.length > 0
17
+ Delete.run(archives_paths, options)
18
+ end
19
+ end
20
+ end
data/lib/main2.rb ADDED
@@ -0,0 +1,261 @@
1
+
2
+ require 'find'
3
+ require "tty-spinner"
4
+ require "tty-prompt"
5
+ require "tty-table"
6
+ require 'trash'
7
+
8
+ require "pathname"
9
+
10
+ require 'logger'
11
+
12
+ class DerivedData
13
+ def self.hi(language = "english")
14
+ cmd = 'ls'
15
+ system(cmd)
16
+
17
+ puts "Hello world!"
18
+ puts language
19
+ spinner = TTY::Spinner.new("[:spinner] Loading ...", format: :pulse_2)
20
+
21
+ spinner.auto_spin # Automatic animation with default interval
22
+
23
+ # sleep(2) # Perform task
24
+
25
+ derived_paths = []
26
+ # Find.find('../..') do |path|
27
+ # derived_paths << path if path =~ /.*\DerivedData$/
28
+ # end
29
+ Find.find('../') do |path|
30
+ # derived_paths << File.expand_path(path, __dir__) if path =~ /.*\DerivedData$/
31
+ derived_paths << path if path =~ /.*\DerivedData$/
32
+ end
33
+
34
+ spinner.stop("Done!") # Stop animation
35
+
36
+ puts derived_paths
37
+ # trash = Trash.new
38
+ # trash.throw_out(*derived_paths)
39
+ # Trash.new.throw_out(*derived_paths)
40
+
41
+ somedir = derived_paths?.first
42
+ # FileUtils.mv(derived_paths.first, File.expand_path('~/.Trash/'))
43
+ if File.directory?(somedir)
44
+ puts somedir
45
+ FileUtils.remove_dir(somedir)
46
+ end
47
+
48
+ end
49
+
50
+ def self.clean
51
+ # cmd = 'sh delete_all_derived_data.sh'
52
+ # system(cmd)
53
+
54
+ # cmd = "echo 'hi'"
55
+ # value = %x( echo 'hi' )
56
+ # value = %x[ #{cmd} ]
57
+ # wasGood = system( "echo 'hi'" )
58
+ # wasGood = system( cmd )
59
+
60
+ spinner = TTY::Spinner.new("[:spinner] Search ...", format: :dots_2)
61
+ spinner.auto_spin
62
+ # puts File.expand_path('../', __dir__)
63
+ # system('find ../ -type d -name "DerivedData" 2>/dev/null -exec trash -v {} +')
64
+ # system('trash -e')
65
+ somedir = "/Users/nicolaerogojan/gitRepository/Personal/delete_all_derived_data/DerivedData"
66
+ # FileUtils.remove_dir(somedir)
67
+ system("echo #{somedir}")
68
+ # system("trash #{somedir}") # OK
69
+
70
+ system("trash", "-v", "#{somedir}")
71
+ # system("trash -e")
72
+ spinner.stop("Done!")
73
+ end
74
+
75
+ def find
76
+ logger = Logger.new(STDOUT)
77
+ logger.level = Logger::DEBUG
78
+ logger.debug(Dir.home)
79
+ puts "Started At #{Time.now}"
80
+
81
+ spinner = TTY::Spinner.new("[:spinner] Search ...", format: :dots_2)
82
+ spinner.auto_spin
83
+
84
+ # base_dir_path = Dir.home
85
+ # base_dir_path = "/Users/nicolaerogojan/gitRepository"
86
+ # base_dir_path = "/Users/nicolaerogojan/gitRepository/Personal/delete_all_derived_data"
87
+ base_dir_path = "/Users/nicolaerogojan/.Trash"
88
+ # directory_paths = Dir.glob(File.join(base_dir_path, '*', ''))
89
+ directory_paths = Pathname.new(base_dir_path).children.select { |c| c.directory? && c.basename(path)[0] != ?. }
90
+
91
+ logger.debug base_dir_path
92
+ logger.debug directory_paths
93
+
94
+ derived_paths = []
95
+ arr = []
96
+
97
+ # directory_paths.each do |f|
98
+ # arr << Thread.new {
99
+ # Find.find(f) {|path| derived_paths << path if path =~ /.*\DerivedData$/}
100
+ # }
101
+ # end
102
+
103
+ # directory_paths.each do |folder|
104
+ # Find.find(folder) do |path|
105
+ # if FileTest.directory?(path)
106
+ # if File.basename(path)[0] == ?.
107
+ # Find.prune # Don't look any further into this directory.
108
+ # else
109
+ # next
110
+ # end
111
+ # else
112
+ # if path =~ /.*\DerivedData$/
113
+ # puts path
114
+ # derived_paths << path
115
+ # end
116
+ # end
117
+ # end
118
+ # end
119
+
120
+ directory_paths.each do |folder|
121
+ arr << Thread.new {
122
+ Find.find(folder){ |path|
123
+ next if !File.directory?(path)
124
+ next if File.basename(path)[0] == ?.
125
+
126
+ # puts File.stat(path).blockdev?
127
+ next if File.stat(path).blockdev? == true
128
+ if path =~ /.*\DerivedData$/
129
+ puts path
130
+ derived_paths << path
131
+ end
132
+ }
133
+ }
134
+ end
135
+
136
+ arr.each {|t| t.join}
137
+
138
+ logger.debug arr.count
139
+ logger.debug derived_paths
140
+
141
+ # derived_paths.each {|f| logger.debug f; trash(f)}
142
+ spinner.stop("Done!")
143
+ puts "End at #{Time.now}"
144
+ end
145
+
146
+ def find_in_path(folder)
147
+ derived_paths = []
148
+ Find.find(folder) do |path|
149
+ derived_paths << path if path =~ /.*\DerivedData$/
150
+ end
151
+ puts derived_paths
152
+ end
153
+
154
+ def trash(file)
155
+ IO.popen("osascript", "w") do |stdin|
156
+ stdin.puts %Q{tell app "Finder" to move the POSIX file "#{file}" to trash}
157
+ end
158
+ end
159
+
160
+ def find2
161
+ spinner = TTY::Spinner.new("[:spinner] Search ...", format: :dots_2)
162
+ spinner.auto_spin
163
+
164
+ base_dir_path = ENV["HOME"]
165
+ # base_dir_path = "/Users/nicolaerogojan/.Trash"
166
+ # directory_paths = Dir.glob(File.join(base_dir_path, '*', ''))
167
+ directory_paths = []
168
+ derived_paths = []
169
+ threads = []
170
+
171
+ Pathname.new(base_dir_path).children.select do |c|
172
+ # c.directory? && c.zero?
173
+ # puts "dirname -> #{c.dirname}"
174
+ # puts "basename -> #{c.basename}"
175
+ # puts "directory -> #{c.directory?}"
176
+ # puts "blockdev -> #{c.blockdev?}"
177
+ # puts "zero -> #{c.zero?}"
178
+ # puts " -> #{c.to_s[0]}"
179
+ # puts " -> #{c.to_s[0] != '.'}"
180
+ # puts " -> #{c.basename != '.'}"
181
+ # puts " -> #{c.basename.to_s[0] != '.'}"
182
+ # puts "owned -> #{c.owned?}"
183
+ # puts "=============================="
184
+ # if c.directory? && c.zero? == false && c.blockdev? == false && c.basename.to_s[0] != '.' && c.basename.to_s != 'Library'
185
+ if c.directory? && c.zero? == false && c.blockdev? == false && c.basename.to_s[0] != '.'
186
+ directory_paths << c
187
+ end
188
+ end
189
+
190
+ # puts
191
+ # puts base_dir_path
192
+ # puts "=============================="
193
+ # puts directory_paths
194
+ # puts "=============================="
195
+
196
+ directory_paths.each do |folder|
197
+ threads << Thread.new {
198
+ begin
199
+ Find.find(folder, ignore_error: true) {|path| derived_paths << path if path =~ /.*\DerivedData$/}
200
+ rescue Exception => e
201
+ puts e.message
202
+ end
203
+ }
204
+ end
205
+
206
+ # Thread.abort_on_exception = false
207
+ # Thread.report_on_exception = false
208
+ # threads.each {|t| t.abort_on_exception = false; t.report_on_exception = false; t.join}
209
+ threads.each {|t| t.join}
210
+
211
+ # table = TTY::Table.new(["header1","header2"], [["a1", "a2"], ["b1", "b2"]])
212
+
213
+ # roys = [["a1"], ["a2"]]
214
+ # roys = []
215
+ # directory_paths.each do |folder|
216
+ # roys << [folder]
217
+ # end
218
+
219
+ roys = directory_paths.map { |f| [f] }
220
+ table = TTY::Table.new(["directory_paths"], roys)
221
+ puts
222
+ puts table.render(:ascii)
223
+
224
+ puts derived_paths
225
+ puts "=============================="
226
+
227
+ xcode_archives_size = Filesize.size(Dir["#{ENV["HOME"]}/Library/Developer/Xcode/Archives/**/*"].select { |f| File.file?(f) }.sum { |f| File.size(f) })
228
+ puts "Xcode Archives size: #{xcode_archives_size}"
229
+ spinner.stop("Done!")
230
+
231
+ prompt = TTY::Prompt.new
232
+
233
+ # answer = prompt.yes?("Do you like Ruby?")
234
+ answer = prompt.yes?("Are you a human?") do |q|
235
+ q.default false
236
+ q.positive "Yup"
237
+ q.negative "Nope"
238
+ end
239
+
240
+ puts "Answer: #{answer}"
241
+
242
+ end
243
+
244
+ end
245
+
246
+ class Filesize
247
+ def self.size(size)
248
+ units = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'Pib', 'EiB']
249
+
250
+ return '0.0 B' if size == 0
251
+ exp = (Math.log(size) / Math.log(1024)).to_i
252
+ exp = 6 if exp > 6
253
+
254
+ '%.1f %s' % [size.to_f / 1024 ** exp, units[exp]]
255
+ end
256
+ end
257
+
258
+ clean = DerivedData.new
259
+ # DerivedData.hi("Test")
260
+ # DerivedData.new.find()
261
+ DerivedData.new.find2()
metadata ADDED
@@ -0,0 +1,94 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: delete_derived_data
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Rogojan Nicolae
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-05-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: tty-spinner
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.9.3
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.9.3
27
+ - !ruby/object:Gem::Dependency
28
+ name: tty-prompt
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.23.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.23.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: tty-table
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.12.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.12.0
55
+ description: Search all DerivedData folders and moves files or folders to the trash.
56
+ Empty the trash (asks for confirmation)
57
+ email: rogojan.colea@gmail.com
58
+ executables:
59
+ - delete_derived_data
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - bin/delete_derived_data
64
+ - lib/delete_derived_data.rb
65
+ - lib/delete_derived_data/delete.rb
66
+ - lib/delete_derived_data/search.rb
67
+ - lib/delete_derived_data/trash.rb
68
+ - lib/delete_derived_data/utils.rb
69
+ - lib/delete_derived_data/version.rb
70
+ - lib/main2.rb
71
+ homepage: https://github.com/rognick/delete_derived_data
72
+ licenses:
73
+ - MIT
74
+ metadata: {}
75
+ post_install_message:
76
+ rdoc_options: []
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ requirements: []
90
+ rubygems_version: 3.1.4
91
+ signing_key:
92
+ specification_version: 4
93
+ summary: Delete all derived data!
94
+ test_files: []