severum
Июль 22, 2008 16:43:34
хочу проверить некоторые свойства файлов которые хотят закомитить.
делаю примерно так
def test_props(props):
if len(props)==0:
sys.stderr.write(“error…\n”)
return 1
return 0
def main(root_path, rn):
repository = svn.repos.open(root_path)
fs_ptr = svn.repos.fs(repository)
txn = svn.fs.open_txn(fs_ptr, rn)
txn_root = svn.fs.txn_root(txn)
youngest_revision_number = svn.fs.youngest_rev(fs_ptr)
root = svn.fs.revision_root(fs_ptr, youngest_revision_number)
#res = svn.fs.file_length(root, ‘')
retval = test_props(svn.fs.txn_proplist(txn))
if retval:
return retval
if __name__ == ’__main__':
sys.exit(main( os.path.abspath(sys.argv), sys.argv) )
Не уверен что делаю все это правильно.
И что то никак не догадаться как получить список файлов которые хотят закомитить чтобы потом вызвать res = svn.fs.file_length(root, path) и проверить их размер.
Заранее спасибо.
DarkAnthey
Июль 22, 2008 17:57:13
import pysvn
path = ‘TestInstaller/Plasma’
client = pysvn.Client()
client.exception_style = 1
def get_login( realm, username, may_save ):
return True, ‘XXX’, ‘***’, False
client.callback_get_login = get_login
status_list = client.status(path, recurse=True, get_all=False, update=False, ignore=False, ignore_externals=False)
severum
Июль 23, 2008 10:00:41
спасибо, а используя модуль svn-python-1.4.6.win32-py2.5 такой можно сделать, без pysvn?
попробовал pysvn, получатеся вроде даже короче но чтото не работает (говорит что “…” не рабочая копия ):)
список файлов которые хоятт закомитить получил.
import pysvn
def main(repos_path, transaction_name):
transaction = pysvn.Transaction( repos_path, transaction_name )
retval = test_props(transaction.revproplist())
if retval:
return retval
client = pysvn.Client()
client.exception_style = 1
client.callback_get_login = get_login
change_list = transaction.changed( )
for path in change_list:
status_list = client.status(path, recurse=True, get_all=False, update=False, ignore=False, ignore_externals=False)
print status_list
чтото у меня ощущение что как то не так надо делать…
например client.ls у меня сработал только когда я прописал реальный путь к папке на своей машине, а не относительный.
плюс он выдал список только уже добавленых файлов, а список еще не закомиченых не выдал.
а я хочу по списку файлов из транзакции получить их размеры при их первом добавлении.
такое можно сделать?
А client наверное должен использоваться на стороне пользователя?
Я изучаю как хуки писать.
severum
Июль 24, 2008 10:04:13
колитесь кто в svn-е понимает. :) такое вообще можно сделать?
DarkAnthey
Июль 24, 2008 14:02:58
Конечно можно. Почитай доку.
http://pysvn.tigris.org/docs/pysvn_prog_ref.html . Скажу сразу я отказался от такого подхода он не вполне быстрый )
Есть смысл подсчитывать размер демоном ложить в файл. Файл вытаскивать и смотреть размер…
Обрати особое внимание на pysvn.Client.list . Есть еще pysvn.Client.info2 но он работает на новых версиях svn.
Прими во внимание что ето diff )))
Igreh
Дек. 18, 2008 13:59:15
такой код:
# coding: utf-8
import pysvn, sys
txn = pysvn.Transaction( sys.argv, sys.argv )
ch = txn.changed()
for path in ch:
sys.stderr.write('Путь: ‘)
sys.stderr.write(path)
все бы хорошо, но когда путь до ресурса содержит русские символы - получаю ошибку: “UnicodeEncodeError: ’ascii' codec can't encode characters in position 14-18: ordinal not in range(128)”
несмотря на то, что вообще русские символы выводятся нормально(в частности: ‘Путь:’). как быть?
Ed
Дек. 18, 2008 16:21:22
Traceback покажите? Если получате уже в вашем коде, то нужно просто перекодировать.
Igreh
Дек. 19, 2008 05:39:49
Traceback ругает sys.stderr.write(path). как лучше перекодировать?
Ed
Дек. 19, 2008 21:49:14
Если svn вернул path в unicode, что скорее всего так и есть, то нужно его перекодировать в текущую локаль.
Что-нибудь типа такого: path.encode('utf-8')
Igreh
Дек. 20, 2008 08:55:30
Ed
Что-нибудь типа такого: path.encode('utf-8')
помогло, только в utf-8 вместо русских символов получаю неизвестное. а вот в cp1251 все норм. благодарю!