Merge lp:~abentley/launchpad/recipe-index into lp:launchpad
| Status: | Merged |
|---|---|
| Approved by: | Edwin Grubbs on 2010-03-24 |
| Approved revision: | no longer in the source branch. |
| Merged at revision: | not available |
| Proposed branch: | lp:~abentley/launchpad/recipe-index |
| Merge into: | lp:launchpad |
| Diff against target: |
1151 lines (+457/-87) 24 files modified
configs/development/build-from-branch.zcml (+36/-0) lib/lp/buildmaster/interfaces/buildbase.py (+6/-6) lib/lp/buildmaster/model/builder.py (+2/-2) lib/lp/code/browser/sourcepackagerecipe.py (+61/-0) lib/lp/code/browser/tests/test_sourcepackagerecipe.py (+128/-0) lib/lp/code/configure.zcml (+8/-1) lib/lp/code/interfaces/sourcepackagerecipe.py (+23/-2) lib/lp/code/model/sourcepackagerecipe.py (+27/-8) lib/lp/code/model/sourcepackagerecipedata.py (+4/-4) lib/lp/code/templates/sourcepackagerecipe-index.pt (+80/-0) lib/lp/registry/browser/person.py (+5/-0) lib/lp/registry/interfaces/person.py (+3/-0) lib/lp/registry/model/person.py (+6/-0) lib/lp/soyuz/doc/build-failedtoupload-workflow.txt (+1/-1) lib/lp/soyuz/doc/build-notification.txt (+2/-2) lib/lp/soyuz/doc/build.txt (+1/-1) lib/lp/soyuz/doc/buildd-mass-retry.txt (+4/-4) lib/lp/soyuz/doc/buildd-slavescanner.txt (+6/-6) lib/lp/soyuz/doc/gina.txt (+1/-1) lib/lp/soyuz/stories/ppa/xx-copy-packages.txt (+1/-1) lib/lp/soyuz/stories/soyuz/xx-build-record.txt (+11/-10) lib/lp/soyuz/stories/soyuz/xx-builds-pages.txt (+30/-30) lib/lp/soyuz/stories/soyuz/xx-private-builds.txt (+1/-1) lib/lp/testing/factory.py (+10/-7) |
| To merge this branch: | bzr merge lp:~abentley/launchpad/recipe-index |
| Related bugs: |
| Reviewer | Review Type | Date Requested | Status |
|---|---|---|---|
| Michael Nelson (community) | ui | Approve on 2010-03-24 | |
| Guilherme Salgado (community) | Approve on 2010-03-23 | ||
| Paul Hummer (community) | ui* | 2010-03-19 | Approve on 2010-03-22 |
| Canonical Launchpad Engineering | code | 2010-03-19 | Pending |
|
Review via email:
|
|||
Description of the Change
= Summary =
Provide an index page for recipes
== Proposed fix ==
== Pre-implementation notes ==
Mostly discussed with rockstar, some with thumper
== Implementation details ==
Because we do not want to provide an unfinished UI to Edge users, this page
is only enabled for the test runner and devel.
As well as a view for recipes, a view for builds was provided, so that we can
get user-facing information the view class.
It was determined, in discussion with Muharem, that the default of creating
builders with manual=True is not a sane default for test purposes. This has an
impact on ETA calculations, because manual builders are ignored in such
calculations. Therefore, I added the ability to control the manual flag in
IBuilderSet.new, and forced it to False in the factory method.
In consultation with Michael Hudson, I determined that
_SourcePackageR
view and manipulate directly. However, it needs to remain a separate class
because it is common to recipes and manifests. So I had SourcePackageRecipe
delegate to it.
There were miscellaneous lint fixes, like calling Storm.__init__ in subclasses.
I adjusted LaunchpadObject
displayname for distroseries. I adjusted makeSourcePacka
allow specifying a build. These changes helped me provide a consistent
homepage for tests.
== Tests ==
bin/test -v test_sourcepack
== Demo and Q/A ==
Cannot be Q/A'ed until more pieces are in place.
= Launchpad lint =
Checking for conflicts. and issues in doctests and templates.
Running jslint, xmllint, pyflakes, and pylint.
Using normal rules.
Linting changed files:
lib/lp/
lib/lp/
lib/lp/
configs/
lib/lp/
lib/lp/
lib/lp/
lib/lp/
lib/lp/
lib/lp/
lib/lp/
lib/lp/
lib/lp/
== Pylint notices ==
lib/lp/
14: [F0401] Unable to import 'bzrlib.
17: [F0401] Unable to import 'lazr.enum' (No module named enum)
lib/lp/
1710: [F0401, LaunchpadObject
lib/lp/
523: [C0301] Line too long (80/78)
53: [F0401] Unable to import 'lazr.enum' (No module named enum)
54: [F0401] Unable to import 'lazr.lifecycle
55: [F0401] Unable to import 'lazr.restful.
56: [F0401] Unable to import 'lazr.restful.
63: [F0401] Unable to import 'lazr.restful.
410: [E1002, PersonNameField
1414: [C0322, IPersonEditRest
status=
^
comment=
@export_
def addMember(person, reviewer, status=
comment=None, force_team_
may_
1455: [C0322, IPersonEditRest
comment=Text())
^
@export_
def acceptInvitatio
1467: [C0322, IPersonEditRest
comment=Text())
^
@export_
def declineInvitati
1765: [C0322, IPersonSet.newTeam] Operator not preceded by a space
defaultmemb
^
defaultrene
@operation_
subscriptio
title=
required=False, default=
@export_
ITeam, ['name', 'displayname', 'teamdescription',
'defaultmem
def newTeam(teamowner, name, displayname, teamdescription
subscriptio
defaultmemb
1834: [C0322, IPersonSet.
created_
^
title=
created_
title=
)
@operation_
@export_
def findPerson(text="", exclude_
must_
created_
lib/lp/
11: [F0401] Unable to import 'lazr.delegates' (No module named delegates)
lib/lp/
125: [C0301] Line too long (79/78)
lib/lp/
17: [F0401] Unable to import 'lazr.restful.
lib/lp/
117: [F0401] Unable to import 'lazr.delegates' (No module named delegates)
118: [F0401] Unable to import 'lazr.config' (No module named config)
119: [F0401] Unable to import 'lazr.restful.
120: [F0401] Unable to import 'lazr.restful.
230: [F0401] Unable to import 'lazr.uri' (No module named uri)
| Aaron Bentley (abentley) wrote : | # |
| Guilherme Salgado (salgado) wrote : | # |
This looks good but I have a few questions/
review needsfixing
On Fri, 2010-03-19 at 14:53 +0000, Aaron Bentley wrote:
>
> = Summary =
> Provide an index page for recipes
>
> == Proposed fix ==
>
> == Pre-implementation notes ==
> Mostly discussed with rockstar, some with thumper
>
> == Implementation details ==
> Because we do not want to provide an unfinished UI to Edge users, this
> page
> is only enabled for the test runner and devel.
>
> As well as a view for recipes, a view for builds was provided, so that
> we can
> get user-facing information the view class.
>
> It was determined, in discussion with Muharem, that the default of
> creating
> builders with manual=True is not a sane default for test purposes.
> This has an
> impact on ETA calculations, because manual builders are ignored in
> such
> calculations. Therefore, I added the ability to control the manual
> flag in
> IBuilderSet.new, and forced it to False in the factory method.
>
> In consultation with Michael Hudson, I determined that
> _SourcePackageR
> sense to
> view and manipulate directly. However, it needs to remain a separate
> class
> because it is common to recipes and manifests. So I had
> SourcePackageRecipe
> delegate to it.
>
> There were miscellaneous lint fixes, like calling Storm.__init__ in
> subclasses.
>
> I adjusted LaunchpadObject
> specifying a
> displayname for distroseries. I adjusted
> makeSourcePacka
> allow specifying a build. These changes helped me provide a
> consistent
> homepage for tests.
>
> == Tests ==
> bin/test -v test_sourcepack
>
> == Demo and Q/A ==
> Cannot be Q/A'ed until more pieces are in place.
>
> === modified file 'lib/lp/
> --- lib/lp/
> +++ lib/lp/
> @@ -6,3 +6,79 @@
> __metaclass__ = type
>
> __all__ = []
> +
> +
> +from canonical.
> + LaunchpadView)
> +from lp.buildmaster.
> +
> +
> +class SourcePackageRe
> + """Default view of a SourcePackageRe
> +
> + @property
> + def title(self):
> + return self.context.name
> +
> + label = title
> +
> + @property
> + def builds(self):
> + """A list of interesting builds.
> +
> + All pending builds are shown, as well as 1-5 recent builds.
> + Recent builds are ordered by date completed.
> + """
> + builds = list(self.
> + for build in self.context.
> + builds.
> + if len(builds) >= 5:
> + break
> + builds.reverse()
> + return builds
> +
> +
> +class SourcePackageRe
> + """Default view of a SourcePackageRe
> +
> + @property
> + def status(self):
> + """A human-friendly status string."""
> + description = {
> + BuildStatus.
| Aaron Bentley (abentley) wrote : | # |
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Guilherme Salgado wrote:
>> + @property
>> + def status(self):
>> + """A human-friendly status string."""
>> + description = {
>> + BuildStatus.
>> + BuildStatus.
>> + BuildStatus.
>> + BuildStatus.
>> + 'Could not build because of missing dependencies',
>> + BuildStatus.
>> + 'Could not build because of chroot issues',
>> + BuildStatus.
>> + 'Could not build because source package was superseded',
>> + BuildStatus.
>> + 'Currently building',
>> + BuildStatus.
>> + 'Could not be uploaded correctly',
>
> Would it not make sense to have these strings as the title of the items
> in the BuildStatus enum?
That's Soyuz code, and I don't want to change it unnecessarily. I don't
know how the existing titles are used, and whether these strings would
make sense in that context.
>> === added file 'lib/lp/
>> --- lib/lp/
>> +++ lib/lp/
>> +class TestSourcePacka
>
> Judging by the test class' name, I was expecting to see a test for
> SourcePackageRe
> about renaming the test class to TestSourcePacka
Done.
>
>> +
>> + layer = DatabaseFunctio
>> +
>> + def makeRecipe(self):
>> + chef = self.factory.
>> + name='chef')
>> + chocolate = self.factory.
>> + cake_branch = self.factory.
>> + product=chocolate)
>
> Mind moving all arguments into the same line, in the calls to
> makeProductBranch and makePerson above? They should either be on a line
> by themselves or be aligned...
Done.
>> + def getMainText(self, recipe):
>> + browser = self.getUserBro
>> + return extract_
>> +
>> + def test_index(self):
>> + recipe = self.makeRecipe()
>> + build = removeSecurityP
>> + recipe=recipe))
>> + build.buildstate = BuildStatus.
>> + build.datebuilt = datetime(2010, 03, 16, tzinfo=utc)
>> + pattern = re.compile(
>> + Master Chef
>> + Branches
>> + Description
>> + This recipe .*changes.
>> + Recipe Information
>> + Owner:
>> + Master Chef
>> + Base branch:
>> + lp://dev/
>> + Debian version:
>> + 1.0
>> + Distros:
>> + Secret Squirrel
>> + Build reco...
| Paul Hummer (rockstar) wrote : | # |
I don't have any comments because we've been iterating over this for a week, making changes here and there. This is exactly as we have discussed over the last week.
| Guilherme Salgado (salgado) wrote : | # |
On Mon, 2010-03-22 at 14:09 +0000, Aaron Bentley wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Guilherme Salgado wrote:
> >> + @property
> >> + def status(self):
> >> + """A human-friendly status string."""
> >> + description = {
> >> + BuildStatus.
> >> + BuildStatus.
> >> + BuildStatus.
> >> + BuildStatus.
> >> + 'Could not build because of missing dependencies',
> >> + BuildStatus.
> >> + 'Could not build because of chroot issues',
> >> + BuildStatus.
> >> + 'Could not build because source package was superseded',
> >> + BuildStatus.
> >> + 'Currently building',
> >> + BuildStatus.
> >> + 'Could not be uploaded correctly',
> >
> > Would it not make sense to have these strings as the title of the items
> > in the BuildStatus enum?
>
> That's Soyuz code, and I don't want to change it unnecessarily. I don't
> know how the existing titles are used, and whether these strings would
> make sense in that context.
>
Being able to use the enum's titles both here and in soyuz code will
make for more consistent UI and avoid this extra code, so we all win.
Have you checked what the current title is for them? Maybe you could
use what's there already?
Julian, what do you think?
> >> === modified file 'lib/lp/
> >> --- lib/lp/
> >> +++ lib/lp/
> >> @@ -9,7 +9,7 @@
> >> """
> >>
> >> __metaclass__ = type
> >> -__all__ = ['_SourcePackag
> >> +__all__ = ['SourcePackage
> >
> > Why did you rename it?
>
> It has become part of the public API, no longer an implementation
> detail, because it manages data that is useful to address directly.
>
Ok.
> >> from bzrlib.
> >> BaseRecipeBranch, MergeInstruction, NestInstruction, RecipeBranch)
> >> @@ -50,6 +50,7 @@
> >>
> >> def __init__(self, name, type, comment, line_number, branch, revspec,
> >> directory, recipe_data, parent_
> >> + super( _SourcePackageR
> >
> > Is there a whitespace preceding the class name above?
>
> There was. Gone now.
>
> >> + <dl id="distros">
> >> + <dt>Distros:</dt>
> >
> > Is this really meant to be in the plural? Judging by the code below,
> > I'd expect to see a single distribution series here.
>
> Yes, it is meant to be in the plural. There is a database patch that is
> just waiting for Bjorn's review to change the relationship to a
> many-to-many:
> https:/
>
Ok, cool.
> > Also, we shouldn't
> > be using 'Distros' in the UI, should we?
>
> Okay, so what should we be using?
Distributions, perha...
| Aaron Bentley (abentley) wrote : | # |
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Guilherme Salgado wrote:
> Being able to use the enum's titles both here and in soyuz code will
> make for more consistent UI and avoid this extra code, so we all win.
> Have you checked what the current title is for them? Maybe you could
> use what's there already?
I have looked at what's there, and it's not appropriate for us. That
suggests our text won't be appropriate in Soyuz contexts.
Also, we are attempting to land this without any impact on end-users.
Changing the enum titles would have an impact.
> Distributions, perhaps? I know we shouldn't use abbreviations in the
> UI, but maybe 'Distros' is an exception? The UI reviewer ought to know.
Okay.
Aaron
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://
iEYEARECAAYFAku
iUMAnjYRuLh1ZQQ
=6O54
-----END PGP SIGNATURE-----
| Michael Nelson (michael.nelson) wrote : | # |
Hi Aaron and Paul,
This is looking great! First, sorry if I'm re-asking questions that may have already been discussed by you both. But as I don't know the history of the discussions, I'll ask them anyway.
To test this out in the UI, I've put a breakpoint at the end of test_index, and run a devserver using the testrunner config (it'd be great to include instructions like this when requesting a ui review).
The layout looks great - nice and clean. There are a few small things that popped into mind:
The first thing that stands out is that I need to include a %20 in the url to be able to traverse to the recipe... is that intentional? So the url I'm using is:
https:/
Normally we have a human readable displayname, and name is normally cake_recipe, but perhaps you guys decided against this for good reason (we should slugify the displayname for the initial name right?). The mockup for recipe creation assumed it would be a slug: http://
It's unfortunate that branch names are so long - it's the one thing that looks very squashed in your screenshot (looks fine locally with a wider browser of course), but I guess you always have to deal with that :) Is it possible to use a short name here?
Now I'm sure this *is* something you've discussed - but why isn't the traversal for a recipe (or recipes) off the base branch? (is it in case the base-branch is modified?). I'm just looking at the bread-crumbs and wondering whether it will be: "person >> branches >> recipes >> recipe_
Similar to Guilherme, I think "Distros" should be "Distribution series" (as it's the series to which you're linking). This is consistent with the product-packages.pt template. There are some cases where we simply use "Series" but that's only when the context is already a distribution.
On a related note: I also agree that we should not need to re-define the buildstate titles/descriptions (what's wrong with "Successfully built 7 minutes ago" in the UI?). I don't see why we can't define a good set of common titles and descriptions (that's why we moved BuildBase and BuildStatus to lp.buildmaster). The main issue seems to be that the current ones (BuildStatus) are still soyuz-specific and I guess changing them will blow this branch out (due to test failures). Can you create a bug and XXX here so that we don't forget. Another option you might consider (still with an XXX) is to augment the current ones here, rather than create a new set with some duplication? (eg. code_specific_
Again, something you've probably already discussed, but in the mockups we were planning on presenting the "Packaging branch" (just a merge statement with the name 'packaging') if one was defined for the recipe (optional, as an advanced recipe might specify multiple packaging related branches). Is it worth adding it to the "Recipe information" portlet? (which should actually be ...
| Julian Edwards (julian-edwards) wrote : | # |
On Monday 22 March 2010 18:12:40 Guilherme Salgado wrote:
> On Mon, 2010-03-22 at 14:09 +0000, Aaron Bentley wrote:
> > -----BEGIN PGP SIGNED MESSAGE-----
> > Hash: SHA1
> >
> > Guilherme Salgado wrote:
> > >> + @property
> > >> + def status(self):
> > >> + """A human-friendly status string."""
> > >> + description = {
> > >> + BuildStatus.
> > >> + BuildStatus.
> > >> + BuildStatus.
> > >> + BuildStatus.
> > >> + 'Could not build because of missing dependencies',
> > >> + BuildStatus.
> > >> + 'Could not build because of chroot issues',
> > >> + BuildStatus.
> > >> + 'Could not build because source package was
> > >> superseded', + BuildStatus.
> > >> + 'Currently building',
> > >> + BuildStatus.
> > >> + 'Could not be uploaded correctly',
> > >
> > > Would it not make sense to have these strings as the title of the items
> > > in the BuildStatus enum?
> >
> > That's Soyuz code, and I don't want to change it unnecessarily. I don't
> > know how the existing titles are used, and whether these strings would
> > make sense in that context.
>
> Being able to use the enum's titles both here and in soyuz code will
> make for more consistent UI and avoid this extra code, so we all win.
> Have you checked what the current title is for them? Maybe you could
> use what's there already?
>
> Julian, what do you think?
I think that using the enum titles is absolutely the right thing to do.
There are some templates that use the existing titles (grep for
"buildstate/
still make sense, but I fully support anything that makes the UI more
readable!
> > >> + def getRecipe(name):
> > > I wonder if we shouldn't call this getSourcePackag
> > > Although it's a lot longer it doesn't leave one wondering what sort of
> > > recipe could a person have.
> >
> > IMO, SourcePackageRecipe is way too long, and the fewer places we use
> > it, the better. I think the confusion will be short-lived, and less
> > typing is a win.
>
> Ok
FWIW I think getSourcePackag
kinds of recipes in the future? And all editors I've used have auto-complete
:)
J
| Aaron Bentley (abentley) wrote : | # |
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Michael Nelson wrote:
> Normally we have a human readable displayname, and name is normally
> cake_recipe, but perhaps you guys decided against this for good
> reason (we should slugify the displayname for the initial name
> right?). The mockup for recipe creation assumed it would be a slug:
> http://
The table does not provide a displayname, so I used the name. It was an
error to use "Cake Recipe" as the name. I should have used
"cake_recipe" or similar.
> It's unfortunate that branch names are so long - it's the one thing
> that looks very squashed in your screenshot (looks fine locally with
> a wider browser of course), but I guess you always have to deal with
> that :) Is it possible to use a short name here?
We use short names automatically when they are available, but most
branches don't have short names.
> Now I'm sure this *is* something you've discussed - but why isn't the
> traversal for a recipe (or recipes) off the base branch?
The canonical URL is already defined in stable/dbstable; it was not
introduced by this branch. Tim proposed the current URL and no one
disagreed, so it was documented in
https:/
As you note, branch names are long, which is a disadvantage.
Sourcepackagebr
change the base branch in a recipe, so varying the name according to the
base branch would make URLs volatile.
> Similar to Guilherme, I think "Distros" should be "Distribution
> series" (as it's the series to which you're linking). This is
> consistent with the product-packages.pt template. There are some
> cases where we simply use "Series" but that's only when the context
> is already a distribution.
Done
> On a related note: I also agree that we should not need to re-define
> the buildstate titles/descriptions (what's wrong with "Successfully
> built 7 minutes ago" in the UI?)
It's not the UI that I was tasked to implement:
http://
>. I don't see why we can't define a
> good set of common titles and descriptions (that's why we moved
> BuildBase and BuildStatus to lp.buildmaster). The main issue seems to
> be that the current ones (BuildStatus) are still soyuz-specific and I
> guess changing them will blow this branch out (due to test failures).
I find the existing ones hard to understand. That's the biggest issue
from my point of view. But they also didn't match the grammar in the UI
mockup.
> Can you create a bug and XXX here so that we don't forget.
Per Julian, I have changed all the enums to match what Code needs.
> Again, something you've probably already discussed, but in the
> mockups we were planning on presenting the "Packaging branch"
We believe that's not required for the initial cut. We are going for
the simplest thing that could possibly work.
Aaron
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://
iEYEARECAAYFAku
ncoAnj4u3smwkzE
| Aaron Bentley (abentley) wrote : | # |
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Julian Edwards wrote:
> I think that using the enum titles is absolutely the right thing to do.
Okay, I have changed the enum titles.
Aaron
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://
iEYEARECAAYFAku
hmwAni08pSXCzY8
=w0Jz
-----END PGP SIGNATURE-----
| Michael Nelson (michael.nelson) wrote : | # |
Thanks for filling me in on all the info Aaron.
On Tue, Mar 23, 2010 at 3:51 PM, Aaron Bentley <email address hidden> wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Michael Nelson wrote:
>> Normally we have a human readable displayname, and name is normally
>> cake_recipe, but perhaps you guys decided against this for good
>> reason (we should slugify the displayname for the initial name
>> right?). The mockup for recipe creation assumed it would be a slug:
>> http://
>
> The table does not provide a displayname, so I used the name. Â It was an
> error to use "Cake Recipe" as the name. Â I should have used
> "cake_recipe" or similar.
OK, so the create validation will need to enforce this I guess. Great.
>> Now I'm sure this *is* something you've discussed - but why isn't the
>> traversal for a recipe (or recipes) off the base branch?
>
> The canonical URL is already defined in stable/dbstable; it was not
> introduced by this branch. Â Tim proposed the current URL and no one
> disagreed, so it was documented in
> https:/
>
> As you note, branch names are long, which is a disadvantage.
> Sourcepackagebr
> change the base branch in a recipe, so varying the name according to the
> base branch would make URLs volatile.
I got to chat briefly with Tim and he had a few other points too, so
just for the record in case anyone else asks the same question (I'll
try to document this on the wiki as a FAQ or something):
{{{
08:43 < noodles775> The only reason I could think of (which Aaron also
highlighted) is that it would be fragile if the base branch changes
etc., but the original mockups didn't allow you to change the base
branch of a recipe.
08:43 < thumper> noodles775: and I picked something
08:44 < noodles775> thumper: no problem, as long as you guys have
thought about it.
08:44 < thumper> noodles775: but what about changing the name of a branch?
08:44 < thumper> noodles775: or changing the owner
08:44 < thumper> noodles775: both of those change the unique name of the branch
08:44 < thumper> noodles775: and since the branch is accessed through
the id, the recipe url would chnage
08:45 < thumper> noodles775: also ~user/+recipe/name is short
08:45 < noodles775> thumper: I see, whereas both of those things
wouldn't change the recipe url where it is currently? Great.
08:45 * thumper nods
}}}
>
>> On a related note: I also agree that we should not need to re-define
>> the buildstate titles/descriptions (what's wrong with "Successfully
>> built 7 minutes ago" in the UI?)
>
> It's not the UI that I was tasked to implement:
> http://
Right, if Paul specifically chose "Successful build" because he
thought "Successfully built" was incorrect, then I think it's worth
updating the BuildStatus as you've done, to improve it.
>
>>. I don't see why we can't define a
>> good set of common titles and descriptions (that's why we moved
>> BuildBase and BuildStatus to lp.buildmaster). The main issue seems to
>> be that the current ones (BuildSta...

Screenshot: people. canonical. com/~abentley/ recipe- index-review. png
http://