Kamil Szot

Kamil Szot PHP, JavaScript -
rozwiązywanie
problemów.
limeline.pl

Temat: Ktoś może zna system kontroli wersji dla którego istnieje...

Ktoś może zna system kontroli wersji dla którego istnieje klient napisany w php?

Mój wymóg jest taki, że klient w php nie może być tylko wrapperem konsolowego klienta.

To http://code.google.com/p/phpsvnclient/ się nie nadaje ze względu na bardzo ograniczoną funkcjonalność.Kamil Szot edytował(a) ten post dnia 27.10.09 o godzinie 05:14
Piotr Baranowski

Piotr Baranowski Rozwiązuje problemy,
poprawiam świat,
chłonę wiedzę i
prz...

Temat: Ktoś może zna system kontroli wersji dla którego istnieje...

Z ciekawosci.. skad taki wymog? I czemu tak?
Wojciech Sznapka

Wojciech Sznapka CTO @ STS Zakłady
Bukmacherskie

Temat: Ktoś może zna system kontroli wersji dla którego istnieje...

szukałeś w googlach? :-)

http://code.google.com/p/git-php/
Kamil Szot

Kamil Szot PHP, JavaScript -
rozwiązywanie
problemów.
limeline.pl

Temat: Ktoś może zna system kontroli wersji dla którego istnieje...

Wojciech Sznapka:
szukałeś w googlach? :-)

http://code.google.com/p/git-php/

Oglądałeś to co znalazłeś? <ironia>Jeden 24kB plik to trochę mało na implementację protokołu git-a, nawet w tak cudownie ekspresywnym języku jak php.</ironia>

Fragment kodu:

exec("cd /tmp && git-clone $repo && rm -Rf /tmp/$proj/.git && tar czvf $proj.tar.gz $proj && rm -Rf /tmp/$proj");


Jak widać to tylko wrapper który wymaga, żeby konsolowy klient git-a był zainstalowany na serwerze.
Kamil Szot

Kamil Szot PHP, JavaScript -
rozwiązywanie
problemów.
limeline.pl

Temat: Ktoś może zna system kontroli wersji dla którego istnieje...

Piotr Baranowski:
Z ciekawosci.. skad taki wymog? I czemu tak?

W szczególności chodzi o możliwość wykonania 'svn update' lub ekwiwalentu na współdzielonym hostingu, na którym konsolowy klient żadnego systemu kontroli wersji nie jest zainstalowany.

konto usunięte

Temat: Ktoś może zna system kontroli wersji dla którego istnieje...

Nie lepiej korzystać z klientów np. SVN w środowisku w którym kodujesz? W eclipsie (dla PHP PDT) można zainstalować subclipse'a (http://subclipse.tigris.org/) czyli klienta SVN'a i działa bardzo ładnie (sam korzystam). Robienie commitów z przeglądarki to chyba dziwne podejście - pewno dlatego nie ma zbyt dużego wyboru jeżeli chodzi o klientów.

Tradycyjne podejście - Każdy koduje swoje i commituje z IDE (lub z konsoli).
Kamil Szot

Kamil Szot PHP, JavaScript -
rozwiązywanie
problemów.
limeline.pl

Temat: Ktoś może zna system kontroli wersji dla którego istnieje...

Szymon Błachowicz:
Nie lepiej korzystać z klientów np. SVN w środowisku w którym kodujesz? W eclipsie (dla PHP PDT) można zainstalować subclipse'a (http://subclipse.tigris.org/) czyli klienta SVN'a i działa bardzo ładnie (sam korzystam). Robienie commitów z przeglądarki to chyba dziwne podejście

Commity mnie znacznie mniej interesują niż updaty.
- pewno dlatego nie ma zbyt dużego wyboru jeżeli chodzi o klientów.

Wydaje mi się, że implementacja jest po prostu trudna.
Tradycyjne podejście - Każdy koduje swoje i commituje z IDE (lub z konsoli).

Oczywiście, tylko, że kiedy wszystko jest już zakodowane i przetestowane trzeba zaktualizować kopię produkcyjną, która znajduje się np. na współdzielonym hostingu bez zainstalowanego svn-a albo z zablokowanym exec() dostępną jedynie przez FTP. FTP jest chyba najgłupszym powszechnie używanym protokołem o jakim słyszałem więc na inteligentne narzędzie operujące via FTP nie ma co liczyć. Pozostaje dostęp przez przeglądarkę. Klient systemu kontroli wersji w czystym php załatwiał by sprawę. Dlatego pytam.
Wojciech Sznapka

Wojciech Sznapka CTO @ STS Zakłady
Bukmacherskie

Temat: Ktoś może zna system kontroli wersji dla którego istnieje...

Kamil Szot:
Wojciech Sznapka:
szukałeś w googlach? :-)

http://code.google.com/p/git-php/

Oglądałeś to co znalazłeś?

nie :-P

wracając do problemu, podmontuj se tego ftpa curlftpfs (http://onjin.net/blog/2009/06/21/fuse-ftp-mount-curlft... i synchronizuj rsync'iem, będzie to trwało cholernie długo, ale będzie skuteczne, ftp to niestety zuoo...
Maciej Filipiak

Maciej Filipiak właściciel, VizMedia

Temat: Ktoś może zna system kontroli wersji dla którego istnieje...

Kamil - dlaczego nie wchodzi w grę opcja odpalenia 'svn update' z php ? odpalenie shella z exec() ?

Swoją stronkę aktualizuje automatycznie odpalając svn z crontab

Z php tez można - tylko nie wiem po co ?

I co masz do FTP ? na czym jego "głupiość" polga ?
Kamil Szot

Kamil Szot PHP, JavaScript -
rozwiązywanie
problemów.
limeline.pl

Temat: Ktoś może zna system kontroli wersji dla którego istnieje...

Maciej Filipiak:
Kamil - dlaczego nie wchodzi w grę opcja odpalenia 'svn update' z php ? odpalenie shella z exec() ?
Serwer dostarczający współdzielonego hostingu może nie mieć zainstalowanego svn-a albo może mieć zablokowaną możliwość wykonywania niebezpiecznych funkcji (np. exec)
I co masz do FTP ? na czym jego "głupiość" polga ?
Na tym, że nie jest rsynciem. ;-)
Kamil Szot

Kamil Szot PHP, JavaScript -
rozwiązywanie
problemów.
limeline.pl

Temat: Ktoś może zna system kontroli wersji dla którego istnieje...

Wojciech Sznapka:
wracając do problemu, podmontuj se tego ftpa curlftpfs (http://onjin.net/blog/2009/06/21/fuse-ftp-mount-curlft... i synchronizuj rsync'iem, będzie to trwało cholernie długo,

ano właśnie
Kamil Szot

Kamil Szot PHP, JavaScript -
rozwiązywanie
problemów.
limeline.pl

Temat: Ktoś może zna system kontroli wersji dla którego istnieje...

Przestałem marzyć o wykorzystaniu sytemu kontroli wersji do rozwiązania tego problemu i tak na szybko sobie wystrugałem coś takiego:

#!/usr/bin/php
<?php

$user = '';
$pass = '';
$server = '';
$serverFtp = '';
$dir = ''; // must have trailing slash if not empty

$secret = 'secretsfdsfajoijid3czxc423423'; // anyone can get list of all files on the server by calling /uploader.php?secret
$exclude= '/Thumbs.db$/|devel/|/\\.(svn|bzr|git)/|(~|\\.bak|\\.orig)$';


function getLocalFileNamesWithMd5s() {
global $exclude;
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator(".")) as $file) {
if(!preg_match("`$exclude`", $file->getPathname())) {
$files[$file->getPathname()] = md5(file_get_contents($file->getPathname()));
}
}
return $files;
}

if(php_sapi_name() == "cli"){
$localFiles = getLocalFileNamesWithMd5s();
foreach(file("http://$server/uploader.php?".urlencode($secret), FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) as $line) {
list($md5, $fileName) = explode(" ", $line);
if($localFiles[$fileName] == $md5) {
unset($localFiles[$fileName]);
}
}
if($localFiles) {
$myName = $_SERVER['SCRIPT_FILENAME'];
$ftp = ftp_connect($serverFtp, 21, 10);
if(!$ftp) die;
ftp_login($ftp, $user, $pass);
ftp_pasv($ftp, true);
if($dir) ftp_chdir($ftp, $dir);

ksort($localFiles);
if(isset($localFiles[$myName])) {
unset($localFiles[$myName]);
$localFiles = array_keys($localFiles);
array_unshift($localFiles, $myName);
} else {
$localFiles = array_keys($localFiles);
}
echo "Files to upload:\n".implode("\n", $localFiles)."\n\n";
sleep(5);
foreach($localFiles as $fileName) {
echo "Sending $fileName ... ";
$dirParts = explode('/', dirname(substr($fileName, 2)));
for($i = 1; $i <= count($dirParts); $i++) {
@ftp_mkdir($ftp, implode('/', array_slice($dirParts, 0, $i)));
}
ftp_put($ftp, $fileName, $fileName, FTP_BINARY);
echo "ok\n";
if($fileName == $myName) {
ftp_close($ftp);
die("Just updated self. Please run me again.\n");
}
}
ftp_close($ftp);
} else {
echo "Nothing to send.\n";
}
} else {
if($_SERVER['QUERY_STRING'] == $secret) {
foreach(getLocalFileNamesWithMd5s() as $fileName => $md5) {
echo "$md5 $fileName\n";
}
}
}



Skonfigurować, wrzucić do głównego katalogu z przetestowaną kopią roboczą, odpalić z konsoli.

Łączy się z serwerem ftp i wysyła tam samego siebie. Przy ponownym odpaleniu wykonuje zdalną kopię siebie, która zwraca nazwy plików na serwerze wraz z ich md5. Wysyła FTP-em tylko te pliki lokalne, które mają różne md5 od pobranych.

Możliwe zmiany:
- dla bezpieczeństwa pobierać hasło ftp z $argv, albo wysyłać na serwer tylko część siebie, która jest konieczna (bez konfiguracji ftp).
- dla szybkości, oprócz plików śledzić również katalogi tak, żeby można było założyć je zawczasu (a nie tak jak teraz, podczas uploadowania leżących w nich plików) + gzipować zwracaną z serwera listę nazw plików jeżeli sam serwer tego nie robi.Kamil Szot edytował(a) ten post dnia 27.10.09 o godzinie 13:00
Wojciech Sznapka

Wojciech Sznapka CTO @ STS Zakłady
Bukmacherskie

Temat: Ktoś może zna system kontroli wersji dla którego istnieje...

montowaniem ftpa i rsynciem będzie imho szybciej
Kamil Szot

Kamil Szot PHP, JavaScript -
rozwiązywanie
problemów.
limeline.pl

Temat: Ktoś może zna system kontroli wersji dla którego istnieje...

Wojciech Sznapka:
montowaniem ftpa i rsynciem będzie imho szybciej
Dlaczego? FTP nie ma możliwości zmiany tylko części pliku więc cały wspaniały rsyncowy algorytm wyszukiwania i wysyłania tylko różnic nie ma jak się wykazać.
Stanisław P.

Stanisław P. Software designer

Temat: Ktoś może zna system kontroli wersji dla którego istnieje...

Kamil Szot:
Dlaczego? FTP nie ma możliwości zmiany tylko części pliku więc cały wspaniały rsyncowy algorytm wyszukiwania i wysyłania tylko różnic nie ma jak się wykazać.

Z odpowiednimi opcjami nie będzie dotykał plików o takiej samej nazwie + rozmiarze + czasie zmiany. A te dane można dostać z ls'a.
Kamil Szot

Kamil Szot PHP, JavaScript -
rozwiązywanie
problemów.
limeline.pl

Temat: Ktoś może zna system kontroli wersji dla którego istnieje...

Stanisław Pitucha:
Kamil Szot:
Dlaczego? FTP nie ma możliwości zmiany tylko części pliku więc cały wspaniały rsyncowy algorytm wyszukiwania i wysyłania tylko różnic nie ma jak się wykazać.

Z odpowiednimi opcjami nie będzie dotykał plików o takiej samej nazwie + rozmiarze + czasie zmiany. A te dane można dostać z ls'a.

Analogicznie zachowuje się lftp (polecenie mirror). Wy-ls-owanie wszystkiego przez FTP jest bardzo powolne.

konto usunięte

Temat: Ktoś może zna system kontroli wersji dla którego istnieje...

A nie można wyeksportować z SVN'a tylko ostatnich zmian? W sensie całych plików? I tylko te pliki nadpisać?
Kamil Szot

Kamil Szot PHP, JavaScript -
rozwiązywanie
problemów.
limeline.pl

Temat: Ktoś może zna system kontroli wersji dla którego istnieje...

Poprzednio miałem taki właśnie pomysł, żeby wyciągać z svn-a ostatnio zmienione pliki http://wiki.scotty.avx.pl/UzywanieSVNDoWysy%B3aniaZmia... ale choć działało to było bardziej zamotane. I nie odporne na przerwanie w trakcie transferu.
Szymon Gregorczyk

Szymon Gregorczyk Developerem jestem
programistyczno-webo
wym

Temat: Ktoś może zna system kontroli wersji dla którego istnieje...

Aleksander Wons:
A nie można wyeksportować z SVN'a tylko ostatnich zmian? W sensie całych plików? I tylko te pliki nadpisać?

Jest gdzies w sieci podmieniony export dla svn'a umozliwiajacy wyeksportowanie zmian pomiedzy okreslonymi rev'ami, nie dam rady wygooglac teraz jak sie zwie - postaram sie nie zapomniec i sprawdzic w pracy.
Jesli sie polaczy komendy z shella mozna ladnie wyeksportowac pliki i od razu wyslac na serwer lub spakowac > wyslac > rozpakowac. Ma to jednak swoje wady: trzeba pamietac ktora rewizja jest obecnie na serwerze i pliki ktore zostaly usuniete miedzy rev'ami nadal zostaja na serwerze.

edit:
Link do svn-exportSzymon Gregorczyk edytował(a) ten post dnia 28.10.09 o godzinie 12:59

konto usunięte

Temat: Ktoś może zna system kontroli wersji dla którego istnieje...

W Tortois'e wygląda to tak:
1. Show log
2. Zaznaczasz dwie wybrane rewizje
3. Prawym wybierasz "Compare revisions"
4. Zaznaczasz wszystkie pliki i prawym wybierasz "Export".

Teraz pozostaje wrzucenie na serwer.

Oczywiście, że trzeba pamiętać o usuwaniu plików z serwera, ale to chyba jedyny większy problem.
Co do zrywania połączenia, to każda metoda jest na to podatna. Najmniej problemów jest z przesłaniem wszystkiego jako np. zip'a na serwer a tam już można skryptem zipa rozpakować.

Nie jest to idealna metoda, ale ja w ten sposób aktualizuje aplikacje, które nie mają dostępu do SVN'a. I tak na prawde jeszcze nigdy nie miałem z tym problemów.

No chyba, że na aplikacją pracuje jednocześni kilkanaście osób i co chwile coś aktualizują, ale to wtedy raczej oczywiste, że ma się dedyka, na którym ten svn jest ;)

Następna dyskusja:

PHP dla aplikacji webowych ...




Wyślij zaproszenie do