LINUX.ORG.RU

Подскажите по проблемке, как узнать что файл изменился?

 , ,


0

1

Доброго времени суток. Собираюсь делаю по работе одну программу(П), которая должна обеспечивать перенос значений из одной БД в другую(структуры баз идентичны). В целом это выглядит так: Есть две БД, одна у нас, и ещё одна у разработчика(назовём его «Р»). Я делаю «слепок» своей базы, этот слепок будет храниться в VCS например Mercurial или Git(не принципиально), «Р» также будет хранить «слепок» в своей VCS, время от времени мы будем делать pull из его VCS и эти изменения накатывать на нашу базу. Теперь что из себя представляет «слепок», это по сути директория с кучей текстовых файлов, которые хранят в себе текстовые значения полей из БД(у нас из нашей, у «Р» из ихней, одно значение поля в БД - один файл в директории), теперь наверно понятно зачем здесь VCS :) Моя программа будет пробегать по этому набору файлов и записывать их значения в нашу БД. Суть вопроса в том что, как я могу узнать, какой из файлов изменился? Ведь это знает VCS, но не моя программа. Или нужно как-то интегрировать программу с VCS? Есть мысли по этому поводу? :)

★★★★★

Ответ на: комментарий от resurtm

Да, забыл упомянуть, работать будет под офтопиком ) Контрольная сумма тоже наверно не поможет. Предположим что файл изменился и контрольная сумма в нём перетёрлась, соответственно мне нужно ещё где-то хранить старое значение, чтобы сверить их.

xterro ★★★★★ ()
Последнее исправление: xterro (всего исправлений: 1)
Ответ на: комментарий от Kuzz

Это всё хорошо, но все эти решения подразумевают наличие постоянного мониторинга директории с файлами. Мне бы хотелось обойтись без этого, т.е время от времени запустил программку, она пробежалась по файлам, посмотрела какие изменились, с такими и работаем.

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

Так вроде ж Change Journals управляется драйвером NTFS.
Должен бы работать независимо от запросившего мониторинг процесса

Kuzz ★★★ ()

Я нифига не понял, но почему бы программе не вызывать hg status в репозитории и парсить вывод?

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

Тем более, что у mercurial формат вывода хорошо для этого подходит:

inish777@laptop ~/hardinform/linux-daemon $ hg status
M linux-daemon/hardinform.py

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

А после pull-а из репы разработчика, такая инфа будет доступна? Я имею ввиду статус у документов в моей VCS изменится?

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

У hg status есть опция --rev, с помощью которой можно вывести список изменений начиная с определенной ревизии. Перед пуллом с помощью команды hg tip можно получить номер самой свежей ревизии в твоем репозитории и сохранить его. После пулла - hg status --rev <номер ревизии который ты сохранил>. Теоретически должно работать.

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

Пока остановился на этом варианте, посмотрю что получится )

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

Сейчас попробовал, Mercurial то после pull -а молчит как партизан, не выдаёт никакой инфы, о том что изменилось. Единственный вариант, давать команду

hg tip
на что мне вернётся типа:

changeset:   3:50a2290da85b
tag:         tip
user:        Olifiro Kirill <olkir@bk.ru>
date:        Mon Jan 28 00:55:44 2013 +0600
files:       222.txt aaa.txt test.txt
description:
4

И парсить секцию «files» :(

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

Ты точно все правильно понял?
1. Выполняешь hg tip, сохраняешь номер ревизии.
2. Делаешь hg pull.
3. Выполняешь hg status --rev <номер который ты сохранил>
4. PROFIT

netcat ★★ ()
Последнее исправление: netcat (всего исправлений: 1)
Ответ на: комментарий от netcat

Немного консольной магии, следи за руками:

[kirill@localhost ~]$ cd test/
[kirill@localhost test]$ mkdir p1
[kirill@localhost test]$ mkdir p2
[kirill@localhost test]$ cd p1/
[kirill@localhost p1]$ touch test.txt
[kirill@localhost p1]$ hg init
[kirill@localhost p1]$ hg add .
добавляю test.txt
[kirill@localhost p1]$ hg commit -m "1"
test.txt
зафиксирован набор изменений 0:c7059d623b2e
[kirill@localhost p1]$ cd ../p2/
[kirill@localhost p2]$ cd ..
[kirill@localhost test]$ hg clone p1/ p2
updating to branch default
resolving manifests
getting test.txt
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
[kirill@localhost test]$ cd p2/
[kirill@localhost p2]$ hg st
[kirill@localhost p2]$ echo "TEST" > test.txt 
[kirill@localhost p2]$ hg st
M test.txt
[kirill@localhost p2]$ hg commit -m "1"
test.txt
зафиксирован набор изменений 1:94b89c81b61a
[kirill@localhost p2]$ hg st
[kirill@localhost p2]$ cd ../p1
[kirill@localhost p1]$ hg pull -u ../p2
подтягивая из ../p2
searching for changes
all local heads known remotely
1 changesets found
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
resolving manifests
getting test.txt
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
[kirill@localhost p1]$ hg st
[kirill@localhost p1]$ 
[kirill@localhost p1]$ hg status --rev 1:94b89c81b61a
[kirill@localhost p1]$ hg status --rev 94b89c81b61a
[kirill@localhost p1]$ hg status --rev 1
[kirill@localhost p1]$ hg tip
changeset:   1:94b89c81b61a
tag:         tip
user:        xxxxxxx <olkir@bk.ru>
date:        Mon Jan 28 21:24:35 2013 +0600
files:       test.txt
description:
1


[kirill@localhost p1]$ hg log
changeset:   1:94b89c81b61a
tag:         tip
user:        xxxxxxx <olkir@bk.ru>
date:        Mon Jan 28 21:24:35 2013 +0600
files:       test.txt
description:
1


changeset:   0:c7059d623b2e
user:        xxxxxxx <olkir@bk.ru>
date:        Mon Jan 28 21:20:55 2013 +0600
files:       test.txt
description:
1

Думаю вот, может у меня версия какая-нибудь не такая(2.0), или попробовать с Git-ом...

xterro ★★★★★ ()
Последнее исправление: xterro (всего исправлений: 2)
Ответ на: комментарий от netcat
inish777@laptop ~ $ mkdir hg-test
inish777@laptop ~ $ cd hg-test/
inish777@laptop ~/hg-test $ hg init
inish777@laptop ~/hg-test $ touch fuck
inish777@laptop ~/hg-test $ hg st
? fuck
inish777@laptop ~/hg-test $ hg add .
добавляется fuck
inish777@laptop ~/hg-test $ cd ..
inish777@laptop ~ $ hg clone hg-test/ hg-test2
inish777@laptop ~ $ cd hg-test2/
inish777@laptop ~/hg-test2 $ hg log
набор изменений:  0:949d1cb99996
метка:            tip
пользователь:     Andrey Inishev <inish777@gmail.com>
дата:             Mon Jan 28 23:37:47 2013 +0800
сводка:           first

inish777@laptop ~/hg-test2 $ touch ass
inish777@laptop ~/hg-test2 $ hg add .
добавляется ass
inish777@laptop ~/hg-test2 $ hg commit -m "first"
inish777@laptop ~/hg-test2 $ hg log
набор изменений:  1:8771fabdb3b5
метка:            tip
пользователь:     Andrey Inishev <inish777@gmail.com>
дата:             Mon Jan 28 23:38:36 2013 +0800
сводка:           first

набор изменений:  0:949d1cb99996
пользователь:     Andrey Inishev <inish777@gmail.com>
дата:             Mon Jan 28 23:37:47 2013 +0800
сводка:           first

inish777@laptop ~/hg-test2 $ cd ..
inish777@laptop ~ $ cd hg-test
inish777@laptop ~/hg-test $ hg pull ../hg-test2
затягиваем из ../hg-test2
ищем изменения
добавляем наборы изменений
добавляем манифесты
добавляем изменения в файлы
добавлено 1 наборов изменений с 1 изменениями в 1 файлах
(используйте 'hg update' чтобы получить рабочую копию)
inish777@laptop ~/hg-test $ hg update
1 файлов обновлено, 0 слито, 0 удалено, 0 c конфликтами
inish777@laptop ~/hg-test $ hg st --rev 0
A ass
netcat ★★ ()
Ответ на: комментарий от xterro

Стоп.

hg status --rev 1:94b89c81b61a

Вот оно что. Самая новая ревизия в репозитории была 0. Ты обновился до ревизии 1. Чтобы узнать, что произошло с ревизии 0, ты должен выполнить hg status --rev 0

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

О, сейчас получилось, он показал, что файл txt.txt модифицирован. Спасибо ) Т.е получается, нужно всегда получать статус ревизии, которая на единицу меньше головной

xterro ★★★★★ ()
Последнее исправление: xterro (всего исправлений: 1)
Ответ на: комментарий от xterro

Т.е получается, нужно всегда получать статус ревизии, которая на единицу меньше головной

НЕТ! Допустим у тебя ревизия 2. А разработчик ускакал на ревизию 9000. Обновился, hg status --rev 8999 и fail, потому что тебе, если я не ошибаюсь, нужно получить список измененных файлов с момента *последнего обновления*. Т.е. hg status --rev 2

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

В принципе нет, можно и последнюю ревизию, т.к содержимым файла в «слепке» я буду полностью заменять значение в базе. Поэтому в принципе всё равно что там наколбасил разработчик и сколько у него ревизий, я возьму всё целиком из файла и запишу в БД. Здесь CVS по сути мне нужна лишь для того, чтобы отследить в каких файлах были изменения, а что там конкретно изменилось уже не так важно. Что конкретно изменилось я буду смотреть какой-нибудь утилиткой типа meld и если что не так, мержить перед заливкой в базу.

xterro ★★★★★ ()
Последнее исправление: xterro (всего исправлений: 1)
Ответ на: комментарий от xterro

Здесь CVS по сути мне нужна лишь для того, чтобы отследить в каких файлах были изменения

Вот именно поэтому тебе и нужно делать так, как я говорю. Разработчик в ревизии 1 изменил файл x, в ревизии 2 файл y, а в 3 ревизии файл z. Обновившись с ревизии 0 до ревизии 3 и выполнив hg status --rev 2, ты узнаешь только об изменении файла z.

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