blob: 0142f060a5aec37f9d779f893bb73dae43cfd93d [file] [log] [blame]
/*
* Copyright 2016 The Bazel Authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.idea.blaze.base.filecache;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Sets;
import com.google.idea.blaze.base.io.ModifiedTimeScanner;
import com.intellij.openapi.diagnostic.Logger;
import java.io.File;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.jetbrains.annotations.Nullable;
/** Provides a diffing service for a collection of files. */
public final class FileDiffer {
private static Logger logger = Logger.getInstance(FileDiffer.class);
private FileDiffer() {}
@Nullable
public static ImmutableMap<File, Long> updateFiles(
@Nullable ImmutableMap<File, Long> oldState,
Iterable<File> files,
List<File> updatedFiles,
List<File> removedFiles) {
ImmutableMap<File, Long> newState = readFileState(files);
if (newState == null) {
return null;
}
diffState(oldState, newState, updatedFiles, removedFiles);
return newState;
}
@Nullable
public static ImmutableMap<File, Long> readFileState(Iterable<File> files) {
try {
return ModifiedTimeScanner.readTimestamps(files);
} catch (Exception e) {
logger.error(e);
return null;
}
}
public static <K, V> void diffState(
@Nullable Map<K, V> oldState, Map<K, V> newState, List<K> updated, List<K> removed) {
oldState = oldState != null ? oldState : ImmutableMap.of();
// Find changed/new
for (Map.Entry<K, V> entry : newState.entrySet()) {
K key = entry.getKey();
V value = entry.getValue();
V oldValue = oldState.get(key);
final boolean isUpdated = oldValue == null || !value.equals(oldValue);
if (isUpdated) {
updated.add(key);
}
}
// Find removed
Set<K> removedSet = Sets.newHashSet();
removedSet.addAll(oldState.keySet());
removedSet.removeAll(newState.keySet());
removed.addAll(removedSet);
}
}