(accumulated docfixes) esp a large section on the INPUT trigger
This commit is contained in:
parent
17c41ce63b
commit
f59ad8cafc
|
@ -115,3 +115,51 @@ contents modified as you like and return a ref to it.
|
||||||
|
|
||||||
There are a couple of examples in src/syntactic-sugar.
|
There are a couple of examples in src/syntactic-sugar.
|
||||||
|
|
||||||
|
## appendix 1: notes on the INPUT trigger
|
||||||
|
|
||||||
|
Note: some of this won't make sense if you haven't read about [triggers][].
|
||||||
|
|
||||||
|
The INPUT trigger sequence is designed to set or change environment variables
|
||||||
|
or the argument list. (Side note: this means INPUT triggers have to be
|
||||||
|
written as perl modules; they cannot be standalone scripts). This is a very
|
||||||
|
powerful idea so an extended description may be useful.
|
||||||
|
|
||||||
|
Sshd invokes gitolite-shell with the SSH\_ORIGINAL\_COMMAND env var containing
|
||||||
|
the git/gitolite command and one argument: the gitolite username.
|
||||||
|
|
||||||
|
* see [this][glssh] for details on the latter
|
||||||
|
* the *first* thing gitolite does in smart http mode is to use the
|
||||||
|
REMOTE\_USER and the CGI variables that apache provides to *construct*
|
||||||
|
a fake argument list and a fake SSH\_ORIGINAL\_COMMAND env var, so the
|
||||||
|
rest of the code can stay the same
|
||||||
|
|
||||||
|
The INPUT trigger is then run. The purpose of the input trigger is to ensure
|
||||||
|
that the first argument *is* the gitolite username, and that the
|
||||||
|
SSH\_ORIGINAL\_COMMAND env var contains the actual command to execute. It can
|
||||||
|
also be used to set up any other environment variables that you may decide you
|
||||||
|
need.
|
||||||
|
|
||||||
|
Wait... didn't we say that's what gitolite-shell gets anyway, just now?
|
||||||
|
|
||||||
|
Well, we lied a bit there; it's not always true!
|
||||||
|
|
||||||
|
For example, if [this][giving-shell] feature is used, the first argument *may*
|
||||||
|
be "-s", with the username in the *second* argument. Shell.pm deals with
|
||||||
|
that. <font color="gray">(Order matters. If you use this feature, put the
|
||||||
|
`'Shell::input',` line ahead of the others, since it is the only one prepared
|
||||||
|
to deal with username not being the first argument).</font>
|
||||||
|
|
||||||
|
If you look at CpuTime.pm, you'll see that it's `input()` function doesn't set
|
||||||
|
or change anything, but does set a package variable to record the start time.
|
||||||
|
Later, when the same module's `post_git()` function is invoked, it uses this
|
||||||
|
variable to determine elapsed time.
|
||||||
|
|
||||||
|
*(This is a very nice and simple example of how you can implement features by
|
||||||
|
latching onto multiple events and sharing data to do something)*.
|
||||||
|
|
||||||
|
You can even change the reponame the user sees, behind his back. Alias.pm
|
||||||
|
handles that.
|
||||||
|
|
||||||
|
Finally, as an exercise for the reader, consider how you would create a brand
|
||||||
|
new env var that contains the *comment* field of the ssh pubkey that was used
|
||||||
|
to gain access, using the information [here][kfn].
|
||||||
|
|
|
@ -153,7 +153,7 @@ Done? OK, now the general outline for ssh troubleshooting is this:
|
||||||
|
|
||||||
## random tips, tricks, and notes
|
## random tips, tricks, and notes
|
||||||
|
|
||||||
### giving shell access to gitolite users
|
### #giving-shell giving shell access to gitolite users
|
||||||
|
|
||||||
Thanks to an idea from Jesse Keating, a single key can allow both gitolite
|
Thanks to an idea from Jesse Keating, a single key can allow both gitolite
|
||||||
access *and* shell access.
|
access *and* shell access.
|
||||||
|
@ -168,7 +168,9 @@ To do this:
|
||||||
|
|
||||||
SHELL_USERS_LIST => "$ENV{HOME}/.gitolite.shell-users",
|
SHELL_USERS_LIST => "$ENV{HOME}/.gitolite.shell-users",
|
||||||
|
|
||||||
* add the line `'Shell::input',` to the `INPUT` list in the rc file.
|
* add the line `'Shell::input',` to the `INPUT` list in the rc file. This
|
||||||
|
must be the first item on the list (possibly preceded by CpuTime, if
|
||||||
|
you're using that).
|
||||||
|
|
||||||
* add the line `'post-compile/ssh-authkeys-shell-users',` to the
|
* add the line `'post-compile/ssh-authkeys-shell-users',` to the
|
||||||
`POST_COMPILE` list, *after* the `'post-compile/ssh-authkeys',` line.
|
`POST_COMPILE` list, *after* the `'post-compile/ssh-authkeys',` line.
|
||||||
|
@ -176,7 +178,7 @@ To do this:
|
||||||
Then run `gitolite compile; gitolite trigger POST_COMPILE` or push a dummy
|
Then run `gitolite compile; gitolite trigger POST_COMPILE` or push a dummy
|
||||||
change to the admin repo.
|
change to the admin repo.
|
||||||
|
|
||||||
### distinguishing one key from another
|
### #kfn distinguishing one key from another
|
||||||
|
|
||||||
Since a user can have [more than one key][multi-key], it is sometimes useful
|
Since a user can have [more than one key][multi-key], it is sometimes useful
|
||||||
to distinguish one key from another. Sshd does not tell you even the
|
to distinguish one key from another. Sshd does not tell you even the
|
||||||
|
|
|
@ -12,7 +12,12 @@ this situation it should be possible to at least prevent commits from being
|
||||||
pushed that contains changes to files locked by someone else.
|
pushed that contains changes to files locked by someone else.
|
||||||
|
|
||||||
The two "lock" programs (one a command that a user uses, and one a VREF that
|
The two "lock" programs (one a command that a user uses, and one a VREF that
|
||||||
the admin adds to a repo's access rules) together achieve this.
|
the admin adds to a repo's access rules) together attempt to achieve this.
|
||||||
|
|
||||||
|
Of course, locking by itself is not quite enough. You may still get into
|
||||||
|
merge situations if you make changes in branches. For best results you should
|
||||||
|
actually keep all the binary files in their own branch, separate from the ones
|
||||||
|
containing source code.
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
|
@ -50,6 +55,8 @@ Here's a summary:
|
||||||
|
|
||||||
For best results, everyone on the team should:
|
For best results, everyone on the team should:
|
||||||
|
|
||||||
|
* Switch to the branch containing the binary files when wanting to make a
|
||||||
|
change.
|
||||||
* Run 'git pull' or eqvt, then lock the binary file(s) before editing them.
|
* Run 'git pull' or eqvt, then lock the binary file(s) before editing them.
|
||||||
* Finish the editing task as quickly as possible, then commit, push, and
|
* Finish the editing task as quickly as possible, then commit, push, and
|
||||||
unlock the file(s) so others are not needlessly blocked.
|
unlock the file(s) so others are not needlessly blocked.
|
||||||
|
|
|
@ -45,16 +45,28 @@ The following "sugar" programs are available:
|
||||||
|
|
||||||
## triggers
|
## triggers
|
||||||
|
|
||||||
|
Note that some features need to be enabled in more than one trigger.
|
||||||
|
Mirroring is probably the best example -- it needs to hook into the `INPUT`,
|
||||||
|
`PRE_GIT`, and the `POST_GIT` triggers to work.
|
||||||
|
|
||||||
|
The `INPUT` triggers are:
|
||||||
|
|
||||||
|
* CpuTime -- see the `POST_GIT` section below
|
||||||
|
* Shell -- see "giving shell access to gitolite users" in [this][sts] page.
|
||||||
|
* Alias -- documentation is within the source file Alias.pm
|
||||||
|
* Mirroring -- see [doc/mirroring.mkd][mirroring]
|
||||||
|
|
||||||
The `PRE_GIT` triggers are:
|
The `PRE_GIT` triggers are:
|
||||||
|
|
||||||
* partial-copy -- this has its own section later in this page.
|
|
||||||
|
|
||||||
* renice -- this renices the entire job to whatever value you specify.
|
* renice -- this renices the entire job to whatever value you specify.
|
||||||
|
* Mirroring -- see [doc/mirroring.mkd][mirroring]
|
||||||
|
* partial-copy -- this has its own section later in this page.
|
||||||
|
|
||||||
The `POST_GIT` triggers are:
|
The `POST_GIT` triggers are:
|
||||||
|
|
||||||
* CpuTime, which is only a sample because it only prints the CPU times data.
|
* Mirroring -- see [doc/mirroring.mkd][mirroring]
|
||||||
In reality you will want to do something else with it.
|
* CpuTime -- this is only a sample because it only prints the CPU times
|
||||||
|
data. In reality you will want to do something else with it.
|
||||||
|
|
||||||
The `POST_COMPILE` triggers are:
|
The `POST_COMPILE` triggers are:
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,27 @@ here's an excerpt:
|
||||||
(As you can see, post-create runs 3 programs that also run from post-compile.
|
(As you can see, post-create runs 3 programs that also run from post-compile.
|
||||||
This is perfectly fine, by the way)
|
This is perfectly fine, by the way)
|
||||||
|
|
||||||
|
## types of trigger programs
|
||||||
|
|
||||||
|
There are two types of trigger programs. Standalone scripts are placed in
|
||||||
|
src/triggers or its subdirectories. They are invoked by being added to a
|
||||||
|
trigger list (using the path after "src/triggers/", as you can see). Such
|
||||||
|
scripts are quick and easy to write in any language of your choice.
|
||||||
|
|
||||||
|
Triggers written as perl modules are placed in src/lib/Gitolite/Triggers.
|
||||||
|
They are invoked by being listed with the package+function name, although even
|
||||||
|
here the 'Gitolite::Triggers' part is skipped. Perl modules have to follow
|
||||||
|
some conventions (see some of the shipped modules to ideas) but the advantage
|
||||||
|
is that they can set environment variables and change the argument list of the
|
||||||
|
gitolite-shell program that invokes them.
|
||||||
|
|
||||||
|
If this does not make sense, please examine a default install of gitolite,
|
||||||
|
paying attention to:
|
||||||
|
|
||||||
|
* the path names in various trigger lists in the rc file
|
||||||
|
* corresponding path names in the src/ directory in gitolite source
|
||||||
|
* and for perl modules, the package names and function names within.
|
||||||
|
|
||||||
## manually firing triggers
|
## manually firing triggers
|
||||||
|
|
||||||
...from the server command line is easy. For example:
|
...from the server command line is easy. For example:
|
||||||
|
|
|
@ -291,6 +291,14 @@ __DATA__
|
||||||
|
|
||||||
# (Tip: perl allows a comma after the last item in a list also!)
|
# (Tip: perl allows a comma after the last item in a list also!)
|
||||||
|
|
||||||
|
# HELP for commands (see COMMANDS list below) can be had by running the
|
||||||
|
# command with "-h" as the sole argument.
|
||||||
|
|
||||||
|
# HELP for all the other external programs (the syntactic sugar helpers and
|
||||||
|
# the various programs/functions in the 8 trigger lists), can be found in
|
||||||
|
# doc/non-core.mkd (http://sitaramc.github.com/gitolite/non-core.html) or in
|
||||||
|
# the corresponding source file itself.
|
||||||
|
|
||||||
%RC = (
|
%RC = (
|
||||||
# if you're using mirroring, you need a hostname. This is *one* simple
|
# if you're using mirroring, you need a hostname. This is *one* simple
|
||||||
# word, not a full domain name. See documentation if in doubt
|
# word, not a full domain name. See documentation if in doubt
|
||||||
|
@ -344,15 +352,16 @@ __DATA__
|
||||||
SYNTACTIC_SUGAR =>
|
SYNTACTIC_SUGAR =>
|
||||||
[
|
[
|
||||||
# 'continuation-lines',
|
# 'continuation-lines',
|
||||||
|
# 'keysubdirs-as-groups',
|
||||||
],
|
],
|
||||||
|
|
||||||
# comment out or uncomment as needed
|
# comment out or uncomment as needed
|
||||||
# these will run in sequence to modify the input (arguments and environment)
|
# these will run in sequence to modify the input (arguments and environment)
|
||||||
INPUT =>
|
INPUT =>
|
||||||
[
|
[
|
||||||
# if you use this, make this the first item in the list
|
|
||||||
# 'CpuTime::input',
|
# 'CpuTime::input',
|
||||||
|
# 'Shell::input',
|
||||||
|
# 'Alias::input',
|
||||||
# 'Mirroring::input',
|
# 'Mirroring::input',
|
||||||
],
|
],
|
||||||
|
|
||||||
|
@ -366,12 +375,8 @@ __DATA__
|
||||||
# these will run in sequence just before the actual git command is invoked
|
# these will run in sequence just before the actual git command is invoked
|
||||||
PRE_GIT =>
|
PRE_GIT =>
|
||||||
[
|
[
|
||||||
# if you use this, make this the first item in the list
|
|
||||||
# 'renice 10',
|
# 'renice 10',
|
||||||
|
|
||||||
# 'Mirroring::pre_git',
|
# 'Mirroring::pre_git',
|
||||||
|
|
||||||
# see docs ("list of non-core programs shipped") for details
|
|
||||||
# 'partial-copy',
|
# 'partial-copy',
|
||||||
],
|
],
|
||||||
|
|
||||||
|
@ -386,8 +391,6 @@ __DATA__
|
||||||
POST_GIT =>
|
POST_GIT =>
|
||||||
[
|
[
|
||||||
# 'Mirroring::post_git',
|
# 'Mirroring::post_git',
|
||||||
|
|
||||||
# if you use this, make this the last item in the list
|
|
||||||
# 'CpuTime::post_git',
|
# 'CpuTime::post_git',
|
||||||
],
|
],
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue