WordNet:
subversion
n 1: destroying someone’s (or some group’s) honesty or loyalty;
undermining moral integrity; “corruption of a minor”;
“the big city’s subversion of rural innocence” [syn: corruption]
2: the act of subverting; as overthrowing or destroying a
legally constituted government [syn: subversive activity]
Pri GemRB in Wormux uporabljamo subversion (na kratko SVN) za RCS/SCM (revision control system/source countrol & managment). Je centraliziran sistem in naslednik CVS (najbrž je od tod večumno ime). Pri tem je uspešen, a so ga tačas prehiteli drugačni, necentralizirani (vsaj po konceptu) sistemi SCM kot so git, hg in drugi. Ima precej pomankljivosti in tokrat se bom osredotočil na par preprostih in hitro očitnih. V nobenem posebnem vrstnem redu:
subversion 1: .svn
$ grep -ir dragons gemrb/plugins/Core/
gemrb/plugins/Core/.svn/text-base/Animation.cpp.svn-base: //large, composite animations (dragons, multi-part area anims) require synchronisation
gemrb/plugins/Core/Animation.cpp: //large, composite animations (dragons, multi-part area anims) require synchronisation
SVN ima v vsakem podimeniku še en skriti podimenik za svoje podatke. Spam za grep in druga iskala, pa še sortira se na prvo mesto. Eden od razlogov, da je bil spisan ack in razne hitre rešitve kot recimo moj svn-grep (glej vnos o /etc/profile).
subversion 2: .svn 2
$ rm -r wormux-0.8.4/
rm: remove write-protected regular file `wormux-0.8.4/m4/.svn/entries‘? y
…
Seveda so ti imeniki prikladno nepisljivi, zato si ob brisanju primoran rm podatki stikalo fuck-yeah (-f).
subversion 3: časi izvedbe!?
$ time svn log gemrb/plugins/Core/EffectQueue.h
————————————————————————
r6401 | fuzzie | 2009-06-11 19:34:17 +0200 (Thu, 11 Jun 2009) | 1 line
TimingMode in effects is a single byte
————————————————————————
/…/
————————————————————————
r2726 | edheldil | 2004-11-07 20:48:44 +0100 (Sun, 07 Nov 2004) | 2 lines
First and trivial version of FX queue
————————————————————————
real 0m14.737s
$ time git log gemrb/plugins/Core/EffectQueue.h
(ni izpisa, ker je bil poslan v less; to tudi ni ozko grlo)
real 0m0.024s
SVN mora za skoraj vsako neumnost poklicati strežnik. Ampak dvomim, da je to edini vzrok za tako počasnost (primer je bil projekt na sourceforge prek https protokola in isti projekt uvožen v git). Vidna je tudi pri drugih ukazih, zato tudi ni samo razlika v načinu pomnenja zgodovine - SVN to hrani za vsako datoteko posebej (v prej omenjenih podimenikih .svn), git pa ima centralno zgodovino za celo drevo, ki jo lahko hitro zoža na željeni del.
subversion 4: okornost
$ svn diff
Index: gemrb/plugins/OpenALAudio/OpenALAudio.cpp
===================================================================
— gemrb/plugins/OpenALAudio/OpenALAudio.cpp (revision 6737)
+++ gemrb/plugins/OpenALAudio/OpenALAudio.cpp (working copy)
@@ -27,7 +27,7 @@
int error = alGetError();
if (error != AL_NO_ERROR) {
printMessage(”OpenAL”, msg, WHITE );
- printf (”: %d “, error);
+ printf (”: %d”, error);
printStatus(status, YELLOW);
return true;
}
$ git diff
diff –git a/gemrb/plugins/OpenALAudio/OpenALAudio.cpp b/gemrb/plugins/OpenALAudio/OpenALAudio.cpp
index 7ddd7e4..cb51e59 100644
— a/gemrb/plugins/OpenALAudio/OpenALAudio.cpp
+++ b/gemrb/plugins/OpenALAudio/OpenALAudio.cpp
@@ -27,7 +27,7 @@ bool checkALError(const char* msg, const char* status) {
int error = alGetError();
if (error != AL_NO_ERROR) {
printMessage(”OpenAL”, msg, WHITE );
- printf (”: %d “, error);
+ printf (”: %d”, error);
printStatus(status, YELLOW);
return true;
}
$ svn diff –show-c-function
svn: invalid option: –show-c-function
Type ’svn help’ for usage.
$ svn diff -p
svn: invalid option character: p
Type ’svn help’ for usage.
$ svn diff -x “-pi”
svn: Error parsing diff options: Bad character specified on command line
$ svn diff -x -p
Index: gemrb/plugins/OpenALAudio/OpenALAudio.cpp
===================================================================
— gemrb/plugins/OpenALAudio/OpenALAudio.cpp (revision 6737)
+++ gemrb/plugins/OpenALAudio/OpenALAudio.cpp (working copy)
@@ -27,7 +27,7 @@ bool checkALError(const char* msg, const char* sta
int error = alGetError();
if (error != AL_NO_ERROR) {
printMessage(”OpenAL”, msg, WHITE );
- printf (”: %d “, error);
+ printf (”: %d”, error);
printStatus(status, YELLOW);
return true;
}
$ svn diff -x “-pui” –diff-cmd diff
Index: gemrb/plugins/OpenALAudio/OpenALAudio.cpp
===================================================================
— gemrb/plugins/OpenALAudio/OpenALAudio.cpp (revision 6737)
+++ gemrb/plugins/OpenALAudio/OpenALAudio.cpp (working copy)
@@ -27,7 +27,7 @@ bool checkALError(const char* msg, const
int error = alGetError();
if (error != AL_NO_ERROR) {
printMessage(”OpenAL”, msg, WHITE );
- printf (”: %d “, error);
+ printf (”: %d”, error);
printStatus(status, YELLOW);
return true;
}
Podukaz diff naredi čisto osnoven diff, medtem ko samo orodje podpira mnogo več. Git del teh zmožnosti že privzeto uporabi, druge pa lahko enostavno dodaš. SVN je dosti bolj omejen - v zgornjem primeru ni izpisal funkcije kjer je sprememba in tudi ni požrl par osnovnih stikal. Git je povrhu še obarval izpis. Po pregledu pomoči, se dodatna stikala doda z -x, vendar je nabor teh zelo omejen, ker gre za lastno implementacijo diff. S klicanjem zunanjega se da doseči več, ampak vse skupaj zahteva že precej tipkanja.
subversion 5: brez pager-ja
$ svn help diff
diff (di): Display the differences between two revisions or paths.
usage: 1. diff [-c M | -r N[:M]] [TARGET[@REV]…]
2. diff [-r N[:M]] –old=OLD-TGT[@OLDREV] [–new=NEW-TGT[@NEWREV]] \
[PATH…]
3. diff OLD-URL[@OLDREV] NEW-URL[@NEWREV]
$ man git-diff
SVN nima dokumentacije v obliki man strani (razen ene), ampak se do nje dostopa preko “svn help”. Ta vse naenkrat vrže na zaslon, tako da brez ročnega pošiljanja v kak pager, ne bo nič z naprednim iskanjem ali sprotnim branjem. To je težava tudi pri drugih ukazih (recimo prej omenjeni svn log). Izpis tudi kaže, da je dostikrat treba podati celoten URL do datoteke (npr. svn://blabla), namesto samo relativne poti na disku. Na srečo so to končno večininoma popravili v nedavno izdani različici 1.6.