apache / lucene

Apache Lucene open-source search software
https://lucene.apache.org/
Apache License 2.0
2.64k stars 1.02k forks source link

Make changes-to-html target an offline operation [LUCENE-7543] #8594

Closed asfimport closed 7 years ago

asfimport commented 7 years ago

Currently changes-to-html pulls release dates from JIRA, and so fails when JIRA is inaccessible (e.g. from behind a firewall).

SOLR-9711 advocates adding a build sysprop to ignore JIRA connection failures, but I'd rather make the operation always offline.

In an offline discussion, @hossman advocated moving Lucene's and Solr's doap.rdf files, which contain all of the release dates that the changes-to-html now pulls from JIRA, from the CMS Subversion repository (downloadable from the website at http://lucene.apache.org/core/doap.rdf and http://lucene.apache.org/solr/doap.rdf) to the Lucene/Solr git repository. If we did that, then the process could be entirely offline if release dates were taken from the local doap.rdf files instead of downloaded from JIRA.


Migrated from LUCENE-7543 by Steven Rowe (@sarowe), resolved Jan 25 2017 Attachments: LUCENE-7543.patch (versions: 3), LUCENE-7543-drop-XML-Simple.patch Linked issues:

asfimport commented 7 years ago

Alexandre Rafalovitch (@arafalov) (migrated from JIRA)

Just to clarify. Currently the (perl) script pulls the information from JIRA, right? So, it is maintained as part of the issue tagging/release process.

So, what uses doap.rdf and how is it kept up to date? And if it is moved to GitHub, do we abandon the original location/processes?

asfimport commented 7 years ago

Mano Kovacs (@manokovacs) (migrated from JIRA)

@sarowe, is there anything I could help with this task? If you share the details of the planned implementation, I could create a patch.

asfimport commented 7 years ago

Steven Rowe (@sarowe) (migrated from JIRA)

So, what uses doap.rdf and how is it kept up to date?

I'm not sure what uses it, but keeping it up-to-date is part of the ReleaseToDo.

And if it is moved to GitHub, do we abandon the original location/processes?

It won't be moved to GitHub of course, but rather to the Apache Git repo.

These files are currently hosted in the Lucene/Solr CMS-based website repository. An extra release step will be required if we move it to the Git repo, so that the files will continue to be present on the website, similarly to how javadocs are now copied to the website. (I don't think keeping two copies of these files, one in Git and one in the CMS repo, would be a good alternative.)

asfimport commented 7 years ago

Steven Rowe (@sarowe) (migrated from JIRA)

@sarowe, is there anything I could help with this task? If you share the details of the planned implementation, I could create a patch.

Yes, that would be great, thanks!. Here's what I was going to do (but haven't really started #3 yet):

  1. Download the doap.rdf files
  2. Put them in place in a cloned Lucene/Solr Git repo (probably at lucene/ and solr/).
  3. Edit these two files to contain the same dates as JIRA has - you can look at how current changes-to-html pulls release info from JIRA and do the same thing to get the raw data. If there are conflicts, I think JIRA is probably more authoritative.
  4. Figure out how to parse the doap.rdf files, rather than the JIRA version output. (I'm being vague because I haven't looked at details of what's involved here.)
  5. Use doap.rdf release dates rather than those from JIRA.
  6. Stop downloading version data from JIRA.
asfimport commented 7 years ago

Chris M. Hostetter (@hossman) (migrated from JIRA)

Thanks for filing this jira steve, I'd forgotten about this conversation...

So, what uses doap.rdf and how is it kept up to date? And if it is moved to GitHub, do we abandon the original location/processes?

The doap.rdf files are published publicly on the lucene website for consumption by any system (internal or external) that wants to know about the history of solr/lucene releases – DOAP is an RDF standard for this purpose, much like FOAF.

Notably the doap.rdf files power projects.apache.org...

In theory the DOAP files could be auto generated by some system like Jira, but it's a good idea to edit them manually for the express purpose of being able to correct mistakes (ie: they are living documents)

An extra release step will be required if we move it to the Git repo, so that the files will continue to be present on the website, similarly to how javadocs are now copied to the website.

that would not be neccessary...

from an external perspective, the doap files just have to be available at some public / well-known URL. traditionally that has been...

...but there is no reason the well known & public URLs can't be things like "https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;f=solr/doap.rdf;a=blob_plain;hb=HEAD" that are served directly form source control (the projects.apache.org instructions actually suggest that approach) and we could add some .htaccess rules to the website to make the existing URLs redirect to new URLs served directly from GIT.

From an internal perspective we just have to update this list to point wherever we want... https://svn.apache.org/repos/asf/comdev/projects.apache.org/data/projects.xml

  1. Put them in place in a cloned Lucene/Solr Git repo (probably at lucene/ and solr/).

I would suggest they might make more sense in dev-tools? just a gut feeling.

asfimport commented 7 years ago

Steven Rowe (@sarowe) (migrated from JIRA)

Thaks hoss, +1 to all your suggestions - I'd forgotten about the ability to put the doap.rdf files wherever we wanted.

2. Put them in place in a cloned Lucene/Solr Git repo (probably at lucene/ and solr/).

I would suggest they might make more sense in dev-tools? just a gut feeling.

Sure, maybe dev-tools/doap/lucene/doap.rdf and dev-tools/doap/solr/doap.rdf - alternatively I guess we could rename them to lucene-doap.rdf and solr-doap.rdf and put them directly in dev-tools/, but I prefer the former.

asfimport commented 7 years ago

Chris M. Hostetter (@hossman) (migrated from JIRA)

or just dev-tools/doap/lucene.rdf and dev-tools/doap/solr.rdf (with a README.txt in the same dir explaining to future devs why that dir is there) ... or whatever names we like ... there's no rule that the filenames / URLs has to have "doap" in them ... the bike sheds can be any color we want.

asfimport commented 7 years ago

Steven Rowe (@sarowe) (migrated from JIRA)

or just dev-tools/doap/lucene.rdf and dev-tools/doap/solr.rdf (with a README.txt in the same dir explaining to future devs why that dir is there)

+1

asfimport commented 7 years ago

Mano Kovacs (@manokovacs) (migrated from JIRA)

@sarowe, @hossman, thanks for the detailed outline for the implementation! I started the change, mostly done with the perl-script as well, but I noticed lucene.rdf has release versions and dates since 3.1 (only lucene, solr is fine). I am going to copy the missing from jira if that is fine with you.

asfimport commented 7 years ago

Steven Rowe (@sarowe) (migrated from JIRA)

I noticed lucene.rdf has release versions and dates since 3.1 (only lucene, solr is fine). I am going to copy the missing from jira if that is fine with you.

+1, yeah, I noticed the same; that's in part what I meant when I said "Edit these two files to contain the same dates as JIRA has".

asfimport commented 7 years ago

Mano Kovacs (@manokovacs) (migrated from JIRA)

Adding first patch with solr.rdf and lucene.rdf, changed changes2html.pl and updated ant scripts. The rdf files are as-is, since missing dates were already hardcoded into changes2html.pl. I could move the hardcoded dates and add to lucene.rdf instead, if requested.

asfimport commented 7 years ago

Steven Rowe (@sarowe) (migrated from JIRA)

I could move the hardcoded dates and add to lucene.rdf instead, if requested.

Please do.

asfimport commented 7 years ago

Mano Kovacs (@manokovacs) (migrated from JIRA)

Ok, I added the versions from the jira json. However, the "-final", "RCx" and "1.01b" releases are not in any source. Is it ok to add them into the RDF as-is?

asfimport commented 7 years ago

Steven Rowe (@sarowe) (migrated from JIRA)

With your first patch I ran ant changes-to-html in lucene/ and I see many releases' dates missing. I double checked that this is a new problem by looking at http://lucene.apache.org/core/6_3_0/changes/Changes.html, which doesn't have this problem. A nit: the 6.3.0 release date looks weird because the day-of-month is single digit (unlike all other dates, where it's zero-padded).

Ok, I added the versions from the jira json. However, the "-final", "RCx" and "1.01b" releases are not in any source. Is it ok to add them into the RDF as-is?

BTW, the "RCx" releases were treated as if they were real releases at the time, more like -alpha, -beta, etc. than "release candidate" really. The only thing I think worth considering here is whether the "final" modifier should be stripped in the doap.rdf files (even though it will remain in CHANGES.txt/Changes.html). I could go either way. I notice that JIRA lists "1.9 final" as just "1.9" - this is consistent with both the "-alpha/-beta" and "-RCx" naming schemes. The distributions at http://archive.apache.org/dist/lucene/java/archive/ include the "-final" and "-rcX" suffixes in their names, though, so I'd prefer to continue naming these releases in the doap.rdf files the same way as they are named in CHANGES.txt (i.e., include " final" in their names). This has the nice side-effect that no extra mapping step will be required in changes2html.pl.

asfimport commented 7 years ago

Mano Kovacs (@manokovacs) (migrated from JIRA)

Adding all the versions of lucene into the lucene.rdf. There were many inconsistencies, non of the sources contained all the versions and some versions in the primary sources (jira+doap) were renamed to match the CHANGES.txt (final and RCx additions).

You can verify the patch ant changes-to-html in solr and lucene folders, output will be in $PROJECT/build/docs/changes/Changes.html.

asfimport commented 7 years ago

Steven Rowe (@sarowe) (migrated from JIRA)

Thanks Mano.

I ran changes-to-html for both Lucene and Solr, and all Lucene versions now have dates - cool! Solr, however, is still missing dates for several versions.

Many of the new Lucene doap.rdf versions are missing branches. For pre-Apache releases this makes sense I think, but thereafter we should theoretically be able to identify the source branches. Also, the source repo is out of date (yes, not directly applicable to this issue), and older branches aren't available via Git (I think some are tags there). I'll investigate.

asfimport commented 7 years ago

Steven Rowe (@sarowe) (migrated from JIRA)

Patch that cleans up the DOAP files in several ways (removed unreleased versions; added missing versions; put versions in proper order; removed all <branch> mentions from versions, since they are not included in the DOAP schema (https://github.com/edumbill/doap/blob/master/schema/doap.rdf); replaced SVN repo link with Git repo link; added missing XML tags between releases), and improves changes2html.pl (removed file reading routine, since XML::Simple has native file-reading capabilities; improved trailing .0 matching in versions; normalized dates to always be formatted with 2-digit months and days-of-month).

One DOAP file improvement we might consider in the future: the DOAP format supports <file-release> tag(s) within <release>-s, pointing to downloadable release distribution(s). E.g. Apache Maven uses this feature in its DOAP file: https://git-wip-us.apache.org/repos/asf?p=maven.git;a=blob_plain;f=doap_Maven.rdf;hb=HEAD. However, projects.apache.org doesn't display this information right now (e.g. https://projects.apache.org/project.html?maven).

I think it's ready. I'll commit shortly.

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit dd072aa309ed99cfb2fe19ee3b0d5b0d143d8e8e in lucene-solr's branch refs/heads/branch_5_5 from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=dd072aa

LUCENE-7543: Make changes-to-html target an offline operation, by moving the Lucene and Solr DOAP RDF files into the Git source repository under dev-tools/doap/ and then pulling release dates from those files, rather than from JIRA.

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit 4b1be24b2ad20000d03fc85ccd3349a7ea4bbff8 in lucene-solr's branch refs/heads/branch_5_5 from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=4b1be24

LUCENE-7543: added changes entry

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit 3972507799b1fc2e543bacfa73ac7b1596a3b281 in lucene-solr's branch refs/heads/branch_5x from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=3972507

LUCENE-7543: Make changes-to-html target an offline operation, by moving the Lucene and Solr DOAP RDF files into the Git source repository under dev-tools/doap/ and then pulling release dates from those files, rather than from JIRA.

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit f150963b4e9791e7e38cba3ed93a19a794aa4f6a in lucene-solr's branch refs/heads/branch_5x from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=f150963

LUCENE-7543: added changes entry

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit 10e67b5097445ffad2e071fb1ee9d7a46de1a263 in lucene-solr's branch refs/heads/branch_6_0 from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=10e67b5

LUCENE-7543: Make changes-to-html target an offline operation, by moving the Lucene and Solr DOAP RDF files into the Git source repository under dev-tools/doap/ and then pulling release dates from those files, rather than from JIRA.

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit 429deea9b350f1c6ae941920b8d4e6ed6a108d2a in lucene-solr's branch refs/heads/branch_6_0 from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=429deea

LUCENE-7543: added changes entry

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit 69cf982688c3a86273d0f2bb1519721be309281f in lucene-solr's branch refs/heads/branch_6_1 from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=69cf982

LUCENE-7543: Make changes-to-html target an offline operation, by moving the Lucene and Solr DOAP RDF files into the Git source repository under dev-tools/doap/ and then pulling release dates from those files, rather than from JIRA.

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit 763dd1a10fa8ccf9a912b9da33aeed900b3f70fc in lucene-solr's branch refs/heads/branch_6_1 from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=763dd1a

LUCENE-7543: added changes entry

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit 49cf6c04a47b8ef9feb97ce9131f78cad689277e in lucene-solr's branch refs/heads/branch_6_2 from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=49cf6c0

LUCENE-7543: Make changes-to-html target an offline operation, by moving the Lucene and Solr DOAP RDF files into the Git source repository under dev-tools/doap/ and then pulling release dates from those files, rather than from JIRA.

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit 1a488f37190a720fb1513469271818060949f754 in lucene-solr's branch refs/heads/branch_6_2 from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=1a488f3

LUCENE-7543: added changes entry

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit 3c885149db7a71572ffd5ff296d08dd38180f593 in lucene-solr's branch refs/heads/branch_6_3 from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=3c88514

LUCENE-7543: Make changes-to-html target an offline operation, by moving the Lucene and Solr DOAP RDF files into the Git source repository under dev-tools/doap/ and then pulling release dates from those files, rather than from JIRA.

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit 25d2d8d27315fdb5a9b4accbe36d7b12bd2a9243 in lucene-solr's branch refs/heads/branch_6x from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=25d2d8d

LUCENE-7543: Make changes-to-html target an offline operation, by moving the Lucene and Solr DOAP RDF files into the Git source repository under dev-tools/doap/ and then pulling release dates from those files, rather than from JIRA.

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit 33ff6cde9be9b9ab9c2e4c8f9dc5221bc998b673 in lucene-solr's branch refs/heads/master from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=33ff6cd

LUCENE-7543: Make changes-to-html target an offline operation, by moving the Lucene and Solr DOAP RDF files into the Git source repository under dev-tools/doap/ and then pulling release dates from those files, rather than from JIRA.

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit 76bad38018e3d17e0e004bcac81c81662ee05632 in lucene-solr's branch refs/heads/branch_5_5 from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=76bad38

LUCENE-7543: Added note to dev-tools/doap/README.txt about maintaining the website .htaccess file. Cleaned up DOAP files: added full Aapache license reference; added info about canonical URLs; dropped useles stylesheet processing instruction.

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit d41bb6f46a5869d7a18e13258aa26bd2d5713ea0 in lucene-solr's branch refs/heads/branch_5x from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=d41bb6f

LUCENE-7543: Added note to dev-tools/doap/README.txt about maintaining the website .htaccess file. Cleaned up DOAP files: added full Aapache license reference; added info about canonical URLs; dropped useles stylesheet processing instruction.

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit 97ccb67b1dbb72b4d169071cd6cc30999a367804 in lucene-solr's branch refs/heads/branch_6_0 from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=97ccb67

LUCENE-7543: Added note to dev-tools/doap/README.txt about maintaining the website .htaccess file. Cleaned up DOAP files: added full Aapache license reference; added info about canonical URLs; dropped useles stylesheet processing instruction.

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit ef989afb649a5ff2794673a17b205af361fa83af in lucene-solr's branch refs/heads/branch_6_1 from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=ef989af

LUCENE-7543: Added note to dev-tools/doap/README.txt about maintaining the website .htaccess file. Cleaned up DOAP files: added full Aapache license reference; added info about canonical URLs; dropped useles stylesheet processing instruction.

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit 0a6d2508045d2e11b2bfb3f33a177562d2c8a5d8 in lucene-solr's branch refs/heads/branch_6_2 from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=0a6d250

LUCENE-7543: Added note to dev-tools/doap/README.txt about maintaining the website .htaccess file. Cleaned up DOAP files: added full Aapache license reference; added info about canonical URLs; dropped useles stylesheet processing instruction.

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit 45f34c99dad9bc62ea4a1ab5b1ca8515801e9e48 in lucene-solr's branch refs/heads/branch_6_3 from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=45f34c9

LUCENE-7543: Added note to dev-tools/doap/README.txt about maintaining the website .htaccess file. Cleaned up DOAP files: added full Aapache license reference; added info about canonical URLs; dropped useles stylesheet processing instruction.

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit c069dbc147deff79abd1cdd2da329ab426fcd3f8 in lucene-solr's branch refs/heads/branch_6x from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=c069dbc

LUCENE-7543: Added note to dev-tools/doap/README.txt about maintaining the website .htaccess file. Cleaned up DOAP files: added full Aapache license reference; added info about canonical URLs; dropped useles stylesheet processing instruction.

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit 51db00a313d93e5b24468b5fb70165304cb572eb in lucene-solr's branch refs/heads/master from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=51db00a

LUCENE-7543: Added note to dev-tools/doap/README.txt about maintaining the website .htaccess file. Cleaned up DOAP files: added full Aapache license reference; added info about canonical URLs; dropped useles stylesheet processing instruction.

asfimport commented 7 years ago

Steven Rowe (@sarowe) (migrated from JIRA)

I deleted content/core/doap.rdf and content/solr/doap.rdf from the website CMS Subversion repository, and I edited the website .htaccess file to redirect them to their new homes in the Lucene/Solr Git repository.

edit fixed Lucene doap file location

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit 6c539d9b71759c277f3af8fb1c1bb35219b3d828 in lucene-solr's branch refs/heads/branch_5_5 from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=6c539d9

LUCENE-7543: fixed canonical URL in comment

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit 65f451b9309ed4994bdf4ced1f7b2a269a621a43 in lucene-solr's branch refs/heads/branch_5x from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=65f451b

LUCENE-7543: fixed canonical URL in comment

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit d7adb97446a53b2a25af3037b81421a1f0347e8b in lucene-solr's branch refs/heads/branch_6_0 from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=d7adb97

LUCENE-7543: fixed canonical URL in comment

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit cf51e5cf74d03d9ed0fd7aa00df7c198067b7288 in lucene-solr's branch refs/heads/branch_6_1 from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=cf51e5c

LUCENE-7543: fixed canonical URL in comment

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit 819bea1fdf74aa91f1ef43c7a2ba47fe2f0992c7 in lucene-solr's branch refs/heads/branch_6_2 from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=819bea1

LUCENE-7543: fixed canonical URL in comment

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit 8fba114d69535959591091e84a32092a857767e5 in lucene-solr's branch refs/heads/branch_6_3 from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=8fba114

LUCENE-7543: fixed canonical URL in comment

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit f0f30eec303394105fc256d71bef5567b08bc586 in lucene-solr's branch refs/heads/branch_6x from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=f0f30ee

LUCENE-7543: fixed canonical URL in comment

asfimport commented 7 years ago

ASF subversion and git services (migrated from JIRA)

Commit b768a83a1e884fbf65c7044738ea88dac4c38e84 in lucene-solr's branch refs/heads/master from @sarowe https://git-wip-us.apache.org/repos/asf?p=lucene-solr.git;h=b768a83

LUCENE-7543: fixed canonical URL in comment

asfimport commented 7 years ago

Steven Rowe (@sarowe) (migrated from JIRA)

Committed.

Thanks @manokovacs!

asfimport commented 7 years ago

Steven Rowe (@sarowe) (migrated from JIRA)

Reopening to address Jenkins failures due to missing Perl module XML::Simple.

asfimport commented 7 years ago

Steven Rowe (@sarowe) (migrated from JIRA)

Patch to parse DOAP RDF files using Ant's <xmlproperty> task, output comma-separated values for the release names and dates to a temporary file, then have changes2html.pl read release dates from the temporary file. This way the Perl XML::Simple module, which may not be available on some users machines (e.g. Jenkins, running Ubuntu) is not required.

Committing shortly.