blob: e0d246aa0e6836f6a132cb0df03c6c4ed4db017e [file] [log] [blame] [view] [edit]
# Git Ref filter module for Gerrit
Gerrit lib module to allow filtering out refs in the Git advertizing
protocol phase.
## When to use git-refs-filter vs. Git's hideRefs or Gerrit's ACLs
Gerrit ACLs, Git's hideRefs and git-refs-filter are all tools for hiding refs from being visible
to a remote Git client. However, the three tools have different scope and performance implications.
### Git's hideRefs: the fastest
Use the [Git's hideRefs](https://git-scm.com/docs/git-config/2.17.0#Documentation/git-config.txt-receivehideRefs)
when *all Git clients* need to be blocked from accessing some refs.
This method to hide refs is the *fastest* possible and has no performance implications.
### git-refs-filter
The git-refs-filter is mostly used with CI systems to avoid the overloading of advertising and
downloading a significant number of refs that would slowdown both Gerrit server and the Git client.
It is more flexible than Git's hideRefs because allows to define a limited group of users for hiding
refs; it also allows to filter Gerrit NoteDb's `/meta` refs which would otherwise require a complex
set of ACLs or plugins.
git-refs-filter is slightly slower than using Git's hideRefs and it does require the configuration
of the change_notes cache in `gerrit.config` to avoid potentially high overhead.
Additionally, this plugin uses an in-memory cache to store previously computed
open/close change statuses to avoid processing them over and over again.
Explicit invalidation of such cache is not necessary, since the change revision
is part of the cache key, so that previous entries automatically become obsolete
once a change status is updated.
### Gerrit ACLs
Use the Gerrit ACLs when you need to hide some of the refs on a per-project basis or when
it is needed a very sophisticated pattern-matching of refs to be excluded.
This is the slowest way to hide refs and needs to be used only when a per-project ACLs policy
is required.
## How to build
Build this module as it was a Gerrit plugin:
- Clone Gerrit source tree
- Clone the git-refs-filter source tree
- Link the ```git-refs-filter``` directory to Gerrit ```/plugins/git-refs-filter```
- From Gerrit source tree run ```bazel build plugins/git-refs-filter```
- And for running tests ```bazel test plugins/git-refs-filter:git_refs_filter_tests```
- The ```git-refs-filter.jar``` module is generated under ```/bazel-genfiles/plugins/git-refs-filter/```
## How install
Copy ```git-refs-filter.jar``` library to Gerrit ```/lib``` and add the following
one extra settings to ```gerrit.config```:
```
[gerrit]
installModule = com.googlesource.gerrit.modules.gitrefsfilter.RefsFilterModule
```
## How to configure filtering
The refsfilter module defines a new global capability called "Filter out closed changes refs".
By default the capability isn't assigned to any user or group, thus the module installation
has no side effects.
Filtering a closed change refs has the following meaning:
- Merged changes and all their patch-sets older than the [grace time](#grace-time-for-closed-changes)
- Abandoned changes and all their patch-sets older than the [grace time](#grace-time-for-closed-changes)
- Corrupted changes and all their patch-sets older than the [grace time](#grace-time-for-closed-changes)
- All '/meta' refs of all changes
- All non-published edits of any changes
It is also possible to define additional refs prefixes to be hidden or explicitly shown,
using a similar syntax to the [hideRefs](https://git-scm.com/docs/git-config/2.17.0#Documentation/git-config.txt-receivehideRefs)
setting, adding a set of `git-refs-filter.hideRefs` configuration settings in
`gerrit.config`.
Example of how to hide all `refs/backup/*` and `refs/sandbox/*` from being advertised
but still show `refs/sandbox/mines/`:
````
[git-refs-filter]
hideRefs = refs/backup/
hideRefs = refs/sandbox/
hideRefs = !refs/sandbox/mine/
```
To enable a group of users of getting a "filtered list" of refs (e.g. CI jobs):
- Define a new group of users (e.g. Builders)
- Add a user to that group (e.g. Add 'jenkins' to the Builders group)
- Go to the All-Projects ACLs, add the "Filter out closed changes refs" and assign to the group (e.g. Builders)
*NOTE* Gerrit makes a super-simplified ACL evaluation if all the projects are globally readable (e.g. project has
a READ rule to refs/*). To enable the closed changes filtering you need to disable any global read rule
for the group that needs refs filtering.
### Grace time for closed changes
The refsfilter allows to define `git-refs-filter: grace time [sec] for closed changes`
project configuration parameter. This parameter controls the size of the grace
time window in seconds. All closed changes newer than the grace time will not
be filtered out. Value can be defined per project or can be inherited from its parents.
Default value: 86400
Example of setting the grace time parameter in `project.config`:
```
[plugin "gerrit"]
gitRefFilterClosedChangesGraceTimeSec = 3600
```