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

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

Changement d'url de Trac !

File size: 8.7 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
6include_spip('inc/actions');
7include_spip('inc/distant');
8
9define('_MAJ_SVN_FILE', 'file:///home/svn/repository/spip-zone/');
10define('_MAJ_SVN_DEBUT', 'svn://zone.spip.org/spip-zone/');
11define('_MAJ_SVN_TRAC', 'svn://trac.rezo.net/spip-zone/'); // ancienne URL
12define('_MAJ_LOG_DEBUT', 'http://zone.spip.org/log/');
13define('_MAJ_LOG_FIN', '?format=changelog');
14define('_MAJ_ZIP', 'http://files.spip.org/spip-zone/');
15
16function maj_auto_action_rapide() {
17        $time = time();
18        $timeout = ini_get('max_execution_time');
19        $timeout = $timeout?min(30,floor($timeout/2)):10;
20        include_spip('inc/plugin');
21        $plugins_actifs = array_values(liste_chemin_plugin_actifs());
22        // tous, mais les actifs d'abord...
23        $plugins = array_unique(array_merge($plugins_actifs, liste_plugin_files()));
24        $html_actifs = $html_inactifs = array();
25        foreach ($plugins as $p) /*if(preg_match(',^auto/,', $p))*/ {
26                $actif = in_array($p, $plugins_actifs, true);
27                $auto = preg_match(',^auto/,', $p);
28                $infos = plugin_get_infos_maj($p, $stop=time()-$time>$timeout);
29                $maj_lib = $checked = '';
30                if($stop)
31                        $maj_lib = '<span class="cs_relancer">'.'Temps serveur &eacute;coul&eacute; : [poursuivre->#].'.'</span>';
32                elseif($infos['maj_dispo']) { 
33                        $maj_lib = _T('couteau:maj_rev_ok', 
34                                array('revision' => $infos['rev_rss'], 'url'=>$infos['url_origine'], 'zip'=>$infos['zip_trac']));
35                        $checked = " class='maj_checked'"; }
36                elseif($infos['rev_rss']>0 && $infos['rev_local'])
37                        $maj_lib = _T('couteau:maj'.($infos['svn']?'_svn':'_ok'),
38                                array('zip'=>$infos['zip_trac'], 'url'=>$infos['url_origine']));
39                elseif($auto) {
40                        $maj_lib = _T('couteau:maj_rev_ko', array('url'=>$infos['url_origine']));
41                        $checked = " class='maj_checked'"; }
42                elseif($infos['rev_local'] && $infos['rev_rss']<=0)
43                        $maj_lib = _T('couteau:maj_rev_ko', array('url'=>$infos['url_origine']));
44                // eventuels liens morts
45                $maj_lib = preg_replace(',\[([^[]+)->\],', '$1', $maj_lib);
46                $nom = preg_replace(",[\n\r]+,",' ',$infos['nom']). '&nbsp;(v' .$infos['version'] . ')' . ($maj_lib?"\n_ {{".$maj_lib.'}}':'');
47                $rev = $infos['rev_local']?_T('couteau:maj_rev', array('revision' => $infos['rev_local'])):'';
48                if(strlen($infos['commit'])) $rev .= (strlen($rev)?'<br/>':'') . cs_date_court($infos['commit']);
49                if($infos['svn']) $rev .= '<br/>SVN';           
50                if(!strlen($rev)) $rev = '&nbsp;';
51                $zip_log = (strlen($infos['zip_log']) && $infos['zip_log']!=$infos['zip_trac'])
52                        ?"<label><input type='radio' value='$infos[zip_log]'$checked name='url_zip_plugin'/>[->$infos[zip_log]]</label>":'';
53                $bouton = '&nbsp;';
54                if($auto && !$stop) $bouton = strlen($infos['zip_trac'])
55                        ?"<input type='radio' value='$infos[zip_trac]'$checked name='url_zip_plugin'/>"
56                        :'<center style="margin-top:0.6em;font-weight:bold;"><acronym title="'._T('couteau:maj_zip_ko').'">&#63;</acronym></center>';
57                if(strlen($zip_log)) {
58                        if (!$stop)
59                                $nom .= "\n_ "._T('couteau:maj_verif') . "\n_ $zip_log\n_ {$bouton}[->$infos[zip_trac]]<label>";
60                        $bouton = '&nbsp;';
61                }
62                ${$actif?'html_actifs':'html_inactifs'}[] = "|$bouton|$nom|$rev|";
63        }
64
65        $html1 = "\n<div style='padding:0.4em;' id='maj_auto_div'><fieldset><legend style='padding:0.4em;'>"
66                . _T('couteau:maj_liste').'</legend>'
67                . propre(
68                        (count($html_actifs)? "\n|{{" . _T('couteau:plug_actifs') . "}}|<|<|\n" . join("\n",$html_actifs) . "\n" : '')
69                        . (count($html_inactifs)? "\n|{{" . _T('couteau:plug_inactifs') . "}}|<|<|\n" . join("\n",$html_inactifs) . "\n" : '')
70                  )
71                . "<div style='text-align: right;'><input class='fondo' type='submit' value=\""
72                . attribut_html(_T('couteau:maj_maj'))
73                . '" /><p><i>'._T('couteau:maj_verif2').'</i></p></div></fieldset></div>'
74                . http_script("
75jQuery(document).ready(function() {
76        var ch = jQuery('#maj_auto_div .maj_checked');
77        var re = jQuery('.cs_relancer a');
78        if(ch.length) ch[0].checked = true;
79        else if(!re.length){
80                jQuery('#maj_auto_div :submit').parent().remove();
81                jQuery('#maj_auto_div :radio').attr('disabled','disabled');
82        }
83        if(!jQuery('#maj_auto_div :radio:checked').length)
84                jQuery('#maj_auto_div :radio:first')[0].checked = true;
85        re.click(function() {
86                cs_href_click(jQuery('#maj_auto')[0], true);
87                return false;
88        });
89});");
90        $html2 = "\n<div class='cs_sobre'><input class='cs_sobre' type='submit' value=\"["
91                . attribut_html(_T('couteau:maj_actu')) . ']" /></div>';
92
93// premier formulaire non ajax, lancant directement charger_plugin
94        return redirige_action_post('charger_plugin', '', 'admin_couteau_suisse', "cmd=descrip&outil=maj_auto#cs_infos", $html1)
95// second formulaire ajax : lien d'actualisation forcee
96                . ajax_action_auteur('action_rapide', 'maj_auto_forcer', 'admin_couteau_suisse', "arg=maj_auto|description_outil&cmd=descrip#cs_action_rapide", $html2);
97}
98
99// renvoie le pattern present dans la page distante
100// si le pattern est NULL, renvoie un simple 'is_file_exists'
101function maj_auto_rev_distante($url, $timeout=false, $pattern=NULL, $lastmodified=0, $force=false) {
102        $force |= in_array(_request('var_mode'), array('calcul', 'recalcul'));
103
104        // pour la version distante, on regarde toutes les 24h00 (meme en cas d'echec)
105        $maj_ = isset($GLOBALS['meta']['tweaks_maj_auto'])?unserialize($GLOBALS['meta']['tweaks_maj_auto']):array();
106        if(!isset($maj_[$url_=md5($url)])) $maj_[$url_] = array(0, false);
107        $maj = &$maj_[$url_];
108        // prendre le cache si svn.revision n'est pas modifie recemment, si les 24h ne sont pas ecoulee, et si on ne force pas
109        if (!$force && $maj[1]!==false && ($lastmodified<$maj[0]) && (time()-$maj[0] < 24*3600))
110                $distant = $maj[1];
111        elseif($timeout)
112                return -1;
113        else {
114                $distant = $maj[1] = ($pattern!==NULL)
115                        ?(($distant = recuperer_page($url))
116                                ?(preg_match($pattern, $distant, $regs)?$regs[1]:'-2')
117                                :'-1')
118                        :strlen(recuperer_page($url, false, true, 0));
119                $maj[0] = time();
120                ecrire_meta('tweaks_maj_auto', serialize($maj_));
121                ecrire_metas();
122        }               
123        return intval($distant);
124}
125
126function plugin_get_infos_maj($p, $timeout=false) {
127        $get_infos = defined('_SPIP20100')?charger_fonction('get_infos','plugins'):'plugin_get_infos';
128        $infos = $get_infos($p);
129        // fichier svn.revision
130        $ok = lire_fichier($svn_rev = _DIR_PLUGINS.$p.'/svn.revision', $svn);
131        $lastmodified = @file_exists($svn_rev)?@filemtime($svn_rev):0;
132        if($ok && preg_match(',<origine>(.+)</origine>,', $svn, $regs)) {
133                $url_origine = str_replace(array(_MAJ_SVN_FILE, _MAJ_SVN_DEBUT), _MAJ_LOG_DEBUT, $regs[1]);
134                // prise en compte du recent demenagement de la Zone...
135                $url_origine = preg_replace(',/_plugins_/_(?:stable|dev|test)_/,','/_plugins_/', $url_origine);
136        } else $url_origine = '';
137        $infos['commit'] = ($ok && preg_match(',<commit>(.+)</commit>,', $svn, $regs))?$regs[1]:'';
138        $rev_local = (strlen($svn) && preg_match(',<revision>(.+)</revision>,', $svn, $regs))
139                ?intval($regs[1]):version_svn_courante(_DIR_PLUGINS.$p);
140        if($infos['svn'] = $rev_local<0) { 
141                // fichier SVN
142                if (lire_fichier(_DIR_PLUGINS.$p.'/.svn/entries', $svn) 
143                                && preg_match(',(?:'.preg_quote(_MAJ_SVN_TRAC).'|'.preg_quote(_MAJ_SVN_DEBUT).')[^\n\r]+,ms', $svn, $regs)) {
144                        $url_origine = str_replace(array(_MAJ_SVN_TRAC,_MAJ_SVN_DEBUT), _MAJ_LOG_DEBUT, $regs[0]);
145                        // prise en compte du recent demenagement de la Zone...
146                        $url_origine = preg_replace(',/_plugins_/_(?:stable|dev|test)_/,','/_plugins_/', $url_origine);
147                }
148                //$infos['zip_trac'] = 'SVN';
149        }
150        $infos['url_origine'] = strlen($url_origine)?$url_origine._MAJ_LOG_FIN:'';
151        $infos['rev_local'] = abs($rev_local);
152        $infos['rev_rss'] = maj_auto_rev_distante($infos['url_origine'], $timeout, ', \[(\d+)\],', $lastmodified);
153        $infos['maj_dispo'] = $infos['rev_rss']>0 && $infos['rev_local']>0 && $infos['rev_rss']>$infos['rev_local'];
154        // fichiers zip
155        $infos['zip_log'] = $infos['zip_trac'] = '';
156        $p2 = preg_match(',^auto/(.*)$,', $p, $regs)?$regs[1]:'';
157        if(strlen($p2)) {
158                // supposition du nom d'archive sur files.spip.org
159                if(maj_auto_rev_distante($f = _MAJ_ZIP.$p2.'.zip', $timeout)) $infos['zip_trac'] = $f;
160                // nom de l'archive recemment installee par chargeur
161                if(lire_fichier(sous_repertoire(_DIR_CACHE, 'chargeur').$p2.'/install.log', $log)
162                                && preg_match(',[\n\r]source: *([^\n\r]+),msi', $log, $regs)
163                                && maj_auto_rev_distante($regs[1], $timeout))
164                        $infos['zip_log'] = $regs[1];
165                // au final on prend le bon
166                if(!$infos['zip_trac']) $infos['zip_trac'] = $infos['zip_log'];
167        }
168        return $infos;
169}
170
171// fonction {$outil}_{$arg}_action() appelee par action/action_rapide.php
172function maj_auto_maj_auto_forcer_action() {
173        // forcer la lecture des revisions distantes de plugins
174        ecrire_meta('tweaks_maj_auto', serialize(array()));
175        ecrire_metas();
176}
177
178?>
Note: See TracBrowser for help on using the repository browser.