Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Werkzeuge (https://www.delphipraxis.net/63-sonstige-werkzeuge/)
-   -   GIT-Submodul version auslesen (https://www.delphipraxis.net/204101-git-submodul-version-auslesen.html)

Sherlock 27. Mai 2020 14:37

AW: GIT-Submodul version auslesen
 
Zitat:

Zitat von Aviator (Beitrag 1465389)
Zitat:

Zitat von Sherlock (Beitrag 1465306)
PowerShell ist doch gerade auf dem Weg das zeitliche zu segnen, sei Avantgardist und lerne bash [...]

Habe ich die Ironie in deinem Beitrag nicht erkannt oder meinst du das ernst? Falls ja, könntest du das, ggf. in einem anderen Thread, erläutern und auch mit vertrauenswürdigen Quellen belegen?

Mir scheint es eher so, dass Microsoft alles auf PowerShell auslegt, zudem aber immer mehr Unterstützung für andere Betriebssysteme bieten will. Siehe .NET Core und PowerShell 6 bzw. PowerShell 7.

@Aviator: Ironie 8-)
Aber irgendwann könnte bash zumindest gleichziehen und dann ist man plötzlich auf zwei Welten zu Hause. Kann ich jedem bisher reinem Windowser nur empfehlen.

Sherlock

himitsu 28. Mai 2020 13:11

AW: GIT-Submodul version auslesen
 
Liste der Anhänge anzeigen (Anzahl: 2)
So, ich hab mir nun erstmal paar Test-Subbranches erstellt.
Und das eigentliche (kaputte) Repository wurde heute nochmal neu aufgebaut. (SVN Develop-Branch jetzt readonly und abschließend neue Übernahme aus SVN nach GIT)

Im Grunde gibt es jetzt nur noch ein "Problemchen" mit
Delphi-Quellcode:
git rev-parse --abbrev-ref HEAD
, nach einem
Delphi-Quellcode:
git checkout
ohne
Delphi-Quellcode:
-b
.
Nach einem Switch/Checkout eines Branches ohne einen lokalen Branch anzulegen.

Jetzt kann ich dann mal anfangen das Batch/Bash-Script zu überarbeiten.
Und im Notfall muss ich mir eben den Wert aus der passenden Zeile im
Delphi-Quellcode:
git submodules | find %branch%
rausparsen.

Code:
Test-SubRepository                                       aus "git submodule"                    was ist es             aus "git rev-parse/describe/show" .......
"

master, aktuell                                          32206ec heads/master                   origin/master          master           32206ec 2020-05-28 11:07:25
master, aktuell mit Änderung im Stash                    32206ec heads/master                   origin/master          master           32206ec 2020-05-28 11:07:25
master, aktuell mit Änderung ohne Commit                 32206ec heads/master                   origin/master **       master           32206ec* 2020-05-28 11:07:25
master, alter Stand, kein Pull und Fetch                 827c575 heads/master                   origin/master          master           827c575 2020-05-28 10:47:50
master, aktuell mit Änderung als Commit                  9ebdf83 heads/master                   origin/master          master           9ebdf83 2020-05-28 11:13:16
master, aktuell mit Änderung als Commit in neuem Branch  1f61fb5 heads/dev/neuer_branch         dev/neuer_branch       dev/neuer_branch 1f61fb5 2020-05-28 11:15:22

master, alter Revision - Reset Soft                     +827c575 heads/master                   origin/master          master           827c575* 2020-05-28 10:47:50
master, alter Revision - Reset Mixed                    +827c575 heads/master                   origin/master          master           827c575* 2020-05-28 10:47:50
master, alter Revision - Reset Hard                     +827c575 heads/master                   origin/master          master           827c575 2020-05-28 10:47:50

branch, checkout                                         8b98ef9 remotes/origin/dev/testbranch  origin/dev/testbranch  HEAD             8b98ef9 2020-05-27 17:41:44
branch, checkout (Switch nach Commit im Master)         +8b98ef9 remotes/origin/dev/testbranch  origin/dev/testbranch  HEAD             8b98ef9 2020-05-27 17:41:44
branch, checkout -b (als neuer Branch)                   8b98ef9 heads/dev/testbranch           dev/testbranch         dev/testbranch   8b98ef9 2020-05-27 17:41:44
[edit]
Alles Einzel-Clone, nicht als SubModul verpackt, da kommt das fast gleiche raus. (MyRepo.ohneSub.zip)
* bei den beiden Checkouts ohne -b nur "HEAD"
* und beim "master, alter Stand, kein Pull und Fetch" liefert
Delphi-Quellcode:
git describe
keinen Hash/Version, obwohl es ja eigentlich das "Selbe" ist, wie "master, aktuell", aber vermutlich nur ein Fehler durch mich

himitsu 29. Mai 2020 16:07

AW: GIT-Submodul version auslesen
 
Moin, :cheer:

im Batch-Script (git-info.cmd) sieht es so aus
Code:
chcp 1252
bash git-info.sh %1
und im Bash-Script (git-info.sh) kommt sowas vor
Code:
gitdir=$1
if [ -n "$gitdir" ]; then gitdir="$(cygpath -u "$gitdir")"; fi
cd "$gitdir"
Nun wird aber bei einem Ümlaut im Pfad gemeckert
Code:
S:\MyRepo\git-info.sh: line 12: cd: $'"S:/MyRepo//master, aktuell mit □\204nderung im Stash"': No such file or directory
Also entweder stimmt irgendwo die Codierung nicht (UTF-8/ANSI)
oder cygpath mag mich micht.


Ach ja, im Großen und Ganzen läuft es und auch wenn ich "aktuell" mit Umlauten nicht in Berührung komme,
wie könnte ich das Problemchen dennoch lösen?


Code:
#!/bin/bash

##### Input :: bash git-info.sh DIR DEST [|branch|version|log]
gitdir=$1
dest=$2
mode=$3
if [ -n "$gitdir" ]; then gitdir="$(cygpath -u "$gitdir")"; fi
if [ -n "$dest" ];  then dest="$(cygpath -u "$dest")"; fi

## hier oder angegebenen Verzeichnis
if [ -n "$gitdir" ]; then
  cd "$gitdir"
fi

if [ "$mode" == "log" ]; then
  # Branch-References # Autor, Relative, CommitDate # Subject ## Message-Body
  ## HEAD -> master, origin/master, origin/HEAD
  ## geo, 3 days ago, 2020-04-17 22:46:58 +0200
  ## Formular 'DB / SQL-Stataments durchsuchen' anpassungen (#194)
  ## ...
  result=$(git show -s --format=format:"%D %n%an, %ar, %ci %n%s %n%n%b" | sed "s#\\n#\\r\\n#g")
else
  ##### Behandlung für Submodul wenn Branch nicht "richtig" auslesbar (z.B. wenn GIT SHOW nur "HEAD" ausgibt)
  if [ -f ".git" ] && [ -d "../.git" ]; then
    dirname=${gitdir##*/}
    dirname=${dirname#(/[(]}
    dirname=${dirname#)/[)]}
    branch=$(git -C .. submodule | grep ".[0-9a-f]+ $dirname \\(.*\\)$")
  fi

  ##### Branch, Version, CommitDatum und CommitLog
  if [ -z "$branch" ]; then branch=$(git show -s --pretty=format:"%D"); fi
  version=$(git describe --tags --always "--dirty=*")
  cdate=$(git show -s --format=format:"%ci")

  ##### Formate konvertieren
  ## BranchName exrahieren :: xxx | aaa -> xxx | aaa -> xxx, yyy, zzz ==> xxx
  ## Hash und Version+Offset trennen :: vvv-i-gxxxxxxxx ==> yyy+i xxxxxxxx
  ## Datum lesbarer :: 2019-11-05T09:27:17+01:00 ==> 2019-11-05 09:27
  branch=$(echo "$branch" | awk '{ print gensub(".* ?-> ?", "", "g") }')
  branch=$(echo "$branch" | awk '{ print gensub("^HEAD, ?", "", "g") }')
  branch=$(echo "$branch" | awk '{ print gensub(" ?,.*$", "\\1", "g") }')
  version=$(echo "$version" | awk '{ print gensub("-([0-9]+)-g([0-9a-f]{8})", "+\\1 \\2", "g") }')
  cdate=$(echo "$cdate" | awk '{ print gensub("([0-9]{4}-[0-9]{2}-[0-9]{2})[T ]([0-9]{2}:[0-9]{2}):[0-9]{2}([ ]?[+-][0-9]{2}:?[0-9]{2})?", "\\1 \\2", "g") }')

  ##### Zusatzinfo über geänderte oder neue Dateien (nicht commited)
  #if [ $(git diff --stat) != '' ]; then dirty="*"; fi  # modified files exists
  #if [ -z $(git status -s) ]; then dirty="**"; fi      # modified or untracked files exists

  ##### Ausgabe
  if [ "$mode" == "branch" ]; then
    result="$branch"
  elif [ "$mode" == "version" ]; then
    if [[ "$version" =~ "+" ]]; then
      # 19.10.02+37 7c8c3e76*
      result="$version"
    else
      # 7c8c3e76* 2019-11-05 09:27 
      result="$version $cdate"
    fi
  else
    # master 7c8c3e76 2019-11-05 09:27                 (ohne Version-Tag)
    # master 19.10.02+37 7c8c3e76* 2019-11-05 09:27    (Version-Tag vorhanden)
    result="$branch $version $cdate"
  fi
fi

#clear
echo $result
if [ -n "$dest" ]; then
  echo -n "$result" > $dest
fi
Bash kann einem aber schon ein bissl abschrecken und für alles gibt es tausende Wege, wo man die Vorschläge/Tutorials im Internet oft nur schwer versteht.
Und die Hilfe kann einen auch manchmal erschrecken, so dass man gleich wegrennen will.
Zitat:

Bash supports a surprising number of string manipulation operations. Unfortunately, these tools lack a unified focus. Some are a subset of parameter substitution, and others fall under the functionality of the UNIX expr command. This results in inconsistent command syntax and overlap of functionality, not to mention confusion.
aus https://www.tldp.org/LDP/abs/html/st...ipulation.html
Klingt schon ein bisschen nach: bash ist bissl davon und ein bissl davon, aber von nichts was richtiges. :duck:
Ich will jetzt aber kein bashing betreiben. :lol:

Aviator 29. Mai 2020 18:41

AW: GIT-Submodul version auslesen
 
Probier mal die Language beim Start des Scripts auf Deutsch bzw. UTF-8 umzustellen.

Code:
export LANG="de_DE.UTF-8"
export LC_ALL="de_DE.UTF-8"

himitsu 8. Jun 2020 14:40

AW: GIT-Submodul version auslesen
 
Schade, dann wird es mit Umlauten wohl nichts mehr.
Na gut, Hauptsachte der Rest läuft jetzt erstmal. :thumb:

Scheinbar hat cygpath ein Problemchen.
Zumindestens die Fehlermeldung stimmt jetzt (da steht nun richtig "Ä"),
nur übersetzt wird der Pfad falsch, aber er wird übersetzt, denn die \ werden zu /.
aus
Delphi-Quellcode:
S:\Test\Täst

wird
Delphi-Quellcode:
S:/Testo/Täst

anstatt
Delphi-Quellcode:
/s/Test/Täst


Die armen Russen, Chinesen und Franzosen muss das doch ankotzen.

Minimalbeispiel:
a.cmd
Code:
chcp 1252
cd /d "%~dp0"
md "Täst"
bash a.sh "%~dp0Täst"
pause
a.sh
Code:
#!/bin/bash
export LANG="de_DE.UTF-8"
export LC_ALL="de_DE.UTF-8"

dir=$1
echo "IN: $dir"
dir="$(cygpath -u "$dir")"
echo "OUT: $dir"
cd "$dir"
CodePage 1252 = ANSI statt OEM, damit das Ä nicht OEM-codiert gespeichert werden muß, aber im Bash kommt es scheinbar richtig als UTF-8 an, was Batch/CMD hier als Unicode ans BASH übergeben hat.

Assarbad 8. Jun 2020 21:48

AW: GIT-Submodul version auslesen
 
Öhm, ich halte mich mal mit Kritik gediegen zurück. Scheinst ja noch feucht hinter den Ohren zu sein in Sachen Bash :P

Zitat:

Zitat von himitsu (Beitrag 1465845)
Bash kann einem aber schon ein bissl abschrecken und für alles gibt es tausende Wege, wo man die Vorschläge/Tutorials im Internet oft nur schwer versteht.
Und die Hilfe kann einen auch manchmal erschrecken, so dass man gleich wegrennen will.
Zitat:

Bash supports a surprising number of string manipulation operations. Unfortunately, these tools lack a unified focus. Some are a subset of parameter substitution, and others fall under the functionality of the UNIX expr command. This results in inconsistent command syntax and overlap of functionality, not to mention confusion.
aus https://www.tldp.org/LDP/abs/html/st...ipulation.html
Klingt schon ein bisschen nach: bash ist bissl davon und ein bissl davon, aber von nichts was richtiges. :duck:
Ich will jetzt aber kein bashing betreiben. :lol:

Es mag Inkonsistenzen bei Bash geben, aber einiges davon ist auch einfach der Tatsache geschuldet, daß es einige Dinge aus dem POSIX-Standard erbt, andere aber sinnvoll selbst implementiert. Bspw. würde ich immer empfehlen [[ ]] für Bedingungen in Bash zu benutzen, weil es einfach weniger Probleme macht in diversen Grenzfällen (bspw. wenn eine Variable zu einem leeren String expandiert usw.).

Im Gegensatz zu diversen Werkzeugen wie cut oder tr oder cat, soll eine Shell ja auch mehr können.

Außerdem hat Bash dann bspw. "let" für arithmetische Zuweisungen und $(()) sowie (())-Bedingungen. Da läßt sich auch einiges mit anstellen wenn auch leider nicht mit Gleitkommazahlen (die kann man wiederum mit expr verarbeiten).

$() sollte man den Backticks vorziehen, weil Backticks zum Alptraum werden, wenn man sie schachtelt. Bei $() ist dies kein Problem.

Alles in allem würde ich dir empfehlen dir das Bash Cookbook - welches frei als PDF verfügbar ist (und ja, legal!) - durchzuarbeiten.

Traditionell werden Variablen in Großbuchstaben gehalten um sie bspw. von Befehlen zu unterscheiden, aber ist Geschmackssache. Hat aber Vorteile sich an etablierte Konventionen zu halten.

Da hier:

Code:
#!/bin/bash

##### Input :: bash git-info.sh DIR DEST [|branch|version|log]
gitdir=$1
dest=$2
mode=$3
if [ -n "$gitdir" ]; then gitdir="$(cygpath -u "$gitdir")"; fi
if [ -n "$dest" ];  then dest="$(cygpath -u "$dest")"; fi
... wäre so besser:

Code:
#!/usr/bin/env bash

##### Input :: bash git-info.sh DIR DEST [|branch|version|log]
gitdir=$1
dest=$2
mode=$3
[[ -z "$gitdir" ]] || gitdir="$(cygpath -u "$gitdir")"
[[ -z "$dest" ]] || dest="$(cygpath -u "$dest")"
... oder halt für die letzten beiden Zeilen:

Code:
[[ -n "$gitdir" ]] && gitdir="$(cygpath -u "$gitdir")"
[[ -n "$dest" ]] && dest="$(cygpath -u "$dest")"
... und den drei Variablen könntest du jeweils auch Standardwerte zuordnen.

Kurzer Exkurs: die Hashbang oben ist die portabelste die du bekommen kannst. Funktioniert auf Linux, macOS, BSDs, AIX usw. gleichermaßen, weil env in all diesem Betriebssystemen am selben Ort liegt. Man kann sich also auf den Pfad zu env verlassen und mit dessen Hilfe den zu Bash ermitteln. Für Skripte die als Superuser laufen, würde ich dennoch den Pfad hartkodieren um möglichen Rechteausweitungen vorzugreifen.

Bspw. "log" für den dritten:

Code:
mode=${3:-log}
Und wenn du ein frisches Skript beginnst, bietet sich

Code:
set -e
... an. Damit werden alle ungeprüften Rückgabewerte die nicht 0 sind, zum Beenden des Skripts führen. Fördert manchmal die Disziplin.

himitsu 10. Jun 2020 14:04

AW: GIT-Submodul version auslesen
 
Eine Konstellation hab ich noch entdeckt, wo es nicht funktioniert. :cry:

Im ToroiseGit ein Commit in einen neuen noch nicht existierenden Branch.
Bei allem Anderen steht im Log was für einem Consolen-Befehl das Ausgeführte entspricht, aber hier natürlich nicht.

Ob es nach einem Push ginge, hatte ich vergessen zu prüfen, aber sollte ja eigentlich keinen Unterschied machen.
Hatte den Branch schon wieder gewechselt und ein erneuter Checkout auf den Branch, da ging es dann. (egal ob auf branch oder origin/branch)



Das mit dem
Delphi-Quellcode:
#!/bin/bash
steht überall im Internet so, da denkt man doch das sei richtig so. .stupid:
Gut, hier wird es erstmal immer nur im Windows aufgerufen, vom FinalBuilder aus, weil dessen Git-Integration total unbrauchbar ist. (SVN war ja noch benutzbar)

Was mit
Delphi-Quellcode:
mode=${3:-log}
ist, hab ich nicht so ganz verstanden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:26 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz