tikhomirov@544: /* tikhomirov@544: * Copyright (c) 2013 TMate Software Ltd tikhomirov@544: * tikhomirov@544: * This program is free software; you can redistribute it and/or modify tikhomirov@544: * it under the terms of the GNU General Public License as published by tikhomirov@544: * the Free Software Foundation; version 2 of the License. tikhomirov@544: * tikhomirov@544: * This program is distributed in the hope that it will be useful, tikhomirov@544: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@544: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@544: * GNU General Public License for more details. tikhomirov@544: * tikhomirov@544: * For information on how to redistribute this software under tikhomirov@544: * the terms of a license other than GNU General Public License tikhomirov@544: * contact TMate Software at support@hg4j.com tikhomirov@544: */ tikhomirov@544: package org.tmatesoft.hg.internal; tikhomirov@544: tikhomirov@551: import org.tmatesoft.hg.internal.DiffHelper.DeltaInspector; tikhomirov@551: import org.tmatesoft.hg.internal.DiffHelper.LineSequence; tikhomirov@544: tikhomirov@544: class GeneratePatchInspector extends DeltaInspector { tikhomirov@544: private final Patch deltaCollector; tikhomirov@544: tikhomirov@544: GeneratePatchInspector(Patch p) { tikhomirov@544: assert p != null; tikhomirov@544: deltaCollector = p; tikhomirov@544: } tikhomirov@544: tikhomirov@544: public static Patch delta(byte[] prev, byte[] content) { tikhomirov@544: Patch rv = new Patch(); tikhomirov@551: DiffHelper pg = new DiffHelper(); tikhomirov@544: pg.init(new LineSequence(prev).splitByNewlines(), new LineSequence(content).splitByNewlines()); tikhomirov@544: pg.findMatchingBlocks(new GeneratePatchInspector(rv)); tikhomirov@544: return rv; tikhomirov@544: } tikhomirov@544: tikhomirov@544: @Override tikhomirov@544: protected void changed(int s1From, int s1To, int s2From, int s2To) { tikhomirov@544: int from = seq1.chunk(s1From).getOffset(); tikhomirov@544: int to = seq1.chunk(s1To).getOffset(); tikhomirov@544: byte[] data = seq2.data(s2From, s2To); tikhomirov@544: deltaCollector.add(from, to, data); tikhomirov@544: } tikhomirov@544: tikhomirov@544: @Override tikhomirov@544: protected void deleted(int s2DeletionPoint, int s1From, int s1To) { tikhomirov@544: int from = seq1.chunk(s1From).getOffset(); tikhomirov@544: int to = seq1.chunk(s1To).getOffset(); tikhomirov@544: deltaCollector.add(from, to, new byte[0]); tikhomirov@544: } tikhomirov@544: tikhomirov@544: @Override tikhomirov@544: protected void added(int s1InsertPoint, int s2From, int s2To) { tikhomirov@544: int insPoint = seq1.chunk(s1InsertPoint).getOffset(); tikhomirov@544: byte[] data = seq2.data(s2From, s2To); tikhomirov@544: deltaCollector.add(insPoint, insPoint, data); tikhomirov@544: } tikhomirov@544: }