done: 3 bugs, trailing slashes and suggestions in 404 page
[qa/debsources.git] / BUGS
1 #    -*- mode: org -*-
2
3 * TODO [#A] file-level deduplication, using checksums                 :infra:
4   depends (to be done properly) on "database schema refactoring"
5
6 * TODO [#B] [0/3] new stats happy                           :web:stats:infra:
7 ** TODO postgres db size
8 ** TODO number of binary packages
9    depends: "inject binary<->source mappings in DB"
10 ** TODO live stats from ESEM 2014 paper
11    https://upsilon.cc/~zack/research/publications/debsources-esem-2014.pdf
12
13 * TODO multiple archive support                                       :infra:
14   to do so, we need to do a separate debmirror run, as the security archive is
15   not hosted on the regular mirror network
16 * TODO add debian-security                                            :infra:
17   depends: multiple archive support
18
19 * TODO inject binary<->source mappings in DB                       :infra:db:
20
21 * TODO stats: injection of arbitrary data point                 :infra:stats:
22   e.g. to inject sloccount of past releases
23
24 * TODO stats: add totals (i.e. non per-suite)                :web:stats:easy:
25   to all tables listed at http://sources.debian.net/stats/
26
27 * TODO stats: make pie charts more readable     :infra:stats:matplotlib:easy:
28   e.g. by /not/ listing languages below a given thresholds, and aggregating
29   them into a "other" pseudo-language
30
31 * TODO stats: make trend charts more readable   :infra:stats:matplotlib:easy:
32   e.g. avoid overlapping labels, remove/customize + delta on Y axes, etc.
33
34 * TODO infobox: add ctags count                            :web:easy:infobox:
35
36 * TODO release pages: add version number and date          :web:easy:release:
37   which are now available in the suites table
38
39 * TODO "update statistics" stage is too slow               :infra:stats:perf:
40   Currently, it takes about 12 minutes on tytso. It can be optimized by
41   avoiding redoing statistic queries for each live suites (currently: 9), where
42   each query does a sequential scan (due to count(*), despite "index mostly
43   scan"). Instead, we can do GROUP BY queries, taking at once stats for all
44   suites. Proof of concept and benchmarks available in
45   doc/update-stats-query.bench.sql
46
47 * TODO check-in derivatives from the census               :infra:derivatives:
48
49 * TODO mention suite(s) when listing versions           :web:navigation:easy:
50   e.g. when visiting http://sources.debian.net/src/linux, one should see which
51   version is in which suite. Note that one version might be in multiple suites.
52
53 * TODO suite-based navigation                           :web:navigation:easy:
54   add the ability to browse available packages per suite, e.g. with URLs like
55   http://sources.debian.net/suite/jessie/prefix/d/
56
57 * TODO file name search                                       :web:search:db:
58 ** benchmark
59    too slow without decent index:
60      debsources=> select count(*) from files where path like '%stdio%';
61      count
62     -------
63       9643
64     (1 row)
65
66     Time: 7736,861 ms
67
68    but OK with trigram indexing:
69
70     debsources=> \d ix_files_path_trgm
71           Index "public.ix_files_path_trgm"
72      Column |  Type   |          Definition
73     --------+---------+------------------------------
74      encode | integer | encode(path, 'escape'::text)
75     gin, for table "public.files"
76
77     debsources=> select count(*) from files where encode(path, 'escape') like
78   '%stdio%';
79      count
80     -------
81       9643
82     (1 row)
83
84     Time: 77,558 ms
85
86   the above need CREATE EXTENSION 'trgm';
87
88 * TODO update-debsources --trigger should skip update stages          :infra:
89   At the very least it should skip: update statistics, update charts, update
90   suites mappings. Should it become a separate tool? Or should we expose on the
91   cmdline the support to select individual update stages? (see updater.py)
92
93 * TODO missing test: `/api/checksum/foo/`                 :web:api:test:easy:
94
95 * TODO suite test data: differentiate sid and jessie                   :test:
96   Currently, the set of packages in sid and jessie are exactly the same. Add
97   one or more packages which is in sid but not in jessie.
98
99 * TODO tarball-in-tarball                                         :infra:web:
100   Explode nested tarballs, partly for some packaging habits still present in
101   the archive (although they should die a horrible death), more importantly due
102   to upstream shipping tarballs.
103   
104   From #debian-qa:
105   > 04:43 < pabs> zack: well apart from tarball-in-tarball some upstreams ship
106   >               tarballs/zip files
107   > 04:49 < pabs> zack: apt-file counts 2022 .zip files and 6892 .tar* files,
108   >               242 .tgz, 22 .tbz* and 7 txz files in source packages
109   
110 ** tentative solution
111 *** web: discriminate on trailing slash
112     - /foo/bar/baz.tar.gz     -> download the tarball
113     - /foo/bar/baz.tar.gz/qux -> navigate in it
114 *** infra: not clear
115     We need some FS attribute to avoid clashes tar-vs-extraction-dir and
116     minimize the risks of collisions. Could be some highly unlikely suffix (but
117     then it will need to be excluded via apache navigation from /data/). Or
118     some metadata via xattr. Or a separate hierarchy for extracted tarballs.
119
120 * TODO popup messages between lines instead of on the right       :web:popup:
121   - rationale #1: popups are invisible for very long source code lines
122     e.g.: http://sources.debian.net/src/vim/2:7.3.547-7/runtime/syntax/sicad.vim?hl=133&msg=133%3Atest%3Atest#L133
123   - rationale #2: it is the only sane way to show multiple pop-ups avoding
124     they clash with one another
125
126 * TODO multiple popup messages                                    :web:popup:
127   to be able to show multiple error( location)s on the same source file
128
129 * TODO qualified ctags                                   :plugin:ctags:infra:
130   Add --extra=+q to ctags invocation. "However, that this could potentially
131   more than double the size of the tag file". Bug report by Olly Betts
132   on #debian-devel.
133 ** benchmarks
134 *** computation time is ~10-15% slower with +q
135 *** size
136     - libreoffice (C++)
137       zack@tytso:~/ctags-bench/libreoffice-4.1.5$ wc ../libreoffice*ctags
138       561396   3872260  61123731 ../libreoffice-4.1.5.ctags
139       972942   6799455 117133590 ../libreoffice-4.1.5.extra+q.ctags
140     - chromium-browser (C/C++)
141       zack@tytso:~/ctags-bench/chromium-browser-32.0.1700.123$ wc ../chromium-browser*ctags
142       1618199  10931585 205005488 ../chromium-browser-32.0.1700.123.ctags
143       2472627  17064351 342772532 ../chromium-browser-32.0.1700.123.extra+q.ctags
144     - linux (C)
145       zack@tytso:~/ctags-bench/linux-3.12.9$ wc ../linux*ctags
146       2146431  14340875 208057034 ../linux-3.12.9.ctags
147       2610525  17780208 269391932 ../linux-3.12.9.extra+q.ctags
148 *** bottom line
149     it's doable, but will need to rerun all ctags indexing
150
151 * TODO debian cross reference (lxr.debian.net)                    :web:ctags:
152   A-la http://lxr.linux.no/ . Suggested by Pierre Habouzit. Main problem is of
153   scope, cross-ref is mostly reasonable within the same package; /possibly/
154   reasonable between dependent packages; largely unresonable among unrelated
155   packages. (Not to mention the risk of cross-referincing across different
156   languages; although we should have the info to avoid that...)
157
158 * TODO highlight #Lxxx lines by default              :web:ui:javascript:easy:
159   On Thu, Jun 13, 2013 at 12:19:58AM +0200, Joachim Breitner wrote:
160   > An URL like
161   > http://sources.debian.net/src/cairo/1.12.14-4/boilerplate/cairo-boilerplate-xcb.c#L395
162   > should highlight that line. And ideally put it in the middle of the
163   > screen, instead of the top (this might require some JS fiddling).
164
165 * TODO allow symlink within same package/version               :web:security:
166   currently /all/ symlinks are forbidden for security reasons
167
168 * TODO .pc/ exclusion should become a configuration entry      :web:browsing:
169   ..in a more general configuration variable in etc/webconfig.py. Similar to
170   HIGHLIGHT_CLASSES, although we probably don't need regex for exclusions. See
171   http://anonscm.debian.org/gitweb/?p=qa/debsources.git;a=blob;f=web/flask/app/models_app.py;hb=HEAD#l166
172
173 * TODO package debsources with python distribute              :web:packaging:
174   it will simple things like imports and the deployment would be easier
175
176 * TODO make web UI parts conditional on plugin enablement         :infra:web:
177
178 * TODO shutter effect                                       :web:hilight:css:
179   When we highlight a line, we have to use a display:inline tag (whose
180   rendering isn't cool, because an highlighted block doesn't have the
181   same width verywhere). With a display:blog tag, newlines are added
182   by the browser/highlight.js (?), because tags conflicts with
183   highlight.js tags (when a hl.js lexem is multiline).
184   Try to highlight lines 3-4 of this to see the bug:
185
186   def hello():
187      """aaa
188      aaa
189      """ zzz = 3
190
191   Edit: the browser close tags automatically, and since our tags
192   aren't correct (ie
193   <span class="string"><div class="highlight">foo</span></div>
194   ), closing display:block tags are inserted.
195
196  Debugging: maybe with inline-block and other css tricks
197
198 * TODO use relative paths in sources.txt             :infra:refactoring:easy:
199   - 4th field should be relative to conf['mirror_dir']
200   - 5th field should be relative to conf['sources_dir']
201   see test_updater.py for reference
202
203 * TODO migrate to sources.debian.org                              :infra:dsa:
204   conversation started by Zack with DSA
205   Message-ID: <20131229152159.GA8400@upsilon.cc>
206
207 * TODO add binary->source redirection map                         :infra:web:
208   Idea: http://sources.d.n/src/FOO -> http://sources.d.n/src/MAP[FOO], as long
209   as FOO _does not exists_ as a source package.  Feature suggested in response
210   to Selim T. Erdogan, Message-ID: <20130712112459.GA3156@cs.utexas.edu>
211 ** depends: "inject binary<->source mappings in DB"
212
213 * TODO /latest redirection for /data URLs                      :infra:apache:
214   [ bug report from Simon Paillard, Message-Id: <20130907214628.GY17455@mraw.org> ]
215   to implement this we need to generate batchly redirection maps (as we did in
216   the past) and configura Apache to use them, as /data is served directly by
217   Apache
218
219 * TODO bulk ctags insertion traceback           :ctags:bulk:traceback:ATTACH:
220   :PROPERTIES:
221   :Attachments: 1.3.1-4.ctags
222   :ID:       b9a3371f-6e2d-4e60-82e4-9d7c7543ba86
223   :END:
224     Traceback (most recent call last):
225       File "bin/bulk-insert-ctags", line 94, in <module>
226         main(conf, ctagsfile=args.file)
227       File "bin/bulk-insert-ctags", line 73, in main
228         insert_ctags(conn, ctagsfile)
229       File "bin/bulk-insert-ctags", line 65, in insert_ctags
230         conn.execute(INSERT_CTAGS_Q, ctags)
231       File "/usr/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1449, in execute
232         params)
233       File "/usr/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1584, in _execute_clauseelement
234         compiled_sql, distilled_params
235       File "/usr/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1698, in _execute_context
236         context)
237       File "/usr/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1680, in _execute_context
238         context)
239       File "/usr/lib/python2.7/dist-packages/sqlalchemy/engine/default.py", line 328, in do_executemany
240         cursor.executemany(statement, parameters)
241     sqlalchemy.exc.ProgrammingError: (ProgrammingError) can't adapt type 'RowProxy' '\n    INSERT INTO ctags (version_id, tag, path, line, kind, language)\n    VALUES (%(version_id)s, %(tag)s, %(path)s, %(line)s, %(kind)s, %(language)s)\n    ' ({'kind': 'f', 'language': 'sh', 'version_id': (38474,), 'tag': u'is_absolute', 'path': <psycopg2._psycopg.Binary object at 0x2800248>, 'line': 51}, {'kind': 'f', 'language': 'sh', 'version_id': (38474,), 'tag': u'absolute_or_prefix', 'path': <psycopg2._psycopg.Binary object at 0x2800200>, 'line': 57}, {'kind': 'f', 'language': 'sh', 'version_id': (38474,), 'tag': u'showhelp', 'path': <psycopg2._psycopg.Binary object at 0x2800290>, 'line': 65}, {'kind': 'f', 'language': 'sh', 'version_id': (38474,), 'tag': u'yorn', 'path': <psycopg2._psycopg.Binary object at 0x2800320>, 'line': 202}, {'kind': 'f', 'language': 'sh', 'version_id': (38474,), 'tag': u'nory', 'path': <psycopg2._psycopg.Binary object at 0x2800368>, 'line': 207}, {'kind': 'f', 'language': 'sh', 'version_id': (38474,), 'tag': u'message', 'path': <psycopg2._psycopg.Binary object at 0x28003b0>, 'line': 213}, {'kind': 'f', 'language': 'sh', 'version_id': (38474,), 'tag': u'info', 'path': <psycopg2._psycopg.Binary object at 0x28003f8>, 'line': 214}, {'kind': 'f', 'language': 'sh', 'version_id': (38474,), 'tag': u'warning', 'path': <psycopg2._psycopg.Binary object at 0x2800440>, 'line': 215}  ... displaying 10 of 436 total bound parameter sets ...  {'kind': 'f', 'language': 'sh', 'version_id': (38474,), 'tag': u'duplex', 'path': <psycopg2._psycopg.Binary object at 0x2a11e18>, 'line': 734}, {'kind': 'f', 'language': 'sh', 'version_id': (38474,), 'tag': u'viewps', 'path': <psycopg2._psycopg.Binary object at 0x2a11e60>, 'line': 757})
242
243   test recipe (bulk):
244   - find /srv/debsources/sources -mindepth 4 -maxdepth 4 -name '*.ctags > ctags.txt
245   - while read f ; do bin/bulk-insert-ctags -c etc/config.batch.ini $f ; done < ctags.txt
246
247   test recipe (single file):
248   - bin/bulk-insert-ctags -c etc/config.batch.ini 1.3.1-4.ctags
249     (see attachment)
250
251 * TODO move queries for the web app in a separate file      :web:refactoring:
252   SQLAlchemy queries in models.py should be in a new file,
253   e.g. webqueries.py.
254
255 * TODO Produce RDF meta-data interlinked with the PTS'              :rdf:web:
256   The idea would be to generate machine parseable meta-data, as RDF,
257   through content-negociation which would allow to interlink source
258   package descriptions with those generated by the PTS
259   -- obergix@debian.org
260
261 * TODO refactor app/views.py                                     :web:python:
262   The GeneralView object should be inheritated to PaginationView, in
263   order for all routes which use pagination (ctags, checksums, etc) to
264   automatically have these features. In this case, the json view is
265   not paginated but the html view is.
266
267 * TODO multiple ctags search                                        :web:sql:
268   A search which returns *files* (and not a line in a file), which
269   contain all searched ctags.
270   See TODO in python/models.py.