Blame PROJECTS.md

Packit ae9e2a
Projects For LibGit2
Packit ae9e2a
====================
Packit ae9e2a
Packit ae9e2a
So, you want to start helping out with `libgit2`? That's fantastic! We
Packit ae9e2a
welcome contributions and we promise we'll try to be nice.
Packit ae9e2a
Packit ae9e2a
This is a list of libgit2 related projects that new contributors can take
Packit ae9e2a
on.  It includes a number of good starter projects as well as some larger
Packit ae9e2a
ideas that no one is actively working on.
Packit ae9e2a
Packit ae9e2a
## Before You Start
Packit ae9e2a
Packit ae9e2a
Please start by reading the [README.md](README.md),
Packit ae9e2a
[CONTRIBUTING.md](CONTRIBUTING.md), and [CONVENTIONS.md](CONVENTIONS.md)
Packit ae9e2a
files before diving into one of these projects.  Those explain our work
Packit ae9e2a
flow and coding conventions to help ensure that your work will be easily
Packit ae9e2a
integrated into libgit2.
Packit ae9e2a
Packit ae9e2a
Next, work through the build instructions and make sure you can clone the
Packit ae9e2a
repository, compile it, and run the tests successfully.  That will make
Packit ae9e2a
sure that your development environment is set up correctly and you are
Packit ae9e2a
ready to start on libgit2 development.
Packit ae9e2a
Packit ae9e2a
## Starter Projects
Packit ae9e2a
Packit ae9e2a
These are good small projects to get started with libgit2.
Packit ae9e2a
Packit ae9e2a
* Look at the `examples/` programs, find an existing one that mirrors a
Packit ae9e2a
  core Git command and add a missing command-line option.  There are many
Packit ae9e2a
  gaps right now and this helps demonstrate how to use the library.  Here
Packit ae9e2a
  are some specific ideas (though there are many more):
Packit ae9e2a
    * Fix the `examples/diff.c` implementation of the `-B`
Packit ae9e2a
      (a.k.a. `--break-rewrites`) command line option to actually look for
Packit ae9e2a
      the optional `[<n>][/<m>]` configuration values. There is an
Packit ae9e2a
      existing comment that reads `/* TODO: parse thresholds */`. The
Packit ae9e2a
      trick to this one will be doing it in a manner that is clean and
Packit ae9e2a
      simple, but still handles the various cases correctly (e.g. `-B/70%`
Packit ae9e2a
      is apparently a legal setting).
Packit ae9e2a
    * Implement the `--log-size` option for `examples/log.c`. I think all
Packit ae9e2a
      the data is available, you would just need to add the code into the
Packit ae9e2a
      `print_commit()` routine (along with a way of passing the option
Packit ae9e2a
      into that function).
Packit ae9e2a
    * As an extension to the matching idea for `examples/log.c`, add the
Packit ae9e2a
      `-i` option to use `strcasestr()` for matches.
Packit ae9e2a
    * For `examples/log.c`, implement the `--first-parent` option now that
Packit ae9e2a
      libgit2 supports it in the revwalk API.
Packit ae9e2a
* Pick a Git command that is not already emulated in `examples/` and write
Packit ae9e2a
  a new example that mirrors the behavior.  Examples don't have to be
Packit ae9e2a
  perfect emulations, but should demonstrate how to use the libgit2 APIs
Packit ae9e2a
  to get results that are similar to Git commands.  This lets you (and us)
Packit ae9e2a
  easily exercise a particular facet of the API and measure compatibility
Packit ae9e2a
  and feature parity with core git.
Packit ae9e2a
* Submit a PR to clarify documentation! While we do try to document all of
Packit ae9e2a
  the APIs, your fresh eyes on the documentation will find areas that are
Packit ae9e2a
  confusing much more easily.
Packit ae9e2a
Packit ae9e2a
If none of these appeal to you, take a look at our issues list to see if
Packit ae9e2a
there are any unresolved issues you'd like to jump in on.
Packit ae9e2a
Packit ae9e2a
## Larger Projects
Packit ae9e2a
Packit ae9e2a
These are ideas for larger projects mostly taken from our backlog of
Packit ae9e2a
[Issues](https://github.com/libgit2/libgit2/issues).  Please don't dive
Packit ae9e2a
into one of these as a first project for libgit2 - we'd rather get to
Packit ae9e2a
know you first by successfully shipping your work on one of the smaller
Packit ae9e2a
projects above.
Packit ae9e2a
Packit ae9e2a
Some of these projects are broken down into subprojects and/or have
Packit ae9e2a
some incremental steps listed towards the larger goal.  Those steps
Packit ae9e2a
might make good smaller projects by themselves.
Packit ae9e2a
Packit ae9e2a
* Port part of the Git test suite to run against the command line emulation
Packit ae9e2a
  in `examples/`
Packit ae9e2a
    * Pick a Git command that is emulated in our `examples/` area
Packit ae9e2a
    * Extract the Git tests that exercise that command
Packit ae9e2a
    * Convert the tests to call our emulation
Packit ae9e2a
    * These tests could go in `examples/tests/`...
Packit ae9e2a
* Add hooks API to enumerate and manage hooks (not run them at this point)
Packit ae9e2a
    * Enumeration of available hooks
Packit ae9e2a
    * Lookup API to see which hooks have a script and get the script
Packit ae9e2a
    * Read/write API to load a hook script and write a hook script
Packit ae9e2a
    * Eventually, callback API to invoke a hook callback when libgit2
Packit ae9e2a
      executes the action in question
Packit ae9e2a
* Isolate logic of ignore evaluation into a standalone API
Packit ae9e2a
* Upgrade internal libxdiff code to latest from core Git
Packit ae9e2a
* Tree builder improvements:
Packit ae9e2a
    * Extend to allow building a tree hierarchy
Packit ae9e2a
* Apply-patch API
Packit ae9e2a
* Add a patch editing API to enable "git add -p" type operations
Packit ae9e2a
* Textconv API to filter binary data before generating diffs (something
Packit ae9e2a
  like the current Filter API, probably).
Packit ae9e2a
* Performance profiling and improvement
Packit ae9e2a
* Support "git replace" ref replacements
Packit ae9e2a
* Include conflicts in diff results and in status
Packit ae9e2a
    * GIT_DELTA_CONFLICT for items in conflict (with multiple files)
Packit ae9e2a
    * Appropriate flags for status
Packit ae9e2a
* Support sparse checkout (i.e. "core.sparsecheckout" and ".git/info/sparse-checkout")