FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: DeeSPe am 16 März 2017, 16:29:38

Titel: Best Practices - Git Repo
Beitrag von: DeeSPe am 16 März 2017, 16:29:38
Ich habe zur besseren Verteilung/Aktualisierung meines HOMEMODE Moduls das ganze nun auf Github zur Verfügung gestellt und eine entsprechende controls_HOMEMODE.txt erstellt.
Das Update klappt soweit in FHEM.
Da mir aber generell einiges an Erfahrung mit Versionierung und Verteilung fehlt, habe ich dazu ein paar Fragen.


Wie gesagt, mir fehlt hierzu einfach die Erfahrung.

Vielen Dank im Voraus.

Gruß
Dan
Titel: Antw:Best Practices - Git Repo
Beitrag von: betateilchen am 16 März 2017, 16:56:06
Zitat von: DeeSPe am 16 März 2017, 16:29:38
Das Update klappt soweit in FHEM.

Aber auch nur für Leute, die den Standard-update-Befehl von FHEM verwenden.
Titel: Antw:Best Practices - Git Repo
Beitrag von: DeeSPe am 16 März 2017, 17:24:13
Zitat von: betateilchen am 16 März 2017, 16:56:06
Aber auch nur für Leute, die den Standard-update-Befehl von FHEM verwenden.

Das ist mir klar und habe ich auch darum so formuliert.

Mir geht es aber um die Dinge die ich nicht weiß! 8)

Gruß
Dan
Titel: Antw:Best Practices - Git Repo
Beitrag von: CoolTux am 16 März 2017, 17:34:44
Na dann haben wir doch gleich Mal ein Thema für nachher mein Lieber.



Grüße
Titel: Antw:Best Practices - Git Repo
Beitrag von: DeeSPe am 16 März 2017, 17:35:41
Zitat von: CoolTux am 16 März 2017, 17:34:44
Na dann haben wir doch gleich Mal ein Thema für nachher mein Lieber.



Grüße

Sofern Du mich da beraten kann...! Gerne!

Gruß
Dan
Titel: Antw:Best Practices - Git Repo
Beitrag von: CoolTux am 16 März 2017, 17:37:56
Zitat von: DeeSPe am 16 März 2017, 17:35:41
Sofern Du mich da beraten kann...! Gerne!

Gruß
Dan

Ein bisschen bestimmt. Zu mindest was Versionierung an geht. Windows kenne ich nicht.
Titel: Antw:Best Practices - Git Repo
Beitrag von: Thorsten Pferdekaemper am 16 März 2017, 20:40:16
Hi,
ich bastle am HM485 auch unter Windows rum. Das Ding ist auch im Git.
Ich habe dazu eine Datei fhemupdate.control.hm485:

DIR FHEM/lib
DIR FHEM/lib/HM485
DIR FHEM/lib/HM485/Devices/xml
DIR FHEM/lib/HM485/HM485d

Da stehen also nur die speziellen Verzeichnisse drin.
Mit folgendem Perl-Coding wird die eigentliche controls-Datei gebaut:

#!/usr/bin/perl

# Creates control file for hm485

use IO::File;
use strict;
use warnings;

my @filelist2 = (
  "FHEM/.*.pm",
  "FHEM/lib/HM485/.*.pm",
  "FHEM/lib/HM485/Devices/.*.pm",
  "FHEM/lib/HM485/Devices/xml/.*.xml",
  "FHEM/lib/HM485/HM485d/.*",
  "www/pgm2/.*"
);


# Can't make negative regexp to work, so do it with extra logic
my %skiplist2 = (
# "www/pgm2"  => ".pm\$",
);

# Read in the file timestamps
my %filetime2;
my %filesize2;
my %filedir2;
foreach my $fspec (@filelist2) {
  $fspec =~ m,^(.+)/([^/]+)$,;
  my ($dir,$pattern) = ($1, $2);
  my $tdir = $dir;
  opendir DH, $dir || die("Can't open $dir: $!\n");
  foreach my $file (grep { /$pattern/ && -f "$dir/$_" } readdir(DH)) {
    next if($skiplist2{$tdir} && $file =~ m/$skiplist2{$tdir}/);
    my @st = stat("$dir/$file");
    my @mt = localtime($st[9]);
    $filetime2{"$tdir/$file"} = sprintf "%04d-%02d-%02d_%02d:%02d:%02d",
                $mt[5]+1900, $mt[4]+1, $mt[3], $mt[2], $mt[1], $mt[0];

open(FH, "$dir/$file");
    my $data = join("", <FH>);
    close(FH);

    $filesize2{"$tdir/$file"} = length($data); # $st[7];
    $filedir2{"$tdir/$file"} = $dir;
  }
  closedir(DH);
}

my %controls = (hm485=>0);
foreach my $k (keys %controls) {
  my $fname = "controls_$k.txt";
  $controls{$k} = new IO::File ">$fname" || die "Can't open $fname: $!\n";
  if(open(ADD, "fhemupdate.control.$k")) {
    while(my $l = <ADD>) {
      my $fh = $controls{$k};
      print $fh $l;
    }
    close ADD;
  }
}

my $cnt;
foreach my $f (sort keys %filetime2) {
  my $fn = $f;
  $fn =~ s/.txt$// if($fn =~ m/.pl.txt$/);

  foreach my $k (keys %controls) {
    my $fh = $controls{$k};
    print $fh "UPD $filetime2{$f} $filesize2{$f} $fn\n"
  }

}


foreach my $k (keys %controls) {
  close $controls{$k};
}

Das muss man natürlich nicht so kompliziert machen, aber ich hatte mir das auch irgendwoher kopiert.
Ich glaube, der Teil, der das Windows-Dateilängenproblem löst ist das hier:

    open(FH, "$dir/$file");
    my $data = join("", <FH>);
    close(FH);

    $filesize2{"$tdir/$file"} = length($data); # $st[7];

D.h. jede Datei wird komplett eingelesen. Die Länge ist dann die Länge des eingelesenen Strings. Das klappt dann beim update sowohl auf Windows als auch auf Linux.
Gruß,
   Thorsten

 

Titel: Antw:Best Practices - Git Repo
Beitrag von: DeeSPe am 17 März 2017, 00:54:27
Danke Thorsten für die Bereitstellung Deines Codes.
So etwas in die Richtung hatte ich mir auch schon im Kopf zurecht gelegt.
Werde mir dann auch was zurecht basteln.

Viel wertvoller für mich an Deinen Informationen ist dass Du das per Skript machst und dass das Dateilängen Problem unter Windows wohl offensichtlich bekannt ist. Habe ich mich wohl zu doof angestellt was Passendes dazu per Google zu finden. :o
Dann warte ich einfach mit dem Check-in bis ich wieder an einem *nix sitze...

Gruß
Dan
Titel: Antw:Best Practices - Git Repo
Beitrag von: Sidey am 17 März 2017, 09:01:24
Ich hab das für das Signalduino Repo mit einem pre commit hook gelöst.
Ein Perl Modul, welches die Dateigröße ermittelt liegt da auch :)