mirror of
https://abf.rosa.ru/djam/urpm-tools.git
synced 2025-02-23 17:32:46 +00:00
repodiff: changelog diff fixed; added filter options --show-(new/removed/updated/downgraded)
This commit is contained in:
parent
d780478b03
commit
8b8b4a145a
2 changed files with 100 additions and 43 deletions
|
@ -35,6 +35,15 @@ If \fB--output, -o\fP option is not present, page will be output to file 'repodi
|
|||
.SH "OUTPUT OPTION"
|
||||
.IP "\fB\-\-output, -o OUTPUT_FILE\fP"
|
||||
Change standart output to OUTPUT_FILE.
|
||||
.SH "FILTER OPTION"
|
||||
.IP "\fB\-\-show-new, -N\fP"
|
||||
Show new packages.
|
||||
.IP "\fB\-\-show-removed, -R\fP"
|
||||
Show removed packages.
|
||||
.IP "\fB\-\-show-updated, -U\fP"
|
||||
Show updated packages.
|
||||
.IP "\fB\-\-show-downgraded, -D\fP"
|
||||
Show downgraded packages.
|
||||
.SH "EXAMPLES"
|
||||
.IP "Compare packages in two local repositories:"
|
||||
\fBurpm-repodiff --old /tmp/repo-old --new /tmp/repo-new\fP
|
||||
|
|
134
urpm-repodiff.py
134
urpm-repodiff.py
|
@ -101,6 +101,17 @@ def ParseCommandLine():
|
|||
help=_("Ignore release during package compare."))
|
||||
parser.add_argument("--output", "-out", action="store", nargs=1, default='',
|
||||
metavar="OUTPUT_FILE", help=_("Change standart output to \"OUTPUT_FILE\"."))
|
||||
group = parser.add_argument_group('Filters',
|
||||
description="Filters for output. If none selected then every type will\
|
||||
be shown")
|
||||
group.add_argument("--show-new", "-N", action="store_true",
|
||||
help=_("Show new packages"))
|
||||
group.add_argument("--show-removed", "-R", action="store_true",
|
||||
help=_("Show removed packages"))
|
||||
group.add_argument("--show-updated", "-U", action="store_true",
|
||||
help=_("Show updated packages"))
|
||||
group.add_argument("--show-downgraded", "-D", action="store_true",
|
||||
help=_("Show downgraded packages"))
|
||||
return parser.parse_args()
|
||||
|
||||
def exit_proc(arg):
|
||||
|
@ -635,6 +646,7 @@ def ParseLogfile(dict_log, logfile, dict_upd_packages, mode, arg):
|
|||
[(verler,(s0,s1,s2)),(verrel,(s0,s1,s2)),ifdowngraded]
|
||||
"""
|
||||
ifnotquiet = arg.quiet
|
||||
ifreleaseignore = arg.no_release
|
||||
|
||||
if ifnotquiet:
|
||||
print _("Reading changelog")
|
||||
|
@ -675,7 +687,7 @@ def ParseLogfile(dict_log, logfile, dict_upd_packages, mode, arg):
|
|||
disttagepoch = disttag + distepoch
|
||||
if (disttagepoch == ''):
|
||||
disttagepoch = '-'
|
||||
(result_key, version, release) = RPMNameFilter(pkgname, disttagepoch)
|
||||
(result_key, version, release) = RPMNameFilter(pkgname, disttagepoch, ifreleaseignore)
|
||||
verrel = (version, release, "-1")
|
||||
# skip entry if it wasn't updated
|
||||
if result_key not in dict_upd_packages:
|
||||
|
@ -690,26 +702,21 @@ def ParseLogfile(dict_log, logfile, dict_upd_packages, mode, arg):
|
|||
if(result_key in dict_log) and (dict_log[result_key][mode]):
|
||||
tag_changelog = tag_changelog.next
|
||||
continue
|
||||
# if "old" repository do not have changelog of the package
|
||||
if(mode == 1) and (not result_key in dict_log):
|
||||
dict_log[result_key] = []
|
||||
dict_log[result_key].append([])
|
||||
dict_log[result_key].append([])
|
||||
dict_log[result_key][0] = (verrel, [])
|
||||
|
||||
|
||||
log_current = tag_changelog.children
|
||||
result_changelog = []
|
||||
while(log_current):
|
||||
if(log_current.name != "log"):
|
||||
log_current = log_current.next
|
||||
continue
|
||||
|
||||
|
||||
if(log_current.properties.name == "time"):
|
||||
entry_time = log_current.properties.content
|
||||
else:
|
||||
entry_time = 0
|
||||
|
||||
if(mode == 1) and (not ifdowngraded) and\
|
||||
|
||||
if(mode == 1) and (not ifdowngraded) and\
|
||||
(result_key in dict_log) and\
|
||||
(entry_time <= dict_log[result_key][0][1][0]):
|
||||
break
|
||||
log_child = log_current.children
|
||||
|
@ -720,6 +727,16 @@ def ParseLogfile(dict_log, logfile, dict_upd_packages, mode, arg):
|
|||
entry_text = log_child.content
|
||||
log_child = log_child.next
|
||||
result_changelog.append((entry_time, entry_name, entry_text))
|
||||
# if "old" repository do not have changelog of the package
|
||||
if(mode == 1) and (not result_key in dict_log):
|
||||
dict_log[result_key] = []
|
||||
dict_log[result_key].append([])
|
||||
dict_log[result_key].append([])
|
||||
dict_log[result_key][0] = (verrel, [])
|
||||
if not ifdowngraded:
|
||||
dict_log[result_key][0] = (verrel, result_changelog[0])
|
||||
else:
|
||||
dict_log[result_key][0] = (verrel, result_changelog)
|
||||
if(mode == ifdowngraded):
|
||||
break
|
||||
log_current = log_current.next
|
||||
|
@ -793,9 +810,12 @@ def ChangelogPrint(changes_list, file_output):
|
|||
changes_list is list with format:
|
||||
changes_list = [(time,author,text)]
|
||||
"""
|
||||
for entry in changes_list:
|
||||
file_output.write("* " + str(date.fromtimestamp(float(entry[0]))) +\
|
||||
" " + entry[1] + '\n' + entry[2] + '\n\n')
|
||||
if len(changes_list) > 0:
|
||||
for entry in changes_list:
|
||||
file_output.write("* " + str(date.fromtimestamp(float(entry[0]))) +\
|
||||
" " + entry[1] + '\n' + entry[2] + '\n\n')
|
||||
else:
|
||||
file_output.write('\n')
|
||||
|
||||
def PrintLogfileDiff(package_name, dict_logfile_diff, file_output):
|
||||
"""Changelog difference.
|
||||
|
@ -824,17 +844,29 @@ def ProcessUpdPackages(dict_upd_packages, dict_logfile_diff, arg):
|
|||
file_output = arg.output
|
||||
ifchangelog = arg.changelog
|
||||
ifsizes = arg.size
|
||||
ifup = arg.show_updated
|
||||
ifdown = arg.show_downgraded
|
||||
|
||||
file_output.write(_("\n\nUpdated packages:\n\n"))
|
||||
sorted_list = sorted(dict_upd_packages)
|
||||
for name in sorted_list:
|
||||
package = dict_upd_packages[name][1][1][0][0]
|
||||
if ifnotsimple:
|
||||
file_output.write(package + '\n' + '-'*len(package) + '\n')
|
||||
if dict_upd_packages[name][2]:
|
||||
file_output.write(_(" ***DOWNGRADED***\n"))
|
||||
if dict_upd_packages[name][2]:
|
||||
if ifdown:
|
||||
file_output.write(package + '\n' + '-'*len(package) + '\n')
|
||||
file_output.write(_(" ***DOWNGRADED***\n"))
|
||||
else:
|
||||
continue
|
||||
else:
|
||||
if ifup:
|
||||
file_output.write(package + '\n' + '-'*len(package) + '\n')
|
||||
else:
|
||||
continue
|
||||
if ifchangelog:
|
||||
PrintLogfileDiff(name, dict_logfile_diff, file_output)
|
||||
else:
|
||||
file_output.write('\n')
|
||||
else:
|
||||
old_package = dict_upd_packages[name][0][1][0][0]
|
||||
file_output.write(name + ": " + old_package + " -> " + package + '\n')
|
||||
|
@ -1153,6 +1185,7 @@ def GetRepoInfo(dict_packages, packagename, lenold, lennew, list_dict_old,
|
|||
result1 = []
|
||||
result2 = []
|
||||
flag = 0
|
||||
show_filter = [0,0,0,0]
|
||||
tmpstr = ""
|
||||
for i in range(lenold):
|
||||
if packagename in list_dict_old[i]:
|
||||
|
@ -1178,26 +1211,32 @@ def GetRepoInfo(dict_packages, packagename, lenold, lennew, list_dict_old,
|
|||
result1.append("N/A")
|
||||
result2.append("")
|
||||
else:
|
||||
result1.append(list_dict_new[i][packagename][0][0] + '-' +\
|
||||
list_dict_new[i][packagename][0][1])
|
||||
tmpstr = list_dict_new[i][packagename][0][0]
|
||||
if not ifreleaseignore:
|
||||
tmpstr = tmpstr + '-' + list_dict_new[i][0][1]
|
||||
result1.append(tmpstr)
|
||||
result2.append("")
|
||||
else:
|
||||
(name, entry_type) = tmpdict[i]
|
||||
if entry_type == 1:
|
||||
result1.append(name)
|
||||
result2.append('class = "new"')
|
||||
show_filter[0] = 1
|
||||
elif entry_type == 2:
|
||||
result1.append("Removed")
|
||||
result2.append('class = "removed"')
|
||||
flag = 1
|
||||
show_filter[1] = 1
|
||||
elif entry_type == 3:
|
||||
result1.append(name)
|
||||
result2.append('class = "updated"')
|
||||
show_filter[2] = 1
|
||||
elif entry_type == 4:
|
||||
result1.append(name)
|
||||
result2.append('class = "downgraded"')
|
||||
show_filter[3] = 1
|
||||
|
||||
return (result1, result2, flag)
|
||||
return (result1, result2, flag, show_filter)
|
||||
|
||||
def HTML_OutputBody(dict_packages, list_dict_old, list_dict_new, arg):
|
||||
"""Output table.
|
||||
|
@ -1208,6 +1247,7 @@ def HTML_OutputBody(dict_packages, list_dict_old, list_dict_new, arg):
|
|||
new = arg.new
|
||||
file_output = arg.output
|
||||
ifreleaseignore = arg.no_release
|
||||
show_mask = [arg.show_new, arg.show_removed, arg.show_updated, arg.show_downgraded]
|
||||
|
||||
file_output.write('<h1>Difference between repositories.</h1>\n' +\
|
||||
'<p class="bold">The use of color coding in tables:</p>\n' +\
|
||||
|
@ -1276,31 +1316,32 @@ def HTML_OutputBody(dict_packages, list_dict_old, list_dict_new, arg):
|
|||
|
||||
sorted_list = sorted(dict_packages, key=str.lower)
|
||||
for packagename in sorted_list:
|
||||
(repo_name, repo_class, flag, show_filter) = GetRepoInfo(dict_packages, packagename,
|
||||
lenold, lennew, list_dict_old, list_dict_new, ifreleaseignore)
|
||||
res = 0
|
||||
for i in range(4):
|
||||
if show_filter[i]*show_mask[i] == 1:
|
||||
res = 1
|
||||
if res == 0:
|
||||
continue
|
||||
|
||||
if flag:
|
||||
res = 0
|
||||
for k in resrange:
|
||||
if(repo_name[k] != "Removed"):
|
||||
res = 1
|
||||
if res:
|
||||
for k in resrange:
|
||||
if(repo_name[k] == "Removed"):
|
||||
repo_name[k] = "N/A"
|
||||
repo_class[k] = ''
|
||||
|
||||
if strnum % 2:
|
||||
strtype = "odd"
|
||||
else:
|
||||
strtype = "even"
|
||||
tmp_string = tmp_string + '<tr class="' + strtype + '">'
|
||||
tmp_string = tmp_string + '<td>' + packagename + '</td>'
|
||||
(repo_name, repo_class, flag) = GetRepoInfo(dict_packages, packagename,
|
||||
lenold, lennew, list_dict_old, list_dict_new, ifreleaseignore)
|
||||
if flag:
|
||||
if(repo_name[lenold] == "Removed"):
|
||||
res = 0
|
||||
for k in resrange:
|
||||
if(repo_name[k] != "Removed"):
|
||||
res = 1
|
||||
if res:
|
||||
for k in resrange:
|
||||
if(repo_name[k] == "Removed"):
|
||||
repo_name[k] = "N/A"
|
||||
repo_class[k] = ''
|
||||
else:
|
||||
for k in resrange:
|
||||
if(repo_name[k] == "Removed"):
|
||||
repo_name[k] = "N/A"
|
||||
repo_class[k] = ''
|
||||
|
||||
for i in range(length):
|
||||
tmp_string = tmp_string + '<td ' + repo_class[i] + '>' +\
|
||||
repo_name[i] + '</td>'
|
||||
|
@ -1364,7 +1405,12 @@ def main(args):
|
|||
ifnotquiet = arg.quiet
|
||||
ifhtml = arg.html
|
||||
ifchangelog = arg.changelog
|
||||
|
||||
if (not arg.show_new) and (not arg.show_removed) and\
|
||||
(not arg.show_updated) and (not arg.show_downgraded):
|
||||
arg.show_new=True
|
||||
arg.show_removed=True
|
||||
arg.show_updated=True
|
||||
arg.show_downgraded=True
|
||||
|
||||
GetFiles(arg)
|
||||
|
||||
|
@ -1380,9 +1426,11 @@ def main(args):
|
|||
if not ifnotsimple or not ifchangelog:
|
||||
dict_logfile_diff = {}
|
||||
|
||||
ProcessNewPackages(dict_new_packages, arg.output)
|
||||
ProcessDelPackages(dict_del_packages, dict_obsoleted, arg.output)
|
||||
if dict_upd_packages:
|
||||
if arg.show_new:
|
||||
ProcessNewPackages(dict_new_packages, arg.output)
|
||||
if arg.show_removed:
|
||||
ProcessDelPackages(dict_del_packages, dict_obsoleted, arg.output)
|
||||
if dict_upd_packages and (arg.show_updated or arg.show_downgraded):
|
||||
ProcessUpdPackages(dict_upd_packages, dict_logfile_diff, arg)
|
||||
PrintSummary(dict_new_packages, dict_del_packages, dict_upd_packages, arg.output)
|
||||
else:
|
||||
|
|
Loading…
Add table
Reference in a new issue