src/api/app/mixins/parse_package_diff.rb
module ParsePackageDiff
def issues_hash(sourcediff)
ret = {}
sourcediff.get('issues').elements('issue') do |issue|
next unless issue['name']
i = Issue.find_by_name_and_tracker(issue['name'], issue['tracker'], nonfatal: 1)
next unless i
issue_infos = i.webui_infos
issue_infos[:state] = issue['state'] if issue['state']
ret[issue['label']] = issue_infos
end
ret
end
def parse_one_diff(sourcediff)
# Sort files into categories by their ending and add all of them to a hash. We
# will later use the sorted and concatenated categories as key index into the per action file hash.
changes_file_keys = []
spec_file_keys = []
patch_file_keys = []
other_file_keys = []
files_hash = {}
sourcediff.get('files').elements('file') do |file|
filename = if file['new']
file['new']['name']
else # in case of deleted files
file['old']['name']
end
if filename.include?('/')
other_file_keys << filename
elsif filename.ends_with?('.spec')
spec_file_keys << filename
elsif filename.ends_with?('.changes')
changes_file_keys << filename
elsif /.*.(patch|diff|dif)/.match?(filename)
patch_file_keys << filename
else
other_file_keys << filename
end
files_hash[filename] = file
end
{
'old' => sourcediff['old'],
'new' => sourcediff['new'],
'filenames' => changes_file_keys.sort + spec_file_keys.sort + patch_file_keys.sort + other_file_keys.sort,
'files' => files_hash,
'issues' => issues_hash(sourcediff)
}
end
def sorted_filenames_from_sourcediff(sd)
return [{}] if sd.blank?
parsed_sourcediff = []
sd = "<diffs>#{sd}</diffs>"
Xmlhash.parse(sd).elements('sourcediff').each do |sourcediff|
parsed_sourcediff << parse_one_diff(sourcediff)
end
parsed_sourcediff
end
end