brew/share/doc/homebrew/Maintainer-Guidelines.md
Viktor Szakats b81097cdee Use more https links and some link updates along the way
Closes Homebrew/homebrew#35529.

Signed-off-by: Jack Nagel <jacknagel@gmail.com>
2015-01-03 23:03:08 -05:00

6.3 KiB
Raw Blame History

Maintainer Guidelines

This guide is for maintainers. These special people have write access to Homebrews repository and help merge the contributions of others. You may find what is written here interesting, but its definitely not a beginners guide.

Maybe you were looking for the Formula Cookbook?

Quick Checklist

This is all that really matters:

  • Ensure the name is correct. This cannot be changed later, so it must be right the first time!
  • Add aliases
  • Ensure it is not a dupe of anything that comes with OS X
  • Ensure it is not a library that can be installed with gem, cpan or pip.
  • Ensure the name is not in Rubys stdlib (Try Formula.factory('readline') in the brew irb shell)
  • Ensure that any dependencies are accurate

You should test the build process. But youre really pressed for time, just get it in there and let someone else test the build.

Checking deps is important, because they will probably stick around forever. Nobody really checks if they are necessary or not. Use the :optional and :recommended modifiers as appropriate.

Depend on as little stuff as possible. Avoid X11 functionality unless it is required. For example, we build Wireshark, but not the monolithic GUI. If users want that, they should just grab the DMG that Wireshark themselves provide.

Homebrew is about UNIX software. Stuff that builds to an .app should be accepted frugally. That is, rarely.

Naming

The name is the strictest item, because we cant change it afterwards.

Choose a name thats the colloquial (most common) name for the project. For example, we chose objective-caml, but we should have chosen ocaml. Choose what people say to each other when talking about the project.

Add other names as aliases with the aka class function. Ensure the name referenced on the homepage is one of these, as it may be different and have underscores and hyphens and so on.

We dont allow versions in formula names (e.g. bash4.rb). This is sometimes frustrating, but were trying to solve this properly. (python3.rb is a rare exception, because its basically a “new” language and installs no conflicting executables.)

For now, if someone submits a formula like this, well leave them in their own tree.

Merging, rebasing, cherry-picking

Merging is mainly useful when new work is being done. Please rebase or cherry-pick contributions rather than fill our tree up with noisy merge commits.

Dont rebase until you finally push. Once pushed, you cant rebase
youre a maintainer now!

Cherry-picking changes the date of the commit, which kind of sucks.

Dont merge unclean branches. So if someone is still learning git their branch is filled with nonsensical merges, then rebase and squash the commits. Our main branch history should be useful to other people, not confusing.

Testing

We need to at least check it builds. Use Brew Test Bot for this.

Verify the formula works if possible. If you cant tell—for example, if its a library—trust the original contributor, it worked for them, so chances are it is fine. If you arent an expert in the tool in question, you cant really gauge if the formula installed the program correctly. At some point an expert will come along, cry blue murder that it doesnt work, and fix it. This is how open source works. Ideally, request a test do block to test that functionality is consistently available.

If the formula uses a repository, then the url parameter should have a tag or revision. url s have versions and are stable (not yet implemented!).

Testing in /usr/local and somewhere else

If not completely annoying, test in both /usr/local and somewhere else. Preferably on different machines to ensure the /usr/local install doesnt effect the other one.

The reason for this is some build systems suck, and fail if deps arent installed in /usr/local, even though Homebrew goes to some lengths to try to make this work.

Common “Gotchas”

  1. Ensure you have set your username and email address properly
  2. Sign off cherry-picks if you amended them, GitX-dev can do this, otherwise there is a command line flag for it)
  3. If the commit fixes a bug, use “Fixes #104” syntax to close the bug report and link to the commit

Build “Gotchas”

Often parallel builds work with 2-core systems, but fail on 4-core systems.

Dupes

The main branch avoids dupes as much as possible. The exception is libraries that OS X provides but have bugs, and the bugs are fixed in a newer version. Or libraries that OS X provides, but they are too old for some other formula.

Still determine if it possible to avoid the dupe. Be thorough. Duped libs and tools cause bugs that are tricky to solve. Once the formula is pulled, we cant go back on that willy-nilly.

If it dupes anything ask another contributor first. Some dupes are okay, some can cause subtle issues we dont want to have to deal with in the future.

Dupes we have allowed:

  • libxml <— OS X version is old and buggy
  • libpng <— Ditto

Add comments!

It may be enough to refer to an issue ticket, but make sure changes that if you came to them unaware of the surrounding issues would make sense to you. Many times on other projects Ive seen code removed because the new guy didnt know why it was there. Regressions suck.

Dont allow bloated diffs

Amend a cherry-pick to remove commits that are only changes in whitespace. They are not acceptable because our history is important and git blame should be useful.

Whitespace corrections (to ruby standard etc.) are allowed (in fact this is a good opportunity to do it) provided the line itself has some kind of modification that is not whitespace in it. But be careful about making changes to inline patches—make sure they still apply.

This rule is why the case statement in the brew tool is a mess. Well fix such things up for v2.

Moving formulae from one tap to another

And preserving the history. I made a gist about this, based on Jacks initial version.