Laden...

Sourcecode Änderungen feststellen, ohne Kommentare zu berücksichtigen

Erstellt von rollerfreak2 vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.627 Views
rollerfreak2 Themenstarter:in
916 Beiträge seit 2008
vor 12 Jahren
Sourcecode Änderungen feststellen, ohne Kommentare zu berücksichtigen

Hallo zusammen,

ich habe folgendes Problem. Ich möchte feststellen ob sich an einem File der sourcecode geändert hat, daher wenn sich kommentare oder xml dokumentation ändert, dann hat sich ja der Sourcecode nicht geändert, das heißt dies soll ignoriert werden.

Eventuell gibt es ein Tool/plugin/dll mit dem man Sourcecode in tokens zerlegen kann um dann die Tokens zu vergleichen. Händisch wollte ich da nicht ran, weil das doch ein wenig viel Aufwand ist alles selber zu parsen...

Again what learned...

E
180 Beiträge seit 2010
vor 12 Jahren
hi

redest du von einer art versionskontrollsystem? dann wäre SVN bzw. Git eine gute variante dafür, allerdings ist das ignorieren von xml müsste man händisch machen, wenn die dateien mit diff vergliechen werden im interaktiven Modus. Würd dir empfehlen mal bei Git ein bisschen zu probieren, vielleicht löst es ja bereits dein Problem 😃

GIT
Tortoise für Git (Kontextmenü hilfe statt konsolenkonfiguration)

Gruß

rollerfreak2 Themenstarter:in
916 Beiträge seit 2008
vor 12 Jahren

Mit source Kontrolle hat das nix zu tun, daher die Files stehen bereits unter einem Source Kontroll System. Ich will lediglich heraus finden ob sich von einer Version zu einer anderen etwas am source Code geändert hat. Daher sind xml und Komentare etc. nicht zu beachten.

Again what learned...

E
180 Beiträge seit 2010
vor 12 Jahren
hm

hm ein nebeneffekt von VCS Systemen ist doch aber verschiedene Zweige mit einander vergleichen zu können, und dabei wird dir genau dies aufgelistet: geänderte Dateien samt zeile und inhalt?

Beispiel z.b in Git

rollerfreak2 Themenstarter:in
916 Beiträge seit 2008
vor 12 Jahren

Aber dann muss ich wieder per Hand alle Differenzen auswerten, und schauen ob das auch "SourceCode" beteiligt ist. Das wird ziemlich schwierig, daher wenn zum Beispiel jemand nur einen Buchstaben in einer Xml doku zu ner Methode geändert hat, dann bekommt man nur die Differenz des einen Buchstabens und "mann" muss dann raus finden in welchem Kontext sich diese Änderung befindet.

Ich dachte eher an sowas wie den Code in eine Zwischensprache zu übersetzten, dies mit beiden Files machen, und wenn sich nix am SourceCode geändert hat, dann müssten auch die beiden Zwischensprachen "identisch" sein. Ich denke sowas muss es doch schon geben, schließlich macht der Compiler etwa das selbe beim Übersetzen, den Code in eine IL zu wandeln, oder z.b. CloneDetective beim detektieren der CodeClone.

Das Problem daran ist, das es nicht auf der .NET Ebene arbeiten darf, daher ich habe z.b. nur ein File, zum bauen jedoch braucht dieses File mehrere andere. Diese sind zur Ermittlung der Sourcecodeänderung aber nicht verfügbar. Es muss rein auf "tokens" basieren.

Again what learned...

1.820 Beiträge seit 2005
vor 12 Jahren

Hallo!

Wenn man z.B. lokale Tools für die Versionskontrolle installiert, sollten diese in der Regel bereits im Dateisystem anzeigen, ob sich was an einer Datei geändert hat (das funktioniert auch bei der Suche).
EDIT: Hab' gerade gemerkt, dass dies ja genau dein Einwand war.

Nur einzelne Bereiche anhand einer "Zwischensprache zu vergleichen", wird wohl kaum möglich sein (außer auf Assembly-Ebene).

Soll die Änderung den lokal oder zentral festgestellt werden?

Nobody is perfect. I'm sad, i'm not nobody 🙁

175 Beiträge seit 2010
vor 12 Jahren

Das Problem daran ist, das es nicht auf der .NET Ebene arbeiten darf, daher ich habe z.b. nur ein File, zum bauen jedoch braucht dieses File mehrere andere.

Vielleicht hilft ja das hier:

http://www.codeproject.com/KB/cs/UncommCS.aspx
oder
http://www.fryan0911.com/2010/03/remove-comments-in-your-ccc-codes-using.html

bye,
Michael

P.S.: Mein Chef sagte vor einigen Jahren mal zu mir, ich solle nicht so viele Kommentare in den Source Code schreiben - Zitat: "Kommentare hindern den Lesefluss".... 😉

Debuggers don't remove Bugs, they only show them in Slow-Motion.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo rollerfreak2,

eine Routine zu schreiben, die (XML-)Kommentare (und evtl. auch Leerzeilen/WhiteSpaces) aus einer Quellcode-Datei entfernt, sollte in wenigen Zeilen möglich sein. Im Grund muss man ja nur nach /* bzw. // (oder ///) suchen und dabei beachten, dass man Zeichen innerhalb von Strings ignoriert. Die Routine wendet man auf beide zu vergleichende Stände an und vergleicht das Ergebnis.

herbivore

rollerfreak2 Themenstarter:in
916 Beiträge seit 2008
vor 12 Jahren

Ja das wäre eine Idee. Wenn man nun aber einen Variablenname Ändert hat sich am Sourcecode ja eigentlich auch nix geändert, zumindest am resultierenden Assembly. Deswegen suchte ich nach einer Art sourcecode Token Generator bei dem die Kommentare, Variablenname etc. egal sind. Aber soetwas scheint es nicht zu geben, oder ich habs nur noch nicht gefunden.

Die einfachere Variante mit den Kommentaren ist zwar leicht umsetztbar (Danke für den Lösungsvorschlag) aber leider nicht wirklich allgemein gültig für mein Problem. Hab wahrscheinlich vergessen zu erwähnen das dass resultierende Kompilat entscheidend ist.

Again what learned...

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo rollerfreak2,

Aber soetwas scheint es nicht zu geben ...

das denke ich auch.

Wenn man nun aber einen Variablenname Ändert hat sich am Sourcecode ja eigentlich auch nix geändert, zumindest am resultierenden Assembly.

Wenn du so anfängst, wirds echt haarig, denn es gibt ja massig Refactoring-Maßnahmen, die am Verhalten des Codes nichts ändern, eigentlich alle, denn das ja gerade die Definition von Refactoring. Im Grunde willst du wohl sowas wie semantische Gleichheit. Die wäre dann sogar noch gegeben, wenn jemand i = 2 * j; in i = j << 1; ändert. Wie weit willst du das treiben?

Im Grunde könntest und müsstest du das über UnitTests abfackeln, sofern diese eine 100%ige Abdeckung haben. Dann könnte man jede Codeänderung, die immer noch alle Tests erfolgreich absolviert, als semantisch gleich zu dem vorherigen Stand ansehen.

herbivore

1.820 Beiträge seit 2005
vor 12 Jahren

Hallo

@herbivore:
Wobei bei einer Erweiterung des Codes um zusätzliche Funktionalitäten die bisherigen Tests weiterhin alle erfolgreich arbeiten. Die einzige Änderung dann ist, dass nicht mehr alles zu 100% abgedeckt ist, d.h. hier müsste eine weitere Prüfung erfolgen (100% Testabdeckung + Alle tests erfolgreich)

Nobody is perfect. I'm sad, i'm not nobody 🙁

5.742 Beiträge seit 2007
vor 12 Jahren

Hab wahrscheinlich vergessen zu erwähnen das dass resultierende Kompilat entscheidend ist.

Gemeiner Workaround: Compilieren und diff über Binaries 😉

rollerfreak2 Themenstarter:in
916 Beiträge seit 2008
vor 12 Jahren

Danke für die vielen Hinweise, ich denke wie Herbivore bereits erwähnt hat führt das vom hundertsten ins tausendste. Ich schau mal wieweit das den Rahmen sprengt, aber das mit den Binaries vergleichen klingt auch interessant. Problem allerdings dabei ist das nicht jedes File einem Assembly zugeordnet ist.

Again what learned...

2.891 Beiträge seit 2004
vor 12 Jahren

CodeCompare hat eine Option für "Ignore Comments". (Allerdings hat das bei mir gerade nicht funktioniert...

2.891 Beiträge seit 2004
vor 12 Jahren

Wenn man Compare Content auf Symbol by Symbol stellt, funktioniert's.

rollerfreak2 Themenstarter:in
916 Beiträge seit 2008
vor 12 Jahren

Das sieht interessant aus. Hat das CodeCompare eine offene Schnittstelle? Daher kann ich das teil programmatisch nutzen, daher automatisieren. Ich glaub ich schau mir mal die Visual Studio Integration mit dem Relfector an, eventuell kann ich das dann irgendwie nutzen.

Again what learned...

Gelöschter Account
vor 12 Jahren

Es gibt eine tolle Seite mit .NET Reflector Addins auf Codeplex, da ist sogar noch Lutz Roeder mit dabei.
http://reflectoraddins.codeplex.com
Da gibts auch ein Diff Addin.