We cannot use the filter options when importing events.
This was noticed because the new calcurse argument parser catches
invalid input flag combinations and bails out.
Partly addresses GitHub issue #177.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Simplify the key formatting function and enforce display width properly
using the UTF8 chopping function.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Also, use the modern key name instead of the backwards compatibility
name.
Addresses GitHub issue #168.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Addresses a copy-paste typo introduced in commit 65064ce (Check if the
configuration folder exists, 2018-08-25).
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
* Add more details on the project directory structure.
* Add information on contributions and donations.
* Move contributors to the manual but keep a reference.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
When editing the start time, move the item instead of keeping the
previous start time as end time. When editing the end time, start with
an empty end time instead of the previous start time.
Fixes GitHub issue #89.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Add a static state variable to indicate whether the notification thread
is already running or not. Only start the thread if the notification
thread is paused. Only stop the thread if the notification thread is
actually running.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
The previous implementation only read a prefix from the configuration
file if the configuration value was too long and forgot to terminate the
string with a NUL character.
Return 0 if the string is too long instead.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
The Authorization header contains the Base64-encoded user name and
password. Remove this information from debug logs, unless the user
explicitly requests to keep them by using the --debug-raw flag.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
The pre-load hook is often used to manipulate the data files before
loading, such as by synchronizing with a remote calendar. Make sure we
always execute the pre-load hook upon reloads, even if the data files
have not been modified.
Fixes GitHub issue #98.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
This prevents from segmentation faults with recent ncurses
implementations. See commit 5722d2e (Fix segmentation fault when
changing colors, 2017-07-28) for details.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
When specifying date ranges using -d, allow for passing negative values
to indicate that the date range should start a certain number of days
ago.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
When importing an iCal event via calcurse fails (i.e. does not return a
single object hash), do not write anything to the synchronization
database instead of blindly appending the entry, thereby potentially
corrupting the database.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
When running calcurse in non-interactive mode, we should not expect any
user input. This is even more important in the case of iCal imports
which are used by calcurse-caldav to import events from CalDAV servers.
Partly fixes GitHub issue #73.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
This reverts commit efd76a0d99.
Passing passwords as command line arguments is not a good idea, since
they may appear in process listings which are potentially visible to
other users logged into the system.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Make sure that in cases when the date and time formats conflict, such as
is the case with "0030", the input is interpreted as a time value, not a
date.
Suggested-by: Lars Henriksen <LarsHenriksen@get2net.dk>
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
In parse_datetime() it was possible to enter any number of dates and
times in any order. Allow just date or time or date followed by time.
Time must be looked for before date because of conflicting time and date
formats.
Suggested-by: Lars Henriksen <LarsHenriksen@get2net.dk>
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Add a wrapper around parse_date() which picks the current input date
format as well as the currently selected day and passes both values to
parse_date(), alongside with the parameters passed to
parse_date_interactive() itself.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Use Markdown syntax for the release notes and rename the release notes
file from NEWS to CHANGES.md.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Add a script to iterate over a certain date range, performing operations
on each of the dates and printing the result. An additional string can
be appended to each of the printed lines.
The script can be used to create "extended recurrent events". For
example
./calcurse-dateutil.py --date 2017-01-01 --range 365 --unique \
--append ' [1] Test event' bom next-weekday 3 skip-days 14
can be used to print an event for each third Thursday of each month in
2017.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Instead of bailing out early in the build process when neither a version
file nor a valid Git repository is detected, use a hardcoded default
version string. This fixes building from shallow clones or Git
snapshots.
Also fixes GitHub issue #22.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
After resolving a save conflict with the merge tool, we need to reload
the data files to import the result of the conflict resolution.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Turn off the local modification flag to avoid a bogus warning when
reloading the data files immediately after the merge process.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
After saving the data files, we need to recompute and store the hashes
to make sure the updated contents is reflected.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Replace the save mutex with a common mutex, which is locked whenever
read or write operations on the data files are performed. Also, since
this mutex is an implementation detail, mark the locking functions
static and remove them from the header file.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
To avoid interactions between the periodic save thread and external
processes, stop the periodic save thread before launching an external
program and restart the thread as soon as the program is terminated.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Instead of blindly reloading data in io_reload_data(), compare the
stored hashes of the data files with hashes of the current file contents
and only reload if any of the hashes differs.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Move the check to compare the stored hashes of the data files with the
current hash to a separate function. This makes the code easier to read
and reusable.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
When reading the data files, compute a cryptographic hash of the file
contents and store it. When saving the files later, ensure that the hash
still matches the current file contents. If it does not, show a warning
to the user and ask whether she wants to execute the merge tool.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Using the file name extension .sav and naming the variables "backup" is
slightly misleading, since the affected files actually contain the
updated content and not some old snapshot. Use the term "new" instead.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Move the code, which runs the merge tool with current and updated data
files, to a separate function to make it reusable.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Support environment variables specific to calcurse to override $EDITOR,
$PAGER and $MERGETOOL.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Introduce a new function keys_wait_for_any_key() and use it instead of
wgetch() whenever the return value is discarded.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
When adding a new key binding, automatically select the new binding.
When removing a key binding, keep the selection index (unless the last
binding of a row is removed).
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Always use strncpy() to copy strings between fixed-size buffers and pass
the buffer size as maximal length parameter.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
A new function keys_wgetch() reads full UTF-8 characters instead of
single ASCII characters only.
Key bindings for regular ASCII characters are stored in a hash map while
the actions of keys with higher code points are stored in a linked list
for space efficiency.
The key serialization methods are updated to handle UTF-8 characters as
well; extended UTF-8 characters (characters not in the ASCII range) are
serialized by using the hexadecimal representation of the corresponding
code points (e.g. "U+00E4").
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Make sure that the Markdown syntax already used in the README file is
recognized by repository browsers such as cgit or GitHub.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Add two new functions string_catftime(), resp. string_strftime(), which
can be used to append, resp. print, a formatted date to a dynamic
string.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
In the expected output, the punctual appointment (lasting one second in
the iCal data) was missing. The test was not failing because calcurse
did not print the missing item due to a bug. This bug was fixed by
7924315 (Fix support for punctual appointments at 00:00, 2017-08-28),
making the test case fail. Fix the test case as well such that
everything behaves as expected again.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
When checking whether an appointment belongs to a given day in
apoint_inday(), the return value was 0 if the end time of the
appointment matched 00:00 on that day (because we do not want to include
appointments starting on the day before and lasting until midnight).
However, this means that punctual appointments at 00:00 were not
included in any day. Fix the apoint_inday() logic to take this into
consideration.
Fixes GitHub issue #39.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
For the initial calendar-query request, set the Depth header to 1. This
is required because according to RFC 4791, the depth value defaults to 0
if no header is specified.
Fixes GitHub issue #38.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
The pair_content() function can be used to retrieve a color pair. The
foreground and the background color numbers are written to addresses
specified by the second and third parameters. While both parameters were
optional in older ncurses implementations (making it possible to pass
NULL pointers if the one does not care about either foreground or
background color), recent implementations seem to assume that both
parameters are valid pointers. Thus, instead of passing NULL, we need to
pass a pointer to a dummy variable when we do not care about the
background color.
Partly fixes GitHub issue #31.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
In addition to checking whether a recurrent item predates the current
next appointment, we need to check that the actual occurrence of the
item predates the current appointment as well.
Fixes GitHub issue #26.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
The recur_apoint_starts_before() filter function expected the second
parameter to be passed by value, whereas its only caller passed the
value by reference. For consistency with apoint_starts_after(), change
the signature and the implementation of recur_apoint_starts_before()
such that the parameter is passed by reference.
Also, add a comment to the only caller of recur_apoint_starts_before()
to clarify on why recur_apoint_starts_before() is used.
Fixes GitHub issue #25.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Make sure we never read beyond the end of the buffer, even if the
terminating quote of a quoted string is missing.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
According to RFC 5545, iCalendar content lines can have optional
parameters, which can be quoted strings containing colons (":"). Make
sure that such colons are not interpreted as delimiters marking the
start of the value string.
Also, add a test case that covers this corner case.
Reported-by: Håkan Jerning <jerning@home.se>
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Some parameters where swapped accidentally when reworking the diff
computation in c8d3d87 (calcurse-caldav: Compute diffs before
synchronizing, 2016-12-13) such that the synchronization functions were
working with incorrect diffs since that commit. Exchange the parameters
again to fix this.
Reported-by: Guillaume Laurès <guillaume@lauresfamily.fr>
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Instead of computing the objects to push/pull on-demand, use a snapshot
of the synchronization database taken before the synchronization process
starts.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
When importing an appointment from the server, make sure we store a hash
of the item in the sync DB, and not the serialized item itself.
Reported-by: Guillaume Laurès <guillaume@lauresfamily.fr>
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
When there are no new objects to pull from the server, skip the import
routine instead of sending a query that requests zero items.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Instead of performing two synchronization steps (push/pull), split the
synchronization protocol into four steps:
1. Retrieve new objects from the server.
2. Delete local objects that no longer exist on the server.
3. Push new objects to the server.
4. Delete remote objects that no longer exist locally.
Each of the steps is performed by a separate function.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Make sure the visible region is updated after loading items, e.g. when
the users switches from the full todo list to the "uncompleted items
only" view.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Make sure that listbox_fix_visible_region() always updates the visible
region to show the entire list if it fits into the box. Also, reuse
listbox_fix_visible_region() in listbox_resize() instead of duplicating
the code.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Avoid starting multiple daemon instances if the --daemon argument is
passed and the daemon is already running. Terminate the already running
instance before spawning a new one instead.
Suggested-by: Vlad Glagolev <scm@vaygr.net>
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Mention the --daemon command line parameter in the man page. This was
forgotten when adding the flag in 6061fec (Add a --daemon command-line
parameter, 2016-01-28).
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
To prevent from illegal memory access, we checked whether the list of
todo items is empty before performing an interactive todo item action
such as flagging or removal. However, since 1a4bf2b (Add a "hide
completed" view to the todo panel, 2016-01-17), it is possible to hide
completed items from the todo panel. Thus, it may occur that the todo
list box is empty while the list of todo items is not.
To detect such situations as well, teach todo_get_item() to return NULL
if the requested item does not exist. Then, instead of checking whether
the todo item list is non-empty, make sure that the item returned by
todo_get_item() is non-NULL when performing an action.
Reported-by: Vlad Glagolev <scm@vaygr.net>
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Remove the magic constants used in the return value of parse_datetime()
and use named flags instead.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Replace all remaining invocations of parse_time() by parse_datetime()
which now indicates whether a date was supplied or not.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Add support for combined date/time or date-only strings when specifying
the start or end time of a new item.
This is a follow-up to 1f39b5c (Add support for moving items to another
day, 2016-09-30).
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Create a new function that takes a time stamp and updates the date or
time components of that time stamp according to a given date/time
string. Use that function for updating the start time of an item.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
When moving an item (or when changing the start time of an item), allow
for optionally specifying a date. If both date and time are entered, the
item is updated to start on the given date and time. If only a date is
entered, the item is modified to start on the given date, keeping the
current start time. If only a time is entered, the item is modified to
start on the current date and the new start time.
Fixes GitHub issue #12.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Make the function more flexible by returning the updated time instead of
single hour and minute components.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>