private void initHashes() { if (hashedSource == null) { hashedSource = FileHashes.create(inputFile); Status status = inputFile.status(); if (status == Status.ADDED) { hashedReference = null; } else if (status == Status.SAME) { hashedReference = hashedSource; } else { // Need key with branch String serverSideKey = ComponentKeys.createEffectiveKey(project.getKeyWithBranch(), inputFile); String[] lineHashes = lastSnapshots.getLineHashes(serverSideKey); hashedReference = lineHashes != null ? FileHashes.create(lineHashes) : null; } } }
@Override @CheckForNull public String getLineHash() { if (getLine() == null || hashes == null) { return null; } int line = getLine(); Preconditions.checkState(line <= hashes.length(), "Invalid line number for issue %s. File has only %s line(s)", this, hashes.length()); return hashes.getHash(line); }
public static FileHashes create(String[] hashes) { int size = hashes.length; Multimap<String, Integer> linesByHash = LinkedHashMultimap.create(); for (int i = 0; i < size; i++) { // indices in array are shifted one line before linesByHash.put(hashes[i], i + 1); } return new FileHashes(hashes, linesByHash); }
@Test public void should_lazy_load_line_hashes() throws Exception { final String source = "source"; FileUtils.write(ioFile, source + "\n", StandardCharsets.UTF_8); when(file.lines()).thenReturn(2); assertThat(sourceHashHolder.getHashedSource().getHash(1)).isEqualTo(md5Hex(source)); assertThat(sourceHashHolder.getHashedSource().getHash(2)).isEqualTo(""); assertThat(sourceHashHolder.getHashedSource().getHash(1)).isEqualTo(md5Hex(source)); }
private static Input<ServerIssueFromWs> createBaseInput(Collection<ServerIssueFromWs> serverIssues, @Nullable SourceHashHolder sourceHashHolder) { List<String> refHashes; if (sourceHashHolder != null && sourceHashHolder.getHashedReference() != null) { refHashes = Arrays.asList(sourceHashHolder.getHashedReference().hashes()); } else { refHashes = new ArrayList<>(0); } return new IssueTrackingInput<>(serverIssues, refHashes); }
@Test public void should_not_load_reference_hashes_when_status_same() throws Exception { final String source = "source"; String key = "foo:src/Foo.java"; FileUtils.write(ioFile, source, StandardCharsets.UTF_8); when(file.key()).thenReturn(key); when(file.status()).thenReturn(InputFile.Status.SAME); assertThat(sourceHashHolder.getHashedReference().getHash(1)).isEqualTo(md5Hex(source)); Mockito.verifyNoMoreInteractions(lastSnapshots); }
private static Input<TrackedIssue> createRawInput(Collection<TrackedIssue> rIssues, @Nullable SourceHashHolder sourceHashHolder) { List<String> baseHashes; if (sourceHashHolder != null && sourceHashHolder.getHashedSource() != null) { baseHashes = Arrays.asList(sourceHashHolder.getHashedSource().hashes()); } else { baseHashes = new ArrayList<>(0); } return new IssueTrackingInput<>(rIssues, baseHashes); }
public static RollingFileHashes create(FileHashes hashes, int halfBlockSize) { int size = hashes.length(); int[] rollingHashes = new int[size]; RollingHashCalculator hashCalulator = new RollingHashCalculator(halfBlockSize * 2 + 1); for (int i = 1; i <= Math.min(size, halfBlockSize + 1); i++) { hashCalulator.add(hashes.getHash(i).hashCode()); } for (int i = 1; i <= size; i++) { rollingHashes[i - 1] = hashCalulator.getHash(); if (i - halfBlockSize > 0) { hashCalulator.remove(hashes.getHash(i - halfBlockSize).hashCode()); } if (i + 1 + halfBlockSize <= size) { hashCalulator.add(hashes.getHash(i + 1 + halfBlockSize).hashCode()); } else { hashCalulator.add(0); } } return new RollingFileHashes(rollingHashes); }
@Test public void should_lazy_load_reference_hashes_when_status_changed_on_branch() throws Exception { final String source = "source"; FileUtils.write(ioFile, source, StandardCharsets.UTF_8); when(project.getKeyWithBranch()).thenReturn("foo:myBranch"); when(file.getProjectRelativePath()).thenReturn("src/Foo.java"); String key = "foo:myBranch:src/Foo.java"; when(file.status()).thenReturn(InputFile.Status.CHANGED); when(lastSnapshots.getLineHashes(key)).thenReturn(new String[] {md5Hex(source)}); assertThat(sourceHashHolder.getHashedReference().getHash(1)).isEqualTo(md5Hex(source)); verify(lastSnapshots).getLineHashes(key); assertThat(sourceHashHolder.getHashedReference().getHash(1)).isEqualTo(md5Hex(source)); Mockito.verifyNoMoreInteractions(lastSnapshots); }
@Test public void test_equals() { RollingFileHashes a = RollingFileHashes.create(FileHashes.create(new String[] {md5Hex("line0"), md5Hex("line1"), md5Hex("line2")}), 1); RollingFileHashes b = RollingFileHashes.create(FileHashes.create(new String[] {md5Hex("line0"), md5Hex("line1"), md5Hex("line2"), md5Hex("line3")}), 1); assertThat(a.getHash(1) == b.getHash(1)).isTrue(); assertThat(a.getHash(2) == b.getHash(2)).isTrue(); assertThat(a.getHash(3) == b.getHash(3)).isFalse(); RollingFileHashes c = RollingFileHashes.create(FileHashes.create(new String[] {md5Hex("line-1"), md5Hex("line0"), md5Hex("line1"), md5Hex("line2"), md5Hex("line3")}), 1); assertThat(a.getHash(1) == c.getHash(2)).isFalse(); assertThat(a.getHash(2) == c.getHash(3)).isTrue(); }
private static Input<ServerIssueFromWs> createBaseInput(Collection<ServerIssueFromWs> serverIssues, @Nullable SourceHashHolder sourceHashHolder) { List<String> refHashes; if (sourceHashHolder != null && sourceHashHolder.getHashedReference() != null) { refHashes = Arrays.asList(sourceHashHolder.getHashedReference().hashes()); } else { refHashes = new ArrayList<>(0); } return new IssueTrackingInput<>(serverIssues, refHashes); }
public static FileHashes create(InputFile f) { final byte[][] hashes = new byte[f.lines()][]; FileMetadata.computeLineHashesForIssueTracking(f, (lineIdx, hash) -> hashes[lineIdx - 1] = hash); int size = hashes.length; Multimap<String, Integer> linesByHash = LinkedHashMultimap.create(); String[] hexHashes = new String[size]; for (int i = 0; i < size; i++) { String hash = hashes[i] != null ? Hex.encodeHexString(hashes[i]) : ""; hexHashes[i] = hash; // indices in array are shifted one line before linesByHash.put(hash, i + 1); } return new FileHashes(hexHashes, linesByHash); }
@Override @CheckForNull public String getLineHash() { if (getLine() == null || hashes == null) { return null; } int line = getLine(); Preconditions.checkState(line <= hashes.length(), "Invalid line number for issue %s. File has only %s line(s)", this, hashes.length()); return hashes.getHash(line); }
@Test public void should_lazy_load_reference_hashes_when_status_changed() throws Exception { final String source = "source"; FileUtils.write(ioFile, source, StandardCharsets.UTF_8); when(project.getKeyWithBranch()).thenReturn("foo"); when(file.getProjectRelativePath()).thenReturn("src/Foo.java"); String key = "foo:src/Foo.java"; when(file.status()).thenReturn(InputFile.Status.CHANGED); when(lastSnapshots.getLineHashes(key)).thenReturn(new String[] {md5Hex(source)}); assertThat(sourceHashHolder.getHashedReference().getHash(1)).isEqualTo(md5Hex(source)); verify(lastSnapshots).getLineHashes(key); assertThat(sourceHashHolder.getHashedReference().getHash(1)).isEqualTo(md5Hex(source)); Mockito.verifyNoMoreInteractions(lastSnapshots); }
@Test public void hashes() { String[] hashArr = new String[] { "hash1", "hash2", "hash3" }; FileHashes hashes = FileHashes.create(hashArr); TrackedIssue issue = new TrackedIssue(hashes); issue.setStartLine(1); assertThat(issue.getLineHash()).isEqualTo("hash1"); } }
private static Input<TrackedIssue> createRawInput(Collection<TrackedIssue> rIssues, @Nullable SourceHashHolder sourceHashHolder) { List<String> baseHashes; if (sourceHashHolder != null && sourceHashHolder.getHashedSource() != null) { baseHashes = Arrays.asList(sourceHashHolder.getHashedSource().hashes()); } else { baseHashes = new ArrayList<>(0); } return new IssueTrackingInput<>(rIssues, baseHashes); }
public static FileHashes create(String[] hashes) { int size = hashes.length; Multimap<String, Integer> linesByHash = LinkedHashMultimap.create(); for (int i = 0; i < size; i++) { // indices in array are shifted one line before linesByHash.put(hashes[i], i + 1); } return new FileHashes(hashes, linesByHash); }
public static RollingFileHashes create(FileHashes hashes, int halfBlockSize) { int size = hashes.length(); int[] rollingHashes = new int[size]; RollingHashCalculator hashCalulator = new RollingHashCalculator(halfBlockSize * 2 + 1); for (int i = 1; i <= Math.min(size, halfBlockSize + 1); i++) { hashCalulator.add(hashes.getHash(i).hashCode()); } for (int i = 1; i <= size; i++) { rollingHashes[i - 1] = hashCalulator.getHash(); if (i - halfBlockSize > 0) { hashCalulator.remove(hashes.getHash(i - halfBlockSize).hashCode()); } if (i + 1 + halfBlockSize <= size) { hashCalulator.add(hashes.getHash(i + 1 + halfBlockSize).hashCode()); } else { hashCalulator.add(0); } } return new RollingFileHashes(rollingHashes); }
private void initHashes() { if (hashedSource == null) { hashedSource = FileHashes.create(inputFile); Status status = inputFile.status(); if (status == Status.ADDED) { hashedReference = null; } else if (status == Status.SAME) { hashedReference = hashedSource; } else { // Need key with branch String serverSideKey = ComponentKeys.createEffectiveKey(project.getKeyWithBranch(), inputFile); String[] lineHashes = lastSnapshots.getLineHashes(serverSideKey); hashedReference = lineHashes != null ? FileHashes.create(lineHashes) : null; } } }
public static FileHashes create(InputFile f) { final byte[][] hashes = new byte[f.lines()][]; FileMetadata.computeLineHashesForIssueTracking(f, (lineIdx, hash) -> hashes[lineIdx - 1] = hash); int size = hashes.length; Multimap<String, Integer> linesByHash = LinkedHashMultimap.create(); String[] hexHashes = new String[size]; for (int i = 0; i < size; i++) { String hash = hashes[i] != null ? Hex.encodeHexString(hashes[i]) : ""; hexHashes[i] = hash; // indices in array are shifted one line before linesByHash.put(hash, i + 1); } return new FileHashes(hexHashes, linesByHash); }