Merge lp:~racb/ubuntu-archive-tools/handle-packageset-deletions into lp:ubuntu-archive-tools

Proposed by Robie Basak
Status: Needs review
Proposed branch: lp:~racb/ubuntu-archive-tools/handle-packageset-deletions
Merge into: lp:ubuntu-archive-tools
Diff against target: 161 lines (+80/-53)
1 file modified
packageset-report (+80/-53)
To merge this branch: bzr merge lp:~racb/ubuntu-archive-tools/handle-packageset-deletions
Reviewer Review Type Date Requested Status
Ubuntu Package Archive Administrators Pending
Review via email: mp+400678@code.launchpad.net

Description of the change

If a packageset is deleted, the corresponding file doesn't disappear from https://people.canonical.com/~ubuntu-archive/packagesets/. I can think of two approaches to fix this:

1) Adjust packageset-report to delete files not generated by its output. This is what this branch does. However, hypothetical users might find a tool that deletes things surprising, in which case you don't want this branch.

2) Adjust the cron job that calls packageset-report to delete or rename away the output directory first. But I don't have permission to make this adjustment myself, so if you don't like the former option, please could you fix this issue in the cronjob?

To post a comment you must log in.

Unmerged revisions

1458. By Robie Basak

Delete output from packagesets that are deleted

If a packageset is deleted, a subsequent run by this tool will retain
the output prior to that deletion in the target directory. This is
confusing, since the report output then implies that the packageset
still exists, when it doesn't.

Instead, explicitly delete output from inside that is not part of the
current report output.

1457. By Robie Basak

Factor out create_report()

Move this code into its own function to make future manipulation easier.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'packageset-report'
--- packageset-report 2020-11-02 18:25:35 +0000
+++ packageset-report 2021-04-07 03:56:33 +0000
@@ -18,13 +18,74 @@
1818
19import argparse19import argparse
20import os20import os
21import stat
21import time22import time
2223
23from launchpadlib.launchpad import Launchpad24from launchpadlib.launchpad import Launchpad
24from codecs import open25from codecs import open
2526
27
28def create_report(ubuntu, pkgset, _teams={}):
29 """Create a report for the given packageset
30
31 :param ubuntu: launchpadlib distribution object for Ubuntu
32 :param pkgset: launchpadlib packageset object
33 :param dict _teams: team cache (used internally)
34 :rtype: str
35 :returns: the packageset report as a string
36 """
37 report = ""
38 report += "Name: %s\n" % pkgset.name
39 report += "Description: %s\n" % pkgset.description
40 report += "Owner: %s\n" % pkgset.owner.display_name
41 report += "Creation date: %s\n" % pkgset.date_created
42
43 # List all the source packages
44 report += "\nPackages:\n"
45 for pkg in sorted(list(pkgset.getSourcesIncluded())):
46 report += " - %s\n" % str(pkg)
47
48 # List all the sub-package sets
49 report += "\nSub-package sets:\n"
50 for child in sorted(list(pkgset.setsIncluded(direct_inclusion=True))):
51 report += " - %s\n" % child.name
52
53 # List all the uploaders, when it's a team, show the members count
54 report += "\nUploaders:\n"
55 for archive in ubuntu.archives:
56 for uploader in sorted(list(archive.getUploadersForPackageset(
57 packageset=pkgset)),
58 key=lambda uploader: uploader.person.display_name):
59
60 if uploader.person.is_team:
61 if not uploader.person.name in _teams:
62 team = uploader.person
63 _teams[uploader.person.name] = team
64 else:
65 team = _teams[uploader.person.name]
66
67 report += " - %s (%s) (%s) (%s) (%s members)\n" % \
68 (team.display_name,
69 team.name,
70 uploader.permission,
71 archive.displayname,
72 len(team.members))
73 for member in sorted(list(team.members),
74 key=lambda person: person.name):
75 report += " - %s (%s)\n" % (member.display_name,
76 member.name)
77 else:
78 report += " - %s (%s) (%s)\n" % \
79 (uploader.person.name,
80 uploader.person.display_name,
81 uploader.permission)
82
83 report += "\nGenerated at: %s\n" % time.asctime()
84 return report
85
86
26parser = argparse.ArgumentParser(87parser = argparse.ArgumentParser(
27 description="Generate list of packages and uploaders for all packagesets.")88 description="Update list of packages and uploaders for all packagesets.")
28parser.add_argument("target", metavar="TARGET",89parser.add_argument("target", metavar="TARGET",
29 help="Target directory")90 help="Target directory")
30parser.add_argument("-a", "--all", action="store_true",91parser.add_argument("-a", "--all", action="store_true",
@@ -44,63 +105,29 @@
44else:105else:
45 ubuntu_series = [series for series in ubuntu.series if series.active]106 ubuntu_series = [series for series in ubuntu.series if series.active]
46107
47# cache
48teams = {}
49
50for series in ubuntu_series:108for series in ubuntu_series:
51 series_name = str(series.name)109 series_name = str(series.name)
52110
53 if not os.path.exists(os.path.join(args.target, series_name)):111 if not os.path.exists(os.path.join(args.target, series_name)):
54 os.makedirs(os.path.join(args.target, series_name))112 os.makedirs(os.path.join(args.target, series_name))
55113
56 for pkgset in lp.packagesets.getBySeries(distroseries=series):114 reports = {
57 report = ""115 pkgset.name: create_report(ubuntu, pkgset)
58 report += "Name: %s\n" % pkgset.name116 for pkgset in lp.packagesets.getBySeries(distroseries=series)
59 report += "Description: %s\n" % pkgset.description117 }
60 report += "Owner: %s\n" % pkgset.owner.display_name118
61 report += "Creation date: %s\n" % pkgset.date_created119 # Delete files in output directory that didn't result in a report
62120 existing_files = set(os.listdir(os.path.join(args.target, series_name)))
63 # List all the source packages121 extraneous_files = existing_files - set(reports.keys())
64 report += "\nPackages:\n"122 for extraneous_file in extraneous_files:
65 for pkg in sorted(list(pkgset.getSourcesIncluded())):123 path = os.path.join(args.target, series_name, extraneous_file)
66 report += " - %s\n" % str(pkg)124 # Sanity check: only remove if it's a regular file
67125 stat_result = os.lstat(path)
68 # List all the sub-package sets126 if stat.S_ISREG(stat_result.st_mode):
69 report += "\nSub-package sets:\n"127 os.unlink(path)
70 for child in sorted(list(pkgset.setsIncluded(direct_inclusion=True))):128
71 report += " - %s\n" % child.name129 # Write reports to disk
72130 for pkgset_name, report in reports.items():
73 # List all the uploaders, when it's a team, show the members count131 with open(os.path.join(args.target, series_name, pkgset_name),
74 report += "\nUploaders:\n"
75 for archive in ubuntu.archives:
76 for uploader in sorted(list(archive.getUploadersForPackageset(
77 packageset=pkgset)),
78 key=lambda uploader: uploader.person.display_name):
79
80 if uploader.person.is_team:
81 if not uploader.person.name in teams:
82 team = uploader.person
83 teams[uploader.person.name] = team
84 else:
85 team = teams[uploader.person.name]
86
87 report += " - %s (%s) (%s) (%s) (%s members)\n" % \
88 (team.display_name,
89 team.name,
90 uploader.permission,
91 archive.displayname,
92 len(team.members))
93 for member in sorted(list(team.members),
94 key=lambda person: person.name):
95 report += " - %s (%s)\n" % (member.display_name,
96 member.name)
97 else:
98 report += " - %s (%s) (%s)\n" % \
99 (uploader.person.name,
100 uploader.person.display_name,
101 uploader.permission)
102
103 report += "\nGenerated at: %s\n" % time.asctime()
104 with open(os.path.join(args.target, series_name, pkgset.name),
105 "w+", encoding="utf-8") as fd:132 "w+", encoding="utf-8") as fd:
106 fd.write(report)133 fd.write(report)

Subscribers

People subscribed via source and target branches