@NotNull public ConvertTask convertTask(@NotNull ObjectReader reader, @NotNull TaskKey key) throws IOException { switch (key.getType()) { case Simple: { if (!reader.has(key.getObjectId())) { return keepMissingTask(key.getObjectId()); } final RevObject revObject = new RevWalk(reader).parseAny(key.getObjectId()); if (revObject instanceof RevCommit) { return convertCommitTask((RevCommit) revObject); } if (revObject instanceof RevTree) { return convertTreeTask(reader, revObject, Objects.requireNonNull(key.getPath())); } if (revObject instanceof RevBlob) { return copyTask(reader, revObject); } if (revObject instanceof RevTag) { return convertTagTask((RevTag) revObject); } throw new IllegalStateException("Unsupported object type: " + key + " (" + revObject.getClass().getName() + ")"); } case Attribute: return createAttributesTask(reader, key.getObjectId()); case UploadLfs: return convertLfsTask(reader, key.getObjectId()); default: throw new IllegalStateException("Unknwon task key type: " + key.getType()); } }
public GitConverter(@NotNull DB cache, @NotNull Path basePath, @NotNull String[] globs) throws IOException, InvalidPatternException { this.basePath = basePath; this.cache = cache; this.globs = globs.clone(); this.matchers = convertGlobs(globs); Arrays.sort(globs); for (String glob : globs) { new FileNameMatcher(glob, '/'); } tempPath = basePath.resolve("lfs/tmp"); Files.createDirectories(tempPath); //noinspection unchecked cacheMeta = cache.<String, MetaData>hashMap("meta") .keySerializer(Serializer.STRING) .valueSerializer(new SerializerJava()) .createOrOpen(); }
private static void processSingleThread(@NotNull GitConverter converter, @NotNull Repository srcRepo, @NotNull Repository dstRepo, @NotNull Map<TaskKey, ObjectId> converted, @Nullable HttpUploader uploader, @NotNull Deque<TaskKey> queue) throws IOException { try (ProgressReporter reporter = new ProgressReporter("processed", new AtomicLong(queue.size()), null)) { final ObjectInserter inserter = dstRepo.newObjectInserter(); final ObjectReader reader = srcRepo.newObjectReader(); while (!queue.isEmpty()) { final TaskKey taskKey = queue.pop(); if (!converted.containsKey(taskKey)) { boolean taskReady = true; for (TaskKey depend : converter.convertTask(reader, taskKey).depends()) { if (!converted.containsKey(depend)) { queue.add(taskKey); taskReady = false; break; } } if (taskReady) { final ObjectId objectId = converter.convertTask(reader, taskKey).convert(dstRepo, inserter, converted::get, uploader); converted.put(taskKey, objectId); reporter.increment(); } } } } }
@Test(dataProvider = "matchFilenameProvider") public void matchFilenameTest(@NotNull String path, boolean expected) throws IOException, InvalidPatternException { FileSystem fs = Jimfs.newFileSystem(Configuration.unix()); GitConverter converter = new GitConverter(DBMaker.memoryDB().make(), fs.getPath("/tmp/migrate"), new String[]{ "*.zip", ".*", "LICENSE", "test*", "/root", "some/data", }); Assert.assertEquals(converter.matchFilename(path), expected); } }
.checksumHeaderBypass() .make()) { final GitConverter converter = new GitConverter(cache, dstPath, globs); dstRepo.create(true);
@NotNull private List<GitTreeEntry> getEntries() throws IOException { final List<GitTreeEntry> entries = new ArrayList<>(); final CanonicalTreeParser treeParser = new CanonicalTreeParser(null, reader, id); boolean needAttributes = path.isEmpty(); while (!treeParser.eof()) { final FileMode fileMode = treeParser.getEntryFileMode(); final TaskType blobTask; final String pathTask; if (needAttributes && treeParser.getEntryPathString().equals(GIT_ATTRIBUTES)) { blobTask = TaskType.Attribute; pathTask = null; needAttributes = false; } else if (isFile(fileMode) && matchFilename(path + "/" + treeParser.getEntryPathString())) { blobTask = TaskType.UploadLfs; pathTask = null; } else { blobTask = TaskType.Simple; pathTask = path + "/" + treeParser.getEntryPathString(); } entries.add(new GitTreeEntry(fileMode, new TaskKey(blobTask, pathTask, treeParser.getEntryObjectId()), treeParser.getEntryPathString())); treeParser.next(); } if (needAttributes && globs.length > 0) { entries.add(new GitTreeEntry(FileMode.REGULAR_FILE, new TaskKey(TaskType.Attribute, null, ObjectId.zeroId()), GIT_ATTRIBUTES)); } return entries; }
final TaskKey taskKey = channel.take(); if (taskKey.getType() == GitConverter.TaskType.EndMark) break; final ObjectId objectId = converter.convertTask(reader, taskKey).convert(dstRepo, inserter, converted::get, uploader); converted.put(taskKey, objectId); reporter.increment(); final TaskKey taskKey = queue.pop(); boolean withoutDepends = true; for (TaskKey depend : converter.convertTask(reader, taskKey).depends()) { withoutDepends = false; if (checked.add(depend)) {