Merge command

- improved merge.autopush=ask
- fixed newline issues
- fixed: entries for new tasks got lost in undo.data
This commit is contained in:
Johannes Schlatow 2010-10-06 12:57:14 +02:00
parent 5c36013ddd
commit b041e54be6
3 changed files with 39 additions and 20 deletions

View file

@ -1141,7 +1141,7 @@ void TDB::merge (const std::string& mergeFile)
lline = *lit; lline = *lit;
// push the line to the new undo.data // push the line to the new undo.data
undo.push_back (lline); undo.push_back (lline + "\n");
// found first matching lines? // found first matching lines?
if (lline.compare (rline) == 0) if (lline.compare (rline) == 0)
@ -1389,7 +1389,8 @@ void TDB::merge (const std::string& mergeFile)
// iterate over taskmod list // iterate over taskmod list
std::list<Taskmod>::iterator it; std::list<Taskmod>::iterator it;
for (it = mods.begin (); it != mods.end (); ) { for (it = mods.begin (); it != mods.end (); )
{
std::list<Taskmod>::iterator current = it++; std::list<Taskmod>::iterator current = it++;
Taskmod tmod = *current; Taskmod tmod = *current;
@ -1507,13 +1508,18 @@ void TDB::merge (const std::string& mergeFile)
if (!found) if (!found)
{ {
std::cout << "Adding " << uuid << "\n"; std::cout << "Adding " << uuid << "\n";
pending.push_back (tmod.getAfter ().composeF4 ()); // remove the \n from composeF4() string
std::string newline = tmod.getAfter ().composeF4 ();
newline = newline.substr (0, newline.length ()-1);
pending.push_back (newline);
} }
else else
{
std::cout << "Not adding duplicate " << uuid << "\n"; std::cout << "Not adding duplicate " << uuid << "\n";
mods.erase (current); mods.erase (current);
} }
} }
}
// write pending file // write pending file
if (! File::write (pendingFile, pending)) if (! File::write (pendingFile, pending))
@ -1535,7 +1541,7 @@ void TDB::merge (const std::string& mergeFile)
} }
// write undo file // write undo file
if (! File::write (undoFile, undo, true)) if (! File::write (undoFile, undo, false))
throw std::string ("Could not write '") + undoFile + "'."; throw std::string ("Could not write '") + undoFile + "'.";
} }
else // nothing to be done else // nothing to be done

View file

@ -583,18 +583,28 @@ void handleMerge (std::string& outs)
if (context.hooks.trigger ("pre-merge-command")) if (context.hooks.trigger ("pre-merge-command"))
{ {
std::string file = trim (context.task.get ("description")); std::string file = trim (context.task.get ("description"));
std::string pushfile = "";
std::string tmpfile = ""; std::string tmpfile = "";
std::string sAutopush = context.config.get ("merge.autopush");
bool bAutopush = context.config.getBoolean("merge.autopush");
if (file.length () == 0) if (file.length () == 0)
{ {
// get default target from config // get default target from config
file = context.config.get ("merge.default.uri"); file = context.config.get ("merge.default.uri");
if (sAutopush == "ask")
pushfile = context.config.get ("push.default.uri");
} }
else else
{ {
// replace argument with uri from config // replace argument with uri from config
std::string tmp = context.config.get ("merge." + file + ".uri"); std::string tmp = context.config.get ("merge." + file + ".uri");
if (sAutopush == "ask")
pushfile = context.config.get ("push." + file + ".uri");
if (tmp != "") if (tmp != "")
file = tmp; file = tmp;
} }
@ -631,20 +641,17 @@ void handleMerge (std::string& outs)
if (tmpfile != "") if (tmpfile != "")
{ {
remove (tmpfile.c_str()); remove (tmpfile.c_str());
}
std::string autopush = context.config.get ("merge.autopush"); if ( ((sAutopush == "ask") && (confirm ("Do you want to push the changes to \'" + pushfile + "\'?")) )
|| (bAutopush) )
// TODO Task accepts many different values for "yes". Try Config::getBoolean.
if ( ((autopush == "ask") && (confirm ("Do you want to push the changes to the database you merged from?")) )
|| (autopush == "yes") )
{ {
std::string out; std::string out;
handlePush(out); handlePush(out);
} }
}
} }
else // TODO : get default source from config file else
throw std::string ("You must specify a file to merge."); throw std::string ("You must specify a file to merge.");
} }
} }
@ -663,7 +670,7 @@ void handlePush (std::string& outs)
} }
else else
{ {
// replace argument with uri from config // try to replace argument with uri from config
std::string tmp = context.config.get ("push." + file + ".uri"); std::string tmp = context.config.get ("push." + file + ".uri");
if (tmp != "") if (tmp != "")
@ -682,12 +689,16 @@ void handlePush (std::string& outs)
} }
else else
{ {
throw std::string ("Push failed"); // TODO copy files
//std::ifstream ifile (location.data + "/undo.data", std::ios_base::binary);
//std::ofstream ofile (location.data + "/undo.data", std::ios_base::binary);
throw std::string ("Push to local targets is not (yet) supported.");
} }
context.hooks.trigger ("post-push-command"); context.hooks.trigger ("post-push-command");
} }
else // TODO : get default target from config file else
throw std::string ("You must specify a target."); throw std::string ("You must specify a target.");
} }
} }
@ -739,7 +750,7 @@ void handlePull (std::string& outs)
context.hooks.trigger ("post-pull-command"); context.hooks.trigger ("post-pull-command");
} }
else // TODO : get default target from config file else
throw std::string ("You must specify a target."); throw std::string ("You must specify a target.");
} }
} }

View file

@ -136,7 +136,9 @@ sleep(1);
qx{../task rc:remote.rc 4 +gym}; # right_newer qx{../task rc:remote.rc 4 +gym}; # right_newer
# merge remote into local # merge remote into local
copy("local/undo.data", "local/undo.save") or fail("copy local/undo.data to local/undo.save");
my $output_l = qx{../task rc:local.rc merge remote/undo.data}; my $output_l = qx{../task rc:local.rc merge remote/undo.data};
rename("local/undo.save", "local/undo.data") or fail("rename local/undo.save in local/undo.data");
#check output #check output
like ($output_l, qr/Running redo/, "local-merge finished"); like ($output_l, qr/Running redo/, "local-merge finished");