summaryrefslogtreecommitdiffstats
path: root/doc/src/09020-changelog.md
blob: 023086c410b6a46a06535544eabd5c2a59ecb7bc (plain)
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
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
# Changelog {#sec:changelog}

This section contains the changelog.

We try to include a changelog line in each pull request, to make sure the
changelog is up to date when releasing a new version of the codebase.
Make sure to append the new change to the list, do not prepend it.

The "Major" section of each section includes huge changes in functionality and
interfaces (but not necessarily user-facing ones), whereas the "Minor" section
contains only small stuff.
Some things, like typo fixes, version string updates and such are not stated in
the changelog (though updating of dependencies is).
Please note that we do not have a "Breaking changes" section as we are in
Version 0.y.z and thus we can break the API like we want and need to.

## 0.9.3

Bugfix release for fixing:

* Removed an import which was already there and fails with the current beta
  compiler
* Fix a negation error in the config aggregation in imag-log
* Dependency specification fail in 0.9.2 where everything did not depend on
  0.9.2 but 0.9.1

## 0.9.2

Bugfix release for fixing:

* Fix a function that checks a flag. If the flag is not there, it should be "not
  set".
* Fix to not ignore errors when collecting links in libimagentrylink
* Remove buildscripts because imag was not installable from crates.io with
  buildscripts.


## 0.9.1

Bugfix release for fixing:

* Fix off by one error in error tracing
* Fix negation error in imag-habit filtering mechanism
* Fix config override mechanism
* "status" subcommand might not be present in imag-habit, but standard command
  should work anyways
* We go to the next month, not to the current one (off by one error)
* 'start-time' cannot be None in imag-timetrack, clap ensures that
* Do not use deprecated StoreId::exists() function in libimagentrycategory


## 0.9.0

* [f912d3e7f3](https://git.imag-pim.org/imag/commit/?id=f912d3e7f362e524347cd061f316d3569dfb18a0)
  Fix: Duplicated printing of output in `imag log show --all`
  The problem was that the used `Diary::diary_names()` iterator does not
  call `unique()` on its output.
  That decision was made because the return type would get more
  complicated with that feature.
  The fix was to call `Itertools::unique()` on the iterator.

* [851db4abe4](https://git.imag-pim.org/imag/commit/?id=851db4abe4d8d0aebafe35ef41c5594213b1be6b)
  Do not use rust-crypto anymore, but other crates
  A contribution from newpavlov. Thank you very much!

* [5b82d53fd2](https://git.imag-pim.org/imag/commit/?id=5b82d53fd29294ac598d3e80fcee0e7b27f59c0c)
  Optimize libimagstore filesystem backend
  This optimization changes the backend so that the files are not held open. The
  files are now read whenever they are requested, then they are cached and are
  written back on "Store::update()" (which is also called when the store is
  dropped).
  This change allows us now to read more files into memory than there are FDs for
  the process (which was a problem with really large stores and, for example,
  imag-diagnostics.

* [6a81c0afd1](https://git.imag-pim.org/imag/commit/?id=6a81c0afd1d98520d4820f6a1dcb161ee4029761)
  Update rust compiler for travis

* [ccbc2b2672](https://git.imag-pim.org/imag/commit/?id=ccbc2b2672defc61f4e67040fc193b8271bd9f60)
  Add progress bar for imag-diagnostic tool, so that a user can see
  that something is happening.

* [a101e777f3](https://git.imag-pim.org/imag/commit/?id=a101e777f365bc1e1fcd9f4ca3f9a9b6198e70af)
  Update dependencies
  Dependencies of these imag crates where updated:
  Binaries:
  * imag
  * imag-contact
  * imag-edit
  * imag-git
  * imag-grep
  * imag-habit
  * imag-link
  * imag-timetrack
  * imag-view
  * imag-wiki

  Libraries:
  * libimagbookmark
  * libimagcontact
  * libimagentryfilter
  * libimagentrytag
  * libimagentryview
  * libimagerror
  * libimaginteraction
  * libimagmail
  * libimagrt
  * libimagstore
  * libimagtimeui
  * libimagtodo
  * libimagutil
  * libimagwiki

* [9bce68b1bf](https://git.imag-pim.org/imag/commit/?id=9bce68b1bff5e2f77f7c86424de5c16a7e38a2cc)
  Optimized the libimagstore `Store::entries()` interface to have
  the possibility to limit the filesystem access to subdirectories in the store
  path, so that IO operations are minimized.

* [a749d97a16](https://git.imag-pim.org/imag/commit/?id=a749d97a16af553e4a6f949538433067a757d9e8)
  Switched the whole ecosystem to use `failure` for error handling.

* [ecf4cead93](https://git.imag-pim.org/imag/commit/?id=ecf4cead93da0b04cb74370082dbfc998d7a2752)
  Introduced the runtime IO system, which can now be used to chain
  imag calls like so: `imag ids | imag tag add "foobar"`.

In the process of these major changes, small bugfixes and improvements were
applied to the codebase. Too much to list all of them here, though.

The merge messages of the respective feature branches contain more details on
the changes.


## 0.8.0

After the last release (0.7.0), we changed how we keep our changelog from manual
adding things to the list, to using `git-notes`. Hence, there's no
categorization anymore.

* Add imag(https://git.imag-pim.org/imag/commit/?id=imag)diary functionality to list existing diaries

* `libimagentryview`s `StdoutViewer` is now able to wrap lines

* `imag-view` can wrap output now

* `imag tag` is now able to read store ids from stdin

* `libimagrt` automatically suggests "imag init" if config is not found

* A changelog-generation script was added to the scripts/ directory

* Fix: `libimagdiary` did not return the youngest, but the oldest entry id on
  `::get_youngest_entry_id()`.

* Fix: imag-view should not always wrap the text, only if -w is passed

* Fix: `imag-log show` should order by date

* `imag` does not inherit stdout if detecting imag command versions.

* The `Store::retrieve_for_module()` function was removed.

* `imag-git` was added, a convenient way to call `git` in the imag RTP.

* `libimagentryview` was refactored.
  The crate was refactored so that the "sink" - the thing the view should be
  written to - can be passed.

* A `imag-view` feature was added where markdown output can be formatted nicely
  for the terminal

* The libimagstore lib got its stdio backend removed.

  First, `imag store dump` was removed as it was based on this feature.
  Then, `libimagrt` got the ability removed to change the store backend to stdio.
  After that, we were able to remove the stdio backend and the JSON mapper
  functionality that came with it.

  This shrinked the codebase about 1kloc.

  The `imag store dump` feature can be reimplemented rather simply, if desired.

* `imag-view` is now able to seperate printed entries with a user-defined
  character (default: "-")

* Fix: Deny non-absolute import pathes in imag-contact

* libimagcontact is not based on libimagentryref anymore

  This is because we encountered a serious problem: When syncing contacts with an
  external tool (for example `vdirsyncer`), the files are renamed on the other
  host. Syncing the imag store to the other device now creates dead links, as the
  `path` stored by the ref is not valid anymore.

  Now that libimagcontact is not based on libimagentryref anymore, this issue does
  not exist anymore. libimagcontact stores all contact information inside the
  store now.

  imag-contact was rewritten for that change.

* Fix: imag-contact does only require the name field, all others are optional
  now

* Fix: imag-contact automatically creates a UID now

* `libimagcategory` was rewritten

  It creates entries for categories now and automatically links categorized
  entries to the "category" entries.

  Its codebase got a bit simpler with these changes, despite the increase of
  functionality.

* `imag-contact` automatically generates/warns about missing file extension

* `libimagcontact` does export email properties now.

  `imag-contact` reads email properties and can output them in its JSON output.
  This is helpful for passing email adresses to external tools like mutt.

* `libimagentrygps` and `imag-gps` work with 64 bit signed values now

  Both the library and the command use i64 (64 bit signed) for GPS value fragments
  now.

  Also: The `imag-gps` tool does not require a "second" value fragment now, it
  defaults to 0 (zero) if not present.

* The `filters` dependency was updated to 0.3

* `libimagentryfilter` filters headers not with a failable filter.

* `imag-diary` has no longer an `edit` command. `imag-edit` shall be used
  instead.

* `libimagtodo` got a error handling refactoring, so that more chaining happens.

* Errors in `libimagstore` contain more details in the error message about what
  StoreId caused the error
  Unused errors were removed.

* The Store API got functions to get data about the internal cache and flush it

* imag-diagnostics flushes the cache each 100 entries processed

* The iterator interface of libimagstore was refactored

  Originally, the iterator interface of libimagstore did not return errors which
  could happen during the construction of a `StoreId` object.
  This was refactored, effectively changing the `StoreIdIterator` type to not
  iterate over `StoreId` anymore, but over `Result<StoreId, StoreError>`.
  That cause a lot of changes in the overall iterator interface. All iterator
  extensions (like `.into_get_iter()` for example) had to be rewritten to be
  applicable on iterators over `Result<StoreId, E>` where `E` is a generic that
  can be constructed `From<StoreError>`.

  This all was triggered by the fact that `Store::entries()` did a
  `.collect::<Vec<_>>()` call, which is time consuming.
  Consider a tool which calls `Store::entries()` and then only use the first 10
  entries returned (for some user-facing output for example). This would
  effectively cause the complexe store to be accessed (on the filesystem level),
  which could be thousands of entries. All relevant pathes would have been written
  to memory and then be filtered for the first 10.
  Not very optimized.

  After this was done, the store interface changed. This caused a lot of changes
  in almost all crates.

  Internally, in the store, the `FileAbstraction` object is not passed around in a
  `Box` anymore, but in an `Arc`, as a intermediate (store-private) iterator type
  needs to access the backend for file-system level checks.
  This is not user-facing.

  In the process, the `Store::reset_backend()` interface was removed (as this is
  no longer supported and should've been removed already). Rewriting it just for
  the sake of this patch and then removing it would've been to difficult and time-
  consuming, hence it was simply removed during that patchset.

  The overall performance was somewhat improved by this patchset.
  A rather non-scientifically performed test shows increased performance in debug
  builds (but slowing down in release builds).

  The test was done on master before the merge and after the merge, with a debug
  build and a release build. Each time, `imag-ids` was executed 10 times with its
  output piped to /dev/null. The local store used for this contained 5743 entries
  during the measurements and was not changed in between. `time` showed the
  following data (real, user, sys):

  Before, Debug build:

      0,075;0,052;0,023
      0,077;0,051;0,026
      0,083;0,063;0,020
      0,079;0,054;0,025
      0,076;0,057;0,019
      0,077;0,059;0,017
      0,074;0,052;0,022
      0,077;0,045;0,032
      0,080;0,060;0,020
      0,080;0,058;0,022

  After, Debug build:

      0,071;0,050;0,021
      0,073;0,053;0,021
      0,075;0,060;0,015
      0,076;0,047;0,029
      0,072;0,055;0,018
      0,077;0,061;0,016
      0,071;0,053;0,019
      0,070;0,053;0,016
      0,074;0,050;0,025
      0,076;0,052;0,024

  Before, Release build:

      0,034;0,015;0,019
      0,034;0,017;0,017
      0,034;0,019;0,015
      0,033;0,012;0,022
      0,034;0,011;0,023
      0,034;0,015;0,019
      0,034;0,010;0,024
      0,033;0,015;0,018
      0,037;0,017;0,020
      0,033;0,013;0,021

  After, Release build:

      0,037;0,015;0,022
      0,036;0,016;0,020
      0,036;0,018;0,018
      0,036;0,014;0,022
      0,036;0,015;0,021
      0,036;0,018;0,018
      0,037;0,016;0,020
      0,036;0,018;0,018
      0,039;0,015;0,023
      0,037;0,016;0,021

* The `Store::walk()` function was removed.

* `imag-ids` got the ability to filter by header

  The language introduced here is subject to change, but a good first step into
  the direction of a generic filter language.

  Language documentation was added as well and is printed with `imag ids --help`.

* `imag-category` was added

* The standard CLI interface in `libimagrt` was updated and validations were
  added


## 0.7.1

Bugfix release for fixing:

* `libimagdiary` did not return the youngest, but the oldest entry id on `::get_youngest_entry_id()`.
* `imag-view` should not always wrap the text, only if -w is passed
* `imag-log show` should order by date
* `imag` does not inherit stdout if detecting imag command versions.
* `imag-contact import` does only allow absolute pathes
* `imag-contact` has most fields optional now, only name is required
* `imag-contact` automatically creates UID
* `imag-contact` automatically generates/warns about missing file extension


## 0.7.0

* Major changes
    * `imag-timetrack list --from/--to` now have `kairos` support - that means
      that complex `--from/--to` arguments (like `yesterday` or `today-2weeks`)
      are now possible
    * `libimagerror` got a major refactoring and uses `ChainedError` from
      `error-chain` for logging errors now.
    * `libimagentryref` and all libraries using it were rewritten.
      `libimagentryref` was rewritten to make its API simpler and yet more powerful.
      Also because it used to put entries under a "ref" collection in the store,
      but users of the library really should be be able to put entries under
      custom collections.
    * `imag store ids` was replaced by `imag ids`.
    * `libimagentrylist` was removed. Its functionality was inconvenient to use
      and ugly to implement. Its API was cumbersome.
      Listing of entries shall be implemented without it.
    * `libimagcontact` is now able to fetch all contacts from the store.
    * `libimagcontact` takes the hash from the vcard object (UID) now.
    * `imag-contact` got a `find` command, which matches in fullname, email and
      address and either shows or lists the found contacts
    * `imag-contact list` and `imag-contact find` is now able to print the
      output as JSON.
    * `imag-edit` can now read store ids from stdin, so
      `imag ids | fzf | imag edit -I` is now a thing.
    * `imag ids` does not print the path of the store. Can be turned on using
      commandline flag.
    * `imag-habit today --done` and `imag-habit status --done` was added for
      showing habits which are already done.
    * `libimagrt` allows external subcommands now in the default clap app
      builder helper. It also provides a helper for handling unknown
      subcommands: `Runtime::handle_unknown_subcommand()`. See docs for details.
    * `imag-link list` prints output in ascii-table now, use `--plain` to print
      as plain text.
    * The build script automatically generates autocomplete scripts for bash,
      fish and zsh now when compiling the `imag` command.
    * `libimagwiki` and `imag-wiki` were introduced.
* Minor changes
    * A license-checker was included into the CI setup, which checks whether all
      ".rs"-files have the license header at the top of the file