source: spip-zone/_plugins_/couteau_suisse/outils/maj_auto_action_rapide.php @ 65295

Last change on this file since 65295 was 65295, checked in by patfr@…, 7 years ago

MAJ auto : Meilleur placement des actions réalisées et en attendant, un bouton SVP pour tout les candidats !

File size: 19.2 KB
Line 
1<?php
2
3// module inclu dans la description de l'outil en page de configuration
4
5if (!defined("_ECRIRE_INC_VERSION")) return; // securiser
6//include_spip('inc/actions');
7//include_spip('inc/actions_compat');
8include_spip('inc/distant');
9include_spip('inc/presentation');
10if(version_compare(PHP_VERSION, '5.0.0', '>=')) 
11        include_spip('outils/maj_auto_php5'); else { function cs_svn17($dir) { return false; } }
12
13define('_MAJ_SVN_FILE', 'file:///home/svn/repository/spip-zone/');
14define('_MAJ_SVN_DEBUT', 'svn://zone.spip.org/spip-zone/');
15define('_MAJ_SVN_TRAC', 'svn://trac.rezo.net/spip-zone/'); // ancienne URL
16define('_MAJ_ZONE', 'http://zone.spip.org/trac/spip-zone/');
17define('_MAJ_LOG_DEBUT', _MAJ_ZONE.'log/');
18define('_MAJ_LOG_FIN', '?format=changelog');
19define('_MAJ_ZIP', 'http://files.spip.org/spip-zone/');
20define('_MAJ_ZIP_SPIP', 'http://files.spip.org/spip/archives/SPIP-v');
21define('_MAJ_ECRAN_SECU', _MAJ_ZONE.'browser/_core_/securite/ecran_securite.php?format=txt');
22
23// Pour SPIP = 2.0.X
24if(!function_exists('info_maj_spip')) {
25        include_spip('inc/plugin');
26        if(!function_exists('spip_version_compare')) {
27                function spip_version_compare($v1,$v2,$op) { return version_compare($v1,$v2,$op); }
28        }
29        function info_maj_spip(){
30                if (!autoriser('webmestre')) return "";
31                // derniere version de SPIP
32                $maj = $GLOBALS['meta']['info_maj_spip'];
33                if (!$maj) return "";
34                list(,$maj) = explode('|',$maj,2);
35                if (strncmp($maj,"<a",2)==0) $maj = extraire_attribut ($maj, 'title');
36                $lien = "http://www.spip.net/".$GLOBALS['spip_lang']."_download";
37                $res = _T('couteau:maj_rev_ok',array('revision'=>$maj, 'url'=>$lien, 'zip'=>''));
38                include_spip('lib/maj_auto/distant_mise_a_jour');
39                return $res;
40        }
41        function compat_maj_spip($forcer=false) {
42                include_spip('lib/maj_auto/distant_mise_a_jour');
43                if(function_exists('genie_mise_a_jour_dist') && $forcer) return genie_mise_a_jour_dist(0);
44        }
45}
46
47function maj_auto_js() {
48        return http_script("
49jQuery(document).ready(function() {
50        var ch = jQuery('#maj_auto_div .maj_checked');
51        var re = jQuery('.cs_relancer a');
52        if(ch.length) ch[0].checked = true;
53        else if(!re.length){
54                jQuery('#maj_auto_div :submit').parent().remove();
55                jQuery('#maj_auto_div :radio').attr('disabled','disabled');
56        }
57        if(!jQuery('#maj_auto_div :radio:checked').length && jQuery('#maj_auto_div :radio').length)
58                jQuery('#maj_auto_div :radio:first')[0].checked = true;
59        var ch = jQuery('#maj_auto_div :checkbox');
60        if(ch.length==1) ch.hide();
61        re.click(function() {
62                cs_href_click(jQuery('#maj_auto')[0], true);
63                return false;
64        });
65        jQuery('#maj_auto_div thead').click( function() {
66                var span = jQuery('span', this);
67                if(!span.length) return true;
68                jQuery(this).next().toggleClass('cs_hidden');
69                cs_EcrireCookie(span[0].id, '+'+span[0].className, dixans);
70                span.toggleClass('cs_hidden');
71                // annulation du clic
72                return false;
73        }).each(maj_lire_cookie);
74        jQuery('.select_plugin').click( function() {
75                var checks = jQuery('#maj_auto_div :checkbox:checked').length;
76                var radios = jQuery('#maj_auto_div :radio');
77                if(checks) radios.hide(); else radios.show();
78        });
79
80function maj_lire_cookie(i,e){
81        var span = jQuery('span', this);
82        if(!span.length) return;
83        jQuery(this).attr('style', 'cursor:pointer;')
84        var c = cs_LireCookie(span[0].id);
85        if(c!==null && c.match('cs_hidden')) {
86                jQuery(this).next().addClass('cs_hidden');
87                span.removeClass('cs_hidden');
88        }
89}
90});"); }
91
92function info_maj_spip2(){
93        if (!autoriser('webmestre')) return "";
94        include_spip('inc/presentation');
95        // Plus grosse version de SPIP dispo (API d'origine)
96        $res = info_maj_spip();
97        $maj = $GLOBALS['meta']['info_maj_spip']; 
98        list(,$maj) = explode('|',$maj,2);
99        // Complement d'info : toutes les autres versions dispos
100        list($m1, $m2, $m3) = preg_split('/\D+/', $GLOBALS['spip_version_branche']);
101        if($m = info_maj_spip_ext($m1, $m2, $m3)) { if($maj & $res) $m[$maj] = $res; $res = join('<br />', $m); }
102        if(!strlen($res)) return $res;
103        // liens morts
104        $res = preg_replace(',\[([^[]+)->\],', '$1', $res);             
105        return "<fieldset><legend $style>"._T('couteauprive:help2', array('version'=>'SPIP '.$GLOBALS['spip_version_branche'])).'</legend>'
106                . propre("\n|{{{$res}}}|")
107                . (preg_match(",$m1\.$m2\.\d+,",$res)?'<p>'._T('couteau:maj_spip').'</p>':'').'</fieldset>';
108}
109
110// Liste de toutes les versions de SPIP [234].[01].? les plus elevees
111function info_maj_spip_ext($ver_min, $rev_min, $min3){
112        $res = array();
113        include_spip('genie/mise_a_jour');
114        if(!function_exists('info_maj_cache')) return $res;
115        $nom = _DIR_CACHE_XML . _VERSIONS_LISTE;
116        $page = info_maj_cache($nom, 'spip', !file_exists($nom) ? '' : file_get_contents($nom));
117        preg_match_all(',/SPIP\D+((\d)\D+(\d)(\D+(\d+))?.*?[.]zip)",i', $page, $m,  PREG_SET_ORDER);
118        $v_min = "$ver_min.$rev_min.$min3";
119        for($ver=$ver_min;$ver<=4;$ver++) for($rev=($ver==$ver_min?$rev_min:0);$rev<=1;$rev++) { 
120                $max = -1;
121                foreach ($m as $v) if ($v[2]=="$ver" && $v[3]=="$rev" && $v[5]>$max) 
122                        list($max, $fich) = array($v[5], $v[1]);
123                if($max>=0 && ($v="$ver.$rev.$max")!=$v_min)
124                        $res[$v] = _T('couteau:maj_rev_ok',array('revision'=>$v, 'url'=>_MAJ_ZIP_SPIP.$fich, 'zip'=>''));
125        }
126        ksort($res);
127        return $res;
128}
129
130
131function maj_auto_action_rapide() {
132        $arg_chargeur = $GLOBALS['spip_version_base']>=15828?'url_zip_plugin2':'url_zip_plugin'; // eq. SPIP >= 2.1.2
133        $tiers = array_map(create_function('$v','return _T("couteau:2pts", array("objet"=>$v));'), explode('/', _T('couteau:maj_tiers')));
134        $tiers = array('necessite'=> $tiers[0], 'utilise'=> $tiers[1], 'procure'=> $tiers[2]);
135        $time = time();
136        $timeout = ini_get('max_execution_time');
137        $timeout = $timeout?min(30,floor($timeout/2)):10;
138        $style = 'style="padding:0.4em;"';
139        // verification des mises a jour de SPIP >= 2.0
140        $html1 = info_maj_spip2();
141        // verification de l'ecran de securite
142        if(defined('_ECRAN_SECURITE')) {
143                $maj = maj_auto_rev_distante(_MAJ_ECRAN_SECU,false,",(\d+\.\d+(\.\d+)?),",0,true);
144                if($maj{0}!="-" && _ECRAN_SECURITE!=$maj) {
145                        include_spip('inc/description_outil');
146                        $html1 .= "\n<fieldset><legend $style>"._T('couteauprive:help2', array('version'=>_T('couteauprive:ecran_securite:nom').' '._ECRAN_SECURITE)).'</legend>'
147                                . description_outil_liens(_T("couteauprive:ecran_maj_ko2", array("n"=>"<span style=\"color:red; font-weight:bold;\">$maj</span>"))).'</fieldset>';
148                }
149        }
150        // verification des plugins
151        include_spip('inc/plugin');
152        $plugins_actifs = array_values(liste_chemin_plugin_actifs());
153        // liste des extensions dispo sous SPIP >= 2.1
154        if(defined('_DIR_EXTENSIONS')) define('_DIR_PLUGINS_DIST', _DIR_EXTENSIONS); // compat pour SPIP 2.1
155        $plugins_extensions = defined('_SPIP20100')?array_values(liste_chemin_plugin_actifs(_DIR_PLUGINS_DIST)):array();
156        // tous, mais les actifs d'abord...
157        $plugins = array_unique(array_merge($plugins_actifs, $plugins_extensions, liste_plugin_files()));
158        $html_actifs = $html_inactifs = $html_extensions = array();
159        if(defined('_SPIP30000')) {
160                include_spip('exec/admin_plugin');
161                echo svp_presenter_actions_realisees();
162        }
163        foreach ($plugins as $p) {
164                $actif = in_array($p, $plugins_actifs, true);
165                $extension = in_array($p, $plugins_extensions, true);
166                $auto = strncmp($p, 'auto/', 5)==0;
167                $infos = plugin_get_infos_maj($p, $stop=time()-$time>$timeout, $extension?_DIR_PLUGINS_DIST:_DIR_PLUGINS);
168                if(!defined('_SPIP30000') && strtoupper($infos['necessite'][0]['id'])=='SPIP') array_shift($infos['necessite']);
169                $maj_lib = $checked = '';
170                if($stop)
171                        $maj_lib = '<span class="cs_relancer">'.'Temps serveur &eacute;coul&eacute; : [poursuivre->#].'.'</span>';
172                elseif($infos['maj_dispo']) { 
173                        $maj_lib = _T('couteau:maj_rev_ok', 
174                                array('revision' => $infos['rev_rss'], 'url'=>$infos['url_origine'], 'zip'=>$infos['zip_trac']));
175                        $checked = " class='maj_checked'"; }
176                elseif($infos['rev_rss']>0 && $infos['rev_local'])
177                        $maj_lib = _T('couteau:maj'.($infos['svn']?'_svn':'_ok'),
178                                array('zip'=>$infos['zip_trac'], 'url'=>$infos['url_origine']));
179                elseif($auto) {
180                        $maj_lib = _T('couteau:maj_rev_ko', array('url'=>$infos['url_origine']));
181                        $checked = " class='maj_checked'"; }
182                elseif($infos['rev_local'] && $infos['rev_rss']<=0)
183                        $maj_lib = _T('couteau:maj_rev_ko', array('url'=>$infos['url_origine']));
184                // eventuels liens morts
185                $maj_lib = preg_replace(',\[([^[]+)->\],', '$1', $maj_lib);
186                $nom = preg_replace(",[\n\r]+,",' ',$infos['nom']). '&nbsp;(v' .$infos['version'] . ')' . ($maj_lib?"\n_ {{".$maj_lib.'}}':'');
187                $rev = $infos['rev_local']?_T('couteau:maj_rev', array('revision' => $infos['rev_local'])):'';
188                if(strlen($infos['commit'])) $rev .= (strlen($rev)?'<br/>':'') . cs_date_court($infos['commit']);
189                if($infos['svn']) $rev .= '<br/><span style="font-variant:small-caps;">svn</span>';
190                if($infos['id_paquet']>0) $rev .= '<span style="font-variant:small-caps;">&nbsp;svp</span>';
191                        elseif($infos['id_paquet']<0) $rev .= '<span style="font-variant:small-caps;">&nbsp;old</span>';
192                $id_paquet = abs($infos['id_paquet']);
193                if(!strlen($rev)) $rev = '&nbsp;';
194                $zip_log = (strlen($infos['zip_log']) && $infos['zip_log']!=$infos['zip_trac'])
195                        ?"<label><input type='radio' value='$infos[zip_log]'$checked name='$arg_chargeur'/>[->$infos[zip_log]]</label>":'';
196                $bouton = '&nbsp;';
197                if(!$stop) {
198                        if(/*$infos['maj_dispo'] &&*/ $id_paquet) // bouton pour SVP
199                                $bouton = "<input type='radio' value='$id_paquet.$infos[id_depot]'$checked name='$arg_chargeur'/><br/><input type='checkbox' class='checkbox select_plugin' name='ids_paquet[]' value='$id_paquet.$infos[id_depot]'>";
200                        elseif($auto) $bouton = strlen($infos['zip_trac'])
201                                ?"<input type='radio' value='$infos[zip_trac]'$checked name='$arg_chargeur'/>"
202                                :'<center style="margin-top:0.6em;font-weight:bold;"><acronym title="'._T('couteau:maj_zip_ko').'">&#63;</acronym></center>';
203                }
204                if(strlen($zip_log)) {
205                        if (!$stop)
206                                $nom .= "<br/>" . _T('couteau:maj_verif') . "<br/>$zip_log<br/>{$bouton}[->$infos[zip_trac]]<label>";
207                        $bouton = '&nbsp;';
208                }
209                // relations exterieures
210                foreach($tiers as $k=>$v) if(isset($infos[$k]) && count($infos[$k]))
211                                $nom .= "<br/>$v {".join('}, {', array_map('array_shift', $infos[$k])).'}';
212                ${$actif?'html_actifs':($extension?'html_extensions':'html_inactifs')}[] = "|$bouton|$nom|$rev|";
213        }
214       
215        $sep = " class='cs_hidden'> (...)</span>}}|<|<|\n";
216        $html1 = "\n<div $style id='maj_auto_div'>$html1<fieldset><legend $style>"
217                . _T('couteau:maj_liste').'</legend>'
218                . propre(
219                        (count($html_actifs)? "\n|{{" . _T('couteau:plug_actifs') . "<span id='maj_1'" . $sep . join("\n",$html_actifs) . "\n" : '')
220                        . (count($html_extensions)? "\n|{{" . _T(defined('_SPIP30000')?'plugins_liste_dist':'plugins_liste_extensions') . "<span id='maj_2'". $sep . join("\n",$html_extensions) . "\n" : '')
221                        . (count($html_inactifs)? "\n|{{" . _T('couteau:plug_inactifs') . "<span id='maj_3'". $sep . join("\n",$html_inactifs) . "\n" : '')
222                  )
223                . "<div style='text-align: right;'><input class='fondo' type='submit' value=\""
224                . attribut_html(_T('couteau:maj_maj'))
225                . '" /><p><i>'._T('couteau:maj_verif2').'</i></p></div></fieldset></div>'
226                . maj_auto_js();
227        $html2 = "\n<div class='cs_sobre'><input class='cs_sobre' type='submit' value=\"["
228                . attribut_html(_T('couteau:maj_actu')) . ']" /></div>';
229
230// premier formulaire non ajax, lancant directement charger_plugin
231        return redirige_action_post('charger_plugin', '', 'admin_couteau_suisse', "cmd=descrip&outil=maj_auto#cs_infos", $html1)
232// second formulaire ajax : lien d'actualisation forcee
233                . ajax_action_auteur('action_rapide', 'maj_auto_forcer', 'admin_couteau_suisse', "arg=maj_auto|description_outil&cmd=descrip#cs_action_rapide", $html2);
234}
235
236// renvoie le pattern present dans la page distante
237// si le pattern est NULL, renvoie un simple 'is_file_exists'
238function maj_auto_rev_distante($url, $timeout=false, $pattern=NULL, $lastmodified=0, $force=false) {
239        $force |= in_array(_request('var_mode'), array('calcul', 'recalcul'));
240        // pour la version distante, on regarde toutes les 24h00 (meme en cas d'echec)
241        $maj_ = isset($GLOBALS['meta']['tweaks_maj_auto'])?unserialize($GLOBALS['meta']['tweaks_maj_auto']):array();
242        if(!isset($maj_[$url_=md5($url)])) $maj_[$url_] = array(0, false);
243        $maj = &$maj_[$url_];
244        // prendre le cache si svn.revision n'est pas modifie recemment, si les 24h ne sont pas ecoulee, et si on ne force pas
245        if (!$force && $maj[1]!==false && ($lastmodified<$maj[0]) && (time()-$maj[0] < 24*3600))
246                $distant = $maj[1];
247        elseif($timeout)
248                return '-1';
249        else {
250                $distant = $maj[1] = ($pattern!==NULL)
251                        ?(($distant = recuperer_page($url))
252                                ?(preg_match($pattern, $distant, $regs)?$regs[1]:'-2')
253                                :'-1')
254                        :strlen(recuperer_page($url, false, true, 0));
255                $maj[0] = time();
256                ecrire_meta('tweaks_maj_auto', serialize($maj_));
257                ecrire_metas();
258        }
259        return $distant;
260}
261
262function plugin_get_infos_maj($p, $timeout=false, $DIR_PLUGINS=_DIR_PLUGINS) {
263        if(defined('_SPIP20100')) {
264                $get_infos = charger_fonction('get_infos','plugins');
265                $infos = $get_infos($p, false, $DIR_PLUGINS);
266        } else $infos = plugin_get_infos($p);
267        // fichier svn.revision fourni par SPIP
268        $ok = lire_fichier($svn_rev = $DIR_PLUGINS.$p.'/svn.revision', $svn);
269        $lastmodified = @file_exists($svn_rev)?@filemtime($svn_rev):0;
270        if($ok && preg_match(',<origine>(.+)</origine>,', $svn, $regs)) {
271                $url_origine = str_replace(array(_MAJ_SVN_FILE, _MAJ_SVN_DEBUT), _MAJ_LOG_DEBUT, $regs[1]);
272                // prise en compte du recent demenagement de la Zone...
273                $url_origine = preg_replace(',/_plugins_/_(?:stable|dev|test)_/,','/_plugins_/', $url_origine);
274        } else $url_origine = '';
275        $infos['commit'] = ($ok && preg_match(',<commit>(.+)</commit>,', $svn, $regs))?$regs[1]:'';
276        $rev_local = (strlen($svn) && preg_match(',<revision>(.+)</revision>,', $svn, $regs))
277                ?intval($regs[1]):version_svn_courante2($DIR_PLUGINS.$p);
278        if($infos['svn'] = is_array($rev_local) || $rev_local<0) { 
279                // systeme SVN en place
280                if (is_array($rev_local)) // version SVN >= 1.7 ?
281                        list($rev_local, $url_origine) = $rev_local;   
282                // version SVN anterieure
283                elseif (lire_fichier($DIR_PLUGINS.$p.'/.svn/entries', $svn) 
284                                && preg_match(',(?:'.preg_quote(_MAJ_SVN_TRAC).'|'.preg_quote(_MAJ_SVN_DEBUT).')[^\n\r]+,ms', $svn, $regs))
285                        $url_origine = $regs[0];
286                $url_origine = str_replace(array(_MAJ_SVN_TRAC,_MAJ_SVN_DEBUT), _MAJ_LOG_DEBUT, $url_origine);
287                // prise en compte du recent demenagement de la Zone...
288                $url_origine = preg_replace(',/_plugins_/_(?:stable|dev|test)_/,','/_plugins_/', $url_origine);
289        }
290        // URL http:// inattendu
291        if(strncmp($url_origine, 'http://', 7)!==0) $url_origine='';
292        $infos['id_paquet'] = 0; // SVP
293        $infos['url_origine'] = strlen($url_origine)?$url_origine._MAJ_LOG_FIN:'';
294        $infos['rev_local'] = abs($rev_local);
295        $infos['rev_rss'] = intval(maj_auto_rev_distante($infos['url_origine'], $timeout, ', \[(\d+)\],', $lastmodified));
296        $infos['maj_dispo'] = $infos['rev_rss']>0 && $infos['rev_local']>0 && $infos['rev_rss']>$infos['rev_local'];
297        // fichiers zip
298        $infos['zip_log'] = $infos['zip_trac'] = '';
299        $p2 = preg_match(',^auto/(.*)$,', $p, $regs)?$regs[1]:'';
300        if(strlen($p2)) {
301//echo "<hr/>$p -> $infos[prefix]<br/>";
302                if(defined('_SPIP30000')) {
303                        // supposition du passage par SVP ?
304                        maj_auto_svp_query($p, $infos);
305                        // ce plugin passe en negatif s'il n'a pas ete installe par SVP
306                        if(strpos($p2,$infos['prefix'].'/v')===false) $infos['id_paquet'] *= -1;
307                }
308                // supposition du nom d'archive sur files.spip.org
309                if(!$infos['zip_trac'] && intval(maj_auto_rev_distante($f = _MAJ_ZIP.$p2.'.zip', $timeout)))
310                        $infos['zip_trac'] = $f;
311                // nom de l'archive recemment installee par chargeur
312                if(lire_fichier(sous_repertoire(_DIR_CACHE, 'chargeur').$p2.'/install.log', $log)
313                                && preg_match(',[\n\r]source: *([^\n\r]+),msi', $log, $regs)
314                                && intval(maj_auto_rev_distante($regs[1], $timeout)))
315                        $infos['zip_log'] = $regs[1];
316                // au final on prend le bon
317                if(!$infos['zip_trac']) $infos['zip_trac'] = $infos['zip_log'];
318        }
319        return $infos;
320}
321
322// fonction cherchant un fichier zip valide dans les paquets de SVP
323// retourne array($id_paquet, $url_zips, $nom_zip)
324function maj_auto_svp_query($dir, &$infos) {
325        // Recherche en base du plugin local, puis du paquet distant
326        if($x=sql_fetsel('id_paquet,id_plugin,version,nom_archive','spip_paquets','src_archive='._q($dir)))
327                if($y=sql_fetsel('id_paquet,p.id_depot,p.version,nom_archive,src_archive,url_archives,url_brouteur',
328                        array('spip_paquets AS p', 'spip_depots AS d'), array('p.id_plugin='.$x['id_plugin'], 'p.id_depot>0'))) {
329                $infos['id_paquet'] = $x['id_paquet'];
330                $infos['id_depot'] = $y['id_depot'];
331                // info : si $x['version']<>$y['version'] alors SVP propose une mise a jour disponible
332                // construction du paquet zip
333                if(strlen($y['nom_archive']) && intval(maj_auto_rev_distante($f = $y['url_archives'].'/'.$y['nom_archive'], $timeout))) 
334                        $infos['zip_trac'] = $f;
335//echo "<hr>$dir -> $infos[prefix]<br>SQL LOCAL = "; print_r($x); echo "<br>SQL DISTANT = "; print_r($y);
336        }
337}
338
339// fonction manipulant les fonctions CVT de SVP (cf. svp/formulaires/admin_plugin.php)
340function maj_auto_svp_maj_plugin($ids_paquet=array()) {
341/*      // actualiser la liste des paquets locaux systematiquement
342        include_spip('inc/svp_depoter_local');
343        // sans forcer tout le recalcul en base
344        svp_actualiser_paquets_locaux(false, $foo);*/
345
346        $actions = $depots = $messages = $retour = array();
347        foreach ($ids_paquet as $i)     {
348                list($p, $d) = explode('.', $i);
349                $actions[$p] = 'up';
350                $depots[$d] = 1;
351        }
352        // actualiser la liste des paquets distants
353        // ici une demande manuelle de mise a jour est demandee, autant etre sur
354        include_spip('inc/svp_depoter_distant');
355        foreach($depots as $k=>$v) svp_actualiser_depot($k);
356
357        // lancer les verifications
358        if(count($actions)) {
359                // faire appel au decideur pour determiner la liste exacte des commandes apres
360                // verification des dependances
361                include_spip('inc/svp_decider');
362                svp_decider_verifier_actions_demandees($actions, $messages);
363        } else
364                $messages['decideur_erreurs'][] = _T('svp:message_erreur_aucun_plugin_selectionne');
365        if(!count($messages['decideur_erreurs'])) {
366                // recuperer les actions puis les envoyer a l'actionneur
367                $actions = unserialize(_request('_todo'));
368                if(!count($actions))
369                        $messages['decideur_actions'][] = _T('svp:message_erreur_aucun_plugin_selectionne');
370                include_spip('inc/svp_actionner');
371                svp_actionner_traiter_actions_demandees($actions, $retour, $redirect);
372                $action = charger_fonction('actionner', 'action');
373                $action();
374        }
375        include_spip('inc/headers');
376        redirige_par_entete(_request('redirect'));
377}
378
379// fonction {$outil}_{$arg}_action() appelee par action/action_rapide.php
380function maj_auto_maj_auto_forcer_action() {
381        // forcer la lecture de la derniere version de SPIP
382        if(function_exists('compat_maj_spip')) compat_maj_spip(true); // pour SPIP < 2.1
383        elseif($cron = charger_fonction('mise_a_jour', 'genie')) $cron(0);
384        // forcer la lecture des revisions distantes de plugins
385        ecrire_meta('tweaks_maj_auto', serialize(array()));
386        ecrire_metas();
387}
388
389function version_svn_courante2($dir) {
390        // recherche de la base de donnee
391        if(!$db = @file_exists($dir2 = realpath($dir . '/.svn/wc.db'))) {
392                // version <1.7 de Subversion (reconnue par SPIP)
393                if(@file_exists($dir.'/.svn/entries')) return version_svn_courante($dir);
394                // trunk et extensions
395                $db = @file_exists($dir2 = realpath($dir . '/../.svn/wc.db'));
396                if(!$db) {
397                        // branches
398                        $db = @file_exists($dir2 = realpath($dir . '/../../.svn/wc.db'));
399                        if($db) $b = basename(dirname($dir)).'/'.basename($dir);
400                } else $b = basename($dir);
401        } else $b = '';
402        // version 1.7 de Subversion
403        return cs_svn17($dir2);
404}
405
406?>
Note: See TracBrowser for help on using the repository browser.