Correct E_NOTICE on error when remote forking.
[phorkie.git] / README.rst
1 ************************************
2 phorkie - PHP and Git based pastebin
3 ************************************
4 Self-hosted pastebin software written in PHP.
5 Pastes are editable, may have multiple files and are stored in git repositories.
6
7 Project page: http://sourceforge.net/p/phorkie/
8
9 .. contents:: Table of Contents
10
11 ========
12 Features
13 ========
14 - every paste is a git repository
15
16   - repositories can be cloned
17   - clone url can be displayed
18   - remote pastes can be forked (rel="vcs-git" and gist.github.com)
19 - paste editing
20
21   - add new files
22   - delete existing files
23   - replace file with upload
24 - multiple files in one paste
25 - syntax highlighting with GeSHi
26 - rST and Markdown rendering
27 - image upload + display
28 - OpenID authentication
29 - external tool support
30
31   - xmllint
32   - php syntax check
33 - history in the sidebar
34
35   - old files can be downloaded easily
36 - search across pastes: description, file names and file content
37
38   - options: quoting, logical and, or, not, partial words
39
40
41 ============
42 Installation
43 ============
44 1. Unzip the phorkie release file::
45
46    $ tar xjvf phorkie-0.3.0.tar.bz2
47
48 2. Create the git directories::
49
50    $ mkdir -p repos/git repos/work
51    $ chmod og+w repos/git repos/work
52
53 3. Install dependencies_
54
55 4. Copy ``data/config.php.dist`` to ``data/config.php`` and adjust it
56    to your needs::
57
58    $ cp data/config.php.dist data/config.php
59    $ $EDITOR data/config.php
60
61    Look at ``config.default.php`` for values that you may adjust.
62
63 5. Set your web server's document root to ``/path/to/phorkie/www/``
64
65 6. Open phorkie in your web browser
66
67
68 Dependencies
69 ============
70 phorkie stands on the shoulders of giants.
71
72 It requires the following programs to be installed
73 on your machine:
74
75 - Git v1.7.5 or later
76 - PHP v5.3.0 or later
77 - PEAR v1.9.2 or later
78
79 ::
80
81   $ pear install versioncontrol_git-alpha
82   $ pear install services_libravatar-alpha
83   $ pear install http_request2
84   $ pear install pager
85   $ pear install date_humandiff-alpha
86
87   $ pear channel-discover pear.twig-project.org
88   $ pear install twig/Twig
89
90   $ pear channel-discover mediawiki.googlecode.com/svn
91   $ pear install mediawiki/geshi
92
93   $ pear channel-discover zustellzentrum.cweiske.de
94   $ pear install zz/mime_type_plaindetect-alpha
95
96   $ pear channel-discover pear.michelf.ca
97   $ pear install michelf/Markdown
98
99 Note that this version of GeSHi is a bit outdated, but it's the fastest
100 way to install it.
101 If you install it manually be sure to update the
102 path from ``data/config.default.php``.
103
104
105 ======
106 Search
107 ======
108
109 phorkie makes use of an Elasticsearch__ installation, if you have one.
110
111 It is used to provide search capabilities and the list of recent pastes.
112
113 __ http://www.elasticsearch.org/
114
115
116 Setup
117 =====
118 Edit ``config.php``, setting the ``elasticsearch`` property to the HTTP URL
119 of the index, e.g. ::
120
121   http://localhost:9200/phorkie/
122
123 You must use a search namespace with Elasticsearch such as ``phorkie/``.
124 Run the index script to import all existing pastes into the index::
125
126   php scripts/index.php
127
128 That's all. Open phorkie in your browser, and you'll notice the search box
129 in the top menu.
130
131
132 Reset
133 =====
134 In case something really went wrong and you need to reset the search
135 index, run the following command::
136
137   $ curl -XDELETE http://localhost:9200/phorkie/
138   {"ok":true,"acknowledged"}
139
140 Phorkie will automatically re-index everything when ``setupcheck`` is enabled
141 in the configuration file.
142
143 You may also manually run the reindexing script with::
144
145   $ php scripts/index.php
146
147
148 =====
149 HowTo
150 =====
151
152 Make git repositories clonable
153 ==============================
154 To make git repositories clonable, you need to install ``git-daemon``
155 (``git-daemon-run`` package on Debian/Ubuntu).
156
157 Make the repositories available by symlinking the paste repository
158 directory (``$GLOBALS['phorkie']['cfg']['repos']`` setting) into
159 ``/var/cache/git``, e.g.::
160
161   $ ln -s /home/user/www/paste/repos/git /var/cache/git/paste
162
163 Edit your ``config.php`` and set the ``$GLOBALS['phorkie']['cfg']['git']['public']``
164 setting to ``git://$yourhostname/git/paste/``.
165 The rest will be appended automatically.
166
167
168 You're on your own to setup writable repositories.
169
170
171 Protect your site with OpenID
172 =============================
173 You have the option of enabling OpenID authentication to help secure your
174 pastes on phorkie.
175 Set the ``$GLOBALS['phorkie']['auth']`` values in the
176 ``data/config.php`` file as desired.
177
178 There are two different types of security you can apply.
179 First, you can restrict to one of three ``securityLevels``:
180
181 - completely open (``0``)
182 - protection of write-enabled functions such as add, edit, etc. (``1``)
183 - full site protection (``2``)
184
185 Additionally, you can restrict your site to ``listedUsersOnly``.
186 You will need to add the individual OpenID urls to the
187 ``$GLOBALS['phorkie']['auth']['users']`` variable.
188
189
190 Get information about paste editors
191 ===================================
192 Phorkie stores the user's OpenID or IP address (when not logged in) when
193 a paste is edited.
194 It is possible to get this information for each single commit::
195
196     // IP / OpenID for the latest commit
197     $ git notes --ref=identity show
198     127.0.0.1
199
200     // show IP / OpenID for a given commit
201     $ git notes --ref=identity show 29f82a
202     http://cweiske.de/
203
204
205 =================
206 Technical details
207 =================
208
209 TODO
210 ====
211 - filters (``xmllint --format``, ``rapper``)
212 - document how to keep disk usage low (block size)
213 - comments
214 - when 2 people edit, merge changes
215 - diff changes
216 - configurable highlights
217 - Atom feed for new pastes
218 - Atom feed for paste changes
219
220
221 URLs
222 ====
223
224 ``/``
225   Index page.
226 ``/[0-9]+``
227   Display page for paste
228 ``/[0-9]/edit``
229   Edit the paste
230 ``/[0-9]+/raw/(.+)``
231   Display raw file contents
232 ``/[0-9]/tool/[a-zA-Z]+/(.+)``
233   Run a tool on the given file
234 ``/[0-9]/rev/[a-z0-9]+``
235   Show specific revision of the paste
236 ``/[0-9]/delete``
237   Delete the paste
238 ``/[0-9]/doap``
239   Show DOAP document for paste
240 ``/[0-9]/fork``
241   Create a fork of the paste
242 ``/search?q=..(&page=[0-9]+)?``
243   Search for term, with optional page
244 ``/list(/[0-9])?``
245   List all pastes, with optional page
246 ``/new``
247   Shows form for new paste
248 ``/login``
249   Login page for protecting site
250 ``/user``
251   Edit logged-in user information
252
253
254 Internal directory layout
255 =========================
256 ::
257
258   repos/
259     work/
260       1/ - work directory for paste #1
261       2/ - work directory for paste #2
262     git/
263       1.git/ - git repository for paste #1
264         description - Description for the repository
265       2.git/ - git repository for paste #2
266
267 nginx rewrites
268 ==============
269 If you use nginx, place the following lines into your ``server`` block:
270
271 ::
272
273   if (!-e $request_uri) {
274     rewrite ^/([0-9]+)$ /display.php?id=$1;
275     rewrite ^/([0-9]+)/delete$ /delete.php?id=$1;
276     rewrite ^/([0-9]+)/delete/confirm$ /delete.php?id=$1&confirm=1;
277     rewrite ^/([0-9]+)/doap$ /doap.php?id=$1;
278     rewrite ^/([0-9]+)/edit$ /edit.php?id=$1;
279     rewrite ^/([0-9]+)/fork$ /fork.php?id=$1;
280     rewrite ^/([0-9]+)/raw/(.+)$ /raw.php?id=$1&file=$2;
281     rewrite ^/([0-9]+)/rev/(.+)$ /revision.php?id=$1&rev=$2;
282     rewrite ^/([0-9]+)/rev-raw/(.+)$ /raw.php?id=$1&rev=$2&file=$3;
283     rewrite ^/([0-9]+)/tool/([^/]+)/(.+)$ /tool.php?id=$1&tool=$2&file=$3;
284
285     rewrite ^/new$ /new.php;
286     rewrite ^/list$ /list.php;
287     rewrite ^/list/([0-9]+)$ /list.php?page=$1;
288
289     rewrite ^/search$ /search.php;
290     rewrite ^/search/([0-9]+)$ /search.php?page=$1;
291
292     rewrite ^/login$ /login.php;
293     rewrite ^/user$ /user.php;
294   }