Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

Fixes for #16, #60 #62

Closed
wants to merge 2 commits into from

2 participants

@szarouski

Fixes #16, #60
The issue #16 occurs when you save parent and child templates interchangeably.
The issue #60 happens when you use ect together with koajs

szarouski and others added some commits
@szarouski szarouski Add automatic root path detection
When root path not set we can still try to get it from first template passed into render function.
d02f9e5
Serge-Z Fix for case when fs.watch is called twice ab10bec
@szarouski

Please let me know if it all make sense or if you need any clarification, or maybe if I should just close the issue? Thank you.

@szarouski

Ping :)

@szarouski

Вадим, я понимаю что бывает со временем напряг. Уделите минутку плиз - можете хотя бы фикс для #16 принять или я что-то не так делаю/понимаю?

@baryshev
Owner

Да, сейчас со временем совсем напряг, поэтому так долго не могу добраться. Извиняюсь.
По повду изменений, я сомневаюсь в исправлении #16 таким образом.
Суть этого алгоритма:

Мы читаем файл
Он парсится и кешируется
При включенном watcher мы создаем объект fs.FSWatcher который следит за файлом и ссылку на него кладем в хеш watchers
Если файл изменился срабатывает callback. На его вызов нужен только 1 раз. Мы скидываем кеш и убираем watcher из хеша. Ссылка на этот объект нам больше не нужна, и GC сможет очистить его, когда это понадобится. Данный объект fs.FSWatcher больше не работает.
Если файл понадобится снова (его не удалили, а поменяли), то цикл выполнится сначала.

В данном случае, удаление строки delete (watchers[file]); привдёт только к тому, что у нас в хеше будет оставаться ссылка на не действующий объект fs.FSWatcher и GC не сможет его удалить. Суть проблемы, насколько я понимаю, в том, что 2 события FS попадают в 1 tick. Думаю сначала стоит попробовать вынести удаление watchers[file] на следующий tick через setTimeout(..., 0);

По поводу второго пулреквеста, посмотрю чуть позже, нужно вникнуть более детально.

@baryshev
Owner

Я залил версию с удалением fs.FSWatcher на следующем тике.

@szarouski

Спасибо за ответ. Не обращайте пожалуйста на второй пул реквест внимания, я его закрою - там есть гораздо проще решение, которое не требует никаких изменений, это я запутался. По поводу нового фикса я отпишу в #16 - у меня все ещё есть проблема.

@szarouski szarouski closed this
@szarouski

Похоже если файл не кешируется то ссылка на него пропадает. Я не кешировал файлы для dev environment, cache: true помогло. Спасибо.

@baryshev
Owner

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

@szarouski

Вам спасибо, замечательная библиотека. А скажите, вы вэб-сторм не пользуете, может как-то решаете там проблему с миксом синтаксисов html/ect?

@baryshev
Owner

Использую IDEA. Плагинов для eco-синтаксиса для неё вроде нет. Мне это почти не мешает. Просто конструкции ect не подсвечиваются внутри html.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Feb 28, 2014
  1. @szarouski

    Add automatic root path detection

    szarouski authored
    When root path not set we can still try to get it from first template passed into render function.
Commits on Mar 4, 2014
  1. Fix for case when fs.watch is called twice

    Serge-Z authored
This page is out of date. Refresh to see the latest.
Showing with 10 additions and 5 deletions.
  1. +9 −4 lib/ect.js
  2. +1 −1  package.json
View
13 lib/ect.js
@@ -1,5 +1,5 @@
/*!
- * ECT CoffeeScript template engine v0.5.6
+ * ECT CoffeeScript template engine v0.5.7
* https://github.com/baryshev/ect
*
* Copyright 2012-2013, Vadim M. Baryshev <vadimbaryshev@gmail.com>
@@ -354,7 +354,6 @@
if (ect.options.watch) {
watchers[file] = fs.watch(file, { persistent: false }, function () {
watchers[file].close();
- delete (watchers[file]);
delete (cache[template]);
});
}
@@ -404,7 +403,13 @@
};
this.render = function (template, data, callback) {
- var context;
+ var context,
+ rootPath;
+ //set root in case it wasn't set to anything
+ //note assignment to rootPath
+ if (!this.options.root && (rootPath = path.dirname(template))) {
+ this.options.root = rootPath;
+ }
if (typeof arguments[arguments.length - 1] === 'function') {
if (arguments.length === 2) {
callback = data;
@@ -692,4 +697,4 @@
}());
}
-}());
+}());
View
2  package.json
@@ -1,6 +1,6 @@
{
"name" : "ect",
- "version" : "0.5.6",
+ "version" : "0.5.7",
"description" : "CoffeeScript template engine",
"homepage" : "http://ectjs.com",
"keywords" : [ "template", "coffeescript" ],
Something went wrong with that request. Please try again.