- def data_size
- inspect_manifest_text if @data_size.nil? or manifest_text_changed?
- @data_size
- end
-
- def files
- inspect_manifest_text if @files.nil? or manifest_text_changed?
- @files
- end
-
- def inspect_manifest_text
- if !manifest_text
- @data_size = false
- @files = []
- return
- end
-
- @data_size = 0
- tmp = {}
-
- manifest_text.split("\n").each do |stream|
- toks = stream.split(" ")
-
- stream = toks[0].gsub /\\(\\|[0-7]{3})/ do |escape_sequence|
- case $1
- when '\\' '\\'
- else $1.to_i(8).chr
- end
- end
-
- toks[1..-1].each do |tok|
- if (re = tok.match /^[0-9a-f]{32}/)
- blocksize = nil
- tok.split('+')[1..-1].each do |hint|
- if !blocksize and hint.match /^\d+$/
- blocksize = hint.to_i
- end
- if (re = hint.match /^GS(\d+)$/)
- blocksize = re[1].to_i
- end
- end
- @data_size = false if !blocksize
- @data_size += blocksize if @data_size
- else
- if (re = tok.match /^(\d+):(\d+):(\S+)$/)
- filename = re[3].gsub /\\(\\|[0-7]{3})/ do |escape_sequence|
- case $1
- when '\\' '\\'
- else $1.to_i(8).chr
- end
- end
- fn = stream + '/' + filename
- i = re[2].to_i
- if tmp[fn]
- tmp[fn] += i
- else
- tmp[fn] = i
- end
- end
- end
- end
- end
-
- @files = []
- tmp.each do |k, v|
- re = k.match(/^(.+)\/(.+)/)
- @files << [re[1], re[2], v]
- end
- end
-