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'));
?>



Комментарии

  1. > Разочаровалась я в нем :(

    А есть альтернативы? Кроме hg serve (который гораздо больше неплох, чем это кажется). Развивается - и ладно, когда-нибудь вырастет.

    ОтветитьУдалить
    Ответы
    1. С бOльшим функционалом, чем родкод - не встречала. redmine есть. У меркуриала есть встроенный web интерфейс, который и используется, как я поняла везде. Есть mercurial API - это и юзают разработчики родкода и редмайна. Скорее даже hgapi. Так сказать выше этого апи не прыгнуть. Писать самому :(

      НО! Возможно в родкоде будет, и вроде где-то писали, что собираются сделать слияние веток реальное! Подождите, появится :) Смогла бы я разобраться в его питон-коде, сама бы дописала :)

      PS: Вот говорят что-то клёвое cloud9 IDE http://c9.io
      Сама я им не пользовалась, разве что чуток :(

      Удалить
    2. Лучше понюхать в другую сторону, как правильно пользоваться инструментом. Мы то же первоначально пытались забивать гвозди отверткой, но rhodecode немного другой инструмент, чем то что вы от него хотите получить.

      Его назначение - центральное место совместной разработки(работа с исходным кодом командой). Вся разработка и все действия происходят у вас локально: создание/слияние branch'ей, написание кода и т.д. А в rhodecode вы делитесь этим с другими разработчиками через pull request(мы у себя так используем), или по другой политике. Что бы они посмотрели что сделано и приняли или отклонили эти изменения.
      У меня не получится объяснить лучше, чем по вот этой ссылке: https://confluence.atlassian.com/display/BITBUCKET/Fork+a+Repo,+Compare+Code,+and+Create+a+Pull+Request

      Удалить

Отправить комментарий

Популярные сообщения