# # # patch "src/model/CertList.cpp" # from [334807e02e68d7345007f3ef379d826fdc96ac2a] # to [d147585812cd434c07b6e60017302770a3a38832] # # patch "src/model/GetContentChanged.cpp" # from [9e3924105e5e579903c5f40b2f1b3046afb95d8f] # to [fcf94f37a48b3c17a64a9c734f1f39b696611e3f] # # patch "src/model/GetDatabaseVariables.cpp" # from [d373b3e71be56181bd7be554dacaba2698d076c3] # to [1d0e7a65b24e7566ef20263249d8354b219f8028] # # patch "src/model/GetRevision.cpp" # from [7bfe8d5f4fb09324fbe36861f320d4cf464dadd8] # to [77e81113c7d99c6f5befe9596f3745dd8bc66491] # # patch "src/model/GetRevision.h" # from [4d2f55d9b7a0552abb02eb1a9497ba4b1350eedc] # to [9481a551c1de286717b9729c861b9aac48cef92f] # # patch "src/model/InventoryItem.cpp" # from [668653d908eb9fb5bd06ae29a33df9849471acdd] # to [9f06ddc9094e4b11abd665cd3329ecd028bda0d6] # # patch "src/model/InventoryWatcher.cpp" # from [174b9e0f9aeacae84732ed7aae709cfdef447d4c] # to [ab53430cc129888af881430ad412095bb2bcc161] # # patch "src/model/Keys.cpp" # from [15da8facb87e88eeb55da5339dc30926bb3b9637] # to [0933ca218d2301a62ff0c24b86a0dd25bf6561dc] # # patch "src/model/Manifest.cpp" # from [7cddb3ed2b22c78bb61ded0db60fc5930b8858a0] # to [74e83bad00383f6e9a30ba3a0abcd12c2b8bcd39] # # patch "src/model/Tags.cpp" # from [f1a5b77ef3afb07b4a1a350663a7f4f4c81cf288] # to [17e0de691eec2890b4fdaf5ac6a319ea69e662ed] # # patch "src/monotone/MonotoneUtil.cpp" # from [32fafcea1a6b614abe7dc08f9ed003cd8ceb76dd] # to [7db618572f21ace0e0c23015560c773fc42e9b00] # # patch "src/monotone/WorkspaceCommitter.cpp" # from [cfd0c122e1fe51e38a3247d54701db8712b4cfb4] # to [974d708f297fea7bf59e0f5b8e473d3335677d5b] # # patch "src/monotone/WorkspaceCreator.cpp" # from [5874266c9a9ac94264047fa675d4a3197388f205] # to [9db03ede9244d8b4030f333e751a2ca0ffc2218d] # # patch "src/util/BasicIOParser.cpp" # from [efa4e089d061a603c1db6ab8553fa4afa0ed3456] # to [b73793af265b37da4c12283280fbb8a71cdf0b08] # # patch "src/util/BasicIOParser.h" # from [39c50bded66d65ce417ac4bade1bfe3956019e1f] # to [e3016362479873a28dc9e102bf3a088b28a8e733] # # patch "src/util/BasicIOWriter.cpp" # from [3e319bd88b615c439ef9c4057b23d203b4bce186] # to [f4294d52d342676011272512c3ddee654a810bdb] # # patch "src/util/BasicIOWriter.h" # from [df7236314e49dada5dd5ccf02a310d8361c61c15] # to [492590041636225959ea7edbf18a08a76dfa0e28] # # patch "src/view/dialogs/GenerateKeypair.cpp" # from [be900c2b88d93886d94b88f029a38fa5a382abab] # to [04a0603de9129187a437584314fa6df1c903ead6] # # patch "src/vocab.h" # from [e98da12225f2bc46b4c67132f6402a6a7c439a91] # to [11df5078fa3d153325e9891ae3644e0abcf04181] # ============================================================ --- src/model/InventoryItem.cpp 668653d908eb9fb5bd06ae29a33df9849471acdd +++ src/model/InventoryItem.cpp 9f06ddc9094e4b11abd665cd3329ecd028bda0d6 @@ -280,8 +280,8 @@ InventoryItem::InventoryItem(const Stanz } if (en.sym == "birth") { - I(!en.hash.isEmpty()); - birthRev = en.hash; + I(en.vals.size() == 1); + birthRev = en.vals.at(0); } } ============================================================ --- src/util/BasicIOParser.cpp efa4e089d061a603c1db6ab8553fa4afa0ed3456 +++ src/util/BasicIOParser.cpp b73793af265b37da4c12283280fbb8a71cdf0b08 @@ -47,25 +47,16 @@ Stanza BasicIOParser::getStanza() { W("Couldn't get symbol."); } - QString hash(getHash()); - // was this a hash? - if (!hash.isNull()) + //grab all values and hashes and put them into a list + while (true) { - entry.hash = hash; + // get value returns an empty string if there are no + // more opening quotes + QString value(getValue()); + if (value.isNull()) break; + entry.vals.append(value); } - else - { - //grab all string values and put them into a list - while (true) - { - // get value returns an empty string if there are no - // more opening quotes - QString value(getValue()); - if (value.isNull()) break; - entry.vals.append(value); - } - } stanza.append(entry); eatSpaces(); @@ -103,7 +94,13 @@ QString BasicIOParser::getValue() QString BasicIOParser::getValue() { eatSpaces(); - if (whatsNext() != '"') return QString(); + char next = whatsNext(); + bool isHash = next == '['; + bool isOtherValue = next == '"'; + + if (!isHash && !isOtherValue) + return QString(); + advance(); QByteArray payload; @@ -112,37 +109,27 @@ QString BasicIOParser::getValue() { char cur = getNext(); I(cur != '\0'); + // string end? - if (cur == '"' && last != '\\') break; + if ((isHash && cur == ']') || + (isOtherValue && cur == '"' && last != '\\')) + break; + + I(isOtherValue || ( + (cur >= '0' && cur <= '9') || + (cur >= 'a' && cur <= 'f') + )); + last = cur; payload.append(cur); } QString ret = QString::fromUtf8(payload); - ret.replace("\\\\", "\\"); - ret.replace("\\\"", "\""); - return ret; -} - -QString BasicIOParser::getHash() -{ - eatSpaces(); - if (whatsNext() != '[') return QString(); - advance(); - - QString hash; - while (true) + if (isOtherValue) { - char ch = whatsNext(); - if (ch < '0' || (ch > '9' && ch < 'a') || ch > 'f') - { - break; - } - hash.append(ch); - advance(); + ret.replace("\\\\", "\\"); + ret.replace("\\\"", "\""); } - I(getNext() == ']'); - - return hash; + return ret; } ============================================================ --- src/util/BasicIOParser.h 39c50bded66d65ce417ac4bade1bfe3956019e1f +++ src/util/BasicIOParser.h e3016362479873a28dc9e102bf3a088b28a8e733 @@ -34,7 +34,6 @@ private: Stanza getStanza(); QString getSymbol(); QString getValue(); - QString getHash(); StanzaList stanzas; }; ============================================================ --- src/model/Keys.cpp 15da8facb87e88eeb55da5339dc30926bb3b9637 +++ src/model/Keys.cpp 0933ca218d2301a62ff0c24b86a0dd25bf6561dc @@ -72,8 +72,8 @@ void Keys::processTaskResult(const Monot if (entry.sym == "hash") { - I(!entry.hash.isNull()); - key->hash = entry.hash; + I(entry.vals.size() == 1); + key->hash = entry.vals.at(0); continue; } ============================================================ --- src/model/Tags.cpp f1a5b77ef3afb07b4a1a350663a7f4f4c81cf288 +++ src/model/Tags.cpp 17e0de691eec2890b4fdaf5ac6a319ea69e662ed @@ -86,15 +86,15 @@ void Tags::processTaskResult(const Monot if (entry.sym == "revision") { - I(!entry.hash.isNull()); - tag.revision = entry.hash; + I(entry.vals.size() == 1); + tag.revision = entry.vals.at(0); continue; } if (entry.sym == "signer") { - I(!entry.hash.isEmpty()); - tag.signer = entry.hash; + I(entry.vals.size() == 1); + tag.signer = entry.vals.at(0); continue; } ============================================================ --- src/view/dialogs/GenerateKeypair.cpp be900c2b88d93886d94b88f029a38fa5a382abab +++ src/view/dialogs/GenerateKeypair.cpp 04a0603de9129187a437584314fa6df1c903ead6 @@ -97,9 +97,9 @@ void GenerateKeypair::accept() I(stanzas.size() == 1); Stanza st = stanzas.at(0); I(st.size() > 1); - I(st.at(1).sym == "hash" && !st.at(1).hash.isEmpty()); + I(st.at(1).sym == "hash" && st.at(1).vals.size() == 1); - QString keyHash = st.at(1).hash; + QString keyHash = st.at(1).vals.at(0); if (rememberPassword->isChecked()) { ============================================================ --- src/monotone/MonotoneUtil.cpp 32fafcea1a6b614abe7dc08f9ed003cd8ceb76dd +++ src/monotone/MonotoneUtil.cpp 7db618572f21ace0e0c23015560c773fc42e9b00 @@ -302,7 +302,8 @@ FileEntryList MonotoneUtil::getRevisionM if (en.sym == "content") { I(is_item); - entry.fileid = en.hash; + I(en.vals.size() == 1); + entry.fileid = en.vals.at(0); } else if (en.sym == "attr") @@ -350,12 +351,14 @@ QMap MonotoneUtil::get { if (en.sym == "hash") { - lastHash = en.hash; + I(en.vals.size() == 1); + lastHash = en.vals.at(0); continue; } if (en.sym == "local_name") { + I(en.vals.size() == 1); lastLocalName = en.vals.at(0); continue; } @@ -403,12 +406,14 @@ QMap MonotoneUtil::get { if (en.sym == "hash") { - lastHash = en.hash; + I(en.vals.size() == 1); + lastHash = en.vals.at(0); continue; } if (en.sym == "given_name") { + I(en.vals.size() == 1); lastGivenName = en.vals.at(0); continue; } @@ -560,7 +565,8 @@ QStringList MonotoneUtil::getPreviousCon foreach (const Stanza & st, parser.getStanzas()) { I(st.size() == 1); - revs.push_back(st.at(0).hash); + I(st.at(0).vals.size() == 1); + revs.push_back(st.at(0).vals.at(0)); } return revs; } ============================================================ --- src/model/Manifest.cpp 7cddb3ed2b22c78bb61ded0db60fc5930b8858a0 +++ src/model/Manifest.cpp 74e83bad00383f6e9a30ba3a0abcd12c2b8bcd39 @@ -120,8 +120,8 @@ void Manifest::processTaskResult(const M if (entry.sym == "content") { - I(!entry.hash.isNull()); - mEntry->hash = entry.hash; + I(entry.vals.size() == 1); + mEntry->hash = entry.vals.at(0); continue; } ============================================================ --- src/model/GetRevision.cpp 7bfe8d5f4fb09324fbe36861f320d4cf464dadd8 +++ src/model/GetRevision.cpp 77e81113c7d99c6f5befe9596f3745dd8bc66491 @@ -97,14 +97,15 @@ void GetRevision::processTaskResult(cons if (j == 0 && entry.sym == "new_manifest") { - I(!entry.hash.isNull()); - revision.new_manifest = entry.hash; + I(entry.vals.size() == 1); + revision.new_manifest = entry.vals.at(0); break; } if (entry.sym == "old_revision") { - currentRevision = entry.hash; + I(entry.vals.size() == 1); + currentRevision = entry.vals.at(0); QList changelist; revision.changesAgainstParent.insert(currentRevision, changelist); break; @@ -338,7 +339,8 @@ QMap > if (isAdd && en.sym == "content") { - hashes.first = en.hash; + I(en.vals.size() == 1); + hashes.first = en.vals.at(0); fileMap.insert(path, hashes); break; } @@ -352,13 +354,15 @@ QMap > if (isPatch && en.sym == "from") { - hashes.second = en.hash; + I(en.vals.size() == 1); + hashes.second = en.vals.at(0); continue; } if (isPatch && en.sym == "to") { - hashes.first = en.hash; + I(en.vals.size() == 1); + hashes.first = en.vals.at(0); fileMap.insert(path, hashes); break; } ============================================================ --- src/model/GetRevision.h 4d2f55d9b7a0552abb02eb1a9497ba4b1350eedc +++ src/model/GetRevision.h 9481a551c1de286717b9729c861b9aac48cef92f @@ -119,7 +119,7 @@ struct Revision formst.append(format); list.append(formst); - StanzaEntry manifest("new_manifest", new_manifest); + StanzaEntry manifest("new_manifest", "[" + new_manifest + "]"); Stanza manst; manst.append(manifest), list.append(manst); @@ -129,14 +129,24 @@ struct Revision { it.next(); - StanzaEntry revision("old_revision", it.key()); + StanzaEntry revision("old_revision", "[" + it.key() + "]"); Stanza revst; revst.append(revision), list.append(revst); foreach (const Change & ch, it.value()) { - list.append(ch.stanza); + Stanza st(ch.stanza); + if (st[0].sym == "add_file") + { + st[1].vals[0] = "[" + st[1].vals[0] + "]"; + } + if (st[0].sym == "patch") + { + st[1].vals[0] = "[" + st[1].vals[0] + "]"; + st[2].vals[0] = "[" + st[2].vals[0] + "]"; + } + list.append(st); } } ============================================================ --- src/monotone/WorkspaceCreator.cpp 5874266c9a9ac94264047fa675d4a3197388f205 +++ src/monotone/WorkspaceCreator.cpp 9db03ede9244d8b4030f333e751a2ca0ffc2218d @@ -122,16 +122,16 @@ bool WorkspaceCreator::createBookkeeping stanzas.append(stanza); stanza.clear(); - stanza.append(StanzaEntry("new_manifest", "0000000000000000000000000000000000000001")); + stanza.append(StanzaEntry("new_manifest", "[0000000000000000000000000000000000000001]")); stanzas.append(stanza); stanza.clear(); - stanza.append(StanzaEntry("old_revision", revision)); + stanza.append(StanzaEntry("old_revision", "[" + revision + "]")); stanzas.append(stanza); - writer = BasicIOWriter(stanzas); + BasicIOWriter writer2(stanzas); - revisionFile.write(writer.write().toLatin1()); + revisionFile.write(writer2.write().toLatin1()); revisionFile.close(); // _MTN/format ============================================================ --- src/vocab.h e98da12225f2bc46b4c67132f6402a6a7c439a91 +++ src/vocab.h 11df5078fa3d153325e9891ae3644e0abcf04181 @@ -48,11 +48,10 @@ struct StanzaEntry struct StanzaEntry { QString sym; - QString hash; QStringList vals; StanzaEntry() {} - StanzaEntry(QString s, QString h) : sym(s), hash(h) {} + StanzaEntry(QString s, QString v) : sym(s) { vals.push_back(v); } StanzaEntry(QString s, QStringList v) : sym(s), vals(v) {} }; ============================================================ --- src/monotone/WorkspaceCommitter.cpp cfd0c122e1fe51e38a3247d54701db8712b4cfb4 +++ src/monotone/WorkspaceCommitter.cpp 974d708f297fea7bf59e0f5b8e473d3335677d5b @@ -130,11 +130,11 @@ bool WorkspaceCommitter::writeRevision(c Stanza manifest; manifest.append(StanzaEntry("new_manifest", - "0000000000000000000000000000000000000000")); + "[0000000000000000000000000000000000000000]")); stanzas.append(manifest); Stanza oldrev; - oldrev.append(StanzaEntry("old_revision", revisionId)); + oldrev.append(StanzaEntry("old_revision", "[" + revisionId + "]")); stanzas.append(oldrev); BasicIOWriter writer(stanzas); ============================================================ --- src/util/BasicIOWriter.cpp 3e319bd88b615c439ef9c4057b23d203b4bce186 +++ src/util/BasicIOWriter.cpp f4294d52d342676011272512c3ddee654a810bdb @@ -18,7 +18,10 @@ #include "BasicIOWriter.h" -BasicIOWriter::BasicIOWriter(const StanzaList & st) : stanzas(st) {} +BasicIOWriter::BasicIOWriter(const StanzaList & st) : stanzas(st) +{ + hashRegex.setPattern("^\\[([0-9a-f]{40})?\\]$"); +} BasicIOWriter::~BasicIOWriter() {} @@ -37,17 +40,11 @@ QString BasicIOWriter::writeStanza(const QString out; foreach (const StanzaEntry & en, stanza) { - // ensure that not both, a hash and a value list, are given - I(!(!en.hash.isNull() && en.vals.size() > 0)); - - if (en.vals.size() > 0) - { - out.append(writeValueLine(en)); - } + // FIXME: this is a somewhat quirky logic, but we have nothing better + if (en.vals.size() == 1 && hashRegex.indexIn(en.vals.at(0)) == 0) + out.append(writeHashLine(en)); else - { - out.append(writeHashLine(en)); - } + out.append(writeValueLine(en)); } out.append("\n"); return out; @@ -55,7 +52,7 @@ QString BasicIOWriter::writeHashLine(con QString BasicIOWriter::writeHashLine(const StanzaEntry & entry) { - return QString("%1 [%2]\n").arg(entry.sym).arg(entry.hash); + return QString("%1 %2\n").arg(entry.sym).arg(entry.vals.at(0)); } QString BasicIOWriter::writeValueLine(const StanzaEntry & entry) ============================================================ --- src/util/BasicIOWriter.h df7236314e49dada5dd5ccf02a310d8361c61c15 +++ src/util/BasicIOWriter.h 492590041636225959ea7edbf18a08a76dfa0e28 @@ -37,6 +37,7 @@ private: QString escape(const QString &); StanzaList stanzas; + QRegExp hashRegex; }; #endif ============================================================ --- src/model/GetContentChanged.cpp 9e3924105e5e579903c5f40b2f1b3046afb95d8f +++ src/model/GetContentChanged.cpp fcf94f37a48b3c17a64a9c734f1f39b696611e3f @@ -157,7 +157,8 @@ void GetContentChanged::processTaskResul foreach (const Stanza & st, stanzas) { I(st.size() == 1); - QString rev = st.at(0).hash; + I(st.at(0).vals.size() == 1); + QString rev = st.at(0).vals.at(0); I(!rev.isNull()); // if we have this particular revision already recorded, ============================================================ --- src/model/GetDatabaseVariables.cpp d373b3e71be56181bd7be554dacaba2698d076c3 +++ src/model/GetDatabaseVariables.cpp 1d0e7a65b24e7566ef20263249d8354b219f8028 @@ -76,6 +76,7 @@ void GetDatabaseVariables::processTaskRe if (entry.sym == "domain") { + I(entry.vals.size() == 1); domain = entry.vals.at(0); continue; } ============================================================ --- src/model/InventoryWatcher.cpp 174b9e0f9aeacae84732ed7aae709cfdef447d4c +++ src/model/InventoryWatcher.cpp ab53430cc129888af881430ad412095bb2bcc161 @@ -300,9 +300,9 @@ void InventoryWatcher::checkForBookkeepC if (newEntryType == "old_revision") { - if (oldStanza.at(0).hash != newStanza.at(0).hash) + if (oldStanza.at(0).vals.at(0) != newStanza.at(0).vals.at(0)) { - emit changedBaseRevision(newStanza.at(0).hash); + emit changedBaseRevision(newStanza.at(0).vals.at(0)); } oldRevisionEntries.removeAt(i); foundOrAlreadyHandled = true; ============================================================ --- src/model/CertList.cpp 334807e02e68d7345007f3ef379d826fdc96ac2a +++ src/model/CertList.cpp d147585812cd434c07b6e60017302770a3a38832 @@ -159,8 +159,8 @@ void CertList::fill(const StanzaList & s { if (entry.sym == "key") { - I(!entry.hash.isEmpty()); - cert.key = entry.hash; + I(entry.vals.size() == 1); + cert.key = entry.vals.at(0); continue; } if (entry.sym == "name")