File: NEWS

package info (click to toggle)
pytagsfs 0.9.2-6
  • links: PTS, VCS
  • area: main
  • in suites: buster, jessie, jessie-kfreebsd, stretch, wheezy
  • size: 984 kB
  • ctags: 1,858
  • sloc: python: 10,656; xml: 543; makefile: 47
file content (894 lines) | stat: -rw-r--r-- 32,790 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
======================
pytagsfs Release Notes
======================

.. contents::


pytagsfs 0.9.2 2009-12-27
=========================

 * Fixed pytagsfs manpage references to format string variables "number",
   "NUMBER".  The correct variable names are "tracknumber", "TRACKNUMBER".
   Thanks to Sebastian Pipping for the report.
   (Forest Bond)


pytagsfs 0.9.2rc2 2009-12-06
============================

 * Added missing encode calls in SourceTree methods isreadable, issymlink,
   lstat, and utime.
   (Forest Bond)

 * Fixed bad assumption in tests.blackbox that a subprocess failed if it
   produced output on stderr.
   (Forest Bond)

 * Added dependencies for running test suite to README.
   (Forest Bond)


pytagsfs 0.9.2rc1 2009-12-05
============================

 * Fixed AttributeError on getattr due to missing Stat attributes and
   interaction with python-fuse bugs.  The presence of this issue is dependent
   on python-fuse version, but the implemented fix should be compatible with
   many.  The exception would likely occur on the filesystem operation following
   the getattr call due to python-fuse bugs.
   
   This bug could lead to data corruption if files are opened for writing, but
   problems would likely be seen before that point.

   (Forest Bond)

 * Fixed AttributeError on open due to missing FileInfo attribute (a bug in
   python-fuse).  The exception would likely occur on the filesystem operation
   following the open call due to python-fuse bugs.
   
   This bug could lead to data corruption if files are opened for writing, but
   problems would likely be seen before that point.

   (Forest Bond)

 * Fixed unmatched increment/decrement count for frozen paths.  This would
   manifest itself as follows:
   
    - KeyErrors may be seen in the log.
    - Writes may fail in situations where multiple processes are attempting to
      write to the same file concurrently.
    - A virtual path may persist after a file is modified such that the path
      should change.

   This could possibly lead to data corruption if the a virtual file is opened
   for writing by more than one process simultaneously.  In that case,
   inconsistent data is likely in the absence of this bug.

   (Forest Bond)

 * util/profile: Added benchmark read_all_concurrent.
   (Forest Bond)

 * ``TestLinesMetaStore`` was modified to support a data section.  All bytes
   after the last newline character in the file are treated as arbitrary data.
   (Forest Bond)

 * util/profile: Files are now created with a data section of arbitrary size
   that can be specified with command-line options --blocksize, --nblocks.
   These default to 1024 and 200, respectively.
   (Forest Bond)

 * Implemented the beginnings of a token-style locking mechanism (this doesn't
   appear to be widely used -- maybe I invented it).  At present, this
   effectively implements a global lock such that most pytagsfs code need not be
   thread safe, but will evolve to allow limited multithreading through
   judicious token releases around blocking I/O.  This resolves serious
   deadlocks resulting from locking calls scattered throughout pytagsfs code.

   It is possible that these deadlocks could have resulted in data corruption
   since the filesystem could have deadlocked with files opened for writing,
   but only in situations where the filesystem was being accessed concurrently,
   in which case a deadlock is likely before the user has a chance to open a
   file for writing.

   (Forest Bond)

 * Removed a variety of locks that were rendered useless by the introduction of
   token-style locking.
   (Forest Bond)

 * Extended token-style locking with the addition of tokens that protect
   specific data structures.  This improves performance by exchanging the global
   token for a secondary one around code sections that would cause a thread to
   block on I/O.
   (Forest Bond)

 * Debug logging of filesystem operations no longer includes method arguments
   or return values that are too large to justify logging them.  This improves
   performance with debug logging enabled.
   (Forest Bond)

 * Introduced FUSE option max_readahead=0.  This has no impact on OS X because
   MacFUSE-specific option noreadahead was already being used.
   
   Since the underlying source files can change at any time, no in-kernel
   caching can be permitted.  Otherwise, reads may return old data.  This makes
   read performance worse by a factor of about two on my machine (but
   correctness is more important than performance by a factor of greater than
   two ;).

   The previous behavior could lead to data inconsistencies if a virtual file
   and its corresponding real file were being written to simultaneously.
   However, data inconsistencies would occur under those circumstances even in
   the absence of this issue.

   (Forest Bond)

 * Symlinks in the source tree are now completely ignored.  Previously, they
   were represented as virtual symlinks but readlink calls would fail.  In the
   future, we'd like to follow symlinks and handle them correctly.
   (Forest Bond)

 * Fixed AttributeError when a file is opened for writing twice after being
   either opened for reading and subsequently truncated or truncated and
   subsequently opened for reading.  The second attempt to open the file for
   writing would fail.  This bug could not cause data corruption.
   (Forest Bond)


pytagsfs 0.9.1 2009-10-18
=========================

 * Removed spurious log messages about late events from inotifyx source tree
   monitor.  IN_IGNORED messages are always "late".
   (Forest Bond)

 * Support format string short key "%c" as an alias for "%{composer}".  Patch
   by Michael Helmling.
   (Forest Bond)

 * Fixed DeprecationWarning: object.__init__() takes no parameters in
   pytypes.py.
   (Forest Bond)

 * Fixed usage of deprecated os.popen2 in ``tests.blackbox`` that actually
   caused deadlocks during testing on some systems.
   (Forest Bond)


pytagsfs 0.9.1rc1 2009-04-26
============================

 * Note: pyinotify has been dropped in favor of inotifyx, so this change is
   no longer relevant.  I'll leave it for its historical value.
   
   Updated pyinotify source tree monitor to be compatible with new 0.8.6
   pyinotify release.  This is getting ugly.  Thanks to Ritesh Raj Sarraf for
   the report and patch.  Fixes #364586.

   (Forest Bond)

 * Dropped pyinotify in favor of inotifyx.  Fixes #364586 better.
   Linux users should install inotifyx, available from
   http://www.alittletooquiet.net/software/inotifyx/ .
   (Forest Bond)


pytagsfs 0.9.0 2009-03-05
=========================

 * Fixed test failures due to bad assumptions about source filesystems,
   environment variables.  Thanks to "Tomtom".  Fixes #312999.
   (Forest Bond)


pytagsfs 0.9.0rc1 2009-01-26
============================

 * Note: The ctypes-based bindings mentioned here were replaced with
   ``pytagsfs.fuselib``, a new FUSE layer based on the previous python-fuse
   bindings.  This entry has been left for historical value.  See further
   entries below.
   
   Moved to new FUSE library bindings based on fuse.py by Giorgos Verigakis.  A
   modified version of this module now ships with pytagsfs as
   ``pytagsfs.fuse``.  The previous dependency on external Python FUSE bindings
   no longer exists, however, the ctypes module is required and is an external
   dependency with Python 2.4.  Python 2.5 includes the ctypes module in the
   standard library.

   (Forest Bond)

 * Fixed incorrect mtime, atime for files whose timestamps were updated while
   they were opened for writing.  Previously, timestamps from the .pytagsfs.
   file would be copied to the new source file after the file was closed.
   (Forest Bond)

 * Fixed incorrect st_ino, st_dev from fgetattr.  Previously, values for the
   underlying source file were returned directly.  Now, these are adjusted
   properly.
   (Forest Bond)

 * Implemented a new approach to source tree writes:

    - Files can be opened for writing multiple times.  Management of concurrent
      writes is pushed off to the source tree filesystem(s).
    - Writes to the mount tree are immediately reflected.  Thus, both writers
      and readers get the same view of the pytagsfs mount.  This allows us to
      disable FUSE option direct_io.
    - Writing to a virtual file does not cause that virtual path to disappear
      until after the file has been closed.  If opened for writing multiple
      times concurrently, the virtual path continues to exist until all writers
      have closed the file.  New virtual paths may appear while the file is
      still opened for writing since writes affect source files immediately.
    - Truncating a virtal file does not affect the source file until the
      virtual file is opened for writing.  Truncating a virtual file that is
      already opened for writing affects the source file immediately.

   (Forest Bond)

 * mmap is now fully supported and write support is now enabled by default on
   all platforms.  This can be done because FUSE option direct_io is no longer
   used.
   (Forest Bond)

 * Dropped option --force-write-support.  This option is no longer necessary
   since write support is enabled by default on all systems.
   (Forest Bond)

 * Fixed traceback on invalid mount option.
   (Forest Bond)

 * Fixed util/profile to only read portion of log written while running
   benchmarks.  This problem was masked when direct_io was in use due to
   fewer log entries caused by larger reads.
   (Forest Bond)

 * Fixed spurious logging of tracebacks due to normal filesystem errors.
   (Forest Bond)

 * Logging is now performed in the FUSE bindings layer (pytagsfs.fuse) instead
   of using decorators in the filesystem layer (pytagsfs.fs).  This improves
   performance and simplifies the code a bit.
   (Forest Bond)

 * Reduced performance impact of logging calls that do not actually produce an
   log output due to current verbosity settings by passing values for
   interpolation to the logging layer instead of pre-interpolating log
   messages.
   (Forest Bond)

 * Fixed KeyError tracebacks (only visible with -o debug) on release of .log.
   (Forest Bond)

 * Added mail extension, a minor extension to pytagsfs to permit tagging of
   mail messages in Maildir format.  This is currently invoked via new
   executable ``pymailtagsfs``, but this may change in the future.  For
   instance invocation may at some point be via ``pytagsfs -o extension=mail``.
   Tags are stored in e-mail messages using header ``X-Pytagsfs-Tag``.
   (Forest Bond)

 * Fixed handling of ``X-Pytagsfs-Tag`` header contents to be compliant with
   RFC 2822 (MIME encoded-word syntax).
   (Forest Bond)

 * Fixed pymailtagsfs mailbox accesses to correctly lock mailboxes while
   modifying messages.
   (Forest Bond)

 * Fixed failing tests in ``tests.fs`` due to filesystem API change (argv
   is no longer passed to the initializer).
   (Forest Bond)

 * Fixed poor error handling when trying to build manpages on a system missing
   the docbook XSL stylesheets.  Thanks to "lunch".  Fixes #307950.
   (Forest Bond)

 * Modified setup.py to not install pymailtagsfs, as it is considered
   experimental.  Users wishing to experiment with it can create a symlink
   "pymailtagsfs" to existing script "pytagsfs".
   (Forest Bond)

 * Fixed bad truncation behavior on Mac OSX (and possibly other systems, too),
   due to incorrect calls to libc's truncate (via ctypes).  Correctly casting
   the length argument seems to fix this problem.
   (Forest Bond)

 * util/profile handles badly formatted log lines by reporting them to stderr.
   This problem can be triggered if the log file overflows, resulting in read
   discontinuity.
   (Forest Bond)

 * Fixed util/profile to not read the virtual log file while profiling.
   Naturally, doing so massively inflates profiling numbers, and also causes
   the log file to overflow.
   (Forest Bond)

 * Fixed -o profile to correctly report filesystem method names.  This was
   broken in the transition from python-fuse to the ctypes-based fuse.py
   binding.  All methods were being profile with name "wrapper".
   (Forest Bond)

 * Replaced ctypes-based FUSE bindings with a compatibility layer,
   ``pytagsfs.fuselib``, on top of the standard python-fuse bindings.  The
   decision to move away from ctypes was made to avoid platform compatibility
   issues with types defined in system header files (which ctypes has no access
   to).  The new compatibility layer provides a simpler API for filesystems
   (like those implemented in ``pytagsfs.fs``) similar to that provided by
   the ctypes-based bindings.
   (Forest Bond)

 * Implemented statfs.  This probably used to work, because Darwin appears to
   depend on it being implemented for all operations.  It's not clear to me
   why it would've worked in the past, but a complete implemention is now
   provided.
   (Forest Bond)

 * Improved speed and reliability of blackbox tests by using sleep_until instead
   of sleep.
   (Forest Bond)

 * Fixed -s (broken with introduction of ``pytagsfs.fuselib``).
   (Forest Bond)


pytagsfs 0.8.0 2008-10-21
=========================

 * Fixed out-of-date documentation of command-line options in pytags manual
   page.
   (Forest Bond)

 * Fixed broken pytagsfs option -s.
   (Forest Bond)


pytagsfs 0.8.0rc1 2008-10-09
============================

 * Fixed hard-coded path to docbook stylesheet for building manpages in
   setup.py.  Thanks to Zong Sharo.  Fixes #258362.
   (Forest Bond)

 * Fixed rather serious bug that would have prevented pytagsfs mounts from
   working correctly when the mount point directory depth was smaller than
   the virtual path directory depth (as defined by the format string).
   (Forest Bond)

 * Re-work ``PathStore`` interface:

    - ``create_directory`` was renamed to ``add_directory``, and it is no
      longer an optional method for sub-classes to implement.
    - ``remove_file`` and ``remove_directory`` have been replaced with a single
      method, ``remove``.
    - ``rename_file`` and ``rename_directory`` have been replaced with a single
      method, ``rename``.
    - Method ``get_real_subpaths`` was added (actually it was added previously,
      but the addition wasn't mentioned here).

   Most users won't care about these changes.
   (Forest Bond)

 * Renames to paths containing too many levels of directories now fail with
   EINVAL.
   (Forest Bond)

 * Re-implemented ``pytagsfs.subspat`` and re-worked ``pytagsfs.sourcetreerep``
   to use the new API.  Fixes #259928.
   (Forest Bond)

 * Added ``PathStore`` meta-data methods: ``get_meta_data``, ``set_meta_data``,
   ``unset_meta_data``.  These are currently being used by
   ``SourceTreeRepresentation`` to store per-path ``Splitter`` objects.
   (Forest Bond)

 * Fixed some errors with getattr (stat):

    - Instead of returning zero for atime, ctime, and mtime for empty
      directories, return times as for the source tree root directory.
    - st_dev was being read from the source tree root for empty directories, or
      the source file for virtual files, but now is always set to zero.  This
      is probably most correct given that our filesystem is virtual and those
      parameters are consequently meaningless.

   (Forest Bond)

 * Fixed a bug in utime, which previously assumed that its argument was always
   a file end point.  The new implementation updates the times on the source
   tree root if the argument is an empty directory, or updates all contained
   end points if the argument is a non-empty directory.
   (Forest Bond)

 * Files with tags containing slashes are not represented in the virtual
   directory tree.  Log messages should indicate when this is the case.
   Change your tags if you want to see them.  Fixes #267650.
   (Forest Bond)

 * PathStore implementations can now expect all paths to be specified as
   unicode strings (previously, ASCII byte strings were allowed).
   (Forest Bond)

 * Tags with multiple values are now supported.  Files with multiple tag
   values will appear under multiple directories.  Renames are supported.
   (Forest Bond)

 * pytags command-line options have changed:

    - Option --pattern was renamed to --format to be consistent with pytagsfs
      itself.
    - Option --add was added.
    - The order of options is now important.  --format must be specified first,
      if at all.  --set, --add, and --remove are then process in order, with
      each option affecting tags as it is processed.

   (Forest Bond)

 * Tags that mutagen does not treat as lists or tuples are ignored.  I'm
   currently aware of some mp4 tags that are like this (cpil, pgap, pcst,
   tmpo).  Other mp4 tags were already being handled specially to translate
   to mp4-specific representations (tracknumber/trkn).
   (Forest Bond)

 * Renamed test module "integration" to "blackbox".
   (Forest Bond)

 * Simplified many blackbox tests, and removed some that primarily tested
   functionality at a layer that is now being thoroughly unit tested.
   (Forest Bond)

 * Removed filesystem implementation of access method.  We use -o
   default_permissions, anyway, so this method was probably not even being
   called (and would return incorrect results for directories if it was).
   (Forest Bond)

 * Fixed buggy handling of mutagen track number tag leading to an attempt to
   convert a list to an integer rather than converting each list member to
   an integer.
   (Forest Bond)

 * Renamed long version of mutagen substitution pattern "N" from "NUMBER" to
   "TRACKNUMBER" in order to be consistent with pair "n", "tracknumber".
   (Forest Bond)

 * Added mount option "-o nocache", which disables caching of stat results and
   other virtual path properties.
   (Forest Bond)

 * Added mount option "-o profile".  This turns on some additional profiling
   output in the log file.
   (Forest Bond)

 * Implemented util/profile, a utility that can analyze profiling information
   in the log, as well as run standardized benchmarks.
   (Forest Bond)

 * In order to support benchmarking, a new meta store implementation was added:
   ``TestLinesMetaStore``.  This meta store implementation should not be used
   with real data files, as it has the potential to destory file data via
   renames.  It is for testing and benchmarking only.
   (Forest Bond)

 * Added mount option "-o metastores", which allows the user to specify which
   meta store implementation(s) to use.  This option is currently undocumented,
   and was primarily introduced to support standardized benchmarking.  In the
   future, though, it will likely be useful for mounting directories containing
   non-media source files using alternative tag formats.
   (Forest Bond)


pytagsfs 0.7.1 2008-07-24
=========================

 * Fix filesystem dying with removal of last sub-directory of the root
   directory.  PyTypesPathStore was undefining the root directory with the
   removal of its last sub-directory.
   (Forest Bond)

 * Fix out-of-order handling of events for multiple paths when using
   DeferredPyInotifySourceTreeMonitor, DeferredGaminSourceTreeMonitor, or
   DeferredKqueueSourceTreeMonitor.  This bug might have caused the mount tree
   to become out-of-sync with the source tree under some circumstances.
   (Forest Bond)

 * Fix duplicate directory removal events from GaminSourceTreeMonitor and
   DeferredGaminSourceTreeMonitor.  This bug may have caused slight performance
   and/or source tree/mount tree synchronization issues.
   (Forest Bond)

 * setup.py test command now accepts command-line option --print-only.  If
   specified, test identifiers for tests that would have been run are printed
   rather than being run.
   (Forest Bond)

 * Only call ``locale.getpreferredencoding`` once prior to thread
   initialization, since this function is not thread-safe on some platforms.
   (Forest Bond)

 * Fixed a bug where renaming a directory in the source tree and subsequently
   modifying tags on files contained by that directory resulted in "phantom"
   files and directories under the mount point.  These files appear in
   directory listings but no longer correspond to any existing source files.
   Reading from them gives "No such file or directory" errors.
   (Forest Bond)

 * Fixed "No such file or directory" errors for ``getattr`` calls on virtual
   directories whose sub-trees contain files corresponding with source files
   that no longer exist.  Under normal operating conditions, this would be the
   rare outcome of a race condition.
   (Forest Bond)

 * Fixed mishandling of nested directory removals by KqueueSourceTreeMonitor
   and DeferredKqueueSourceTreeMonitor (the default source tree monitor on
   Mac OSX and other BSDs).
   (Forest Bond)


pytagsfs 0.7.0 2008-06-03
=========================

 * Documentation updates.
   (Forest Bond)


pytagsfs 0.7.0rc1 2008-05-19
============================

 * Fix setup.py not installing sub-package specialfile.  This bug was
   unreleased.
   (Forest Bond)

 * Handle conditional expressions in format strings better with respect to
   renames.  Previously, renaming files such that a path component matches the
   alternate content of a conditional expression resulted in that alternate
   content being set as a tag value.  Now, the tag is removed, instead.  For
   example, with format string '/%?%g%:Unknown Genre%?/%a/%t.%e', moving a file
   into directory "Unknown Genre" will unset the genre tag for that file,
   rather than setting the genre to "Unknown Genre".
   (Forest Bond)

 * Long keys are now supported in format strings.  For instance, "%{artist}" is
   equivalent to "%a".  This can also be used to access arbitrary tags that have
   no short key version (like "%{composer}").
   (Forest Bond)

 * Created an experimental implementation of KqueueSourceTreeMonitor with the
   ultimate goal of achieving full Mac OSX compatibility.  More work must be
   done before such support is complete.
   (Forest Bond)

 * Fixed Python 2.4 incompatibilities in test/integration.py.
   (Forest Bond)

 * Fixed broken kqueue support when not run in foreground mode (via -f/-d).
   (Forest Bond)

 * Fixed breakage in test/integration.py that would prevent test mounts from
   being un-mounted correctly.
   (Forest Bond)

 * Fixed bad handling of boolean tag values.
   (Forest Bond)

 * Fixed incorrect handling of mount options uid, gid.
   (Forest Bond)

 * Set fstype to source directory path, subtype to "pytagsfs".  Previously,
   fstype was set to "pytagsfs".  The new arrangement is more semantically
   correct.
   (Forest Bond)

 * Fix kqueue handling of file replacements.
   (Forest Bond)

 * Fixed MacFUSE caching issues by passing mount option "nolocalcaches".
   (Forest Bond)

 * Fix renames on mounts with format string key redundancy (mounts that have
   the same tag appear more than once in the format string).
   (Forest Bond)

 * Detect platform and inform user about potential mmap problems, if they
   exist.  Require --force-write-support if appropriate.
   (Forest Bond)

 * Provide -o ro on Linux, -o rdonly on OSX and other BSD's.  Provide -r on all
   systems.
   (Forest Bond)

 * Correctly handle errors from FUSE main function.  Thanks to Y Giridhar
   Appaji Nag for submitting a patch.
   (Forest Bond)

 * Correctly handle moves of directories containing (directly or via sub-trees)
   both empty directories as well as virtual files.
   (Forest Bond)

 * Try to handle MP4 keys in a useful way by translating from keys to those
   used more commonly by other formats.  The keys seem to mostly have been
   defined by iTunes, and are not well documented (nor are they very sane).
   Variations in the field may cause problems here, but the iTunes-created
   files that I have here appear to be handled correctly.
   (Forest Bond)

 * Integrate tests into setup.py.  Tests can now be run with
   ``./setup.py test``.
   (Forest Bond)

 * Import the locale module from sclapp, rather than importing it directly.
   This fixes some Unicode issues on Darwin.  sclapp version 0.5.2 is now
   required.
   (Forest Bond)

 * Provide ``--tests`` option to setup.py test sub-command to enable specific
   tests to be run, rather than always running the entire test suite.
   (Forest Bond)

 * Implement substitution parameter %{NUMBER}, a synonym for %N.
   (Forest Bond)


pytagsfs version 0.6.0 2008-04-04
=================================

 * Pretty-up log format a bit:

    - Include time stamps.
    - Use prettier description of function for "Entering x" and "Leaving x"
      messages.

   (Forest Bond)

 * Rewrote command-line option parsing.  Options are now handled completely
   independently from the underlying FUSE library.  The following options are
   no longer supported:

    - -o default_permissions
    - -o fsname
    - -o large_read
    - -o max_read
    - -o hard_remove
    - -o use_ino
    - -o readdir_ino
    - -o direct_io
    - -o kernel_cache
    - -o umask
    - -o entry_timeout
    - -o negative_timeout
    - -o attr_timeout

   In general, the options for which support was removed are now considered
   implementation details, as they should have been previously.
   (Forest Bond)

 * Fix incompatibility with python-fuse 0.2 by returning fuse.Stat instances
   instead of os.stat_result instances from getattr, fgetattr.  This issue did
   not exist with python-fuse 0.2pre3.  Previously, users of 0.2 would see
   EINVAL from stat calls.  Reported by Chris Pickel, Jeremy Jones.
   (Forest Bond)


pytagsfs 0.6.0rc2 2008-03-26
============================

 * Improve performance for readdir by changing post-processing list of entries
   in PyTypesPathStore.get_entries_for_directory to use new function last_unique
   instead of unique.  Thanks to Chris Pickel.
   (Forest Bond)

 * Improve performance for readdir when debug logging is turned on by decorating
   FileSystemMappingToRealFiles.readdir with @logged instead of
   @verbosely_logged.
   (Forest Bond)

 * Cache directory entries.  This provides a significant performance
   improvement for readdir calls after the first.
   (Forest Bond)


pytagsfs 0.6.0rc1 2008-03-24
============================

 * Keep order of directory entries the same across renames, collisions, etc.
   Implementation happens to improve performance for source tree file updates,
   as well.
   (Forest Bond)

 * Support simple renames of files under mount point.  Renaming virtual files
   and directories causes the meta-data of the underlying source files to be
   updated appropriately.  Files can be moved from one directory to another, or
   files and directories can be renamed.
   (Forest Bond)

 * Fix bug preventing stat results from actually being cached.  This likely had
   impact on performance of directory listings.
   (Forest Bond)

 * Fix TypeError from readdir due to poor handling in VirtualLogFile.
   (Forest Bond)

 * Fix cache not pruned due to rename.
   (Forest Bond)

 * Directory permissions now taken from source tree root directory (previously
   arbitrary).
   (Forest Bond)

 * Fix broken directory mtime, ctime, atime.
   (Forest Bond)

 * Fix partial stat cache invalidation when full path branch should be
   invalidated.  This would cause directory mtime, ctime, atime to not be
   updated when it should.
   (Forest Bond)

 * Fix partial stat cache pruning in response to source file updates.
   (Forest Bond)

 * Support mkdir, rmdir.
   (Forest Bond)

 * Fix bad handling of updates to previously unrepresentable source files.
   (Forest Bond)

 * Fix rmdir not completely removing the target directory.  While the directory
   was no longer returned by readdir on parent, stat still indicated its
   presence.
   (Forest Bond)


pytagsfs 0.5.0 2008-03-08
=========================

 * pytagsfs is now compatible with Python 2.4.
   (Forest Bond)


pytagsfs 0.5.0rc2 2008-03-07
============================

 * Initial scanning of files was taking place after filesystem process detached
   from the user's shell.  This causes the initial population delay to be
   observed when the filesystem is first accessed, leading to confusion as to
   whether the filesystem had hung.  Now, the files are scanned before the
   process detaches.
   (Forest Bond)

 * Fixed log spamming after each open of log file (".log").
   (Forest Bond)


pytagsfs 0.5.0rc1 2008-03-06
============================

 * Added option -o verbosity=VERBOSITY; VERBOSITY should be one of debug, info,
   warning, error, critical.  -d/-o debug overrides this, and forces verbosity
   to debug.
   (Forest Bond)

 * With -d/-o debug, log to both .log and stderr.  Otherwise, log to .log only.
   (Forest Bond)

 * Limit size of in-memory log file (.log) to 1MB.
   (Forest Bond)

 * Allow size of in-memory log file to be overridden via -o logsize.
   (Forest Bond)

 * Fixed bug preventing addition of tags to previously untagged mp3 files.
   (Forest Bond)

 * Improved inotify performance for case where source files are updated
   numerous times between event processing calls;
   DeferredInotifySourceTreeMonitor.
   (Forest Bond)

 * Improved performance by only processing add, remove, and update events for
   sources files after initialization (post populate) and prior to getattr
   calls.
   (Forest Bond)

 * Fix bug causing reads on a recently truncated fd to return the removed
   content by using direct_io = True for ReadWriteFile's.
   (Forest Bond)

 * Fix bug (sort of) where getattr calls for a file currently open for writing
   return the size of the file before being opened.  Now, we defer to fgetattr
   on the open file object.  This would cause, for instance, mutagen to badly
   truncate OGG files.
   (Forest Bond)

 * Fix broken setup.py that forgets to install sub-packages.
   (Forest Bond)

 * Fix missing import log_traceback in pytagsfs.sourcetree.
   (Forest Bond)

 * Fix handling of transient conflicts.  Previously, when two or more source
   files map to the same file name under the mount point, and one of those
   source files was either removed or modified such that it mapped to a
   different path, the mount path became a "dead" file, with zero links.  Now,
   that path will become reassociated with the next source file candidate.
   (Forest Bond)

 * Fix pytags, pytagsfs always exiting with zero status, despite errors.
   (Forest Bond)

 * Log to stderr when option -f/-o foreground is specified.
   (Forest Bond)

 * Introduced fallback mechanism for source tree change monitoring backends.
   Source tree monitors are tried in the following order: pyinotify, gamin,
   dummy.

    - pyinotify only works on Linux, but is faster than gamin.
    - gamin possibly works on other Unix-like systems (like the BSD's).
    - The dummy backend doesn't actually do anything, so changes to the source
      tree are not reflected in the mount tree.

   Non-Linux users should report success or failure with the gamin backend.

   (Forest Bond)


pytagsfs 0.3.0 2008-01-17
=========================

 * Added BUGS.
   (Forest Bond)

 * A virtual log file (".log") is created under the moint point.  The contents
   of this file are stored in memory.  In the event of a (detected) bug,
   tracebacks and other critical debugging data will be accessible by reading
   this file.
   (Forest Bond)

 * If a file is truncated (directly, without being opened), the effects of this
   are not immediately visible.  Reads will continue to return the file contents
   prior to truncation.  However, if the file is opened in write-only or
   read-write mode, the truncation will be apparent to the opener.  Once the
   file is closed, reads will return the new content.  This makes it possible to
   successfully re-tag files in such a way that the file path changes.
   (Forest Bond)

 * Write support is now considered reliable.
   (Forest Bond)

 * Removed support for the following filesystem functions, which were either
   incorrect or irrelevant given currently supported features:

   - readlink
   - mknod
   - mkdir
   - unlink
   - symlink
   - rename
   - link

   (Forest Bond)

 * Fixed incorrect stat results due to out of date cache values.  This also
   corrects issue where writes would not show up in mounted tree.
   (Forest Bond)

 * Drastic performance improvement via stat() result caching.
   (Forest Bond)

 * Fixed bug in setup.py causing version information to be excluded from
   generated .egg file.
   (Forest Bond)


pytagsfs 0.2.0 2007-12-15
=========================

 * Added NEWS file; sorry for the previous absence.
   (Forest Bond)

 * [NEWS file not present]


pytagsfs 0.1.0 2007-12-06
=========================

 * [NEWS file not present]