maint: use spaces, not TABs for indentation
[libguestfs.git] / HACKING
1 PLEASE LOOK AT THE TOP OF EACH FILE BEFORE EDITING TO SEE WHETHER IT
2 IS AUTOMATICALLY GENERATED OR NOT.
3
4 Adding a new action
5 ----------------------------------------------------------------------
6
7 All action functions are generated automatically, so there are only
8 two files you need to edit:
9
10 (1) src/generator.ml: Add your new action, parameters, description,
11 etc. to the big list called 'functions' at the top of this file.
12
13 (2) Edit/create a C file in daemon/ subdirectory which implements your
14 'do_action' function.  Take a look at one of the numerous examples
15 there.
16
17 Formatting
18 ----------------------------------------------------------------------
19
20 Try to use GNU / Emacs default formatting, following the convention
21 used elsewhere in the source.
22
23 Please make sure that the code compiles without warnings.
24
25 Please test any changes.
26
27 Useful targets:
28   make syntax-check    Checks the syntax of the C code.
29   make check           Runs the test suite.
30
31 Enable warnings, and fix any you find:
32   ./configure --enable-gcc-warnings
33
34 Code indentation
35 ----------------------------------------------------------------------
36 Our C source code generally adheres to some basic code-formatting
37 conventions.  The existing code base is not totally consistent on this
38 front, but we do prefer that contributed code be formatted similarly.
39 In short, use spaces-not-TABs for indentation, use 2 spaces for each
40 indentation level, and other than that, follow the K&R style.
41
42 If you use Emacs, add the following to one of one of your start-up files
43 (e.g., ~/.emacs), to help ensure that you get indentation right:
44
45   ;;; In libguestfs, indent with spaces everywhere (not TABs).
46   ;;; Exceptions: Makefile and ChangeLog modes.
47   (add-hook 'find-file-hook
48       '(lambda () (if (and buffer-file-name
49                            (string-match "/libguestfs\\>" (buffer-file-name))
50                            (not (string-equal mode-name "Change Log"))
51                            (not (string-equal mode-name "Makefile")))
52                       (setq indent-tabs-mode nil))))
53
54   ;;; When editing C sources in libguestfs, use this style.
55   (defun libguestfs-c-mode ()
56     "C mode with adjusted defaults for use with libguestfs."
57     (interactive)
58     (c-set-style "K&R")
59     (setq c-indent-level 2)
60     (setq c-basic-offset 2))
61   (add-hook 'c-mode-hook
62             '(lambda () (if (string-match "/libguestfs\\>" (buffer-file-name))
63                             (libguestfs-c-mode))))
64
65 Directories
66 ----------------------------------------------------------------------
67
68 appliance/
69         The qemu appliance, build scripts and so on.
70
71 cat/
72         The virt-cat tool.
73
74 capitests/
75         Automated tests of the C API.
76
77 contrib/
78         Outside contributions, experimental parts.
79
80 daemon/
81         The daemon that runs inside the guest and carries out actions.
82
83 df/
84         The virt-df tool.
85
86 edit/
87         The virt-edit tool.
88
89 examples/
90         The examples.
91
92 fish/
93         Guestfish (the command-line program / shell)
94
95 haskell/
96         Haskell bindings.
97
98 images/
99         Some guest images to test against.  These are gzipped to save
100         space.  You have to unzip them before use.
101
102         Also contains some files used by the test suite.
103
104 inspector/
105         Virtual machine image inspector (virt-inspector).
106
107 java/
108         Java bindings.
109
110 m4/
111         M4 macros used by autoconf.
112
113 ocaml/
114         OCaml bindings.
115
116 po/
117         Translations.
118
119 perl/
120         Perl bindings.
121
122 python/
123         Python bindings.
124
125 regressions/
126         Regression tests.
127
128 rescue/
129         The virt-rescue tool.
130
131 ruby/
132         Ruby bindings.
133
134 src/
135         Source code to the C library.
136         Also contains the crucial generator program.
137
138 test-tool/
139         Interactive qemu/kernel test tool.
140
141 Debugging
142 ----------------------------------------------------------------------
143
144 It's a good idea to use guestfish to try out new commands.
145
146 Debugging the daemon is a problem because it runs inside a minimal
147 qemu environment.  However you can print messages from the daemon, and
148 they will show up if you use 'guestfish -v'.
149
150 Patches
151 ----------------------------------------------------------------------
152
153 Submit patches to the mailing list:
154 http://www.redhat.com/mailman/listinfo/libguestfs
155 and CC to rjones@redhat.com
156
157 I18N
158 ----------------------------------------------------------------------
159
160 We support i18n (gettext anyhow) in the library.
161
162 However many messages come from the daemon, and we don't translate
163 those at the moment.  One reason is that the appliance generally has
164 all locale files removed from it, because they take up a lot of space.
165 So we'd have to readd some of those, as well as copying our PO files
166 into the appliance.
167
168 Debugging messages are never translated, since they are intended for
169 the programmers.
170
171 Extended printf
172 ----------------------------------------------------------------------
173
174 In the daemon code we have created custom printf formatters %Q and %R,
175 which are used to do shell quoting.
176
177 %Q => Simple shell quoted string.  Any spaces or other shell characters
178       are escaped for you.
179
180 %R => Same as %Q except the string is treated as a path which is prefixed
181       by the sysroot.
182
183 eg.
184
185 asprintf (&cmd, "cat %R", path);
186 ==> "cat /sysroot/some\ path\ with\ spaces"
187
188 Note: Do NOT use these when you are passing parameters to the
189 command{,r,v,rv}() functions.  These parameters do NOT need to be
190 quoted because they are not passed via the shell (instead, straight to
191 exec).  You probably want to use the sysroot_path() function however.