[98_version.pm] patch für optionalen parameter "noheader"

Begonnen von betateilchen, 29 Januar 2016, 13:31:35

Vorheriges Thema - Nächstes Thema

betateilchen

Hallo Markus,

ich hätte da einen kleinen Vorschlag zum version-Befehl, mit dem man durch Angabe von "noheader" beim Aufruf die Ausgabe der Überschrift samt der ihr folgenden Leerzeile unterdrücken kann. Damit kann man eine einfach zu parsende Rückgabe als Ergebnis von CommandVersion() bekommen.


Index: 98_version.pm
===================================================================
--- 98_version.pm (Revision 10655)
+++ 98_version.pm (Arbeitskopie)
@@ -16,6 +16,8 @@
{
   my ($cl, $param) = @_;

+  my $noheader = ($param =~ s/ *noheader//);
+
   my @ret;
   my $max = 0;
   my $modpath = (exists($attr{global}{modpath}) ? $attr{global}{modpath} : "");
@@ -55,7 +57,9 @@
   @ret = map {/\$Id\: (\S+) (\S+) (.+?) \$/ ? sprintf("%-".$max."s %5d %s",$1,$2,$3) : $_} @ret;
   @ret = sort {version_sortModules($a, $b)} grep {(defined($param) ? $_ =~ /$param/ : 1)} @ret;
   return "no loaded modules found that match: $param" if($param && !@ret);
-  return sprintf("%-".$max."s %s","File","Rev   Last Change\n\n").
+
+  my $header = $noheader ? "" : sprintf("%-".$max."s %s","File","Rev   Last Change\n\n");
+  return $header.
          trim(join("\n",  grep (($_ =~ /^fhem.pl|\d\d_/), @ret))."\n\n".
               join("\n",  grep (($_ !~ /^fhem.pl|\d\d_/), @ret))
              );


Wenn das so eingebaut wird, kommt mein nächster Patch (für 98_fheminfo.pm), mit dem man folgende Ausgabe bekommt:

(http://up.picr.de/24426358so.png)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Markus Bloch

Hallo Udo,

hab deinen Patch leicht verändert eingecheckt. Der optionale Parameter "noheader" darf nur am Ende stehen. In deinem Fall kann man nun folgenden Aufruf durchführen:

fhem> version fhem.pl noheader
fhem.pl 10639 2016-01-26 07:27:14Z rudolfkoenig
fhem>


Hab das ganze samt Doku-Ergänzung eingecheckt.

Wollte dich eh schonmal fragen, wie es mit fheminfo ausschaut? Wegen dem Datenbankformat und der Änderung zur Aufnahme der einzelnen Models pro Modul.

Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

betateilchen

Hallo Markus,

wenn Du mal Zeit hast: könnte man die Ausgabe von version dahingehend erweitern, dass man auch die von FHEMWEB geladenen js-Dateien mit anzeigt, die eine $Id$ besitzen? Und bitte nur die mit einer Id.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Markus Bloch

Daran hatte ich auch schon gedacht. Werde ich bei Gelegenheit angehen.

Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

betateilchen

#4
Bin da draufgekommen, weil die heute morgen in SVN eingecheckte Version von fhemweb.js kaputt ist  und ich lange gebraucht habe, um festzustellen, woran es lag 8)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Markus Bloch

Hallo Udo,

ich habe mir mal @FW_fhemwebjs angeschaut. Es enthält eine statische Liste aller Dateien die auf fhemweb*.js passen. Also:


$VAR1 = [
          'fhemweb.js',
          'fhemweb_colorpicker.js',
          'fhemweb_fbcalllist.js',
          'fhemweb_knob.js',
          'fhemweb_readingsGroup.js',
          'fhemweb_readingsHistory.js',
          'fhemweb_sortable.js',
          'fhemweb_uzsu.js',
          'fhemweb_weekprofile.js'
        ];


Im Rahmen von der Funktion FW_answerCall() wird %jsNeg und @jsList erzeugt basierend auf @FW_fhemwebjs, sowie dem Attribut JavaScripts. Damit wird die tatsächlich verwendete JS-Liste bei jeder HTTP-Antwort frisch erzeugt und steht so nicht global zur Verfügung um bspw. in version darauf zugreifen zu können. Man kann also nicht die tatsächlich verwendeten JS-Dateien in version ermitteln, weswegen ich das einlesen aller *.js-Dateien in "$FW_dir/pgm2" bevorzuge um alle JS-Dateien zu berücksichtigen die $Id$ gesetzt haben.

Ein beispielhaftes "version .js" sieht bei mir damit so aus:

File                       Rev   Last Change

fhemweb.js                 13392 2017-02-11 18:32:13Z rudolfkoenig
fhemweb_colorpicker.js     13107 2017-01-16 13:14:31Z justme1968
fhemweb_fbcalllist.js       9346 2015-10-02 19:30:04Z markusbloch
fhemweb_readingsGroup.js   13107 2017-01-16 13:14:31Z justme1968
fhemweb_readingsHistory.js 13107 2017-01-16 13:14:31Z justme1968
fhemweb_sortable.js        11261 2016-04-17 09:36:23Z markusbloch
fhemweb_uzsu.js            13107 2017-01-16 13:14:31Z justme1968
fhemweb_weekprofile.js     13277 2017-01-29 18:38:12Z Risiko
sorttable.js               13106 2017-01-16 13:12:53Z justme1968


Würde man alle JS-Dateien anzeigen (auch die, ohne $Id$) so sieht die Ausgabe für den selben Befehl folgendermaßen aus:

File                       Rev   Last Change

No Id found for alarm.js
No Id found for console.js
No Id found for dashboard.js
No Id found for fhemdoc_modular.js
fhemweb.js                 13392 2017-02-11 18:32:13Z rudolfkoenig
fhemweb_colorpicker.js     13107 2017-01-16 13:14:31Z justme1968
fhemweb_fbcalllist.js       9346 2015-10-02 19:30:04Z markusbloch
No Id found for fhemweb_knob.js
fhemweb_readingsGroup.js   13107 2017-01-16 13:14:31Z justme1968
fhemweb_readingsHistory.js 13107 2017-01-16 13:14:31Z justme1968
fhemweb_sortable.js        11261 2016-04-17 09:36:23Z markusbloch
fhemweb_uzsu.js            13107 2017-01-16 13:14:31Z justme1968
fhemweb_weekprofile.js     13277 2017-01-29 18:38:12Z Risiko
No Id found for floorplan_click.js
No Id found for floorplan_drag.js
No Id found for ios6.js
No Id found for jquery-ui.min.js
No Id found for jquery.knob.min.js
No Id found for jquery.min.js
No Id found for jquery.vticker.min.js
No Id found for RSS.js
sorttable.js               13106 2017-01-16 13:12:53Z justme1968
No Id found for svg.js
No Id found for zwave_neighborlist.js


Da das mir durchaus zu viel ist, bin ich ebenfalls für das ausblenden von JS-Dateien ohne $Id$.

Was meinst Du?

Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

betateilchen

Gefällt mir nicht. Da wird viel zuviel angezeigt, was im Fehlerfall nicht intererssiert.

In 55_InfoPanel.pm habe ich etwas ähnliches gebaut, nämlich dass für das InfoPanel selbst bestimmte .js Dateien eingebunden werden, wenn sie in der FHEMWEB Instanz vorhanden sind.


sub btIP_getScript {
  my ($name) = shift;
  return "" if AttrVal($name,'noscript',0);

  my $scripts= "";
  my $jsTemplate = '<script type="text/javascript" src="%s"></script>';
  if(defined($data{FWEXT})) {
    foreach my $k (sort keys %{$data{FWEXT}}) {
      my $h = $data{FWEXT}{$k};
      next if($h !~ m/HASH/ || !$h->{SCRIPT});
      my $script = $h->{SCRIPT};
         $script = ($script =~ m,^/,) ? "$FW_ME$script" : "$FW_ME/pgm2/$script" unless ($script =~ m,^http,);
      $scripts .= sprintf($jsTemplate, $script);
    }
  }
#  $scripts .= sprintf($jsTemplate,"/fhem/pgm2/cordova-2.3.0.js");
#  $scripts .= sprintf($jsTemplate,"/fhem/pgm2/webviewcontrol.js");
  $scripts .= sprintf($jsTemplate,"/fhem/pgm2/fhemweb.js");
  $scripts =~ s/script>/script>\n/g;
  return $scripts;
}
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Ich habe meine .js Dateien mit "// $Id:$" versehen.

Weiterhin habe ich in fhemweb.js die Variable version entfernt, samt Ausgabe, da sie mich mit fhemweb_uzsu.js verwirrt hat: andre hat version auch in seinen .js Dateien definiert, und die Letzte hat gewonnen.

Ich bin dafuer, dass der FHEM-Befehl version auch die .js Dateien mit $Id anzeigt (via Option?), das ist aber eine Meinung und kein Befehl :)

betateilchen

Zitat von: rudolfkoenig am 02 März 2017, 10:50:48
Ich bin dafuer, dass der FHEM-Befehl version auch die .js Dateien mit $Id anzeigt

Da sind wir uns ja einig. Aber bitte nur die, die auch in Verwendung sind.
Es werden schließlich auch nur die Module angezeigt, die geladen sind.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

ZitatAber bitte nur die, die auch in Verwendung sind.
Das ist leider nicht trivial. Selbst wenn FHEMWEB die "selbst eingebauten" .js per Variable zur Verfuegung stellt, koennen andere Module (wie z.Bsp. ZWDongle) was nachladen.

Vorschlag: wen man "version" im Browser eintippt, dann wird version mit einer Liste von .js Dateien aufgerufen, und diese werden zusaetzlich nach $Id durchgesucht. Nachteil: FTUI oder vgl. wird damit nicht abgedeckt.


justme1968

#10
die version variable sollte eigentlich jeweils file lokal sein. seltsam... arg... zu viel c gedacht. geht mit js natürlich so nicht. alles was nicht local in einer funktion ist wird global...

ich ändere es auch auf //.

die // variante kommt nur eider nicht mehr per js code an die version sondern nur noch per parsen des files. damit kann man alte versionen im browser cache nicht mehr identifizieren.

vorschlag zur anzeige: wie wäre es wenn man tatsächlich im jeweils aktuellen browser fenster nachfragt und die version der tatsächlich per loadscript geladenen js files dort abholt? d.h. das version kommando müsste über $hash->{CL} mit fhemweb.js kommunizieren. das sollte aber möglich sein.

ftui ist sowieso außen vor da man dort das version kommando nicht verwenden kann und auch überhaupt kein fhemweb js code geladen wird.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig

Zitatvorschlag zur anzeige:
Ist ungefaehr das, was ich vorgeschlagen habe, nur andersherum. Mein Vorschlag waere in version.pm einfacher zu implementieren, und ist ungefaehrlicher, wenn deine Aussage zu FTUI stimmt, da FTUI auch ueber FHEMWEB mit FHEM kommuniziert.

rudolfkoenig

Zitatdamit kann man alte versionen im browser cache nicht mehr identifizieren.
Das ist ein valider Punkt, und spricht dafuer, dass man $Id:$ irgendwo sammelt.

Nochn Vorschlag: es gibt ein "var FW_version = {};" in fhemweb.js, und da schreibt jedes Modul beim Laden sich rein mit
FW_version["fhemweb.js"] = "$Id:$";

Wenn man in FHEMWEB "version" eingibt, dann wird das zusaetzlich ausgegeben. version.pm muss nicht modifiziert werden. Alle anderen Frontends muessen diese Funktionalitaet selbst implementieren.

justme1968

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!