changed git call from https to git readonly
[atutor.git] / mods / wiki / tools / t_commander / action.php
1 <?php
2   include("t_config.php");
3 ?>
4 <html>
5 <head>
6  <title>WikiCommander:CommandExec</title>
7  <link rel="stylesheet" type="text/css" href="80x25.css">
8 </head>
9 <body bgcolor="#202527" text="#eeeeee" class="CommandExec Shell Exec" style="padding:3px;">
10 <?php
11
12    #-- page
13    $id = $_REQUEST["id"];
14
15    #-- delete all page versions
16    if ($_REQUEST["delete"]) {
17       $ls = $_REQUEST["ls"];
18       if ($id) {
19          $ls = array($id);
20       }
21       cmd_rm($ls);
22    }
23
24    #-- move page to new name
25    elseif ($_REQUEST["rename"]) {
26       cmd_mv(array($_REQUEST["id"], $_REQUEST["new_id"]));
27    }
28
29    #-- duplicate page
30    elseif ($_REQUEST["copy"]) {
31       cmd_cp(array($_REQUEST["id"], $_REQUEST["new_id"]));
32    }
33
34    #-- nothing
35    elseif ($_REQUEST["nop"]) {
36    }
37
38    #-- commandline actions
39    elseif ($_REQUEST["cmd"]) {
40
41       $args = split_input($_REQUEST["input"]);
42       $action = array_shift($args);
43       
44       $funcs = array(
45          "ls" => "cmd_ls",
46          "ll" => "cmd_ll",
47          "rm" => "cmd_rm",
48          "mv" => "cmd_mv",
49          "ren" => "cmd_ren",
50          "cp" => "cmd_cp",
51          "cat" => "cmd_cat",
52          "touch" => "cmd_touch",
53          "?" => "cmd_help",
54          "help" => "cmd_help",
55          "del" => "cmd_rm",
56          "move" => "cmd_ren",
57          "copy" => "cmd_cp",
58          "type" => "cmd_cat",
59       );
60       $help = array(
61          "cmd_mv" => "syntax: mv <i>FromPage ToPage</i>\n<br><br>\nrenames a page, and overwrites target page versions by that",
62          "cmd_ren" => "ren: works similar to 'mv' but refuses to overwrite existing page versions <br>\n('move' is an alias to 'ren')",
63          "cmd_ls" => "ls: lists existing pages, accepts glob parameters",
64          "cmd_ll" => "ll: long/verbose page listing (see also 'ls --help')",
65          "cmd_cp" => "cp: duplicates a page completely to another name, and overwrites any existing target page versions",
66          "cmd_rm" => "rm: completely deletes pages so that even no backup version will remain in the database (irreversible)",
67          "cmd_touch" => "touch: updates {lastmodified} field of given pages - but beware: RecentChanges may get you!",
68          "cmd_help" => "syntax: help [command]<br> or even [command] --help<br>\n<br>shows some notes on the given command",
69          "cmd_cat" => "syntax: help [command]<br> or even [command] --help<br>\n<br>shows some notes on the given command",
70       );
71       
72       #-- do
73       $pf = $funcs[$action];
74       if (!$action) {
75          echo "nothing to do";
76       }
77       elseif ($help[$pf] && (($args[0] == "--help") or ($args[0] == "-h") or ($args[0] == "-?"))) {
78          echo $help[$pf];
79       }
80       elseif ($pf && function_exists($pf)) {
81          $pf($args);
82       }
83       elseif ($pf == "cmd_help") {
84          if ($args[0]) {
85             ($text = $help[$funcs[$args[0]]]) or ($text = "$args[0]: no help available");
86             echo $text;
87          }
88          else {
89             echo "following commands are defined:<br>\n";
90             echo implode(", ", array_keys($funcs));
91          }
92       }
93       else {
94          echo "unknown command '$action'\n";
95       }
96       
97    }
98    
99    #-- oooops
100    else {
101       echo "unknown command() call\n<br>";
102    }
103
104
105
106
107
108 #-- action calls / commands -----------------------------------------------
109
110
111 #-- delete page completely
112 function cmd_rm($ls) {
113    foreach ($ls as $id) {
114       echo "<em style=\"color:red\">deleting</em> page '$id' (<small>";
115       while ($data = get_almost_latest($data, $id)) {
116          $version = $data["version"];
117          if (ewiki_db::DELETE($id, $version)) {
118             echo "error/";
119          }
120          echo "#$version ";
121       }
122       echo "</small>)<br>\n";
123    }
124 }
125
126
127 #-- output page contents
128 function cmd_cat($ls) {
129    foreach ($ls as $id) {
130       if ($data = ewiki_db::GET($id)) {
131          echo htmlentities($data["content"]);
132       }
133    }
134 }
135
136
137 #-- directory listing
138 function cmd_ls($ls) {
139    if ((count($ls)==1) && ($ls[0]=="-l")) {
140       cmd_ll(NULL);
141    }
142    else {
143       $rx = preg_glob($ls);
144       $all = ewiki_db::GETALL(array("id"));
145       while ($row = $all->get()) {
146          if ($rx && !preg_match($rx, $row["id"])) {
147             continue;
148          }
149          echo $row["id"] . "\n";
150       }
151    }
152 }
153
154
155 function cmd_ll($ls) {
156    echo "ll: not implemented";
157 }
158
159
160 #-- renaming
161 function cmd_mv($ls, $bad=1) {
162    cmd_ren($ls, $bad);
163 }
164 function cmd_ren($ls, $overwrite=0) {
165    if (count($ls) != 2) {
166       echo "mv: needs exactly two arguments\n";
167    }
168    else {
169       $old = $ls[0];
170       $new = $ls[1];
171       echo htmlentities("$old -> $new ");
172       if (bad_old_new($old, $new)) {
173          return;
174       }
175       while ($data = get_almost_latest($data, $old)) {
176
177          $data["id"] = $new;
178
179          if (ewiki_db::WRITE($data, $overwrite)) {
180             if (ewiki_db::DELETE($old, $data["version"])) {
181                echo ".";
182             }
183             else {
184                echo "<sup>(DE#$data[version])</sup>";
185                $de += 1;
186             }
187          }
188          else {
189             echo "<sup>(WE#$data[version])</sup>";
190             $we += 1;
191          }
192
193       }
194       echo "\n<br><br>\n";
195       if ($we) {
196          echo "- $we write errors (target page existed)<br>\n";
197       }
198       if ($de) {
199          echo "- $de errors deleting source page versions (uh, bad!)<br>\n";
200       }
201    }
202 }
203
204
205 #-- duplication
206 function cmd_cp($ls) {
207    if (count($ls) != 2) {
208       echo "cp: needs exactly two arguments\n";
209    }
210    else {
211       $old = $ls[0];
212       $new = $ls[1];
213       echo htmlentities("$old => $new ");
214       if (bad_old_new($old, $new, "TARGET_EXIST_WARN")) {
215          return;
216       }
217       while ($data = get_almost_latest($data, $old)) {
218          $data["id"] = $new;
219          if (ewiki_db::GET($new, $data["version"])) {
220             echo "<sup>(OW#$data[version])</sup>";
221             $ow += 1;
222          }
223          if (ewiki_db::WRITE($data)) {
224             echo ". ";
225          }
226          else {
227             echo "<sup>(WE#$data[version])</sup>";
228             $we += 1;
229          }
230       }
231       echo "\n<br><br>\n";
232       if ($ow) {
233          echo "- $ow target page versions overwritten<br>\n";
234       }
235       if ($we) {
236          echo "- $we write errors (uh, bad!)<br>\n";
237       }
238    }
239 }
240
241
242 #-- updated {lastmodified} stamps
243 function cmd_touch($ls) {
244    foreach ($ls as $id) {
245       if ($data = ewiki_db::GET($id)) {
246          echo "$data[id]<br>\n";
247          $data["lastmodified"] = time();
248          ewiki_db::WRITE($data, $overwrite=1);
249       }
250       else {
251          echo "'$id' does not exist<br>\n";
252       }
253    }
254 }
255
256
257
258
259
260 #-- helper calls ---------------------------------------------------------
261
262
263 function split_input($s) {
264
265    $r = array();
266
267    while (strlen($s = ltrim($s))) {
268    
269       if (preg_match("/^\"([^\"]+|\\\")\"|^'([^']+|\\')'|^([^\s]+)/", $s, $uu)) {
270          if (($e = $uu[1]) || ($e = $uu[2])) {
271             $r[] = stripslashes($uu[1]);
272          }
273          else {
274             $r[] = $uu[3];
275          }
276       }
277       else {
278          $r[] = $s;
279       }
280       
281       $s = substr($s, strlen($uu[0]));
282    }
283    
284    return($r);
285 }
286
287
288 function preg_glob($ls=NULL) {
289    foreach ((array)$ls as $glob) {
290       $rx[] = str_replace("\\*", ".*", preg_quote($glob));
291    }
292    if ($rx) {
293       return( "/^(" . implode("|", $rx) . ")$/" );
294    }
295 }
296
297
298 #-- fetch version after version (decreasing),
299 #   skip over remaining ones (when deleting fails)
300 function get_almost_latest($data, $id) {
301    if (!$data) {
302       $data = ewiki_db::GET($id);
303    }
304    else {
305       $last_ver = $data["version"];
306       $data = NULL;
307       while ((--$last_ver) > 0) {
308          if ($data = ewiki_db::GET($id, $last_ver)) {
309             break;
310          }
311          
312       }
313    }
314    return($data);
315 }
316
317
318 function bad_old_new($old, $new, $tt=0) {
319    if (! ewiki_db::GET($old)) {
320       echo "<br>src page not found!\n";
321       return 1;
322    }
323    else {
324       echo "<br>hmm, no - won't do that (same page name)\n";
325       return 1;
326    }
327    if ($tt && ewiki_db::GET($new)) {
328       echo "<br><b>warning</b>: target page exists, and latest versions may not get overwritten by this copy process\n<br>\n";
329    }
330 }
331
332 ?>
333 </body>
334 </html>