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 --------------------------- ------ 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 Features
+ Added Feature #1069, which gives a clearer error when a UDA + Added Feature #1069, which gives a clearer error when a UDA

5
NEWS
View file

@ -6,9 +6,6 @@ New Features in taskwarrior 2.2.0
- Deprectated 'fg' and 'bg' attributes removed. Any residual use of those - Deprectated 'fg' and 'bg' attributes removed. Any residual use of those
will appear as orphaned UDAs. 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 commands in taskwarrior 2.2.0
- New '_aliases' helper command lists aliases for completion purposes. - New '_aliases' helper command lists aliases for completion purposes.
@ -19,7 +16,7 @@ New configuration options in taskwarrior 2.2.0
Newly deprecated features 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 .SH NAME
task-color \- A color tutorial for the taskwarrior command line todo manager. 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 .SH NAME
task-faq \- A FAQ for the task(1) command line todo manager. 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 .SH NAME
task-sync \- A tutorial for the task(1) data synchronization capabilities. 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 .SH NAME
task-tutorial \- A tutorial for the task(1) command line todo manager. 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 .SH NAME
task \- A command line todo manager. 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 .SH NAME
taskrc \- Configuration file for the task(1) command 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 file_name = config.get ("shadow.file");
std::string command = config.get ("shadow.command"); std::string command = config.get ("shadow.command");
std::string rcfile = rc_file;
// A missing shadow file command uses the default command instead. // A missing shadow file command uses the default command instead.
if (command == "") if (command == "")
@ -534,13 +535,14 @@ void Context::shadow ()
// Compose the command. Put the rc overrides up front, so that they may // Compose the command. Put the rc overrides up front, so that they may
// be overridden by rc.shadow.command. // be overridden by rc.shadow.command.
command = program + command = program +
" rc.detection:off" + // No need to determine terminal size " rc.detection:off" + // No need to determine terminal size
" rc.color:off" + // Color off by default " rc.color:off" + // Color off by default
" rc.gc:off " + // GC off, to reduce headaches " rc.gc:off " + // GC off, to reduce headaches
command + // User specified command " rc:" + rcfile + " " + // Use specified rc file
" >" + // Capture command + // User specified command
shadow_file._data; // User specified file " >" + // Capture
shadow_file._data; // User specified file
debug ("Running shadow command: " + command); debug ("Running shadow command: " + command);
system (command.c_str ()); system (command.c_str ());

View file

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

View file

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

View file

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

1
test/.gitignore vendored
View file

@ -26,3 +26,4 @@ view.t
json_test 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 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) 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) WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/test)
add_custom_target (build_tests DEPENDS ${test_SRCS} add_custom_target (build_tests DEPENDS ${test_SRCS}

View file

@ -30,14 +30,16 @@ use strict;
use warnings; use warnings;
use File::Copy; use File::Copy;
use File::Path; use File::Path;
use Test::More tests => 18; use Test::More tests => 28;
mkdir("1", 0755); mkdir("1", 0755);
mkdir("2", 0755); mkdir("2", 0755);
mkdir("3", 0755);
mkdir("dropbox", 0755); mkdir("dropbox", 0755);
ok (-e "1", 'Created directory 1/'); ok (-e "1", 'Created directory 1/');
ok (-e "2", 'Created directory 2/'); ok (-e "2", 'Created directory 2/');
ok (-e "3", 'Created directory 3/');
ok (-e "dropbox", 'Created directory dropbox/'); ok (-e "dropbox", 'Created directory dropbox/');
# Create the rc file. # Create the rc file.
@ -68,25 +70,47 @@ if (open my $fh, '>', '2.rc')
ok (-r '2.rc', 'Created 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 # Once-only push from 1 --> dropbox
my $output = qx{../src/task rc:1.rc add one 2>&1}; my $output = qx{../src/task rc:1.rc add one 2>&1};
ok ($? == 0, 'Exit status check'); 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}; $output = qx{../src/task rc:1.rc push 2>&1};
ok ($? == 0, 'Exit status check'); ok ($? == 0, 'Exit status check');
# Merges to 2 # Merges to 2 and 3
$output = qx{../src/task rc:2.rc merge 2>&1}; $output = qx{../src/task rc:2.rc merge 2>&1};
ok ($? == 0, 'Exit status check'); 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 # 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'); 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'); 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'); ok ($? == 0, 'Exit status check');
# Merges everywhere # Merges 1 and 2
$output = qx{../src/task rc:1.rc merge 2>&1}; $output = qx{../src/task rc:1.rc merge 2>&1};
ok ($? == 0, 'Exit status check'); ok ($? == 0, 'Exit status check');
$output = qx{../src/task rc:2.rc merge 2>&1}; $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}; $output = qx{../src/task rc:1.rc diag 2>&1};
unlike ($output, qr/Found duplicate/, "Found duplicate"); 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. # 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' && ok (! -r '1/pending.data' &&
! -r '1/completed.data' && ! -r '1/completed.data' &&
! -r '1/undo.data' && ! -r '1/undo.data' &&
@ -116,13 +150,20 @@ ok (! -r '1/pending.data' &&
! -r '2/backlog.data' && ! -r '2/backlog.data' &&
! -r '2/synch.key' && ! -r '2/synch.key' &&
! -r '2.rc' && ! -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/pending.data' &&
! -r 'dropbox/completed.data' && ! -r 'dropbox/completed.data' &&
! -r 'dropbox/undo.data' , 'Cleanup'); ! -r 'dropbox/undo.data' , 'Cleanup');
rmtree (['1', '2', 'dropbox'], 0, 1); rmtree (['1', '2', '3', 'dropbox'], 0, 1);
ok (! -e '1' && ok (! -e '1' &&
! -e '2' && ! -e '2' &&
! -e '3' &&
! -e 'dropbox', 'Removed directories'); ! -e 'dropbox', 'Removed directories');
exit 0; exit 0;

View file

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

View file

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