(revLimit, prev, docInfo, results,
i, cb, writeDoc, newEdits)
| 4651 | } |
| 4652 | |
| 4653 | function updateDoc(revLimit, prev, docInfo, results, |
| 4654 | i, cb, writeDoc, newEdits) { |
| 4655 | |
| 4656 | if (revExists(prev.rev_tree, docInfo.metadata.rev) && !newEdits) { |
| 4657 | results[i] = docInfo; |
| 4658 | return cb(); |
| 4659 | } |
| 4660 | |
| 4661 | // sometimes this is pre-calculated. historically not always |
| 4662 | var previousWinningRev = prev.winningRev || winningRev(prev); |
| 4663 | var previouslyDeleted = 'deleted' in prev ? prev.deleted : |
| 4664 | isDeleted(prev, previousWinningRev); |
| 4665 | var deleted = 'deleted' in docInfo.metadata ? docInfo.metadata.deleted : |
| 4666 | isDeleted(docInfo.metadata); |
| 4667 | var isRoot = /^1-/.test(docInfo.metadata.rev); |
| 4668 | |
| 4669 | if (previouslyDeleted && !deleted && newEdits && isRoot) { |
| 4670 | var newDoc = docInfo.data; |
| 4671 | newDoc._rev = previousWinningRev; |
| 4672 | newDoc._id = docInfo.metadata.id; |
| 4673 | docInfo = parseDoc(newDoc, newEdits); |
| 4674 | } |
| 4675 | |
| 4676 | var merged = merge(prev.rev_tree, docInfo.metadata.rev_tree[0], revLimit); |
| 4677 | |
| 4678 | var inConflict = newEdits && (( |
| 4679 | (previouslyDeleted && deleted && merged.conflicts !== 'new_leaf') || |
| 4680 | (!previouslyDeleted && merged.conflicts !== 'new_leaf') || |
| 4681 | (previouslyDeleted && !deleted && merged.conflicts === 'new_branch'))); |
| 4682 | |
| 4683 | if (inConflict) { |
| 4684 | var err = createError(REV_CONFLICT); |
| 4685 | results[i] = err; |
| 4686 | return cb(); |
| 4687 | } |
| 4688 | |
| 4689 | var newRev = docInfo.metadata.rev; |
| 4690 | docInfo.metadata.rev_tree = merged.tree; |
| 4691 | docInfo.stemmedRevs = merged.stemmedRevs || []; |
| 4692 | /* istanbul ignore else */ |
| 4693 | if (prev.rev_map) { |
| 4694 | docInfo.metadata.rev_map = prev.rev_map; // used only by leveldb |
| 4695 | } |
| 4696 | |
| 4697 | // recalculate |
| 4698 | var winningRev$$1 = winningRev(docInfo.metadata); |
| 4699 | var winningRevIsDeleted = isDeleted(docInfo.metadata, winningRev$$1); |
| 4700 | |
| 4701 | // calculate the total number of documents that were added/removed, |
| 4702 | // from the perspective of total_rows/doc_count |
| 4703 | var delta = (previouslyDeleted === winningRevIsDeleted) ? 0 : |
| 4704 | previouslyDeleted < winningRevIsDeleted ? -1 : 1; |
| 4705 | |
| 4706 | var newRevIsDeleted; |
| 4707 | if (newRev === winningRev$$1) { |
| 4708 | // if the new rev is the same as the winning rev, we can reuse that value |
| 4709 | newRevIsDeleted = winningRevIsDeleted; |
| 4710 | } else { |
no test coverage detected
searching dependent graphs…