27
marca
2009
Może i użytkowników maków którzy czytają mojego bloga i nie ma zbyt dużo (Google Analytics mówi o 17.12% w ostatnim miesiącu), ale ja sam jako użytkownik systemu od Apple po prostu nie mogłem się powstrzymać, żeby nie napisać mojego hacka na zmuszenie git-svn'a do łączenia się z repozytorium za httpsem podczas clone'owania projektu z sVNa.
Problem na który napotykałem pojawiał się, gdy próbowałem zrobić wspomniany w poprzednim wpisie git svn clone svn://sciezka.do.repozytorium.com gdy svn wymagał autoryzacji. Problem polega na braku biblioteki Term::ReadKey w perlu. Próbowałem ją doinstalować przy pomocy sudo cpan install Term::ReadKey. Ale nie działo. Problemy pojawiały podczas kompilacji z programem make. CPAN uważał, że go nie ma, mimo że podawałem mu poprawną do niego ścieżkę. Problem zupełnie niezrozumiały. Dlatego postanowiłem ugryźć temat z innej strony.
Jako, że git-svn został napisany w perlu, można podejrzeć jego źródła w tym miejscu:
/usr/local/git/libexec/git-core/git-svn
Nigdy nie lubiłem perla, ale przyjrzyjmy się kawałku kodu w linii 3178, który psuje autentykację, uniemożliwiając wpisanie hasła:
3174 sub _read_password {
3175 my ($prompt, $realm) = @_;
3176 print STDERR $prompt;
3177 STDERR->flush;
3178 require Term::ReadKey;
3179 Term::ReadKey::ReadMode('noecho');
3180 my $password = '';
3181 while (defined(my $key = Term::ReadKey::ReadKey(0))) {
3182 last if $key =~ /[\012\015]/; # \n\r
3183 $password .= $key;
3184 }
3185 Term::ReadKey::ReadMode('restore');
3186 print STDERR "\n";
3187 STDERR->flush;
3188 $password;
3189 }
Rozwiązanie jest proste:
3174 sub _read_password {
3175 my ($prompt, $realm) = @_;
3176 print STDERR $prompt;
3177 STDERR->flush;
3178 # require Term::ReadKey;
3179 # Term::ReadKey::ReadMode('noecho');
3180 my $password = '';
3181 # while (defined(my $key = Term::ReadKey::ReadKey(0))) {
3182 # last if $key =~ /[\012\015]/; # \n\r
3183 # $password .= $key;
3184 # }
3185 # Term::ReadKey::ReadMode('restore');
3186 chomp($password = <STDIN>);
3187 print STDERR "\n";
3188 STDERR->flush;
3189 $password;
3190 }
Zakomentowanie kodu odpowiedzialnego za komunikację z brakującą biblioteką i ustawienie zwykłego pobrania wartości zmiennej $password ze standardowego wejścia (STDIN). Może i nie jest to najelegantsze rozwiązanie, ale działa. Jedynym minusem jest to, że od tej chwili hasło jest widoczne podczas wpisywania. Tak więc, nie róbcie tego w miejscach publicznych. ;-)
Żadnych uwag nie przyjmuję. SOA#1
Odrobinę ładniejsze rozwiązanie: http://www.kkovacs.hu/2008/08/git-svn-for-os-x-fix/
Odrobinę jeszcze ładniejsze rozwiązanie: Zainstaluj Linuksa
Bez flame‘ów proszę.
Po kolejne, Mariusz Cieśla na facebooku podpowiedział mi, że mogłem użyć jeszcze MacPorts:
sudo port install git-core
sudo port install git +svn