ajout de la partie slam dans le dossier web
This commit is contained in:
		
							
								
								
									
										7
									
								
								ap23/web/doku/bin/.htaccess
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								ap23/web/doku/bin/.htaccess
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| <IfModule mod_authz_core.c> | ||||
|     Require all denied | ||||
| </IfModule> | ||||
| <IfModule !mod_authz_core.c> | ||||
|     Order allow,deny | ||||
|     Deny from all | ||||
| </IfModule> | ||||
							
								
								
									
										322
									
								
								ap23/web/doku/bin/dwpage.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										322
									
								
								ap23/web/doku/bin/dwpage.php
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,322 @@ | ||||
| #!/usr/bin/env php | ||||
| <?php | ||||
|  | ||||
| use splitbrain\phpcli\CLI; | ||||
| use splitbrain\phpcli\Options; | ||||
|  | ||||
| if(!defined('DOKU_INC')) define('DOKU_INC', realpath(dirname(__FILE__) . '/../') . '/'); | ||||
| define('NOSESSION', 1); | ||||
| require_once(DOKU_INC . 'inc/init.php'); | ||||
|  | ||||
| /** | ||||
|  * Checkout and commit pages from the command line while maintaining the history | ||||
|  */ | ||||
| class PageCLI extends CLI { | ||||
|  | ||||
|     protected $force = false; | ||||
|     protected $username = ''; | ||||
|  | ||||
|     /** | ||||
|      * Register options and arguments on the given $options object | ||||
|      * | ||||
|      * @param Options $options | ||||
|      * @return void | ||||
|      */ | ||||
|     protected function setup(Options $options) { | ||||
|         /* global */ | ||||
|         $options->registerOption( | ||||
|             'force', | ||||
|             'force obtaining a lock for the page (generally bad idea)', | ||||
|             'f' | ||||
|         ); | ||||
|         $options->registerOption( | ||||
|             'user', | ||||
|             'work as this user. defaults to current CLI user', | ||||
|             'u', | ||||
|             'username' | ||||
|         ); | ||||
|         $options->setHelp( | ||||
|             'Utility to help command line Dokuwiki page editing, allow ' . | ||||
|             'pages to be checked out for editing then committed after changes' | ||||
|         ); | ||||
|  | ||||
|         /* checkout command */ | ||||
|         $options->registerCommand( | ||||
|             'checkout', | ||||
|             'Checks out a file from the repository, using the wiki id and obtaining ' . | ||||
|             'a lock for the page. ' . "\n" . | ||||
|             'If a working_file is specified, this is where the page is copied to. ' . | ||||
|             'Otherwise defaults to the same as the wiki page in the current ' . | ||||
|             'working directory.' | ||||
|         ); | ||||
|         $options->registerArgument( | ||||
|             'wikipage', | ||||
|             'The wiki page to checkout', | ||||
|             true, | ||||
|             'checkout' | ||||
|         ); | ||||
|         $options->registerArgument( | ||||
|             'workingfile', | ||||
|             'How to name the local checkout', | ||||
|             false, | ||||
|             'checkout' | ||||
|         ); | ||||
|  | ||||
|         /* commit command */ | ||||
|         $options->registerCommand( | ||||
|             'commit', | ||||
|             'Checks in the working_file into the repository using the specified ' . | ||||
|             'wiki id, archiving the previous version.' | ||||
|         ); | ||||
|         $options->registerArgument( | ||||
|             'workingfile', | ||||
|             'The local file to commit', | ||||
|             true, | ||||
|             'commit' | ||||
|         ); | ||||
|         $options->registerArgument( | ||||
|             'wikipage', | ||||
|             'The wiki page to create or update', | ||||
|             true, | ||||
|             'commit' | ||||
|         ); | ||||
|         $options->registerOption( | ||||
|             'message', | ||||
|             'Summary describing the change (required)', | ||||
|             'm', | ||||
|             'summary', | ||||
|             'commit' | ||||
|         ); | ||||
|         $options->registerOption( | ||||
|             'trivial', | ||||
|             'minor change', | ||||
|             't', | ||||
|             false, | ||||
|             'commit' | ||||
|         ); | ||||
|  | ||||
|         /* lock command */ | ||||
|         $options->registerCommand( | ||||
|             'lock', | ||||
|             'Obtains or updates a lock for a wiki page' | ||||
|         ); | ||||
|         $options->registerArgument( | ||||
|             'wikipage', | ||||
|             'The wiki page to lock', | ||||
|             true, | ||||
|             'lock' | ||||
|         ); | ||||
|  | ||||
|         /* unlock command */ | ||||
|         $options->registerCommand( | ||||
|             'unlock', | ||||
|             'Removes a lock for a wiki page.' | ||||
|         ); | ||||
|         $options->registerArgument( | ||||
|             'wikipage', | ||||
|             'The wiki page to unlock', | ||||
|             true, | ||||
|             'unlock' | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Your main program | ||||
|      * | ||||
|      * Arguments and options have been parsed when this is run | ||||
|      * | ||||
|      * @param Options $options | ||||
|      * @return void | ||||
|      */ | ||||
|     protected function main(Options $options) { | ||||
|         $this->force = $options->getOpt('force', false); | ||||
|         $this->username = $options->getOpt('user', $this->getUser()); | ||||
|  | ||||
|         $command = $options->getCmd(); | ||||
|         $args = $options->getArgs(); | ||||
|         switch($command) { | ||||
|             case 'checkout': | ||||
|                 $wiki_id = array_shift($args); | ||||
|                 $localfile = array_shift($args); | ||||
|                 $this->commandCheckout($wiki_id, $localfile); | ||||
|                 break; | ||||
|             case 'commit': | ||||
|                 $localfile = array_shift($args); | ||||
|                 $wiki_id = array_shift($args); | ||||
|                 $this->commandCommit( | ||||
|                     $localfile, | ||||
|                     $wiki_id, | ||||
|                     $options->getOpt('message', ''), | ||||
|                     $options->getOpt('trivial', false) | ||||
|                 ); | ||||
|                 break; | ||||
|             case 'lock': | ||||
|                 $wiki_id = array_shift($args); | ||||
|                 $this->obtainLock($wiki_id); | ||||
|                 $this->success("$wiki_id locked"); | ||||
|                 break; | ||||
|             case 'unlock': | ||||
|                 $wiki_id = array_shift($args); | ||||
|                 $this->clearLock($wiki_id); | ||||
|                 $this->success("$wiki_id unlocked"); | ||||
|                 break; | ||||
|             default: | ||||
|                 echo $options->help(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Check out a file | ||||
|      * | ||||
|      * @param string $wiki_id | ||||
|      * @param string $localfile | ||||
|      */ | ||||
|     protected function commandCheckout($wiki_id, $localfile) { | ||||
|         global $conf; | ||||
|  | ||||
|         $wiki_id = cleanID($wiki_id); | ||||
|         $wiki_fn = wikiFN($wiki_id); | ||||
|  | ||||
|         if(!file_exists($wiki_fn)) { | ||||
|             $this->fatal("$wiki_id does not yet exist"); | ||||
|         } | ||||
|  | ||||
|         if(empty($localfile)) { | ||||
|             $localfile = getcwd() . '/' . \dokuwiki\Utf8\PhpString::basename($wiki_fn); | ||||
|         } | ||||
|  | ||||
|         if(!file_exists(dirname($localfile))) { | ||||
|             $this->fatal("Directory " . dirname($localfile) . " does not exist"); | ||||
|         } | ||||
|  | ||||
|         if(stristr(realpath(dirname($localfile)), realpath($conf['datadir'])) !== false) { | ||||
|             $this->fatal("Attempt to check out file into data directory - not allowed"); | ||||
|         } | ||||
|  | ||||
|         $this->obtainLock($wiki_id); | ||||
|  | ||||
|         if(!copy($wiki_fn, $localfile)) { | ||||
|             $this->clearLock($wiki_id); | ||||
|             $this->fatal("Unable to copy $wiki_fn to $localfile"); | ||||
|         } | ||||
|  | ||||
|         $this->success("$wiki_id > $localfile"); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Save a file as a new page revision | ||||
|      * | ||||
|      * @param string $localfile | ||||
|      * @param string $wiki_id | ||||
|      * @param string $message | ||||
|      * @param bool $minor | ||||
|      */ | ||||
|     protected function commandCommit($localfile, $wiki_id, $message, $minor) { | ||||
|         $wiki_id = cleanID($wiki_id); | ||||
|         $message = trim($message); | ||||
|  | ||||
|         if(!file_exists($localfile)) { | ||||
|             $this->fatal("$localfile does not exist"); | ||||
|         } | ||||
|  | ||||
|         if(!is_readable($localfile)) { | ||||
|             $this->fatal("Cannot read from $localfile"); | ||||
|         } | ||||
|  | ||||
|         if(!$message) { | ||||
|             $this->fatal("Summary message required"); | ||||
|         } | ||||
|  | ||||
|         $this->obtainLock($wiki_id); | ||||
|  | ||||
|         saveWikiText($wiki_id, file_get_contents($localfile), $message, $minor); | ||||
|  | ||||
|         $this->clearLock($wiki_id); | ||||
|  | ||||
|         $this->success("$localfile > $wiki_id"); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Lock the given page or exit | ||||
|      * | ||||
|      * @param string $wiki_id | ||||
|      */ | ||||
|     protected function obtainLock($wiki_id) { | ||||
|         if($this->force) $this->deleteLock($wiki_id); | ||||
|  | ||||
|         $_SERVER['REMOTE_USER'] = $this->username; | ||||
|  | ||||
|         if(checklock($wiki_id)) { | ||||
|             $this->error("Page $wiki_id is already locked by another user"); | ||||
|             exit(1); | ||||
|         } | ||||
|  | ||||
|         lock($wiki_id); | ||||
|  | ||||
|         if(checklock($wiki_id)) { | ||||
|             $this->error("Unable to obtain lock for $wiki_id "); | ||||
|             var_dump(checklock($wiki_id)); | ||||
|             exit(1); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Clear the lock on the given page | ||||
|      * | ||||
|      * @param string $wiki_id | ||||
|      */ | ||||
|     protected function clearLock($wiki_id) { | ||||
|         if($this->force) $this->deleteLock($wiki_id); | ||||
|  | ||||
|         $_SERVER['REMOTE_USER'] = $this->username; | ||||
|         if(checklock($wiki_id)) { | ||||
|             $this->error("Page $wiki_id is locked by another user"); | ||||
|             exit(1); | ||||
|         } | ||||
|  | ||||
|         unlock($wiki_id); | ||||
|  | ||||
|         if(file_exists(wikiLockFN($wiki_id))) { | ||||
|             $this->error("Unable to clear lock for $wiki_id"); | ||||
|             exit(1); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Forcefully remove a lock on the page given | ||||
|      * | ||||
|      * @param string $wiki_id | ||||
|      */ | ||||
|     protected function deleteLock($wiki_id) { | ||||
|         $wikiLockFN = wikiLockFN($wiki_id); | ||||
|  | ||||
|         if(file_exists($wikiLockFN)) { | ||||
|             if(!unlink($wikiLockFN)) { | ||||
|                 $this->error("Unable to delete $wikiLockFN"); | ||||
|                 exit(1); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the current user's username from the environment | ||||
|      * | ||||
|      * @return string | ||||
|      */ | ||||
|     protected function getUser() { | ||||
|         $user = getenv('USER'); | ||||
|         if(empty ($user)) { | ||||
|             $user = getenv('USERNAME'); | ||||
|         } else { | ||||
|             return $user; | ||||
|         } | ||||
|         if(empty ($user)) { | ||||
|             $user = 'admin'; | ||||
|         } | ||||
|         return $user; | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Main | ||||
| $cli = new PageCLI(); | ||||
| $cli->run(); | ||||
							
								
								
									
										340
									
								
								ap23/web/doku/bin/gittool.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										340
									
								
								ap23/web/doku/bin/gittool.php
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,340 @@ | ||||
| #!/usr/bin/env php | ||||
| <?php | ||||
|  | ||||
| use splitbrain\phpcli\CLI; | ||||
| use splitbrain\phpcli\Options; | ||||
|  | ||||
| if(!defined('DOKU_INC')) define('DOKU_INC', realpath(dirname(__FILE__) . '/../') . '/'); | ||||
| define('NOSESSION', 1); | ||||
| require_once(DOKU_INC . 'inc/init.php'); | ||||
|  | ||||
| /** | ||||
|  * Easily manage DokuWiki git repositories | ||||
|  * | ||||
|  * @author Andreas Gohr <andi@splitbrain.org> | ||||
|  */ | ||||
| class GitToolCLI extends CLI { | ||||
|  | ||||
|     /** | ||||
|      * Register options and arguments on the given $options object | ||||
|      * | ||||
|      * @param Options $options | ||||
|      * @return void | ||||
|      */ | ||||
|     protected function setup(Options $options) { | ||||
|         $options->setHelp( | ||||
|             "Manage git repositories for DokuWiki and its plugins and templates.\n\n" . | ||||
|             "$> ./bin/gittool.php clone gallery template:ach\n" . | ||||
|             "$> ./bin/gittool.php repos\n" . | ||||
|             "$> ./bin/gittool.php origin -v" | ||||
|         ); | ||||
|  | ||||
|         $options->registerArgument( | ||||
|             'command', | ||||
|             'Command to execute. See below', | ||||
|             true | ||||
|         ); | ||||
|  | ||||
|         $options->registerCommand( | ||||
|             'clone', | ||||
|             'Tries to install a known plugin or template (prefix with template:) via git. Uses the DokuWiki.org ' . | ||||
|             'plugin repository to find the proper git repository. Multiple extensions can be given as parameters' | ||||
|         ); | ||||
|         $options->registerArgument( | ||||
|             'extension', | ||||
|             'name of the extension to install, prefix with \'template:\' for templates', | ||||
|             true, | ||||
|             'clone' | ||||
|         ); | ||||
|  | ||||
|         $options->registerCommand( | ||||
|             'install', | ||||
|             'The same as clone, but when no git source repository can be found, the extension is installed via ' . | ||||
|             'download' | ||||
|         ); | ||||
|         $options->registerArgument( | ||||
|             'extension', | ||||
|             'name of the extension to install, prefix with \'template:\' for templates', | ||||
|             true, | ||||
|             'install' | ||||
|         ); | ||||
|  | ||||
|         $options->registerCommand( | ||||
|             'repos', | ||||
|             'Lists all git repositories found in this DokuWiki installation' | ||||
|         ); | ||||
|  | ||||
|         $options->registerCommand( | ||||
|             '*', | ||||
|             'Any unknown commands are assumed to be arguments to git and will be executed in all repositories ' . | ||||
|             'found within this DokuWiki installation' | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Your main program | ||||
|      * | ||||
|      * Arguments and options have been parsed when this is run | ||||
|      * | ||||
|      * @param Options $options | ||||
|      * @return void | ||||
|      */ | ||||
|     protected function main(Options $options) { | ||||
|         $command = $options->getCmd(); | ||||
|         $args = $options->getArgs(); | ||||
|         if(!$command) $command = array_shift($args); | ||||
|  | ||||
|         switch($command) { | ||||
|             case '': | ||||
|                 echo $options->help(); | ||||
|                 break; | ||||
|             case 'clone': | ||||
|                 $this->cmdClone($args); | ||||
|                 break; | ||||
|             case 'install': | ||||
|                 $this->cmdInstall($args); | ||||
|                 break; | ||||
|             case 'repo': | ||||
|             case 'repos': | ||||
|                 $this->cmdRepos(); | ||||
|                 break; | ||||
|             default: | ||||
|                 $this->cmdGit($command, $args); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Tries to install the given extensions using git clone | ||||
|      * | ||||
|      * @param array $extensions | ||||
|      */ | ||||
|     public function cmdClone($extensions) { | ||||
|         $errors = array(); | ||||
|         $succeeded = array(); | ||||
|  | ||||
|         foreach($extensions as $ext) { | ||||
|             $repo = $this->getSourceRepo($ext); | ||||
|  | ||||
|             if(!$repo) { | ||||
|                 $this->error("could not find a repository for $ext"); | ||||
|                 $errors[] = $ext; | ||||
|             } else { | ||||
|                 if($this->cloneExtension($ext, $repo)) { | ||||
|                     $succeeded[] = $ext; | ||||
|                 } else { | ||||
|                     $errors[] = $ext; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         echo "\n"; | ||||
|         if($succeeded) $this->success('successfully cloned the following extensions: ' . join(', ', $succeeded)); | ||||
|         if($errors) $this->error('failed to clone the following extensions: ' . join(', ', $errors)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Tries to install the given extensions using git clone with fallback to install | ||||
|      * | ||||
|      * @param array $extensions | ||||
|      */ | ||||
|     public function cmdInstall($extensions) { | ||||
|         $errors = array(); | ||||
|         $succeeded = array(); | ||||
|  | ||||
|         foreach($extensions as $ext) { | ||||
|             $repo = $this->getSourceRepo($ext); | ||||
|  | ||||
|             if(!$repo) { | ||||
|                 $this->info("could not find a repository for $ext"); | ||||
|                 if($this->downloadExtension($ext)) { | ||||
|                     $succeeded[] = $ext; | ||||
|                 } else { | ||||
|                     $errors[] = $ext; | ||||
|                 } | ||||
|             } else { | ||||
|                 if($this->cloneExtension($ext, $repo)) { | ||||
|                     $succeeded[] = $ext; | ||||
|                 } else { | ||||
|                     $errors[] = $ext; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         echo "\n"; | ||||
|         if($succeeded) $this->success('successfully installed the following extensions: ' . join(', ', $succeeded)); | ||||
|         if($errors) $this->error('failed to install the following extensions: ' . join(', ', $errors)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Executes the given git command in every repository | ||||
|      * | ||||
|      * @param $cmd | ||||
|      * @param $arg | ||||
|      */ | ||||
|     public function cmdGit($cmd, $arg) { | ||||
|         $repos = $this->findRepos(); | ||||
|  | ||||
|         $shell = array_merge(array('git', $cmd), $arg); | ||||
|         $shell = array_map('escapeshellarg', $shell); | ||||
|         $shell = join(' ', $shell); | ||||
|  | ||||
|         foreach($repos as $repo) { | ||||
|             if(!@chdir($repo)) { | ||||
|                 $this->error("Could not change into $repo"); | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             $this->info("executing $shell in $repo"); | ||||
|             $ret = 0; | ||||
|             system($shell, $ret); | ||||
|  | ||||
|             if($ret == 0) { | ||||
|                 $this->success("git succeeded in $repo"); | ||||
|             } else { | ||||
|                 $this->error("git failed in $repo"); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Simply lists the repositories | ||||
|      */ | ||||
|     public function cmdRepos() { | ||||
|         $repos = $this->findRepos(); | ||||
|         foreach($repos as $repo) { | ||||
|             echo "$repo\n"; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Install extension from the given download URL | ||||
|      * | ||||
|      * @param string $ext | ||||
|      * @return bool|null | ||||
|      */ | ||||
|     private function downloadExtension($ext) { | ||||
|         /** @var helper_plugin_extension_extension $plugin */ | ||||
|         $plugin = plugin_load('helper', 'extension_extension'); | ||||
|         if(!$ext) die("extension plugin not available, can't continue"); | ||||
|  | ||||
|         $plugin->setExtension($ext); | ||||
|  | ||||
|         $url = $plugin->getDownloadURL(); | ||||
|         if(!$url) { | ||||
|             $this->error("no download URL for $ext"); | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         $ok = false; | ||||
|         try { | ||||
|             $this->info("installing $ext via download from $url"); | ||||
|             $ok = $plugin->installFromURL($url); | ||||
|         } catch(Exception $e) { | ||||
|             $this->error($e->getMessage()); | ||||
|         } | ||||
|  | ||||
|         if($ok) { | ||||
|             $this->success("installed $ext via download"); | ||||
|             return true; | ||||
|         } else { | ||||
|             $this->success("failed to install $ext via download"); | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Clones the extension from the given repository | ||||
|      * | ||||
|      * @param string $ext | ||||
|      * @param string $repo | ||||
|      * @return bool | ||||
|      */ | ||||
|     private function cloneExtension($ext, $repo) { | ||||
|         if(substr($ext, 0, 9) == 'template:') { | ||||
|             $target = fullpath(tpl_incdir() . '../' . substr($ext, 9)); | ||||
|         } else { | ||||
|             $target = DOKU_PLUGIN . $ext; | ||||
|         } | ||||
|  | ||||
|         $this->info("cloning $ext from $repo to $target"); | ||||
|         $ret = 0; | ||||
|         system("git clone $repo $target", $ret); | ||||
|         if($ret === 0) { | ||||
|             $this->success("cloning of $ext succeeded"); | ||||
|             return true; | ||||
|         } else { | ||||
|             $this->error("cloning of $ext failed"); | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns all git repositories in this DokuWiki install | ||||
|      * | ||||
|      * Looks in root, template and plugin directories only. | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     private function findRepos() { | ||||
|         $this->info('Looking for .git directories'); | ||||
|         $data = array_merge( | ||||
|             glob(DOKU_INC . '.git', GLOB_ONLYDIR), | ||||
|             glob(DOKU_PLUGIN . '*/.git', GLOB_ONLYDIR), | ||||
|             glob(fullpath(tpl_incdir() . '../') . '/*/.git', GLOB_ONLYDIR) | ||||
|         ); | ||||
|  | ||||
|         if(!$data) { | ||||
|             $this->error('Found no .git directories'); | ||||
|         } else { | ||||
|             $this->success('Found ' . count($data) . ' .git directories'); | ||||
|         } | ||||
|         $data = array_map('fullpath', array_map('dirname', $data)); | ||||
|         return $data; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the repository for the given extension | ||||
|      * | ||||
|      * @param $extension | ||||
|      * @return false|string | ||||
|      */ | ||||
|     private function getSourceRepo($extension) { | ||||
|         /** @var helper_plugin_extension_extension $ext */ | ||||
|         $ext = plugin_load('helper', 'extension_extension'); | ||||
|         if(!$ext) die("extension plugin not available, can't continue"); | ||||
|  | ||||
|         $ext->setExtension($extension); | ||||
|  | ||||
|         $repourl = $ext->getSourcerepoURL(); | ||||
|         if(!$repourl) return false; | ||||
|  | ||||
|         // match github repos | ||||
|         if(preg_match('/github\.com\/([^\/]+)\/([^\/]+)/i', $repourl, $m)) { | ||||
|             $user = $m[1]; | ||||
|             $repo = $m[2]; | ||||
|             return 'https://github.com/' . $user . '/' . $repo . '.git'; | ||||
|         } | ||||
|  | ||||
|         // match gitorious repos | ||||
|         if(preg_match('/gitorious.org\/([^\/]+)\/([^\/]+)?/i', $repourl, $m)) { | ||||
|             $user = $m[1]; | ||||
|             $repo = $m[2]; | ||||
|             if(!$repo) $repo = $user; | ||||
|  | ||||
|             return 'https://git.gitorious.org/' . $user . '/' . $repo . '.git'; | ||||
|         } | ||||
|  | ||||
|         // match bitbucket repos - most people seem to use mercurial there though | ||||
|         if(preg_match('/bitbucket\.org\/([^\/]+)\/([^\/]+)/i', $repourl, $m)) { | ||||
|             $user = $m[1]; | ||||
|             $repo = $m[2]; | ||||
|             return 'https://bitbucket.org/' . $user . '/' . $repo . '.git'; | ||||
|         } | ||||
|  | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Main | ||||
| $cli = new GitToolCLI(); | ||||
| $cli->run(); | ||||
							
								
								
									
										107
									
								
								ap23/web/doku/bin/indexer.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										107
									
								
								ap23/web/doku/bin/indexer.php
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,107 @@ | ||||
| #!/usr/bin/env php | ||||
| <?php | ||||
|  | ||||
| use splitbrain\phpcli\CLI; | ||||
| use splitbrain\phpcli\Options; | ||||
|  | ||||
| if(!defined('DOKU_INC')) define('DOKU_INC', realpath(dirname(__FILE__) . '/../') . '/'); | ||||
| define('NOSESSION', 1); | ||||
| require_once(DOKU_INC . 'inc/init.php'); | ||||
|  | ||||
| /** | ||||
|  * Update the Search Index from command line | ||||
|  */ | ||||
| class IndexerCLI extends CLI { | ||||
|  | ||||
|     private $quiet = false; | ||||
|     private $clear = false; | ||||
|  | ||||
|     /** | ||||
|      * Register options and arguments on the given $options object | ||||
|      * | ||||
|      * @param Options $options | ||||
|      * @return void | ||||
|      */ | ||||
|     protected function setup(Options $options) { | ||||
|         $options->setHelp( | ||||
|             'Updates the searchindex by indexing all new or changed pages. When the -c option is ' . | ||||
|             'given the index is cleared first.' | ||||
|         ); | ||||
|  | ||||
|         $options->registerOption( | ||||
|             'clear', | ||||
|             'clear the index before updating', | ||||
|             'c' | ||||
|         ); | ||||
|         $options->registerOption( | ||||
|             'quiet', | ||||
|             'don\'t produce any output', | ||||
|             'q' | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Your main program | ||||
|      * | ||||
|      * Arguments and options have been parsed when this is run | ||||
|      * | ||||
|      * @param Options $options | ||||
|      * @return void | ||||
|      */ | ||||
|     protected function main(Options $options) { | ||||
|         $this->clear = $options->getOpt('clear'); | ||||
|         $this->quiet = $options->getOpt('quiet'); | ||||
|  | ||||
|         if($this->clear) $this->clearindex(); | ||||
|  | ||||
|         $this->update(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Update the index | ||||
|      */ | ||||
|     protected function update() { | ||||
|         global $conf; | ||||
|         $data = array(); | ||||
|         $this->quietecho("Searching pages... "); | ||||
|         search($data, $conf['datadir'], 'search_allpages', array('skipacl' => true)); | ||||
|         $this->quietecho(count($data) . " pages found.\n"); | ||||
|  | ||||
|         foreach($data as $val) { | ||||
|             $this->index($val['id']); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Index the given page | ||||
|      * | ||||
|      * @param string $id | ||||
|      */ | ||||
|     protected function index($id) { | ||||
|         $this->quietecho("$id... "); | ||||
|         idx_addPage($id, !$this->quiet, $this->clear); | ||||
|         $this->quietecho("done.\n"); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Clear all index files | ||||
|      */ | ||||
|     protected function clearindex() { | ||||
|         $this->quietecho("Clearing index... "); | ||||
|         idx_get_indexer()->clear(); | ||||
|         $this->quietecho("done.\n"); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Print message if not supressed | ||||
|      * | ||||
|      * @param string $msg | ||||
|      */ | ||||
|     protected function quietecho($msg) { | ||||
|         if(!$this->quiet) echo $msg; | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Main | ||||
| $cli = new IndexerCLI(); | ||||
| $cli->run(); | ||||
							
								
								
									
										103
									
								
								ap23/web/doku/bin/plugin.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										103
									
								
								ap23/web/doku/bin/plugin.php
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,103 @@ | ||||
| #!/usr/bin/env php | ||||
| <?php | ||||
|  | ||||
| use dokuwiki\Extension\PluginController; | ||||
| use splitbrain\phpcli\CLI; | ||||
| use splitbrain\phpcli\Colors; | ||||
| use splitbrain\phpcli\Options; | ||||
|  | ||||
| if(!defined('DOKU_INC')) define('DOKU_INC', realpath(dirname(__FILE__) . '/../') . '/'); | ||||
| define('NOSESSION', 1); | ||||
| require_once(DOKU_INC . 'inc/init.php'); | ||||
|  | ||||
| class PluginCLI extends CLI { | ||||
|  | ||||
|     /** | ||||
|      * Register options and arguments on the given $options object | ||||
|      * | ||||
|      * @param Options $options | ||||
|      * @return void | ||||
|      */ | ||||
|     protected function setup(Options $options) { | ||||
|         $options->setHelp('Excecutes Plugin command line tools'); | ||||
|         $options->registerArgument('plugin', 'The plugin CLI you want to run. Leave off to see list', false); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Your main program | ||||
|      * | ||||
|      * Arguments and options have been parsed when this is run | ||||
|      * | ||||
|      * @param Options $options | ||||
|      * @return void | ||||
|      */ | ||||
|     protected function main(Options $options) { | ||||
|         global $argv; | ||||
|         $argv = $options->getArgs(); | ||||
|  | ||||
|         if($argv) { | ||||
|             $plugin = $this->loadPlugin($argv[0]); | ||||
|             if($plugin !== null) { | ||||
|                 $plugin->run(); | ||||
|             } else { | ||||
|                 $this->fatal('Command {cmd} not found.', ['cmd' => $argv[0]]); | ||||
|             } | ||||
|         } else { | ||||
|             echo $options->help(); | ||||
|             $this->listPlugins(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List available plugins | ||||
|      */ | ||||
|     protected function listPlugins() { | ||||
|         /** @var PluginController $plugin_controller */ | ||||
|         global $plugin_controller; | ||||
|  | ||||
|         echo "\n"; | ||||
|         echo "\n"; | ||||
|         echo $this->colors->wrap('AVAILABLE PLUGINS:', Colors::C_BROWN); | ||||
|         echo "\n"; | ||||
|  | ||||
|         $list = $plugin_controller->getList('cli'); | ||||
|         sort($list); | ||||
|         if(!count($list)) { | ||||
|             echo $this->colors->wrap("  No plugins providing CLI components available\n", Colors::C_RED); | ||||
|         } else { | ||||
|             $tf = new \splitbrain\phpcli\TableFormatter($this->colors); | ||||
|  | ||||
|             foreach($list as $name) { | ||||
|                 $plugin = $this->loadPlugin($name); | ||||
|                 if($plugin === null) continue; | ||||
|                 $info = $plugin->getInfo(); | ||||
|  | ||||
|                 echo $tf->format( | ||||
|                     [2, '30%', '*'], | ||||
|                     ['', $name, $info['desc']], | ||||
|                     ['', Colors::C_CYAN, ''] | ||||
|  | ||||
|                 ); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Instantiate a CLI plugin | ||||
|      * | ||||
|      * @param string $name | ||||
|      * @return \dokuwiki\Extension\CLIPlugin|null | ||||
|      */ | ||||
|     protected function loadPlugin($name) { | ||||
|         // execute the plugin CLI | ||||
|         $class = "cli_plugin_$name"; | ||||
|         if(class_exists($class)) { | ||||
|             return new $class(); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Main | ||||
| $cli = new PluginCLI(); | ||||
| $cli->run(); | ||||
							
								
								
									
										64
									
								
								ap23/web/doku/bin/render.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										64
									
								
								ap23/web/doku/bin/render.php
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,64 @@ | ||||
| #!/usr/bin/env php | ||||
| <?php | ||||
|  | ||||
| use splitbrain\phpcli\CLI; | ||||
| use splitbrain\phpcli\Options; | ||||
|  | ||||
| if(!defined('DOKU_INC')) define('DOKU_INC', realpath(dirname(__FILE__) . '/../') . '/'); | ||||
| define('NOSESSION', 1); | ||||
| require_once(DOKU_INC . 'inc/init.php'); | ||||
|  | ||||
| /** | ||||
|  * A simple commandline tool to render some DokuWiki syntax with a given | ||||
|  * renderer. | ||||
|  * | ||||
|  * This may not work for plugins that expect a certain environment to be | ||||
|  * set up before rendering, but should work for most or even all standard | ||||
|  * DokuWiki markup | ||||
|  * | ||||
|  * @license GPL2 | ||||
|  * @author  Andreas Gohr <andi@splitbrain.org> | ||||
|  */ | ||||
| class RenderCLI extends CLI { | ||||
|  | ||||
|     /** | ||||
|      * Register options and arguments on the given $options object | ||||
|      * | ||||
|      * @param Options $options | ||||
|      * @return void | ||||
|      */ | ||||
|     protected function setup(Options $options) { | ||||
|         $options->setHelp( | ||||
|             'A simple commandline tool to render some DokuWiki syntax with a given renderer.' . | ||||
|             "\n\n" . | ||||
|             'This may not work for plugins that expect a certain environment to be ' . | ||||
|             'set up before rendering, but should work for most or even all standard ' . | ||||
|             'DokuWiki markup' | ||||
|         ); | ||||
|         $options->registerOption('renderer', 'The renderer mode to use. Defaults to xhtml', 'r', 'mode'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Your main program | ||||
|      * | ||||
|      * Arguments and options have been parsed when this is run | ||||
|      * | ||||
|      * @param Options $options | ||||
|      * @throws DokuCLI_Exception | ||||
|      * @return void | ||||
|      */ | ||||
|     protected function main(Options $options) { | ||||
|         $renderer = $options->getOpt('renderer', 'xhtml'); | ||||
|  | ||||
|         // do the action | ||||
|         $source = stream_get_contents(STDIN); | ||||
|         $info = array(); | ||||
|         $result = p_render($renderer, p_get_instructions($source), $info); | ||||
|         if(is_null($result)) throw new DokuCLI_Exception("No such renderer $renderer"); | ||||
|         echo $result; | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Main | ||||
| $cli = new RenderCLI(); | ||||
| $cli->run(); | ||||
							
								
								
									
										114
									
								
								ap23/web/doku/bin/striplangs.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										114
									
								
								ap23/web/doku/bin/striplangs.php
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,114 @@ | ||||
| #!/usr/bin/env php | ||||
| <?php | ||||
|  | ||||
| use splitbrain\phpcli\CLI; | ||||
| use splitbrain\phpcli\Options; | ||||
|  | ||||
| if(!defined('DOKU_INC')) define('DOKU_INC', realpath(dirname(__FILE__) . '/../') . '/'); | ||||
| define('NOSESSION', 1); | ||||
| require_once(DOKU_INC . 'inc/init.php'); | ||||
|  | ||||
| /** | ||||
|  * Remove unwanted languages from a DokuWiki install | ||||
|  */ | ||||
| class StripLangsCLI extends CLI { | ||||
|  | ||||
|     /** | ||||
|      * Register options and arguments on the given $options object | ||||
|      * | ||||
|      * @param Options $options | ||||
|      * @return void | ||||
|      */ | ||||
|     protected function setup(Options $options) { | ||||
|  | ||||
|         $options->setHelp( | ||||
|             'Remove all languages from the installation, besides the ones specified. English language ' . | ||||
|             'is never removed!' | ||||
|         ); | ||||
|  | ||||
|         $options->registerOption( | ||||
|             'keep', | ||||
|             'Comma separated list of languages to keep in addition to English.', | ||||
|             'k', | ||||
|             'langcodes' | ||||
|         ); | ||||
|         $options->registerOption( | ||||
|             'english-only', | ||||
|             'Remove all languages except English', | ||||
|             'e' | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Your main program | ||||
|      * | ||||
|      * Arguments and options have been parsed when this is run | ||||
|      * | ||||
|      * @param Options $options | ||||
|      * @return void | ||||
|      */ | ||||
|     protected function main(Options $options) { | ||||
|         if($options->getOpt('keep')) { | ||||
|             $keep = explode(',', $options->getOpt('keep')); | ||||
|             if(!in_array('en', $keep)) $keep[] = 'en'; | ||||
|         } elseif($options->getOpt('english-only')) { | ||||
|             $keep = array('en'); | ||||
|         } else { | ||||
|             echo $options->help(); | ||||
|             exit(0); | ||||
|         } | ||||
|  | ||||
|         // Kill all language directories in /inc/lang and /lib/plugins besides those in $langs array | ||||
|         $this->stripDirLangs(realpath(dirname(__FILE__) . '/../inc/lang'), $keep); | ||||
|         $this->processExtensions(realpath(dirname(__FILE__) . '/../lib/plugins'), $keep); | ||||
|         $this->processExtensions(realpath(dirname(__FILE__) . '/../lib/tpl'), $keep); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Strip languages from extensions | ||||
|      * | ||||
|      * @param string $path path to plugin or template dir | ||||
|      * @param array $keep_langs languages to keep | ||||
|      */ | ||||
|     protected function processExtensions($path, $keep_langs) { | ||||
|         if(is_dir($path)) { | ||||
|             $entries = scandir($path); | ||||
|  | ||||
|             foreach($entries as $entry) { | ||||
|                 if($entry != "." && $entry != "..") { | ||||
|                     if(is_dir($path . '/' . $entry)) { | ||||
|  | ||||
|                         $plugin_langs = $path . '/' . $entry . '/lang'; | ||||
|  | ||||
|                         if(is_dir($plugin_langs)) { | ||||
|                             $this->stripDirLangs($plugin_langs, $keep_langs); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Strip languages from path | ||||
|      * | ||||
|      * @param string $path path to lang dir | ||||
|      * @param array $keep_langs languages to keep | ||||
|      */ | ||||
|     protected function stripDirLangs($path, $keep_langs) { | ||||
|         $dir = dir($path); | ||||
|  | ||||
|         while(($cur_dir = $dir->read()) !== false) { | ||||
|             if($cur_dir != '.' and $cur_dir != '..' and is_dir($path . '/' . $cur_dir)) { | ||||
|  | ||||
|                 if(!in_array($cur_dir, $keep_langs, true)) { | ||||
|                     io_rmdir($path . '/' . $cur_dir, true); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         $dir->close(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| $cli = new StripLangsCLI(); | ||||
| $cli->run(); | ||||
							
								
								
									
										186
									
								
								ap23/web/doku/bin/wantedpages.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										186
									
								
								ap23/web/doku/bin/wantedpages.php
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,186 @@ | ||||
| #!/usr/bin/env php | ||||
| <?php | ||||
|  | ||||
| use splitbrain\phpcli\CLI; | ||||
| use splitbrain\phpcli\Options; | ||||
|  | ||||
| if(!defined('DOKU_INC')) define('DOKU_INC', realpath(dirname(__FILE__) . '/../') . '/'); | ||||
| define('NOSESSION', 1); | ||||
| require_once(DOKU_INC . 'inc/init.php'); | ||||
|  | ||||
| /** | ||||
|  * Find wanted pages | ||||
|  */ | ||||
| class WantedPagesCLI extends CLI { | ||||
|  | ||||
|     const DIR_CONTINUE = 1; | ||||
|     const DIR_NS = 2; | ||||
|     const DIR_PAGE = 3; | ||||
|  | ||||
|     private $skip = false; | ||||
|     private $sort = 'wanted'; | ||||
|  | ||||
|     private $result = array(); | ||||
|  | ||||
|     /** | ||||
|      * Register options and arguments on the given $options object | ||||
|      * | ||||
|      * @param Options $options | ||||
|      * @return void | ||||
|      */ | ||||
|     protected function setup(Options $options) { | ||||
|         $options->setHelp( | ||||
|             'Outputs a list of wanted pages (pages that do not exist yet) and their origin pages ' . | ||||
|             ' (the pages that are linkin to these missing pages).' | ||||
|         ); | ||||
|         $options->registerArgument( | ||||
|             'namespace', | ||||
|             'The namespace to lookup. Defaults to root namespace', | ||||
|             false | ||||
|         ); | ||||
|  | ||||
|         $options->registerOption( | ||||
|             'sort', | ||||
|             'Sort by wanted or origin page', | ||||
|             's', | ||||
|             '(wanted|origin)' | ||||
|         ); | ||||
|  | ||||
|         $options->registerOption( | ||||
|             'skip', | ||||
|             'Do not show the second dimension', | ||||
|             'k' | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Your main program | ||||
|      * | ||||
|      * Arguments and options have been parsed when this is run | ||||
|      * | ||||
|      * @param Options $options | ||||
|      * @return void | ||||
|      */ | ||||
|     protected function main(Options $options) { | ||||
|         $args = $options->getArgs(); | ||||
|         if($args) { | ||||
|             $startdir = dirname(wikiFN($args[0] . ':xxx')); | ||||
|         } else { | ||||
|             $startdir = dirname(wikiFN('xxx')); | ||||
|         } | ||||
|  | ||||
|         $this->skip = $options->getOpt('skip'); | ||||
|         $this->sort = $options->getOpt('sort'); | ||||
|  | ||||
|         $this->info("searching $startdir"); | ||||
|  | ||||
|         foreach($this->getPages($startdir) as $page) { | ||||
|             $this->internalLinks($page); | ||||
|         } | ||||
|         ksort($this->result); | ||||
|         foreach($this->result as $main => $subs) { | ||||
|             if($this->skip) { | ||||
|                 print "$main\n"; | ||||
|             } else { | ||||
|                 $subs = array_unique($subs); | ||||
|                 sort($subs); | ||||
|                 foreach($subs as $sub) { | ||||
|                     printf("%-40s %s\n", $main, $sub); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Determine directions of the search loop | ||||
|      * | ||||
|      * @param string $entry | ||||
|      * @param string $basepath | ||||
|      * @return int | ||||
|      */ | ||||
|     protected function dirFilter($entry, $basepath) { | ||||
|         if($entry == '.' || $entry == '..') { | ||||
|             return WantedPagesCLI::DIR_CONTINUE; | ||||
|         } | ||||
|         if(is_dir($basepath . '/' . $entry)) { | ||||
|             if(strpos($entry, '_') === 0) { | ||||
|                 return WantedPagesCLI::DIR_CONTINUE; | ||||
|             } | ||||
|             return WantedPagesCLI::DIR_NS; | ||||
|         } | ||||
|         if(preg_match('/\.txt$/', $entry)) { | ||||
|             return WantedPagesCLI::DIR_PAGE; | ||||
|         } | ||||
|         return WantedPagesCLI::DIR_CONTINUE; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Collects recursively the pages in a namespace | ||||
|      * | ||||
|      * @param string $dir | ||||
|      * @return array | ||||
|      * @throws DokuCLI_Exception | ||||
|      */ | ||||
|     protected function getPages($dir) { | ||||
|         static $trunclen = null; | ||||
|         if(!$trunclen) { | ||||
|             global $conf; | ||||
|             $trunclen = strlen($conf['datadir'] . ':'); | ||||
|         } | ||||
|  | ||||
|         if(!is_dir($dir)) { | ||||
|             throw new DokuCLI_Exception("Unable to read directory $dir"); | ||||
|         } | ||||
|  | ||||
|         $pages = array(); | ||||
|         $dh = opendir($dir); | ||||
|         while(false !== ($entry = readdir($dh))) { | ||||
|             $status = $this->dirFilter($entry, $dir); | ||||
|             if($status == WantedPagesCLI::DIR_CONTINUE) { | ||||
|                 continue; | ||||
|             } else if($status == WantedPagesCLI::DIR_NS) { | ||||
|                 $pages = array_merge($pages, $this->getPages($dir . '/' . $entry)); | ||||
|             } else { | ||||
|                 $page = array( | ||||
|                     'id' => pathID(substr($dir . '/' . $entry, $trunclen)), | ||||
|                     'file' => $dir . '/' . $entry, | ||||
|                 ); | ||||
|                 $pages[] = $page; | ||||
|             } | ||||
|         } | ||||
|         closedir($dh); | ||||
|         return $pages; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Parse instructions and add the non-existing links to the result array | ||||
|      * | ||||
|      * @param array $page array with page id and file path | ||||
|      */ | ||||
|     protected function internalLinks($page) { | ||||
|         global $conf; | ||||
|         $instructions = p_get_instructions(file_get_contents($page['file'])); | ||||
|         $cns = getNS($page['id']); | ||||
|         $exists = false; | ||||
|         $pid = $page['id']; | ||||
|         foreach($instructions as $ins) { | ||||
|             if($ins[0] == 'internallink' || ($conf['camelcase'] && $ins[0] == 'camelcaselink')) { | ||||
|                 $mid = $ins[1][0]; | ||||
|                 resolve_pageid($cns, $mid, $exists); | ||||
|                 if(!$exists) { | ||||
|                     list($mid) = explode('#', $mid); //record pages without hashes | ||||
|  | ||||
|                     if($this->sort == 'origin') { | ||||
|                         $this->result[$pid][] = $mid; | ||||
|                     } else { | ||||
|                         $this->result[$mid][] = $pid; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Main | ||||
| $cli = new WantedPagesCLI(); | ||||
| $cli->run(); | ||||
		Reference in New Issue
	
	Block a user