| Below is a summary of the code style conventions for Chromium OS |
| upstart jobs. Please use this style for all new upstart jobs. |
| |
| Due to history, not all jobs in this package conform to style; you |
| are encouraged to update files to conform when you make changes. |
| |
| == Whitespace conventions: |
| * Indentation is in 2 column increments. |
| * Indent with spaces, not tabs. |
| * Lines should not exceed 72 columns; lines must not exceed 80 |
| columns. |
| * Long lines may be continued with a '\' at end of line. The |
| first continuation line must be indented at least 2 columns; |
| more may be used to align the text with some significant element |
| on the line being continued. Subsequent continuation lines |
| should be indented to align with the first continuation line. |
| |
| |
| == Breaking the rules: |
| "A foolish consistency is the hobgoblin of little minds" |
| Ralph Waldo Emerson |
| |
| "The young man knows the rules, but the old man knows the exceptions." |
| Oliver Wendell Holmes |
| |
| Code style guidelines exist to create consistency in the source |
| code, and to avoid constructs that lead to bugs. If you think the |
| style guide is interfering with writing good code, you can break the |
| rules provided: |
| 1) You know what you're doing. |
| 2) You've got a good reason for doing it. |
| 3) You provide a clear comment explaining why it's necessary. |
| |
| |
| == Standard template: |
| # Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| description "<description of job>" |
| author "chromium-os-dev@chromium.org" |
| |
| # Optional comment describing the job. Explain anything |
| # non-obvious that's not explained in the description. Explain |
| # any non-obvious dependencies in the start and stop conditions, |
| # and justify 'task' if necessary. If everything you might say |
| # is covered in 'description', 'start on', 'stop on', etc., leave |
| # this out. |
| start on ... # optional |
| stop on ... # optional; typically not with 'task' |
| respawn # optional; typically not with 'task' |
| task # optional; typically not with 'stop' or 'respawn' |
| |
| # other upstart stanzas as needed |
| |
| pre-start ... # optional |
| |
| post-start ... # optional |
| |
| expect ... # optional |
| |
| exec ... # optional, can't use this with "script" |
| script ... # optional, can't use this with "exec" |
| |
| pre-stop ... # optional |
| |
| post-stop ... # optional |
| |
| |
| == Notes about the use of 'task' |
| The 'task' keyword does not mean "this job should not respawn"; it |
| means that when the job starts, other jobs may be forced to wait for |
| its completion. In particular: |
| * If a task starts because of a 'start on starting x' clause, the |
| 'x' job's pre-start, post-start, and main commands will wait for |
| the task to terminate. |
| * If a task starts because of a 'start on stopping x' clause, the |
| 'x' job's post-stop commands will wait for the task to |
| terminate. |
| * If a task is started by 'initctl emit', the 'initctl' command |
| will wait for the task to terminate. |
| Only use 'task' if the task's start conditions require one of these |
| delays (e.g. to prevent a race condition). If you use 'task', the |
| reason should typically be explained in the job's descriptive |
| comments. |
| |
| In general, 'task' should not be used with either 'stop on' or |
| 'respawn'. |
| |
| |
| == Format of 'script' and 'exec' commands: |
| If the command for 'exec' or 'script' involves compound shell |
| statements, such as a pipe, 'if', or 'for', use 'script'; otherwise, |
| use 'exec'. |
| |
| For a job that uses 'respawn', a 'pre-start script' with a main |
| process invoked via 'exec' is preferable to a main process invoked |
| with 'script' without 'pre-start'. If your job uses 'respawn' but |
| the main process must be a script, then |
| * The final command in the script should be invoked with 'exec'. |
| * The job should not use 'expect fork' or 'expect daemon'. |
| |
| A 'script' stanza (including for pre-start, pre-stop, etc.) consists |
| of multiple shell commands, laid out as with this template: |
| script |
| # commands here, indented |
| end script |
| |
| The commands in 'script' and 'exec' stanzas must conform to |
| Chromium OS shell style conventions, most notably: |
| * Use only POSIX standard features. Note that the shell |
| interpreter is 'dash', not 'bash'. |
| * Use $() for command substitution, not `` |
| * Format compound statements such as 'if', 'for', and 'while' |
| along these lines: |
| if [ -f $testfile ] ; then |
| # ... |
| fi |
| * In general, don't use a fully qualified path name for a command |
| located in any of the following directories: |
| /bin /sbin /usr/bin /usr/sbin |
| |
| |
| == Conventions for logging messages |
| Jobs can (should) log significant events via syslog for debug or |
| diagnosis. Use this idiom for messages: |
| logger -t "$UPSTART_JOB" "<your message goes here>" |