diff --git a/docs/urpm-repodiff.1 b/docs/urpm-repodiff.1 index 5c1950d..aa4c4ff 100644 --- a/docs/urpm-repodiff.1 +++ b/docs/urpm-repodiff.1 @@ -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 diff --git a/urpm-repodiff.py b/urpm-repodiff.py index 2dd6ecf..a8e6b73 100755 --- a/urpm-repodiff.py +++ b/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('

Difference between repositories.

\n' +\ '

The use of color coding in tables:

\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 + '' tmp_string = tmp_string + '' + packagename + '' - (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 + '' +\ repo_name[i] + '' @@ -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: