if (existing.getSourceFile().equals(added.getSourceFile())) { if (existing.getTargetFile().equals(added.getTargetFile())) { LOG.debug("Removing duplicate action `move " + existing.getSourceFile() + " to " + existing.getTargetFile() + "`"); LOG.warn("Confusing set of changes. Requested move the same file (" + added.getSourceFile() + ") to both " + existing.getTargetFile() + " and " + added.getTargetFile()); return KEEP_BOTH_CONTINUE; if (existing.getTargetFile().equals(added.getTargetFile())) { LOG.info("Move request for " + added.getSourceFile() + " into " + added.getTargetFile() + " conflicts with existing move request from " + existing.getSourceFile() + ". Changing existing move request to a delete."); return new CurateResult(true, true, actionFactory.create(new DeleteFileAction(existing.getSourceFile(), existing.getChangelistId())), false); if (existing.getTargetFile().equals(added.getSourceFile())) { LOG.info("Consolidating move from " + existing.getSourceFile() + " to " + existing.getTargetFile() + " to " + added.getTargetFile()); actionFactory.create(new MoveFileAction(existing.getSourceFile(), added.getTargetFile(), added.getChangelistId())), null,
@NotNull @Override public String[] getDisplayParameters() { if (changelistId != null) { return new String[] { changeId(changelistId) }; } return EMPTY; }
public MoveFileAction(@NotNull FilePath source, @NotNull FilePath target, P4ChangelistId changelistId) { this(createActionId(MoveFileAction.class), source, target, changelistId); }
MoveFileAction ex = (MoveFileAction) existing; if (ex.getSourceFile().equals(added.getFile())) { LOG.info("Request to move file " + ex.getSourceFile() + " to " + ex.getTargetFile() + " implies that delete request for file " + ex.getSourceFile() + " is ignored."); return KEEP_EXISTING_REMOVE_ADDED_STOP; if (ex.getTargetFile().equals(added.getFile())) { LOG.info("Changing a move of " + ex.getSourceFile() + " to " + ex.getTargetFile() + " followed by delete of " + added.getFile() + " into a single delete of the source"); null, actionFactory.create(new DeleteFileAction(ex.getSourceFile(), ex.getChangelistId())),
@Test void curateFile_addTgt_moveSrc_deleteSrc() { SimplePendingActionFactory actionFactory = new SimplePendingActionFactory(REF_A1); PendingActionCurator curator = new PendingActionCurator(actionFactory); Map<String, MockVirtualFile> fs = MockVirtualFileSystem.createTree( "a.txt", "abc", "b.txt", "def" ); MockVirtualFile src = fs.get("a.txt"); MockVirtualFile tgt = fs.get("b.txt"); List<ActionStore.PendingAction> actions = new ArrayList<>(); P4ChangelistIdImpl cl1 = new P4ChangelistIdImpl(100, REF_A1); P4ChangelistIdImpl cl2 = new P4ChangelistIdImpl(100, REF_A1); ActionStore.PendingAction addFile = ActionStore.createPendingAction(REF_A1, new AddEditAction(tgt.asFilePath(), null, cl1, (String) null)); actions.add(addFile); ActionStore.PendingAction moveFile = ActionStore.createPendingAction(REF_A1, new MoveFileAction(src.asFilePath(), tgt.asFilePath(), cl1)); actions.add(moveFile); ActionStore.PendingAction deleteFile = ActionStore.createPendingAction(REF_A1, new DeleteFileAction(src.asFilePath(), cl2)); curator.curateActionList(deleteFile, actions); assertSize(0, actionFactory.created); assertContainsExactly(actions, addFile, moveFile); }
@NotNull @Override protected ActionAnswer<MoveFileResult> moveFile(ClientConfig config, MoveFileAction action) { // Move file is turned into 2 messages. FileActionMessage.sendEvent(new FileActionMessage.Event(config.getClientServerRef(), action.getSourceFile(), P4FileAction.MOVE_DELETE, null, action)); FileActionMessage.sendEvent(new FileActionMessage.Event(config.getClientServerRef(), action.getTargetFile(), P4FileAction.MOVE_ADD_EDIT, null, action)); return onlineExec(config, () -> server.perform(config, action) .whenCompleted((result) -> { FileActionMessage.sendEvent(new FileActionMessage.Event(config.getClientServerRef(), action.getSourceFile(), P4FileAction.MOVE_DELETE, null, action, result)); FileActionMessage.sendEvent(new FileActionMessage.Event(config.getClientServerRef(), action.getTargetFile(), P4FileAction.MOVE_ADD_EDIT, null, action, result)); }) .whenServerError((t) -> { FileActionMessage.sendEvent(new FileActionMessage.Event(config.getClientServerRef(), action.getSourceFile(), P4FileAction.MOVE_DELETE, null, action, t)); FileActionMessage.sendEvent(new FileActionMessage.Event(config.getClientServerRef(), action.getTargetFile(), P4FileAction.MOVE_ADD_EDIT, null, action, t)); }), OfflineActionAnswerImpl::new ); }
public File getExecDir(P4CommandRunner.ClientAction<?> action) { return ((MoveFileAction) action).getTargetFile().getIOFile().getParentFile(); }
switch (action.getCmd()) { case MOVE_FILE: return ((MoveFileAction) action).getChangelistId(); case ADD_EDIT_FILE: return ((AddEditAction) action).getChangelistId();
return new MoveFileAction(state.actionId, state.data.getFilePathNotNull("source"), state.data.getFilePathNotNull("target"),
case MOVE_FILE: { MoveFileAction a = toMoveFileAction(action); P4LocalFileImpl.Builder srcBuilder = files.get(a.getSourceFile()); P4LocalFileImpl.Builder tgtBuilder = files.get(a.getTargetFile()); if (srcBuilder == null) { srcBuilder = new P4LocalFileImpl.Builder() .withLocal(a.getSourceFile()) .withHave(new P4Revision(-1)); files.put(a.getSourceFile(), srcBuilder); .withChangelist(a.getChangelistId()); if (tgtBuilder == null) { tgtBuilder = new P4LocalFileImpl.Builder() .withLocal(a.getTargetFile()) .withHave(new P4Revision(-1)); files.put(a.getTargetFile(), tgtBuilder); .withIntegrateFrom(srcBuilder.getDepot()) .withResolveType(P4ResolveType.NO_RESOLVE) .withChangelist(a.getChangelistId()); break;
@Test void curateFile_move_deleteTgt() { SimplePendingActionFactory actionFactory = new SimplePendingActionFactory(REF_A1); PendingActionCurator curator = new PendingActionCurator(actionFactory); Map<String, MockVirtualFile> fs = MockVirtualFileSystem.createTree( "a.txt", "abc", "b.txt", "def" ); MockVirtualFile srcFile = fs.get("a.txt"); MockVirtualFile tgtFile = fs.get("b.txt"); List<ActionStore.PendingAction> actions = new ArrayList<>(); P4ChangelistIdImpl cl1 = new P4ChangelistIdImpl(100, REF_A1); P4ChangelistIdImpl cl2 = new P4ChangelistIdImpl(100, REF_A1); ActionStore.PendingAction moveFile = ActionStore.createPendingAction(REF_A1, new MoveFileAction(srcFile.asFilePath(), tgtFile.asFilePath(), cl1)); actions.add(moveFile); ActionStore.PendingAction deleteFile = ActionStore.createPendingAction(REF_A1, new DeleteFileAction(tgtFile.asFilePath(), cl2)); curator.curateActionList(deleteFile, actions); assertSize(1, actionFactory.created); ActionStore.PendingAction created = actionFactory.created.get(0); assertContainsExactly(actions, created); assertNull(created.serverAction); assertNotNull(created.clientAction); assertEquals(created.clientAction.getClass(), DeleteFileAction.class); DeleteFileAction createdDelete = (DeleteFileAction) created.clientAction; assertEquals(cl1, createdDelete.getChangelistId()); }
List<IFileSpec> srcFile = FileSpecBuildUtil.escapedForFilePaths(action.getSourceFile()); List<IFileSpec> tgtFile = FileSpecBuildUtil.escapedForFilePaths(action.getTargetFile()); if (srcFile.size() != 1 || tgtFile.size() != 1) { throw new IllegalStateException("Must have 1 source and 1 target, have " + srcFile + "; " + tgtFile); List<IFileSpec> edited = cmd.editFiles(client, tgtFile, null, action.getChangelistId(), null); MessageStatusUtil.throwIfError(edited); return new MoveFileResult(config, MessageStatusUtil.getMessages(edited, "\n"), edited); List<IFileSpec> added = cmd.addFiles(client, tgtFile, null, action.getChangelistId(), null); MessageStatusUtil.throwIfError(added); return new MoveFileResult(config, MessageStatusUtil.getMessages(added, "\n"), added); List<IFileSpec> edited = cmd.editFiles(client, tgtFile, null, action.getChangelistId(), null); MessageStatusUtil.throwIfError(edited); return new MoveFileResult(config, MessageStatusUtil.getMessages(edited, "\n"), edited); } else if (tgtStatus.isNotOnServer()) { LOG.debug("Source and target not on server. Opening target for add."); List<IFileSpec> added = cmd.addFiles(client, tgtFile, null, action.getChangelistId(), null); MessageStatusUtil.throwIfError(added); return new MoveFileResult(config, MessageStatusUtil.getMessages(added, "\n"), added); List<IFileSpec> edited = cmd.editFiles(client, tgtFile, null, action.getChangelistId(), null); MessageStatusUtil.throwIfError(edited); return new MoveFileResult(config, MessageStatusUtil.getMessages(edited, "\n"), edited); } else if (!srcStatus.hasOpen()) { LOG.debug("Source not open. Move requires the source to be open for edit."); List<IFileSpec> edited = cmd.editFiles(client, srcFile, null, action.getChangelistId(), null);
actions.add(addFile); ActionStore.PendingAction moveFile = ActionStore.createPendingAction(REF_A1, new MoveFileAction(src.asFilePath(), tgt.asFilePath(), cl1)); actions.add(moveFile); ActionStore.PendingAction deleteFile = ActionStore.createPendingAction(REF_A1,
MoveFileAction a = (MoveFileAction) action; ret.data .putFilePath("source", a.getSourceFile()) .putFilePath("target", a.getTargetFile()) .putChangelistId("cl-id", a.getChangelistId()); break;
new MoveFileAction(src, tgt, id))); } else {
new MoveFileAction(newFile, toFile, clId)); msgs = res.getServerMessages(); MessageStatusUtil.throwIfMessageOrEmpty("move", msgs);
.map((cm) -> new ConnectCommandRunner(idea.getMockProject(), cm)) .futureMap((runner, sink) -> runner.perform(clientConfig, new MoveFileAction(srcFile, tgtFile, new P4ChangelistIdImpl(0, clientConfig.getClientServerRef()))) .whenCompleted(sink::resolve)
new MoveFileAction(fromFile, toFile, clId)); msgs = res.getServerMessages(); assertSize(1, msgs);