Changeset 95407 in spip-zone for _plugins_/ressource


Ignore:
Timestamp:
Feb 23, 2016, 10:52:31 PM (3 years ago)
Author:
fil@…
Message:

on peut maintenant utiliser un clone local d'un repo git pour activer les
raccourcis <[ressource github]>

Ainsi par exemple, si l'on commence par faire :
git clone https://github.com/rflynn/imgmin clones/github.com/rflynn/imgmin

et si on définit dans mes_options :
define('_DIR_RESSOURCE_GIT', _DIR_RACINE.'clones/');

alors le raccourci suivant ira chercher l'image dans le clone local du repo à la place d'un download https

<https://github.com/rflynn/imgmin/blob/master/examples/VJ-Day-Kiss-Jorgensen-after.jpg title="Kissing the War Goodbye" credit="Victor Jorgensen">

Cela fonctionne même si c'est dans une branche ou un commit numéroté :
<https://github.com/rflynn/imgmin/blob/d774b2aa269e311b35a9e6d29853a24e0a05efe1/examples/imgmin-logo90-after.png>
(on fait un git checkout (branch))

Le code veut être générique mais il n'a été testé qu'avec les urls github.com ; c'est facile à étendre et on poura certainement bidouiller pour écrire <git/user/repo/blob/master/path/to/file.jpg> , ou quelque chose de plus simple, à définir.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/ressource/inc/ressource.php

    r95280 r95407  
    112112                $meta['local'] = copie_locale($meta['href'], 'test');
    113113        }
    114         else
     114
     115        /* un lien github */
     116        if (preg_match(",^https://(github\.com)/([^/]+/[^/]+)/blob/([^/]+)/(.*)$,",
     117        $src, $r)) {
     118                # 1. calculer l'url avec ?raw=true pour un access https
     119                $src = parametre_url($src, 'raw', 'true');
     120
     121                # 2. recuperer le repo, la branche et le chemin du fichier
     122                $server = $r[1];
     123                $repo = $r[2];
     124                $branch = $r[3];
     125                $file = $r[4];
     126
     127                # 3. regarder si on a un clone en local
     128                if (defined('_DIR_RESSOURCE_GIT') && (_DIR_RESSOURCE_GIT !== false)) {
     129
     130                        $dir = _DIR_RESSOURCE_GIT . $server . '/' . $repo;
     131                        if (is_dir($dir) && is_dir($dir.'/.git')) {
     132                                $_dir = escapeshellarg($dir);
     133                                $_branch = escapeshellarg($branch);
     134
     135                                try {
     136                                        # 4. se mettre dans la branche et recuperer le fichier
     137                                        $cmd = "cd $_dir && git checkout $_branch";
     138                                        $b = trim(`$cmd`);
     139                                        spip_log("$cmd: $b", 'distant');
     140
     141                                        # 5. si pas de fichier, ou demande de ?var_mode=reload,
     142                                        #    mettre à jour le repo
     143                                        if (!file_exists($dir.'/'.$file)
     144                                        || (_request('var_mode') == 'reload' && autoriser('reload', 'images') && (filemtime($dir.'/.git') < time() - 60))
     145                                        ) {
     146                                                $cmd = "cd $_dir && git pull && git checkout $_branch";
     147                                                $b = trim(`$cmd`);
     148                                                spip_log("$cmd: $b", 'distant');
     149
     150                                                # 6. Si ca ne marche toujours pas on est déçu
     151                                                #   et on va quand même tenter un accès https
     152                                                if (!file_exists($dir.'/'.$file)) {
     153                                                        throw new Exception('github: pas de version locale, on essaiera par https');
     154                                                }
     155                                        }
     156                                        $fichier = $src = $dir.'/'.$file;
     157                                        $meta['local'] = $fichier;
     158                                        $meta['href'] = $fichier;
     159                                }
     160                                catch (Exception $e) {
     161                                        spip_log($e, 'distant');
     162                                }
     163                        }
     164                }
     165        }
     166
    115167        if (preg_match(',^https?://,', $src)) {
    116168
     
    118170                $src = preg_replace(",^(https://)(www)(\.dropbox\.com/.*/.*/.*)$,",
    119171                        '\1dl\3', $src);
    120 
    121                 /* un lien github */
    122                 if (preg_match(",^https://github\.com/[^/]+/[^/]+/blob/.*$,",
    123                 $src)) {
    124                         $src = parametre_url($src, 'raw', 'true');
    125                        
    126                 }
    127172
    128173                $meta['href'] = $src;
Note: See TracChangeset for help on using the changeset viewer.