Skip to content

Commit 9bf4b1f

Browse files
committed
Merge pull request #2 from tschaub/dir-mtime
Update directory mtime when an item is added, removed, or renamed.
2 parents 49f7838 + 6d979d8 commit 9bf4b1f

3 files changed

Lines changed: 63 additions & 17 deletions

File tree

lib/directory.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ Directory.prototype.addItem = function(name, item) {
4242
// for subdirectory
4343
++this.links;
4444
}
45+
this.setMTime(new Date());
4546
return item;
4647
};
4748

@@ -78,6 +79,7 @@ Directory.prototype.removeItem = function(name) {
7879
// for subdirectory
7980
--this.links;
8081
}
82+
this.setMTime(new Date());
8183
return item;
8284
};
8385

readme.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ Create a factory for new files. Supported properties:
5757
* **mode** - `number` File mode (permission and sticky bits). Defaults to `0666`.
5858
* **uid** - `number` The user id. Defaults to `process.getuid()`.
5959
* **git** - `number` The group id. Defaults to `process.getgid()`.
60-
* **atime** - `Date` The last file access time. Defaults to `Date.now()`. Updated when file contents are accessed.
61-
* **ctime** - `Date` The last file change time. Defaults to `Date.now()`. Updated when file owner or permissions change.
62-
* **mtime** - `Date` The last file modification time. Defaults to `Date.now()`. Updated when file contents change.
60+
* **atime** - `Date` The last file access time. Defaults to `new Date()`. Updated when file contents are accessed.
61+
* **ctime** - `Date` The last file change time. Defaults to `new Date()`. Updated when file owner or permissions change.
62+
* **mtime** - `Date` The last file modification time. Defaults to `new Date()`. Updated when file contents change.
6363

6464
To create a mock filesystem with a very old file named `foo`, you could do something like this:
6565
```js
@@ -101,9 +101,9 @@ Create a factory for new directories. Supported properties:
101101
* **mode** - `number` Directory mode (permission and sticky bits). Defaults to `0777`.
102102
* **uid** - `number` The user id. Defaults to `process.getuid()`.
103103
* **git** - `number` The group id. Defaults to `process.getgid()`.
104-
* **atime** - `Date` The last directory access time. Defaults to `Date.now()`.
105-
* **ctime** - `Date` The last directory change time. Defaults to `Date.now()`. Updated when owner or permissions change.
106-
* **mtime** - `Date` The last directory modification time. Defaults to `Date.now()`.
104+
* **atime** - `Date` The last directory access time. Defaults to `new Date()`.
105+
* **ctime** - `Date` The last directory change time. Defaults to `new Date()`. Updated when owner or permissions change.
106+
* **mtime** - `Date` The last directory modification time. Defaults to `new Date()`. Updated when an item is added, removed, or renamed.
107107
* **items** - `Object` Directory contents. Members will generate additional files, directories, or symlinks.
108108

109109
To create a mock filesystem with a directory with the relative path `some/dir` that has a mode of `0755` and a couple child files, you could do something like this:
@@ -133,9 +133,9 @@ Create a factory for new symlinks. Supported properties:
133133
* **mode** - `number` Symlink mode (permission and sticky bits). Defaults to `0666`.
134134
* **uid** - `number` The user id. Defaults to `process.getuid()`.
135135
* **git** - `number` The group id. Defaults to `process.getgid()`.
136-
* **atime** - `Date` The last symlink access time. Defaults to `Date.now()`.
137-
* **ctime** - `Date` The last symlink change time. Defaults to `Date.now()`.
138-
* **mtime** - `Date` The last symlink modification time. Defaults to `Date.now()`.
136+
* **atime** - `Date` The last symlink access time. Defaults to `new Date()`.
137+
* **ctime** - `Date` The last symlink change time. Defaults to `new Date()`.
138+
* **mtime** - `Date` The last symlink modification time. Defaults to `new Date()`.
139139

140140
To create a mock filesystem with a file and a symlink, you could do something like this:
141141
```js

test/lib/index.spec.js

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,10 @@ describe('Mocking the file system', function() {
157157
'path/to/a.bin': new Buffer([1, 2, 3]),
158158
'empty': {},
159159
'nested': {
160-
'dir': {
161-
'file.txt': ''
162-
}
160+
'dir': mock.directory({
161+
mtime: new Date(1),
162+
items: {'file.txt': ''}
163+
})
163164
}
164165
});
165166
});
@@ -174,6 +175,18 @@ describe('Mocking the file system', function() {
174175
});
175176
});
176177

178+
it('updates mtime of parent directory', function(done) {
179+
var oldTime = fs.statSync('nested/dir').mtime;
180+
fs.rename('nested/dir/file.txt', 'nested/dir/renamed.txt', function(err) {
181+
assert.isTrue(!err);
182+
assert.isFalse(fs.existsSync('nested/dir/file.txt'));
183+
assert.isTrue(fs.existsSync('nested/dir/renamed.txt'));
184+
var newTime = fs.statSync('nested/dir').mtime;
185+
assert.isTrue(newTime > oldTime);
186+
done();
187+
});
188+
});
189+
177190
it('calls callback with error if old path does not exist', function(done) {
178191
fs.rename('bogus', 'empty', function(err) {
179192
assert.instanceOf(err, Error);
@@ -1356,27 +1369,41 @@ describe('Mocking the file system', function() {
13561369

13571370
beforeEach(function() {
13581371
mock({
1359-
'.': {}
1372+
dir: mock.directory({
1373+
mtime: new Date(1)
1374+
})
13601375
});
13611376
});
13621377
afterEach(mock.restore);
13631378

13641379
it('writes a string to a file', function(done) {
1365-
fs.writeFile('foo', 'bar', function(err) {
1380+
fs.writeFile('dir/foo', 'bar', function(err) {
13661381
if (err) {
13671382
return done(err);
13681383
}
1369-
assert.equal(String(fs.readFileSync('foo')), 'bar');
1384+
assert.equal(String(fs.readFileSync('dir/foo')), 'bar');
1385+
done();
1386+
});
1387+
});
1388+
1389+
it('updates mtime of parent directory', function(done) {
1390+
var oldTime = fs.statSync('dir').mtime;
1391+
fs.writeFile('dir/foo', 'bar', function(err) {
1392+
if (err) {
1393+
return done(err);
1394+
}
1395+
var newTime = fs.statSync('dir').mtime;
1396+
assert.isTrue(newTime > oldTime);
13701397
done();
13711398
});
13721399
});
13731400

13741401
it('writes a buffer to a file', function(done) {
1375-
fs.writeFile('foo', new Buffer('bar'), function(err) {
1402+
fs.writeFile('dir/foo', new Buffer('bar'), function(err) {
13761403
if (err) {
13771404
return done(err);
13781405
}
1379-
assert.equal(String(fs.readFileSync('foo')), 'bar');
1406+
assert.equal(String(fs.readFileSync('dir/foo')), 'bar');
13801407
done();
13811408
});
13821409
});
@@ -1840,6 +1867,10 @@ describe('Mocking the file system', function() {
18401867
beforeEach(function() {
18411868
mock({
18421869
'dir': {},
1870+
'dir2': mock.directory({
1871+
mtime: new Date(1),
1872+
items: {file: 'content here'}
1873+
}),
18431874
'file.txt': 'content'
18441875
});
18451876
});
@@ -1855,6 +1886,19 @@ describe('Mocking the file system', function() {
18551886
});
18561887
});
18571888

1889+
it('updates mtime of parent', function(done) {
1890+
var oldTime = fs.statSync('dir2').mtime;
1891+
fs.unlink('dir2/file', function(err) {
1892+
if (err) {
1893+
return done(err);
1894+
}
1895+
assert.isFalse(fs.existsSync('dir2/file'));
1896+
var newTime = fs.statSync('dir2').mtime;
1897+
assert.isTrue(newTime > oldTime);
1898+
done();
1899+
});
1900+
});
1901+
18581902
it('fails for a directory', function(done) {
18591903
fs.unlink('dir', function(err) {
18601904
assert.instanceOf(err, Error);

0 commit comments

Comments
 (0)