resolveConflict runs the conflictResolverFunction with bodies and revision trees from localDoc and remoteDoc. RevTrees may be changed based on the outcome of conflict resolution - see resolveDocLocalWins, resolveDocRemoteWins and resolveDocMerge for specifics on what is changed under each scenario.
(ctx context.Context, localDoc *Document, remoteDoc *Document, docHistory []string, resolver *ConflictResolver)
| 1878 | // RevTrees may be changed based on the outcome of conflict resolution - see resolveDocLocalWins, resolveDocRemoteWins and |
| 1879 | // resolveDocMerge for specifics on what is changed under each scenario. |
| 1880 | func (db *DatabaseCollectionWithUser) resolveConflict(ctx context.Context, localDoc *Document, remoteDoc *Document, docHistory []string, resolver *ConflictResolver) (resolvedRevID string, updatedHistory []string, resolveError error) { |
| 1881 | |
| 1882 | if resolver == nil { |
| 1883 | return "", nil, errors.New("Conflict resolution function is nil for resolveConflict") |
| 1884 | } |
| 1885 | |
| 1886 | localDocBody, remoteDocBody, err := buildResolverBody(localDoc, remoteDoc) |
| 1887 | if err != nil { |
| 1888 | base.InfofCtx(ctx, base.KeyReplicate, "Error when building local and remote documents for conflict resolution for doc %s: %v", base.UD(localDoc.ID), err) |
| 1889 | return "", nil, err |
| 1890 | } |
| 1891 | |
| 1892 | conflict := Conflict{ |
| 1893 | LocalDocument: localDocBody, |
| 1894 | RemoteDocument: remoteDocBody, |
| 1895 | } |
| 1896 | |
| 1897 | resolvedBody, resolutionType, resolveFuncError := resolver.Resolve(ctx, conflict) |
| 1898 | if resolveFuncError != nil { |
| 1899 | base.InfofCtx(ctx, base.KeyReplicate, "Error when running conflict resolution for doc %s: %v", base.UD(localDoc.ID), resolveFuncError) |
| 1900 | return "", nil, resolveFuncError |
| 1901 | } |
| 1902 | |
| 1903 | switch resolutionType { |
| 1904 | case ConflictResolutionLocal: |
| 1905 | resolvedRevID, updatedHistory, resolveError = db.resolveDocLocalWins(ctx, localDoc, remoteDoc, conflict, docHistory) |
| 1906 | return resolvedRevID, updatedHistory, resolveError |
| 1907 | case ConflictResolutionRemote: |
| 1908 | resolvedRevID, resolveError = db.resolveDocRemoteWins(ctx, localDoc, conflict) |
| 1909 | return resolvedRevID, nil, resolveError |
| 1910 | case ConflictResolutionMerge: |
| 1911 | resolvedRevID, updatedHistory, resolveError = db.resolveDocMerge(ctx, localDoc, remoteDoc, docHistory, resolvedBody) |
| 1912 | return resolvedRevID, updatedHistory, resolveError |
| 1913 | default: |
| 1914 | return "", nil, fmt.Errorf("Unexpected conflict resolution type: %v", resolutionType) |
| 1915 | } |
| 1916 | } |
| 1917 | |
| 1918 | // resolveDocRemoteWins makes the following changes to the document: |
| 1919 | // - Tombstones the local revision |
no test coverage detected