# Contributing to Emboss

If you would like to fix a bug or add a new feature to Emboss, great!  This
document is intended to help you understand the procedure, so that your change
can land in the main Emboss repository.

You do not have to take a change all the way from start to finish, either: if
you can get a design approved, then someone else can implement it much more
easily.  Conversely, if you are looking for a way to help, you might look for
existing [feature
requests](https://github.com/google/emboss/labels/enhancement) that have
designs or at [open design sketches](design_docs/) that you might be able to
implement.


## All Changes

Because Emboss is a Google project, in order to submit code you will need to
sign a [Google Contributor License Agreement
(CLA)](https://cla.developers.google.com/).

**IMPORTANT**: if your contribution includes code that is not covered by a
Google CLA and is not owned by Google, the Emboss project has to follow special
procedures to include it.  Please let us know ([filing an issue on
GitHub](https://github.com/google/emboss/issues/new) is probably the easiest
way) so that we can walk you through the process.  In particular, we generally
cannot accept any code from StackExchange or similar sites, and any code that
comes from a non-Google open source project needs to have an acceptable license
and be committed to the Emboss repository in a specific location.


### Updating Build Helper Files

The Emboss project provides a set of generated files in the `gen/` directory
that can be used by other build systems (like CMake, GN, etc.) to easily
include the Emboss compiler and C++ runtime sources.

These files are generated from a single source of truth: `build.json`.

-   **`build.json`**: This file, located in the project root, contains the
    canonical lists of source files required for the compiler and the C++
    runtime. It is the only file in this system that should be manually
    edited, though it is typically updated via a script.

-   **`gen/`**: This directory contains the generated helper files. **Do not
    edit these files directly**, as they will be overwritten.

If you change the dependencies of the Emboss compiler or runtime in the Bazel
build system, you will need to update `build.json` and regenerate the helper
files.

-   To update `build.json` with the latest sources from Bazel, run:
    ```bash
    ./scripts/build_helpers/manage_build_json.py
    ```

-   To regenerate the files in `gen/` after modifying `build.json`, run:
    ```bash
    ./scripts/build_helpers/generate_build_files.py
    ```

A CI check is in place to ensure that `build.json` is always in sync with the
Bazel build. If this check fails, you will need to run the `manage_build_json.py`
script and commit the changes.


### How-To Guides

This document covers the process of getting a change into the main Emboss
repository — i.e., what you need to do to get your change into
[the main Emboss repository](https://github.com/google/emboss/).

[How to Implement Changes to Emboss](how-to-implement.md) has an overview of
how to make code changes to Emboss.

[How to Design Features for Emboss](how-to-design.md) has an overview of what
to think about during your design.


### Bug Fixes vs New Features

The general process for bug fixes and new features is the same, but bug fixes
usually require less design work, and therefore can go through lighter
processes.


## Very Small Changes

If you have a tiny change — for example,  making a fix that does not change the
design of `embossc` — you can jump directly into coding.

This process works best if your change is small and not likely to be
controversial, or if you have already completed [the steps for small
changes](#small-changes).

1.  [Code up your proposed change](how-to-implement.md) and open a [pull
    request
    (PR)](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request)
    to [the main Emboss repository](https://github.com/google/emboss/).  If you
    have not completed [the steps for small changes](#small-changes), this
    gives the Emboss maintainers something more concrete to look at, but you
    may end up doing more work if your initial proposal turns out to be the
    wrong approach.

2.  The Emboss maintainers will review your PR, and may request changes.  Don't
    be discouraged if your PR is not immediately accepted — even PRs that
    maintainers send to each other often have requests for changes!  We want
    the Emboss code to be high-quality, which means helping you make your code
    better.

3.  Once your PR reaches a point where it is good enough, an Emboss maintainer
    will merge it into the Emboss repository.


## Small Changes

If your change is small, but still requires some design work — for example,
adding a new utility function in the C++ runtime library, or making a bug fix
that involves re-structuring some of the `embossc` code — it is usually best to
get some feedback before you start coding.

1.  [File an issue on GitHub](https://github.com/google/emboss/issues/new), if
    there is not an issue already.  It is best to use the *problem you want to
    solve* for the issue title and description, and then propose your design in
    a comment.

2.  Once the Emboss maintainers have had a chance to review your proposal and
    agree on the general outline, follow [the procedure for very small
    changes](#very-small-changes).


## Medium and Large Changes

If you have a medium or large change — for example, introducing a new pass in
`embossc`, adding a new data type, adding a new operator to the Emboss
expression language, making a cross-cutting refactoring of `embossc`, etc. —
then you should start by writing a *design sketch*.

A design sketch is, basically, an informal design doc — it covers the topics
that a design doc would cover, but may have open questions or alternatives that
haven't been locked down.

1.  [File an issue on GitHub](https://github.com/google/emboss/issues/new), if
    there is not an issue already.  It is best to use the *problem you want to
    solve* for the issue title and description.

2.  Look at [existing design sketches](design_docs/) and [archived design docs
    for changes that have already landed](design_docs/archive/) to get a feel
    for what should be in a design sketch.

3.  If you have not already done so, read [How to Design Features for
    Emboss](how-to-design.md).

4.  Write a draft design sketch for your change, and open a pull request
    against [the main Emboss repository](https://github.com/google/emboss/).

5.  It is very likely that your design sketch will need revision before it is
    accepted.  If it does, do not be discouraged — we want your change to
    succeed!

6.  Once your design sketch has been accepted, you can move on to
    implementation, following (more or less) the same procedure you would
    follow for [small](#small-changes) or [very small
    changes](#very-small-changes).  Depending on the complexity of the change,
    you may need to split your implementation into multiple changes.
