RhodeCode
Разочаровалась я в нем :(
Уже было и начала писать класс работы с api (его содержание в самом низу)
Для работы с апи, нужен некий ключ, лично я долго искала, где написано где его искать. Поэтому запишу тут, чтобы снова не искать.
API key можно узнать, зайдя в Admin » users Выбрать пользователя и над именем как раз будет api key
Родкод не может сам сливать, об этом написано тут
https://groups.google.com/forum/?fromgroups=#!topic/rhodecode/BtT6IogyYjA
Надо по этой инструкции выполнить ручками команды
https://bitbucket.org/marcinkuzminski/rhodecode/pull-request/63/initialize-user-with-ldap-properties-in/diff
hg update beta
hg pull -r ebcf136214c6 https://bitbucket.org/domruf/rhodecode
hg merge ebcf136214c6
hg commit -m 'Merged in domruf/rhodecode (pull request #63)'
Итого, форк - это чуть ли не клон, я так и не нашла различия, тоже создает копию. Нам вообще нужны были branch (ветки), но создавать или сливать ветки родкод тоже не дает. Можно только переключаться между ними.... Маловато функционала в нем, не совпадает с иконками в интерфейсе ...
И ещё добило то, что в апи-доке написано, что можно пулять репозитории, но как я не нюхала доку, не лизала монитор, так и не получилось это выполнить :( Т.е. если я пуляю из родительской репы, то выводится ошибка Unable to pull changes from `***`, если указываю дочернюю, то ошибок нет и .. вообще ничего нет, изменений ожидаемых я не увидела. Ожидала изменение файлов.
В итоге будем изобретать велосипед
И напоследок кучки кодов, так, чтоб я сама вспомнила что к чему, если вдруг опять придется с ним работать.
И мой типа тестик
hg pull -r ffbdbb38544f http://192.168.1.1:5000/html/pm-fork
[root@pm-test pm]# hg pull -r ffbdbb38544f http://192.168.1.1:5000/html/pm-fork
pulling from http://192.168.1.1:5000/html/pm-fork
searching for changes
all local heads known remotely
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
(run 'hg update' to get a working copy)
[root@pm-test pm]# hg status
[root@pm-test pm]# hg update
resolving manifests
getting crossdomain.xml
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
[root@pm-test pm]# hg cat crossdomain.xml
и
[root@pm-test pm]# cat crossdomain.xml
результаты должны совпадать
И чтобы это отобразилось в родкоде, я перезапустила его
И недоделанный класс :(
<?php
/**
* Created by webolga.
* Date: 19.02.13
*
* Класс для работы с API RhodeCode
* по дукументации http://pythonhosted.org/RhodeCode/api/api.html
*/
class RhodeCode
{
protected $debug = 1;
private $key = null;
public $host = null;
public $port = null;
private $url = null;
public $error = array();
public $response = null;
private $id = 0;
public function __construct($key,$host,$port=5000,$user=null,$passwd=null)
{
$this->key = $key;
$this->host = $host;
$this->port = $port;
}
/**
* сформировать путь к api
* @return null
*/
public function uri()
{
if($this->url)
return $this->url;
$this->url = 'http://'.$this->host.':'.$this->port.'/_admin/api';
return $this->url;
}
/**
* генерацияя ида соединения
* @return mixed
*/
protected function gen_id()
{
//return ++$this->id;
//return (int)microtime(true);
return time();
}
/**
* Получить ответ от
* @param $fields
* @return mixed|null
*/
private function response($fields)
{
$url = $this->uri();
$this->dump("url: ".$url);
$this->response = null;
if(!is_array($fields))
$fields = array();
$fields['id'] = $this->gen_id();
$fields['api_key'] = $this->key;
$fields = json_encode($fields);
$this->dump($fields);
$ch = curl_init(); //open curl handle
curl_setopt($ch, CURLOPT_URL, $url); //set an url
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //do not output directly, use variable
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); //do a binary transfer
curl_setopt($ch, CURLOPT_FAILONERROR, 1); //stop if an error occurred
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-HTTP-Method-Override: POST','Content-Type: text/plain','Content-Length: ' . strlen($fields)));
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
$file=curl_exec($ch); //store the content in variable
if(!curl_errno($ch))
{
$this->response = json_decode($file,true);
$this->dump($this->response);
}
else
{
$this->error[] = 'Curl error: ' . curl_error($ch);
$this->dump('Curl error: ' . curl_error($ch));
}
curl_close($ch);
return $this->response;
}
/**
* получить список репозиториев
* @return mixed|null
*/
public function get_repos()
{
$fields = array(
'method' => "get_repos",
'args' => array()
);
return $this->response($fields);
}
/**
* Создание репозитория
* @param $reponame
* @param $onwer - должен существовать
* @param string $repo_type
* @param string $description
* @param bool $private
* @param null $clone_uri
* @param string $landing_rev
* @param bool $enable_downloads
* @param bool $enable_locking
* @param bool $enable_statistics
*
* @return mixed|null
*/
public function create_repo($reponame,$onwer,$description='',$clone_uri=null,$repo_type='hg',$private=false,
$landing_rev='tip',$enable_downloads=true,$enable_locking=false,$enable_statistics=false)
{
$fields = array(
'method'=> "create_repo",
'args' => array(
"repo_name" => $reponame,
"owner" => $onwer,
"repo_type" => $repo_type,
"description" => $description, // "<description> = Optional('')",
"private" => $private, // "<bool> = Optional(False)",
"clone_uri" => $clone_uri, // "<clone_uri> = Optional(None)",
"landing_rev" => $landing_rev, // "<landing_rev> = Optional('tip')",
"enable_downloads" => $enable_downloads, // "<bool> = Optional(False)",
"enable_locking" => $enable_locking, // "<bool> = Optional(False)",
"enable_statistics"=> $enable_statistics // "<bool> = Optional(False)",
)
);
return $this->response($fields);
}
/**
* Pulls given repo from remote location. Can be used to automatically keep remote repos up to date. This command can be executed only using api_key belonging to user with admin rights
* @param $repoid - reponame or repo_id
*/
public function pull($repoid)
{
$fields = array(
'method'=> "pull",
'args' => array(
"repoid" => $repoid
)
);
return $this->response($fields);
}
private function dump($var)
{
if(!$this->debug)
return;
echo "\n<pre>rhodecode dump: ".print_r($var,1)."</pre>";
}
}
$RHODECODE = array(
'key' => '8be51ae4ae88f578d4fae3daf54861dc576a2c22',
'host' => '192.168.13.158',
'port' => '5000'
);
$apirc = new RhodeCode($RHODECODE['key'], $RHODECODE['host'],$RHODECODE['port']);
$reponame = 'new_repo';
$onwer = 'olga';
$description = 'bla-bla';
$res = $apirc->create_repo($reponame,$onwer,$description);
if(getElement($res,'error'))
{
dump($res['error']);
}
dump('Message:');
dump(getElement($res,'msg'));
?>
Уже было и начала писать класс работы с api (его содержание в самом низу)
Для работы с апи, нужен некий ключ, лично я долго искала, где написано где его искать. Поэтому запишу тут, чтобы снова не искать.
API key можно узнать, зайдя в Admin » users Выбрать пользователя и над именем как раз будет api key
Родкод не может сам сливать, об этом написано тут
https://groups.google.com/forum/?fromgroups=#!topic/rhodecode/BtT6IogyYjA
Надо по этой инструкции выполнить ручками команды
https://bitbucket.org/marcinkuzminski/rhodecode/pull-request/63/initialize-user-with-ldap-properties-in/diff
hg update beta
hg pull -r ebcf136214c6 https://bitbucket.org/domruf/rhodecode
hg merge ebcf136214c6
hg commit -m 'Merged in domruf/rhodecode (pull request #63)'
Итого, форк - это чуть ли не клон, я так и не нашла различия, тоже создает копию. Нам вообще нужны были branch (ветки), но создавать или сливать ветки родкод тоже не дает. Можно только переключаться между ними.... Маловато функционала в нем, не совпадает с иконками в интерфейсе ...
И ещё добило то, что в апи-доке написано, что можно пулять репозитории, но как я не нюхала доку, не лизала монитор, так и не получилось это выполнить :( Т.е. если я пуляю из родительской репы, то выводится ошибка Unable to pull changes from `***`, если указываю дочернюю, то ошибок нет и .. вообще ничего нет, изменений ожидаемых я не увидела. Ожидала изменение файлов.
В итоге будем изобретать велосипед
И напоследок кучки кодов, так, чтоб я сама вспомнила что к чему, если вдруг опять придется с ним работать.
И мой типа тестик
hg pull -r ffbdbb38544f http://192.168.1.1:5000/html/pm-fork
[root@pm-test pm]# hg pull -r ffbdbb38544f http://192.168.1.1:5000/html/pm-fork
pulling from http://192.168.1.1:5000/html/pm-fork
searching for changes
all local heads known remotely
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
(run 'hg update' to get a working copy)
[root@pm-test pm]# hg status
[root@pm-test pm]# hg update
resolving manifests
getting crossdomain.xml
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
[root@pm-test pm]# hg cat crossdomain.xml
и
[root@pm-test pm]# cat crossdomain.xml
результаты должны совпадать
И чтобы это отобразилось в родкоде, я перезапустила его
И недоделанный класс :(
<?php
/**
* Created by webolga.
* Date: 19.02.13
*
* Класс для работы с API RhodeCode
* по дукументации http://pythonhosted.org/RhodeCode/api/api.html
*/
class RhodeCode
{
protected $debug = 1;
private $key = null;
public $host = null;
public $port = null;
private $url = null;
public $error = array();
public $response = null;
private $id = 0;
public function __construct($key,$host,$port=5000,$user=null,$passwd=null)
{
$this->key = $key;
$this->host = $host;
$this->port = $port;
}
/**
* сформировать путь к api
* @return null
*/
public function uri()
{
if($this->url)
return $this->url;
$this->url = 'http://'.$this->host.':'.$this->port.'/_admin/api';
return $this->url;
}
/**
* генерацияя ида соединения
* @return mixed
*/
protected function gen_id()
{
//return ++$this->id;
//return (int)microtime(true);
return time();
}
/**
* Получить ответ от
* @param $fields
* @return mixed|null
*/
private function response($fields)
{
$url = $this->uri();
$this->dump("url: ".$url);
$this->response = null;
if(!is_array($fields))
$fields = array();
$fields['id'] = $this->gen_id();
$fields['api_key'] = $this->key;
$fields = json_encode($fields);
$this->dump($fields);
$ch = curl_init(); //open curl handle
curl_setopt($ch, CURLOPT_URL, $url); //set an url
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //do not output directly, use variable
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); //do a binary transfer
curl_setopt($ch, CURLOPT_FAILONERROR, 1); //stop if an error occurred
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-HTTP-Method-Override: POST','Content-Type: text/plain','Content-Length: ' . strlen($fields)));
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
$file=curl_exec($ch); //store the content in variable
if(!curl_errno($ch))
{
$this->response = json_decode($file,true);
$this->dump($this->response);
}
else
{
$this->error[] = 'Curl error: ' . curl_error($ch);
$this->dump('Curl error: ' . curl_error($ch));
}
curl_close($ch);
return $this->response;
}
/**
* получить список репозиториев
* @return mixed|null
*/
public function get_repos()
{
$fields = array(
'method' => "get_repos",
'args' => array()
);
return $this->response($fields);
}
/**
* Создание репозитория
* @param $reponame
* @param $onwer - должен существовать
* @param string $repo_type
* @param string $description
* @param bool $private
* @param null $clone_uri
* @param string $landing_rev
* @param bool $enable_downloads
* @param bool $enable_locking
* @param bool $enable_statistics
*
* @return mixed|null
*/
public function create_repo($reponame,$onwer,$description='',$clone_uri=null,$repo_type='hg',$private=false,
$landing_rev='tip',$enable_downloads=true,$enable_locking=false,$enable_statistics=false)
{
$fields = array(
'method'=> "create_repo",
'args' => array(
"repo_name" => $reponame,
"owner" => $onwer,
"repo_type" => $repo_type,
"description" => $description, // "<description> = Optional('')",
"private" => $private, // "<bool> = Optional(False)",
"clone_uri" => $clone_uri, // "<clone_uri> = Optional(None)",
"landing_rev" => $landing_rev, // "<landing_rev> = Optional('tip')",
"enable_downloads" => $enable_downloads, // "<bool> = Optional(False)",
"enable_locking" => $enable_locking, // "<bool> = Optional(False)",
"enable_statistics"=> $enable_statistics // "<bool> = Optional(False)",
)
);
return $this->response($fields);
}
/**
* Pulls given repo from remote location. Can be used to automatically keep remote repos up to date. This command can be executed only using api_key belonging to user with admin rights
* @param $repoid - reponame or repo_id
*/
public function pull($repoid)
{
$fields = array(
'method'=> "pull",
'args' => array(
"repoid" => $repoid
)
);
return $this->response($fields);
}
private function dump($var)
{
if(!$this->debug)
return;
echo "\n<pre>rhodecode dump: ".print_r($var,1)."</pre>";
}
}
$RHODECODE = array(
'key' => '8be51ae4ae88f578d4fae3daf54861dc576a2c22',
'host' => '192.168.13.158',
'port' => '5000'
);
$apirc = new RhodeCode($RHODECODE['key'], $RHODECODE['host'],$RHODECODE['port']);
$reponame = 'new_repo';
$onwer = 'olga';
$description = 'bla-bla';
$res = $apirc->create_repo($reponame,$onwer,$description);
if(getElement($res,'error'))
{
dump($res['error']);
}
dump('Message:');
dump(getElement($res,'msg'));
?>
> Разочаровалась я в нем :(
ОтветитьУдалитьА есть альтернативы? Кроме hg serve (который гораздо больше неплох, чем это кажется). Развивается - и ладно, когда-нибудь вырастет.
С бOльшим функционалом, чем родкод - не встречала. redmine есть. У меркуриала есть встроенный web интерфейс, который и используется, как я поняла везде. Есть mercurial API - это и юзают разработчики родкода и редмайна. Скорее даже hgapi. Так сказать выше этого апи не прыгнуть. Писать самому :(
УдалитьНО! Возможно в родкоде будет, и вроде где-то писали, что собираются сделать слияние веток реальное! Подождите, появится :) Смогла бы я разобраться в его питон-коде, сама бы дописала :)
PS: Вот говорят что-то клёвое cloud9 IDE http://c9.io
Сама я им не пользовалась, разве что чуток :(
Лучше понюхать в другую сторону, как правильно пользоваться инструментом. Мы то же первоначально пытались забивать гвозди отверткой, но rhodecode немного другой инструмент, чем то что вы от него хотите получить.
УдалитьЕго назначение - центральное место совместной разработки(работа с исходным кодом командой). Вся разработка и все действия происходят у вас локально: создание/слияние branch'ей, написание кода и т.д. А в rhodecode вы делитесь этим с другими разработчиками через pull request(мы у себя так используем), или по другой политике. Что бы они посмотрели что сделано и приняли или отклонили эти изменения.
У меня не получится объяснить лучше, чем по вот этой ссылке: https://confluence.atlassian.com/display/BITBUCKET/Fork+a+Repo,+Compare+Code,+and+Create+a+Pull+Request