Страница 1 из 2
скачать с perforce.freebsd.org
Добавлено: 2008-09-11 13:34:11
Гость
Поскольку ни p4web.freebsd.org, ни perforce.freebsd.org не предаставляют возможности скачать архив как это можно сделать, например, во фронтенде к git, я попробовал скачать пофайлово с помощью
p4fetch.rb. Все было бы прекрасно, но p4fetch.rb затыкается на пустом месте с
Unknown error: 0:
Код: Выделить всё
% ./p4fetch.rb --depot //depot/user/pjd/ --repo zfs
fetch: http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/bin/date/extern.h&REV=1: Connection reset by peer
fetch: http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/bin/date/netdate.c&REV=1: Unknown error: 0
fetch: http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/bin/date/vary.c&REV=1: Unknown error: 0
fetch: http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/bin/date/vary.h&REV=1: Unknown error: 0
/usr/local/lib/ruby/1.8/net/protocol.rb:133:in `sysread': Connection reset by peer (Errno::ECONNRESET)
from /usr/local/lib/ruby/1.8/net/protocol.rb:133:in `rbuf_fill'
from /usr/local/lib/ruby/1.8/timeout.rb:62:in `timeout'
from /usr/local/lib/ruby/1.8/timeout.rb:93:in `timeout'
from /usr/local/lib/ruby/1.8/net/protocol.rb:132:in `rbuf_fill'
from /usr/local/lib/ruby/1.8/net/protocol.rb:116:in `readuntil'
from /usr/local/lib/ruby/1.8/net/protocol.rb:126:in `readline'
from /usr/local/lib/ruby/1.8/net/http.rb:2020:in `read_status_line'
from /usr/local/lib/ruby/1.8/net/http.rb:2009:in `read_new'
... 16 levels...
from /home/blah/p4fetch.rb:104:in `fetch_files'
from /home/blah/p4fetch.rb:102:in `each'
from /home/blah/p4fetch.rb:102:in `fetch_files'
from /home/blah/p4fetch.rb:148
вывод с verbose:
http://pastebin.com/m1db2ef81
Пробовал увеличить таймаут в /usr/local/lib/ruby/1.8/net/protocol.rb:133, но не помогло. Есть кто со знанием ruby? В чем может быть проблема?
Или как иначе тестировать zfs (version 13) и новый usb стэк? Они же ведь не экспортируются в p4-cvs-all на cvsup1{0,8}.freebsd.org.
ps, Обещанное избавление от perforce в пользу svn так и не случилось. А мне просто надоело мерджить изменения в локалную версию zfs_20080727.patch.bz2 (баг с insmntque() меня добил).
Re: скачать с perforce.freebsd.org
Добавлено: 2008-09-11 13:36:39
Alex Keda
ну, пару месяцев назад я тоже мучал эту хреновину.
из 10 попыток один раз скачала нормально =(((
причн тоже не понял - не знаю я всех этих африканских языков программирования...
Re: скачать с perforce.freebsd.org
Добавлено: 2008-09-11 13:59:17
Гость
lissyara писал(а):не знаю я всех этих африканских языков программирования...
а переписать на любимом ЯП не пробовал? Без опыта написание прохождения всех папок рекурсивно и сбор файлов у мя не получилось. Че-то я хз как манипулировать списками в sh(1).
Есть кто-то, кому не сложно?
Re: скачать с perforce.freebsd.org
Добавлено: 2008-09-11 14:22:33
zg
find может пройти рекурсивно и выбрать только то, что нужно, дажи изобретатить ничего не надо
Re: скачать с perforce.freebsd.org
Добавлено: 2008-09-11 14:49:59
Гость
zg писал(а):find может пройти рекурсивно и выбрать только то, что нужно, дажи изобретатить ничего не надо
fts(3), который используется в find для прохождения иерархии файлов, не понимает html. Чтобы он понял, нужен слой трансляции в виде fuse-модуля и парсера html.
Re: скачать с perforce.freebsd.org
Добавлено: 2008-09-11 16:29:25
Гость
lissyara писал(а):из 10 попыток один раз скачала нормально =(((
поставил
sleep 1[?] перед fetch(1) и те файлы скачались без проблем
теперь осталось догадаться к какой svn-ревизии они относятся, чтобы сгенерить патч
Re: скачать с perforce.freebsd.org
Добавлено: 2008-09-11 16:46:26
zg
Гость писал(а):zg писал(а):find может пройти рекурсивно и выбрать только то, что нужно, дажи изобретатить ничего не надо
fts(3), который используется в find для прохождения иерархии файлов, не понимает html. Чтобы он понял, нужен слой трансляции в виде fuse-модуля и парсера html.
да всё он может и понимает, ты скажи чего тебе надо
Re: скачать с perforce.freebsd.org
Добавлено: 2008-09-11 17:21:51
Гость
zg писал(а):да всё он может и понимает, ты скажи чего тебе надо
скачать рекурсивно //depot/user/pjd/zfs и //depot/projects/usb для начала
ps, у мя нет login'а ни на p4, ни на freefall.
Re: скачать с perforce.freebsd.org
Добавлено: 2008-09-11 17:30:23
zg
Гость писал(а):скачать рекурсивно //depot/user/pjd/zfs и //depot/projects/usb для начала
нда, клёво объяснил

рекурсивно качать может и wget, только что-то http тут не видать... ты скажи от куда чего брать, и что куда пихать, а то я ./p4fetch.rb вижу впервые.
Re: скачать с perforce.freebsd.org
Добавлено: 2008-09-11 19:05:49
Гость
zg писал(а):нда, клёво объяснил

рекурсивно качать может и wget, только что-то http тут не видать...
это пути в
p4. Perforce - это то место, где идет разработка FreeBSD перед тем как она попадает в HEAD (8-CURRENT).
//depot/user/pjd/zfs/ -
на perforce.freebsd.org |
на p4web.freebsd.org
//depot/projects/usb/ -
на perforce.freebsd.org |
на p4web.freebsd.orgzg писал(а):ты скажи от куда чего брать, и что куда пихать, а то я ./p4fetch.rb вижу впервые.
директории там идут после подзаголовка Subdirs, а файлы после подзаголовка Files:
Код: Выделить всё
<P><b>Subdirs</b>
...
<a href="/depotTreeBrowser.cgi?FSPC=//depot/user/pjd/zfs/bin&HIDEDEL=YES">/bin</a><br>
<a href="/depotTreeBrowser.cgi?FSPC=//depot/user/pjd/zfs/cddl&HIDEDEL=YES">/cddl</a><br>
<a href="/depotTreeBrowser.cgi?FSPC=//depot/user/pjd/zfs/contrib&HIDEDEL=YES">/contrib</a><br>
<a href="/depotTreeBrowser.cgi?FSPC=//depot/user/pjd/zfs/crypto&HIDEDEL=YES">/crypto</a><br>
...
<P><b>Files</b>
...
<a href="fileLogView.cgi?FSPC=//depot/user/pjd/zfs/COPYRIGHT">COPYRIGHT</a><br>
<a href="fileLogView.cgi?FSPC=//depot/user/pjd/zfs/KNOWN%5fPROBLEMS">KNOWN_PROBLEMS</a><br>
<a href="fileLogView.cgi?FSPC=//depot/user/pjd/zfs/LOCKS">LOCKS</a><br>
<a href="fileLogView.cgi?FSPC=//depot/user/pjd/zfs/LOR">LOR</a><br>
<a href="fileLogView.cgi?FSPC=//depot/user/pjd/zfs/MAINTAINERS">MAINTAINERS</a><br>
...
Прямые ссылки на файлы получаются, если заменить fileLogView.cgi на fileDownLoad.cgi и добавлением номера ревизии в конец. Таким образом и выкачиваются все файлы:
Код: Выделить всё
% ps lwwp `pgrep fetch`
UID PID PPID CPU PRI NI VSZ RSS MWCHAN STAT TT TIME COMMAND
1001 32318 31667 0 44 0 9724 2192 sbwait S 6 0:00.00 /usr/bin/fetch -q -a -w5 -o zfs/zfs/cddl/contrib/opensolaris/lib/libdtrace/common/dt_dof.c http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/cddl/contrib/opensolaris/lib/libdtrace/common/dt%5fdof.c&REV=1
Re: скачать с perforce.freebsd.org
Добавлено: 2008-09-11 20:01:49
zg
гуд, ща чего-нить сваяем

Re: скачать с perforce.freebsd.org
Добавлено: 2008-09-11 20:44:27
Гость
- p4fetch.rb качает кадждый файл отдельным процессом последовательно
если будешь реализовывать скачку не в самом скрипте, а внешней прогой, то попробуй ей скормить несколько файлов и запустить несколько инстанций этой проги. Должно увеличить общую скорость скачки.
- p4fetch.rb не следит за ревизиями файлов, а поскольку ни на дату, ни на размер ссылки передаваемой нельзя полагаться, то этот скрипт качает каждый файл заново
зная чуток как сей веб-фронтенд позволяет скачивать и просматривать ревизии (fileLogView.cgi), можно сделать простой маппинг в специально отведенном файле, напр., vary.h&REV=1 и при следующем запуске не скачивать vary.h, если ссылка на него содержит &REV=1, но скачать, если содержит &REV=2
Re: скачать с perforce.freebsd.org
Добавлено: 2008-09-11 21:18:54
Гость
Гость писал(а):fileLogView.cgi
его даже не обязательно трогать, т.к. depotTreeBrowser.cgi уже выдает номера последних ревизий
Код: Выделить всё
<a href="fileLogView.cgi?FSPC=//depot/user/pjd/zfs/MAINTAINERS">MAINTAINERS</a><font color=#808080> #</font><a href="fileViewer.cgi?FSPC=//depot/user/pjd/zfs/MAINTAINERS&REV=3">3</a></td>
//depot/user/pjd/zfs/MAINTAINERS&REV=3
ps, вообщем, надеюсь твоя реализация не будет такой медленной как p4fetch.rb
Re: скачать с perforce.freebsd.org
Добавлено: 2008-09-11 21:19:59
paradox
в портах есть утилиты
правда они все бинарные и написаны под 4x
поэтому compat еще стянеться
попробуйте ее помучать
там вроде и для админа и для юзера утилиты
Re: скачать с perforce.freebsd.org
Добавлено: 2008-09-11 21:45:14
Гость
paradox писал(а):там вроде и для админа и для юзера утилиты
а если нет аккаунта? насколько мне известно perforce не поддерживает anonymous access, web-frontend - исключение.
Re: скачать с perforce.freebsd.org
Добавлено: 2008-09-11 22:02:58
paradox
а если нет аккаунта? насколько мне известно perforce не поддерживает anonymous access
хз
это токо мысли
у меня у самого нехватило терпения даже утилиты скачать)
Re: скачать с perforce.freebsd.org
Добавлено: 2008-09-11 22:09:52
zg
Гость писал(а):ps, вообщем, надеюсь твоя реализация не будет такой медленной как p4fetch.rb
ишь какой шустрый
Код: Выделить всё
#!/bin/sh
DEPOT=//depot/user/pjd/zfs/games/
HTTP_PREFIX=http://perforce.freebsd.org/
LINK1="http://perforce.freebsd.org/depotTreeBrowser.cgi?FSPC=${DEPOT}&HIDEDEL=YES"
cd `dirname "$0"`
TMP1='temp1.txt'
TMP2='temp2.txt'
DIRS_STORAGE='dirs.txt'
FILES_STORAGE='files.txt'
#rm -f "${DIRS_STORAGE}" "${FILES_STORAGE}"
HEAD1="Subdirs"
HEAD2="Files"
LINKS="${LINK1}"
SEARCH1='fileViewer.cgi\?FSPC=//[^\"]+'
SEARCH2='depotTreeBrowser.cgi\?FSPC=//[^\"]+'
download_page() {
wget -O "$2" -o "$3" "$1"
return $?
}
parse_page() {
grep -oE "${HEAD1}|${HEAD2}|${SEARCH1}|${SEARCH2}" $1 | \
awk -F. -v dirsSection="${HEAD1}" -v filesSection="${HEAD2}" 'BEGIN{
addDirs = 0;
addFiles = 0;
}{
#print $1;
if ( $1 == "depotTreeBrowser" && addDirs ) dirs[i++]=$0;
else if ( $1 == "fileViewer" && addFiles ) files[i++]=$0;
else if ( $1 == dirsSection ) addDirs = 1;
else if ( $1 == filesSection ) addFiles = 1;
}
END{
#print "Subdirs";
for(i in dirs) print dirs[i];
#print "Files"
for(i in files) print files[i];
}'
}
get_files() {
grep 'fileViewer' $1 | sed "s~fileViewer~${HTTP_PREFIX}fileDownLoad~g"
}
get_subdirs() {
grep 'depotTreeBrowser' $1 | sed "s~depotTreeBrowser~${HTTP_PREFIX}depotTreeBrowser~g"
}
while true
do
echo -n > "${DIRS_STORAGE}"
for I in ${LINKS}
do
echo -n "`echo \"${I}\" | grep -oE '//depot[^&]+'` ... " 1>&2
download_page "${I}" "${TMP1}" "${TMP2}"
if [ $? -ne 0 ]; then
echo 'fail' 1>&2
cat "${TMP2}" 1>&2
exit 1
fi
parse_page "${TMP1}" > "${TMP2}"
get_files "${TMP2}"
get_subdirs "${TMP2}" >> "${DIRS_STORAGE}"
echo " done" 1>&2
done
if [ -z "`head -n 1 ${DIRS_STORAGE}`" ]; then
echo "Downloading complete!" 1>&2
break
fi
LINKS="`sort ${DIRS_STORAGE}`"
done
rm -f "${TMP1}" "${TMP2}" "${DIRS_STORAGE}"
примерно так
Код: Выделить всё
zg# ./1.sh > files.txt
//depot/user/pjd/zfs/games/ ... done
//depot/user/pjd/zfs/games/bcd ... done
//depot/user/pjd/zfs/games/caesar ... done
//depot/user/pjd/zfs/games/factor ... done
//depot/user/pjd/zfs/games/fortune ... done
//depot/user/pjd/zfs/games/grdc ... done
//depot/user/pjd/zfs/games/morse ... done
//depot/user/pjd/zfs/games/number ... done
//depot/user/pjd/zfs/games/pom ... done
//depot/user/pjd/zfs/games/ppt ... done
//depot/user/pjd/zfs/games/primes ... done
//depot/user/pjd/zfs/games/random ... done
//depot/user/pjd/zfs/games/fortune/datfiles ... done
//depot/user/pjd/zfs/games/fortune/fortune ... done
//depot/user/pjd/zfs/games/fortune/strfile ... done
//depot/user/pjd/zfs/games/fortune/tools ... done
//depot/user/pjd/zfs/games/fortune/unstr ... done
Downloading complete!
zg# head -n 10 files.txt
http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/games/Makefile&REV=1
http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/games/Makefile.inc&REV=1
http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/games/bcd/bcd.c&REV=1
http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/games/bcd/Makefile&REV=1
http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/games/bcd/bcd.6&REV=1
http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/games/caesar/caesar.c&REV=1
http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/games/caesar/rot13.sh&REV=1
http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/games/caesar/Makefile&REV=1
http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/games/caesar/caesar.6&REV=1
http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/games/factor/factor.c&REV=1
zg#
закачку файлов я не делал, ссылки просто складываются в files.txt
коментарии

?
Re: скачать с perforce.freebsd.org
Добавлено: 2008-09-11 22:18:26
paradox
если я неошибаюсь то бучер юзает перфорс
напиши ему на меил или в личку
думаю он поможет
Re: скачать с perforce.freebsd.org
Добавлено: 2008-09-11 22:32:17
Alex Keda
чем? логином поделиться?

))
или раз скачает чего надо?
=====
гость прав в общем - надо или нормальный интерфейс или нормальную утилиту...
Re: скачать с perforce.freebsd.org
Добавлено: 2008-09-11 22:34:06
zg
lissyara писал(а):гость прав в общем - надо или нормальный интерфейс или нормальную утилиту...
в принципе закачку можно распаралелить потоков на 10, особых сложностей не должно быть.
Re: скачать с perforce.freebsd.org
Добавлено: 2008-09-11 23:40:51
Гость
zg писал(а):Код: Выделить всё
zg# head -n 10 files.txt
http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/games/Makefile&REV=1
http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/games/Makefile.inc&REV=1
http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/games/bcd/bcd.c&REV=1
...
это хде? единственное место, где у тя упоминается $FILES_STORAGE - FILES_STORAGE='files.txt'. Забыл добавить перенаправление в
get_files "${TMP2}"
и зачем
cd `dirname "$0"` почти в самом начале? и без него работает
ps, спасибо за алгоритм на sh/awk. Сыровато, но интересно.
Re: скачать с perforce.freebsd.org
Добавлено: 2008-09-12 0:33:21
Гость
zg писал(а):в принципе закачку можно распаралелить потоков на 10, особых сложностей не должно быть.
аха:
sed "s|.*FSPC=//depot/user/pjd/zfs/games/\(.*\)&REV=.*|'&' -o '\1'|" files.txt | xargs -P3 -L24 curl --create-dirs
но что делать с процентами в именах файлов? wget/curl/fetch их умеют превращать обратно в человеческий вид?
Re: скачать с perforce.freebsd.org
Добавлено: 2008-09-12 7:03:33
zg
Гость писал(а):это хде? единственное место, где у тя упоминается $FILES_STORAGE - FILES_STORAGE='files.txt'. Забыл добавить перенаправление в get_files "${TMP2}"
это в
zg писал(а):zg# ./1.sh > files.txt
перенаправить не забыл, просто решил сделать в stdout, чтобы конвеер можно было варганить.
Гость писал(а):и зачем cd `dirname "$0"` почти в самом начале? и без него работает
чтоб текущим каталогом всегда был тот, где лежит этот файл. Иначе, если вызвать скрипт из корня по абсолютному пути, вся относительность потеряется.
Гость писал(а):единственное место, где у тя упоминается $FILES_STORAGE - FILES_STORAGE='files.txt'
его можно убрать, это только для теста было. Список файлов выводится в STDOUT, сообщения о закачке в STDERR.
Гость писал(а):но что делать с процентами в именах файлов? wget/curl/fetch их умеют превращать обратно в человеческий вид?
да там впринципе только один символ кодируется _ %5f, его можно и седом подменить
я тут подумал, что если построить вывод файлов в сокет, то можно сделать непрерывную закачку в несколько потоков, если же делать через конвеер, то закачка будет прерываться, чтобы ждать пока потоки докачаются, чтобы начать новые.
Re: скачать с perforce.freebsd.org
Добавлено: 2008-09-12 10:15:54
paradox
>lissyara
поделиться советом как по нормальному скачать
я очень сомневаюсь что нет нормальных утилит(способов)
и что нужен логин пассворд для доступа к перфорсу других юзеров
Re: скачать с perforce.freebsd.org
Добавлено: 2008-09-12 13:01:42
Гость
zg писал(а):да там впринципе только один символ кодируется _ %5f, его можно и седом подменить
я поступил проще: выкинул все из parse_page() и вставил всего лишь
Код: Выделить всё
sed -nE "/Show deleted files/d
s|.*(fileLogView.cgi\?FSPC=//[^\"]+)\">([^<]+)<.*|\1 '\2'|p
s|.*(depotTreeBrowser.cgi\?FSPC=//[^\"]+)\">|\1|p" $1
На выходе получил точно такой же список с возможностью использовать безпроцентное имя.
Код: Выделить всё
http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/games/random/random.c 'random.c'
http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/games/random/randomize%5ffd.c 'randomize_fd.c'
http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/games/random/randomize%5ffd.h 'randomize_fd.h'
http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/games/fortune/datfiles/Makefile 'Makefile'
http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/games/fortune/datfiles/fortunes 'fortunes'
http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/games/fortune/datfiles/fortunes%2do.fake 'fortunes-o.fake'
http://perforce.freebsd.org/fileDownLoad.cgi?FSPC=//depot/user/pjd/zfs/games/fortune/datfiles/fortunes%2do.real 'fortunes-o.real'
Можно еще избавиться от get_*(), если в конце добавить:
Код: Выделить всё
sed -nE "
...
/fileLogView/w $FILES_STORAGE
/depotTreeBrowser/w $DIRS_STORAGE
" $1
но у мя че-то sed не хочет писать в файлы.
zg писал(а):я тут подумал, что если построить вывод файлов в сокет, то можно сделать непрерывную закачку в несколько потоков, если же делать через конвеер, то закачка будет прерываться, чтобы ждать пока потоки докачаются, чтобы начать новые.
А почему сие нельзя реализовать через FIFO? while-loop следит за кол-вом процессов и если их меньше 4, то запускает последовательно (или параллельно с
&), чтобы их стало ровно 4. А эти процессы тупо читают из pipe-файла 10 строк и не более.
По-моему сокеты нужны только там, где требуется двустороннее общение. Но мы же будем управлять процессами из того же скрипта, из которого же генерировать поток в FIFO, или нет?