Skip to content

Latest commit

 

History

History
92 lines (65 loc) · 2.86 KB

CONTRIBUTING.md

File metadata and controls

92 lines (65 loc) · 2.86 KB

Contributing to Gitnu

Main logic flow

  1. Preprocessing (fallible)
    1. Get the path to the git directory relative to the current directory.
    2. Get git aliases.
    3. Read the cache file (regardless of git command).
  2. Parsing (infallible)
    1. Pass the CLI arguments through a function to obtain a final list of arguments to actually run.
    2. This is where numbers and number-ranges are converted to pathspecs, depending on the cache.
  3. Running (fallible)
    1. If git's sub-command is status, then print and parse the output to build the next cache.
    2. Otherwise, run the args as-is.

Error handling

  1. if Preprocessing fails:
    Pass the raw CLI arguments into a git command and run that and use the same exit code.
  2. if Running fails:
    Non-issue. Failing here means there was probably something wrong with the user-supplied command.

Non-trivial behavior

How does git nu manage to call git-nu

Based on git's source code, in the function execv_dashed_external, any executable that is in $PATH that is named git-foo-bar can be ran with git foo-bar.

Additionally, flags placed after git and before foo-bar will be seen by git but not by git-foo-bar.

Parsing arguments after git and before nu

Amazingly, this is not necessary as git will handle all flags in this range.

For example, the -C flag will make git run from a different directory, and that will be accounted for by git, and not git-nu.

Same with configurations set with the -c flag.

So running this command from /foo

> git -C /bar -c alias.zoom=ls-files nu zoom

Will actually run git ls-files on the repo located at /bar.

The caveat is that in code, git-nu sees zoom as the only argument (apart from the binary path), and will effectively return git zoom.

Setting the directory (from -C) and aliasing zoom to ls-files (from -c) are managed by git.

Glossary

git-dir

This is the directory where the HEAD file is stored. On a normal clone, it is at .git/HEAD, and in bare repositories it's in .git/worktrees/<worktree name>/HEAD. So depending on the state of the repo, the value of git-dir may be one of the following:

  • .git
  • .git/worktrees/<worktree name>

git-dir can be found by running the command git rev-parse --git-dir from anywhere in the git workspace.

Gitnu cache file

Stored in the git directory. It stores the output of the last run of git status in that workspace.

The first line is the working directory from which git status was ran.

The remaining lines are the ordered pathspecs of that run of git status.