Маски файлов в API

Разработка Far.
User avatar
NightRoman
Posts: 5852
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

Re: Маски файлов

Post by NightRoman » Fri 02 Mar, 2012 09:00

Latest post of the previous page:

http://bugs.farmanager.com/view.php?id=1087
Еще про диалоги при ошибках в SetPanelDirectory. Не убедил. В итоге приходится самому до вызова проверять, что директория есть. В случае с хитрыми и длинными путями это еще и не так просто в Фарнет сделать. Нелепо это делать, а приходится, чтобы избегать диалога. (Авто-тесты не должны вставать из-за диалога, но это не единственная причина).

Shmuel
Posts: 5201
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

Re: Маски файлов

Post by Shmuel » Fri 02 Mar, 2012 09:09

DrKnS wrote:Мне не сильно нравится новый код возврата тем, что ProcessName как бы BOOL, и если кто-то в коде делал так: [...]
- то условие тихо и незаметно сработает и для PNR_BADMASK тоже.
Но мы же ещё не закончили слом API, поэтому можно просто задокументировать ф-цию как возвращающую int, а в changelog'е упомянуть о несовместимости. Нельзя разрулить эту ситуацию, ничего не ломая (ну не добавлять же новую функцию).

User avatar
NightRoman
Posts: 5852
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

Re: Маски файлов

Post by NightRoman » Fri 02 Mar, 2012 09:27

А я разделяю опасения DrKnS. Если просто поменять код возврата, то все будет продолжать работать, но неправильно. Это опасно, пользователи ченжлоги не читают, плагины не обновляют, ибо "вроде работает". А когда заметят, что не те файлы удалялись по маскам, будет поздно.

Давайте добавим новую функцию, а старая пусть возращает отлуп всегда. Через разумное время старую из апи убрать.

User avatar
Alexey Samlyukov
Posts: 1759
Joined: Tue 15 Mar, 2005 17:28
Been thanked: 2 times
Contact:

Re: Маски файлов

Post by Alexey Samlyukov » Fri 02 Mar, 2012 09:50

не годится. оставить одну, но в аргументах структура и код возврата int.

User avatar
NightRoman
Posts: 5852
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

Re: Маски файлов

Post by NightRoman » Fri 02 Mar, 2012 09:50

DrKnS wrote:Мне не сильно нравится новый код возврата тем, что ProcessName как бы BOOL, и если кто-то в коде делал так:

Code: Select all

if(fsf.processname(blabla))
{
   MyHadronCollider->Collapse();
}
- то условие тихо и незаметно сработает и для PNR_BADMASK тоже.

Можете считать паранойей, да.
Тогда так (в новой! функциии)

Code: Select all

enum ProcessNameReturn {
    PNR_MATCH=0,
    PNR_NOMATCH=1,
    PNR_BADMASK=2
};
Это не гарантия от краха коллайдера по ошибке, но гораздо спокойней.

User avatar
NightRoman
Posts: 5852
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

Re: Маски файлов

Post by NightRoman » Fri 02 Mar, 2012 09:52

Alexey Samlyukov wrote:не годится. оставить одну, но в аргументах структура и код возврата int.
А что будет вызываться у тех, кто не обновит плагины?

Denis
Posts: 1390
Joined: Tue 05 Apr, 2005 18:12
Has thanked: 2 times
Been thanked: 2 times

Re: Маски файлов

Post by Denis » Fri 02 Mar, 2012 09:57

Сейчас самый слом апи, так что если ломать, то лучше чем сейчас не будет :)

Shmuel
Posts: 5201
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

Re: Маски файлов

Post by Shmuel » Fri 02 Mar, 2012 10:04

Ну зачем же две функции для одного и того же? Я всё надеюсь, что слом API скоро закончится, но сейчас-то ведь можно ломать. А насчёт того, что "пользователи ченджлоги не читают" - это проблема только этих пользователей.

Есть компромиссный вариант (выше уже упоминалось) - оставить функцию как возвращающую BOOL, но добавить флаг: PN_DISABLEMESSAGEBOX или PN_ENABLEMESSAGEBOX, в зависимости от выбора поведения по умолчанию. (Лично мне этот компромисс не нравится, но он существует).

Shmuel
Posts: 5201
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

Re: Маски файлов

Post by Shmuel » Fri 02 Mar, 2012 11:17

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

Мнения?

User avatar
NightRoman
Posts: 5852
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

Re: Маски файлов

Post by NightRoman » Fri 02 Mar, 2012 11:29

Shmuel wrote:Мнения?
Вариант, да. Может и не перфектный, но может сойти.

Минус один - парсинг два раза будет делаться (сначала плуг зовет проверку, потом работу).

UPD - Точнее, на один вызов будет больше, это может и неважно, если файлов много. А если мало, то невелика потеря от лишней проверки. Так что нормальный вариант, а минус небольшой.
Last edited by NightRoman on Fri 02 Mar, 2012 11:34, edited 1 time in total.

Shmuel
Posts: 5201
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

Re: Маски файлов

Post by Shmuel » Fri 02 Mar, 2012 11:34

Кстати, последнее решение может обойтись даже без дополнительного кода операции: если второй параметр передан как NULL, считать это операцией проверки маски.

User avatar
DrKnS
Posts: 4609
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 121 times
Contact:

Re: Маски файлов

Post by DrKnS » Fri 02 Mar, 2012 11:56

Shmuel wrote:Мнения?
Флаги.

PN_SHOWERRORMESSAGE - показать сообщение, если маска не взлетела.
PN_VERBOSERESULT - вернуть подробный результат - <совпало/не совпало/кривая маска/тут_что_нибудь_еще_потом>

По умолчанию сообщения нет и результат булевый.

Shmuel
Posts: 5201
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

Re: Маски файлов

Post by Shmuel » Fri 02 Mar, 2012 12:08

DrKnS wrote:Флаги.

PN_SHOWERRORMESSAGE - показать сообщение, если маска не взлетела.
PN_VERBOSERESULT - вернуть подробный результат - <совпало/не совпало/кривая маска/тут_что_нибудь_еще_потом>

По умолчанию сообщения нет и результат булевый.
Не очень-то понял. Вам не нравится моё последнее предложение? Почему?

Это, конечно, тоже годится, типа подсовывать какое-то имя "abc" вторым параметром, указывая PN_VERBOSERESULT только для того, чтобы проверить маску, но выглядит несколько криво. Но да ладно, красота - не главное, важно, что плагин получает полный контроль над ситуацией.
Last edited by Shmuel on Fri 02 Mar, 2012 12:26, edited 1 time in total.

User avatar
DrKnS
Posts: 4609
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 121 times
Contact:

Re: Маски файлов

Post by DrKnS » Fri 02 Mar, 2012 12:21

Shmuel wrote: Не очень-то понял. Вам не нравится моё последнее предложение? Почему?
Перечитал еще раз - нравится.
При проверке только результат возвращать и дальше плагин сам, или пусть фар опционально сообщение показывает?

Shmuel
Posts: 5201
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

Re: Маски файлов

Post by Shmuel » Fri 02 Mar, 2012 12:28

Можно и так, и так (если сообщение опционально).

User avatar
NightRoman
Posts: 5852
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

Re: Маски файлов

Post by NightRoman » Fri 02 Mar, 2012 12:51

Но все-таки на один парсинг будет больше. Может, все же одним вызовом все и решать - и работу (match|not-match), и проверку на валидость?

Shmuel
Posts: 5201
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

Re: Маски файлов

Post by Shmuel » Fri 02 Mar, 2012 13:08

NightRoman wrote:Но все-таки на один парсинг будет больше. Может, все же одним вызовом все и решать - и работу (match|not-match), и проверку на валидость?
Фар делает парсинг маски при каждом вызове ProcessName. Какая разница, будет сделан парсинг 1000 раз или 1001 ? А случай, когда надо проверять один-единственный файл, в любом случае отработает быстро, так стоит ли экономить на спичках?

Post Reply

Return to “Development”