Commit graph

2795 commits

Author SHA1 Message Date
Thomas Lauf
3de53d7599 Bump project version to 1.3.0
Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-04-19 17:38:40 +02:00
Thomas Lauf
d2ea71cd90 Prepare for release 1.3.0
Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-04-19 15:40:07 +02:00
Thomas Lauf
2c7259aa41 Update ChangeLog
Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-04-19 15:23:43 +02:00
Thomas Lauf
d4015bbeae Update NEWS
Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-04-19 15:23:12 +02:00
Thomas Lauf
ad58309159 Update Copyright
Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-04-19 12:41:23 +02:00
Thomas Lauf
d73143b6cb remove unnecessary line breaks
Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-04-14 10:11:39 +02:00
Thomas Lauf
94cbcab195 set consistent minimum versions for gcc and clang
- we require full C++11 support, so gcc 4.8.1 and clang 3.3 it is
- closes #268

Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-04-13 18:36:22 +02:00
Thomas Lauf
f3396f7193 Update ChangeLog, AUTHORS
Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-04-13 16:59:10 +02:00
Thomas Lauf
dd8f2ab2b5 Update bash completion
- Closes #298

Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-04-13 16:59:10 +02:00
Daniel
0e5e3316ca DOC: Added documentation about :fortnight in ChangeLog. 2020-03-06 21:58:28 +01:00
Daniel
13fb0ad8e3 ENH: Add new interval hint :fortnight (sopw - eow). 2020-03-06 21:56:43 +01:00
Thomas Lauf
41c50e009c Add test for export with tag filter
Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-03-06 16:13:00 +01:00
Shaun Ruffell
42872f5168 test: Add test for filtering non-contiguous intervals
Related to #293

Signed-off-by: Shaun Ruffell <sruffell@sruffell.net>
2020-03-06 16:10:19 +01:00
Shaun Ruffell
0b39a83a92 Filtering with tags should preserve the interval IDs.
This fixes the bug where, when filtering by tags, the interval IDs are not
preserved when not using any tags in the filter. Notice below how when
filtering with tag1, the two intervals are @4 and @5 instead of @1 and @5 like
they should be:

  $ timew summ :ids

  Wk Date       Day ID Tags    Start      End    Time   Total
  W9 2020-02-29 Sat @5 tag1 15:28:31 15:28:33 0:00:02
                    @4 tag2 15:28:33 15:28:35 0:00:02
                    @3 tag3 15:28:35 15:28:36 0:00:01
                    @2 tag4 15:28:36 15:28:48 0:00:12
                    @1 tag1 15:28:48        - 0:02:25 0:02:42

                                                      0:02:42

  $ timew summ tag1 :ids

  Wk Date       Day ID Tags    Start      End    Time   Total
  W9 2020-02-29 Sat @5 tag1 15:28:31 15:28:33 0:00:02
                    @4 tag1 15:28:48        - 0:02:28 0:02:30

                                                      0:02:30

This fixes a bug introduced in 86bb1465e8.

Closes issue #293 (thanks sskras)

Signed-off-by: Shaun Ruffell <sruffell@sruffell.net>
2020-03-06 16:10:19 +01:00
Shaun Ruffell
b62b7b3435 Interval: We can return a const reference to tags.
Interval is already marked as a constant object here and we can eliminate
creating unnecessary copies when filtering large databases.

Signed-off-by: Shaun Ruffell <sruffell@sruffell.net>
2020-03-06 16:10:19 +01:00
Shaun Ruffell
c1f3d8be72 Check serialization before writing to database
Ensure that the IntervalFactory can parse the string returned by
Interval::serialize before writing to database.

If a user attempts to add a non-parseable date, you will get an error like:

  $ TZ="GMT" timew track 7h before 1970-01-01T00:00:00 test
  Note: 'test' is a new tag.
  Internal error. Failed encode / decode check.

Or if the user attempts to add a tag that is not supported:

  $ timew start 1970-01-01T00:00:00 '\"TEST\"'
  Note: '"\\"TEST\\""' is a new tag.
  Internal error. Failed encode / decode check.

On #159, the serializer / deserializer should be able to handle the escaped
quotes, but it is another example where we do not want any entry written into
the database that cannot be properly parsed. This change will also add more
verbose debugging information if the :debug flag is passed, like:

  $ timew start 1970-01-01T00:00:00 '\"TEST\"' :debug
  CLI Parser
    _original_args
      timew start 1970-01-01T00:00:00 \"TEST\" :debug
    _args
      word basename='timew' raw='timew' BINARY
      word canonical='start' raw='start' ORIGINAL CMD
      date raw='1970-01-01T00:00:00' ORIGINAL FILTER
      word raw='\"TEST\"' ORIGINAL FILTER TAG
      word canonical=':debug' raw=':debug' ORIGINAL HINT FILTER

  >> 2020-02.data: 0 intervals
  >> 1970-01.data: 0 intervals
  >> 1969-12.data: 0 intervals
  >> Loaded 0 tracked intervals
  Note: '"\\"TEST\\""' is a new tag.
  >> Datafile::addInterval() failed.
  >> Encode / decode check failed:
  >>   inc 19700101T060000Z # "\\"TEST\\""
  >> is not equal to:
  >>   inc 19700101T060000Z # "TEST\\\"\"" \
  Internal error. Failed encode / decode check.
  >> Timer timew 0.002137 sec

Closes #290
Related to #159

Signed-off-by: Shaun Ruffell <sruffell@sruffell.net>
2020-03-04 07:44:05 +01:00
Shaun Ruffell
fda978c8cc Support multiline debug log messages
With this change, if there are debug messages that are multiple lines, each line
will be prefaced with the '>>' marker.

Signed-off-by: Shaun Ruffell <sruffell@sruffell.net>
2020-03-04 07:44:05 +01:00
Shaun Ruffell
1b968e8aa3 Interval: Add operators == and !=
Can be used to check the database format before committing.

Signed-off-by: Shaun Ruffell <sruffell@sruffell.net>
2020-03-04 07:44:05 +01:00
Thomas Lauf
bf87509329 Handle case of empty interval, fix tests
Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-03-03 22:24:45 +01:00
Johannes Hertenstein
da27fdcdf0 285: Pass interval id to extensions 2020-03-03 22:23:21 +01:00
Thomas Lauf
e8511c5efd Extract function CLI::getDuration ()
Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-03-03 07:58:04 +01:00
Thomas Lauf
0c1d7291e2 Use <..> instead of ".." for #include statements
Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-03-03 07:57:33 +01:00
Thomas Lauf
368d033ce5 Rename atomic to AtomicFileTest
- Avoid possible clash with lib atomic on macOS, e.g. in /Library/Developer/CommandLineTools/usr/include/c++/v1/memory:668

Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-03-02 21:42:53 +01:00
Thomas Lauf
551964eb15 Fix check for libfiu usage
- on macOS, use "otool -L" instead of "ldd"

Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-03-01 21:08:32 +01:00
Thomas Lauf
888e715782 Streamline generation of additional help
- do filtering outside CmdHelp.cpp
- generate only concepts
- use join from libshared

Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-03-01 21:08:32 +01:00
Thomas Lauf
f1cf29d0ec Add some whitespace
Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-03-01 21:08:32 +01:00
Shaun Ruffell
a796baec32 CmdHelp: Generate 'additional help' section from man pages
This will ensure that the additional help displayed will match valid
help targets.

Signed-off-by: Shaun Ruffell <sruffell@sruffell.net>
2020-03-01 21:02:43 +01:00
Shaun Ruffell
b5df2a2aa5 CmdHelp: Return error if man command fails
I feel this is expected behavior, but also eliminates the following compile time
warning on one of my systems:

  warning: ignoring return value of ‘int system(const char*)’, declared with
    attribute warn_unused_result [-Wunused-result]

Signed-off-by: Shaun Ruffell <sruffell@sruffell.net>
2020-03-01 21:02:43 +01:00
Thomas Lauf
9ae84426d9 Upgrade pip
Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-03-01 20:33:41 +01:00
Thomas Lauf
fa4371d30c Return exit code of ./problems, not the last command, on macOS
Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-03-01 20:33:40 +01:00
Thomas Lauf
5ab9b86e56 Set python version explicitly to python3
- Closes #259

Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-02-23 21:32:39 +01:00
Thomas Lauf
6b75a5f92d Set bufsize to '-1' so we use io.DEFAULT_BUFFER_SIZE
- Removes RuntimeWarning: line buffering (buffering=1) isn't supported in binary mode, the default buffer size will be used

Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-02-23 19:26:29 +01:00
Thomas Lauf
d960a5fede Drop the explicit 80-character limit from coding style
- As a general rule of thumb: "one sentence/statement per line"

Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-02-23 19:03:54 +01:00
Thomas Lauf
ad9ca3e46e Remove Python 2.7 from contribution guidelines
Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-02-23 19:03:54 +01:00
Thomas Lauf
2f64f38bc0 Add Developer Certificate of Origin (DCO)
- See https://developercertificate.org/

Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-02-23 19:03:54 +01:00
Thomas Lauf
72f13b859f Remove obsolete code
Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-02-23 19:03:54 +01:00
Thomas Lauf
cb7240fe1a Linebreak after <"""> in multiline doc-comments
Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-02-23 19:03:54 +01:00
Thomas Lauf
457e73f772 Remove unnecessary input
- ":yes" hint already takes care of that

Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-02-23 19:03:54 +01:00
Thomas Lauf
bb73c293ef Remove line breaks
Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-02-23 19:03:54 +01:00
Thomas Lauf
28da1b55f2 Hoist verbose flag 2020-02-23 19:03:54 +01:00
Shaun Ruffell
213eb44954 Do not always create timewarrior.cfg file
I tried placing my timewarrior database in Dropbox and noticed that everytime
I ran a command, Dropbox would indicate that it was syncing. Running fswatch
on macOS I saw that there was an event for timewarrior.cfg on every run. This
change eliminates the file system events when not writing to the database.

Related to #284
2020-02-23 19:03:40 +01:00
Shaun Ruffell
dcfe0d1c3d test/docker: containers should return non-zero values on failures 2020-02-23 19:03:40 +01:00
Shaun Ruffell
926ecd7333 test: Add write-failure.t
This test uses libfiu to create random failures in fputs and the write system
calls to verify out-of-space errors on the filesystem do not corrupt the
database.

Related to #155
2020-02-23 19:03:40 +01:00
Shaun Ruffell
4798e6f26b Database: Recreate tags.data from interval data if parsing fails.
If the tags database has been corrupted for any reason we should recreate it.
This commit simplified some of the negative testing for AtomicFiles.
2020-02-23 19:03:40 +01:00
Shaun Ruffell
aa7a674ca6 Do not write tag database if it is not changed.
Database objects were unconditionally writing out the tags database
file. For commands that are not modifying any tags, this is unnecessary.
We will now track if there have been modifications so we can use it to
determine if we need to save the tags to a file.

Closes #284
2020-02-23 19:03:40 +01:00
Shaun Ruffell
4b3a907cbb Use AtomicFile for data, tags, undo, and config files
Now changes accross all of these files either happen all together or not
at all.

Related to issue #155
2020-02-23 19:03:40 +01:00
Shaun Ruffell
8e99c07d85 Introduce AtomicFiles
Introduce AtomicFile and a test of this module to the code.

AtomicFile is like File, except all writes go to temporary files until
the class method finalize_all () is called and the temporary files are
copied over the real files. If any writes fail, like when there is no
more space on the filesystem, none of the files in the database will be
modified.

Since we need version 1.00 of libfiu, I have only added it to the debian
testing container, which includes libfiu-1.00 in the default repository.

Related to #155
2020-02-23 19:03:40 +01:00
Shaun Ruffell
6db1d2b859 Do not construct File when a Path will suffice
There were places in Database, CmdReport, and CmdHelp that were using a File
object when only the Path interface was needed. This is some minor cleanup I
noticed while studying the File usage as part of preparating for converting to
AtomicFile.
2020-02-23 19:03:40 +01:00
Thomas Lauf
35a38d628c Optimize handling of implicit latest interval
- If no id is given but active time tracking (i.e. open interval) is present
  then apply the command to the open interval
2020-02-01 23:49:56 +01:00
Thomas Lauf
711848915b Test for no ids
Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
2020-02-01 23:49:56 +01:00