ResultWithOutput (@NotNull GitRepository repository, @NotNull PushSpec<GitPushSource, GitPushTarget> pushSpec) { GitPushSource pushSource = pushSpec.getSource(); GitPushTarget pushTarget = pushSpec.getTarget(); GitLocalBranch sourceBranch = pushSource.getBranch(); GitRemoteBranch targetBranch = pushTarget.getBranch(); GitLineHandlerListener progressListener = GitStandardProgressAnalyzer.createListener(myProgressIndicator); boolean setUpstream = sourceBranch != null && pushTarget.isNewBranchCreated() && pushSource.isBranchRef() && !branchTrackingInfoIsSet(repository, sourceBranch); String tagMode = myTagMode == null ? null : myTagMode.getArgument(); String spec = createPushSpec(pushSource, pushTarget, setUpstream); GitRemote remote = targetBranch.getRemote(); List<GitPushParams.ForceWithLease> forceWithLease = emptyList(); if (myForceMode == ForceMode.FORCE_WITH_LEASE) { Hash hash = repository.getBranches().getHash(targetBranch); String expectedHash = hash != null ? hash.asString() : ""; forceWithLease = singletonList(new ForceWithLeaseReference(targetBranch.getNameForRemoteOperations(), expectedHash)); } GitPushParamsImpl params = new GitPushParamsImpl(remote, spec, myForceMode.isForce(), setUpstream, mySkipHook, tagMode, forceWithLease); GitCommandResult res = myGit.push(repository, params, progressListener); if (res.success()) { BackgroundTaskUtil.syncPublisher(myProject, GIT_AUTHENTICATION_SUCCESS).authenticationSucceeded(repository, remote); } return new ResultWithOutput(res); }