Merge branch 'master' into 2.2.0

- merge of 2.1.2 release being now the current released version in
  master.

Conflicts:
	CMakeLists.txt
	NEWS
	test/bug.1104.t
	test/run_all
This commit is contained in:
Federico Hernandez 2012-09-18 22:58:59 +02:00
commit a3242f7b5b
19 changed files with 175 additions and 79 deletions

View file

@ -1,6 +1,12 @@
------ current release ---------------------------
2.2.0 ()
2.1.2 (2012-09-18) 1e3176ed70d2b50faf03838d0df279b2a4ae93b2
Bugs
+ Bug fix release regarding #1104, which causes duplicate UUIDs during
the merge command.
+ Fixed bug where shadow files are not properly created when there is a missing
.taskrc file (thanks to Pietro Cerutti).
Features
+ Added Feature #1069, which gives a clearer error when a UDA

9
NEWS
View file

@ -6,20 +6,17 @@ New Features in taskwarrior 2.2.0
- Deprectated 'fg' and 'bg' attributes removed. Any residual use of those
will appear as orphaned UDAs.
Please refer to the ChangeLog file for full details. There are too many to
list here.
New commands in taskwarrior 2.2.0
- New '_aliases' helper command lists aliases for completion purposes.
New configuration options in taskwarrior 2.2.0
-
-
Newly deprecated features in taskwarrior 2.2.0
- None
-
---

View file

@ -1,4 +1,4 @@
.TH task-color 5 2012-07-24 "${PACKAGE_STRING}" "User Manuals"
.TH task-color 5 2012-09-18 "${PACKAGE_STRING}" "User Manuals"
.SH NAME
task-color \- A color tutorial for the taskwarrior command line todo manager.

View file

@ -1,4 +1,4 @@
.TH task-faq 5 2012-07-24 "${PACKAGE_STRING}" "User Manuals"
.TH task-faq 5 2012-09-18 "${PACKAGE_STRING}" "User Manuals"
.SH NAME
task-faq \- A FAQ for the task(1) command line todo manager.

View file

@ -1,4 +1,4 @@
.TH task-sync 5 2012-07-24 "${PACKAGE_STRING}" "User Manuals"
.TH task-sync 5 2012-09-18 "${PACKAGE_STRING}" "User Manuals"
.SH NAME
task-sync \- A tutorial for the task(1) data synchronization capabilities.

View file

@ -1,4 +1,4 @@
.TH task-tutorial 5 2012-07-24 "${PACKAGE_STRING}" "User Manuals"
.TH task-tutorial 5 2012-09-18 "${PACKAGE_STRING}" "User Manuals"
.SH NAME
task-tutorial \- A tutorial for the task(1) command line todo manager.

View file

@ -1,4 +1,4 @@
.TH task 1 2012-07-24 "${PACKAGE_STRING}" "User Manuals"
.TH task 1 2012-09-18 "${PACKAGE_STRING}" "User Manuals"
.SH NAME
task \- A command line todo manager.

View file

@ -1,4 +1,4 @@
.TH taskrc 5 2012-07-24 "${PACKAGE_STRING}" "User Manuals"
.TH taskrc 5 2012-09-18 "${PACKAGE_STRING}" "User Manuals"
.SH NAME
taskrc \- Configuration file for the task(1) command

Binary file not shown.

Binary file not shown.

View file

@ -503,6 +503,7 @@ void Context::shadow ()
{
std::string file_name = config.get ("shadow.file");
std::string command = config.get ("shadow.command");
std::string rcfile = rc_file;
// A missing shadow file command uses the default command instead.
if (command == "")
@ -534,13 +535,14 @@ void Context::shadow ()
// Compose the command. Put the rc overrides up front, so that they may
// be overridden by rc.shadow.command.
command = program +
" rc.detection:off" + // No need to determine terminal size
" rc.color:off" + // Color off by default
" rc.gc:off " + // GC off, to reduce headaches
command + // User specified command
" >" + // Capture
shadow_file._data; // User specified file
command = program +
" rc.detection:off" + // No need to determine terminal size
" rc.color:off" + // Color off by default
" rc.gc:off " + // GC off, to reduce headaches
" rc:" + rcfile + " " + // Use specified rc file
command + // User specified command
" >" + // Capture
shadow_file._data; // User specified file
debug ("Running shadow command: " + command);
system (command.c_str ());

View file

@ -1024,8 +1024,8 @@ void TDB2::merge (const std::string& mergeFile)
mods.splice (mods.begin (), rmods);
DEBUG_STR ("sorting taskmod list");
mods.sort ();
mods_history.sort ();
mods.sort (compareTaskmod);
mods_history.sort (compareTaskmod);
}
else if (rit == r.end ())
{
@ -1232,7 +1232,7 @@ void TDB2::merge (const std::string& mergeFile)
// at this point undo contains the lines up to the branch-off point
// now we merge mods (new modifications from mergefile)
// with lmods (part of old undo.data)
lmods.sort();
lmods.sort(compareTaskmod);
mods.merge (lmods);
mods.merge (mods_history);

View file

@ -33,22 +33,38 @@
#include <assert.h>
#include <Taskmod.h>
unsigned long Taskmod::curSequenceNumber = 0;
bool compareTaskmod (Taskmod first, Taskmod second)
{
if (first._timestamp == second._timestamp)
{
return first._sequenceNumber < second._sequenceNumber;
}
else
{
return first._timestamp < second._timestamp;
}
}
////////////////////////////////////////////////////////////////////////////////
Taskmod::Taskmod ()
{
_timestamp = 0;
_bAfterSet = false;
_bBeforeSet = false;
_sequenceNumber = curSequenceNumber++;
}
////////////////////////////////////////////////////////////////////////////////
Taskmod::Taskmod (const Taskmod& other)
{
this->_before = other._before;
this->_after = other._after;
this->_timestamp = other._timestamp;
this->_bAfterSet = other._bAfterSet;
this->_bBeforeSet = other._bBeforeSet;
this->_before = other._before;
this->_after = other._after;
this->_timestamp = other._timestamp;
this->_bAfterSet = other._bAfterSet;
this->_bBeforeSet = other._bBeforeSet;
this->_sequenceNumber = other._sequenceNumber;
}
////////////////////////////////////////////////////////////////////////////////
@ -87,11 +103,12 @@ Taskmod& Taskmod::operator= (const Taskmod& other)
{
if (this != &other)
{
this->_before = other._before;
this->_after = other._after;
this->_timestamp = other._timestamp;
this->_bAfterSet = other._bAfterSet;
this->_bBeforeSet = other._bBeforeSet;
this->_before = other._before;
this->_after = other._after;
this->_timestamp = other._timestamp;
this->_bAfterSet = other._bAfterSet;
this->_bBeforeSet = other._bBeforeSet;
this->_sequenceNumber = other._sequenceNumber;
}
return *this;
@ -100,9 +117,10 @@ Taskmod& Taskmod::operator= (const Taskmod& other)
////////////////////////////////////////////////////////////////////////////////
void Taskmod::reset (long timestamp)
{
this->_bAfterSet = false;
this->_bBeforeSet = false;
this->_timestamp = timestamp;
this->_bAfterSet = false;
this->_bBeforeSet = false;
this->_timestamp = timestamp;
this->_sequenceNumber = curSequenceNumber++;
}
////////////////////////////////////////////////////////////////////////////////
@ -177,6 +195,12 @@ void Taskmod::setTimestamp (long timestamp)
this->_timestamp = timestamp;
}
////////////////////////////////////////////////////////////////////////////////
void Taskmod::incSequenceNumber ()
{
this->_sequenceNumber++;
}
////////////////////////////////////////////////////////////////////////////////
Task& Taskmod::getAfter ()
{
@ -195,6 +219,12 @@ long Taskmod::getTimestamp () const
return _timestamp;
}
////////////////////////////////////////////////////////////////////////////////
unsigned long Taskmod::getSequenceNumber () const
{
return _sequenceNumber;
}
////////////////////////////////////////////////////////////////////////////////
std::string Taskmod::getTimeStr () const
{

View file

@ -33,6 +33,8 @@
#include <Task.h>
class Taskmod {
friend bool compareTaskmod (Taskmod first, Taskmod second);
public:
Taskmod ();
Taskmod (const Taskmod& other);
@ -59,11 +61,13 @@ public:
void setAfter (const Task& after);
void setBefore (const Task& before);
void setTimestamp (long timestamp);
void incSequenceNumber ();
// getter
Task& getAfter ();
Task& getBefore ();
long getTimestamp () const;
unsigned long getSequenceNumber () const;
std::string getTimeStr () const;
protected:
@ -72,7 +76,12 @@ protected:
long _timestamp;
bool _bAfterSet;
bool _bBeforeSet;
unsigned long _sequenceNumber;
static unsigned long curSequenceNumber;
};
bool compareTaskmod (Taskmod first, Taskmod second);
#endif

1
test/.gitignore vendored
View file

@ -26,3 +26,4 @@ view.t
json_test
run_all

View file

@ -10,7 +10,17 @@ set (test_SRCS autocomplete.t color.t config.t date.t directory.t dom.t
duration.t file.t i18n.t json.t list.t nibbler.t path.t rx.t
t.t t2.t taskmod.t tdb2.t text.t uri.t util.t view.t json_test)
add_custom_target (test ./run_all DEPENDS ${test_SRCS} task_executable
message ("-- Configuring run_all")
set (TESTBLOB "*.t")
if (CYGWIN)
set (TESTBLOB "*.t *.t.exe")
endif (CYGWIN)
configure_file (
${CMAKE_SOURCE_DIR}/test/run_all.in
${CMAKE_SOURCE_DIR}/test/run_all)
add_custom_target (test ./run_all --verbose
DEPENDS ${test_SRCS} task_executable
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/test)
add_custom_target (build_tests DEPENDS ${test_SRCS}

View file

@ -30,14 +30,16 @@ use strict;
use warnings;
use File::Copy;
use File::Path;
use Test::More tests => 18;
use Test::More tests => 28;
mkdir("1", 0755);
mkdir("2", 0755);
mkdir("3", 0755);
mkdir("dropbox", 0755);
ok (-e "1", 'Created directory 1/');
ok (-e "2", 'Created directory 2/');
ok (-e "3", 'Created directory 3/');
ok (-e "dropbox", 'Created directory dropbox/');
# Create the rc file.
@ -68,25 +70,47 @@ if (open my $fh, '>', '2.rc')
ok (-r '2.rc', 'Created 2.rc');
}
# Create the rc file.
if (open my $fh, '>', '3.rc')
{
print $fh "data.location=3/\n";
print $fh "confirmation=no\n";
print $fh "merge.autopush=yes\n";
print $fh "merge.default.uri=./dropbox/\n";
print $fh "push.default.uri=./dropbox/\n";
print $fh "pull.default.uri=./dropbox/\n";
close $fh;
ok (-r '3.rc', 'Created 3.rc');
}
# Once-only push from 1 --> dropbox
my $output = qx{../src/task rc:1.rc add one 2>&1};
ok ($? == 0, 'Exit status check');
$output = qx{../src/task rc:1.rc add two 2>&1};
ok ($? == 0, 'Exit status check');
$output = qx{../src/task rc:1.rc add three 2>&1};
ok ($? == 0, 'Exit status check');
$output = qx{../src/task rc:1.rc push 2>&1};
ok ($? == 0, 'Exit status check');
# Merges to 2
# Merges to 2 and 3
$output = qx{../src/task rc:2.rc merge 2>&1};
ok ($? == 0, 'Exit status check');
$output = qx{../src/task rc:3.rc merge 2>&1};
ok ($? == 0, 'Exit status check');
# Make a different change in both locations
$output = qx{../src/task rc:1.rc add two 2>&1};
$output = qx{../src/task rc:1.rc add four 2>&1};
ok ($? == 0, 'Exit status check');
$output = qx{../src/task rc:1.rc two done 2>&1};
$output = qx{../src/task rc:1.rc four done 2>&1};
ok ($? == 0, 'Exit status check');
$output = qx{../src/task rc:2.rc 1 done 2>&1};
$output = qx{../src/task rc:2.rc one done 2>&1};
ok ($? == 0, 'Exit status check');
$output = qx{../src/task rc:3.rc three delete 2>&1};
ok ($? == 0, 'Exit status check');
# Merges everywhere
# Merges 1 and 2
$output = qx{../src/task rc:1.rc merge 2>&1};
ok ($? == 0, 'Exit status check');
$output = qx{../src/task rc:2.rc merge 2>&1};
@ -102,8 +126,18 @@ ok ($? == 0, 'Exit status check');
$output = qx{../src/task rc:1.rc diag 2>&1};
unlike ($output, qr/Found duplicate/, "Found duplicate");
# Merges 3
$output = qx{../src/task rc:3.rc merge 2>&1};
ok ($? == 0, 'Exit status check');
unlike ($output, qr/Retaining/, "Must not retain changes");
# Merges 1
$output = qx{../src/task rc:1.rc merge 2>&1};
ok ($? == 0, 'Exit status check');
unlike ($output, qr/Retaining/, "Must not retain changes");
# Cleanup.
unlink qw(1.rc 1/pending.data 1/completed.data 1/undo.data 1/backlog.data 1/synch.key 2/pending.data 2/completed.data 2/undo.data 2.rc 2/backlog.data 2/synch.key dropbox/completed.data dropbox/pending.data dropbox/undo.data);
unlink qw(1.rc 1/pending.data 1/completed.data 1/undo.data 1/backlog.data 1/synch.key 2/pending.data 2/completed.data 2/undo.data 2.rc 2/backlog.data 2/synch.key dropbox/completed.data dropbox/pending.data dropbox/undo.data 3/pending.data 3/undo.data 3/completed.data 3/backlog.data 3/synch.key 3.rc);
ok (! -r '1/pending.data' &&
! -r '1/completed.data' &&
! -r '1/undo.data' &&
@ -116,13 +150,20 @@ ok (! -r '1/pending.data' &&
! -r '2/backlog.data' &&
! -r '2/synch.key' &&
! -r '2.rc' &&
! -r '3/pending.data' &&
! -r '3/completed.data' &&
! -r '3/undo.data' &&
! -r '3/backlog.data' &&
! -r '3/synch.key' &&
! -r '3.rc' &&
! -r 'dropbox/pending.data' &&
! -r 'dropbox/completed.data' &&
! -r 'dropbox/undo.data' , 'Cleanup');
rmtree (['1', '2', 'dropbox'], 0, 1);
rmtree (['1', '2', '3', 'dropbox'], 0, 1);
ok (! -e '1' &&
! -e '2' &&
! -e '3' &&
! -e 'dropbox', 'Removed directories');
exit 0;

View file

@ -142,37 +142,37 @@ int main (int argc, char** argv)
try
{
// Regular unit tests.
t.is (json::encode ("1\b2"), "1\\b2", "json::encode \\b -> \\\\b");
t.is (json::decode ("1\\b2"), "1\b2", "json::decode \\\\b -> \\b");
t.is (json::encode ("1\b2"), "1\\b2", "json::encode slashslashb -> slashslashslashslashb");
t.is (json::decode ("1\\b2"), "1\b2", "json::decode slashslashslashslashb -> slashslashb");
t.is (json::encode ("1\n2"), "1\\n2", "json::encode \\n -> \\\\n");
t.is (json::decode ("1\\n2"), "1\n2", "json::decode \\\\n -> \\n");
t.is (json::encode ("1\n2"), "1\\n2", "json::encode slashslashn -> slashslashslashslashn");
t.is (json::decode ("1\\n2"), "1\n2", "json::decode slashslashslashslashn -> slashslashn");
t.is (json::encode ("1\r2"), "1\\r2", "json::encode \\r -> \\\\r");
t.is (json::decode ("1\\r2"), "1\r2", "json::decode \\\\r -> \\r");
t.is (json::encode ("1\r2"), "1\\r2", "json::encode slashslashr -> slashslashslashslashr");
t.is (json::decode ("1\\r2"), "1\r2", "json::decode slashslashslashslashr -> slashslashr");
t.is (json::encode ("1\t2"), "1\\t2", "json::encode \\t -> \\\\t");
t.is (json::decode ("1\\t2"), "1\t2", "json::decode \\\\t -> \\t");
t.is (json::encode ("1\t2"), "1\\t2", "json::encode slashslasht -> slashslashslashslasht");
t.is (json::decode ("1\\t2"), "1\t2", "json::decode slashslashslashslasht -> slashslasht");
t.is (json::encode ("1\\2"), "1\\\\2", "json::encode \\ -> \\\\");
t.is (json::decode ("1\\\\2"), "1\\2", "json::decode \\\\ -> \\");
t.is (json::encode ("1\\2"), "1\\\\2", "json::encode slashslash -> slashslashslashslash");
t.is (json::decode ("1\\\\2"), "1\\2", "json::decode slashslashslashslash -> slashslash");
t.is (json::encode ("1\x2"), "1\x2", "json::encode \\x -> \\x (NOP)");
t.is (json::decode ("1\x2"), "1\x2", "json::decode \\x -> \\x (NOP)");
t.is (json::encode ("1\x2"), "1\x2", "json::encode slashslashx -> slashslashx(NOP)");
t.is (json::decode ("1\x2"), "1\x2", "json::decode slashslashx -> slashslashx(NOP)");
t.is (json::encode ("1€2"), "1€2", "json::encode € -> €");
t.is (json::decode ("1\\u20ac2"), "1€2", "json::decode \\u20ac -> €");
t.is (json::decode ("1\\u20ac2"), "1€2", "json::decode slashslashu20ac -> €");
std::string encoded = json::encode ("one\\");
t.is (encoded, "one\\\\", "json::encode one\\\\ -> one\\\\\\\\");
t.is ((int)encoded.length (), 5, "json::encode one\\\\ -> length 5");
t.is (encoded[0], 'o', "json::encode one\\\\[0] -> o");
t.is (encoded[1], 'n', "json::encode one\\\\[1] -> n");
t.is (encoded[2], 'e', "json::encode one\\\\[2] -> e");
t.is (encoded[3], '\\', "json::encode one\\\\[3] -> \\");
t.is (encoded[4], '\\', "json::encode one\\\\[4] -> \\");
t.is (encoded, "one\\\\", "json::encode oneslashslashslashslash -> oneslashslashslashslashslashslashslashslash");
t.is ((int)encoded.length (), 5, "json::encode oneslashslashslashslash -> length 5");
t.is (encoded[0], 'o', "json::encode oneslashslashslashslash[0] -> o");
t.is (encoded[1], 'n', "json::encode oneslashslashslashslash[1] -> n");
t.is (encoded[2], 'e', "json::encode oneslashslashslashslash[2] -> e");
t.is (encoded[3], '\\', "json::encode oneslashslashslashslash[3] -> slashslash");
t.is (encoded[4], '\\', "json::encode oneslashslashslashslash[4] -> slashslash");
t.is (json::decode (encoded), "one\\", "json::decode one\\\\\\\\ -> one\\\\");
t.is (json::decode (encoded), "one\\", "json::decode oneslashslashslashslashslashslashslashslash -> oneslashslashslashslash");
}
catch (const std::string& e) {t.diag (e);}

View file

@ -2,7 +2,7 @@
if [ x"$1" = x"--verbose" ];
then
for i in *.t *.t.exe
for i in ${TESTBLOB}
do
echo '#' $i
./$i > test.log 2>&1
@ -22,26 +22,26 @@ else
VRAMSTEG=`which vramsteg`
BAR=0
if [ -x "$VRAMSTEG" ]; then
BAR=1
COUNT=0
TOTAL=`ls *.t | wc -l`
START=`$VRAMSTEG --now`
BAR=1
COUNT=0
TOTAL=`ls ${TESTBLOB} | wc -l`
START=`$VRAMSTEG --now`
fi
for i in *.t *.t.exe
for i in ${TESTBLOB}
do
echo '#' $i >>all.log
echo '#' $i >>all.log
if [ $BAR -eq 1 ]; then
$VRAMSTEG --label 'All tests' --min 0 --max $TOTAL --current $COUNT --percentage --start $START --estimate
COUNT=`expr $COUNT + 1`
fi
if [ $BAR -eq 1 ]; then
$VRAMSTEG --label 'All tests' --min 0 --max $TOTAL --current $COUNT --percentage --start $START --estimate
COUNT=`expr $COUNT + 1`
fi
./$i >> all.log 2>&1
./$i >> all.log 2>&1
done
if [ $BAR -eq 1 ]; then
$VRAMSTEG --remove
$VRAMSTEG --remove
fi
date >> all.log