LINUX.ORG.RU

создание SVN репозит.рия, удаленно


0

0

Используется подход "репозиторий на проект". Новые проекты создаются нечастно, но все-таки бывает...

Кто чем пользуется? Давать шелловый доступ на сервер для этого как-то некрасиво.

Не верю, что я первый, кто столкнулся с такой задачей. Наверняка должна быть какая-то веб-морда...

ЗЫ Фанаты всяких DVCS вежливо посылаются в толксы

★★★★★

где-то в интернетах наталкивался на такой скриптик. Ему передается имя проекта, а создает базу и запускает демона он сам. Но давно это было, ссылки нет.

irq
()
Ответ на: комментарий от PartyZan

Я именно так и поступаю. Но хочется дать возможность проверенным людям делать это самостоятельно, но без шелла.

svu ★★★★★
() автор топика
Ответ на: комментарий от roy

Посылаются-посылаются. Мне хватило энергии перетащить с CVS на SVN, но переход на git я не справлюсь обосновать. Ибо реально в конторе DVCS нафиг не нужна, а learning curve не в пример круче.

svu ★★★★★
() автор топика
Ответ на: комментарий от svu

Не спорю на счёт обоснования, но про обучение скажу, что, видимо, зависит от ваших потребностей. Мы не использовали в svn различные бранчи, т.е. вся разработка шла в транке. Перешли на git, по сути ничего для большинства не изменилось, так же разработка в одной ветке. Но кто захотел, тот начал использовать отдельные бранчи в локальном репозитории. Скорость работы git и svn конечно не сравнимая. И управление репозиторием.

roy ★★★★★
()
Ответ на: комментарий от roy

> видимо, зависит от ваших потребностей
К сожалению, в git такая вещь как локальный репозиторий - не зависит от потребностей. И это вносит некоторое кол-во конфуза (по себе скажу).

В общем, предлагаю согласиться на том, что они все разные, для разных целей - и вернуться к топику:)

svu ★★★★★
() автор топика
Ответ на: комментарий от svu

> Мне хватило энергии перетащить с CVS на SVN, но переход на git я не справлюсь обосновать.

И правильно. Git сделан пришельцами для пришельцев и тех, кто хочет выделиться из толпы земляшек. Для остальных есть более другие DVCS.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Дело не в этом. Буква D сама по себе вносит лишний уровень сложности, который в данном случае не нужен.

И все-таки, как создать репозиторий!:)

svu ★★★★★
() автор топика
Ответ на: комментарий от svu

> И все-таки, как создать репозиторий!:)

Прописать для доверенных людей в ssh начальным шеллом примитивынй скрипт, который будет запрашивать имя репозитория и создавать его :)

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Жесть, конечно. Но в принципе да, можно и так...

svu ★★★★★
() автор топика
Ответ на: комментарий от svu

> И все-таки, как создать репозиторий!:)

небольшая программка на том же перле, которая либо как демон работает, либо по крону. забирает почту с mkrep@example.com и, если отправитель попадает в список разрешённых, берётся с заголовка/тела письма название проекта и запускается инициализация репозитория. как побочный эффект — можно создавать репозитории с помощью смс и грабить корованы %)

arsi ★★★★★
()
Ответ на: комментарий от arsi

Я, конечно, очень ценю креатив местных велосипедостроителей, я и сам так умею - но думалось о чем-то, что можно установить при помощи apt-get install/configure;make;make install и т.д.;)

svu ★★★★★
() автор топика
Ответ на: комментарий от svu

> Я, конечно, очень ценю креатив местных велосипедостроителей, я и сам так умею - но думалось о чем-то, что можно установить при помощи apt-get install/configure;make;make install и т.д.;)

ай-ай-ай! такой взрослый дядя, звездочки вон на груди уже не помещаются на манжеты приходится прикалывать а скриптик на 10 строк соорудить не может. стыдно, товарищ капитан.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

Стар я для скриптиков. Слишком стар. Супер-стар...

Вообще-то, к скриптику придется еще приделывать аутентификацию через керберос (в виде AD), управление правами и пр. Ленюся я.

svu ★★★★★
() автор топика
Ответ на: комментарий от svu

Стар я для скриптиков. Слишком стар. Супер-стар...

да, старость-нерадость :(

--- cut ---

High School/Jr.High

  10 PRINT "HELLO WORLD"
  20 END

First year in College

  program Hello(input, output)
    begin
      writeln('Hello World')
    end.

Senior year in College

  (defun hello
    (print
      (cons 'Hello (list 'World))))

New professional

  #include <stdio.h>
  void main(void)
  {
    char *message[] = {"Hello ", "World"};
    int i;
 
    for(i = 0; i < 2; ++i)
      printf("%s", message[i]);
    printf("\n");
  }

Seasoned professional

  #include <iostream.h>
  #include <string.h>
 
  class string
  {
  private:
    int size;
    char *ptr;
 
  string() : size(0), ptr(new char[1]) { ptr[0] = 0; }
 
    string(const string &s) : size(s.size)
    {
      ptr = new char[size + 1];
      strcpy(ptr, s.ptr);
    }
 
    ~string()
    {
      delete [] ptr;
    }
 
    friend ostream &operator <<(ostream &, const string &);
    string &operator=(const char *);
  };
 
  ostream &operator<<(ostream &stream, const string &s)
  {
    return(stream << s.ptr);
  }
 
  string &string::operator=(const char *chrs)
  {
    if (this != &chrs)
    {
      delete [] ptr;
     size = strlen(chrs);
      ptr = new char[size + 1];
      strcpy(ptr, chrs);
    }
    return(*this);
  }
 
  int main()
  {
    string str;
 
    str = "Hello World";
    cout << str << endl;
 
    return(0);
  }

Master Programmer

  [
  uuid(2573F8F4-CFEE-101A-9A9F-00AA00342820)
  ]
  library LHello
  {
      // bring in the master library
      importlib("actimp.tlb");
      importlib("actexp.tlb");
 
      // bring in my interfaces
      #include "pshlo.idl"
 
      [
      uuid(2573F8F5-CFEE-101A-9A9F-00AA00342820)
      ]
      cotype THello
   {
   interface IHello;
   interface IPersistFile;
   };
  };
 
  [
  exe,
  uuid(2573F890-CFEE-101A-9A9F-00AA00342820)
  ]
  module CHelloLib
  {
 
      // some code related header files
      importheader(<windows.h>);
      importheader(<ole2.h>);
      importheader(<except.hxx>);
      importheader("pshlo.h");
      importheader("shlo.hxx");
      importheader("mycls.hxx");
 
      // needed typelibs
      importlib("actimp.tlb");
      importlib("actexp.tlb");
      importlib("thlo.tlb");
 
      [
      uuid(2573F891-CFEE-101A-9A9F-00AA00342820),
      aggregatable
      ]
      coclass CHello
   {
   cotype THello;
   };
  };
 
 
  #include "ipfix.hxx"
 
  extern HANDLE hEvent;
 
  class CHello : public CHelloBase
  {
  public:
      IPFIX(CLSID_CHello);
 
      CHello(IUnknown *pUnk);
      ~CHello();
 
      HRESULT  __stdcall PrintSz(LPWSTR pwszString);
 
  private:
      static int cObjRef;
  };
 
 
  #include <windows.h>
  #include <ole2.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include "thlo.h"
  #include "pshlo.h"
  #include "shlo.hxx"
  #include "mycls.hxx"
 
  int CHello::cObjRef = 0;
 
  CHello::CHello(IUnknown *pUnk) : CHelloBase(pUnk)
  {
      cObjRef++;
      return;
  }
 
  HRESULT  __stdcall  CHello::PrintSz(LPWSTR pwszString)
  {
      printf("%ws
", pwszString);
      return(ResultFromScode(S_OK));
  }
 
 
  CHello::~CHello(void)
  {
 
  // when the object count goes to zero, stop the server
  cObjRef--;
  if( cObjRef == 0 )
      PulseEvent(hEvent);
 
  return;
  }
 
  #include <windows.h>
  #include <ole2.h>
  #include "pshlo.h"
  #include "shlo.hxx"
  #include "mycls.hxx"
 
  HANDLE hEvent;
 
   int _cdecl main(
  int argc,
  char * argv[]
  ) {
  ULONG ulRef;
  DWORD dwRegistration;
  CHelloCF *pCF = new CHelloCF();
 
  hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
 
  // Initialize the OLE libraries
  CoInitializeEx(NULL, COINIT_MULTITHREADED);
 
  CoRegisterClassObject(CLSID_CHello, pCF, CLSCTX_LOCAL_SERVER,
      REGCLS_MULTIPLEUSE, &dwRegistration);
 
  // wait on an event to stop
  WaitForSingleObject(hEvent, INFINITE);
 
  // revoke and release the class object
  CoRevokeClassObject(dwRegistration);
  ulRef = pCF->Release();
 
  // Tell OLE we are going away.
  CoUninitialize();
 
  return(0); }
 
  extern CLSID CLSID_CHello;
  extern UUID LIBID_CHelloLib;
 
  CLSID CLSID_CHello = { /* 2573F891-CFEE-101A-9A9F-00AA00342820 */
      0x2573F891,
      0xCFEE,
      0x101A,
      { 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 }
  };
 
  UUID LIBID_CHelloLib = { /* 2573F890-CFEE-101A-9A9F-00AA00342820 */
      0x2573F890,
      0xCFEE,
      0x101A,
      { 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 }
  };
 
  #include <windows.h>
  #include <ole2.h>
  #include <stdlib.h>
  #include <string.h>
  #include <stdio.h>
  #include "pshlo.h"
  #include "shlo.hxx"
  #include "clsid.h"
 
  int _cdecl main(
  int argc,
  char * argv[]
  ) {
  HRESULT  hRslt;
  IHello        *pHello;
  ULONG  ulCnt;
  IMoniker * pmk;
  WCHAR  wcsT[_MAX_PATH];
  WCHAR  wcsPath[2 * _MAX_PATH];
 
  // get object path
  wcsPath[0] = '\0';
  wcsT[0] = '\0';
  if( argc > 1) {
      mbstowcs(wcsPath, argv[1], strlen(argv[1]) + 1);
      wcsupr(wcsPath);
      }
  else {
      fprintf(stderr, "Object path must be specified\n");
      return(1);
      }
 
  // get print string
  if(argc > 2)
      mbstowcs(wcsT, argv[2], strlen(argv[2]) + 1);
  else
      wcscpy(wcsT, L"Hello World");
 
  printf("Linking to object %ws\n", wcsPath);
  printf("Text String %ws\n", wcsT);
 
  // Initialize the OLE libraries
  hRslt = CoInitializeEx(NULL, COINIT_MULTITHREADED);
 
  if(SUCCEEDED(hRslt)) {
 
 
      hRslt = CreateFileMoniker(wcsPath, &pmk);
      if(SUCCEEDED(hRslt))
   hRslt = BindMoniker(pmk, 0, IID_IHello, (void **)&pHello);
 
      if(SUCCEEDED(hRslt)) {
 
   // print a string out
   pHello->PrintSz(wcsT);
 
   Sleep(2000);
   ulCnt = pHello->Release();
   }
      else
   printf("Failure to connect, status: %lx", hRslt);
 
      // Tell OLE we are going away.
      CoUninitialize();
      }
 
  return(0);
  }

Apprentice Hacker

  #!/usr/local/bin/perl
  $msg="Hello, world.\n";
  if ($#ARGV >= 0) {
    while(defined($arg=shift(@ARGV))) {
      $outfilename = $arg;
      open(FILE, ">" . $outfilename) || die "Can't write $arg: $!\n";
      print (FILE $msg);
      close(FILE) || die "Can't close $arg: $!\n";
    }
  } else {
    print ($msg);
  }
  1;

Experienced Hacker

  #include <stdio.h>
  #define S "Hello, World\n"
  main(){exit(printf(S) == strlen(S) ? 0 : 1);}

Seasoned Hacker

  % cc -o a.out ~/src/misc/hw/hw.c
  % a.out

Guru Hacker

  % echo "Hello, world."

New Manager

  10 PRINT "HELLO WORLD"
  20 END

Middle Manager

  mail -s "Hello, world." bob@b12
  Bob, could you please write me a program that prints "Hello, world."?
  I need it by tomorrow.
  ^D

Senior Manager

  % zmail jim
  I need a "Hello, world." program by this afternoon.

Chief Executive

  % letter
  letter: Command not found.
  % mail
  To: ^X ^F ^C
  % help mail
  help: Command not found.
  % damn!
  !: Event unrecognized
  % logout
--- cut ---

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от svu

> Вообще-то, к скриптику придется еще приделывать аутентификацию через керберос (в виде AD), управление правами и пр.

интересно, какое отношение аутентификация вообще и керберос в частности имеют к скрипту, вызывающему «/usr/bin/svnadmin create $svnroot/$user/$project» после разбора тела письма? может, я совершенно неправильно понял задачу изначально…

arsi ★★★★★
()
Ответ на: комментарий от svu

зы:

> Стар я для скриптиков. Слишком стар. Супер-стар... […] Ленюся я.

тут ещё помериться можно, кто ленивее ;) мне лениво лазить по интернетах и искать то, чего вообще может не быть, а если и найду, то придётся пол дня на чтение манов убить, а потом ещё и конфиг наподобие сендмейловского править… ленив я для этого, лучше скриптик на 10 строк напишу ;)

arsi ★★★★★
()
Ответ на: комментарий от svu

> Простое отношение - кому на Руси жить хорошо разрешить запускать этот скрипт.

ну если у народа уже есть ssh доступ то, надо полагать, вопрос авторизации уже как бы решен самим фактом доступа, нет :-?

// wbr

klalafuda ★☆☆
()


нет, ну или в конце-концов погуглить на казалось бы первое приходящее в голову 'subversion web admin' и получить что-то типа http://subversion.tigris.org/links.html а там уже, скажем, http://www.usvn.info/

User-Friendly USVN is a web interface written in PHP used to configure Subversion repositories.It's goal is to ease the creation of new projects without having to use the command line interface, therefor, maybe without privileged access to the server. USVN will then generate the list of users allowed to access your source code. This enable the delegation of rights to administrate Subversion repositories.

чем не вариант? нет, конечно, если есть какие-то особые требования к авторизации - другой вопрос. но тогда наверное их стоит озвучить.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от svu

> Простое отношение - кому на Руси жить хорошо разрешить запускать этот скрипт.

никому, кроме крона (это я о демоне таком ;) ). +указать перечень допустимых емейлов в текстовом файле или в бд. или в AD, если это так важно.

arsi ★★★★★
()
Ответ на: комментарий от klalafuda

На данный момент ssh авторизуется локально. Придется к нему керберос приделывать.

svu ★★★★★
() автор топика
Ответ на: комментарий от klalafuda

Гуглить я гуглил, а вот про usvn мне не сказали. Спасибо, посмотрю. Вообще, https у меня уже авторизуется керберосом (для самого svn), так что теоретически и usvn может получиться...

svu ★★★★★
() автор топика
Ответ на: комментарий от klalafuda

> cc -o a.out ~/src/misc/hw/hw.c

По-моему, -о тут лишняя :) По дефолту оно же и так в a.out компилит

boombick ★★★★★
()
Ответ на: комментарий от svu

usvn дурной какой-то. настаивает на аутентификации через passwd... Зачем-то еще субд пользует...

svu ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.