annotate treepkg/report.py @ 579:97a5e09c84dc tip

Fix: pass url to command expand to be able to checkout a new git repository
author Bjoern Ricks <bricks@intevation.de>
date Sat, 03 Sep 2011 12:32:32 +0000
parents f1be9657c1d2
children
rev   line source
235
a8aa0caf52db Provide the rules revision number to reports
Bernhard Herzog <bh@intevation.de>
parents: 146
diff changeset
1 # Copyright (C) 2007, 2008, 2009 by Intevation GmbH
19
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
2 # Authors:
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
3 # Bernhard Herzog <bh@intevation.de>
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
4 #
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
5 # This program is free software under the GPL (>=v2)
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
6 # Read the file COPYING coming with the software for details.
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
7
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
8 """Support for status reports"""
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
9
145
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
10 import os
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
11 from operator import attrgetter
61
8ce9607eefbb add a timestamp for the entire report
Bernhard Herzog <bh@intevation.de>
parents: 60
diff changeset
12 import datetime
8ce9607eefbb add a timestamp for the entire report
Bernhard Herzog <bh@intevation.de>
parents: 60
diff changeset
13
52
78cf5f6778ec Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents: 41
diff changeset
14 from packager import create_package_track, PackagerGroup
19
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
15 from readconfig import read_config
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
16
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
17 class struct(object):
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
18
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
19 """Class to create simple struct like objects
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
20
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
21 All keyword arguments passed to the constructor are available as
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
22 instance variables.
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
23 """
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
24
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
25 def __init__(self, **kw):
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
26 self.__dict__.update(kw)
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
27
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
28 def __repr__(self):
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
29 fields = ["%s=%r" % item for item in self.__dict__.items()]
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
30 return "struct(" + ", ".join(fields) + ")"
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
31
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
32
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
33 def get_packager_group(config_file):
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
34 treepkg_opts, packager_opts = read_config(config_file)
52
78cf5f6778ec Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents: 41
diff changeset
35 return PackagerGroup([create_package_track(**opts)
19
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
36 for opts in packager_opts],
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
37 **treepkg_opts)
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
38
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
39 def status_class(status):
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
40 """Returns the CSS class for a status"""
41
f7ec40638a06 use the enums for the status field of RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents: 30
diff changeset
41 if status.finished:
19
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
42 return "finished"
41
f7ec40638a06 use the enums for the status field of RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents: 30
diff changeset
43 elif status.error:
19
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
44 return "error"
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
45 else:
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
46 return "inprogress"
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
47
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
48 def format_time(timestamp):
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
49 """Formats a datetime object for a status report
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
50
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
51 if the argument is true, the return value is simply str applied to
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
52 the argument, which for datetime objects is a string with the format
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
53 'YYYY-MM-DD hh:mm:ss'. If the argument is false, the return value
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
54 is '<unknown>'.
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
55 """
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
56 if timestamp:
60
ee32f709a374 add Z suffix to all times in status reports
Bernhard Herzog <bh@intevation.de>
parents: 52
diff changeset
57 return timestamp.strftime("%Y-%m-%d %H:%M:%SZ")
19
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
58 else:
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
59 return "<unknown>"
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
60
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
61
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
62 def prepare_status(status):
41
f7ec40638a06 use the enums for the status field of RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents: 30
diff changeset
63 return struct(desc=status.status.description,
19
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
64 start=format_time(status.start),
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
65 stop=format_time(status.stop),
264
ea3abd1aa652 Make a revision's tag available to the report template
Bernhard Herzog <bh@intevation.de>
parents: 236
diff changeset
66 cls=status_class(status.status),
ea3abd1aa652 Make a revision's tag available to the report template
Bernhard Herzog <bh@intevation.de>
parents: 236
diff changeset
67 tag=status.tags)
19
0cdda44240a6 Add treepkg/report.py for reporting and use it in reportstatus.py
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
68
145
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
69 class Revisions(object):
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
70
372
ef87d30468b6 Added the option to expose additional log files from the log directory.
Andre Heinecke <aheinecke@intevation.de>
parents: 264
diff changeset
71 def __init__(self, tracks, logs):
145
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
72 self.tracks = sorted(tracks, key=attrgetter("name"))
372
ef87d30468b6 Added the option to expose additional log files from the log directory.
Andre Heinecke <aheinecke@intevation.de>
parents: 264
diff changeset
73 self.logs = logs
145
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
74
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
75 def sorted_by_revision(self):
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
76 revisions = {}
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
77 num_columns = len(self.tracks)
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
78 for column, track in enumerate(self.tracks):
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
79 for revision in track.get_revisions():
235
a8aa0caf52db Provide the rules revision number to reports
Bernhard Herzog <bh@intevation.de>
parents: 146
diff changeset
80 row = revisions.setdefault((revision.revision,
a8aa0caf52db Provide the rules revision number to reports
Bernhard Herzog <bh@intevation.de>
parents: 146
diff changeset
81 revision.rules_revision),
145
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
82 [None] * num_columns)
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
83 log_files = [(title, os.path.basename(filename))
372
ef87d30468b6 Added the option to expose additional log files from the log directory.
Andre Heinecke <aheinecke@intevation.de>
parents: 264
diff changeset
84 for title, filename in
ef87d30468b6 Added the option to expose additional log files from the log directory.
Andre Heinecke <aheinecke@intevation.de>
parents: 264
diff changeset
85 revision.list_log_files(self.logs)]
145
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
86 row[column] = struct(revno=revision.revision,
236
065d20fb4691 Use better names for the rules revision in the structs in the reports.
Bernhard Herzog <bh@intevation.de>
parents: 235
diff changeset
87 rulesrev=revision.rules_revision,
145
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
88 revision=revision,
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
89 column=column,
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
90 name=track.name,
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
91 log_files=log_files,
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
92 status=prepare_status(revision.status))
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
93
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
94 # convert the revisions dict into a sorted list of (revno, row)
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
95 # pairs
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
96 revisions = revisions.items()
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
97 revisions.sort()
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
98 revisions.reverse()
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
99 return revisions
123e9a5f31fa Rework treepkg/report.py to prepare for other report types. Adapt
Bernhard Herzog <bh@intevation.de>
parents: 61
diff changeset
100
146
1766e2ee9457 new report type: sorted by start date instead of revision number. This
Bernhard Herzog <bh@intevation.de>
parents: 145
diff changeset
101 def sorted_by_startdate(self):
1766e2ee9457 new report type: sorted by start date instead of revision number. This
Bernhard Herzog <bh@intevation.de>
parents: 145
diff changeset
102 revisions = []
1766e2ee9457 new report type: sorted by start date instead of revision number. This
Bernhard Herzog <bh@intevation.de>
parents: 145
diff changeset
103 for column, track in enumerate(self.tracks):
1766e2ee9457 new report type: sorted by start date instead of revision number. This
Bernhard Herzog <bh@intevation.de>
parents: 145
diff changeset
104 for revision in track.get_revisions():
491
f1be9657c1d2 skip reports without a status and status starttime
Bjoern Ricks <bricks@intevation.de>
parents: 372
diff changeset
105 if not revision.status or not revision.status.start:
f1be9657c1d2 skip reports without a status and status starttime
Bjoern Ricks <bricks@intevation.de>
parents: 372
diff changeset
106 continue
146
1766e2ee9457 new report type: sorted by start date instead of revision number. This
Bernhard Herzog <bh@intevation.de>
parents: 145
diff changeset
107 revisions.append((revision.status.start,
1766e2ee9457 new report type: sorted by start date instead of revision number. This
Bernhard Herzog <bh@intevation.de>
parents: 145
diff changeset
108 struct(revno=revision.revision,
1766e2ee9457 new report type: sorted by start date instead of revision number. This
Bernhard Herzog <bh@intevation.de>
parents: 145
diff changeset
109 revision=revision,
236
065d20fb4691 Use better names for the rules revision in the structs in the reports.
Bernhard Herzog <bh@intevation.de>
parents: 235
diff changeset
110 rulesrev=revision.rules_revision,
146
1766e2ee9457 new report type: sorted by start date instead of revision number. This
Bernhard Herzog <bh@intevation.de>
parents: 145
diff changeset
111 log_files =
1766e2ee9457 new report type: sorted by start date instead of revision number. This
Bernhard Herzog <bh@intevation.de>
parents: 145
diff changeset
112 [(title, os.path.basename(filename))
1766e2ee9457 new report type: sorted by start date instead of revision number. This
Bernhard Herzog <bh@intevation.de>
parents: 145
diff changeset
113 for title, filename
372
ef87d30468b6 Added the option to expose additional log files from the log directory.
Andre Heinecke <aheinecke@intevation.de>
parents: 264
diff changeset
114 in revision.list_log_files(
ef87d30468b6 Added the option to expose additional log files from the log directory.
Andre Heinecke <aheinecke@intevation.de>
parents: 264
diff changeset
115 self.logs)],
146
1766e2ee9457 new report type: sorted by start date instead of revision number. This
Bernhard Herzog <bh@intevation.de>
parents: 145
diff changeset
116 column=column,
1766e2ee9457 new report type: sorted by start date instead of revision number. This
Bernhard Herzog <bh@intevation.de>
parents: 145
diff changeset
117 name=track.name,
1766e2ee9457 new report type: sorted by start date instead of revision number. This
Bernhard Herzog <bh@intevation.de>
parents: 145
diff changeset
118 new_date = None,
1766e2ee9457 new report type: sorted by start date instead of revision number. This
Bernhard Herzog <bh@intevation.de>
parents: 145
diff changeset
119 status=prepare_status(revision.status))))
1766e2ee9457 new report type: sorted by start date instead of revision number. This
Bernhard Herzog <bh@intevation.de>
parents: 145
diff changeset
120 revisions.sort()
1766e2ee9457 new report type: sorted by start date instead of revision number. This
Bernhard Herzog <bh@intevation.de>
parents: 145
diff changeset
121 revisions.reverse()
1766e2ee9457 new report type: sorted by start date instead of revision number. This
Bernhard Herzog <bh@intevation.de>
parents: 145
diff changeset
122
1766e2ee9457 new report type: sorted by start date instead of revision number. This
Bernhard Herzog <bh@intevation.de>
parents: 145
diff changeset
123 last_date = None
1766e2ee9457 new report type: sorted by start date instead of revision number. This
Bernhard Herzog <bh@intevation.de>
parents: 145
diff changeset
124 for start, rev in revisions:
1766e2ee9457 new report type: sorted by start date instead of revision number. This
Bernhard Herzog <bh@intevation.de>
parents: 145
diff changeset
125 if last_date != start.date():
1766e2ee9457 new report type: sorted by start date instead of revision number. This
Bernhard Herzog <bh@intevation.de>
parents: 145
diff changeset
126 last_date = start.date()
1766e2ee9457 new report type: sorted by start date instead of revision number. This
Bernhard Herzog <bh@intevation.de>
parents: 145
diff changeset
127 rev.new_date = str(last_date)
1766e2ee9457 new report type: sorted by start date instead of revision number. This
Bernhard Herzog <bh@intevation.de>
parents: 145
diff changeset
128 return revisions
1766e2ee9457 new report type: sorted by start date instead of revision number. This
Bernhard Herzog <bh@intevation.de>
parents: 145
diff changeset
129
372
ef87d30468b6 Added the option to expose additional log files from the log directory.
Andre Heinecke <aheinecke@intevation.de>
parents: 264
diff changeset
130 def prepare_report(group, logs):
ef87d30468b6 Added the option to expose additional log files from the log directory.
Andre Heinecke <aheinecke@intevation.de>
parents: 264
diff changeset
131 return struct(revisions=Revisions(group.get_package_tracks(), logs),
61
8ce9607eefbb add a timestamp for the entire report
Bernhard Herzog <bh@intevation.de>
parents: 60
diff changeset
132 date=format_time(datetime.datetime.utcnow()))
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)