BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Auf dem Weg zu einer Versionsverwaltung für LO Basic-Projekte

Alles zur Programmierung im LibreOffice.
Antworten
aladin
Beiträge: 37
Registriert: Di 30. Jul 2019, 15:49
Kontaktdaten:

Auf dem Weg zu einer Versionsverwaltung für LO Basic-Projekte

Beitrag von aladin » So 22. Sep 2019, 22:18

Hallo.

Ich weiß nicht, ob es da schon Lösungen / Ansätze zu o.g. Thema gibt, aber ich habe einfach mal angefangen.
Zur Motivation:
AOO/LO Basic ist nun nicht die Sprache, mit der ich heutzutage große Projekte umsetzen würde, aber ich habe vor 18 Jahren unter SO 5.2 genau mit Starbasic angefangen und das Projekt ist in dieser Zeit so umfangreich geworden, dass ich es nicht in einer anderen Sprache neu schreiben möchte. Erfreulich auch, dass es all die Wechsel über OOo 1.1 zu AOO und jetzt zu LO irgendwie überstanden hat. Also muss man sagen, egal in welcher Sprache ein Programm geschrieben wird, das Relevante ist, dass es das tut, was es tun soll... Was ich aber bei der Entwicklung immer ein wenig hinderlich fand, ist dass man da all die netten Konsolen-Tools wie diff, grep, sed nicht einsetzen konnte. Und eine Versionsverwaltung wie git, wäre auch nicht schlecht.
Damit man diese Sachen nutzen kann, müssen die Dateien entpackt werden.
Da die Dateien content.xml, meta.xml, settings.xml und styles.xml nicht formatiert sind, habe ich diese mit "xmllint -format" noch formatiert.
Damit sollte ein diff auch sinnvoller damit arbeiten.

Hier mal die shell-Scripte zum entpacken und packen:

Code: Alles auswählen

#!/bin/bash
# Script zum Entpacken

TIMESTAMP=`date +%Y%m%d_%H%M%S`
EXTRACT_DIR="./_extract_${TIMESTAMP}"

find . -path "${EXTRACT_DIR}" -prune -o -type d -exec mkdir -pv ${EXTRACT_DIR}/{} ';'

for f in ` find . -path "${EXTRACT_DIR}" -prune -o -type f -print `
do

DESTPATH=${EXTRACT_DIR}` echo ${f} | sed -e 's/^\.//g'`

  case ` file ${f} | cut -d: -f2 | sed -e 's/^[[:space:]]*//' ` in
    "OpenDocument Text" | "OpenDocument Text Template" | "OpenDocument Spreadsheet")
      unzip -qq ${f} -d ${DESTPATH}

      for g in ` find ${DESTPATH} -type f -name "content.xml" -o -name "meta.xml" -o -name "settings.xml" -o -name "styles.xml" `
      do
        mv ${g} "${g}_"
        xmllint --format "${g}_" > ${g}
        rm "${g}_"
      done
      ;;
    *)
      cp ${f} ${DESTPATH}
      ;;
  esac
done

Code: Alles auswählen

#!/bin/bash
# Script zum Packen

DEST_DIR="../TEST"

find . \( -name "*.odt" -o -name "*.ott" -o -name "*.ods" \) -prune -o -type d -exec mkdir -pv ${DEST_DIR}/{} ';'

for f in ` find . \( -name "*.odt" -o -name "*.ott" -o -name "*.ods" \) -prune -o -type f -print `
do
  DESTPATH=${DEST_DIR}` echo ${f} | sed -e 's/^\.//g'`
  cp ${f} ${DESTPATH}
done


for f in ` find . \( -name "*.odt" -o -name "*.ott" -o -name "*.ods" \) -a -type d -print `
do
  DESTPATH=${DEST_DIR}` echo ${f} | sed -e 's/^\.//g'`
  pushd ${f}
  zip -0X "temp.zip" "mimetype"
  zip -Xr9 "temp.zip" * --exclude "temp.zip" --exclude "mimetype"
  popd
  mv "${f}/temp.zip" ${DESTPATH}
done
Zur Erklärung, es werden auch andere Dateien aus dem Projektordner kopiert.
Da ich bei mir nur *.odt, *.ott und *.ods-Dateien habe, habe ich erst mal nur diese berücksichtigt.

Als nächstes werde ich mich mal mit Git auseinandersetzen und schauen, ob das so funktioniert, wie ich mir das vorstelle.

Kommentare und Verbesserungsvorschläge sind erwünscht.

Gruß
Heiko
Zuletzt geändert von aladin am Mo 25. Nov 2019, 21:24, insgesamt 2-mal geändert.

aladin
Beiträge: 37
Registriert: Di 30. Jul 2019, 15:49
Kontaktdaten:

Re: Auf dem Weg zu einer Versionsverwaltung für LO Basic-Projekte

Beitrag von aladin » Di 24. Sep 2019, 12:57

Nachtrag:
Die Versionsverwaltung mit git funktioniert nun bei mir sehr gut.
Hier läuft eh schon Redmine für die Projektsteuerung und da lässt sich gut ein git-Repository einbinden.
Jetzt kann man schön die Unterschiede, z.B. in in Dokumenten eingebetteten Basic-Code, zwischen den einzelnen commits verfolgen.

Das Script zum Aktualisieren des git-Ordners, habe ich noch etwas angepasst.

Code: Alles auswählen

#!/bin/bash

TIMESTAMP=`date +%Y%m%d_%H%M%S`
EXTRACT_DIR="./.git_repo"

find -L . \( -path "${EXTRACT_DIR}" -o -path "./database/temp" -o -path "./TEST" \) -prune -o -type d -exec mkdir -pv ${EXTRACT_DIR}/{} ';'

for f in ` find -L . \( -path "${EXTRACT_DIR}" -o -path "./database/temp" -o -path "./TEST" \) -prune -o -type f -print `
do

DESTPATH=${EXTRACT_DIR}` echo ${f} | sed -e 's/^\.//g'`

  case ` file ${f} | cut -d: -f2 | sed -e 's/^[[:space:]]*//' ` in
    "OpenDocument Text" | "OpenDocument Text Template" | "OpenDocument Spreadsheet")
      unzip -o -qq ${f} -d ${DESTPATH}

      for g in ` find ${DESTPATH} -type f -name "content.xml" -o -name "meta.xml" -o -name "settings.xml" -o -name "styles.xml" `
      do
        mv ${g} "${g}_"
        xmllint --format "${g}_" > ${g}
        rm "${g}_"
      done

      ;;
    *)
      cp ${f} ${DESTPATH}
      ;;
  esac

done

pushd ${EXTRACT_DIR}
  git add *
  git commit
  git push origin master
popd
Ab jetzt lassen sich hoffentlich Fehler, die man einprogrammiert hat, leichter wiederfinden... 8-)

Vielleicht braucht es einer.

Viel Spaß

aladin
Beiträge: 37
Registriert: Di 30. Jul 2019, 15:49
Kontaktdaten:

Re: Auf dem Weg zu einer Versionsverwaltung für LO Basic-Projekte

Beitrag von aladin » Mo 25. Nov 2019, 21:32

Und mal 2 Scripte um den Schreibschutz in ODF-Dokumenten zu manipulieren...

set-readonly.sh

Code: Alles auswählen

#!/bin/bash
if [ "$#" -ne "1" ] || [ "$1" = "-h" -o "$1" = "-H" -o -z "${1#\-[hH][eE][lL][pP]}" ]; then
        cat << EOF
Usage:
     ${0} [Pfad zur Datei dessen Schreibschutz gesetzt werden soll]
EOF
    exit 0
fi

TIMESTAMP=`date +%Y%m%d_%H%M%S`
DESTPATH="/tmp/${TIMESTAMP}/${1}"

mkdir -pv ${DESTPATH}

unzip -o -qq ${1} -d ${DESTPATH}

pushd ${DESTPATH}

mv "settings.xml" "settings.xml_"

xmllint --format "settings.xml_" > "settings.xml"

rm "settings.xml_"

sed 's/"LoadReadonly" config:type="boolean">false</"LoadReadonly" config:type="boolean">true</g' "settings.xml" -i

zip -0X "temp.zip" "mimetype"
zip -Xr9 "temp.zip" * --exclude "temp.zip" --exclude "mimetype"

popd

cp "${DESTPATH}/temp.zip" "${1}"
rm -R "/tmp/${TIMESTAMP}"
set-readwrite.sh

Code: Alles auswählen

#!/bin/bash
if [ "$#" -ne "1" ] || [ "$1" = "-h" -o "$1" = "-H" -o -z "${1#\-[hH][eE][lL][pP]}" ]; then
        cat << EOF
Usage:
     ${0} [Pfad zur Datei dessen Schreibschutz entfernt werden soll]
EOF
    exit 0
fi

TIMESTAMP=`date +%Y%m%d_%H%M%S`
DESTPATH="/tmp/${TIMESTAMP}/${1}"

mkdir -pv ${DESTPATH}

unzip -o -qq ${1} -d ${DESTPATH}

pushd ${DESTPATH}

mv "settings.xml" "settings.xml_"

xmllint --format "settings.xml_" > "settings.xml"

rm "settings.xml_"

sed 's/"LoadReadonly" config:type="boolean">true</"LoadReadonly" config:type="boolean">false</g' "settings.xml" -i

zip -0X "temp.zip" "mimetype"
zip -Xr9 "temp.zip" * --exclude "temp.zip" --exclude "mimetype"

popd

cp "${DESTPATH}/temp.zip" "${1}"
rm -R "/tmp/${TIMESTAMP}"
Vielleicht kann es ja jemand gebrauchen...

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten