Full Code of jenkinsci/tfs-plugin for AI

master aea4ce0f1fd8 cached
435 files
19.2 MB
273.4k tokens
1735 symbols
1 requests
Download .txt
Showing preview only (1,359K chars total). Download the full file or copy to clipboard to get everything.
Repository: jenkinsci/tfs-plugin
Branch: master
Commit: aea4ce0f1fd8
Files: 435
Total size: 19.2 MB

Directory structure:
gitextract_x4w9l1z2/

├── .gitignore
├── Jenkinsfile
├── README.md
├── ReleaseNotes.md
├── Releasing.md
├── Testing.md
├── contributing.md
├── pom.xml
├── tfs/
│   ├── checkstyle.xml
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── hudson/
│       │   │       └── plugins/
│       │   │           └── tfs/
│       │   │               ├── ChangeSetReader.java
│       │   │               ├── ChangeSetWriter.java
│       │   │               ├── CommitParameterAction.java
│       │   │               ├── JenkinsEventNotifier.java
│       │   │               ├── PullRequestParameterAction.java
│       │   │               ├── SafeParametersAction.java
│       │   │               ├── TFSLabeler.java
│       │   │               ├── TFSRevisionState.java
│       │   │               ├── TeamBuildDetailsAction.java
│       │   │               ├── TeamBuildEndpoint.java
│       │   │               ├── TeamCollectResultsPostBuildAction.java
│       │   │               ├── TeamCollectionConfiguration.java
│       │   │               ├── TeamCompletedStatusPostBuildAction.java
│       │   │               ├── TeamEventsEndpoint.java
│       │   │               ├── TeamFoundationServerScm.java
│       │   │               ├── TeamGlobalStatusAction.java
│       │   │               ├── TeamGlobalStatusPoster.java
│       │   │               ├── TeamHookCause.java
│       │   │               ├── TeamPRPushTrigger.java
│       │   │               ├── TeamPendingStatusBuildStep.java
│       │   │               ├── TeamPluginGlobalConfig.java
│       │   │               ├── TeamPullRequestMergedDetailsAction.java
│       │   │               ├── TeamPushCause.java
│       │   │               ├── TeamPushTrigger.java
│       │   │               ├── TeamResultsAction.java
│       │   │               ├── TeamUpdateWorkItemPostBuildAction.java
│       │   │               ├── UnsupportedIntegrationAction.java
│       │   │               ├── actions/
│       │   │               │   ├── CheckoutAction.java
│       │   │               │   └── RemoveWorkspaceAction.java
│       │   │               ├── browsers/
│       │   │               │   ├── TeamFoundationServerRepositoryBrowser.java
│       │   │               │   └── TeamSystemWebAccessBrowser.java
│       │   │               ├── commands/
│       │   │               │   ├── AbstractCallableCommand.java
│       │   │               │   ├── AbstractCommand.java
│       │   │               │   ├── Command.java
│       │   │               │   ├── DeleteWorkspaceCommand.java
│       │   │               │   ├── GetFilesToWorkFolderCommand.java
│       │   │               │   ├── GetWorkspaceMappingCommand.java
│       │   │               │   ├── LabelCommand.java
│       │   │               │   ├── ListWorkspacesCommand.java
│       │   │               │   ├── NewWorkspaceCommand.java
│       │   │               │   ├── RemoteChangesetVersionCommand.java
│       │   │               │   └── ServerConfigurationProvider.java
│       │   │               ├── listeners/
│       │   │               │   └── JenkinsRunListener.java
│       │   │               ├── model/
│       │   │               │   ├── AbstractCommand.java
│       │   │               │   ├── AbstractHookEvent.java
│       │   │               │   ├── AliasOnlyUserAccountMapper.java
│       │   │               │   ├── AutomaticCredentialsConfigurer.java
│       │   │               │   ├── BuildCommand.java
│       │   │               │   ├── BuildParameter.java
│       │   │               │   ├── BuildWithParametersCommand.java
│       │   │               │   ├── ChangeLogSet.java
│       │   │               │   ├── ChangeSet.java
│       │   │               │   ├── ClonePersistenceStoreProvider.java
│       │   │               │   ├── ConnectHookEvent.java
│       │   │               │   ├── ConnectionParameters.java
│       │   │               │   ├── CredentialsConfigurer.java
│       │   │               │   ├── CredentialsConfigurerDescriptor.java
│       │   │               │   ├── DomainUserAccountMapper.java
│       │   │               │   ├── ExtraSettings.java
│       │   │               │   ├── GitCodePushedEventArgs.java
│       │   │               │   ├── GitPullRequestEx.java
│       │   │               │   ├── GitPullRequestMergedEvent.java
│       │   │               │   ├── GitPushEvent.java
│       │   │               │   ├── GitStatusContext.java
│       │   │               │   ├── GitStatusState.java
│       │   │               │   ├── HttpMethod.java
│       │   │               │   ├── JobCompletionEventArgs.java
│       │   │               │   ├── JsonPatchOperation.java
│       │   │               │   ├── LegacyIdentityManagementService.java
│       │   │               │   ├── Link.java
│       │   │               │   ├── ListOfGitRepositories.java
│       │   │               │   ├── ManualCredentialsConfigurer.java
│       │   │               │   ├── MockableVersionControlClient.java
│       │   │               │   ├── ModernConnectionAdvisor.java
│       │   │               │   ├── ModernHTTPClientFactory.java
│       │   │               │   ├── NativeLibraryExtractor.java
│       │   │               │   ├── NativeLibraryManager.java
│       │   │               │   ├── PingCommand.java
│       │   │               │   ├── PingHookEvent.java
│       │   │               │   ├── Project.java
│       │   │               │   ├── ProxyHostEx.java
│       │   │               │   ├── PullRequestMergeCommitCreatedEventArgs.java
│       │   │               │   ├── Server.java
│       │   │               │   ├── TeamBuildPayload.java
│       │   │               │   ├── TeamGitStatus.java
│       │   │               │   ├── TeamRequestedResult.java
│       │   │               │   ├── TeamResultType.java
│       │   │               │   ├── TfsUserLookup.java
│       │   │               │   ├── UserAccountMapper.java
│       │   │               │   ├── UserAccountMapperDescriptor.java
│       │   │               │   ├── UserHomePersistenceStore.java
│       │   │               │   ├── UserLookup.java
│       │   │               │   ├── WebProxySettings.java
│       │   │               │   ├── WorkItem.java
│       │   │               │   ├── WorkItemTrackingResource.java
│       │   │               │   ├── WorkItemTrackingResourceReference.java
│       │   │               │   ├── Workspace.java
│       │   │               │   ├── WorkspaceConfiguration.java
│       │   │               │   ├── WorkspaceMapping.java
│       │   │               │   ├── Workspaces.java
│       │   │               │   └── servicehooks/
│       │   │               │       ├── Event.java
│       │   │               │       ├── EventScope.java
│       │   │               │       ├── FormattedEventMessage.java
│       │   │               │       └── ResourceContainer.java
│       │   │               ├── rm/
│       │   │               │   ├── Artifact.java
│       │   │               │   ├── ArtifactVersion.java
│       │   │               │   ├── ConnectReleaseWebHookEvent.java
│       │   │               │   ├── CreatedBy.java
│       │   │               │   ├── Definition.java
│       │   │               │   ├── DefinitionReference.java
│       │   │               │   ├── InstanceReference.java
│       │   │               │   ├── ModifiedBy.java
│       │   │               │   ├── Project.java
│       │   │               │   ├── ReleaseArtifact.java
│       │   │               │   ├── ReleaseArtifactVersionsResponse.java
│       │   │               │   ├── ReleaseBody.java
│       │   │               │   ├── ReleaseDefinition.java
│       │   │               │   ├── ReleaseManagementCI.java
│       │   │               │   ├── ReleaseManagementException.java
│       │   │               │   ├── ReleaseManagementHttpClient.java
│       │   │               │   ├── ReleaseSummaryAction.java
│       │   │               │   ├── ReleaseWebHook.java
│       │   │               │   ├── ReleaseWebHookAction.java
│       │   │               │   ├── ReleaseWebHookHelper.java
│       │   │               │   ├── ReleaseWebHookReference.java
│       │   │               │   ├── ReleaseWebHookResource.java
│       │   │               │   ├── ReleaseWebHookStatus.java
│       │   │               │   ├── ReleaseWebHookSummaryAction.java
│       │   │               │   ├── RetentionPolicy.java
│       │   │               │   └── Version.java
│       │   │               ├── telemetry/
│       │   │               │   ├── TelemetryContextInitializer.java
│       │   │               │   └── TelemetryHelper.java
│       │   │               └── util/
│       │   │                   ├── ActionHelper.java
│       │   │                   ├── BuildVariableResolver.java
│       │   │                   ├── BuildWorkspaceConfigurationRetriever.java
│       │   │                   ├── DateUtil.java
│       │   │                   ├── EndpointHelper.java
│       │   │                   ├── KeyValueTextReader.java
│       │   │                   ├── License.txt
│       │   │                   ├── MaskedArgumentListBuilder.java
│       │   │                   ├── MediaType.java
│       │   │                   ├── QueryString.java
│       │   │                   ├── ResourceHelper.java
│       │   │                   ├── StringBodyParameter.java
│       │   │                   ├── StringHelper.java
│       │   │                   ├── TeamRestClient.java
│       │   │                   ├── TeamStatus.java
│       │   │                   ├── TextTableParser.java
│       │   │                   ├── UriHelper.java
│       │   │                   └── XmlHelper.java
│       │   ├── resources/
│       │   │   └── hudson/
│       │   │       └── plugins/
│       │   │           └── tfs/
│       │   │               ├── TFSLabeler/
│       │   │               │   ├── config.jelly
│       │   │               │   └── global.jelly
│       │   │               ├── TeamBuildDetailsAction/
│       │   │               │   ├── index.jelly
│       │   │               │   └── summary.jelly
│       │   │               ├── TeamBuildEndpoint.html
│       │   │               ├── TeamCollectResultsPostBuildAction/
│       │   │               │   ├── config.groovy
│       │   │               │   └── help.html
│       │   │               ├── TeamCollectionConfiguration/
│       │   │               │   ├── config.groovy
│       │   │               │   └── help-collectionUrl.html
│       │   │               ├── TeamCompletedStatusPostBuildAction/
│       │   │               │   └── help.html
│       │   │               ├── TeamEventsEndpoint.html
│       │   │               ├── TeamFoundationServerScm/
│       │   │               │   ├── config.jelly
│       │   │               │   ├── config_fr.properties
│       │   │               │   ├── help-cloakedPaths.html
│       │   │               │   ├── help-credentialsConfigurer.html
│       │   │               │   ├── help-localPath.html
│       │   │               │   ├── help-projectPath.html
│       │   │               │   ├── help-serverUrl.html
│       │   │               │   └── help-workspaceName.html
│       │   │               ├── TeamPRPushTrigger/
│       │   │               │   ├── config.jelly
│       │   │               │   └── help.html
│       │   │               ├── TeamPendingStatusBuildStep/
│       │   │               │   └── help.html
│       │   │               ├── TeamPluginGlobalConfig/
│       │   │               │   ├── config.groovy
│       │   │               │   ├── help-configFolderPerNode.html
│       │   │               │   ├── help-enableTeamPushTriggerForAllJobs.html
│       │   │               │   ├── help-enableTeamStatusForAllJobs.html
│       │   │               │   ├── help-releaseWebhookConfigurations.html
│       │   │               │   ├── help-userAccountMapper.html
│       │   │               │   └── help.jelly
│       │   │               ├── TeamPullRequestMergedDetailsAction/
│       │   │               │   ├── index.jelly
│       │   │               │   └── summary.jelly
│       │   │               ├── TeamPushTrigger/
│       │   │               │   ├── TeamPollingAction/
│       │   │               │   │   └── index.jelly
│       │   │               │   ├── config.jelly
│       │   │               │   └── help.html
│       │   │               ├── TeamUpdateWorkItemPostBuildAction/
│       │   │               │   └── help.html
│       │   │               ├── browsers/
│       │   │               │   └── TeamSystemWebAccessBrowser/
│       │   │               │       └── config.jelly
│       │   │               ├── model/
│       │   │               │   ├── AliasOnlyUserAccountMapper/
│       │   │               │   │   └── config.groovy
│       │   │               │   ├── BuildCommand.json
│       │   │               │   ├── BuildWithParametersCommand.json
│       │   │               │   ├── ChangeLogSet/
│       │   │               │   │   ├── digest.jelly
│       │   │               │   │   ├── digest_fr.properties
│       │   │               │   │   ├── index.jelly
│       │   │               │   │   └── index_fr.properties
│       │   │               │   ├── DomainUserAccountMapper/
│       │   │               │   │   └── config.groovy
│       │   │               │   ├── GitPullRequestMergedEvent.json
│       │   │               │   ├── GitPushEvent.json
│       │   │               │   ├── ManualCredentialsConfigurer/
│       │   │               │   │   ├── config.groovy
│       │   │               │   │   └── help-userName.html
│       │   │               │   ├── TeamRequestedResult/
│       │   │               │   │   ├── config.groovy
│       │   │               │   │   └── help-includes.html
│       │   │               │   └── native/
│       │   │               │       ├── aix/
│       │   │               │       │   └── ppc/
│       │   │               │       │       ├── libnative_auth.a
│       │   │               │       │       ├── libnative_console.a
│       │   │               │       │       ├── libnative_filesystem.a
│       │   │               │       │       ├── libnative_misc.a
│       │   │               │       │       └── libnative_synchronization.a
│       │   │               │       ├── hpux/
│       │   │               │       │   └── PA_RISC/
│       │   │               │       │       ├── libnative_auth.sl
│       │   │               │       │       ├── libnative_console.sl
│       │   │               │       │       ├── libnative_filesystem.sl
│       │   │               │       │       ├── libnative_misc.sl
│       │   │               │       │       └── libnative_synchronization.sl
│       │   │               │       └── macosx/
│       │   │               │           ├── libnative_auth.jnilib
│       │   │               │           ├── libnative_console.jnilib
│       │   │               │           ├── libnative_filesystem.jnilib
│       │   │               │           ├── libnative_keychain.jnilib
│       │   │               │           ├── libnative_misc.jnilib
│       │   │               │           └── libnative_synchronization.jnilib
│       │   │               └── rm/
│       │   │                   ├── ReleaseManagementCI/
│       │   │                   │   ├── config.jelly
│       │   │                   │   ├── help-collectionUrl.html
│       │   │                   │   ├── help-credentialsId.html
│       │   │                   │   ├── help-destinationPath.html
│       │   │                   │   ├── help-isArchiveLog.html
│       │   │                   │   ├── help-projectName.html
│       │   │                   │   ├── help-releaseDefinitionName.html
│       │   │                   │   └── help.html
│       │   │                   ├── ReleaseSummaryAction/
│       │   │                   │   └── summary.jelly
│       │   │                   ├── ReleaseWebHook/
│       │   │                   │   ├── config.groovy
│       │   │                   │   ├── help-payloadUrl.html
│       │   │                   │   ├── help-secret.html
│       │   │                   │   └── help-webhookName.html
│       │   │                   ├── ReleaseWebHookAction/
│       │   │                   │   └── config.groovy
│       │   │                   ├── ReleaseWebHookReference/
│       │   │                   │   ├── config.groovy
│       │   │                   │   └── help-webHookName.html
│       │   │                   └── ReleaseWebHookSummaryAction/
│       │   │                       └── summary.jelly
│       │   └── webapp/
│       │       ├── WEB-INF/
│       │       │   └── lib/
│       │       │       ├── ThirdPartyNotices.html
│       │       │       ├── license.html
│       │       │       └── redist.txt
│       │       ├── browsers/
│       │       │   └── tswa.html
│       │       └── labelname.html
│       └── test/
│           ├── java/
│           │   ├── hudson/
│           │   │   ├── plugins/
│           │   │   │   └── tfs/
│           │   │   │       ├── ChangeSetReaderTest.java
│           │   │   │       ├── ChangeSetWriterTest.java
│           │   │   │       ├── CommitParameterActionTest.java
│           │   │   │       ├── EndToEndTfs.java
│           │   │   │       ├── FunctionalTest.java
│           │   │   │       ├── IntegrationTestHelper.java
│           │   │   │       ├── IntegrationTestHelperTest.java
│           │   │   │       ├── IntegrationTests.java
│           │   │   │       ├── InterceptingTaskListener.java
│           │   │   │       ├── LoggingFiltersSourceAdapter.java
│           │   │   │       ├── SwedishLocaleTestCase.java
│           │   │   │       ├── TFSRevisionStateTest.java
│           │   │   │       ├── TeamBuildEndpointTest.java
│           │   │   │       ├── TeamCollectionConfigurationTest.java
│           │   │   │       ├── TeamEventsEndpointTest.java
│           │   │   │       ├── TeamFoundationServerScmIntegrationTest.java
│           │   │   │       ├── TeamFoundationServerScmTest.java
│           │   │   │       ├── Util.java
│           │   │   │       ├── actions/
│           │   │   │       │   ├── CheckoutActionTest.java
│           │   │   │       │   └── RemoveWorkspaceActionTest.java
│           │   │   │       ├── browsers/
│           │   │   │       │   └── TeamSystemWebAccessBrowserTest.java
│           │   │   │       ├── commands/
│           │   │   │       │   ├── AbstractCallableCommandTest.java
│           │   │   │       │   ├── AbstractCommandTest.java
│           │   │   │       │   ├── DeleteWorkspaceCommandTest.java
│           │   │   │       │   ├── GetFilesToWorkFolderCommandTest.java
│           │   │   │       │   ├── LabelCommandTest.java
│           │   │   │       │   ├── ListWorkspacesCommandTest.java
│           │   │   │       │   ├── NewWorkspaceCommandTest.java
│           │   │   │       │   └── RemoteChangesetVersionCommandTest.java
│           │   │   │       ├── model/
│           │   │   │       │   ├── AbstractHookEventTest.java
│           │   │   │       │   ├── ChangeLogSetIntegrationTest.java
│           │   │   │       │   ├── ChangeLogSetTest.java
│           │   │   │       │   ├── ChangeSetTest.java
│           │   │   │       │   ├── GitCodePushedEventArgsTest.java
│           │   │   │       │   ├── GitPullRequestMergedEventTest.java
│           │   │   │       │   ├── GitPushEventTest.java
│           │   │   │       │   ├── GitStatusContextTest.java
│           │   │   │       │   ├── NativeLibraryManagerTest.java
│           │   │   │       │   ├── ProjectTest.java
│           │   │   │       │   ├── PullRequestMergeCommitCreatedEventArgsTest.java
│           │   │   │       │   ├── ServerIntegrationTest.java
│           │   │   │       │   ├── ServerTest.java
│           │   │   │       │   ├── TeamGitStatusTest.java
│           │   │   │       │   ├── WorkspaceConfigurationTest.java
│           │   │   │       │   ├── WorkspacesTest.java
│           │   │   │       │   └── servicehooks/
│           │   │   │       │       └── EventScopeTest.java
│           │   │   │       └── util/
│           │   │   │           ├── BuildVariableResolverTest.java
│           │   │   │           ├── BuildWorkspaceConfigurationRetrieverTest.java
│           │   │   │           ├── DateUtilTest.java
│           │   │   │           ├── KeyValueTextReaderTest.java
│           │   │   │           ├── MaskedArgumentListBuilderTest.java
│           │   │   │           ├── QueryStringTest.java
│           │   │   │           ├── StringHelperTest.java
│           │   │   │           ├── TeamRestClientTest.java
│           │   │   │           ├── TextTableParserTest.java
│           │   │   │           ├── UriHelperTest.java
│           │   │   │           └── XmlHelperTest.java
│           │   │   └── util/
│           │   │       └── SecretOverride.java
│           │   └── jenkins/
│           │       └── security/
│           │           └── ConfidentialStoreOverride.java
│           └── resources/
│               ├── hudson/
│               │   └── plugins/
│               │       └── tfs/
│               │           ├── FunctionalTest/
│               │           │   ├── agent/
│               │           │   │   ├── config.xml
│               │           │   │   ├── hudson.plugins.tfs.TeamFoundationServerScm.xml
│               │           │   │   ├── identity.key.enc
│               │           │   │   ├── jobs/
│               │           │   │   │   └── agent/
│               │           │   │   │       ├── builds/
│               │           │   │   │       │   ├── 2015-07-15_20-37-42/
│               │           │   │   │       │   │   ├── build.xml
│               │           │   │   │       │   │   ├── changelog.xml
│               │           │   │   │       │   │   └── log
│               │           │   │   │       │   ├── lastFailedBuild
│               │           │   │   │       │   ├── lastStableBuild
│               │           │   │   │       │   ├── lastSuccessfulBuild
│               │           │   │   │       │   ├── lastUnstableBuild
│               │           │   │   │       │   ├── lastUnsuccessfulBuild
│               │           │   │   │       │   └── legacyIds
│               │           │   │   │       ├── config.xml
│               │           │   │   │       └── nextBuildNumber
│               │           │   │   └── secret.key
│               │           │   ├── cloakedPaths/
│               │           │   │   ├── config.xml
│               │           │   │   ├── hudson.plugins.tfs.TeamFoundationServerScm.xml
│               │           │   │   ├── identity.key.enc
│               │           │   │   ├── jobs/
│               │           │   │   │   └── cloakedPaths/
│               │           │   │   │       ├── builds/
│               │           │   │   │       │   ├── 2015-07-15_20-37-42/
│               │           │   │   │       │   │   ├── build.xml
│               │           │   │   │       │   │   ├── changelog.xml
│               │           │   │   │       │   │   └── log
│               │           │   │   │       │   ├── lastFailedBuild
│               │           │   │   │       │   ├── lastStableBuild
│               │           │   │   │       │   ├── lastSuccessfulBuild
│               │           │   │   │       │   ├── lastUnstableBuild
│               │           │   │   │       │   ├── lastUnsuccessfulBuild
│               │           │   │   │       │   └── legacyIds
│               │           │   │   │       ├── config.xml
│               │           │   │   │       └── nextBuildNumber
│               │           │   │   └── secret.key
│               │           │   ├── createLabel/
│               │           │   │   ├── config.xml
│               │           │   │   ├── hudson.plugins.tfs.TeamFoundationServerScm.xml
│               │           │   │   ├── identity.key.enc
│               │           │   │   ├── jobs/
│               │           │   │   │   └── createLabel/
│               │           │   │   │       ├── builds/
│               │           │   │   │       │   ├── 2015-07-15_20-37-42/
│               │           │   │   │       │   │   ├── build.xml
│               │           │   │   │       │   │   ├── changelog.xml
│               │           │   │   │       │   │   └── log
│               │           │   │   │       │   ├── lastFailedBuild
│               │           │   │   │       │   ├── lastStableBuild
│               │           │   │   │       │   ├── lastSuccessfulBuild
│               │           │   │   │       │   ├── lastUnstableBuild
│               │           │   │   │       │   ├── lastUnsuccessfulBuild
│               │           │   │   │       │   └── legacyIds
│               │           │   │   │       ├── config.xml
│               │           │   │   │       └── nextBuildNumber
│               │           │   │   └── secret.key
│               │           │   ├── newJob/
│               │           │   │   ├── config.xml
│               │           │   │   ├── hudson.plugins.tfs.TeamFoundationServerScm.xml
│               │           │   │   ├── identity.key.enc
│               │           │   │   ├── jobs/
│               │           │   │   │   └── newJob/
│               │           │   │   │       ├── builds/
│               │           │   │   │       │   ├── lastFailedBuild
│               │           │   │   │       │   ├── lastStableBuild
│               │           │   │   │       │   ├── lastSuccessfulBuild
│               │           │   │   │       │   ├── lastUnstableBuild
│               │           │   │   │       │   ├── lastUnsuccessfulBuild
│               │           │   │   │       │   └── legacyIds
│               │           │   │   │       ├── config.xml
│               │           │   │   │       └── nextBuildNumber
│               │           │   │   └── secret.key
│               │           │   ├── oldPollingFallback/
│               │           │   │   ├── config.xml
│               │           │   │   ├── identity.key.enc
│               │           │   │   ├── jobs/
│               │           │   │   │   └── oldPollingFallback/
│               │           │   │   │       ├── builds/
│               │           │   │   │       │   ├── 2015-07-10_12-11-34/
│               │           │   │   │       │   │   ├── build.xml
│               │           │   │   │       │   │   ├── log
│               │           │   │   │       │   │   └── polling.log
│               │           │   │   │       │   ├── lastFailedBuild
│               │           │   │   │       │   ├── lastStableBuild
│               │           │   │   │       │   ├── lastSuccessfulBuild
│               │           │   │   │       │   ├── lastUnstableBuild
│               │           │   │   │       │   ├── lastUnsuccessfulBuild
│               │           │   │   │       │   └── legacyIds
│               │           │   │   │       ├── config.xml
│               │           │   │   │       └── nextBuildNumber
│               │           │   │   └── secret.key
│               │           │   ├── upgradeEncodedPassword/
│               │           │   │   ├── config.xml
│               │           │   │   ├── identity.key.enc
│               │           │   │   ├── jobs/
│               │           │   │   │   └── upgradeEncodedPassword/
│               │           │   │   │       ├── builds/
│               │           │   │   │       │   ├── 2015-07-15_20-37-42/
│               │           │   │   │       │   │   ├── build.xml
│               │           │   │   │       │   │   ├── changelog.xml
│               │           │   │   │       │   │   └── log
│               │           │   │   │       │   ├── lastFailedBuild
│               │           │   │   │       │   ├── lastStableBuild
│               │           │   │   │       │   ├── lastSuccessfulBuild
│               │           │   │   │       │   ├── lastUnstableBuild
│               │           │   │   │       │   ├── lastUnsuccessfulBuild
│               │           │   │   │       │   └── legacyIds
│               │           │   │   │       ├── config.xml
│               │           │   │   │       └── nextBuildNumber
│               │           │   │   └── secret.key
│               │           │   └── useWebProxyServer/
│               │           │       ├── config.xml
│               │           │       ├── hudson.plugins.tfs.TeamFoundationServerScm.xml
│               │           │       ├── identity.key.enc
│               │           │       ├── jobs/
│               │           │       │   └── useWebProxyServer/
│               │           │       │       ├── builds/
│               │           │       │       │   ├── 2015-07-15_20-37-42/
│               │           │       │       │   │   ├── build.xml
│               │           │       │       │   │   ├── changelog.xml
│               │           │       │       │   │   └── log
│               │           │       │       │   ├── lastFailedBuild
│               │           │       │       │   ├── lastStableBuild
│               │           │       │       │   ├── lastSuccessfulBuild
│               │           │       │       │   ├── lastUnstableBuild
│               │           │       │       │   ├── lastUnsuccessfulBuild
│               │           │       │       │   └── legacyIds
│               │           │       │       ├── config.xml
│               │           │       │       └── nextBuildNumber
│               │           │       ├── proxy.xml
│               │           │       └── secret.key
│               │           ├── action/
│               │           │   ├── tf-changeset-1.log
│               │           │   ├── tf-changeset-2.log
│               │           │   └── tf-changeset-3.log
│               │           ├── commands/
│               │           │   ├── issue-3683.txt
│               │           │   ├── issue-4184.txt
│               │           │   ├── issue-4943.txt
│               │           │   ├── issue-6454.txt
│               │           │   ├── issue-6870-2.txt
│               │           │   ├── issue-6870.txt
│               │           │   ├── tf-changeset-1.txt
│               │           │   ├── tf-changeset-2.txt
│               │           │   ├── tf-changeset-3.txt
│               │           │   ├── tf-changeset-german-1.txt
│               │           │   └── tf-workfold-list.txt
│               │           ├── git.push-sample.json
│               │           └── util/
│               │               └── XmlHelperTest/
│               │                   ├── peekValue_File/
│               │                   │   └── input.xml
│               │                   └── pokeValue_File/
│               │                       ├── expected.xml
│               │                       └── input.xml
│               ├── tf-get.log
│               ├── tf-history.log
│               ├── tf-workfold.log
│               ├── tf-workspace.log
│               ├── tf-workspaces.log
│               ├── tf.bat
│               └── tf.sh
└── tfs-sdk/
    ├── pom.xml
    └── src/
        └── com.microsoft.tfs.sdk-14.0.3.jar

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
.settings
**/target
**/workspaces
**/work
.project
.classpath
/.idea
**/*.iml


================================================
FILE: Jenkinsfile
================================================
pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                buildPlugin()
            }
        }
    }
}


================================================
FILE: README.md
================================================
Azure DevOps and Team Foundation Server plugin for Jenkins
============================
Copyright © Erik Ramfelt, Olivier Dagenais, CloudBees, Inc. and others.
Licensed under [MIT Licence].
 
## Summary
This plugin triggers a release in Azure DevOps, through a post-build step in Jenkins.  It also integrates [Team Foundation Version Control] (also known as TFVC) and Git to Jenkins by connecting to Team Foundation Server (TFS). 

## Quick links
* The legacy [wiki] page on the Jenkins Confluence instance
* CI build status - [![Build Status](https://ci.jenkins.io/buildStatus/icon?job=Plugins/tfs-plugin/master)](https://ci.jenkins.io/job/Plugins/job/tfs-plugin/job/master/)
* Issues are tracked by the [Jenkins JIRA]
* Download the latest release [from the Jenkins CDN](http://updates.jenkins-ci.org/latest/tfs.hpi) or [from the GitHub Releases page](https://github.com/jenkinsci/tfs-plugin/releases)

## What can you do with it?

That depends on which version control system you use in Azure DevOps/TFS:

### Team Foundation Version Control

Allows you to use a TFVC repository as an SCM in a Jenkins jobs. At the moment, this plugin supports:
* Retrieving read-only copies of files and folders from a TFVC repository.
* Polling a TFVC repository to automatically start builds when there are changes.
* Links from the Jenkins change sets to the TFVC repository web interface. _(Also known as a repository browser)_
* Creating a label in the TFVC repository 

The plugin will automatically create a workspace in TFS/Azure DevOps and map a work folder (in the Jenkins workspace) to it.


### Git

The TFS plug-in for Jenkins adds some features to better integrate with Git repositories hosted in TFS/Azure DevOps:
* A push trigger, to request builds of specific commits in Git repositories without needing to schedule SCM polling
    * Instead of adding the **Build when a change is pushed to TFS/Azure DevOps** trigger to every job, you can also check the checkbox next to **Enable Push Trigger for all jobs** in the Jenkins global configuration.  Individual jobs can still opt-out of this global opt-in by enabling the **Poll SCM** trigger and checking its **Ignore post-commit hooks** checkbox.
* A build step that adds a "build pending" status to the associated pull request and/or commit in TFS/Azure DevOps
    * Instead of adding the **Set build pending status in TFS/Azure DevOps** build step to every job, you can also check the checkbox next to **Enable Team Status for all jobs** in the Jenkins global configuration.
* A post-build action that add a "build completed" status to the associated pull request and/or commit in TFS/Azure DevOps
    * Instead of adding the **Set build completion status in TFS/Azure DevOps** post-build action to every job, you can also check the checkboxbox next to **Enable Team Status for all jobs** in the Jenkins global configuration.
* A link to (and summary information about) the associated TFS/Azure DevOps build that triggered the Jenkins build.
* A link to (and summary information about) the associated TFS/Azure DevOps pull request that triggered the Jenkins build.
    * Links to associated TFS/Azure DevOps work items.
    * Associated TFS/Azure DevOps work items link back to the Jenkins build.

There are two possibilities to trigger a build with SCM Changeset:
* TFS plugin  
  Please refer to the [Webhooks with Azure DevOps](https://www.visualstudio.com/en-us/docs/service-hooks/services/webhooks) page for instructions on configuring the integration in TFS. Available endpoints can be found under [http://yourJenkins/team-events](http://yourJenkins/team-events)
* Git plugin  
  You have to enable Git SCM polling to receive commit notifications  
  Please refer to the [Jenkins with Azure DevOps](https://www.visualstudio.com/en-us/docs/service-hooks/services/jenkins) page for instructions on configuring the integration in TFS.


# Supported versions

The following sub-sections list the various versions of software that were tested and are thus supported.  The plugin might work with other versions, they just haven't been tested.

## Team Foundation Server (TFS) / Azure DevOps

The following table indicates compatibility and support for versions of TFS and Azure DevOps.

> Version | Supported by the TFS plugin? | Mainstream Support End Date
> ------- | ------ | ---------------------------
> [Azure DevOps] | :white_check_mark: | n/a
> Visual Studio Team Foundation Server 2017 | :white_check_mark: | [2022/01/11](https://support.microsoft.com/en-us/lifecycle/search?alpha=Visual%20Studio%20Team%20Foundation%20Server%202017)
> Visual Studio Team Foundation Server 2015 | :white_check_mark: | [2020/10/13](https://support.microsoft.com/en-us/lifecycle?p1=18576)
> Microsoft Visual Studio Team Foundation Server 2013 | :white_check_mark: | [2019/04/09](https://support.microsoft.com/en-us/lifecycle?p1=17358)
> Microsoft Visual Studio Team Foundation Server 2012 | :white_check_mark: | [2018/01/09](https://support.microsoft.com/en-us/lifecycle?p1=16804)
> Microsoft Visual Studio Team Foundation Server 2010 | :x: | :warning: [2015/07/14](https://support.microsoft.com/en-us/lifecycle?p1=15011)
> Microsoft Visual Studio Team System 2008 Team Foundation Server | :x: | :warning: [2013/04/09](https://support.microsoft.com/en-us/lifecycle?p1=13083)
> Microsoft Visual Studio 2005 Team Foundation Server | :x: | :warning: [2011/07/12](https://support.microsoft.com/en-us/lifecycle?p1=10449)

Whereas for **Trigger release in TFS/Azure DevOps** post build action, only following table is supported:

> Version | Supported by the TFS plugin? | Mainstream Support End Date
> ------- | ------ | ---------------------------
> [Azure DevOps] | :white_check_mark: | n/a
> [Team Foundation Server "15" RC1] | :white_check_mark: | n/a

## Operating Systems

The plugin has been tested against the following operating systems and versions, with the latest updates as of 2015/08/27.

Name | Version
---- | -------
Windows Server | 2012 R2
Mac OS X | Yosemite 10.10.5
Ubuntu Linux | Server 14.04 LTS

## Jenkins

The plugin is built against Jenkins version **1.580** and that's the version integration tests are run against.

# Configuration

## Requirements

### 4.0.0 and later (New!)

Ever since release 4.0.0, a command-line client or tool is no longer necessary as all the interaction with TFS or Azure DevOps is done using the [TFS SDK for Java].  The native libraries needed by the SDK are automatically copied to a sub-directory under the agent user's home folder.

### 3.2.0 and earlier

Versions 3.2.0 and earlier of the plugin required a command line tool to be installed on the build agents to retrieve source code from the TFVC repository.

1. Install either Microsoft Visual Studio or [Microsoft Team Explorer Everywhere] Command-Line Client (CLC) on the build agents
2. Add `tf.exe` (Visual Studio) OR one of `tf.cmd` or `tf` (TEE CLC) to the `PATH` of the build agents' user(s).

## Global configuration

To make use of the Git integration with TFS/Azure DevOps and/or to use automatic credentials configuration with the TFVC SCM, it is necessary to first configure your team project collection(s).  Follow these instructions for each team project collection (most organizations will only have one).

1. Add credentials:
    1. Select **Jenkins** > **Credentials**
    2. Select **Add domain**
        1. In the _Domain Name_ field, enter the host's friendly name, such as `fabrikam-fiber-inc`
        2. In the _Description_ field, you can enter some notes, such as who maintains the server, etc.
        3. Next to _Specification_, select **Add** > **Hostname**
            1. In the _Include_ field, enter the Fully-Qualified Domain Name (FQDN), such as `fabrikam-fiber-inc.visualstudio.com`
        4. Click **OK**
    3. Select **Add Credentials**
        1. For the _Kind_ field, select **Username with password**
        2. For the _Scope_ field, select **Global (Jenkins, nodes, items, all child items, etc)**
        3. See the _User name and password_ section below for the values of the _Username_ and _Password_; a Personal Access Token (PAT) is strongly recommended.  If the credentials will be used for TFVC, select **All scopes**, otherwise select the following _Authorized Scopes_:
            1. `Code (read)`
            2. `Code (status)`
            3. `Work items (read and write)`
        4. You can use the _Description_ field to record details about the PAT, such as its intended collection, the selected authorization scopes and expiration date.  For example: `fabrikam-fiber-inc, code read+status, wit read+write, expires 2017-08-05`
        5. Click **OK**   
2. Add the collection URL and associate it with the right credentials:
    1. Select **Jenkins** > **Manage Jenkins** > **Configure System**
    2. Scroll to **TFS/Azure DevOps** and click **Add**
        1. If using Azure DevOps, the value of the _Collection URL_ field should omit `/DefaultCollection`.
        2. Select the associated `Credentials` value created earlier.
        3. Click **Test Connection**.
    3. Click **Save**

### Automatic integration

To avoid having to configure every job to enable integration features, you can check the checkbox next to either or both of:

* Enable Push Trigger for all jobs
* Enable Team Status for all jobs

![Automatic Integration](images/AutomaticIntegration.png)

### Advanced

In some environments, the "home" directory is mounted over a network and shared between many computers, including Jenkins servers and their associated build nodes, which eventually leads to corruption of the configuration directory used for TFVC workspaces.  If you have such an environment, check the box next to **Store TFVC configuration in computer-specific folders** to use a sub-directory for each computer. :warning: WARNING :warning: Turning this on is equivalent to setting the `TEE_PROFILE_DIRECTORY` environment variable and thus any manual operations performed using the Command-Line Client (CLC) will need to be performed with the `TEE_PROFILE_DIRECTORY` environment variable set accordingly.

## Job configuration

### Team Foundation Version Control

If your source code is in a TFVC repository, this section is for you.

![SCM configuration](images/tfs-job-config4.png)

Field | Description
----- | -----------
`Collection URL` | The URL to the [Team Project Collection](https://msdn.microsoft.com/en-us/library/dd236915(v=vs.120).aspx). If you added your team project collection(s) in the global configuration, the field will show you a list to pick from. Examples: `https://tfs02.codeplex.com`, `https://fabrikam-fiber-inc.visualstudio.com`, `http://tfs:8080/tfs/DefaultCollection`
`Project path` | The Team Project and path to retrieve from the server. The project path must start with `$/`, and contain any sub path that exists in the project repository. Example: `$/Fabrikam-Fiber-TFVC/AuthSample-dev`
`Credentials` | If you added your team project collection(s) in the global configuration, select **Automatic** and the credentials will be looked up automatically, otherwise you can select **Manual** and configure the `User name` and `User password` fields.
`Manual` > `User name` | The name of the user that will be connecting to TFS/Azure DevOps to query history, checkout files, etc. See _User name and password_ below for a full description.
`Manual` > `User password` | The password, alternate password or personal access token associated with the user. See _User name and password_ below for more details.
`Use update` | If this option is checked, then the workspace will not be deleted and re-created at the start of each build, making the build faster, but this causes the artifacts from the previous build to remain when a new build starts.
`Local workfolder` | The name of the local work folder. The specified folder will contain the files retrieved from the repository. Default is `.`, ie the files will be downloaded into the Hudson workspace folder.
`Workspace name` | The name of the workspace that Jenkins should use when creating and deleting workspaces on the server. The workspace name supports three macros; `${JOB_NAME}` is replaced by the job name, `${USER_NAME}` is replaced by the user name Jenkins is running as and `${NODE_NAME}` is replaced by the name of the node. Default workspace name is `Hudson-${JOB_NAME}-${NODE_NAME}`.
`Cloaked paths` | A collection of server paths to cloak to exclude from the workspace and from the build trigger. Multiple entries must be placed onto separate lines.
`Repository browser` | Select `Microsoft Team Foundation Server/Azure DevOps` to turn on links inside Jenkins jobs (in the **Changes** page) back to TFS/Azure DevOps, for easier traceability.  If the TFS server is reached by users through a different URL than that provided in `Collection URL`, such as the Fully-Qualified Domain Name (FQDN), provide a value for the `URL` sub-field.

### Git

If your source code is in a Git repository located on a TFS/Azure DevOps server, this section is for you.

> :warning: Make sure you first followed the instructions in the **Global configuration** section and added your team project collection(s), associated with credentials. :warning:

![Git configuration](images/git-job-config.png)

If you didn't have the Git plug-in for Jenkins already, installing the TFS plug-in for Jenkins should have brought it on as a dependency.

1. Use the **Git** _Source Code Management_ and add the URL to your Git repository in TFS/Azure DevOps, omitting the `/DefaultCollection` if you are using Azure DevOps.
2. If you haven't done so already, follow the instructions in the "User name and password" section to generate a Personal Access Token, and then add a "Credentials" entry as specified in the "Global configuration" section.  You should then be able to select it in the _Credentials_ field.
3. To be able to build the merge commits created for pull requests in TFS/Azure DevOps, click the **Advanced...** button
    1. In the _Name_ field, enter **origin** (or some unique name if you already have other repositories)
    2. In the _Refspec_ field, enter `+refs/heads/*:refs/remotes/origin/* +refs/pull/*:refs/remotes/origin-pull/*` (replacing "origin" as necessary)
4. If you haven't already enabled the Push Trigger for all jobs, scroll down to _Build Triggers_ and you can check the **Build when a change is pushed to TFS/Azure DevOps** checkbox.
5. If you haven't already enabled Team Status for all jobs, scroll down to _Build_, select **Add build step** > **Set build pending status in TFS/Azure DevOps**, moving it _first_ in the list of steps, to notify TFS/Azure DevOps as early as possible that a Jenkins build has been started.
6. Add other build steps, as necessary. 
7. If you haven't already enabled Team Status for all jobs, scroll down to _Post-build Actions_, select **Add post-build action** > **Set build completion status in TFS/Azure DevOps**.
8. If you would like to collect results for publication in TFS/Azure DevOps, scroll down to _Post-build Actions_, select **Add post-build action** > **Collect results for TFS/Azure DevOps** and then add one or more results to collect.
9. If the Jenkins job will be used to validate pull requests in TFS/Azure DevOps and you would like to add links from the associated work items back to the Jenkins build, select **Add post-build action** > **Add link to associated work items in TFS/Azure DevOps**.

### User name and password

#### Team Foundation Server (on-premises)

For \[on-premises\] Team Foundation Server, the _User name_ can be specified in two ways:

1. `EXAMPLE-DOMAIN\user`
2. `user@domain.example.com`

#### Azure DevOps (previously known as Visual Studio Team Services or VSTS)

For Azure DevOps, there are also two options:

1. Personal access tokens (recommended)
    1. In Azure DevOps, click your name in the top right corner and select **Security**.
    2. In the _Personal access tokens_ area, select **Add**.
    3. Describe the token (use something like "Jenkins server at jenkins.example.com"), select an expiry timeframe, double-check the Azure DevOps account the token will be valid for and, if the user account will be used for TFVC, select **All scopes** otherwise you can select smaller scopes based on what features you will need.
    4. Click **\[Create Token\]** and copy the generated personal access token to the clipboard.
    5. Back to Jenkins, enter the e-mail address associated with your Azure DevOps account as the _User name_ and the generated personal access token as the _User password_.
2.  Alternate credentials
    1. In Azure DevOps, click your name in the top right corner and select **Security**.
    2. In the _Alternate credentials_ area, select **Enable alternate authentication credentials**.
    3. Enter a secondary user name and password, then click **\[Save\]**.
    4. Back to Jenkins, re-enter those credentials in the _User name_ and _User password_ fields.


## Checkout by label (New since version 3.2.0)

The plugin now supports checking out from a specific label or any valid [versionspec](https://www.visualstudio.com/docs/tfvc/use-team-foundation-version-control-commands#use-a-versionspec-argument-to-specify-affected-versions-of-items).  Here's how to configure a job to do that:

> :information_source: Polling the server doesn't make sense when you want to build for a specific label because polling is not \[currently\] label-aware and could queue a build **every polling interval**. :information_source:

1. Turn **off** SCM polling by making sure the **Poll SCM** checkbox is _cleared_ (unchecked).
2. Tick the **This build is parameterised** checkbox
    1. Add a **String Parameter**
    2. Set its _Name_ to **VERSION_SPEC**
    3. Set its _Description_ to the following:
    ```
    Enter a valid version spec to use when checking out.
    Labels are prefixed with "L" and changesets are prefixed with "C".
    See the following for a versionspec reference: https://www.visualstudio.com/docs/tfvc/use-team-foundation-version-control-commands#use-a-versionspec-argument-to-specify-affected-versions-of-items
    Examples: "LFoo", "C42"
    ```
3. **Save** the job.

Now, the next time you want to queue a build, you will need to provide a value for the **VERSION_SPEC** parameter.  The build will then perform a checkout of the source as of the specified **VERSION_SPEC**.

## Proxy server support (New since version 4.1.0)

In the event Jenkins is deployed on a network with no direct access to other networks (such as the internet), the TFS plugin now supports connecting through proxy servers.

> :information_source: Support for proxy servers requiring authentication was added in version 5.1.0. :information_source:

Follow the instructions at [JenkinsBehindProxy](https://wiki.jenkins-ci.org/display/JENKINS/JenkinsBehindProxy) to configure Jenkins' use of a proxy server, which the TFS plugin also uses.

## Integration with TFS/Azure DevOps (New since version 5.0.0)

There are some steps to perform in both Jenkins and in TFS/Azure DevOps to activate the integration.  This section assumes you have already configured one or more team project collections, as described in the **Global configuration** section above and then configured the Jenkins jobs as described in the **Git** section above.

### Trigger builds when code is pushed to a Git repository in TFS/Azure DevOps

1. Go to the team project's _Administration_ and then select **Service Hooks**
2. Select the `+` button
3. Select **Jenkins** and click **Next**
4. Select **Code pushed**, configure the **Filters** and click **Next**
5. You can now configure which action will be performed.  The choices are **Trigger generic build** and **Trigger Git build**.  Once you select the action, its _Settings_ must be configured
    1. Enter the URL to your Jenkins server. (hint: it's the destination when you click the Jenkins logo in the top left)
    2. Enter your _User name_
    3. For the _User API token_, click on your user name in Jenkins (in the top-right corner), then **Configure** and finally click the **Show API Token...*** button.  Copy & paste the token back in TFS/Azure DevOps
    4. Once valid credentials have been provided, more fields will become available.  If you selected **Trigger generic build**, keep going with these fields
        1. The _Build_ field should now be configurable as a drop-down list
        2. Add any additional parameters, if any
    5. Click **Test**, inspect the results of the test and click **Close**
    6. If the test was successful, click **Finish**

### Trigger builds when a pull request is created or updated in TFS/Azure DevOps

1. Go to the team project's _Administration_ and then select **Service Hooks**
2. Select the `+` button
3. Select **Jenkins** and click **Next**
4. Select one of **Code pushed** or **Pull request merge commit created**, configure the **Filters** and click **Next**
5. The only action available is **Trigger generic build**, its _Settings_ must be configured
    1. Enter the URL to your Jenkins server. (hint: it's the destination when you click the Jenkins logo in the top left)
    2. Enter your _User name_
    3. For the _User API token_, click on your user name in Jenkins (in the top-right corner), then **Configure** and finally click the **Show API Token...*** button.  Copy & paste the token back in TFS/Azure DevOps
    4. Once valid credentials have been provided, more fields will become available
    5. The _Build_ field should now be configurable as a drop-down list
    6. Add any additional parameters, if any
    7. Click **Test**, inspect the results of the test and click **Close**
    8. If the test was successful, click **Finish**


## Build environment variables

The plugin will set the following environment variables for the build, after a checkout:

* **TFS_WORKSPACE** \- The name of the workspace.
* **TFS_WORKFOLDER** \- The full path to the working folder.
* **TFS_PROJECTPATH** \- The TFVC project path that is mapped to the workspace.
* **TFS_SERVERURL** \- The URL to the Team Project Collection.
* **TFS_USERNAME** \- The user name that is used to connect to TFS/Azure DevOps.
* **TFS_CHANGESET** \- The change set number that is checked out in the workspace

# Trigger release in TFS/Azure DevOps

[MSDN documentation](https://blogs.msdn.microsoft.com/visualstudioalm/2016/05/27/continuous-deploymentdelivery-with-jenkins-and-vs-team-services/)

### Overview
Once you have configured Continuous Integration (CI) with Jenkins to be able to build with every code checkin/commit, the next step toward automating your DevOps pipeline is to be able to deploy automatically by setting up the Continuous Deployment (CD) pipeline.

[VS Team Service Release Management](https://www.visualstudio.com/features/release-management-vs) service lets you automate your deployments so that you could deliver your apps/services easily and deliver them often. You can setup the CI and CD process all on VS Azure DevOps. However, if you have the CI pipleine already set with Jenkins, VS Team Service has good integration points through its [APIs](https://www.visualstudio.com/integrate/api/overview#Releasepreview) that can let you interact with its release service from any other third-party - Jenkins in this case.

This plugin makes use these APIs that lets you trigger a release in VS Azure DevOps or TFS, upon completion of a build in Jenkins. The plugin has a post build step - "VS Azure DevOps Continuous Deployment".

### Using the plugin

Assuming that you have already [created the Release Definition](https://www.visualstudio.com/en-us/docs/release/author-release-definition/more-release-definition) and [linked the Jenkins as artifact source](https://www.visualstudio.com/en-us/docs/release/author-release-definition/understanding-artifacts#jenkins) in TFS/Azure DevOps - Release Management, you need to follow the following steps at the Jenkins side to trigger releases automatically, upon build creation.

**0. Setup Release Definition with Jenkins as artifact source**
This document assumes that you have already set up the RM definition that uses Jenkins artifact to deploy. This means your build/job is configured properly and archives artifacts. If not, see the following video to set up Release Definition with Jenkins build

[![Release Jenkins artifact](images/rmWithJenkins-YT.png)](https://www.youtube.com/watch?v=ZC4hWYqdP_o&index=5&list=PLP3SfFPBD6cTJ2Jp5cHvjQ3flrbwQu-nN)


**1. Add the post build action**
Go to the Job configuration and add the post build action - **Trigger release in TFS/Azure DevOps**.
![Add post build action](images/addPostBuildAction.png)

**2. Fill in the required fields**
Fill in the details required for this post build action. You need the following details:
* **Collection URL:** e.g. https://fabfiber.visualstudio.com/**DefaultCollection** <- Note that you need the url till the collection.
* **Team project:** The VS Azure DevOps Project in which you have defined the release definition.
* **Release definition:** The Release definition **name** that links this Jenkins job as an artifact source.

You need to now enter the credentials that lets Jenkins trigger a release with the latest completed build, on your behalf. If you are using VS Azure DevOps, you just need to enter **PAT** with atleast "Release (read, write and execute)" scope. (Refer to this [link](https://www.visualstudio.com/en-us/get-started/setup/use-personal-access-tokens-to-authenticate) to understand how to create PAT). In case you are using TFS, you need to enter the **username** and **password**.

![Add post build action](images/fillFieldsForPostBuildAction.JPG)

**3. All set. See CD in action**
You have now automated your deployment trigger thereby enabling continuous deployment i.e. a checkin/commit would trigger a build and that will trigger a release.
Go ahead and test your setup by manually triggering a build in Jenkins or by a code checkin/commit that kicks off Jenkins build which in turn will trigger the release in VS Azure DevOps.


# FAQ

### How should I set up the plugin for my CodePlex project?

* Find out the server for your project, which is displayed in the source code page for your project at codeplex.com.
* The user name must be suffixed with `_cp` and the domain is `snd`. If your user name is redsolo, then enter "`snd\redsolo_cp`" as the user name in the plugin configuration.
* Note that the user must be a member of the project to be able to create a workspace on the CodePlex server.

That's all you need to do to start retrieving files from your project at codeplex.com.

### The plugin is having problems parsing the dates that TF outputs, what can I do?

> :information_source: If you can upgrade to version 4 and up, then you can avoid a whole class of TF output parsing difficulties, otherwise, read on. :information_source:

The TF command line outputs date according to the locale and Microsofts own specification. Sometimes the outputed date can not be parsed by any of the default locale dependent parsers that the JDK includes (_for some more details, see_ _[JENKINS-4184]_ _and_ _[JENKINS-4021]_). This will throw an exception in the change set parsing and fail the build.

To fix this, do the following:
* Change the locale by Windows Regional Settings to United States and English on the server and all hudson nodes. After that tf.exe should output dates in english, which can be parsed properly.
* Start Hudson using the UnitedStates, English locale. Either set it using `-Duser.language=en -Duser.country=US` on the command line or check the documentation for the container that Hudson is running within.

### If I have multiple artifacts linked in my Release Definition, will this plugin trigger a release?
Yes, it is supported from 1.3 version onwards.

# Timeline

## Future

The best way to get an idea of what will be coming in future releases is to look at the [list of open pull requests](https://github.com/jenkinsci/tfs-plugin/pulls).

## Present

The next release will be 5.3.0.  See what's been committed [since 5.2.1](https://github.com/jenkinsci/tfs-plugin/compare/tfs-5.2.1...master) and the upcoming [ReleaseNotes.md](ReleaseNotes.md).

## Past

Details about previous releases can be found on the [Releases page](https://github.com/jenkinsci/tfs-plugin/releases).

[wiki]: http://wiki.jenkins-ci.org/display/JENKINS/Team+Foundation+Server+Plugin
[MIT Licence]: http://opensource.org/licenses/MIT
[CloudBees]: https://www.cloudbees.com/
[Jenkins JIRA]: http://issues.jenkins-ci.org/secure/IssueNavigator.jspa?mode=hide&reset=true&jqlQuery=project+%3D+JENKINS+AND+status+in+%28Open%2C+%22In+Progress%22%2C+Reopened%29+AND+component+%3D+%27tfs-plugin%27
[Team Foundation Version Control]: https://msdn.microsoft.com/en-us/library/ms181237.aspx
[Azure DevOps]: https://www.visualstudio.com/products/visual-studio-team-services-vs
[TFS SDK for Java]: http://blogs.msdn.com/b/bharry/archive/2011/05/16/announcing-a-java-sdk-for-tfs.aspx
[Microsoft Team Explorer Everywhere]: http://www.microsoft.com/en-us/download/details.aspx?id=40785
[JENKINS-4021]: https://issues.jenkins-ci.org/browse/JENKINS-4021
[JENKINS-4184]: https://issues.jenkins-ci.org/browse/JENKINS-4184


================================================
FILE: ReleaseNotes.md
================================================
These notes are for release **(to be determined)**.
Other releases and their notes can be found at the [tfs-plugin GitHub Releases](https://github.com/jenkinsci/tfs-plugin/releases) page.

* Major:
    * TODO

* Minor:
    * TODO
    


================================================
FILE: Releasing.md
================================================
Pre-requisites
==============

1. Machine: preferably Linux over Windows, to avoid any weirdness between Cygwin and Git for Windows
    1. Oracle JDK 8 (see note in [Installing Jenkins on Red Hat distributions](https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Red+Hat+distributions) about CentOS's default Java)
    1. Maven 3.2 or better
    1. A recent enough Git
    1. Make sure the `COMPUTERNAME` environment variable is defined, as the end-to-end tests rely on its presence.  One can use the [EnvInject plugin](https://wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin) to set it during the execution of the release job.
1. A GitHub clone you can pull from and push to non-interactively. (Consider configuring GitHub with a public key and use the SSH protocol for everything)
1. A "Jenkins infrastructure" account.  They have some sort of LDAP server that provides SSO for JIRA, Confluence and Artifactory.
    1. If you can log in to https://repo.jenkins-ci.org with your account, you're set to punch in those credentials in your `~/.m2/settings.xml` file:
    ```xml
    <?xml version="1.0" encoding="UTF-8"?>
    <settings
      xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd" 
      xmlns="http://maven.apache.org/SETTINGS/1.1.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <servers>
        <server>
          <id>repo.jenkins-ci.org</id>
          <username>TODO</username>
          <password>TODO</password>
        </server>
      </servers>
    </settings>
    ```
    2. A great test is to try to perform a `mvn deploy`, which should attempt to upload some files to the snapshot repo and will need those credentials.
	3. If you're worried about putting your "Jenkins infrastructure" password  in plain-text in that file, Maven has a password encryption facility that relies on a master password in another file.  Presumably, you secure access to the 2nd file by placing it on a thumbdrive that you carry with you when you're not at your computer, etc.
1. A TFS server or a Azure DevOps account, configured as per `Testing.md`

Release
=======

1. Pre-release.  Perform these manual steps on your workstation:
    1. Run a full build, with all its end-to-end tests; it takes about 5 minutes:
    ```
    mvn clean verify --batch-mode -Dtfs_server_name=&lt;TFS host name or Azure DevOps account host name> -Dtfs_user_name=&lt;user> -Dtfs_user_password=&lt;password>
    ```
    2. Look at the commits since the last release by going to https://github.com/jenkinsci/tfs-plugin/releases and clicking the "XX commits to master since this release" link.  It will be easiest to surf the associated pull requests, so hit Ctrl+F, search for "Merge pull request" and Ctrl+click every #XXX link to the right of the highlights.
    3. Fill in the categories of the `ReleaseNotes.md` template, usually in one of the following formats:
        1. &lt;Summary>. Thanks to @&lt;GitHub user name> for pull request #&lt;pull request number>.
        2. &lt;Summary>, via pull request #&lt;pull request number>.
    4. Decide on the release version and on the next development version, based on the rules of [Semantic Versioning](http://semver.org/).
    5. Update `ReleaseNotes.md` with the release version and merge/push to `master`.
    6. Merge any "wiki" changes to `master`.
2. Automated release.  Create a Jenkins job as follows:
    1. General
        1. Check "This project is parameterised"
            1. String parameter **releaseVersion**
            2. String parameter **developmentVersion**
    2. SCM
        1. Git
            1. Repository Url: **git@github.com:jenkinsci/tfs-plugin.git**
            2. Credentials: (select your previously-entered private key file)
            3. Name: **origin**
            4. Refspec: **+refs/heads/master:refs/remotes/origin/master**
			5. Branch Specifier: **refs/heads/master**
			6. Repository browser: **githubweb**
			7. Additional Behaviours:
			    1. Clean before checkout
				2. Check out to specific local branch (to avoid ["Git fatal: ref HEAD is not a symbolic ref" while using maven release plugin](https://stackoverflow.com/a/21184154/))
					1. Branch name: **master**
    3. Build Environment
		1. Add timestamps to the Console Output
		2. Inject environment variables to the build process
		    1. **COMPUTERNAME** (the host name of the Jenkins node that will run the job)
            2. **TFS_SERVER_NAME** (the TFS host name or Azure DevOps account host name)
        3. Use secret text(s) or file(s)
			1. **TFS_USER_NAME** and **TFS_USER_PASSWORD** are initialized from a credential
    4. Build. Add the following steps:
        1. "Shell script" step to check and prepare (filling in the blanks at the `git config` lines near the end)
        ```bash
        set +e

        # verify releaseVersion and developmentVersion
        if [[ "$releaseVersion" != +([0-9])\.+([0-9])\.+([0-9]) ]]
        then
            echo "ERROR: '$releaseVersion' is not a valid releaseVersion"
            exit 1
        fi

        if [[ "$developmentVersion" != +([0-9])\.+([0-9])\.+([0-9])-SNAPSHOT ]]
        then
            echo "ERROR: '$developmentVersion' is not a valid developmentVersion"
            exit 1
        fi


        # test SSH connection to Git
        ssh -Tv git@github.com
        if [[ $? != "1" ]]
        then
            echo "ERROR: Unable to connect to GitHub via SSH"
            exit 1
        fi

        git config --local user.name '<your full name>'
        git config --local user.email '<your e-mail address>'

        exit 0
        ```
        2. "Maven" step as a dry-run, running all tests and performing a SNAPSHOT deploy
        ```
        deploy
        dependency:go-offline
        --batch-mode
        -Dtfs_server_name=${TFS_SERVER_NAME}
        -Dtfs_user_name=${TFS_USER_NAME}
        -Dtfs_user_password=${TFS_USER_PASSWORD}
        ```
        3. "Maven" step to actually release
        ```
        clean
        release:prepare
        release:perform
        --batch-mode
        -Dtag=tfs-${releaseVersion}
        -DreleaseVersion=${releaseVersion}
        -DdevelopmentVersion=${developmentVersion}
        ```
        4. "Shell script" step for post-release actions (filling in the blanks at the `git config` lines near the beginning)
        ```bash
        cd target/checkout
        git config --local user.name '<your full name>'
        git config --local user.email '<your e-mail address>'
         
        git checkout -b update_documentation_for_$releaseVersion origin/master
         
        cat > ReleaseNotes.md <<EndOfReleaseNotes
        These notes are for release **(to be determined)**.
        Other releases and their notes can be found at the [tfs-plugin GitHub Releases](https://github.com/jenkinsci/tfs-plugin/releases) page.
         
        * Major:
            * TODO
        * Minor:
            * TODO
         
        EndOfReleaseNotes
        git commit -a -m "Clear out the release notes for the next release"
         
        git push origin update_documentation_for_$releaseVersion
        ```
        5. Files to archive:
        ```
        tfs/target/tfs.hpi,ReleaseNotes.md,README.md,images/**
        ```
3. Post-release.  Perform these manual steps on your workstation:
    1. Download the artifacts from Jenkins
    2. Create a pull request from the **update_documentation_for_$releaseVersion** branch, then merge it.
    3. Edit the tag on GitHub:
        1. Copy-paste most of `ReleaseNotes.md`.
        2. Upload the artifacts downloaded from Jenkins.
        3. Publish release.
    4. Update `README.md`.
    5. Update affected issues with "Fixed in".
    6. Check the update mirror after about a day, to make sure the new version was replicated across the CDN: http://updates.jenkins-ci.org/update-center.json


================================================
FILE: Testing.md
================================================
Functional Tests
================
There's only so much testing you can do with test friends such as mocks and network replayers.  To enable more comprehensive and realistic testing, some automated tests were written to talk to live servers.  Some manual, one-time set-up is required to facilitate the process.

How to configure your TFS server
--------------------------------
You'll need to be (or involve) an administrator.  It is assumed your TFS server is installed at the default port (8080) and virtual directory (/tfs).

1. Launch the **Team Foundation Server Administration Console**
    1. Navigate to root > Application Tier > Team Project Collections
    2. Click **Create Collection**
    3. Set the *Name* to **jenkins-tfs-plugin**
    4. Indicate in the *Description* field that this team project collection was created to isolate the automated tests from normal usage of the server.  A hyperlink to this page would probably be a good idea.
    5. Click **Verify**
    6. Assuming everything was fine, click **Create**
    7. Wait about 1 minute for the process to complete.
    8. Assuming the team project collection was created OK, click **Close**
2. Follow the instructions at [Create a team project](https://msdn.microsoft.com/library/ms181477.aspx) to create a *Team Project*, as specified below:
    1. When prompted for the *Name*, enter **FunctionalTests**
    2. Indicate in the *Description* field that this team project was created for the automated functional tests.  A hyperlink to this page would probably be a good idea.
    3. The choice of process template is not important.
    4. Select **Team Foundation Version Control** as the *version control system*.
4. Follow the instructions at [Add team members](https://msdn.microsoft.com/en-us/library/jj920206.aspx) to add the test user as a member of the **FunctionalTests** team project
5. Ensure the user has access to the team project
    1. Open a web browser in InPrivate/incognito/private mode.  This will make sure you aren't re-using authentication cookies or saved credentials.
    2. Navigate to the **jenkins-tfs-plugin** team project collection on the server.  Example:  `http://tfs.corp.example.com:8080/tfs/jenkins-tfs-plugin`
    3. Log in as the test user.
    4. Confirm you can browse to the **FunctionalTests** team project.


How to configure your Azure DevOps account
-------------------------------------------
TODO: write this


How to configure your development environment
---------------------------------------------
Tests that need to connect to a server will only run during the `verify` phase *if* the `tfs_server_name` property was provided to Maven.  The value of this property is the *fully-qualified DNS name (FQDN)* of the server, because a non-qualified host name appears to trigger NTLM authentication attempts.
You should also provide the following properties:

1. tfs_server_name - set this to the host name of the server (ex. tfs.corp.example.com)
2. tfs_collection_url - set this to the full url of the collection (ex. http://tfs.corp.example.com:8081/tfs/jenkins-tfs-plugin)
3. tfs_user_name - set this to the test user you gave permissions to above (the default value if not provided is **jenkins-tfs-plugin**)
4. tfs_user_password - set this to the password of the test user (the default value if not provided is **for-test-only**)
5. Set the COMPUTERNAME environment variable as the end-to-end tests rely on its presence

Example:

    mvn clean verify -Dtfs_collection_url="http://tfs.corp.example.com:8081/tfs/jenkins-tfs-plugin" -Dtfs_server_name=tfs.corp.example.com -Dtfs_user_name=jenkins-tfs-plugin -Dtfs_user_password=for-test-only



================================================
FILE: contributing.md
================================================
Contributing to the Team Foundation Server plugin for Jenkins
=============================================================

## Building Sources
This is a Maven project with Java sources. The mvn package command will produce an HPI file that is the Jenkins Plugin file that will need to be installed on your Jenkins Server.
- SET JAVA_HOME to the location of the JRE to build with (JRE 1.8 works)
- Clone the repo from https://github.com/jenkinsci/tfs-plugin.git
- change dir to the tfs-plugin folder
- run "mvn package"
    - If you do not have Maven installed yet, here are [instructions](http://www.mkyong.com/maven/how-to-install-maven-in-windows/) on how to install it on Windows.
    - Initial build will have to download lots of libraries. This could take a few minutes.
- This produces tfs-plugin\tfs\target\tfs.hpi

## Using IntelliJ IDEA
To use Intellij IDEA as the editor for this project simply do the following after getting sources:
1) Open the tfs-plugin folder (root folder) in IntelliJ (I installed IntelliJ 17 community edition from https://www.jetbrains.com/idea/)
2) Go to File->Project Structure and click on Project
3) Specify the Project SDK (Java 1.8 works)

You should now be able to build from within IntelliJ
- NOTE to build the hpi file you will have to 
    - bring up the Maven Projects tool window (View->Tool Windows->Maven Projects) and click the "execute maven goal" button
    - Then type "package" in the "Command Line" text box (of the Execute Maven Goal dialog)

## Debugging the Plugin
See https://wiki.jenkins-ci.org/display/JENKINS/Plugin+tutorial for information on how to debug the plugin.
From within IntelliJ:
1) Create a new Run configuration (Run | Edit Configurations... | + )
    1) Type = Maven
    1) Name = run hpi
    1) Working directory should be the full path to "../tfs-plugin/tfs" (NOTE this is NOT the root folder)
    1) Command Line 
    
        `
        hpi:run -Djetty.port=8090 -Dhudson.plugins.tfs.telemetry.isDeveloperMode=true
        `
    
        1) or use whatever port you want
    1) On the Runner tab
        1) Environment Variables == MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n
        1) To set the environment variables, make sure you uncheck 'Use project settings' first. Then use the '...' to set the variable.

1) Run or Debug this configuration using the play and debug icons (top right)
    1) Set any breakpoints you want in IntelliJ
    1) Navigate to http://localhost:8090/jenkins

Note: this runs Jenkins on your local OS not in a Docker image. As such, any configurations you make are preserved between runs. You do not need to have Jenkins previously installed locally (IntelliJ will run Jenkins from a local JAR file).

## Installing Jenkins Locally for Manual Testing
The easiest method is to run Jenkins in a Docker image.
1) Install Docker for your OS (https://www.docker.com/community-edition)
1) Install and run the Jenkins image

    `
    docker run --name localJenkins -p 9191:9191 -p 50001:50001 --env "JENKINS_OPTS=--httpPort=9191" --env JENKINS_SLAVE_AGENT_PORT=50001 --env hudson.plugins.tfs.telemetry.isDeveloperMode=true jenkins
    `
    
    - NOTES: 
        - Note that this command line avoids port 8080 (the default) in case you have VSO deployed as well
        - Look in the output for the admin password
        - The output sent to the console is also where you will see any logger output
        - Note the environment variable "hudson.plugins.tfs.telemetry.isDeveloperMode". It is important to set this variable so that AppInsights data is sent to right key
        - This installs a Linux Jenkins server on Docker (NOT one based on Windows or the host OS)
1) Setup Jenkins
    1) Go to http://localhost:9191
    1) Enter the admin password
    1) Install default plugins
    1) Run Jenkins
1) Install Plugin Manually
    1) Go to http://localhost:9191/pluginManager/advanced
    1) Browse to the tfs.hpi file and Upload it
    1) To update the plugin, repeat steps 1 and 2 and then restart Jenkins by going to http://localhost:9191/restart
1) To stop Jenkins and start from scratch

    `
    docker stop localJenkins
    docker container prune
    `
    
    Then repeat step 2 and 3 above


================================================
FILE: pom.xml
================================================
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.jenkins-ci.plugins</groupId>
    <artifactId>plugin</artifactId>
    <version>3.2</version>
  </parent>

  <artifactId>tfs-parent</artifactId>
  <packaging>pom</packaging>
  <name>Team Foundation Server Plug-in parent</name>
  <version>5.157.1-SNAPSHOT</version>
  <properties>
    <!-- Version is required to be compatible with current Pipeline plugin dependencies -->
    <jenkins.version>1.642.3</jenkins.version>
    <java.level>7</java.level>
    <maven-surefire-plugin.version>2.19.1</maven-surefire-plugin.version>
    <!--  overriding old version from parent to be consistent with the above in this project -->
    <maven-surefire-report-plugin.version>${maven-surefire-plugin.version}</maven-surefire-report-plugin.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <maven-javadoc-plugin.version>2.8</maven-javadoc-plugin.version>
  </properties>

  <developers>
    <developer>
      <id>dastahel</id>
      <name>David Staheli</name>
      <email>dastahel@microsoft.com</email>
      <timezone>-5</timezone>
    </developer>
    <developer>
      <id>jpricket</id>
      <name>Jason Prickett</name>
      <email>jpricket@microsoft.com</email>
      <timezone>-5</timezone>
    </developer>
    <developer>
      <id>jeffyoung</id>
      <name>Jeff Young</name>
      <email>jeyou@microsoft.com</email>
      <timezone>-5</timezone>
    </developer>
    <developer>
      <id>jenkinssriramb</id>
      <name>Sriram Balasubramaniyan</name>
      <email>sriramb@microsoft.com</email>
      <timezone>+5</timezone>
    </developer>
    <developer>
      <id>kalyan</id>
      <name>Kalyan</name>
      <email>kasubram@microsoft.com</email>
      <timezone>+5</timezone>
    </developer>
    <developer>
      <id>keljos</id>
      <name>Kellie Jos</name>
      <email>kej@microsoft.com</email>
      <timezone>-5</timezone>
    </developer>
    <developer>
      <id>mosabua</id>
      <name>Manfred Moser</name>
      <email>manfred@simpligility.com</email>
      <timezone>-8</timezone>
    </developer>
    <developer>
      <id>leantk</id>
      <name>Leah Antkiewicz</name>
      <email>leantk@microsoft.com</email>
      <timezone>-5</timezone>
    </developer>
  </developers>
  <scm>
    <connection>scm:git:https://github.com/jenkinsci/tfs-plugin.git</connection>
    <developerConnection>scm:git:https://github.com/jenkinsci/tfs-plugin.git</developerConnection>
    <tag>HEAD</tag>
  </scm>

  <distributionManagement>
    <snapshotRepository>
      <id>repo.jenkins-ci.org</id>
      <url>https://repo.jenkins-ci.org/snapshots/</url>
    </snapshotRepository>
    <repository>
      <id>repo.jenkins-ci.org</id>
      <url>https://repo.jenkins-ci.org/releases/</url>
    </repository>
  </distributionManagement>

  <modules>
    <module>tfs-sdk</module>
    <module>tfs</module>
  </modules>

  <build>
    <plugins>
    </plugins>
  </build>

    <repositories>
        <repository>
            <id>repo.jenkins-ci.org</id>
            <url>https://repo.jenkins-ci.org/public/</url>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>repo.jenkins-ci.org</id>
            <url>https://repo.jenkins-ci.org/public/</url>
        </pluginRepository>
    </pluginRepositories>
</project>  
  



================================================
FILE: tfs/checkstyle.xml
================================================
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
        "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
        "http://checkstyle.sourceforge.net/dtds/configuration_1_3.dtd">

<!--

  Checkstyle configuration that checks the sun coding conventions from:

    - the Java Language Specification at
      http://java.sun.com/docs/books/jls/second_edition/html/index.html

    - the Sun Code Conventions at http://java.sun.com/docs/codeconv/

    - the Javadoc guidelines at
      http://java.sun.com/j2se/javadoc/writingdoccomments/index.html

    - the JDK Api documentation http://java.sun.com/j2se/docs/api/index.html

    - some best practices

  Checkstyle is very configurable. Be sure to read the documentation at
  http://checkstyle.sf.net (or in your downloaded distribution).

  Most Checks are configurable, be sure to consult the documentation.

  To completely disable a check, just comment it out or delete it from the file.

  Finally, it is worth reading the documentation.

-->

<module name="Checker">
    <!--
        If you set the basedir property below, then all reported file
        names will be relative to the specified directory. See
        http://checkstyle.sourceforge.net/5.x/config.html#Checker

        <property name="basedir" value="${basedir}"/>
    -->

    <property name="fileExtensions" value="java, properties, xml"/>

    <module name="SuppressionCommentFilter"/>

    <!-- Checks that a package-info.java file exists for each package.     -->
    <!-- See http://checkstyle.sf.net/config_javadoc.html#JavadocPackage -->
    <!-- module name="JavadocPackage"/ -->

    <!-- Checks whether files end with a new line.                        -->
    <!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile -->
    <module name="NewlineAtEndOfFile"/>

    <!-- Checks that property files contain the same keys.         -->
    <!-- See http://checkstyle.sf.net/config_misc.html#Translation -->
    <module name="Translation"/>

    <!-- Checks for Size Violations.                    -->
    <!-- See http://checkstyle.sf.net/config_sizes.html -->
    <module name="FileLength"/>

    <!-- Checks for whitespace                               -->
    <!-- See http://checkstyle.sf.net/config_whitespace.html -->
    <module name="FileTabCharacter"/>

    <!-- Miscellaneous other checks.                   -->
    <!-- See http://checkstyle.sf.net/config_misc.html -->
    <module name="RegexpSingleline">
        <property name="format" value="\s+$"/>
        <property name="minimum" value="0"/>
        <property name="maximum" value="0"/>
        <property name="message" value="Line has trailing spaces."/>
    </module>

    <!-- Checks for Headers                                -->
    <!-- See http://checkstyle.sf.net/config_header.html   -->
    <!-- <module name="Header"> -->
    <!--   <property name="headerFile" value="${checkstyle.header.file}"/> -->
    <!--   <property name="fileExtensions" value="java"/> -->
    <!-- </module> -->

    <module name="TreeWalker">

        <!-- Allow the SuppressionCommentFilter to work inside the files -->
        <module name="FileContentsHolder"/>

        <!-- Checks for Javadoc comments.                     -->
        <!-- See http://checkstyle.sf.net/config_javadoc.html -->
        <module name="JavadocMethod">
            <property name="scope" value="public" />
            <property name="tokens" value="METHOD_DEF, ANNOTATION_FIELD_DEF" />
            <property name="allowMissingParamTags" value="true" />
            <property name="allowMissingThrowsTags" value="true" />
            <property name="allowMissingReturnTag" value="true" />
            <property name="allowMissingPropertyJavadoc" value="true" />
            <property name="allowUndeclaredRTE" value="true" />
        </module>
        <module name="JavadocType"/>
        <!-- module name="JavadocVariable"/ -->
        <module name="JavadocStyle"/>

        <!-- Checks for Naming Conventions.                  -->
        <!-- See http://checkstyle.sf.net/config_naming.html -->
        <module name="ConstantName">
            <property name="format" value="^log(ger)?|[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$"/>
        </module>
        <module name="LocalFinalVariableName"/>
        <module name="LocalVariableName"/>
        <module name="MemberName"/>
        <module name="MethodName"/>
        <module name="PackageName"/>
        <module name="ParameterName"/>
        <module name="StaticVariableName"/>
        <module name="TypeName"/>

        <!-- Checks for imports                              -->
        <!-- See http://checkstyle.sf.net/config_import.html -->
        <module name="AvoidStarImport"/>
        <module name="IllegalImport"/> <!-- defaults to sun.* packages -->
        <module name="RedundantImport"/>
        <module name="UnusedImports">
            <property name="processJavadoc" value="false"/>
        </module>

        <!-- Checks for Size Violations.                    -->
        <!-- See http://checkstyle.sf.net/config_sizes.html
        <module name="LineLength"/>
        <module name="MethodLength"/>
        <module name="ParameterNumber"/>
        -->

        <!-- Checks for whitespace                               -->
        <!-- See http://checkstyle.sf.net/config_whitespace.html -->
        <module name="EmptyForIteratorPad"/>
        <module name="GenericWhitespace"/>
        <module name="MethodParamPad"/>
        <module name="NoWhitespaceAfter"/>
        <module name="NoWhitespaceBefore"/>
        <module name="OperatorWrap"/>
        <module name="ParenPad"/>
        <module name="TypecastParenPad"/>
        <module name="WhitespaceAfter"/>
        <module name="WhitespaceAround"/>

        <!-- Modifier Checks                                    -->
        <!-- See http://checkstyle.sf.net/config_modifiers.html -->
        <module name="ModifierOrder"/>
        <module name="RedundantModifier"/>

        <!-- Checks for blocks. You know, those {}'s         -->
        <!-- See http://checkstyle.sf.net/config_blocks.html -->
        <module name="AvoidNestedBlocks"/>
        <module name="EmptyBlock"/>
        <module name="LeftCurly"/>
        <module name="NeedBraces"/>
        <module name="RightCurly"/>

        <!-- Checks for common coding problems               -->
        <!-- See http://checkstyle.sf.net/config_coding.html -->
        <!-- <module name="AvoidInlineConditionals"/> -->
        <module name="EmptyStatement"/>
        <module name="EqualsHashCode"/>
        <module name="HiddenField">
            <!-- Only warn for variables that hide fields and not parameters -->
            <property name="tokens" value="VARIABLE_DEF"/>
        </module>
        <module name="IllegalInstantiation"/>
        <module name="InnerAssignment"/>
        <module name="MagicNumber"/>
        <module name="MissingSwitchDefault"/>
        <module name="SimplifyBooleanExpression"/>
        <module name="SimplifyBooleanReturn"/>

        <!-- Checks for class design                         -->
        <!-- See http://checkstyle.sf.net/config_design.html -->
        <!-- <module name="DesignForExtension"/> -->
        <module name="FinalClass"/>
        <module name="HideUtilityClassConstructor"/>
        <module name="InterfaceIsType"/>
        <module name="VisibilityModifier"/>

        <!-- Miscellaneous other checks.                   -->
        <!-- See http://checkstyle.sf.net/config_misc.html -->
        <module name="ArrayTypeStyle"/>
        <module name="FinalParameters"/>
        <!-- module name="TodoComment"/> -->
        <module name="UpperEll"/>

    </module>

</module>

================================================
FILE: tfs/pom.xml
================================================
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.jenkins-ci.plugins</groupId>
    <artifactId>tfs-parent</artifactId>
    <version>5.157.1-SNAPSHOT</version>
  </parent>

  <artifactId>tfs</artifactId>
  <packaging>hpi</packaging>
  <name>Team Foundation Server Plug-in</name>
  <version>5.157.1-SNAPSHOT</version>
  <url>http://wiki.jenkins-ci.org/display/JENKINS/Team+Foundation+Server+Plugin</url>

  <properties>
    <!-- TODO: enable once FindBugs issues are fixed -->
    <findbugs.failOnError>false</findbugs.failOnError>
  </properties>

  <licenses>
    <license><name>MIT license</name><comments>All source code is under the MIT license.</comments></license>
    <license>
      <name>Microsoft Visual Studio Team Foundation Server 2012 Software Development Kit for Java license terms</name>
      <url>http://download.microsoft.com/download/5/9/9/5993F89B-AEF0-4381-9CEE-D3D7BA9EA33B/license.html</url>
    </license>
    <license>
      <name>
        Apache Commons Codec, Apache Commons Logging, Apache HttpClient, Apache Commons Lang, Apache log4j,
        and Apache ServiceMix are licensed by the Apache Foundation under the Apache License, Version 2.0.
      </name>
      <url>http://www.apache.org/licenses/LICENSE-2.0</url>
    </license>
    <license>
      <name>
        The Apache Foundation's Xerces Java Parser project is licensed by the
        Apache Foundation under the Apache License, Version 1.1.
      </name>
      <url>http://www.apache.org/licenses/LICENSE-1.1</url>
    </license>
    <license>
      <name>
        The Woodstox XML Processor and the StAX API are licensed by their authors under the Apache License, Version 2.0.
      </name>
      <url>http://www.apache.org/licenses/LICENSE-2.0</url></license>
    <license>
      <name>This product includes software from the Hypersonic SQL DB http://hsqldb.org/.</name>
      <url>http://www.hsqldb.org/web/hsqlLicense.html</url>
    </license>
    <license>
      <name>This product includes software from the Cryptix project http://www.cryptix.org/.</name>
      <url>http://cryptix.org/LICENSE.TXT</url>
    </license>
  </licenses>

  <!-- see http://groups.google.com/group/hudson-dev/browse_thread/thread/83e34c639eec470a for the rationale behind this -->
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <archive>
            <manifest>
              <!-- https://stackoverflow.com/a/6773868/ -->
              <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
            </manifest>
          </archive>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-release-plugin</artifactId>
        <version>2.5.1</version>
        <configuration>
          <goals>deploy</goals>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.jenkins-ci.tools</groupId>
        <artifactId>maven-hpi-plugin</artifactId>
        <extensions>true</extensions>
        <configuration>
          <compatibleSinceVersion>3.2.0</compatibleSinceVersion>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>${maven-javadoc-plugin.version}</version>
        <executions>
          <execution>
            <id>verify-javadoc</id>
            <phase>verify</phase>
            <goals>
              <goal>javadoc</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>${maven-surefire-plugin.version}</version>
        <dependencies>
          <dependency>
            <groupId>org.apache.maven.surefire</groupId>
            <artifactId>surefire-junit47</artifactId>
            <version>${maven-surefire-plugin.version}</version>
          </dependency>
        </dependencies>
        <configuration>
          <excludedGroups>hudson.plugins.tfs.IntegrationTests</excludedGroups>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-checkstyle-plugin</artifactId>
        <version>2.17</version>
        <executions>
          <execution>
            <id>validate</id>
            <phase>validate</phase>
            <configuration>
              <configLocation>checkstyle.xml</configLocation>
              <encoding>UTF-8</encoding>
              <consoleOutput>true</consoleOutput>
              <failsOnError>true</failsOnError>
            </configuration>
            <goals>
              <goal>check</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <profiles>
    <profile>
      <id>integration_test_with_TFS_server</id>
      <activation>
        <property>
          <name>tfs_server_name</name>
        </property>
      </activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <!-- failsafe and surefire are the same project and release together
                 this ensures consistent, correctly working behavior
             -->
            <version>${maven-surefire-plugin.version}</version>
            <dependencies>
              <dependency>
                <groupId>org.apache.maven.surefire</groupId>
                <artifactId>surefire-junit47</artifactId>
                <version>${maven-surefire-plugin.version}</version>
              </dependency>
            </dependencies>
            <executions>
              <execution>
                <goals>
                  <goal>integration-test</goal>
                  <goal>verify</goal>
                </goals>
              </execution>
            </executions>
            <configuration>
              <includes>
                <include>**/Test*.java</include>
                <include>**/*Test.java</include>
                <include>**/*TestCase.java</include>
              </includes>
              <groups>hudson.plugins.tfs.IntegrationTests</groups>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>

  <dependencies>

    <dependency>
      <!-- We need this plugin for the [current] TfsUserLookup implementation -->
      <groupId>org.jenkins-ci.plugins</groupId>
      <artifactId>mailer</artifactId>
      <version>1.16</version>
    </dependency>
    <dependency>
      <!-- Used for configuring collections globally -->
      <groupId>org.jenkins-ci.plugins</groupId>
      <artifactId>credentials</artifactId>
      <version>1.25</version>
    </dependency>
    <dependency>
      <!-- Used for configuring collections globally -->
      <groupId>org.jenkins-ci.plugins.workflow</groupId>
      <artifactId>workflow-job</artifactId>
      <version>2.10</version>
    </dependency>
    <dependency>
      <!-- Used for configuring collections globally -->
      <groupId>org.jenkins-ci.plugins.workflow</groupId>
      <artifactId>workflow-cps</artifactId>
      <version>2.30</version>
      <exclusions>
        <exclusion>
          <!-- Provided by the core -->
          <groupId>org.jenkins-ci</groupId>
          <artifactId>annotation-indexer</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <!-- Used for configuring collections globally, resolves upper bound dependency conflicts in other Pipeline plugins -->
      <groupId>org.jenkins-ci.plugins.workflow</groupId>
      <artifactId>workflow-support</artifactId>
      <version>2.14</version>
    </dependency>
    <dependency>
      <!-- Used for augmenting Git-related activities, like commit status -->
      <groupId>org.jenkins-ci.plugins</groupId>
      <artifactId>git</artifactId>
      <version>2.5.2</version>
    </dependency>

    <dependency>
      <groupId>com.microsoft.tfs.sdk</groupId>
      <artifactId>com.microsoft.tfs.sdk</artifactId>
      <version>14.0.3</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>xmlunit</groupId>
        <artifactId>xmlunit</artifactId>
        <version>1.6</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>1.10.19</version>
        <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.littleshoot</groupId>
      <artifactId>littleproxy</artifactId>
      <version>1.1.0</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.jenkins-ci.plugins</groupId>
      <artifactId>junit</artifactId>
      <version>1.6</version>
      <scope>test</scope>
    </dependency>
    
    <!-- RM dependencies -->
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5</version>
        <type>jar</type>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20090211</version>
    </dependency>
  </dependencies>
</project>


================================================
FILE: tfs/src/main/java/hudson/plugins/tfs/ChangeSetReader.java
================================================
package hudson.plugins.tfs;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

import hudson.model.Run;
import hudson.scm.RepositoryBrowser;
import org.apache.commons.digester.Digester;
import org.xml.sax.SAXException;

import hudson.plugins.tfs.model.ChangeLogSet;
import hudson.plugins.tfs.model.ChangeSet;
import hudson.scm.ChangeLogParser;
import hudson.util.Digester2;

/**
 * TeamFoundation change log reader.
 *
 * @author Erik Ramfelt
 */
public class ChangeSetReader extends ChangeLogParser {

    @Override
    public ChangeLogSet parse(final Run build, final RepositoryBrowser<?> browser, final File changelogFile) throws IOException, SAXException {
        try (FileInputStream stream = new FileInputStream(changelogFile); Reader reader = new InputStreamReader(stream, Charset.defaultCharset())) {
            return parse(build, browser, reader);
        }
    }

    /** Performs the actual parsing. */
    public ChangeLogSet parse(final Run build, final RepositoryBrowser<?> browser, final Reader reader) throws IOException, SAXException {
        List<ChangeSet> changesetList = new ArrayList<ChangeSet>();
        Digester digester = new Digester2();
        digester.push(changesetList);

        digester.addObjectCreate("*/changeset", ChangeSet.class);
        digester.addSetProperties("*/changeset");
        digester.addBeanPropertySetter("*/changeset/date", "dateStr");
        digester.addBeanPropertySetter("*/changeset/user");
        digester.addBeanPropertySetter("*/changeset/checked_in_by_user", "checkedInBy");
        digester.addBeanPropertySetter("*/changeset/comment");
        digester.addSetNext("*/changeset", "add");

        digester.addObjectCreate("*/changeset/items/item", ChangeSet.Item.class);
        digester.addSetProperties("*/changeset/items/item");
        digester.addBeanPropertySetter("*/changeset/items/item", "path");
        digester.addSetNext("*/changeset/items/item", "add");

        digester.parse(reader);

        return new ChangeLogSet(build, browser, changesetList);
    }
}


================================================
FILE: tfs/src/main/java/hudson/plugins/tfs/ChangeSetWriter.java
================================================
//CHECKSTYLE:OFF
package hudson.plugins.tfs;

import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.Util;
import hudson.plugins.tfs.model.ChangeSet;
import hudson.plugins.tfs.util.DateUtil;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.List;

import org.apache.commons.io.IOUtils;

/**
 * Team Foundation change log writer.
 * 
 * @author Erik Ramfelt
 */
public class ChangeSetWriter {

    /**
     * Writes the list of change sets to the file
     * @param changeSets list of change sets
     * @param changelogFile file to write change sets to
     *
     * @throws IOException If an I/O error occurs
     */
    @SuppressFBWarnings(value = "DM_DEFAULT_ENCODING", justification = "Better mot modify charset in case it might raise errors")
    public void write(List<ChangeSet> changeSets, File changelogFile) throws IOException {
        FileWriter writer = new FileWriter(changelogFile);
        try {
            write(changeSets, writer);
        } finally {
            IOUtils.closeQuietly(writer);
        }
    }

    /**
     * Writes the list of change sets to the writer
     * @param changeSets list of change sets
     * @param output output writer
     */    
    public void write(List<ChangeSet> changeSets, Writer output) {
        PrintWriter writer = new PrintWriter(output);
        
        writer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
        writer.println("<changelog>");
        
        for (ChangeSet changeSet : changeSets) {
            writer.println(String.format("\t<changeset version=\"%s\">", changeSet.getVersion()));
            write(changeSet, writer);
            writer.println("\t</changeset>");
        }
        
        writer.println("</changelog>");
        writer.flush();
    }

    private void write(ChangeSet changeSet, PrintWriter writer) {
        writer.println(String.format("\t\t<date>%s</date>", DateUtil.TFS_DATETIME_FORMATTER.get().format(changeSet.getDate())));
        if (Util.fixEmpty(changeSet.getDomain()) == null) {
            writer.println(String.format("\t\t<user>%s</user>", escapeForXml(changeSet.getUser())));
        } else {
            writer.println(String.format("\t\t<user>%s\\%s</user>", escapeForXml(changeSet.getDomain()), escapeForXml(changeSet.getUser())));
        }
        if (Util.fixEmpty(changeSet.getCheckedInBy()) != null) {
            writer.println(String.format("\t\t<checked_in_by_user>%s</checked_in_by_user>", escapeForXml(changeSet.getCheckedInBy())));
        }
        writer.println(String.format("\t\t<comment>%s</comment>", escapeForXml(changeSet.getComment())));
        if (changeSet.getItems().size() > 0) {
            writer.println("\t\t<items>");
            for (ChangeSet.Item item : changeSet.getItems()) {
                writer.println(String.format("\t\t\t<item action=\"%s\">%s</item>", escapeForXml(item.getAction()), escapeForXml(item.getPath())));
            }
            writer.println("\t\t</items>");
        }
    }

    /**
     * 
     * Converts the input in the way that it can be written to the XML.
     * Special characters are converted to XML understandable way.
     * 
     * @param object The object to be escaped.
     * @return Escaped string that can be written to XML.
     */
    private String escapeForXml(Object object)
    {
        if(object == null)
        {
            return null;
        }

        //Loop through and replace the special chars.
        String string = object.toString();
        int size = string.length();
        char ch;
        StringBuilder escapedString = new StringBuilder(size);
        for(int index = 0;index < size;index ++)
        {
            //Convert special chars.
            ch = string.charAt(index);
            switch(ch)
            {
                case '&'  : escapedString.append("&amp;");  break;
                case '<'  : escapedString.append("&lt;");   break;
                case '>'  : escapedString.append("&gt;");   break;
                case '\'' : escapedString.append("&apos;"); break;
                case '\"' : escapedString.append("&quot;");break;
                default:    escapedString.append(ch);
            }
        }

        return escapedString.toString();
    }
}


================================================
FILE: tfs/src/main/java/hudson/plugins/tfs/CommitParameterAction.java
================================================
package hudson.plugins.tfs;

import hudson.plugins.git.RevisionParameterAction;
import hudson.plugins.tfs.model.GitCodePushedEventArgs;
import hudson.plugins.tfs.util.UriHelper;
import org.eclipse.jgit.transport.RemoteConfig;
import org.eclipse.jgit.transport.URIish;

import java.net.URI;

/**
 * Used as a build parameter to record information about the associated project and
 * Visual Studio Team Services account or TFS server to facilitate integration.
 */
public class CommitParameterAction extends RevisionParameterAction {

    private final GitCodePushedEventArgs gitCodePushedEventArgs;

    /**
     * Saves the repo uri and GitCodePushedEventArgs.
     */
    public CommitParameterAction(final GitCodePushedEventArgs e) {
        super(e.commit, e.getRepoURIish());

        this.gitCodePushedEventArgs = e;
    }

    /**
     * Returns the GitCodePushedEventArgs.
     */
    public GitCodePushedEventArgs getGitCodePushedEventArgs() {
        return gitCodePushedEventArgs;
    }

    /**
     * Returns true if the git repo uri can originate from any of the remotes passed in.
     */
    @Override
    public boolean canOriginateFrom(final Iterable<RemoteConfig> remotes) {
        final URI repoUri = gitCodePushedEventArgs.repoUri;

        for (final RemoteConfig remote : remotes) {
            for (final URIish remoteURL : remote.getURIs()) {
                final URI remoteUri = URI.create(remoteURL.toString());
                if (UriHelper.areSameGitRepo(remoteUri, repoUri)) {
                    return true;
                }
            }
        }
        return false;
    }
}


================================================
FILE: tfs/src/main/java/hudson/plugins/tfs/JenkinsEventNotifier.java
================================================
package hudson.plugins.tfs;

import hudson.plugins.tfs.model.ConnectionParameters;
import hudson.plugins.tfs.model.JobCompletionEventArgs;
import hudson.plugins.tfs.util.TeamRestClient;
import jenkins.model.Jenkins;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.HttpHostConnectException;
import org.apache.http.impl.client.HttpClientBuilder;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URI;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Formatter;
import java.util.List;
import java.util.logging.Logger;

/**
 * This class sends Jenkins events to all "connected" team collections.
 * Current list of events:
 * - Job Completion event
 */
public final class JenkinsEventNotifier {
    private static final Logger log = Logger.getLogger(JenkinsEventNotifier.class.getName());
    private static final String ENCODING = "UTF-8";

    /**
     * Hiding the constructor for this Utility class.
     */
    private JenkinsEventNotifier() { }

    /**
     * Send the Job Completion event to connected TFS/VSTS servers.
     */
    public static void sendJobCompletionEvent(final JSONObject payload) {
        final List<TeamCollectionConfiguration> connectedCollections = TeamCollectionConfiguration.getConnectedCollections();
        for (final TeamCollectionConfiguration c : connectedCollections) {
            try {
                // Check to see if there are any collections "connected" to this Jenkins server
                final ConnectionParameters connectionParameters = c.getConnectionParameters();
                final TeamRestClient client = new TeamRestClient(URI.create(c.getCollectionUrl()));
                payload.put("server", connectionParameters.getConnectionKey());
                final String jsonPayload = payload.toString();
                final JobCompletionEventArgs args = new JobCompletionEventArgs(
                        connectionParameters.getConnectionKey(),
                        jsonPayload,
                        getPayloadSignature(connectionParameters.getConnectionSignature(), jsonPayload));
                client.sendJobCompletionEvent(args);
            } catch (final Exception e) {
                log.warning("ERROR: sendJobCompletionEvent: (collection=" + c.getCollectionUrl() + ") " + e.getMessage());
            }
        }
    }

    /**
     * This is a helper method to get the JSON for a Jenkins object.
     * @param url
     * @return
     */
    public static String getApiJson(final String url) {
        try {
            Jenkins jenkins = Jenkins.getInstance();
            if (jenkins == null) {
                return "";
            }
            final String rootUrl = jenkins.getRootUrl();
            final String fullUrl = urlCombine(rootUrl, url, "api", "json");
            final HttpClient client = HttpClientBuilder.create().build();
            final HttpGet request = new HttpGet(fullUrl);

            // add request header
            request.addHeader("User-Agent", "Jenkins-Self");

            final HttpResponse response = client.execute(request);
            final int statusCode = response.getStatusLine().getStatusCode();

            if (statusCode <= HttpURLConnection.HTTP_ACCEPTED) {
                try (BufferedReader reader = new BufferedReader(
                        new InputStreamReader(response.getEntity().getContent(), ENCODING))) {
                    final StringBuilder result = new StringBuilder();
                    String line;
                    while ((line = reader.readLine()) != null) {
                        result.append(line);
                        result.append("\n");
                    }
                    return result.toString();
                }
            } else {
                log.warning("ERROR: getApiJson: (url=" + url + ") failed due to Http error #" + statusCode);
                return null;
            }
        } catch (final HttpHostConnectException e) {
            log.warning("ERROR: getApiJson: (url=" + url + ") " + e.getMessage());
            return null;
        } catch (final Exception e) {
            log.warning("ERROR: getApiJson: (url=" + url + ") " + e.getMessage());
            throw new RuntimeException(e);
        }
    }

    /**
     * Calculates the payload hash.
     * @param secret
     * @param payload
     * @return
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeyException
     * @throws UnsupportedEncodingException
     */
    public static String getPayloadSignature(final String secret, final String payload)
            throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException {
        final SecretKeySpec signingKey = new SecretKeySpec(secret.getBytes(ENCODING), "HmacSHA1");
        final Mac mac = Mac.getInstance("HmacSHA1");
        mac.init(signingKey);
        return toHexString(mac.doFinal(payload.getBytes(ENCODING)));
    }

    private static String urlCombine(final String url, final String... parts) {
        final StringBuilder sb = new StringBuilder();
        if (url != null) {
            sb.append(url);
            for (final String s : parts) {
                if (StringUtils.isNotBlank(s)) {
                    if (sb.length() > 0 && sb.charAt(sb.length() - 1) != '/') {
                        sb.append("/");
                    }
                    sb.append(s);
                }
            }
        }
        return sb.toString();
    }

    private static String toHexString(final byte[] bytes) {
        final Formatter formatter = new Formatter();
        for (final byte b : bytes) {
            formatter.format("%02x", b);
        }

        return formatter.toString();
    }
}


================================================
FILE: tfs/src/main/java/hudson/plugins/tfs/PullRequestParameterAction.java
================================================
package hudson.plugins.tfs;

import hudson.plugins.tfs.model.PullRequestMergeCommitCreatedEventArgs;

/**
 * Action that adds the pull request merge event args to the build information.
 */
public class PullRequestParameterAction extends CommitParameterAction {

    private final PullRequestMergeCommitCreatedEventArgs args;

    public PullRequestParameterAction(final PullRequestMergeCommitCreatedEventArgs args) {
        super(args);
        this.args = args;
    }

    public PullRequestMergeCommitCreatedEventArgs getPullRequestMergeCommitCreatedEventArgs() {
        return args;
    }
}


================================================
FILE: tfs/src/main/java/hudson/plugins/tfs/SafeParametersAction.java
================================================
package hudson.plugins.tfs;

import hudson.EnvVars;
import hudson.Extension;
import hudson.model.EnvironmentContributor;
import hudson.model.ParameterValue;
import hudson.model.ParametersAction;
import hudson.model.Run;
import hudson.model.TaskListener;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;

import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * Extension class of ParametersAction to pass in parameters as safe parameters..
 */
@Restricted(NoExternalUse.class)
public class SafeParametersAction extends ParametersAction {

    private List<ParameterValue> parameters;

    public SafeParametersAction(final List<ParameterValue> parameters) {
        this.parameters = parameters;
    }

    public SafeParametersAction(final ParameterValue... parameters) {
        this(Arrays.asList(parameters));
    }

    @Override
    public List<ParameterValue> getParameters() {
        return Collections.unmodifiableList(parameters);
    }

    @Override
    public ParameterValue getParameter(final String name) {
        for (ParameterValue parameter : parameters) {
            if (parameter != null && parameter.getName().equals(name)) {
                return parameter;
            }
        }

        return null;
    }

    /**
    * Environment contributor for SafeParametersAction.
    */
    @Extension
    public static final class SafeParametersActionEnvironmentContributor extends EnvironmentContributor {

        @Override
        public void buildEnvironmentFor(final Run r, final EnvVars envs, final TaskListener listener) throws IOException, InterruptedException {
            SafeParametersAction action = r.getAction(SafeParametersAction.class);
            if (action != null) {
                for (ParameterValue p : action.getParameters()) {
                    envs.putIfNotNull(p.getName(), String.valueOf(p.getValue()));
                }
            }
        }
    }
}


================================================
FILE: tfs/src/main/java/hudson/plugins/tfs/TFSLabeler.java
================================================
//CHECKSTYLE:OFF
package hudson.plugins.tfs;

import hudson.EnvVars;
import hudson.Extension;
import hudson.FilePath;
import hudson.Launcher;
import hudson.Util;
import hudson.model.*;
import hudson.plugins.tfs.commands.LabelCommand;
import hudson.plugins.tfs.model.Server;
import hudson.plugins.tfs.telemetry.TelemetryHelper;
import hudson.plugins.tfs.util.BuildVariableResolver;
import hudson.scm.SCM;
import hudson.tasks.BuildStepDescriptor;
import hudson.tasks.BuildStepMonitor;
import hudson.tasks.Notifier;
import hudson.tasks.Publisher;
import hudson.util.VariableResolver;
import hudson.util.VariableResolver.Union;
import org.kohsuke.stapler.DataBoundConstructor;

import java.io.IOException;
import java.util.logging.Logger;

/**
 * Used to create a label in TFS after a build is completed.
 * @author Rodrigo Lopes (rodrigolopes)
 */
public class TFSLabeler extends Notifier {

    private String whenToLabel;
    private String labelName;

    private static final Logger logger = Logger.getLogger(TFSLabeler.class.getName());

    @Extension
    public static class DescriptorImpl extends BuildStepDescriptor<Publisher> {
        public DescriptorImpl() {
            super(TFSLabeler.class);
        }

        @Override
        public String getDisplayName() {
            return "Create a label in TFVC";
        }

        @Override
        public boolean isApplicable(Class<? extends AbstractProject> jobType) {
            return true;
        }
    }

    @DataBoundConstructor
    public TFSLabeler(String whenToLabel, String labelName) {
        this.whenToLabel = whenToLabel;
        this.labelName = labelName;
    }

    @Override
    public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException {
        SCM scm = build.getRootBuild().getProject().getScm();
        if (!(scm instanceof TeamFoundationServerScm)) {
            listener.getLogger().println("Labels are only supported for projects using the 'Team Foundation Server' SCM");
            return false;
        }

        TeamFoundationServerScm tfsScm = (TeamFoundationServerScm) scm;

        boolean buildSuccess = Result.SUCCESS.equals(build.getResult());

        String whenCreateLabel = getWhenToLabel();
        if ("always".equals(whenCreateLabel) || ("success".equals(whenCreateLabel) && buildSuccess)) {

            final Launcher localLauncher = launcher != null ? launcher : new Launcher.LocalLauncher(listener);
            Server server = tfsScm.createServer(localLauncher, listener, build.getRootBuild());

            Computer computer = Computer.currentComputer();
            String normalizedLabelName = computeDynamicValue(build, getLabelName());
            String tfsWorkspace = tfsScm.getWorkspaceName(build.getRootBuild(), computer);
            String tfsProjectPath = computeDynamicValue(build, tfsScm.getProjectPath());
            
            try {
                logger.info(String.format("Create label '%s' on workspace '%s' with project path '%s' ", normalizedLabelName, tfsWorkspace, tfsProjectPath));
                LabelCommand labelCommand = new LabelCommand(server, normalizedLabelName, tfsWorkspace, tfsProjectPath);
                server.execute(labelCommand.getCallable());

                // Send telemetry
                TelemetryHelper.sendEvent("team-label", new TelemetryHelper.PropertyMapBuilder()
                        .serverContext(server.getUrl(), server.getUrl())
                        .build());

            } finally {
                server.close();
            }
        }

        return true;
    }

    /**
     * Replace an expression in the form ${name} in the given String
     * by the value of the matching environment variable or build parameter.<Br/>
     */
    private String computeDynamicValue(AbstractBuild build, String parameterizedValue)
            throws IllegalStateException, InterruptedException, IOException {

        final EnvVars envVars = build.getEnvironment(TaskListener.NULL);
        final VariableResolver<String> environmentVariables = new VariableResolver<String>() {
            public String resolve(String name) {
                return envVars.get(name);
            }

        };
        final BuildVariableResolver buildVariables = new BuildVariableResolver(build.getProject());
        @SuppressWarnings("unchecked")
        final Union<String> bothVariables = new VariableResolver.Union<String>(buildVariables, environmentVariables);
        String value = Util.replaceMacro(parameterizedValue, bothVariables);

        logger.fine("oldValue = " + parameterizedValue + "; newValue = " + value);
        return value;
    }

    public BuildStepMonitor getRequiredMonitorService() {
        return BuildStepMonitor.STEP;
    }

    public String getWhenToLabel() {
        return whenToLabel;
    }

    public String getLabelName() {
        return labelName;
    }
}


================================================
FILE: tfs/src/main/java/hudson/plugins/tfs/TFSRevisionState.java
================================================
//CHECKSTYLE:OFF
package hudson.plugins.tfs;

import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;

import hudson.scm.SCMRevisionState;

@ExportedBean
public class TFSRevisionState extends SCMRevisionState {

    @Exported(visibility=2)
    public final int changesetVersion;
    @Exported(visibility=1)
    public final String projectPath;

    public TFSRevisionState(String changesetVersion, String projectPath) {
        this.changesetVersion = Integer.parseInt(changesetVersion, 10);
        this.projectPath = projectPath;
    }
    
    public TFSRevisionState(int changesetVersion, String projectPath) {
        this.changesetVersion = changesetVersion;
        this.projectPath = projectPath;
    }
}


================================================
FILE: tfs/src/main/java/hudson/plugins/tfs/TeamBuildDetailsAction.java
================================================
//CHECKSTYLE:OFF
package hudson.plugins.tfs;

import hudson.model.Action;
import hudson.plugins.tfs.util.QueryString;
import hudson.plugins.tfs.util.UriHelper;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;

import java.io.Serializable;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;

/**
 * Captures the details of the TFS/Team Services build which triggered us.
 */
@ExportedBean(defaultVisibility = 999)
public class TeamBuildDetailsAction implements Action, Serializable {
    private static final long serialVersionUID = 1L;

    public Map<String, String> buildVariables = new HashMap<String, String>();
    public String buildUrl;

    public TeamBuildDetailsAction() {

    }

    public TeamBuildDetailsAction(final Map<String, String> buildVariables) {
        this.buildVariables = new HashMap<String, String>(buildVariables);
        this.buildUrl = determineBuildUrl(buildVariables).toString();
    }

    static URI determineBuildUrl(final Map<String, String> buildVariables) {
        // TODO: eventually call the build REST API to obtain the proper web URL
        final String collectionUri = buildVariables.get("System.TeamFoundationCollectionUri");
        final String projectName = buildVariables.get("System.TeamProject");
        final String buildId = buildVariables.get("Build.BuildId");
        final QueryString query = new QueryString("buildId", buildId);
        final URI result = UriHelper.join(
                collectionUri,
                projectName,
                "_build",
                "index",
                query);
        return result;

    }

    @Override
    public String getIconFileName() {
        return "/plugin/tfs/48x48/logo.png";
    }

    @Override
    public String getDisplayName() {
        return "TFS/Team Services build";
    }

    @Override
    public String getUrlName() {
        return "team-build";
    }

    // the following methods are called from this/summary.jelly and this/index.jelly

    @Exported
    public String getBuildNumber() {
        return buildVariables.get("Build.BuildNumber");
    }

    @Exported
    public String getBuildDefinitionName() {
        return buildVariables.get("Build.DefinitionName");
    }

    @Exported
    public String getBuildUrl() {
        return buildUrl;
    }
}


================================================
FILE: tfs/src/main/java/hudson/plugins/tfs/TeamBuildEndpoint.java
================================================
package hudson.plugins.tfs;

import com.fasterxml.jackson.databind.ObjectMapper;
import hudson.Extension;
import hudson.model.BuildAuthorizationToken;
import hudson.model.BuildableItem;
import hudson.model.Item;
import hudson.model.Job;
import hudson.model.UnprotectedRootAction;
import hudson.plugins.tfs.model.AbstractCommand;
import hudson.plugins.tfs.model.BuildCommand;
import hudson.plugins.tfs.model.BuildWithParametersCommand;
import hudson.plugins.tfs.model.PingCommand;
import hudson.plugins.tfs.model.TeamBuildPayload;
import hudson.plugins.tfs.telemetry.TelemetryHelper;
import hudson.plugins.tfs.util.EndpointHelper;
import hudson.plugins.tfs.util.MediaType;
import jenkins.model.Jenkins;
import jenkins.model.ParameterizedJobMixIn;
import jenkins.util.TimeDuration;
import net.sf.json.JSONObject;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringEscapeUtils;
import org.kohsuke.stapler.ForwardToView;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.HttpResponses;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.TreeMap;
import java.util.logging.Level;
import java.util.logging.Logger;

import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
import static javax.servlet.http.HttpServletResponse.SC_CREATED;
import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
import static javax.servlet.http.HttpServletResponse.SC_OK;

/**
 * The endpoint that TFS/Team Services will PUT to when it wants to schedule a build in Jenkins.
 */
@Extension
public class TeamBuildEndpoint implements UnprotectedRootAction {

    private static final Logger LOGGER = Logger.getLogger(TeamBuildEndpoint.class.getName());
    private static final Map<String, AbstractCommand.Factory> COMMAND_FACTORIES_BY_NAME;
    public static final String URL_NAME = "team-build";
    public static final String PARAMETER = "parameter";
    public static final String BUILD_SOURCE_BRANCH = "Build.SourceBranch";
    public static final String QUEUEJOBTASK_MULTIBRANCH_JOB_BRANCH = "QueueJobTask.MultibranchPipelineBranch";
    static final String URL_PREFIX = "/" + URL_NAME + "/";

    static {
        final Map<String, AbstractCommand.Factory> map = new TreeMap<String, AbstractCommand.Factory>(String.CASE_INSENSITIVE_ORDER);
        map.put("ping", new PingCommand.Factory());
        map.put("build", new BuildCommand.Factory());
        map.put("buildWithParameters", new BuildWithParametersCommand.Factory());
        COMMAND_FACTORIES_BY_NAME = Collections.unmodifiableMap(map);
    }

    private String commandName;
    private String jobName;

    @Override
    public String getIconFileName() {
        return null;
    }

    @Override
    public String getDisplayName() {
        return null;
    }

    @Override
    public String getUrlName() {
        return URL_NAME;
    }

    public String getCommandName() {
        return commandName;
    }

    public String getJobName() {
        return jobName;
    }

    boolean decodeCommandAndJobNames(final String pathInfo) {
        if (pathInfo.startsWith(URL_PREFIX)) {
            final String restOfPath = pathInfo.substring(URL_PREFIX.length());
            final int firstSlash = restOfPath.indexOf('/');
            if (firstSlash != -1) {
                commandName = restOfPath.substring(0, firstSlash);
                if (firstSlash < restOfPath.length() - 1) {
                    final String encodedJobName = restOfPath.substring(firstSlash + 1);
                    try {
                        jobName = URLDecoder.decode(encodedJobName, MediaType.UTF_8.name());
                    } catch (final UnsupportedEncodingException e) {
                        throw new Error(e);
                    }
                    return true;
                }
            } else {
                commandName = restOfPath;
            }
        }

        return false;
    }

    /**
     * External endpoint for getting a description of the endpoints in this class.
     */
    public HttpResponse doIndex(final HttpServletRequest request) throws IOException {
        final Class<? extends TeamBuildEndpoint> me = this.getClass();
        final InputStream stream = me.getResourceAsStream("TeamBuildEndpoint.html");
        final Jenkins instance = Jenkins.getActiveInstance();
        final String rootUrl = instance.getRootUrl();
        final String commandRows = describeCommands(COMMAND_FACTORIES_BY_NAME, URL_NAME);
        try {
            final String template = IOUtils.toString(stream, MediaType.UTF_8);
            final String content = String.format(template, URL_NAME, commandRows, rootUrl);
            return HttpResponses.html(content);
        } finally {
            IOUtils.closeQuietly(stream);
        }
    }

    static String describeCommands(final Map<String, AbstractCommand.Factory> commandMap, final String urlName) {
        final String newLine = System.getProperty("line.separator");
        final StringBuilder sb = new StringBuilder();
        for (final Map.Entry<String, AbstractCommand.Factory> commandPair : commandMap.entrySet()) {
            final String commandName = commandPair.getKey();
            final AbstractCommand.Factory factory = commandPair.getValue();
            sb.append("<tr>").append(newLine);
            sb.append("<td valign='top'>").append(commandName).append("</td>").append(newLine);
            sb.append("<td valign='top'>").append('/').append(urlName).append('/').append(commandName).append('/').append("JOB_NAME").append("</td>").append(newLine);
            final String rawSample = factory.getSampleRequestPayload();
            final String escapedSample = StringEscapeUtils.escapeHtml4(rawSample);
            sb.append("<td><pre>").append(escapedSample).append("</pre></td>").append(newLine);
            sb.append("</tr>").append(newLine);
        }
        return sb.toString();
    }

    @SuppressWarnings("deprecation" /* We want to do exactly what Jenkins does */)
    void checkPermission(final Job job, final ParameterizedJobMixIn.ParameterizedJob jobMixin,
                         final StaplerRequest req, final StaplerResponse rsp) throws IOException {

        final BuildAuthorizationToken authToken = jobMixin.getAuthToken();
        hudson.model.BuildAuthorizationToken.checkPermission(job, authToken, req, rsp);
    }

    void dispatch(final StaplerRequest req, final StaplerResponse rsp, final TimeDuration delay) throws IOException {
        try {
            final JSONObject response = innerDispatch(req, rsp, delay);

            if (response.containsKey("created")) {
                rsp.setStatus(SC_CREATED);
            } else {
                rsp.setStatus(SC_OK);
            }
            rsp.setContentType(MediaType.APPLICATION_JSON_UTF_8);
            final PrintWriter w = rsp.getWriter();
            final String responseJsonString = response.toString();
            w.print(responseJsonString);
            w.println();
        } catch (final IllegalArgumentException e) {
            LOGGER.log(Level.WARNING, "IllegalArgumentException", e);
            EndpointHelper.error(SC_BAD_REQUEST, e);
        } catch (final ForwardToView e) {
            throw e;
        } catch (final Exception e) {
            final String template = "Error while performing reaction to '%s' command.";
            final String message = String.format(template, commandName);
            LOGGER.log(Level.SEVERE, message, e);
            EndpointHelper.error(SC_INTERNAL_SERVER_ERROR, e);
        }
    }

    /**
     * If we are calling this method, it means we didn't find any job or project with jobName. Assuming we are building
     * multibranch pipeline projects in this case.
     *
     * We will try to determine the branch name in the following sequence:
     * 1. For JenkinsQueueJob task 1.115.0+, we send the branch in "QueueJobTask.MultibranchPipelineBranch".
     * 2. Check if the jobName is composed from ${multibranch_pipeline}/${branch_name}
     * 3. Check if the payload has BuildSource variable defined (for PR builds)
     *
     * If we can't determine the branch name, throw.
     */
    private String getBranch(final String jobName, final StaplerRequest req) {
        final String json = req.getParameter("json");
        final JSONObject formData = JSONObject.fromObject(json);
        final TeamBuildPayload payload = EndpointHelper.MAPPER.convertValue(formData, TeamBuildPayload.class);

        String sourceBranch = payload.BuildVariables.get(QUEUEJOBTASK_MULTIBRANCH_JOB_BRANCH);

        if (sourceBranch == null || sourceBranch.trim().isEmpty()) {
            final int idx = jobName.indexOf('/');
            if (idx > 0) {
                sourceBranch = jobName.substring(idx + 1);
            } else {
                sourceBranch = payload.BuildVariables.get(BUILD_SOURCE_BRANCH);
            }
        }

        if (sourceBranch == null || sourceBranch.trim().isEmpty()) {
            throw new IllegalArgumentException("Could not find branch from job name.  If building a multibranch"
                    + "pipeline job, the job name should be in the format of '${multibranch pipeline name}/${branch}.'");
        }

        try {
            return URLEncoder.encode(sourceBranch.replace("refs/heads/", ""), "UTF-8");
        } catch (final UnsupportedEncodingException e) {
            throw new RuntimeException("Failed to encode branch: " + sourceBranch, e);
        }
    }

    private String getJobNameFromNestedFolder(final String jobName) {
        final int idx = jobName.indexOf('/');
        if (idx > 0) {
            return jobName.substring(0, idx);
        }

        return jobName;
    }

    private Job getJob(final String jobName, final StaplerRequest req) {
        final Jenkins jenkins = Jenkins.getActiveInstance();

        Job job = jenkins.getItemByFullName(jobName, Job.class);

        if (job == null) {
            /* For jobs queued by JenkinsQueueJob task 1.115.0+, the jobname sent over the wire is the real job name
             * without branch name tagged at the end.
             * Try get the job as it was specified first, if there is no such job, fall back to existing logic and
             * assume the jobname is in the format of ${multibranchPipelineJobname}/${branchName].
             */
            final Item mbPipelineJobItem = jenkins.getItemByFullName(jobName);
            final Item item = (mbPipelineJobItem != null)
                    ? mbPipelineJobItem : jenkins.getItemByFullName(getJobNameFromNestedFolder(jobName));

            if (item != null) {
                final Collection<? extends Job> allJobs = item.getAllJobs();
                final String sourceBranch = getBranch(jobName, req);

                for (final Job j : allJobs) {
                    if (j.getName().equals(sourceBranch)) {
                        job = j;
                        break;
                    }
                }
            }
        }

        if (job == null) {
            throw new IllegalArgumentException("Job: " + jobName + " not found");
        }

        return job;
    }

    private JSONObject innerDispatch(final StaplerRequest req, final StaplerResponse rsp, final TimeDuration delay) throws IOException, ServletException {
        commandName = null;
        jobName = null;
        final String pathInfo = req.getPathInfo();
        if (!decodeCommandAndJobNames(pathInfo)) {
            if (commandName == null) {
                throw new IllegalArgumentException("Command not provided");
            }
            if (jobName == null) {
                throw new IllegalArgumentException("Job name not provided after command");
            }
        }

        if (!COMMAND_FACTORIES_BY_NAME.containsKey(commandName)) {
            throw new IllegalArgumentException("Command not implemented");
        }

        final Job job = getJob(jobName, req);

        final ParameterizedJobMixIn.ParameterizedJob jobMixin = (ParameterizedJobMixIn.ParameterizedJob) job;

        checkPermission(job, jobMixin, req, rsp);
        final TimeDuration actualDelay =
                delay == null ? new TimeDuration(jobMixin.getQuietPeriod()) : delay;

        final AbstractCommand.Factory factory = COMMAND_FACTORIES_BY_NAME.get(commandName);
        final AbstractCommand command = factory.create();
        final JSONObject response;
        final JSONObject formData = req.getSubmittedForm();
        final ObjectMapper mapper = EndpointHelper.MAPPER;
        final TeamBuildPayload teamBuildPayload = mapper.convertValue(formData, TeamBuildPayload.class);

        final BuildableItem buildable = (BuildableItem) job;
        response = command.perform(job, buildable, req, formData, mapper, teamBuildPayload, actualDelay);
        return response;
    }

    /**
     * External endpoint for testing the connection to Jenkins.
     */
    public void doPing(
            final StaplerRequest request,
            final StaplerResponse response,
            @QueryParameter final TimeDuration delay
    ) throws IOException {
        dispatch(request, response, delay);
    }

    /**
     * External endpoint for triggering a build.
     */
    public void doBuild(
            final StaplerRequest request,
            final StaplerResponse response,
            @QueryParameter final TimeDuration delay
    ) throws IOException {
        // Send telemetry
        TelemetryHelper.sendEvent("team-build", new TelemetryHelper.PropertyMapBuilder()
                .build());

        dispatch(request, response, delay);
    }

    /**
     * External endpoint for triggering a build with paramters.
     */
    public void doBuildWithParameters(
            final StaplerRequest request,
            final StaplerResponse response,
            @QueryParameter final TimeDuration delay
    ) throws IOException {
        // Send telemetry
        TelemetryHelper.sendEvent("team-build-parameters", new TelemetryHelper.PropertyMapBuilder()
                .build());

        dispatch(request, response, delay);
    }

}


================================================
FILE: tfs/src/main/java/hudson/plugins/tfs/TeamCollectResultsPostBuildAction.java
================================================
//CHECKSTYLE:OFF
package hudson.plugins.tfs;

import hudson.Extension;
import hudson.FilePath;
import hudson.Launcher;
import hudson.model.AbstractProject;
import hudson.model.Run;
import hudson.model.TaskListener;
import hudson.plugins.tfs.model.TeamRequestedResult;
import hudson.plugins.tfs.model.TeamResultType;
import hudson.plugins.tfs.telemetry.TelemetryHelper;
import hudson.tasks.BuildStepDescriptor;
import hudson.tasks.BuildStepMonitor;
import hudson.tasks.Publisher;
import hudson.tasks.Recorder;
import hudson.util.DirScanner;
import hudson.util.io.Archiver;
import hudson.util.io.ArchiverFactory;
import jenkins.tasks.SimpleBuildStep;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter;

import javax.annotation.Nonnull;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;

public class TeamCollectResultsPostBuildAction extends Recorder implements SimpleBuildStep {

    private static final String TEAM_RESULTS = "team-results";
    static final String TEAM_RESULTS_ZIP = "team-results.zip";

    private List<TeamRequestedResult> requestedResults = new ArrayList<TeamRequestedResult>();

    @DataBoundConstructor
    public TeamCollectResultsPostBuildAction() {

    }

    public List<TeamRequestedResult> getRequestedResults() {
        return requestedResults;
    }

    @DataBoundSetter
    public void setRequestedResults(final List<TeamRequestedResult> requestedResults) {
        this.requestedResults = requestedResults;
    }

    @Override
    public void perform(
            @Nonnull final Run<?, ?> run,
            @Nonnull final FilePath workspace,
            @Nonnull final Launcher launcher,
            @Nonnull final TaskListener listener) throws InterruptedException, IOException {
        TelemetryHelper.sendEvent("team-collect-results", new TelemetryHelper.PropertyMapBuilder()
                .build());

        // TODO: do we want to emit an error or warning like the following?
        /*
        if (requestedResults == null || requestedResults.size() == 0) {
            final String template = "No results were requested.  Aborting the '%s' post-build action.";
            final String message = String.format(template, displayName);
            listener.error(message);
            return;
        }
        */

        final PrintStream logger = listener.getLogger();
        logger.print("Recording results...");
        final File rootDir = run.getRootDir();
        final File resultsRoot = new File(rootDir, TEAM_RESULTS);
        for (final TeamRequestedResult requestedResult : requestedResults) {
            final TeamResultType teamResultType = requestedResult.getTeamResultType();
            final String folderName = teamResultType.getFolderName();
            logger.print(" " + teamResultType.getDisplayName());
            final File resultFolder = new File(resultsRoot, folderName);
            Files.createDirectories(resultFolder.toPath());
            final String includes = requestedResult.getIncludes();
            final FilePath resultPath = new FilePath(resultFolder);
            final int numCopied = workspace.copyRecursiveTo(includes, resultPath);
            logger.print(" (" + numCopied + " file" + ((numCopied == 1) ? "" : "s") + ")");
        }
        logger.print(". Compressing...");
        final ArchiverFactory zip = ArchiverFactory.ZIP;
        final File resultsZipFile = new File(rootDir, TEAM_RESULTS_ZIP);
        final FileOutputStream outputStream = new FileOutputStream(resultsZipFile);
        try {
            final Archiver archiver = zip.create(outputStream);
            try {
                final DirScanner scanner = new DirScanner.Glob(TEAM_RESULTS + "/**", null, false);
                scanner.scan(rootDir, archiver);
            }
            finally {
                IOUtils.closeQuietly(archiver);
            }
        }
        finally {
            IOUtils.closeQuietly(outputStream);
        }
        FileUtils.deleteDirectory(resultsRoot);
        TeamResultsAction.addToRun(run);
        logger.println(" Done.");
    }

    @Override
    public DescriptorImpl getDescriptor() {
        return (DescriptorImpl) super.getDescriptor();
    }

    @Override
    public BuildStepMonitor getRequiredMonitorService() {
        return BuildStepMonitor.NONE;
    }

    @Extension
    public static class DescriptorImpl extends BuildStepDescriptor<Publisher> {

        @Override
        public boolean isApplicable(final Class<? extends AbstractProject> jobType) {
            return true;
        }

        @Override
        public String getDisplayName() {
            return "Collect results for TFS/Team Services";
        }
    }
}


================================================
FILE: tfs/src/main/java/hudson/plugins/tfs/TeamCollectionConfiguration.java
================================================
//CHECKSTYLE:OFF
package hudson.plugins.tfs;

import com.cloudbees.plugins.credentials.Credentials;
import com.cloudbees.plugins.credentials.CredentialsMatcher;
import com.cloudbees.plugins.credentials.CredentialsMatchers;
import com.cloudbees.plugins.credentials.CredentialsProvider;
import com.cloudbees.plugins.credentials.CredentialsScope;
import com.cloudbees.plugins.credentials.SystemCredentialsProvider;
import com.cloudbees.plugins.credentials.common.StandardListBoxModel;
import com.cloudbees.plugins.credentials.common.StandardUsernamePasswordCredentials;
import com.cloudbees.plugins.credentials.domains.Domain;
import com.cloudbees.plugins.credentials.domains.DomainRequirement;
import com.cloudbees.plugins.credentials.domains.DomainSpecification;
import com.cloudbees.plugins.credentials.domains.HostnameRequirement;
import com.cloudbees.plugins.credentials.domains.HostnameSpecification;
import com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl;
import com.microsoft.tfs.core.exceptions.TFSUnauthorizedException;
import hudson.Extension;
import hudson.model.AbstractDescribableImpl;
import hudson.model.Descriptor;
import hudson.model.Item;
import hudson.model.ItemGroup;
import hudson.plugins.tfs.model.ConnectionParameters;
import hudson.plugins.tfs.model.ListOfGitRepositories;
import hudson.plugins.tfs.model.MockableVersionControlClient;
import hudson.plugins.tfs.model.Server;
import hudson.plugins.tfs.util.StringHelper;
import hudson.plugins.tfs.util.TeamRestClient;
import hudson.plugins.tfs.util.UriHelper;
import hudson.security.ACL;
import hudson.util.FormValidation;
import hudson.util.ListBoxModel;
import jenkins.model.Jenkins;
import org.apache.commons.lang.StringUtils;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.QueryParameter;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;

public class TeamCollectionConfiguration extends AbstractDescribableImpl<TeamCollectionConfiguration> {

    private static final Logger LOGGER = Logger.getLogger(TeamCollectionConfiguration.class.getName());

    private final String collectionUrl;
    private final String credentialsId;
    private ConnectionParameters connectionParameters;

    @DataBoundConstructor
    public TeamCollectionConfiguration(final String collectionUrl, final String credentialsId) {
        this.collectionUrl = collectionUrl;
        this.credentialsId = credentialsId;
    }

    public String getCollectionUrl() {
        return collectionUrl;
    }

    public String getCredentialsId() {
        return credentialsId;
    }

    public ConnectionParameters getConnectionParameters() {
        if (connectionParameters == null) {
            connectionParameters = new ConnectionParameters();
        }
        return connectionParameters;
    }

    @Override
    public DescriptorImpl getDescriptor() {
        return (DescriptorImpl) super.getDescriptor();
    }

    @Extension
    public static class DescriptorImpl extends Descriptor<TeamCollectionConfiguration> {

        @Override
        public String getDisplayName() {
            return "Team Project Collection";
        }

        @SuppressWarnings("unused")
        public FormValidation doCheckCollectionUrl(
                @QueryParameter final String value) {

            if (StringUtils.isBlank(value)) {
                return FormValidation.warning("Please provide a value");
            }

            final URI uri;
            try {
                uri = new URI(value);
            }
            catch (final URISyntaxException e) {
                return FormValidation.error("Malformed TFS/Team Services collection URL (%s)", e.getMessage());
            }

            final String hostName = uri.getHost();
            if (StringUtils.isBlank(hostName)) {
                return FormValidation.error("Please provide a host name");
            }
            if (isTeamServices(hostName)) {
                return checkTeamServices(uri);
            }
            // TODO: check that it's not a deep URL to a repository, work item, API endpoint, etc.

            return FormValidation.ok();
        }

        @SuppressWarnings("unused")
        public FormValidation doTestCredentials(
                @QueryParameter final String collectionUrl,
                @QueryParameter final String credentialsId) {

            final String errorTemplate = "Error: %s";

            String hostName = null;
            try {
                final URI uri = new URI(collectionUrl);
                hostName = uri.getHost();
            }
            catch (final URISyntaxException e) {
                return FormValidation.error(errorTemplate, e.getMessage());
            }

            try {
                final StandardUsernamePasswordCredentials credential = findCredentialsById(credentialsId);
                if (isTeamServices(hostName)) {
                    if (credential == null) {
                        return FormValidation.error(errorTemplate, "Team Services accounts need credentials, preferably a Personal Access Token");
                    }
                }
                return testConnection(collectionUrl, credential);
            }
            catch (final IOException e) {
                return FormValidation.error(e, errorTemplate, e.getMessage());
            }
        }

        @SuppressWarnings("unused")
        public ListBoxModel doFillCredentialsIdItems(
            @QueryParameter final String collectionUrl) {

            final Jenkins jenkins = Jenkins.getInstance();

            String hostName = null;
            try {
                final URI uri = new URI(collectionUrl);
                hostName = uri.getHost();
            }
            catch (final URISyntaxException ignored) {
            }

            if (hostName == null || !jenkins.hasPermission(Jenkins.ADMINISTER)) {
                return new ListBoxModel();
            }

            final List<StandardUsernamePasswordCredentials> matches = findCredentials(hostName);
            return new StandardListBoxModel()
                    .withEmptySelection()
                    .withAll(matches);
        }
    }

    static FormValidation checkTeamServices(final URI uri) {
        if (UriHelper.hasPath(uri)) {
            return FormValidation.error("A Team Services collection URL must have an empty path.");
        }
        return FormValidation.ok();
    }

    static boolean areSameCollectionUri(final URI a, final URI b) {
        if (a == null) {
            throw new IllegalArgumentException("Parameter 'a' is null");
        }
        if (b == null) {
            throw new IllegalArgumentException("Parameter 'b' is null");
        }

        final String aHost = a.getHost();
        final String bHost = b.getHost();
        if (isTeamServices(aHost) && isTeamServices(bHost)) {
            return StringHelper.equalIgnoringCase(aHost, bHost);
        }

        return UriHelper.areSame(a, b);
    }

    public static boolean isTeamServices(final String hostName) {
        return StringHelper.endsWithIgnoreCase(hostName, ".visualstudio.com");
    }

    static FormValidation testConnection(final String collectionUri, final StandardUsernamePasswordCredentials credentials) throws IOException {

        final Server server = Server.create(null, null, collectionUri, credentials, null, null);
        try {
            final MockableVersionControlClient vcc = server.getVersionControlClient();
            return FormValidation.ok("Success via SOAP API.");
        }
        catch (final TFSUnauthorizedException e) {
            // performing TFVC requires All Scopes and someone might be setting up for Git only; ignore
        }
        final TeamRestClient client = new TeamRestClient(collectionUri, credentials);

        try {
            final ListOfGitRepositories repositories = client.getRepositories();
            if (repositories.count < 1) {
                return FormValidation.warning("There does not seem to be any Git repositories");
            }
            return FormValidation.ok("Success via REST API.");
        }
        catch (final IOException e) {
            return FormValidation.error("Error: " + e.getMessage());
        }
    }

    static StandardUsernamePasswordCredentials findCredential(final String hostName, final String credentialsId) {
        final List<StandardUsernamePasswordCredentials> matches = findCredentials(hostName);
        final CredentialsMatcher matcher = CredentialsMatchers.withId(credentialsId);
        final StandardUsernamePasswordCredentials result = CredentialsMatchers.firstOrNull(matches, matcher);
        return result;
    }

    public static List<StandardUsernamePasswordCredentials> findCredentials(final String hostName) {
        final Jenkins jenkins = Jenkins.getInstance();
        return findCredentials(hostName, jenkins);
    }

    public static List<StandardUsernamePasswordCredentials> findCredentials(final String hostName, ItemGroup own) {
        final HostnameRequirement requirement = new HostnameRequirement(hostName);
        final List<StandardUsernamePasswordCredentials> matches =
                CredentialsProvider.lookupCredentials(
                        StandardUsernamePasswordCredentials.class,
                        own,
                        ACL.SYSTEM,
                        requirement
                );
        return matches;
    }

    public static List<StandardUsernamePasswordCredentials> findCredentials(final String hostName, Item own) {
        final HostnameRequirement requirement = new HostnameRequirement(hostName);
        final List<StandardUsernamePasswordCredentials> matches =
                CredentialsProvider.lookupCredentials(
                        StandardUsernamePasswordCredentials.class,
                        own,
                        ACL.SYSTEM,
                        requirement
                );
        return matches;
    }

    public static StandardUsernamePasswordCredentials findCredentialsById(final String credentialsId) {
        final Jenkins jenkins = Jenkins.getInstance();
        final List<StandardUsernamePasswordCredentials> matches =
                CredentialsProvider.lookupCredentials(
                        StandardUsernamePasswordCredentials.class,
                        jenkins,
                        ACL.SYSTEM,
                        Collections.<DomainRequirement>emptyList()
                );
        final CredentialsMatcher matcher = CredentialsMatchers.withId(credentialsId);
        final StandardUsernamePasswordCredentials result = CredentialsMatchers.firstOrNull(matches, matcher);
        return result;
    }

    public static String setCredentials(final String hostName, String username, String password) {
        List<DomainSpecification> domainSpecifications = new ArrayList<>();
        domainSpecifications.add(new HostnameSpecification(hostName, null));
        Domain domain = new Domain("Generated for " + hostName, "", domainSpecifications);

        SystemCredentialsProvider.getInstance().getDomainCredentialsMap().put(domain, new ArrayList<Credentials>());

        String credentialsId;
        StandardUsernamePasswordCredentials newCredential = new UsernamePasswordCredentialsImpl(
                CredentialsScope.GLOBAL,
                credentialsId = UUID.randomUUID().toString(),
                "Generated for " + username,
                username,
                password
        );
        SystemCredentialsProvider.getInstance().getDomainCredentialsMap().get(domain).add(newCredential);

        try {
            SystemCredentialsProvider.getInstance().save();
        } catch (IOException ex) {
            LOGGER.log(Level.WARNING, "SystemCredentialsProvider instance save failed: ", ex);
        }

        return credentialsId;
    }

    // TODO: we'll probably also want findCredentialsForGitRepo, where we match part of the URL path
    public static StandardUsernamePasswordCredentials findCredentialsForCollection(final URI collectionUri) {
        final TeamPluginGlobalConfig config = TeamPluginGlobalConfig.get();
        // TODO: consider using a different data structure to speed up this look-up
        final List<TeamCollectionConfiguration> pairs = config.getCollectionConfigurations();
        for (final TeamCollectionConfiguration pair : pairs) {
            final String candidateCollectionUrlString = pair.getCollectionUrl();
            final URI candidateCollectionUri = URI.create(candidateCollectionUrlString);
            if (areSameCollectionUri(candidateCollectionUri, collectionUri)) {
                final String credentialsId = pair.credentialsId;
                if (credentialsId != null) {
                    return findCredentialsById(credentialsId);
                }
                return null;
            }
        }
        final String template = "There is no team project collection configured for the URL '%1$s'.%n" +
                "Please go to Jenkins > Manage Jenkins > Configure System and then " +
                "add a Team Project Collection with a Collection URL of '%1$s'.";
        final String message = String.format(template, collectionUri);
        throw new IllegalArgumentException(message);
    }

    public static TeamCollectionConfiguration findCollection(final URI collectionUri) {
        final TeamPluginGlobalConfig config = TeamPluginGlobalConfig.get();
        // TODO: consider using a different data structure to speed up this look-up
        final List<TeamCollectionConfiguration> pairs = config.getCollectionConfigurations();
        for (final TeamCollectionConfiguration pair : pairs) {
            final String candidateCollectionUrlString = pair.getCollectionUrl();
            final URI candidateCollectionUri = URI.create(candidateCollectionUrlString);
            if (areSameCollectionUri(candidateCollectionUri, collectionUri)) {
                return pair;
            }
        }
        return null;
    }

    public static List<TeamCollectionConfiguration> getConnectedCollections() {
        final List<TeamCollectionConfiguration> connectedCollections = new ArrayList<>();
        final TeamPluginGlobalConfig config = TeamPluginGlobalConfig.get();
        final List<TeamCollectionConfiguration> collections = config.getCollectionConfigurations();
        for (final TeamCollectionConfiguration c : collections) {
            if (c.getConnectionParameters().isSendJobCompletionEvents() && StringUtils.isNotEmpty(c.getConnectionParameters().getTeamCollectionUrl())) {
                connectedCollections.add(c);
            }
        }
        return connectedCollections;
    }
}


================================================
FILE: tfs/src/main/java/hudson/plugins/tfs/TeamCompletedStatusPostBuildAction.java
================================================
//CHECKSTYLE:OFF
package hudson.plugins.tfs;

import hudson.Extension;
import hudson.FilePath;
import hudson.Launcher;
import hudson.model.AbstractProject;
import hudson.model.Descriptor;
import hudson.model.Run;
import hudson.model.TaskListener;
import hudson.plugins.tfs.util.TeamStatus;
import hudson.tasks.BuildStepDescriptor;
import hudson.tasks.BuildStepMonitor;
import hudson.tasks.Builder;
import hudson.tasks.Notifier;
import hudson.tasks.Publisher;
import jenkins.tasks.SimpleBuildStep;
import org.kohsuke.stapler.DataBoundConstructor;

import javax.annotation.Nonnull;
import java.io.IOException;

/**
 * A _Post-Build Action_ that reports the completion status of an associated build to TFS/Team Services.
 */
public class TeamCompletedStatusPostBuildAction extends Notifier implements SimpleBuildStep {

    @DataBoundConstructor
    public TeamCompletedStatusPostBuildAction() {

    }

    @Override
    public void perform(
            @Nonnull final Run<?, ?> run,
            @Nonnull final FilePath workspace,
            @Nonnull final Launcher launcher,
            @Nonnull final TaskListener listener
    ) throws InterruptedException, IOException {
        if (!TeamGlobalStatusAction.isApplicable(run)){
            perform(run, listener);
        }
    }

    public void perform(final @Nonnull Run<?, ?> run, final @Nonnull TaskListener listener) {
        try {
            TeamStatus.createFromRun(run, listener, getDisplayName());
        }
        catch (final IllegalArgumentException e) {
            listener.error(e.getMessage());
        }
        catch (final Exception e) {
            e.printStackTrace(listener.error("Error while trying to update completion status in TFS/Team Services"));
        }
    }

    String getDisplayName() {
        final Descriptor<Builder> descriptor = getDescriptor();
        return descriptor.getDisplayName();
    }

    @Override
    public BuildStepMonitor getRequiredMonitorService() {
        // we don't need the outcome of any previous builds for this step
        return BuildStepMonitor.NONE;
    }

    @Extension
    public static class DescriptorImpl extends BuildStepDescriptor<Publisher> {

        @Override
        public boolean isApplicable(final Class<? extends AbstractProject> jobType) {
            return true;
        }

        @Override
        public String getDisplayName() {
            return "Set build completion status in TFS/Team Services";
        }
    }
}


================================================
FILE: tfs/src/main/java/hudson/plugins/tfs/TeamEventsEndpoint.java
================================================
//CHECKSTYLE:OFF
package hudson.plugins.tfs;

import hudson.Extension;
import hudson.model.Item;
import hudson.model.Job;
import hudson.model.UnprotectedRootAction;
import hudson.plugins.git.GitStatus;
import hudson.plugins.tfs.model.AbstractHookEvent;
import hudson.plugins.tfs.model.ConnectHookEvent;
import hudson.plugins.tfs.model.GitPullRequestMergedEvent;
import hudson.plugins.tfs.model.GitPushEvent;
import hudson.plugins.tfs.model.PingHookEvent;
import hudson.plugins.tfs.model.servicehooks.Event;
import hudson.plugins.tfs.rm.ConnectReleaseWebHookEvent;
import hudson.plugins.tfs.telemetry.TelemetryHelper;
import hudson.plugins.tfs.util.EndpointHelper;
import hudson.plugins.tfs.util.MediaType;
import hudson.plugins.tfs.util.StringBodyParameter;
import hudson.triggers.Trigger;
import jenkins.model.Jenkins;
import jenkins.model.ParameterizedJobMixIn;
import net.sf.json.JSONObject;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringEscapeUtils;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.HttpResponses;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.interceptor.RequirePOST;

import javax.annotation.Nonnull;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.logging.Level;
import java.util.logging.Logger;

import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
import static javax.servlet.http.HttpServletResponse.SC_OK;

/**
 * The endpoint that TFS/Team Services will POST to on Git code push, pull request merge commit creation, etc.
 */
@Extension
public class TeamEventsEndpoint implements UnprotectedRootAction {

    private static final Logger LOGGER = Logger.getLogger(TeamEventsEndpoint.class.getName());
    private static final Map<String, AbstractHookEvent.Factory> HOOK_EVENT_FACTORIES_BY_NAME;

    static {
        final Map<String, AbstractHookEvent.Factory> eventMap =
                new TreeMap<String, AbstractHookEvent.Factory>(String.CASE_INSENSITIVE_ORDER);
        eventMap.put("ping", new PingHookEvent.Factory());
        eventMap.put("gitPullRequestMerged", new GitPullRequestMergedEvent.Factory());
        eventMap.put("gitPush", new GitPushEvent.Factory());
        eventMap.put("connect", new ConnectHookEvent.Factory());
        eventMap.put("rmWebhook", new ConnectReleaseWebHookEvent.Factory());
        HOOK_EVENT_FACTORIES_BY_NAME = Collections.unmodifiableMap(eventMap);
    }

    public static final String URL_NAME = "team-events";
    static final String URL_PREFIX = "/" + URL_NAME + "/";

    @Override
    public String getIconFileName() {
        return null;
    }

    @Override
    public String getDisplayName() {
        return null;
    }

    @Override
    public String getUrlName() {
        return URL_NAME;
    }

    public HttpResponse doIndex(final HttpServletRequest request) throws IOException {
        final Class<? extends TeamEventsEndpoint> me = this.getClass();
        final InputStream stream = me.getResourceAsStream("TeamEventsEndpoint.html");
        final Jenkins instance = Jenkins.getActiveInstance();
        final String rootUrl = instance.getRootUrl();
        final String eventRows = describeEvents(HOOK_EVENT_FACTORIES_BY_NAME, URL_NAME);
        try {
            final String template = IOUtils.toString(stream, MediaType.UTF_8);
            final String content = String.format(template, URL_NAME, eventRows, rootUrl);
            return HttpResponses.html(content);
        }
        finally {
            IOUtils.closeQuietly(stream);
        }
    }

    static String describeEvents(final Map<String, AbstractHookEvent.Factory> eventMap, final String urlName) {
        final String newLine = System.getProperty("line.separator");
        final StringBuilder sb = new StringBuilder();
        for (final Map.Entry<String, AbstractHookEvent.Factory> eventPair : eventMap.entrySet()) {
            final String eventName = eventPair.getKey();
            final AbstractHookEvent.Factory factory = eventPair.getValue();
            sb.append("<tr>").append(newLine);
            sb.append("<td valign='top'>").append(eventName).append("</td>").append(newLine);
            sb.append("<td valign='top'>").append('/').append(urlName).append('/').append(eventName).append("</td>").append(newLine);
            final String rawSample = factory.getSampleRequestPayload();
            final String escapedSample = StringEscapeUtils.escapeHtml4(rawSample);
            sb.append("<td><pre>").append(escapedSample).append("</pre></td>").append(newLine);
            sb.append("</tr>").append(newLine);
        }
        return sb.toString();
    }

    static String pathInfoToEventName(final String pathInfo) {
        if (pathInfo.startsWith(URL_PREFIX)) {
            final String restOfPath = pathInfo.substring(URL_PREFIX.length());
            final int firstSlash = restOfPath.indexOf('/');
            final String eventName;
            if (firstSlash != -1) {
                eventName = restOfPath.substring(0, firstSlash);
            }
            else {
                eventName = restOfPath;
            }
            return eventName;
        }
        return null;
    }

    void dispatch(final StaplerRequest request, final StaplerResponse rsp, final String body) {
        final String pathInfo = request.getPathInfo();
        final String eventName = pathInfoToEventName(pathInfo);
        try {
            final JSONObject response = innerDispatch(body, eventName, HOOK_EVENT_FACTORIES_BY_NAME);

            rsp.setStatus(SC_OK);
            rsp.setContentType(MediaType.APPLICATION_JSON_UTF_8);
            final PrintWriter w = rsp.getWriter();
            final String responseJsonString = response.toString();
            w.print(responseJsonString);
            w.println();
        }
        catch (final IllegalArgumentException e) {
            LOGGER.log(Level.WARNING, "IllegalArgumentException", e);
            EndpointHelper.error(SC_BAD_REQUEST, e);
        }
        catch (final Exception e) {
            final String template = "Error while performing reaction to '%s' event.";
            final String message = String.format(template, eventName);
            LOGGER.log(Level.SEVERE, message, e);
            EndpointHelper.error(SC_INTERNAL_SERVER_ERROR, e);
        }
    }

    static JSONObject innerDispatch(final String body, final String eventName, final Map<String, AbstractHookEvent.Factory> factoriesByName) throws IOException {
        if (StringUtils.isBlank(eventName) || !factoriesByName.containsKey(eventName)) {
            throw new IllegalArgumentException("Invalid event");
        }
        final AbstractHookEvent.Factory factory = factoriesByName.get(eventName);
        final Event serviceHookEvent = deserializeEvent(body);
        final String message = serviceHookEvent.getMessage() != null ? serviceHookEvent.getMessage().getText() : "";
        final String detailedMessage = serviceHookEvent.getDetailedMessage() != null ? serviceHookEvent.getDetailedMessage().getText() : "";
        final AbstractHookEvent hookEvent = factory.create();
        return hookEvent.perform(EndpointHelper.MAPPER, serviceHookEvent, message, detailedMessage);
    }

    public static Event deserializeEvent(final String input) throws IOException {
        final Event serviceHookEvent = EndpointHelper.MAPPER.readValue(input, Event.class);
        final String eventType = serviceHookEvent.getEventType();
        if (StringUtils.isEmpty(eventType)) {
            throw new IllegalArgumentException("Payload did not contain 'eventType'.");
        }
        // TODO: assert eventType with what Factory claims to support
        final Object resource = serviceHookEvent.getResource();
        if (resource == null) {
            throw new IllegalArgumentException("Payload did not contain 'resource'.");
        }
        return serviceHookEvent;
    }

    @RequirePOST
    public void doPing(
            final StaplerRequest request,
            final StaplerResponse response,
            @StringBodyParameter @Nonnull final String body) {
        dispatch(request, response, body);
    }

    @RequirePOST
    public void doGitPullRequestMerged(
            final StaplerRequest request,
            final StaplerResponse response,
            @StringBodyParameter @Nonnull final String body) {
        // Send telemetry
        TelemetryHelper.sendEvent("team-events-git-pr-merged", new TelemetryHelper.PropertyMapBuilder()
                .build());

        dispatch(request, response, body);
    }

    @RequirePOST
    public void doGitPush(
            final StaplerRequest request,
            final StaplerResponse response,
            @StringBodyParameter @Nonnull final String body) {
        // Send telemetry
        TelemetryHelper.sendEvent("team-events-git-push", new TelemetryHelper.PropertyMapBuilder()
                .build());
        dispatch(request, response, body);
    }

    @RequirePOST
    public void doConnect(
            final StaplerRequest request,
            final StaplerResponse response,
            @StringBodyParameter @Nonnull final String body) {
        // Send telemetry
        TelemetryHelper.sendEvent("team-events-connect", new TelemetryHelper.PropertyMapBuilder()
                .build());
        dispatch(request, response, body);
    }

    @RequirePOST
    public void doRmwebhook(
            final StaplerRequest request,
            final StaplerResponse response,
            @StringBodyParameter @Nonnull final String body) {
        // Send telemetry
        TelemetryHelper.sendEvent("team-events-rmwebhook", new TelemetryHelper.PropertyMapBuilder().build());
        dispatch(request, response, body);
    }

    public static <T extends Trigger> T findTrigger(final Job<?, ?> job, final Class<T> tClass) {
        if (job instanceof ParameterizedJobMixIn.ParameterizedJob) {
            final ParameterizedJobMixIn.ParameterizedJob pJob = (ParameterizedJobMixIn.ParameterizedJob) job;
            for (final Object trigger : pJob.getTriggers().values()) {
                if (tClass.isInstance(trigger)) {
                    return tClass.cast(trigger);
                }
            }
        }
        return null;
    }

    // A job may have multiple triggers of the same type. For example, both TeamPRPushTrigger and TeamPushTrigger are TeamPushTrigger type.
    public static <T extends Trigger> List<T> findTriggers(final Job<?, ?> job, final Class<T> tClass) {
        List<T> triggerList = new ArrayList<>();
        if (job instanceof ParameterizedJobMixIn.ParameterizedJob) {
            final ParameterizedJobMixIn.ParameterizedJob pJob = (ParameterizedJobMixIn.ParameterizedJob) job;
            for (final Object trigger : pJob.getTriggers().values()) {
                if (tClass.isInstance(trigger)) {
                    triggerList.add(tClass.cast(trigger));
                }
            }
        }
        return triggerList;
    }

    /**
     * A response contributor for triggering polling of a project.
     *
     * @since 1.4.1
     */
    public static class PollingScheduledResponseContributor extends GitStatus.ResponseContributor {
        /**
         * The project
         */
        private final Item project;

        /**
         * Constructor.
         *
         * @param project the project.
         */
        public PollingScheduledResponseContributor(Item project) {
            this.project = project;
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public void addHeaders(StaplerRequest req, StaplerResponse rsp) {
            rsp.addHeader("Triggered", project.getAbsoluteUrl());
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public void writeBody(PrintWriter w) {
            w.println("Scheduled polling of " + project.getFullDisplayName());
        }
    }

    public static class ScheduledResponseContributor extends GitStatus.ResponseContributor {
        /**
         * The project
         */
        private final Item project;

        /**
         * Constructor.
         *
         * @param project the project.
         */
        public ScheduledResponseContributor(Item project) {
            this.project = project;
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public void addHeaders(StaplerRequest req, StaplerResponse rsp) {
            rsp.addHeader("Triggered", project.getAbsoluteUrl());
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public void writeBody(PrintWriter w) {
            w.println("Scheduled " + project.getFullDisplayName());
        }
    }
}


================================================
FILE: tfs/src/main/java/hudson/plugins/tfs/TeamFoundationServerScm.java
================================================
package hudson.plugins.tfs;

import com.cloudbees.plugins.credentials.common.StandardUsernamePasswordCredentials;
import com.microsoft.tfs.core.clients.versioncontrol.specs.version.ChangesetVersionSpec;
import com.microsoft.tfs.core.clients.versioncontrol.specs.version.DateVersionSpec;
import com.microsoft.tfs.core.clients.versioncontrol.specs.version.VersionSpec;
import hudson.Extension;
import hudson.FilePath;
import hudson.Launcher;
import hudson.Util;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.Job;
import hudson.model.Computer;
import hudson.model.Node;
import hudson.model.ParametersAction;
import hudson.model.Run;
import hudson.model.TaskListener;
import hudson.plugins.tfs.actions.CheckoutAction;
import hudson.plugins.tfs.actions.RemoveWorkspaceAction;
import hudson.plugins.tfs.browsers.TeamFoundationServerRepositoryBrowser;
import hudson.plugins.tfs.browsers.TeamSystemWebAccessBrowser;
import hudson.plugins.tfs.model.ChangeSet;
import hudson.plugins.tfs.model.CredentialsConfigurer;
import hudson.plugins.tfs.model.CredentialsConfigurerDescriptor;
import hudson.plugins.tfs.model.ManualCredentialsConfigurer;
import hudson.plugins.tfs.model.Project;
import hudson.plugins.tfs.model.Server;
import hudson.plugins.tfs.model.WorkspaceConfiguration;
import hudson.plugins.tfs.util.BuildVariableResolver;
import hudson.plugins.tfs.util.BuildWorkspaceConfigurationRetriever;
import hudson.plugins.tfs.util.BuildWorkspaceConfigurationRetriever.BuildWorkspaceConfiguration;
import hudson.scm.ChangeLogParser;
import hudson.scm.PollingResult;
import hudson.scm.PollingResult.Change;
import hudson.scm.RepositoryBrowser;
import hudson.scm.RepositoryBrowsers;
import hudson.scm.SCM;
import hudson.scm.SCMDescriptor;
import hudson.scm.SCMRevisionState;
import hudson.util.ComboBoxModel;
import hudson.util.FormValidation;
import hudson.util.LogTaskListener;
import hudson.util.Scrambler;
import hudson.util.Secret;
import hudson.util.VariableResolver;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;

import javax.annotation.CheckForNull;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;

import static hudson.Util.fixEmpty;

/**
 * SCM for Microsoft Team Foundation Server.
 *
 * @author Erik Ramfelt
 */
public class TeamFoundationServerScm extends SCM {

    public static final String WORKSPACE_ENV_STR = "TFS_WORKSPACE";
    public static final String WORKFOLDER_ENV_STR = "TFS_WORKFOLDER";
    public static final String PROJECTPATH_ENV_STR = "TFS_PROJECTPATH";
    public static final String SERVERURL_ENV_STR = "TFS_SERVERURL";
    public static final String USERNAME_ENV_STR = "TFS_USERNAME";
    public static final String WORKSPACE_CHANGESET_ENV_STR = "TFS_CHANGESET";

    private static final String VERSION_SPEC = "VERSION_SPEC";
    private static final int RADIX_10 = 10;

    private final String serverUrl;
    private final String projectPath;
    private Collection<String> cloakedPaths;
    private String localPath;
    private final String workspaceName;
    @Deprecated private String userPassword;
    private Secret password;
    private String userName;
    private CredentialsConfigurer credentialsConfigurer;
    private boolean useUpdate;
    private boolean useOverwrite;
    private String versionSpec;

    private TeamFoundationServerRepositoryBrowser repositoryBrowser;

    private transient String normalizedWorkspaceName;
    private transient String workspaceChangesetVersion;

    private static final Logger logger = Logger.getLogger(TeamFoundationServerScm.class.getName());

    /**
     * Constructor used for unit tests.
     *
     * @param serverUrl the URL to the team project collection
     * @param projectPath the path in TFVC to download from
     * @param workspaceName the name (or expression) to use when mapping the workspace
     */
    TeamFoundationServerScm(final String serverUrl, final String projectPath, final String workspaceName) {
        this(serverUrl, projectPath, workspaceName, null, null);
    }

    /**
     * Constructor used during serialization (and a few tests).
     *
     * WARNING: do NOT add parameters to this constructor when adding fields for new settings.
     * Instead, add a setter annotated with {@link DataBoundSetter} in the "Bean properties" section.
     * See {@link #setLocalPath(String)} for an example.
     *
     * @param serverUrl the URL to the team project collection
     * @param projectPath the path in TFVC to download from
     * @param workspaceName the name (or expression) to use when mapping the workspace
     * @param userName the name of the user account to use to talk to TFS/Team Services
     * @param password the password or personal access token to use to talk to TFS/Team Services
     */
    @DataBoundConstructor
    public TeamFoundationServerScm(final String serverUrl, final String projectPath, final String workspaceName, final String userName, final Secret password) {
        this.serverUrl = serverUrl;
        this.projectPath = projectPath;
        this.workspaceName = (Util.fixEmptyAndTrim(workspaceName) == null ? "Hudson-${JOB_NAME}-${NODE_NAME}" : workspaceName);
        this.userName = userName;
        this.password = password;
    }

    @SuppressWarnings("unused" /* Migrate legacy data */)
    private Object readResolve() {
        if (password == null && userPassword != null) {
            password = Secret.fromString(Scrambler.descramble(userPassword));
            userPassword = null;
        }
        if (userName != null && password != null) {
            credentialsConfigurer = new ManualCredentialsConfigurer(userName, password);
        }
        return this;
    }

    // Bean properties needed for job configuration
    public String getServerUrl() {
        return serverUrl;
    }

    public String getWorkspaceName() {
        return workspaceName;
    }

    public String getProjectPath() {
        return projectPath;
    }

    public String getLocalPath() {
        return (Util.fixEmptyAndTrim(localPath) == null ? "." : localPath);
    }

    @DataBoundSetter
    public void setLocalPath(final String localPath) {
        this.localPath = localPath;
    }

    public String getVersionSpec() {
        return versionSpec;
    }

    @DataBoundSetter
    public void setVersionSpec(final String versionSpec) {
        this.versionSpec = versionSpec;
    }

    public boolean isUseUpdate() {
        return useUpdate;
    }

    @DataBoundSetter
    public void setUseUpdate(final boolean useUpdate) {
        this.useUpdate = useUpdate;
    }

    public boolean isUseOverwrite() {
        return useOverwrite;
    }

    @DataBoundSetter
    public void setUseOverwrite(final boolean useOverwrite) {
        this.useOverwrite = useOverwrite;
    }

    public String getUserPassword() {
        return Secret.toString(password);
    }

    public Secret getPassword() {
        return password;
    }

    public String getUserName() {
        return userName;
    }

    /**
     *
     * @return a ManualCredentialsConfigurer object with the supplied userName/password
     */
    public CredentialsConfigurer getCredentialsConfigurer() {
        if (credentialsConfigurer == null) {
            credentialsConfigurer = new ManualCredentialsConfigurer(userName, password);
        }
        return credentialsConfigurer;
    }

    @DataBoundSetter
    public void setCredentialsConfigurer(final CredentialsConfigurer credentialsConfigurer) {
        this.credentialsConfigurer = credentialsConfigurer;
    }

    public String getCloakedPaths() {
        return serializeCloakedPathCollectionToString(this.cloakedPaths);
    }

    @DataBoundSetter
    public void setCloakedPaths(final String cloakedPaths) {
        this.cloakedPaths = splitCloakedPaths(cloakedPaths);
    }

    // Bean properties END

    static String serializeCloakedPathCollectionToString(final Collection<String> cloakedPaths) {
        return cloakedPaths == null ? StringUtils.EMPTY : StringUtils.join(cloakedPaths, "\n");
    }

    String getWorkspaceName(final Run<?, ?> build, final Computer computer) {
        normalizedWorkspaceName = workspaceName;
        if (build != null) {
            normalizedWorkspaceName = substituteBuildParameter(build, normalizedWorkspaceName);
            normalizedWorkspaceName = Util.replaceMacro(normalizedWorkspaceName, new BuildVariableResolver(build.getParent(), computer));
        }
        normalizedWorkspaceName = normalizedWorkspaceName.replaceAll("[\"/:<>\\|\\*\\?]+", "_");
        normalizedWorkspaceName = normalizedWorkspaceName.replaceAll("[\\.\\s]+$", "_");
        return normalizedWorkspaceName;
    }

    /**
     * Returns the URL to the team project collection.
     */
    public String getServerUrl(final Run<?, ?> run) {
        return substituteBuildParameter(run, serverUrl);
    }

    String getProjectPath(final Run<?, ?> run) {
        return Util.replaceMacro(substituteBuildParameter(run, projectPath), new BuildVariableResolver(run.getParent()));
    }

    Collection<String> getCloakedPaths(final Run<?, ?> run) {
        final List<String> paths = new ArrayList<String>();
        if (cloakedPaths != null) {
            final BuildVariableResolver resolver = new BuildVariableResolver(run.getParent());
            for (final String cloakedPath : cloakedPaths) {
                final String path = substituteBuildParameter(run, cloakedPath);
                final String enhancedPath = Util.replaceMacro(path, resolver);
                paths.add(enhancedPath);
            }
        }
        return paths;
    }

    private String substituteBuildParameter(final Run<?, ?> run, final String text) {
        if (run instanceof AbstractBuild<?, ?>) {
            AbstractBuild<?, ?> build = (AbstractBuild<?, ?>) run;
            if (build.getAction(ParametersAction.class) != null) {
                return build.getAction(ParametersAction.class).substitute(build, text);
            }
        }
        return text;
    }

    static Collection<String> splitCloakedPaths(final String cloakedPaths) {
        final List<String> cloakedPathsList = new ArrayList<String>();
        if (cloakedPaths != null && cloakedPaths.length() > 0) {
            final StringBuilder cloakedPath = new StringBuilder(cloakedPaths.length());
            for (final char character : cloakedPaths.toCharArray()) {
                switch (character) {
                    case '\n':
                        if (cloakedPath.length() > 0) {
                            cloakedPathsList.add(cloakedPath.toString().trim());
                            cloakedPath.setLength(0);
                        }
                        break;
                    default:
                        cloakedPath.append(character);
                        break;
                }
            }
            if (cloakedPath.length() > 0) {
                cloakedPathsList.add(cloakedPath.toString().trim());
            }
        }
        return cloakedPathsList;
    }

    @Override
    public void checkout(final Run<?, ?> build, final Launcher launcher, final FilePath workspaceFilePath, final TaskListener listener, final File changelogFile, final SCMRevisionState baseline) throws IOException, InterruptedException {
        Server server = createServer(launcher, listener, build);
        try {
            WorkspaceConfiguration workspaceConfiguration = new WorkspaceConfiguration(server.getUrl(), getWorkspaceName(build, workspaceFilePath.toComputer()), getProjectPath(build), getCloakedPaths(build), getLocalPath());
            final Run<?, ?> previousBuild = build.getPreviousBuild();
            // Check if the configuration has changed
            if (previousBuild != null) {
                Computer computer = workspaceFilePath.toComputer();
                if (computer != null) {
                    BuildWorkspaceConfiguration nodeConfiguration = new BuildWorkspaceConfigurationRetriever().getLatestForNode(computer.getNode(), previousBuild);
                    if ((nodeConfiguration != null)
                            && nodeConfiguration.workspaceExists()
                            && (!workspaceConfiguration.equals(nodeConfiguration))) {
                        listener.getLogger().println("Deleting workspace as the configuration has changed since a build was performed on this computer.");
                        new RemoveWorkspaceAction(workspaceConfiguration.getWorkspaceName()).remove(server);
                        nodeConfiguration.setWorkspaceWasRemoved();
                        nodeConfiguration.save();
                    }
                }
            }

            build.addAction(workspaceConfiguration);
            String singleVersionSpec = versionSpec;

            if (build instanceof AbstractBuild) {
                VariableResolver<String> buildVariableResolver = ((AbstractBuild<?, ?>) build).getBuildVariableResolver();
                singleVersionSpec = buildVariableResolver.resolve(VERSION_SPEC);
            }

            final String projPath = workspaceConfiguration.getProjectPath();
            final Project project = server.getProject(projPath);
            final int changeSet = recordWorkspaceChangesetVersion(build, listener, project, projPath, singleVersionSpec);

            CheckoutAction action = new CheckoutAction(workspaceConfiguration.getWorkspaceName(), workspaceConfiguration.getProjectPath(), workspaceConfiguration.getCloakedPaths(), workspaceConfiguration.getWorkfolder(), isUseUpdate(), isUseOverwrite());
            List<ChangeSet> list;
            if (StringUtils.isNotEmpty(singleVersionSpec)) {
                list = action.checkoutBySingleVersionSpec(server, workspaceFilePath, singleVersionSpec);
            } else {
                final VersionSpec previousBuildVersionSpec = determineVersionSpecFromBuild(previousBuild, 1, changeSet);
                final ChangesetVersionSpec currentBuildVersionSpec = new ChangesetVersionSpec(changeSet);
                list = action.checkout(server, workspaceFilePath, previousBuildVersionSpec, currentBuildVersionSpec);
            }

            if (changelogFile != null) {
                ChangeSetWriter writer = new ChangeSetWriter();
                writer.write(list, changelogFile);
            }
        } finally {
            server.close();
        }
    }

    static VersionSpec determineVersionSpecFromBuild(final Run<?, ?> build, final int offset, final int maximumChangeSetNumber) {
        final VersionSpec result;
        if (build != null) {
            final TFSRevisionState revisionState = build.getAction(TFSRevisionState.class);
            if (revisionState != null) {
                final int changeSetNumber = revisionState.changesetVersion + offset;
                if (changeSetNumber <= maximumChangeSetNumber) {
                    result = new ChangesetVersionSpec(changeSetNumber);
                } else {
                    result = null;
                }
            } else {
                result = null;
            }
        } else {
            result = null;
        }
        return result;
    }

    int recordWorkspaceChangesetVersion(final Run<?, ?> build, final TaskListener listener, final Project project, final String projectPath, final String singleVersionSpec) throws IOException, InterruptedException {
        final VersionSpec workspaceVersion;

        if (!StringUtils.isEmpty(singleVersionSpec)) {
            workspaceVersion = VersionSpec.parseSingleVersionFromSpec(singleVersionSpec, null);
        } else {
            workspaceVersion = new DateVersionSpec(build.getTimestamp());
        }
        int buildChangeset;
        setWorkspaceChangesetVersion(null);
        buildChangeset = project.getRemoteChangesetVersion(workspaceVersion);
        setWorkspaceChangesetVersion(Integer.toString(buildChangeset, RADIX_10));

        // by adding this action, we prevent calcRevisionsFromBuild() from being called
        build.addAction(new TFSRevisionState(buildChangeset, projectPath));

        return buildChangeset;
    }

    void setWorkspaceChangesetVersion(final String workspaceChangesetVersion) {
        this.workspaceChangesetVersion = workspaceChangesetVersion;
    }

    @Override
    public boolean pollChanges(final AbstractProject hudsonProject, final Launcher launcher, final FilePath workspace, final TaskListener listener) throws IOException, InterruptedException {
        Run<?, ?> lastRun = hudsonProject.getLastBuild();
        if (lastRun == null) {
            return true;
        } else {
            Server server = createServer(launcher, listener, lastRun);
            try {
                return (server.getProject(getProjectPath(lastRun)).getDetailedHistoryWithoutCloakedPaths(
                            lastRun.getTimestamp(),
                            Calendar.getInstance(),
                            getCloakedPaths(lastRun)
                        ).size() > 0);
            } finally {
                server.close();
            }
        }
    }

    @Override
    public boolean processWorkspaceBeforeDeletion(final Job<?, ?> project, final FilePath workspace, final Node node) throws IOException, InterruptedException {
        Node nodeIter = node;
        Run<?, ?> lastRun = project.getLastBuild();
        if (lastRun == null) {
            return true;
        }

        // Due to an error in Hudson core (pre 1.321), null was sent in for all invocations of this method
        // Therefore we try to work around the problem, and see if its only built on one node or not.
        if (nodeIter == null) {
            while (lastRun != null) {
                if (!(lastRun instanceof AbstractBuild<?, ?>)) {
                    return false;
                }
                AbstractBuild<?, ?> build = (AbstractBuild) lastRun;
                Node buildNode = build.getBuiltOn();
                if (nodeIter == null) {
                    nodeIter = buildNode;
                } else {
                    if (!buildNode.getNodeName().equals(nodeIter.getNodeName())) {
                        logger.warning("Could not wipe out workspace as there is no way of telling what Node the request is for. Please upgrade Hudson to a newer version.");
                        return false;
                    }
                }
                lastRun = lastRun.getPreviousBuild();
            }
            if (nodeIter == null) {
                return true;
            }
            lastRun = project.getLastBuild();
        }

        BuildWorkspaceConfiguration configuration = new BuildWorkspaceConfigurationRetriever().getLatestForNode(nodeIter, lastRun);
        if ((configuration != null) && configuration.workspaceExists()) {
            LogTaskListener listener = new LogTaskListener(logger, Level.INFO);
            Launcher launcher = nodeIter.createLauncher(listener);
            Server server = createServer(launcher, listener, lastRun);
            try {
                if (new RemoveWorkspaceAction(configuration.getWorkspaceName()).remove(server)) {
                    configuration.setWorkspaceWasRemoved();
                    configuration.save();
                }
            } finally {
                server.close();
            }
        }
        return true;
    }

    protected Server createServer(final Launcher launcher, final TaskListener taskListener, final Run<?, ?> run) throws IOException {
        final CredentialsConfigurer credentialsConfig = getCredentialsConfigurer();
        final String collectionUri = getServerUrl(run);
        final StandardUsernamePasswordCredentials credentials = credentialsConfig.getCredentials(collectionUri);
        return Server.create(launcher, taskListener, collectionUri, credentials, null, null);
    }

    @Override
    public boolean requiresWorkspaceForPolling() {
        return false;
    }

    @Override
    public boolean supportsPolling() {
        return true;
    }

    @Override
    public ChangeLogParser createChangeLogParser() {
        return new ChangeSetReader();
    }

    @Override
    public FilePath getModuleRoot(final FilePath workspace) {
        return workspace.child(getLocalPath());
    }

    @Override
    public TeamFoundationServerRepositoryBrowser getBrowser() {
        return repositoryBrowser;
    }

    /**
     *
     * @return a new TeamSystemWebAccessBrowser even if no repository browser (value in UI is Auto) is
     * configured since its the only implementation that exists anyway
     */
    @Override
    @CheckForNull
    public RepositoryBrowser<?> guessBrowser() {
        return new TeamSystemWebAccessBrowser(serverUrl);
    }

    // Convenience method for tests.
    public void setRepositoryBrowser(final TeamFoundationServerRepositoryBrowser repositoryBrowser) {
        this.repositoryBrowser = repositoryBrowser;
    }


    // TODO: 2.60+ Delete this override.
    @Override
    public void buildEnvVars(final AbstractBuild<?, ?> build, final Map<String, String> env) {
        buildEnvironment(build, env);
    }

    /**
     * TODO: 2.60+ - add @Override.
     * Sets the environment variables TFS_WORKSPACE, TFS_WORKFOLDER, TFS_PROJECTPATH, TFS_SERVERURL, TFS_USERNAME, TFS_CHANGESET and
     * VERSION_SPEC during the build
     */
    public void buildEnvironment(final Run<?, ?> build, final Map<String, String> env) {
        final TeamBuildDetailsAction buildDetailsAction = build.getAction(TeamBuildDetailsAction.class);
        if (buildDetailsAction != null) {
            //Add the TFS build variables as environment variables in the Jenkins environment
            //https://www.visualstudio.com/en-us/docs/build/define/variables
            for (Map.Entry<String, String> entry : buildDetailsAction.buildVariables.entrySet()) {
                String key = entry.getKey();
                String value = entry.getValue();
                if (value != null) {
                    //Replace . with _ and ensure they're UPPERCASE to match Team Services pattern
                    env.put(key.replace('.', '_').toUpperCase(), value);
                }
            }
        }

        if (normalizedWorkspaceName != null) {
            env.put(WORKSPACE_ENV_STR, normalizedWorkspaceName);
        }
        if (env.containsKey("WORKSPACE")) {
            env.put(WORKFOLDER_ENV_STR, env.get("WORKSPACE") + File.separator + getLocalPath());
        }
        if (projectPath != null) {
            env.put(PROJECTPATH_ENV_STR, projectPath);
        }
        if (serverUrl != null) {
            env.put(SERVERURL_ENV_STR, serverUrl);
        }
        if (userName != null) {
            env.put(USERNAME_ENV_STR, userName);
        }
        if (workspaceChangesetVersion != null && workspaceChangesetVersion.length() > 0) {
            env.put(WORKSPACE_CHANGESET_ENV_STR, workspaceChangesetVersion);
        }
    }

    @Override
    public DescriptorImpl getDescriptor() {
        return (DescriptorImpl) super.getDescriptor();
    }

    /** Descriptor implementation class. Used to create instances of TeamFoundationServerScm. */
    @Extension
    public static class DescriptorImpl extends SCMDescriptor<TeamFoundationServerScm> {

        public static final Pattern WORKSPACE_NAME_REGEX = Pattern.compile("[^\"/:<>\\|\\*\\?]+[^\\s\\.\"/:<>\\|\\*\\?]$", Pattern.CASE_INSENSITIVE);
        public static final Pattern PROJECT_PATH_REGEX = Pattern.compile("^\\$\\/.*", Pattern.CASE_INSENSITIVE);
        public static final Pattern CLOAKED_PATHS_REGEX = Pattern.compile("\\s*\\$[^\\n;]+(\\s*[\\n]\\s*\\$[^\\n;]+){0,}\\s*", Pattern.CASE_INSENSITIVE);

        @Override
        public boolean isApplicable(final Job project) {
            return true;
        }

        public DescriptorImpl() {
            super(TeamFoundationServerScm.class, TeamFoundationServerRepositoryBrowser.class);
            load();
        }

        @Override
        public SCM newInstance(final StaplerRequest req, final JSONObject formData) throws FormException {
            TeamFoundationServerScm scm = (TeamFoundationServerScm) super.newInstance(req, formData);
            scm.repositoryBrowser = RepositoryBrowsers.createInstance(TeamFoundationServerRepositoryBrowser.class, req, formData,  "browser");
            // TODO: is there a more polymorphic way of doing this?
            if (scm.credentialsConfigurer instanceof ManualCredentialsConfigurer) {
                // ManualCredentialsConfigurer has its fields "transient"; transfer the values here
                // for backward-compatibility
                final ManualCredentialsConfigurer manualCredentialsConfigurer = (ManualCredentialsConfigurer) scm.credentialsConfigurer;
                scm.userName = manualCredentialsConfigurer.getUserName();
                scm.password = manualCredentialsConfigurer.getPassword();
            }
            return scm;
        }

        private FormValidation doRegexCheck(final Pattern[] regexArray,
                final String noMatchText, final String nullText, final String value) {
            String val = value;
            val = fixEmpty(val);
            if (val == null) {
                if (nullText == null) {
                    return FormValidation.ok();
                } else {
                    return FormValidation.error(nullText);
                }
            }
            for (Pattern regex : regexArray) {
                if (regex.matcher(val).matches()) {
                    return FormValidation.ok();
                }
            }
            return FormValidation.error(noMatchText);
        }

        /** Populates comboBox with detected collections URLs. */
        public ComboBoxModel doFillServerUrlItems() {
            final TeamPluginGlobalConfig pluginGlobalConfig = TeamPluginGlobalConfig.get();
            final List<TeamCollectionConfiguration> collectionConfigurations = pluginGlobalConfig.getCollectionConfigurations();
            final ComboBoxModel result = new ComboBoxModel(collectionConfigurations.size());
            for (final TeamCollectionConfiguration collectionConfiguration : collectionConfigurations) {
                result.add(collectionConfiguration.getCollectionUrl());
            }
            return result;
        }

        /** Validates Project path form field. */
        public FormValidation doProjectPathCheck(@QueryParameter final String value) {
            return doRegexCheck(new Pattern[]{PROJECT_PATH_REGEX},
                    "Project path must begin with '$/'.",
                    "Project path is mandatory.", value);
        }

        /** Validates Workspace form field. */
        public FormValidation doWorkspaceNameCheck(@QueryParameter final String value) {
            return doRegexCheck(new Pattern[]{WORKSPACE_NAME_REGEX},
                    "Workspace name cannot end with a space or period, and cannot contain any of the following characters: \"/:<>|*?",
                    "Workspace name is mandatory", value);
        }

        /** Validates Cloaked Paths form field. */
        public FormValidation doCloakedPathsCheck(@QueryParameter final String value) {
            return doRegexCheck(new Pattern[]{CLOAKED_PATHS_REGEX},
                    "Each cloaked path must begin with '$/'. Multiple paths must be separated by blank lines.",
                    null, value);
        }

        public List<CredentialsConfigurerDescriptor> getCredentialsConfigurerDescriptors() {
            return CredentialsConfigurer.all();
        }

        @Override
        public boolean configure(final StaplerRequest req, final JSONObject formData) throws FormException {
            save();
            return true;
        }

        @Override
        public String getDisplayName() {
            return "Team Foundation Version Control (TFVC)";
        }
    }

    @Override
    public SCMRevisionState calcRevisionsFromBuild(final Run<?, ?> build,
            final FilePath workspace,
            final Launcher launcher, final TaskListener listener) throws IOException,
            InterruptedException {
        /*
         * This method does nothing, since the work has already been done in
         * the checkout() method, as per the documentation:
         * """
         * As an optimization, SCM implementation can choose to compute SCMRevisionState
         * and add it as an action during check out, in which case this method will not called.
         * """
         */
        return SCMRevisionState.NONE;
    }

    @Override
    public PollingResult compareRemoteRevisionWith(
            final Job<?, ?> project, final Launcher launcher,
            final FilePath workspace, final TaskListener listener, final SCMRevisionState baseline)
            throws IOException, InterruptedException {

        final Launcher localLauncher = launcher != null ? launcher : new Launcher.LocalLauncher(listener);
        Run<?, ?> build = project.getLastBuild();
        final Server server = createServer(localLauncher, listener, build);

        if (!(baseline instanceof TFSRevisionState)) {
            // This plugin was just upgraded, we don't yet have a new-style baseline,
            // so we perform an old-school poll
            if (project instanceof AbstractProject) {
                boolean shouldBuild = pollChanges((AbstractProject) project, localLauncher, workspace, listener);
                return shouldBuild ? PollingResult.BUILD_NOW : PollingResult.NO_CHANGES;
            } else {
                // On the pipeline case, we can't call pollChanges. Query the TFS Server directly instead
                if (build == null) {
                    return PollingResult.BUILD_NOW;
                } else {
                    try {
                        return (server.getProject(getProjectPath(build)).getDetailedHistoryWithoutCloakedPaths(
                                build.getTimestamp(),
                                Calendar.getInstance(),
                                getCloakedPaths(build)
                        ).size() > 0) ? PollingResult.BUILD_NOW : PollingResult.NO_CHANGES;
                    } finally {
                        server.close();
                    }
                }
            }
        }
        final TFSRevisionState tfsBaseline = (TFSRevisionState) baseline;
        if (!projectPath.equalsIgnoreCase(tfsBaseline.projectPath)) {
            // There's no PollingResult.INCOMPARABLE, so we use the next closest thing
            return PollingResult.BUILD_NOW;
        }
        final Project tfsProject = server.getProject(projectPath);
        try {
            final ChangeSet latest = tfsProject.getLatestUncloakedChangeset(tfsBaseline.changesetVersion, cloakedPaths);
            final TFSRevisionState tfsRemote =
                    (latest != null)
                    ? new TFSRevisionState(latest.getVersion(), projectPath)
                    : tfsBaseline;

            // TODO: we could return INSIGNIFICANT if all the changesets
            // contain the string "***NO_CI***" at the end of their comment
            final Change change =
                    tfsBaseline.changesetVersion == tfsRemote.changesetVersion
                    ? Change.NONE
                    : Change.SIGNIFICANT;
            return new PollingResult(tfsBaseline, tfsRemote, change);
        } catch (final Exception e) {
            e.printStackTrace(listener.fatalError(e.getMessage()));
            return PollingResult.NO_CHANGES;
        } finally {
            server.close();
        }
    }
}


================================================
FILE: tfs/src/main/java/hudson/plugins/tfs/TeamGlobalStatusAction.java
================================================
package hudson.plugins.tfs;

import hudson.model.Action;
import hudson.model.InvisibleAction;
import hudson.model.Run;

import java.io.Serializable;
import java.util.List;

/**
 * Added to the build when triggered by TFS/Team Services AND the "Enable Team Status for all jobs"
 * option was enabled.
 */
public class TeamGlobalStatusAction extends InvisibleAction implements Serializable {

    /**
     * Add the passed in actions if EnableTeamStatusForAllJobs is configured.
     */
    public static void addIfApplicable(final List<Action> actions) {
        final TeamPluginGlobalConfig config = TeamPluginGlobalConfig.get();
        if (config.isEnableTeamStatusForAllJobs()) {
            actions.add(new TeamGlobalStatusAction());
        }
    }

    /**
     * Returns true if the run already contains a TeamGlobalStatusAction.
     */
    public static boolean isApplicable(final Run<?, ?> run) {
        final TeamGlobalStatusAction action = run.getAction(TeamGlobalStatusAction.class);
        return action != null;
    }

}


================================================
FILE: tfs/src/main/java/hudson/plugins/tfs/TeamGlobalStatusPoster.java
================================================
package hudson.plugins.tfs;

import hudson.Extension;
import hudson.model.AbstractBuild;
import hudson.model.TaskListener;
import hudson.model.listeners.RunListener;

import javax.annotation.Nonnull;

/**
 * Posts the status to TFS/Team Services if the {@link TeamGlobalStatusAction} was contributed.
 */
@Extension
public class TeamGlobalStatusPoster extends RunListener<AbstractBuild> {

    @Override
    public void onStarted(final AbstractBuild build, final TaskListener listener) {
        if (TeamGlobalStatusAction.isApplicable(build)) {
            final TeamPendingStatusBuildStep step = new TeamPendingStatusBuildStep();
            step.perform(build, listener);
        }
    }

    @Override
    public void onCompleted(final AbstractBuild build, @Nonnull final TaskListener listener) {
        if (TeamGlobalStatusAction.isApplicable(build)) {
            final TeamCompletedStatusPostBuildAction step = new TeamCompletedStatusPostBuildAction();
            step.perform(build, listener);
        }
    }

}


================================================
FILE: tfs/src/main/java/hudson/plugins/tfs/TeamHookCause.java
================================================
package hudson.plugins.tfs;

import hudson.plugins.git.GitStatus;

/**
 * Attached to the build if it was started by a TFS/Team Services commit.
 */
public class TeamHookCause extends GitStatus.CommitHookCause {

    public TeamHookCause(final String sha1) {
        super(sha1);
    }

    @Override
    public String getShortDescription() {
        return "Started by TFS/Team Services web hook for commit " + sha1;
    }
}


================================================
FILE: tfs/src/main/java/hudson/plugins/tfs/TeamPRPushTrigger.java
================================================
package hudson.plugins.tfs;

import hudson.Extension;
import hudson.model.Job;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter;

/**
 * Triggers a build when we receive a TFS/Team Services Git code push event in a TFS pull request.
 */
public class TeamPRPushTrigger extends TeamPushTrigger {

    private String targetBranches;

    @DataBoundConstructor
    public TeamPRPushTrigger() {
    }

    public TeamPRPushTrigger(final Job<?, ?> job, final String targetBranches, final String jobContext) {
        this.job = job;
        this.targetBranches = targetBranches;

        setJobContext(jobContext);
    }

    public String getTargetBranches() {
        return targetBranches;
    }

    @DataBoundSetter
    public void setTargetBranches(final String targetBranches) {
        this.targetBranches = targetBranches;
    }

    /**
     * This class extends trigger descriptor class from TeamPushTrigger, creating a separate check box for TeamPRPushTrigger.
     */
    @Extension
    public static class DescriptorImpl extends TeamPushTrigger.DescriptorImpl {

        @Override
        public String getDisplayName() {
            return "Build when a change is pushed to a TFS pull request";
        }
    }
}


================================================
FILE: tfs/src/main/java/hudson/plugins/tfs/TeamPendingStatusBuildStep.java
================================================
//CHECKSTYLE:OFF
package hudson.plugins.tfs;

import hudson.Extension;
import hudson.FilePath;
import hudson.Launcher;
import hudson.model.AbstractProject;
import hudson.model.Descriptor;
import hudson.model.Run;
import hudson.model.TaskListener;
import hudson.plugins.tfs.util.TeamStatus;
import hudson.tasks.BuildStepDescriptor;
import hudson.tasks.Builder;
import jenkins.tasks.SimpleBuildStep;
import org.kohsuke.stapler.DataBoundConstructor;

import javax.annotation.Nonnull;
import java.io.IOException;

/**
 * A _Build Step_ that reports the status of an associated build as "Pending" to TFS/Team Services.
 */
public class TeamPendingStatusBuildStep extends Builder implements SimpleBuildStep {

    @DataBoundConstructor
    public TeamPendingStatusBuildStep() {

    }

    @Override
    public void perform(
            @Nonnull final Run<?, ?> run,
            @Nonnull final FilePath workspace,
            @Nonnull final Launcher launcher,
            @Nonnull final TaskListener listener
    ) throws InterruptedException, IOException {
        if (!TeamGlobalStatusAction.isApplicable(run)){
            perform(run, listener);
        }
    }

    public void perform(final @Nonnull Run<?, ?> run, final @Nonnull TaskListener listener) {
        try {
            TeamStatus.createFromRun(run, listener, getDisplayName());
        }
        catch (final IllegalArgumentException e) {
            listener.error(e.getMessage());
        }
        catch (final Exception e) {
            e.printStackTrace(listener.error("Error while trying to update pending status in TFS/Team Services"));
        }
    }

    String getDisplayName() {
        final Descriptor<Builder> descriptor = getDescriptor();
        return descriptor.getDisplayName();
    }

    @Extension
    public static class DescriptorImpl extends BuildStepDescriptor<Builder> {

        @Override
        public boolean isApplicable(Class<? extends AbstractProject> jobType) {
            return true;
        }

        @Override
        public String getDisplayName() {
            return "Set build pending status in TFS/Team Services";
        }
    }
}


================================================
FILE: tfs/src/main/java/hudson/plugins/tfs/TeamPluginGlobalConfig.java
================================================
//CHECKSTYLE:OFF
package hudson.plugins.tfs;

import hudson.Extension;
import hudson.ExtensionList;
import hudson.plugins.tfs.model.DomainUserAccountMapper;
import hudson.plugins.tfs.model.UserAccountMapper;
import hudson.plugins.tfs.model.UserAccountMapperDescriptor;
import hudson.plugins.tfs.rm.ReleaseWebHook;
import jenkins.model.GlobalConfiguration;
import jenkins.model.Jenkins;
import net.sf.json.JSONObject;
import org.apache.commons.lang3.ObjectUtils;
import org.kohsuke.stapler.StaplerRequest;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * All the settings that apply globally.
 */
@Extension
public class TeamPluginGlobalConfig extends GlobalConfiguration {

    private static final Logger LOGGER = Logger.getLogger(TeamPluginGlobalConfig.class.getName());
    public static final TeamPluginGlobalConfig DEFAULT_CONFIG = new TeamPluginGlobalConfig(false);

    private List<TeamCollectionConfiguration> collectionConfigurations = new ArrayList<TeamCollectionConfiguration>();
    private List<ReleaseWebHook> releaseWebHookConfigurations = new ArrayList<ReleaseWebHook>();
    
    private boolean configFolderPerNode;
    private boolean enableTeamPushTriggerForAllJobs;
    private boolean enableTeamStatusForAllJobs;
    private UserAccountMapper userAccountMapper;

    public TeamPluginGlobalConfig() {
        this(true);
    }

    TeamPluginGlobalConfig(final boolean shouldLoadConfig) {
        if (shouldLoadConfig) {
            load();
        }
    }

    public TeamPluginGlobalConfig(final List<TeamCollectionConfiguration> collectionConfigurations) {
        this.collectionConfigurations = collectionConfigurations;
    }

    public static TeamPluginGlobalConfig get() {
        TeamPluginGlobalConfig result = DEFAULT_CONFIG;
        if (Jenkins.getInstance() != null) {
            final ExtensionList<GlobalConfiguration> configurationExtensions = all();
            final TeamPluginGlobalConfig config = configurationExtensions.get(TeamPluginGlobalConfig.class);
            result = ObjectUtils.defaultIfNull(config, DEFAULT_CONFIG);
        }
        return result;
    }

    public List<TeamCollectionConfiguration> getCollectionConfigurations() {
        return collectionConfigurations;
    }

    public void setCollectionConfigurations(final List<TeamCollectionConfiguration> collectionConfigurations) {
        this.collectionConfigurations = collectionConfigurations;
    }
    
    public List<ReleaseWebHook> getReleaseWebHookConfigurations() {
        return this.releaseWebHookConfigurations;
    }
    
    public void setReleaseWebHookConfigurations(final List<ReleaseWebHook> releaseWebHookConfigurations) {
        this.releaseWebHookConfigurations = releaseWebHookConfigurations;
    }

    public boolean isConfigFolderPerNode() {
        return configFolderPerNode;
    }

    public void setConfigFolderPerNode(final boolean configFolderPerNode) {
        this.configFolderPerNode = configFolderPerNode;
    }

    public boolean isEnableTeamPushTriggerForAllJobs() {
        return enableTeamPushTriggerForAllJobs;
    }

    public void setEnableTeamPushTriggerForAllJobs(final boolean enableTeamPushTriggerForAllJobs) {
        this.enableTeamPushTriggerForAllJobs = enableTeamPushTriggerForAllJobs;
    }

    public boolean isEnableTeamStatusForAllJobs() {
        return enableTeamStatusForAllJobs;
    }

    public void setEnableTeamStatusForAllJobs(final boolean enableTeamStatusForAllJobs) {
        this.enableTeamStatusForAllJobs = enableTeamStatusForAllJobs;
    }

    public UserAccountMapper getUserAccountMapper() {
        if (userAccountMapper == null) {
            userAccountMapper = new DomainUserAccountMapper();
        }
        return userAccountMapper;
    }

    public void setUserAccountMapper(UserAccountMapper userAccountMapper) {
        this.userAccountMapper = userAccountMapper;
    }

    public List<UserAccountMapperDescriptor> getUserAccountMapperDescriptors() {
        return UserAccountMapper.all();
    }

    @Override
    public boolean configure(StaplerRequest req, JSONObject json) throws FormException {
        try {
            req.bindJSON(this, json);
            
            // stapler oddity, empty lists are not set on bean by  "req.bindJSON(this, json)"
            this.releaseWebHookConfigurations = req.bindJSONToList(ReleaseWebHook.class, json.get("releaseWebHookConfigurations"));
        }
        catch (final Exception e) {
            final String message = "Configuration error: " + e.getMessage();
            LOGGER.log(Level.WARNING, message, e);
            LOGGER.log(Level.FINE, "Form data: {}", json.toString());
            throw new FormException(message, e, "team-configuration");
        }
        save();
        return true;
    }

    @Override
    public String getDisplayName() {
        return "TFS/Team Services";
    }
}


================================================
FILE: tfs/src/main/java/hudson/plugins/tfs/TeamPullRequestMergedDetailsAction.java
================================================
//CHECKSTYLE:OFF
package hudson.plugins.tfs;

import com.microsoft.teamfoundation.core.webapi.model.TeamProjectReference;
import com.microsoft.teamfoundation.sourcecontrol.webapi.model.GitRepository;
import com.microsoft.visualstudio.services.webapi.model.ResourceRef;
import hudson.model.Action;
import hudson.model.Run;
import hudson.plugins.tfs.model.GitPullRequestEx;
import hudson.plugins.tfs.model.GitPushEvent;
import hudson.plugins.tfs.util.UriHelper;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;

import java.io.Serializable;
import java.net.URI;
import java.util.Collections;
import java.util.List;

/**
 * Captures details of the TFS/Team Services pull request event which triggered us.
 */
@ExportedBean(defaultVisibility = 999)
public class TeamPullRequestMergedDetailsAction implements Action, Serializable {
    private static final long serialVersionUID = 1L;
    private static final String URL_NAME = "team-pullRequestMergedDetails";

    public transient GitPullRequestEx gitPullRequest;
    public String message;
    public String detailedMessage;
    public String collectionUri;

    public TeamPullRequestMergedDetailsAction() {

    }

    public TeamPullRequestMergedDetailsAction(final GitPullRequestEx gitPullRequest, final String message, final String detailedMessage, final String collectionUri) {
        this.gitPullRequest = gitPullRequest;
        this.message = message;
        this.detailedMessage = detailedMessage;
        this.collectionUri = collectionUri;
    }

    public static URI addWorkItemsForRun(final Run<?, ?> run, final List<ResourceRef> destination) {
        final TeamPullRequestMergedDetailsAction action = run.getAction(TeamPullRequestMergedDetailsAction.class);
        if (action != null && action.hasWorkItems()) {
            Collections.addAll(destination, action.getWorkItems());
            final GitPullRequestEx gitPullRequest = action.gitPullRequest;
            final URI collectionUri = URI.create(action.collectionUri);
            return collectionUri;
        }
        return null;
    }

    @Override
    public String getIconFileName() {
        return "/plugin/tfs/48x48/logo.png";
    }

    @Override
    public String getDisplayName() {
        return "TFS/Team Services pull request";
    }

    @Override
    public String getUrlName() {
        return URL_NAME;
    }

    // the following methods are called from this/summary.jelly and/or this/index.jelly

    @Exported
    public String getMessage() {
        return message;
    }

    @Exported
    public String getDetailedMessage() {
        return detailedMessage;
    }

    @Exported
    public ResourceRef[] getWorkItems() {
        return gitPullRequest.getWorkItemRefs();
    }

    @Exported
    public boolean hasWorkItems() {
        final ResourceRef[] workItemRefs = gitPullRequest.getWorkItemRefs();
        return workItemRefs != null && workItemRefs.length > 0;
    }

    @Exported
    public String getPullRequestUrl() {
        final GitRepository repository = gitPullRequest.getRepository();
        final URI collectionUri = URI.create(this.collectionUri);
        final TeamProjectReference project = repository.getProject();
        final URI pullRequestUrl = UriHelper.join(collectionUri,
                project.getName(),
                "_git",
                repository.getName(),
                "pullrequest",
                gitPullRequest.getPullRequestId()
        );
        final String result = pullRequestUrl.toString();
        return result;
    }
}


================================================
FILE: tfs/src/main/java/hudson/plugins/tfs/TeamPushCause.java
================================================
package hudson.plugins.tfs;

import hudson.triggers.SCMTrigger.SCMTriggerCause;
import org.apache.commons.lang.StringUtils;

import java.io.File;
import java.io.IOException;

/**
 * Indicates that a build was queued because of a TFS/Team Services Git code push event.
 */
public class TeamPushCause extends SCMTriggerCause {

    private final String pushedBy;
    private final String context;

    public TeamPushCause(final String pushedBy, final String context) {
        this("", pushedBy, context);
    }

    public TeamPushCause(final File logFile, final String pushedBy, final String context) throws IOException {
        super(logFile);
        this.pushedBy = pushedBy;
        this.context = context;
    }

    public TeamPushCause(final String pollingLog, final String pushedBy, final String context) {
        super(pollingLog);
        this.pushedBy = pushedBy;
        this.context = context;
    }

    @Override
    public String getShortDescription() {
        final String template = "Started by TFS/Team Services push by %s";
        final String message = String.format(template, StringUtils.trimToEmpty(pushedBy));
        return message;
    }

    @Override
    public boolean equals(final Object o) {
        return super.equals(o);
    }

    @Override
    public int hashCode() {
        return super.hashCode();
    }

    public String getRunContext() {
        return this.context;
    }
}


================================================
FILE: tfs/src/main/java/hudson/plugins/tfs/TeamPushTrigger.java
================================================
package hudson.plugins.tfs;

import hudson.Extension;
import hudson.Util;
import hudson.console.AnnotatedLargeText;
import hudson.model.Action;
import hudson.model.CauseAction;
import hudson.model.Item;
import hudson.model.Job;
import hudson.model.queue.QueueTaskFuture;
import hudson.plugins.tfs.model.GitCodePushedEventArgs;
import hudson.plugins.tfs.util.ActionHelper;
import hudson.plugins.tfs.util.MediaType;
import hudson.triggers.Trigger;
import hudson.triggers.TriggerDescriptor;
import hudson.util.StreamTaskListener;
import jenkins.model.ParameterizedJobMixIn;
import jenkins.triggers.SCMTriggerItem;
import org.apache.commons.jelly.XMLOutput;
import org.apache.commons.lang.StringUtils;
import org.kohsuke.stapler.DataBoundConstructor;

import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.io.Writer;
import java.text.DateFormat;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.kohsuke.stapler.DataBoundSetter;

/**
 * Triggers a build when we receive a TFS/Team Services Git code push event.
 */
public class TeamPushTrigger extends Trigger<Job<?, ?>> {

    private static final Logger LOGGER = Logger.getLogger(TeamPushTrigger.class.getName());
    private String jobContext;

    @DataBoundConstructor
    public TeamPushTrigger() {
    }

    public TeamPushTrigger(final Job<?, ?> job) {
        this.job = job;
    }

    public TeamPushTrigger(final Job<?, ?> job, final String jobContext) {
        this.job = job;
        this.jobContext = jobContext;
    }

    /**
    * Execute function.
    */
    public void execute(final GitCodePushedEventArgs gitCodePushedEventArgs, final List<Action> actions, final boolean bypassPolling) {
        // TODO: Consider executing the poll + queue asynchronously
        final Runner runner = new Runner(gitCodePushedEventArgs, actions, bypassPolling);
        runner.run();
    }

    public File getLogFile() {
        return new File(job.getRootDir(), "team-polling.log");
    }

    public String getJobContext() {
        return jobContext;
    }

    @DataBoundSetter
    public void setJobContext(final String jobContext) {
        this.jobContext = jobContext;
    }

    /**
     * Runner class for TeamPushTrigger.
     *
Download .txt
gitextract_x4w9l1z2/

├── .gitignore
├── Jenkinsfile
├── README.md
├── ReleaseNotes.md
├── Releasing.md
├── Testing.md
├── contributing.md
├── pom.xml
├── tfs/
│   ├── checkstyle.xml
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── hudson/
│       │   │       └── plugins/
│       │   │           └── tfs/
│       │   │               ├── ChangeSetReader.java
│       │   │               ├── ChangeSetWriter.java
│       │   │               ├── CommitParameterAction.java
│       │   │               ├── JenkinsEventNotifier.java
│       │   │               ├── PullRequestParameterAction.java
│       │   │               ├── SafeParametersAction.java
│       │   │               ├── TFSLabeler.java
│       │   │               ├── TFSRevisionState.java
│       │   │               ├── TeamBuildDetailsAction.java
│       │   │               ├── TeamBuildEndpoint.java
│       │   │               ├── TeamCollectResultsPostBuildAction.java
│       │   │               ├── TeamCollectionConfiguration.java
│       │   │               ├── TeamCompletedStatusPostBuildAction.java
│       │   │               ├── TeamEventsEndpoint.java
│       │   │               ├── TeamFoundationServerScm.java
│       │   │               ├── TeamGlobalStatusAction.java
│       │   │               ├── TeamGlobalStatusPoster.java
│       │   │               ├── TeamHookCause.java
│       │   │               ├── TeamPRPushTrigger.java
│       │   │               ├── TeamPendingStatusBuildStep.java
│       │   │               ├── TeamPluginGlobalConfig.java
│       │   │               ├── TeamPullRequestMergedDetailsAction.java
│       │   │               ├── TeamPushCause.java
│       │   │               ├── TeamPushTrigger.java
│       │   │               ├── TeamResultsAction.java
│       │   │               ├── TeamUpdateWorkItemPostBuildAction.java
│       │   │               ├── UnsupportedIntegrationAction.java
│       │   │               ├── actions/
│       │   │               │   ├── CheckoutAction.java
│       │   │               │   └── RemoveWorkspaceAction.java
│       │   │               ├── browsers/
│       │   │               │   ├── TeamFoundationServerRepositoryBrowser.java
│       │   │               │   └── TeamSystemWebAccessBrowser.java
│       │   │               ├── commands/
│       │   │               │   ├── AbstractCallableCommand.java
│       │   │               │   ├── AbstractCommand.java
│       │   │               │   ├── Command.java
│       │   │               │   ├── DeleteWorkspaceCommand.java
│       │   │               │   ├── GetFilesToWorkFolderCommand.java
│       │   │               │   ├── GetWorkspaceMappingCommand.java
│       │   │               │   ├── LabelCommand.java
│       │   │               │   ├── ListWorkspacesCommand.java
│       │   │               │   ├── NewWorkspaceCommand.java
│       │   │               │   ├── RemoteChangesetVersionCommand.java
│       │   │               │   └── ServerConfigurationProvider.java
│       │   │               ├── listeners/
│       │   │               │   └── JenkinsRunListener.java
│       │   │               ├── model/
│       │   │               │   ├── AbstractCommand.java
│       │   │               │   ├── AbstractHookEvent.java
│       │   │               │   ├── AliasOnlyUserAccountMapper.java
│       │   │               │   ├── AutomaticCredentialsConfigurer.java
│       │   │               │   ├── BuildCommand.java
│       │   │               │   ├── BuildParameter.java
│       │   │               │   ├── BuildWithParametersCommand.java
│       │   │               │   ├── ChangeLogSet.java
│       │   │               │   ├── ChangeSet.java
│       │   │               │   ├── ClonePersistenceStoreProvider.java
│       │   │               │   ├── ConnectHookEvent.java
│       │   │               │   ├── ConnectionParameters.java
│       │   │               │   ├── CredentialsConfigurer.java
│       │   │               │   ├── CredentialsConfigurerDescriptor.java
│       │   │               │   ├── DomainUserAccountMapper.java
│       │   │               │   ├── ExtraSettings.java
│       │   │               │   ├── GitCodePushedEventArgs.java
│       │   │               │   ├── GitPullRequestEx.java
│       │   │               │   ├── GitPullRequestMergedEvent.java
│       │   │               │   ├── GitPushEvent.java
│       │   │               │   ├── GitStatusContext.java
│       │   │               │   ├── GitStatusState.java
│       │   │               │   ├── HttpMethod.java
│       │   │               │   ├── JobCompletionEventArgs.java
│       │   │               │   ├── JsonPatchOperation.java
│       │   │               │   ├── LegacyIdentityManagementService.java
│       │   │               │   ├── Link.java
│       │   │               │   ├── ListOfGitRepositories.java
│       │   │               │   ├── ManualCredentialsConfigurer.java
│       │   │               │   ├── MockableVersionControlClient.java
│       │   │               │   ├── ModernConnectionAdvisor.java
│       │   │               │   ├── ModernHTTPClientFactory.java
│       │   │               │   ├── NativeLibraryExtractor.java
│       │   │               │   ├── NativeLibraryManager.java
│       │   │               │   ├── PingCommand.java
│       │   │               │   ├── PingHookEvent.java
│       │   │               │   ├── Project.java
│       │   │               │   ├── ProxyHostEx.java
│       │   │               │   ├── PullRequestMergeCommitCreatedEventArgs.java
│       │   │               │   ├── Server.java
│       │   │               │   ├── TeamBuildPayload.java
│       │   │               │   ├── TeamGitStatus.java
│       │   │               │   ├── TeamRequestedResult.java
│       │   │               │   ├── TeamResultType.java
│       │   │               │   ├── TfsUserLookup.java
│       │   │               │   ├── UserAccountMapper.java
│       │   │               │   ├── UserAccountMapperDescriptor.java
│       │   │               │   ├── UserHomePersistenceStore.java
│       │   │               │   ├── UserLookup.java
│       │   │               │   ├── WebProxySettings.java
│       │   │               │   ├── WorkItem.java
│       │   │               │   ├── WorkItemTrackingResource.java
│       │   │               │   ├── WorkItemTrackingResourceReference.java
│       │   │               │   ├── Workspace.java
│       │   │               │   ├── WorkspaceConfiguration.java
│       │   │               │   ├── WorkspaceMapping.java
│       │   │               │   ├── Workspaces.java
│       │   │               │   └── servicehooks/
│       │   │               │       ├── Event.java
│       │   │               │       ├── EventScope.java
│       │   │               │       ├── FormattedEventMessage.java
│       │   │               │       └── ResourceContainer.java
│       │   │               ├── rm/
│       │   │               │   ├── Artifact.java
│       │   │               │   ├── ArtifactVersion.java
│       │   │               │   ├── ConnectReleaseWebHookEvent.java
│       │   │               │   ├── CreatedBy.java
│       │   │               │   ├── Definition.java
│       │   │               │   ├── DefinitionReference.java
│       │   │               │   ├── InstanceReference.java
│       │   │               │   ├── ModifiedBy.java
│       │   │               │   ├── Project.java
│       │   │               │   ├── ReleaseArtifact.java
│       │   │               │   ├── ReleaseArtifactVersionsResponse.java
│       │   │               │   ├── ReleaseBody.java
│       │   │               │   ├── ReleaseDefinition.java
│       │   │               │   ├── ReleaseManagementCI.java
│       │   │               │   ├── ReleaseManagementException.java
│       │   │               │   ├── ReleaseManagementHttpClient.java
│       │   │               │   ├── ReleaseSummaryAction.java
│       │   │               │   ├── ReleaseWebHook.java
│       │   │               │   ├── ReleaseWebHookAction.java
│       │   │               │   ├── ReleaseWebHookHelper.java
│       │   │               │   ├── ReleaseWebHookReference.java
│       │   │               │   ├── ReleaseWebHookResource.java
│       │   │               │   ├── ReleaseWebHookStatus.java
│       │   │               │   ├── ReleaseWebHookSummaryAction.java
│       │   │               │   ├── RetentionPolicy.java
│       │   │               │   └── Version.java
│       │   │               ├── telemetry/
│       │   │               │   ├── TelemetryContextInitializer.java
│       │   │               │   └── TelemetryHelper.java
│       │   │               └── util/
│       │   │                   ├── ActionHelper.java
│       │   │                   ├── BuildVariableResolver.java
│       │   │                   ├── BuildWorkspaceConfigurationRetriever.java
│       │   │                   ├── DateUtil.java
│       │   │                   ├── EndpointHelper.java
│       │   │                   ├── KeyValueTextReader.java
│       │   │                   ├── License.txt
│       │   │                   ├── MaskedArgumentListBuilder.java
│       │   │                   ├── MediaType.java
│       │   │                   ├── QueryString.java
│       │   │                   ├── ResourceHelper.java
│       │   │                   ├── StringBodyParameter.java
│       │   │                   ├── StringHelper.java
│       │   │                   ├── TeamRestClient.java
│       │   │                   ├── TeamStatus.java
│       │   │                   ├── TextTableParser.java
│       │   │                   ├── UriHelper.java
│       │   │                   └── XmlHelper.java
│       │   ├── resources/
│       │   │   └── hudson/
│       │   │       └── plugins/
│       │   │           └── tfs/
│       │   │               ├── TFSLabeler/
│       │   │               │   ├── config.jelly
│       │   │               │   └── global.jelly
│       │   │               ├── TeamBuildDetailsAction/
│       │   │               │   ├── index.jelly
│       │   │               │   └── summary.jelly
│       │   │               ├── TeamBuildEndpoint.html
│       │   │               ├── TeamCollectResultsPostBuildAction/
│       │   │               │   ├── config.groovy
│       │   │               │   └── help.html
│       │   │               ├── TeamCollectionConfiguration/
│       │   │               │   ├── config.groovy
│       │   │               │   └── help-collectionUrl.html
│       │   │               ├── TeamCompletedStatusPostBuildAction/
│       │   │               │   └── help.html
│       │   │               ├── TeamEventsEndpoint.html
│       │   │               ├── TeamFoundationServerScm/
│       │   │               │   ├── config.jelly
│       │   │               │   ├── config_fr.properties
│       │   │               │   ├── help-cloakedPaths.html
│       │   │               │   ├── help-credentialsConfigurer.html
│       │   │               │   ├── help-localPath.html
│       │   │               │   ├── help-projectPath.html
│       │   │               │   ├── help-serverUrl.html
│       │   │               │   └── help-workspaceName.html
│       │   │               ├── TeamPRPushTrigger/
│       │   │               │   ├── config.jelly
│       │   │               │   └── help.html
│       │   │               ├── TeamPendingStatusBuildStep/
│       │   │               │   └── help.html
│       │   │               ├── TeamPluginGlobalConfig/
│       │   │               │   ├── config.groovy
│       │   │               │   ├── help-configFolderPerNode.html
│       │   │               │   ├── help-enableTeamPushTriggerForAllJobs.html
│       │   │               │   ├── help-enableTeamStatusForAllJobs.html
│       │   │               │   ├── help-releaseWebhookConfigurations.html
│       │   │               │   ├── help-userAccountMapper.html
│       │   │               │   └── help.jelly
│       │   │               ├── TeamPullRequestMergedDetailsAction/
│       │   │               │   ├── index.jelly
│       │   │               │   └── summary.jelly
│       │   │               ├── TeamPushTrigger/
│       │   │               │   ├── TeamPollingAction/
│       │   │               │   │   └── index.jelly
│       │   │               │   ├── config.jelly
│       │   │               │   └── help.html
│       │   │               ├── TeamUpdateWorkItemPostBuildAction/
│       │   │               │   └── help.html
│       │   │               ├── browsers/
│       │   │               │   └── TeamSystemWebAccessBrowser/
│       │   │               │       └── config.jelly
│       │   │               ├── model/
│       │   │               │   ├── AliasOnlyUserAccountMapper/
│       │   │               │   │   └── config.groovy
│       │   │               │   ├── BuildCommand.json
│       │   │               │   ├── BuildWithParametersCommand.json
│       │   │               │   ├── ChangeLogSet/
│       │   │               │   │   ├── digest.jelly
│       │   │               │   │   ├── digest_fr.properties
│       │   │               │   │   ├── index.jelly
│       │   │               │   │   └── index_fr.properties
│       │   │               │   ├── DomainUserAccountMapper/
│       │   │               │   │   └── config.groovy
│       │   │               │   ├── GitPullRequestMergedEvent.json
│       │   │               │   ├── GitPushEvent.json
│       │   │               │   ├── ManualCredentialsConfigurer/
│       │   │               │   │   ├── config.groovy
│       │   │               │   │   └── help-userName.html
│       │   │               │   ├── TeamRequestedResult/
│       │   │               │   │   ├── config.groovy
│       │   │               │   │   └── help-includes.html
│       │   │               │   └── native/
│       │   │               │       ├── aix/
│       │   │               │       │   └── ppc/
│       │   │               │       │       ├── libnative_auth.a
│       │   │               │       │       ├── libnative_console.a
│       │   │               │       │       ├── libnative_filesystem.a
│       │   │               │       │       ├── libnative_misc.a
│       │   │               │       │       └── libnative_synchronization.a
│       │   │               │       ├── hpux/
│       │   │               │       │   └── PA_RISC/
│       │   │               │       │       ├── libnative_auth.sl
│       │   │               │       │       ├── libnative_console.sl
│       │   │               │       │       ├── libnative_filesystem.sl
│       │   │               │       │       ├── libnative_misc.sl
│       │   │               │       │       └── libnative_synchronization.sl
│       │   │               │       └── macosx/
│       │   │               │           ├── libnative_auth.jnilib
│       │   │               │           ├── libnative_console.jnilib
│       │   │               │           ├── libnative_filesystem.jnilib
│       │   │               │           ├── libnative_keychain.jnilib
│       │   │               │           ├── libnative_misc.jnilib
│       │   │               │           └── libnative_synchronization.jnilib
│       │   │               └── rm/
│       │   │                   ├── ReleaseManagementCI/
│       │   │                   │   ├── config.jelly
│       │   │                   │   ├── help-collectionUrl.html
│       │   │                   │   ├── help-credentialsId.html
│       │   │                   │   ├── help-destinationPath.html
│       │   │                   │   ├── help-isArchiveLog.html
│       │   │                   │   ├── help-projectName.html
│       │   │                   │   ├── help-releaseDefinitionName.html
│       │   │                   │   └── help.html
│       │   │                   ├── ReleaseSummaryAction/
│       │   │                   │   └── summary.jelly
│       │   │                   ├── ReleaseWebHook/
│       │   │                   │   ├── config.groovy
│       │   │                   │   ├── help-payloadUrl.html
│       │   │                   │   ├── help-secret.html
│       │   │                   │   └── help-webhookName.html
│       │   │                   ├── ReleaseWebHookAction/
│       │   │                   │   └── config.groovy
│       │   │                   ├── ReleaseWebHookReference/
│       │   │                   │   ├── config.groovy
│       │   │                   │   └── help-webHookName.html
│       │   │                   └── ReleaseWebHookSummaryAction/
│       │   │                       └── summary.jelly
│       │   └── webapp/
│       │       ├── WEB-INF/
│       │       │   └── lib/
│       │       │       ├── ThirdPartyNotices.html
│       │       │       ├── license.html
│       │       │       └── redist.txt
│       │       ├── browsers/
│       │       │   └── tswa.html
│       │       └── labelname.html
│       └── test/
│           ├── java/
│           │   ├── hudson/
│           │   │   ├── plugins/
│           │   │   │   └── tfs/
│           │   │   │       ├── ChangeSetReaderTest.java
│           │   │   │       ├── ChangeSetWriterTest.java
│           │   │   │       ├── CommitParameterActionTest.java
│           │   │   │       ├── EndToEndTfs.java
│           │   │   │       ├── FunctionalTest.java
│           │   │   │       ├── IntegrationTestHelper.java
│           │   │   │       ├── IntegrationTestHelperTest.java
│           │   │   │       ├── IntegrationTests.java
│           │   │   │       ├── InterceptingTaskListener.java
│           │   │   │       ├── LoggingFiltersSourceAdapter.java
│           │   │   │       ├── SwedishLocaleTestCase.java
│           │   │   │       ├── TFSRevisionStateTest.java
│           │   │   │       ├── TeamBuildEndpointTest.java
│           │   │   │       ├── TeamCollectionConfigurationTest.java
│           │   │   │       ├── TeamEventsEndpointTest.java
│           │   │   │       ├── TeamFoundationServerScmIntegrationTest.java
│           │   │   │       ├── TeamFoundationServerScmTest.java
│           │   │   │       ├── Util.java
│           │   │   │       ├── actions/
│           │   │   │       │   ├── CheckoutActionTest.java
│           │   │   │       │   └── RemoveWorkspaceActionTest.java
│           │   │   │       ├── browsers/
│           │   │   │       │   └── TeamSystemWebAccessBrowserTest.java
│           │   │   │       ├── commands/
│           │   │   │       │   ├── AbstractCallableCommandTest.java
│           │   │   │       │   ├── AbstractCommandTest.java
│           │   │   │       │   ├── DeleteWorkspaceCommandTest.java
│           │   │   │       │   ├── GetFilesToWorkFolderCommandTest.java
│           │   │   │       │   ├── LabelCommandTest.java
│           │   │   │       │   ├── ListWorkspacesCommandTest.java
│           │   │   │       │   ├── NewWorkspaceCommandTest.java
│           │   │   │       │   └── RemoteChangesetVersionCommandTest.java
│           │   │   │       ├── model/
│           │   │   │       │   ├── AbstractHookEventTest.java
│           │   │   │       │   ├── ChangeLogSetIntegrationTest.java
│           │   │   │       │   ├── ChangeLogSetTest.java
│           │   │   │       │   ├── ChangeSetTest.java
│           │   │   │       │   ├── GitCodePushedEventArgsTest.java
│           │   │   │       │   ├── GitPullRequestMergedEventTest.java
│           │   │   │       │   ├── GitPushEventTest.java
│           │   │   │       │   ├── GitStatusContextTest.java
│           │   │   │       │   ├── NativeLibraryManagerTest.java
│           │   │   │       │   ├── ProjectTest.java
│           │   │   │       │   ├── PullRequestMergeCommitCreatedEventArgsTest.java
│           │   │   │       │   ├── ServerIntegrationTest.java
│           │   │   │       │   ├── ServerTest.java
│           │   │   │       │   ├── TeamGitStatusTest.java
│           │   │   │       │   ├── WorkspaceConfigurationTest.java
│           │   │   │       │   ├── WorkspacesTest.java
│           │   │   │       │   └── servicehooks/
│           │   │   │       │       └── EventScopeTest.java
│           │   │   │       └── util/
│           │   │   │           ├── BuildVariableResolverTest.java
│           │   │   │           ├── BuildWorkspaceConfigurationRetrieverTest.java
│           │   │   │           ├── DateUtilTest.java
│           │   │   │           ├── KeyValueTextReaderTest.java
│           │   │   │           ├── MaskedArgumentListBuilderTest.java
│           │   │   │           ├── QueryStringTest.java
│           │   │   │           ├── StringHelperTest.java
│           │   │   │           ├── TeamRestClientTest.java
│           │   │   │           ├── TextTableParserTest.java
│           │   │   │           ├── UriHelperTest.java
│           │   │   │           └── XmlHelperTest.java
│           │   │   └── util/
│           │   │       └── SecretOverride.java
│           │   └── jenkins/
│           │       └── security/
│           │           └── ConfidentialStoreOverride.java
│           └── resources/
│               ├── hudson/
│               │   └── plugins/
│               │       └── tfs/
│               │           ├── FunctionalTest/
│               │           │   ├── agent/
│               │           │   │   ├── config.xml
│               │           │   │   ├── hudson.plugins.tfs.TeamFoundationServerScm.xml
│               │           │   │   ├── identity.key.enc
│               │           │   │   ├── jobs/
│               │           │   │   │   └── agent/
│               │           │   │   │       ├── builds/
│               │           │   │   │       │   ├── 2015-07-15_20-37-42/
│               │           │   │   │       │   │   ├── build.xml
│               │           │   │   │       │   │   ├── changelog.xml
│               │           │   │   │       │   │   └── log
│               │           │   │   │       │   ├── lastFailedBuild
│               │           │   │   │       │   ├── lastStableBuild
│               │           │   │   │       │   ├── lastSuccessfulBuild
│               │           │   │   │       │   ├── lastUnstableBuild
│               │           │   │   │       │   ├── lastUnsuccessfulBuild
│               │           │   │   │       │   └── legacyIds
│               │           │   │   │       ├── config.xml
│               │           │   │   │       └── nextBuildNumber
│               │           │   │   └── secret.key
│               │           │   ├── cloakedPaths/
│               │           │   │   ├── config.xml
│               │           │   │   ├── hudson.plugins.tfs.TeamFoundationServerScm.xml
│               │           │   │   ├── identity.key.enc
│               │           │   │   ├── jobs/
│               │           │   │   │   └── cloakedPaths/
│               │           │   │   │       ├── builds/
│               │           │   │   │       │   ├── 2015-07-15_20-37-42/
│               │           │   │   │       │   │   ├── build.xml
│               │           │   │   │       │   │   ├── changelog.xml
│               │           │   │   │       │   │   └── log
│               │           │   │   │       │   ├── lastFailedBuild
│               │           │   │   │       │   ├── lastStableBuild
│               │           │   │   │       │   ├── lastSuccessfulBuild
│               │           │   │   │       │   ├── lastUnstableBuild
│               │           │   │   │       │   ├── lastUnsuccessfulBuild
│               │           │   │   │       │   └── legacyIds
│               │           │   │   │       ├── config.xml
│               │           │   │   │       └── nextBuildNumber
│               │           │   │   └── secret.key
│               │           │   ├── createLabel/
│               │           │   │   ├── config.xml
│               │           │   │   ├── hudson.plugins.tfs.TeamFoundationServerScm.xml
│               │           │   │   ├── identity.key.enc
│               │           │   │   ├── jobs/
│               │           │   │   │   └── createLabel/
│               │           │   │   │       ├── builds/
│               │           │   │   │       │   ├── 2015-07-15_20-37-42/
│               │           │   │   │       │   │   ├── build.xml
│               │           │   │   │       │   │   ├── changelog.xml
│               │           │   │   │       │   │   └── log
│               │           │   │   │       │   ├── lastFailedBuild
│               │           │   │   │       │   ├── lastStableBuild
│               │           │   │   │       │   ├── lastSuccessfulBuild
│               │           │   │   │       │   ├── lastUnstableBuild
│               │           │   │   │       │   ├── lastUnsuccessfulBuild
│               │           │   │   │       │   └── legacyIds
│               │           │   │   │       ├── config.xml
│               │           │   │   │       └── nextBuildNumber
│               │           │   │   └── secret.key
│               │           │   ├── newJob/
│               │           │   │   ├── config.xml
│               │           │   │   ├── hudson.plugins.tfs.TeamFoundationServerScm.xml
│               │           │   │   ├── identity.key.enc
│               │           │   │   ├── jobs/
│               │           │   │   │   └── newJob/
│               │           │   │   │       ├── builds/
│               │           │   │   │       │   ├── lastFailedBuild
│               │           │   │   │       │   ├── lastStableBuild
│               │           │   │   │       │   ├── lastSuccessfulBuild
│               │           │   │   │       │   ├── lastUnstableBuild
│               │           │   │   │       │   ├── lastUnsuccessfulBuild
│               │           │   │   │       │   └── legacyIds
│               │           │   │   │       ├── config.xml
│               │           │   │   │       └── nextBuildNumber
│               │           │   │   └── secret.key
│               │           │   ├── oldPollingFallback/
│               │           │   │   ├── config.xml
│               │           │   │   ├── identity.key.enc
│               │           │   │   ├── jobs/
│               │           │   │   │   └── oldPollingFallback/
│               │           │   │   │       ├── builds/
│               │           │   │   │       │   ├── 2015-07-10_12-11-34/
│               │           │   │   │       │   │   ├── build.xml
│               │           │   │   │       │   │   ├── log
│               │           │   │   │       │   │   └── polling.log
│               │           │   │   │       │   ├── lastFailedBuild
│               │           │   │   │       │   ├── lastStableBuild
│               │           │   │   │       │   ├── lastSuccessfulBuild
│               │           │   │   │       │   ├── lastUnstableBuild
│               │           │   │   │       │   ├── lastUnsuccessfulBuild
│               │           │   │   │       │   └── legacyIds
│               │           │   │   │       ├── config.xml
│               │           │   │   │       └── nextBuildNumber
│               │           │   │   └── secret.key
│               │           │   ├── upgradeEncodedPassword/
│               │           │   │   ├── config.xml
│               │           │   │   ├── identity.key.enc
│               │           │   │   ├── jobs/
│               │           │   │   │   └── upgradeEncodedPassword/
│               │           │   │   │       ├── builds/
│               │           │   │   │       │   ├── 2015-07-15_20-37-42/
│               │           │   │   │       │   │   ├── build.xml
│               │           │   │   │       │   │   ├── changelog.xml
│               │           │   │   │       │   │   └── log
│               │           │   │   │       │   ├── lastFailedBuild
│               │           │   │   │       │   ├── lastStableBuild
│               │           │   │   │       │   ├── lastSuccessfulBuild
│               │           │   │   │       │   ├── lastUnstableBuild
│               │           │   │   │       │   ├── lastUnsuccessfulBuild
│               │           │   │   │       │   └── legacyIds
│               │           │   │   │       ├── config.xml
│               │           │   │   │       └── nextBuildNumber
│               │           │   │   └── secret.key
│               │           │   └── useWebProxyServer/
│               │           │       ├── config.xml
│               │           │       ├── hudson.plugins.tfs.TeamFoundationServerScm.xml
│               │           │       ├── identity.key.enc
│               │           │       ├── jobs/
│               │           │       │   └── useWebProxyServer/
│               │           │       │       ├── builds/
│               │           │       │       │   ├── 2015-07-15_20-37-42/
│               │           │       │       │   │   ├── build.xml
│               │           │       │       │   │   ├── changelog.xml
│               │           │       │       │   │   └── log
│               │           │       │       │   ├── lastFailedBuild
│               │           │       │       │   ├── lastStableBuild
│               │           │       │       │   ├── lastSuccessfulBuild
│               │           │       │       │   ├── lastUnstableBuild
│               │           │       │       │   ├── lastUnsuccessfulBuild
│               │           │       │       │   └── legacyIds
│               │           │       │       ├── config.xml
│               │           │       │       └── nextBuildNumber
│               │           │       ├── proxy.xml
│               │           │       └── secret.key
│               │           ├── action/
│               │           │   ├── tf-changeset-1.log
│               │           │   ├── tf-changeset-2.log
│               │           │   └── tf-changeset-3.log
│               │           ├── commands/
│               │           │   ├── issue-3683.txt
│               │           │   ├── issue-4184.txt
│               │           │   ├── issue-4943.txt
│               │           │   ├── issue-6454.txt
│               │           │   ├── issue-6870-2.txt
│               │           │   ├── issue-6870.txt
│               │           │   ├── tf-changeset-1.txt
│               │           │   ├── tf-changeset-2.txt
│               │           │   ├── tf-changeset-3.txt
│               │           │   ├── tf-changeset-german-1.txt
│               │           │   └── tf-workfold-list.txt
│               │           ├── git.push-sample.json
│               │           └── util/
│               │               └── XmlHelperTest/
│               │                   ├── peekValue_File/
│               │                   │   └── input.xml
│               │                   └── pokeValue_File/
│               │                       ├── expected.xml
│               │                       └── input.xml
│               ├── tf-get.log
│               ├── tf-history.log
│               ├── tf-workfold.log
│               ├── tf-workspace.log
│               ├── tf-workspaces.log
│               ├── tf.bat
│               └── tf.sh
└── tfs-sdk/
    ├── pom.xml
    └── src/
        └── com.microsoft.tfs.sdk-14.0.3.jar
Download .txt
SYMBOL INDEX (1735 symbols across 208 files)

FILE: tfs/src/main/java/hudson/plugins/tfs/ChangeSetReader.java
  class ChangeSetReader (line 27) | public class ChangeSetReader extends ChangeLogParser {
    method parse (line 29) | @Override
    method parse (line 37) | public ChangeLogSet parse(final Run build, final RepositoryBrowser<?> ...

FILE: tfs/src/main/java/hudson/plugins/tfs/ChangeSetWriter.java
  class ChangeSetWriter (line 23) | public class ChangeSetWriter {
    method write (line 32) | @SuppressFBWarnings(value = "DM_DEFAULT_ENCODING", justification = "Be...
    method write (line 47) | public void write(List<ChangeSet> changeSets, Writer output) {
    method write (line 63) | private void write(ChangeSet changeSet, PrintWriter writer) {
    method escapeForXml (line 91) | private String escapeForXml(Object object)

FILE: tfs/src/main/java/hudson/plugins/tfs/CommitParameterAction.java
  class CommitParameterAction (line 15) | public class CommitParameterAction extends RevisionParameterAction {
    method CommitParameterAction (line 22) | public CommitParameterAction(final GitCodePushedEventArgs e) {
    method getGitCodePushedEventArgs (line 31) | public GitCodePushedEventArgs getGitCodePushedEventArgs() {
    method canOriginateFrom (line 38) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/JenkinsEventNotifier.java
  class JenkinsEventNotifier (line 33) | public final class JenkinsEventNotifier {
    method JenkinsEventNotifier (line 40) | private JenkinsEventNotifier() { }
    method sendJobCompletionEvent (line 45) | public static void sendJobCompletionEvent(final JSONObject payload) {
    method getApiJson (line 70) | public static String getApiJson(final String url) {
    method getPayloadSignature (line 120) | public static String getPayloadSignature(final String secret, final St...
    method urlCombine (line 128) | private static String urlCombine(final String url, final String... par...
    method toHexString (line 144) | private static String toHexString(final byte[] bytes) {

FILE: tfs/src/main/java/hudson/plugins/tfs/PullRequestParameterAction.java
  class PullRequestParameterAction (line 8) | public class PullRequestParameterAction extends CommitParameterAction {
    method PullRequestParameterAction (line 12) | public PullRequestParameterAction(final PullRequestMergeCommitCreatedE...
    method getPullRequestMergeCommitCreatedEventArgs (line 17) | public PullRequestMergeCommitCreatedEventArgs getPullRequestMergeCommi...

FILE: tfs/src/main/java/hudson/plugins/tfs/SafeParametersAction.java
  class SafeParametersAction (line 21) | @Restricted(NoExternalUse.class)
    method SafeParametersAction (line 26) | public SafeParametersAction(final List<ParameterValue> parameters) {
    method SafeParametersAction (line 30) | public SafeParametersAction(final ParameterValue... parameters) {
    method getParameters (line 34) | @Override
    method getParameter (line 39) | @Override
    class SafeParametersActionEnvironmentContributor (line 53) | @Extension
      method buildEnvironmentFor (line 56) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/TFSLabeler.java
  class TFSLabeler (line 30) | public class TFSLabeler extends Notifier {
    class DescriptorImpl (line 37) | @Extension
      method DescriptorImpl (line 39) | public DescriptorImpl() {
      method getDisplayName (line 43) | @Override
      method isApplicable (line 48) | @Override
    method TFSLabeler (line 54) | @DataBoundConstructor
    method perform (line 60) | @Override
    method computeDynamicValue (line 105) | private String computeDynamicValue(AbstractBuild build, String paramet...
    method getRequiredMonitorService (line 124) | public BuildStepMonitor getRequiredMonitorService() {
    method getWhenToLabel (line 128) | public String getWhenToLabel() {
    method getLabelName (line 132) | public String getLabelName() {

FILE: tfs/src/main/java/hudson/plugins/tfs/TFSRevisionState.java
  class TFSRevisionState (line 9) | @ExportedBean
    method TFSRevisionState (line 17) | public TFSRevisionState(String changesetVersion, String projectPath) {
    method TFSRevisionState (line 22) | public TFSRevisionState(int changesetVersion, String projectPath) {

FILE: tfs/src/main/java/hudson/plugins/tfs/TeamBuildDetailsAction.java
  class TeamBuildDetailsAction (line 18) | @ExportedBean(defaultVisibility = 999)
    method TeamBuildDetailsAction (line 25) | public TeamBuildDetailsAction() {
    method TeamBuildDetailsAction (line 29) | public TeamBuildDetailsAction(final Map<String, String> buildVariables) {
    method determineBuildUrl (line 34) | static URI determineBuildUrl(final Map<String, String> buildVariables) {
    method getIconFileName (line 50) | @Override
    method getDisplayName (line 55) | @Override
    method getUrlName (line 60) | @Override
    method getBuildNumber (line 67) | @Exported
    method getBuildDefinitionName (line 72) | @Exported
    method getBuildUrl (line 77) | @Exported

FILE: tfs/src/main/java/hudson/plugins/tfs/TeamBuildEndpoint.java
  class TeamBuildEndpoint (line 54) | @Extension
    method getIconFileName (line 76) | @Override
    method getDisplayName (line 81) | @Override
    method getUrlName (line 86) | @Override
    method getCommandName (line 91) | public String getCommandName() {
    method getJobName (line 95) | public String getJobName() {
    method decodeCommandAndJobNames (line 99) | boolean decodeCommandAndJobNames(final String pathInfo) {
    method doIndex (line 125) | public HttpResponse doIndex(final HttpServletRequest request) throws I...
    method describeCommands (line 140) | static String describeCommands(final Map<String, AbstractCommand.Facto...
    method checkPermission (line 157) | @SuppressWarnings("deprecation" /* We want to do exactly what Jenkins ...
    method dispatch (line 165) | void dispatch(final StaplerRequest req, final StaplerResponse rsp, fin...
    method getBranch (line 203) | private String getBranch(final String jobName, final StaplerRequest re...
    method getJobNameFromNestedFolder (line 231) | private String getJobNameFromNestedFolder(final String jobName) {
    method getJob (line 240) | private Job getJob(final String jobName, final StaplerRequest req) {
    method innerDispatch (line 275) | private JSONObject innerDispatch(final StaplerRequest req, final Stapl...
    method doPing (line 315) | public void doPing(
    method doBuild (line 326) | public void doBuild(
    method doBuildWithParameters (line 341) | public void doBuildWithParameters(

FILE: tfs/src/main/java/hudson/plugins/tfs/TeamCollectResultsPostBuildAction.java
  class TeamCollectResultsPostBuildAction (line 35) | public class TeamCollectResultsPostBuildAction extends Recorder implemen...
    method TeamCollectResultsPostBuildAction (line 42) | @DataBoundConstructor
    method getRequestedResults (line 47) | public List<TeamRequestedResult> getRequestedResults() {
    method setRequestedResults (line 51) | @DataBoundSetter
    method perform (line 56) | @Override
    method getDescriptor (line 112) | @Override
    method getRequiredMonitorService (line 117) | @Override
    class DescriptorImpl (line 122) | @Extension
      method isApplicable (line 125) | @Override
      method getDisplayName (line 130) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/TeamCollectionConfiguration.java
  class TeamCollectionConfiguration (line 49) | public class TeamCollectionConfiguration extends AbstractDescribableImpl...
    method TeamCollectionConfiguration (line 57) | @DataBoundConstructor
    method getCollectionUrl (line 63) | public String getCollectionUrl() {
    method getCredentialsId (line 67) | public String getCredentialsId() {
    method getConnectionParameters (line 71) | public ConnectionParameters getConnectionParameters() {
    method getDescriptor (line 78) | @Override
    class DescriptorImpl (line 83) | @Extension
      method getDisplayName (line 86) | @Override
      method doCheckCollectionUrl (line 91) | @SuppressWarnings("unused")
      method doTestCredentials (line 119) | @SuppressWarnings("unused")
      method doFillCredentialsIdItems (line 149) | @SuppressWarnings("unused")
    method checkTeamServices (line 174) | static FormValidation checkTeamServices(final URI uri) {
    method areSameCollectionUri (line 181) | static boolean areSameCollectionUri(final URI a, final URI b) {
    method isTeamServices (line 198) | public static boolean isTeamServices(final String hostName) {
    method testConnection (line 202) | static FormValidation testConnection(final String collectionUri, final...
    method findCredential (line 226) | static StandardUsernamePasswordCredentials findCredential(final String...
    method findCredentials (line 233) | public static List<StandardUsernamePasswordCredentials> findCredential...
    method findCredentials (line 238) | public static List<StandardUsernamePasswordCredentials> findCredential...
    method findCredentials (line 250) | public static List<StandardUsernamePasswordCredentials> findCredential...
    method findCredentialsById (line 262) | public static StandardUsernamePasswordCredentials findCredentialsById(...
    method setCredentials (line 276) | public static String setCredentials(final String hostName, String user...
    method findCredentialsForCollection (line 303) | public static StandardUsernamePasswordCredentials findCredentialsForCo...
    method findCollection (line 325) | public static TeamCollectionConfiguration findCollection(final URI col...
    method getConnectedCollections (line 339) | public static List<TeamCollectionConfiguration> getConnectedCollection...

FILE: tfs/src/main/java/hudson/plugins/tfs/TeamCompletedStatusPostBuildAction.java
  class TeamCompletedStatusPostBuildAction (line 26) | public class TeamCompletedStatusPostBuildAction extends Notifier impleme...
    method TeamCompletedStatusPostBuildAction (line 28) | @DataBoundConstructor
    method perform (line 33) | @Override
    method perform (line 45) | public void perform(final @Nonnull Run<?, ?> run, final @Nonnull TaskL...
    method getDisplayName (line 57) | String getDisplayName() {
    method getRequiredMonitorService (line 62) | @Override
    class DescriptorImpl (line 68) | @Extension
      method isApplicable (line 71) | @Override
      method getDisplayName (line 76) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/TeamEventsEndpoint.java
  class TeamEventsEndpoint (line 53) | @Extension
    method getIconFileName (line 73) | @Override
    method getDisplayName (line 78) | @Override
    method getUrlName (line 83) | @Override
    method doIndex (line 88) | public HttpResponse doIndex(final HttpServletRequest request) throws I...
    method describeEvents (line 104) | static String describeEvents(final Map<String, AbstractHookEvent.Facto...
    method pathInfoToEventName (line 121) | static String pathInfoToEventName(final String pathInfo) {
    method dispatch (line 137) | void dispatch(final StaplerRequest request, final StaplerResponse rsp,...
    method innerDispatch (line 162) | static JSONObject innerDispatch(final String body, final String eventN...
    method deserializeEvent (line 174) | public static Event deserializeEvent(final String input) throws IOExce...
    method doPing (line 188) | @RequirePOST
    method doGitPullRequestMerged (line 196) | @RequirePOST
    method doGitPush (line 208) | @RequirePOST
    method doConnect (line 219) | @RequirePOST
    method doRmwebhook (line 230) | @RequirePOST
    method findTrigger (line 240) | public static <T extends Trigger> T findTrigger(final Job<?, ?> job, f...
    method findTriggers (line 253) | public static <T extends Trigger> List<T> findTriggers(final Job<?, ?>...
    class PollingScheduledResponseContributor (line 271) | public static class PollingScheduledResponseContributor extends GitSta...
      method PollingScheduledResponseContributor (line 282) | public PollingScheduledResponseContributor(Item project) {
      method addHeaders (line 289) | @Override
      method writeBody (line 297) | @Override
    class ScheduledResponseContributor (line 303) | public static class ScheduledResponseContributor extends GitStatus.Res...
      method ScheduledResponseContributor (line 314) | public ScheduledResponseContributor(Item project) {
      method addHeaders (line 321) | @Override
      method writeBody (line 329) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/TeamFoundationServerScm.java
  class TeamFoundationServerScm (line 73) | public class TeamFoundationServerScm extends SCM {
    method TeamFoundationServerScm (line 112) | TeamFoundationServerScm(final String serverUrl, final String projectPa...
    method TeamFoundationServerScm (line 129) | @DataBoundConstructor
    method readResolve (line 138) | @SuppressWarnings("unused" /* Migrate legacy data */)
    method getServerUrl (line 151) | public String getServerUrl() {
    method getWorkspaceName (line 155) | public String getWorkspaceName() {
    method getProjectPath (line 159) | public String getProjectPath() {
    method getLocalPath (line 163) | public String getLocalPath() {
    method setLocalPath (line 167) | @DataBoundSetter
    method getVersionSpec (line 172) | public String getVersionSpec() {
    method setVersionSpec (line 176) | @DataBoundSetter
    method isUseUpdate (line 181) | public boolean isUseUpdate() {
    method setUseUpdate (line 185) | @DataBoundSetter
    method isUseOverwrite (line 190) | public boolean isUseOverwrite() {
    method setUseOverwrite (line 194) | @DataBoundSetter
    method getUserPassword (line 199) | public String getUserPassword() {
    method getPassword (line 203) | public Secret getPassword() {
    method getUserName (line 207) | public String getUserName() {
    method getCredentialsConfigurer (line 215) | public CredentialsConfigurer getCredentialsConfigurer() {
    method setCredentialsConfigurer (line 222) | @DataBoundSetter
    method getCloakedPaths (line 227) | public String getCloakedPaths() {
    method setCloakedPaths (line 231) | @DataBoundSetter
    method serializeCloakedPathCollectionToString (line 238) | static String serializeCloakedPathCollectionToString(final Collection<...
    method getWorkspaceName (line 242) | String getWorkspaceName(final Run<?, ?> build, final Computer computer) {
    method getServerUrl (line 256) | public String getServerUrl(final Run<?, ?> run) {
    method getProjectPath (line 260) | String getProjectPath(final Run<?, ?> run) {
    method getCloakedPaths (line 264) | Collection<String> getCloakedPaths(final Run<?, ?> run) {
    method substituteBuildParameter (line 277) | private String substituteBuildParameter(final Run<?, ?> run, final Str...
    method splitCloakedPaths (line 287) | static Collection<String> splitCloakedPaths(final String cloakedPaths) {
    method checkout (line 311) | @Override
    method determineVersionSpecFromBuild (line 364) | static VersionSpec determineVersionSpecFromBuild(final Run<?, ?> build...
    method recordWorkspaceChangesetVersion (line 384) | int recordWorkspaceChangesetVersion(final Run<?, ?> build, final TaskL...
    method setWorkspaceChangesetVersion (line 403) | void setWorkspaceChangesetVersion(final String workspaceChangesetVersi...
    method pollChanges (line 407) | @Override
    method processWorkspaceBeforeDeletion (line 426) | @Override
    method createServer (line 476) | protected Server createServer(final Launcher launcher, final TaskListe...
    method requiresWorkspaceForPolling (line 483) | @Override
    method supportsPolling (line 488) | @Override
    method createChangeLogParser (line 493) | @Override
    method getModuleRoot (line 498) | @Override
    method getBrowser (line 503) | @Override
    method guessBrowser (line 513) | @Override
    method setRepositoryBrowser (line 520) | public void setRepositoryBrowser(final TeamFoundationServerRepositoryB...
    method buildEnvVars (line 526) | @Override
    method buildEnvironment (line 536) | public void buildEnvironment(final Run<?, ?> build, final Map<String, ...
    method getDescriptor (line 571) | @Override
    class DescriptorImpl (line 577) | @Extension
      method isApplicable (line 584) | @Override
      method DescriptorImpl (line 589) | public DescriptorImpl() {
      method newInstance (line 594) | @Override
      method doRegexCheck (line 609) | private FormValidation doRegexCheck(final Pattern[] regexArray,
      method doFillServerUrlItems (line 629) | public ComboBoxModel doFillServerUrlItems() {
      method doProjectPathCheck (line 640) | public FormValidation doProjectPathCheck(@QueryParameter final Strin...
      method doWorkspaceNameCheck (line 647) | public FormValidation doWorkspaceNameCheck(@QueryParameter final Str...
      method doCloakedPathsCheck (line 654) | public FormValidation doCloakedPathsCheck(@QueryParameter final Stri...
      method getCredentialsConfigurerDescriptors (line 660) | public List<CredentialsConfigurerDescriptor> getCredentialsConfigure...
      method configure (line 664) | @Override
      method getDisplayName (line 670) | @Override
    method calcRevisionsFromBuild (line 676) | @Override
    method compareRemoteRevisionWith (line 692) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/TeamGlobalStatusAction.java
  class TeamGlobalStatusAction (line 14) | public class TeamGlobalStatusAction extends InvisibleAction implements S...
    method addIfApplicable (line 19) | public static void addIfApplicable(final List<Action> actions) {
    method isApplicable (line 29) | public static boolean isApplicable(final Run<?, ?> run) {

FILE: tfs/src/main/java/hudson/plugins/tfs/TeamGlobalStatusPoster.java
  class TeamGlobalStatusPoster (line 13) | @Extension
    method onStarted (line 16) | @Override
    method onCompleted (line 24) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/TeamHookCause.java
  class TeamHookCause (line 8) | public class TeamHookCause extends GitStatus.CommitHookCause {
    method TeamHookCause (line 10) | public TeamHookCause(final String sha1) {
    method getShortDescription (line 14) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/TeamPRPushTrigger.java
  class TeamPRPushTrigger (line 11) | public class TeamPRPushTrigger extends TeamPushTrigger {
    method TeamPRPushTrigger (line 15) | @DataBoundConstructor
    method TeamPRPushTrigger (line 19) | public TeamPRPushTrigger(final Job<?, ?> job, final String targetBranc...
    method getTargetBranches (line 26) | public String getTargetBranches() {
    method setTargetBranches (line 30) | @DataBoundSetter
    class DescriptorImpl (line 38) | @Extension
      method getDisplayName (line 41) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/TeamPendingStatusBuildStep.java
  class TeamPendingStatusBuildStep (line 23) | public class TeamPendingStatusBuildStep extends Builder implements Simpl...
    method TeamPendingStatusBuildStep (line 25) | @DataBoundConstructor
    method perform (line 30) | @Override
    method perform (line 42) | public void perform(final @Nonnull Run<?, ?> run, final @Nonnull TaskL...
    method getDisplayName (line 54) | String getDisplayName() {
    class DescriptorImpl (line 59) | @Extension
      method isApplicable (line 62) | @Override
      method getDisplayName (line 67) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/TeamPluginGlobalConfig.java
  class TeamPluginGlobalConfig (line 24) | @Extension
    method TeamPluginGlobalConfig (line 38) | public TeamPluginGlobalConfig() {
    method TeamPluginGlobalConfig (line 42) | TeamPluginGlobalConfig(final boolean shouldLoadConfig) {
    method TeamPluginGlobalConfig (line 48) | public TeamPluginGlobalConfig(final List<TeamCollectionConfiguration> ...
    method get (line 52) | public static TeamPluginGlobalConfig get() {
    method getCollectionConfigurations (line 62) | public List<TeamCollectionConfiguration> getCollectionConfigurations() {
    method setCollectionConfigurations (line 66) | public void setCollectionConfigurations(final List<TeamCollectionConfi...
    method getReleaseWebHookConfigurations (line 70) | public List<ReleaseWebHook> getReleaseWebHookConfigurations() {
    method setReleaseWebHookConfigurations (line 74) | public void setReleaseWebHookConfigurations(final List<ReleaseWebHook>...
    method isConfigFolderPerNode (line 78) | public boolean isConfigFolderPerNode() {
    method setConfigFolderPerNode (line 82) | public void setConfigFolderPerNode(final boolean configFolderPerNode) {
    method isEnableTeamPushTriggerForAllJobs (line 86) | public boolean isEnableTeamPushTriggerForAllJobs() {
    method setEnableTeamPushTriggerForAllJobs (line 90) | public void setEnableTeamPushTriggerForAllJobs(final boolean enableTea...
    method isEnableTeamStatusForAllJobs (line 94) | public boolean isEnableTeamStatusForAllJobs() {
    method setEnableTeamStatusForAllJobs (line 98) | public void setEnableTeamStatusForAllJobs(final boolean enableTeamStat...
    method getUserAccountMapper (line 102) | public UserAccountMapper getUserAccountMapper() {
    method setUserAccountMapper (line 109) | public void setUserAccountMapper(UserAccountMapper userAccountMapper) {
    method getUserAccountMapperDescriptors (line 113) | public List<UserAccountMapperDescriptor> getUserAccountMapperDescripto...
    method configure (line 117) | @Override
    method getDisplayName (line 135) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/TeamPullRequestMergedDetailsAction.java
  class TeamPullRequestMergedDetailsAction (line 23) | @ExportedBean(defaultVisibility = 999)
    method TeamPullRequestMergedDetailsAction (line 33) | public TeamPullRequestMergedDetailsAction() {
    method TeamPullRequestMergedDetailsAction (line 37) | public TeamPullRequestMergedDetailsAction(final GitPullRequestEx gitPu...
    method addWorkItemsForRun (line 44) | public static URI addWorkItemsForRun(final Run<?, ?> run, final List<R...
    method getIconFileName (line 55) | @Override
    method getDisplayName (line 60) | @Override
    method getUrlName (line 65) | @Override
    method getMessage (line 72) | @Exported
    method getDetailedMessage (line 77) | @Exported
    method getWorkItems (line 82) | @Exported
    method hasWorkItems (line 87) | @Exported
    method getPullRequestUrl (line 93) | @Exported

FILE: tfs/src/main/java/hudson/plugins/tfs/TeamPushCause.java
  class TeamPushCause (line 12) | public class TeamPushCause extends SCMTriggerCause {
    method TeamPushCause (line 17) | public TeamPushCause(final String pushedBy, final String context) {
    method TeamPushCause (line 21) | public TeamPushCause(final File logFile, final String pushedBy, final ...
    method TeamPushCause (line 27) | public TeamPushCause(final String pollingLog, final String pushedBy, f...
    method getShortDescription (line 33) | @Override
    method equals (line 40) | @Override
    method hashCode (line 45) | @Override
    method getRunContext (line 50) | public String getRunContext() {

FILE: tfs/src/main/java/hudson/plugins/tfs/TeamPushTrigger.java
  class TeamPushTrigger (line 39) | public class TeamPushTrigger extends Trigger<Job<?, ?>> {
    method TeamPushTrigger (line 44) | @DataBoundConstructor
    method TeamPushTrigger (line 48) | public TeamPushTrigger(final Job<?, ?> job) {
    method TeamPushTrigger (line 52) | public TeamPushTrigger(final Job<?, ?> job, final String jobContext) {
    method execute (line 60) | public void execute(final GitCodePushedEventArgs gitCodePushedEventArg...
    method getLogFile (line 66) | public File getLogFile() {
    method getJobContext (line 70) | public String getJobContext() {
    method setJobContext (line 74) | @DataBoundSetter
    class Runner (line 83) | public class Runner implements Runnable {
      method Runner (line 89) | public Runner(final GitCodePushedEventArgs gitCodePushedEventArgs, f...
      method job (line 95) | private SCMTriggerItem job() {
      method runPolling (line 99) | private boolean runPolling() {
      method run (line 135) | @Override
    method getDescriptor (line 179) | @Override
    class DescriptorImpl (line 187) | @Extension
      method isApplicable (line 190) | @Override
      method getDisplayName (line 197) | @Override
    method getProjectActions (line 203) | @Override
    class TeamPollingAction (line 215) | public final class TeamPollingAction implements Action {
      method getIconFileName (line 217) | @Override
      method getDisplayName (line 222) | @Override
      method getUrlName (line 227) | @Override
      method getOwner (line 234) | @SuppressWarnings("unused")
      method getLog (line 242) | @SuppressWarnings("unused")
      method writeLogTo (line 250) | @SuppressWarnings("unused")

FILE: tfs/src/main/java/hudson/plugins/tfs/TeamResultsAction.java
  class TeamResultsAction (line 28) | @ExportedBean(defaultVisibility = 999)
    method onAttached (line 36) | @Override
    method onLoad (line 41) | @Override
    method getIconFileName (line 46) | @Override
    method getDisplayName (line 51) | @Override
    method getUrlName (line 56) | @Override
    method addToRun (line 61) | public static void addToRun(final Run<?, ?> run) {
    method doZip (line 66) | @SuppressWarnings("unused" /* API method */)

FILE: tfs/src/main/java/hudson/plugins/tfs/TeamUpdateWorkItemPostBuildAction.java
  class TeamUpdateWorkItemPostBuildAction (line 28) | @SuppressWarnings("unused" /* Jenkins extension */)
    method TeamUpdateWorkItemPostBuildAction (line 31) | @DataBoundConstructor
    method perform (line 36) | @Override
    method getRequiredMonitorService (line 67) | @Override
    class DescriptorImpl (line 76) | @Extension
      method isApplicable (line 79) | @Override
      method getDisplayName (line 84) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/UnsupportedIntegrationAction.java
  class UnsupportedIntegrationAction (line 16) | public class UnsupportedIntegrationAction extends InvisibleAction implem...
    method UnsupportedIntegrationAction (line 21) | public UnsupportedIntegrationAction(final String reason) {
    method isSupported (line 28) | public static boolean isSupported(@Nonnull final Run<?, ?> run, @Nonnu...
    method addToBuild (line 36) | public static void addToBuild(final List<Action> actions, final String...

FILE: tfs/src/main/java/hudson/plugins/tfs/actions/CheckoutAction.java
  class CheckoutAction (line 24) | public class CheckoutAction {
    method CheckoutAction (line 33) | public CheckoutAction(String workspaceName, String projectPath, Collec...
    method checkout (line 42) | public List<ChangeSet> checkout(Server server, FilePath workspacePath,...
    method checkout (line 57) | public List<ChangeSet> checkout(final Server server, final FilePath wo...
    method checkoutBySingleVersionSpec (line 72) | public List<ChangeSet> checkoutBySingleVersionSpec(Server server, File...
    method determineCheckoutPath (line 80) | static String determineCheckoutPath(final FilePath workspacePath, fina...
    method getProject (line 86) | private Project getProject(final Server server, final FilePath workspa...

FILE: tfs/src/main/java/hudson/plugins/tfs/actions/RemoveWorkspaceAction.java
  class RemoveWorkspaceAction (line 15) | public class RemoveWorkspaceAction {
    method RemoveWorkspaceAction (line 19) | public RemoveWorkspaceAction(String workspaceName) {
    method remove (line 23) | public boolean remove(Server server) throws IOException, InterruptedEx...

FILE: tfs/src/main/java/hudson/plugins/tfs/browsers/TeamFoundationServerRepositoryBrowser.java
  class TeamFoundationServerRepositoryBrowser (line 14) | public abstract class TeamFoundationServerRepositoryBrowser extends Repo...
    method getDiffLink (line 25) | public abstract URL getDiffLink(ChangeSet.Item item) throws IOException;
    method getFileLink (line 36) | public abstract URL getFileLink(ChangeSet.Item item) throws IOException;

FILE: tfs/src/main/java/hudson/plugins/tfs/browsers/TeamSystemWebAccessBrowser.java
  class TeamSystemWebAccessBrowser (line 22) | public class TeamSystemWebAccessBrowser extends TeamFoundationServerRepo...
    method TeamSystemWebAccessBrowser (line 28) | @DataBoundConstructor
    method getUrl (line 33) | public String getUrl() {
    method getServerConfiguration (line 37) | private String getServerConfiguration(final ChangeSet changeset) {
    method getBaseUrlString (line 49) | private String getBaseUrlString(final ChangeSet changeSet) throws Malf...
    method getChangeSetLink (line 61) | @Override
    method createChangeSetItemLink (line 68) | private URL createChangeSetItemLink(final ChangeSet.Item item, final S...
    method getFileLink (line 81) | public URL getFileLink(final ChangeSet.Item item) throws IOException {
    method getDiffLink (line 88) | public URL getDiffLink(final ChangeSet.Item item) throws IOException {
    class DescriptorImpl (line 98) | @Extension
      method DescriptorImpl (line 101) | public DescriptorImpl() {
      method getDisplayName (line 105) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/commands/AbstractCallableCommand.java
  class AbstractCallableCommand (line 19) | public abstract class AbstractCallableCommand<V, T extends Throwable> ex...
    method AbstractCallableCommand (line 28) | protected AbstractCallableCommand(final ServerConfigurationProvider se...
    method updateCache (line 37) | protected void updateCache(final TFSTeamProjectCollection connection) {
    method createServer (line 44) | public Server createServer() throws IOException {
    method getCallable (line 49) | public abstract <V, E extends Throwable> Callable<V, E> getCallable();

FILE: tfs/src/main/java/hudson/plugins/tfs/commands/AbstractCommand.java
  class AbstractCommand (line 8) | public abstract class AbstractCommand implements Command {
    method AbstractCommand (line 12) | public AbstractCommand(ServerConfigurationProvider configurationProvid...
    method addServerArgument (line 16) | protected void addServerArgument(ArgumentListBuilder arguments) {
    method addLoginArgument (line 20) | protected void addLoginArgument(MaskedArgumentListBuilder arguments) {
    method getConfig (line 28) | public ServerConfigurationProvider getConfig() {

FILE: tfs/src/main/java/hudson/plugins/tfs/commands/Command.java
  type Command (line 10) | public interface Command {
    method getArguments (line 16) | MaskedArgumentListBuilder getArguments();

FILE: tfs/src/main/java/hudson/plugins/tfs/commands/DeleteWorkspaceCommand.java
  class DeleteWorkspaceCommand (line 20) | public class DeleteWorkspaceCommand extends AbstractCallableCommand<Void...
    method DeleteWorkspaceCommand (line 28) | public DeleteWorkspaceCommand(final ServerConfigurationProvider server...
    method DeleteWorkspaceCommand (line 32) | public DeleteWorkspaceCommand(final ServerConfigurationProvider server...
    method getCallable (line 38) | public Callable<Void, IOException> getCallable() {
    method call (line 42) | public Void call() throws IOException {

FILE: tfs/src/main/java/hudson/plugins/tfs/commands/GetFilesToWorkFolderCommand.java
  class GetFilesToWorkFolderCommand (line 18) | public class GetFilesToWorkFolderCommand extends AbstractCallableCommand...
    method GetFilesToWorkFolderCommand (line 30) | public GetFilesToWorkFolderCommand(final ServerConfigurationProvider s...
    method GetFilesToWorkFolderCommand (line 35) | public GetFilesToWorkFolderCommand(final ServerConfigurationProvider s...
    method getCallable (line 44) | @Override
    method setLogger (line 49) | void setLogger(final PrintStream logger) {
    method call (line 53) | public Void call() throws Exception {
    method onGet (line 81) | public void onGet(final GetEvent getEvent) {

FILE: tfs/src/main/java/hudson/plugins/tfs/commands/GetWorkspaceMappingCommand.java
  class GetWorkspaceMappingCommand (line 13) | public class GetWorkspaceMappingCommand extends AbstractCallableCommand<...
    method GetWorkspaceMappingCommand (line 20) | public GetWorkspaceMappingCommand(final ServerConfigurationProvider se...
    method getCallable (line 25) | @Override
    method call (line 30) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/commands/LabelCommand.java
  class LabelCommand (line 23) | public class LabelCommand extends AbstractCallableCommand<Void, Exceptio...
    method LabelCommand (line 32) | public LabelCommand(final ServerConfigurationProvider configurationPro...
    method getLabelComment (line 42) | private String getLabelComment() {
    method getCallable (line 48) | @Override
    method call (line 53) | public Void call() throws Exception {

FILE: tfs/src/main/java/hudson/plugins/tfs/commands/ListWorkspacesCommand.java
  class ListWorkspacesCommand (line 21) | public class ListWorkspacesCommand extends AbstractCallableCommand<List<...
    type WorkspaceFactory (line 28) | public interface WorkspaceFactory {
      method createWorkspace (line 29) | Workspace createWorkspace(String name, String computer, String owner...
    method ListWorkspacesCommand (line 32) | public ListWorkspacesCommand(final ServerConfigurationProvider server) {
    method ListWorkspacesCommand (line 37) | ListWorkspacesCommand(final ServerConfigurationProvider server, final ...
    method getCallable (line 43) | @Override
    method call (line 48) | public List<Workspace> call() throws Exception {
    method parse (line 88) | public List<Workspace> parse(Reader consoleReader) throws IOException {
    method log (line 103) | static void log(final List<Workspace> workspaces, final PrintStream lo...

FILE: tfs/src/main/java/hudson/plugins/tfs/commands/NewWorkspaceCommand.java
  class NewWorkspaceCommand (line 24) | public class NewWorkspaceCommand extends AbstractCallableCommand<Void, E...
    method NewWorkspaceCommand (line 37) | public NewWorkspaceCommand(final ServerConfigurationProvider server, f...
    method getCallable (line 45) | public Callable<Void, Exception> getCallable() {
    method call (line 49) | public Void call() throws IOException {

FILE: tfs/src/main/java/hudson/plugins/tfs/commands/RemoteChangesetVersionCommand.java
  class RemoteChangesetVersionCommand (line 34) | public class RemoteChangesetVersionCommand extends AbstractCallableComma...
    method RemoteChangesetVersionCommand (line 43) | public RemoteChangesetVersionCommand(
    method getCallable (line 51) | public Callable<Integer, Exception> getCallable() {
    method call (line 55) | public Integer call() throws Exception {
    method toString (line 99) | public static String toString(final VersionSpec versionSpec) {
    method parse (line 122) | public String parse(Reader consoleReader) throws ParseException, IOExc...

FILE: tfs/src/main/java/hudson/plugins/tfs/commands/ServerConfigurationProvider.java
  type ServerConfigurationProvider (line 8) | public interface ServerConfigurationProvider {
    method getUrl (line 10) | public String getUrl();
    method getUserName (line 12) | public String getUserName();
    method getUserPassword (line 14) | public String getUserPassword();
    method getListener (line 16) | public TaskListener getListener();
    method getWebProxySettings (line 18) | public WebProxySettings getWebProxySettings();
    method getExtraSettings (line 20) | public ExtraSettings getExtraSettings();

FILE: tfs/src/main/java/hudson/plugins/tfs/listeners/JenkinsRunListener.java
  class JenkinsRunListener (line 19) | @Extension
    method JenkinsRunListener (line 23) | public JenkinsRunListener() {
    method onDeleted (line 27) | @Override
    method onStarted (line 31) | @Override
    method onFinalized (line 39) | @Override
    method onCompleted (line 43) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/model/AbstractCommand.java
  class AbstractCommand (line 12) | public abstract class AbstractCommand {
    method AbstractCommand (line 14) | public AbstractCommand() {
    type Factory (line 17) | public interface Factory {
      method create (line 18) | AbstractCommand create();
      method getSampleRequestPayload (line 19) | String getSampleRequestPayload();
    method perform (line 36) | public abstract JSONObject perform(final Job<?, ?> job, final Buildabl...

FILE: tfs/src/main/java/hudson/plugins/tfs/model/AbstractHookEvent.java
  class AbstractHookEvent (line 58) | public abstract class AbstractHookEvent {
    type Factory (line 66) | public interface Factory {
      method create (line 70) | AbstractHookEvent create();
      method getSampleRequestPayload (line 75) | String getSampleRequestPayload();
    method perform (line 91) | public abstract JSONObject perform(final ObjectMapper mapper, final Ev...
    method fromResponseContributors (line 93) | static JSONObject fromResponseContributors(final List<GitStatus.Respon...
    method triggerJob (line 112) | GitStatus.ResponseContributor triggerJob(final GitCodePushedEventArgs ...
    method repoMatches (line 189) | private Boolean repoMatches(final GitCodePushedEventArgs gitCodePushed...
    method branchMatches (line 211) | private Boolean branchMatches(final GitCodePushedEventArgs gitCodePush...
    method pollOrQueueFromEvent (line 252) | List<GitStatus.ResponseContributor> pollOrQueueFromEvent(final GitCode...
    method getDefaultParameters (line 357) | private ArrayList<ParameterValue> getDefaultParameters(final Job<?, ?>...
    method getVstsRefspec (line 371) | private String getVstsRefspec(final GitCodePushedEventArgs gitCodePush...

FILE: tfs/src/main/java/hudson/plugins/tfs/model/AliasOnlyUserAccountMapper.java
  class AliasOnlyUserAccountMapper (line 9) | public class AliasOnlyUserAccountMapper extends UserAccountMapper {
    method AliasOnlyUserAccountMapper (line 15) | @DataBoundConstructor
    method mapUserAccount (line 20) | @Override
    class DescriptorImpl (line 35) | @Extension
      method getDisplayName (line 37) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/model/AutomaticCredentialsConfigurer.java
  class AutomaticCredentialsConfigurer (line 13) | public class AutomaticCredentialsConfigurer extends CredentialsConfigurer {
    method AutomaticCredentialsConfigurer (line 19) | @DataBoundConstructor
    method getCredentials (line 24) | @Override
    class DescriptorImpl (line 33) | @Extension
      method getDisplayName (line 36) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/model/BuildCommand.java
  class BuildCommand (line 47) | public class BuildCommand extends AbstractCommand {
    method formatUnsupportedReason (line 63) | public static String formatUnsupportedReason(final String reason) {
    class Factory (line 67) | public static class Factory implements AbstractCommand.Factory {
      method create (line 68) | @Override
      method getSampleRequestPayload (line 73) | @Override
    method innerPerform (line 89) | protected JSONObject innerPerform(final Job job, final BuildableItem b...
    method perform (line 110) | @Override
    method cancelPreviousPullRequestBuilds (line 223) | private void cancelPreviousPullRequestBuilds(Job job, TeamPullRequestM...
    method contributeTeamBuildParameterActions (line 245) | static void contributeTeamBuildParameterActions(final Map<String, Stri...

FILE: tfs/src/main/java/hudson/plugins/tfs/model/BuildParameter.java
  class BuildParameter (line 8) | @SuppressFBWarnings(value = "UUF_UNUSED_PUBLIC_OR_PROTECTED_FIELD", just...

FILE: tfs/src/main/java/hudson/plugins/tfs/model/BuildWithParametersCommand.java
  class BuildWithParametersCommand (line 12) | public class BuildWithParametersCommand extends BuildCommand {
    class Factory (line 17) | public static class Factory implements AbstractCommand.Factory {
      method create (line 19) | @Override
      method getSampleRequestPayload (line 24) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/model/ChangeLogSet.java
  class ChangeLogSet (line 18) | @SuppressFBWarnings(value = "NM_SAME_SIMPLE_NAME_AS_SUPERCLASS", justifi...
    method ChangeLogSet (line 23) | public ChangeLogSet(final Run<?, ?> build, final RepositoryBrowser<?> ...
    method ChangeLogSet (line 31) | @Deprecated
    method ChangeLogSet (line 37) | public ChangeLogSet(final Run<?, ?> build, final RepositoryBrowser<?> ...
    method isEmptySet (line 46) | @Override
    method iterator (line 52) | public Iterator<ChangeSet> iterator() {

FILE: tfs/src/main/java/hudson/plugins/tfs/model/ChangeSet.java
  class ChangeSet (line 17) | @ExportedBean(defaultVisibility=999)
    method ChangeSet (line 30) | public ChangeSet() {
    method ChangeSet (line 34) | public ChangeSet(String version, Date date, String userString, String ...
    method ChangeSet (line 42) | public ChangeSet(String version, Date date, User author, String commen...
    method getAffectedPaths (line 51) | @Override
    method getAffectedFiles (line 60) | @Override
    method getParent (line 65) | @Override
    method getAuthor (line 70) | @Override
    method getMsg (line 78) | @Override
    method getVersion (line 83) | @Exported
    method setVersion (line 88) | public void setVersion(String version) {
    method getCommitId (line 98) | @Exported
    method getDomain (line 103) | @Exported
    method getUser (line 108) | @Exported
    method setUser (line 113) | public void setUser(String user) {
    method getDate (line 124) | @Exported
    method setDateStr (line 132) | public void setDateStr(String dateStr) throws ParseException {
    method getComment (line 136) | @Exported
    method setComment (line 141) | public void setComment(String comment) {
    method setCheckedInBy (line 145) | public void setCheckedInBy(String checkedInByUserString) {
    method getCheckedInBy (line 156) | public String getCheckedInBy() {
    method getCheckedInByUser (line 160) | public User getCheckedInByUser() {
    method setCheckedInByUser (line 167) | public void setCheckedInByUser(User checkedInBy) {
    method getItems (line 171) | @Exported
    method add (line 176) | public void add(ChangeSet.Item item) {
    method setParent (line 181) | @Override
    class Item (line 186) | @ExportedBean(defaultVisibility=999)
      method Item (line 192) | public Item() {
      method Item (line 196) | public Item(String path, String action) {
      method getParent (line 201) | public ChangeSet getParent() {
      method setParent (line 205) | void setParent(ChangeSet parent) {
      method getPath (line 209) | @Exported
      method setPath (line 214) | public void setPath(String path) {
      method getAction (line 218) | @Exported
      method setAction (line 223) | public void setAction(String action) {
      method getEditType (line 227) | @Exported

FILE: tfs/src/main/java/hudson/plugins/tfs/model/ClonePersistenceStoreProvider.java
  class ClonePersistenceStoreProvider (line 11) | public class ClonePersistenceStoreProvider implements PersistenceStorePr...
    method ClonePersistenceStoreProvider (line 18) | public ClonePersistenceStoreProvider(final PersistenceStoreProvider so...
    method createAndCopy (line 34) | static File createAndCopy(final FilesystemPersistenceStore sourceStore...
    method getCachePersistenceStore (line 51) | public FilesystemPersistenceStore getCachePersistenceStore() {
    method getConfigurationPersistenceStore (line 55) | public FilesystemPersistenceStore getConfigurationPersistenceStore() {
    method getLogPersistenceStore (line 59) | public FilesystemPersistenceStore getLogPersistenceStore() {
    method getHostName (line 63) | public String getHostName() {

FILE: tfs/src/main/java/hudson/plugins/tfs/model/ConnectHookEvent.java
  class ConnectHookEvent (line 14) | public class ConnectHookEvent extends AbstractHookEvent {
    class Factory (line 19) | public static class Factory implements AbstractHookEvent.Factory {
      method create (line 20) | @Override
      method getSampleRequestPayload (line 25) | @Override
    method perform (line 40) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/model/ConnectionParameters.java
  class ConnectionParameters (line 7) | public class ConnectionParameters {
    method ConnectionParameters (line 16) | public ConnectionParameters() {
    method getConnectionKey (line 19) | public String getConnectionKey() {
    method setConnectionKey (line 23) | public void setConnectionKey(final String connectionKey) {
    method getConnectionSignature (line 27) | public String getConnectionSignature() {
    method setConnectionSignature (line 31) | public void setConnectionSignature(final String connectionSignature) {
    method getTeamCollectionUrl (line 35) | public String getTeamCollectionUrl() {
    method setTeamCollectionUrl (line 39) | public void setTeamCollectionUrl(final String teamCollectionUrl) {
    method isSendJobCompletionEvents (line 43) | public boolean isSendJobCompletionEvents() {
    method setSendJobCompletionEvents (line 47) | public void setSendJobCompletionEvents(final boolean sendJobCompletion...

FILE: tfs/src/main/java/hudson/plugins/tfs/model/CredentialsConfigurer.java
  class CredentialsConfigurer (line 12) | public abstract class CredentialsConfigurer implements ExtensionPoint, D...
    method getDisplayName (line 15) | public final String getDisplayName() {
    method getDescriptor (line 19) | public CredentialsConfigurerDescriptor getDescriptor() {
    method getCredentials (line 24) | public abstract StandardUsernamePasswordCredentials getCredentials(fin...
    method all (line 26) | public static DescriptorExtensionList<CredentialsConfigurer, Credentia...

FILE: tfs/src/main/java/hudson/plugins/tfs/model/CredentialsConfigurerDescriptor.java
  class CredentialsConfigurerDescriptor (line 8) | public abstract class CredentialsConfigurerDescriptor extends Descriptor...

FILE: tfs/src/main/java/hudson/plugins/tfs/model/DomainUserAccountMapper.java
  class DomainUserAccountMapper (line 9) | public class DomainUserAccountMapper extends UserAccountMapper {
    method DomainUserAccountMapper (line 15) | @DataBoundConstructor
    method mapUserAccount (line 20) | @Override
    class DescriptorImpl (line 28) | @Extension
      method getDisplayName (line 30) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/model/ExtraSettings.java
  class ExtraSettings (line 15) | public class ExtraSettings implements Serializable {
    method ExtraSettings (line 23) | @SuppressWarnings("unused" /* Needed by Serializable interface */)
    method ExtraSettings (line 31) | public ExtraSettings(final TeamPluginGlobalConfig teamPluginGlobalConf...
    method isConfigFolderPerNode (line 48) | public boolean isConfigFolderPerNode() {
    method setConfigFolderPerNode (line 52) | public void setConfigFolderPerNode(final boolean configFolderPerNode) {
    method getNodeComputerName (line 56) | public String getNodeComputerName() {
    method setNodeComputerName (line 60) | public void setNodeComputerName(final String nodeComputerName) {

FILE: tfs/src/main/java/hudson/plugins/tfs/model/GitCodePushedEventArgs.java
  class GitCodePushedEventArgs (line 10) | public class GitCodePushedEventArgs implements Serializable {
    method getRepoURIish (line 21) | public URIish getRepoURIish() {

FILE: tfs/src/main/java/hudson/plugins/tfs/model/GitPullRequestEx.java
  class GitPullRequestEx (line 12) | public class GitPullRequestEx extends GitPullRequest {
    method getWorkItemRefs (line 18) | public ResourceRef[] getWorkItemRefs() {
    method setWorkItemRefs (line 28) | public void setWorkItemRefs(final ResourceRef[] workItemRefs) {

FILE: tfs/src/main/java/hudson/plugins/tfs/model/GitPullRequestMergedEvent.java
  class GitPullRequestMergedEvent (line 23) | public class GitPullRequestMergedEvent extends GitPushEvent {
    class Factory (line 28) | public static class Factory implements AbstractHookEvent.Factory {
      method create (line 30) | @Override
      method getSampleRequestPayload (line 35) | @Override
    method determineCreatedBy (line 41) | static String determineCreatedBy(final GitPullRequest gitPullRequest) {
    method determineMergeCommit (line 73) | static String determineMergeCommit(final GitPullRequest gitPullRequest) {
    method determineTargetBranch (line 79) | static String determineTargetBranch(final GitPullRequest gitPullReques...
    method perform (line 86) | @Override
    method decodeGitPullRequest (line 102) | static PullRequestMergeCommitCreatedEventArgs decodeGitPullRequest(fin...

FILE: tfs/src/main/java/hudson/plugins/tfs/model/GitPushEvent.java
  class GitPushEvent (line 27) | public class GitPushEvent extends AbstractHookEvent {
    class Factory (line 32) | public static class Factory implements AbstractHookEvent.Factory {
      method create (line 34) | @Override
      method getSampleRequestPayload (line 39) | @Override
    method perform (line 45) | @Override
    method determineCollectionUri (line 59) | static URI determineCollectionUri(final URI repoApiUri) {
    method determineCollectionUri (line 76) | static URI determineCollectionUri(final GitRepository repository, fina...
    method determineProjectId (line 97) | static String determineProjectId(final GitRepository repository) {
    method determineCommit (line 103) | static String determineCommit(final GitPush gitPush) {
    method determinePushedBy (line 112) | static String determinePushedBy(final GitPush gitPush) {
    method determineTargetBranch (line 118) | static String determineTargetBranch(final GitPush gitPush) {
    method decodeGitPush (line 125) | static GitCodePushedEventArgs decodeGitPush(final GitPush gitPush, fin...

FILE: tfs/src/main/java/hudson/plugins/tfs/model/GitStatusContext.java
  class GitStatusContext (line 7) | public class GitStatusContext {
    method GitStatusContext (line 11) | public GitStatusContext() {
    method GitStatusContext (line 14) | public GitStatusContext(final String name, final String genre) {
    method fromJsonString (line 19) | public static GitStatusContext fromJsonString(final String jsonString) {

FILE: tfs/src/main/java/hudson/plugins/tfs/model/GitStatusState.java
  type GitStatusState (line 10) | public enum GitStatusState {
    method caseInsensitiveValueOf (line 29) | @SuppressWarnings("unused" /* Invoked by Jackson via @JsonCreator */)
    method GitStatusState (line 43) | GitStatusState(final int value) {
    method getValue (line 47) | public int getValue() {

FILE: tfs/src/main/java/hudson/plugins/tfs/model/HttpMethod.java
  type HttpMethod (line 17) | public enum HttpMethod {
    method createClientMethod (line 19) | @Override
    method createClientMethod (line 27) | @Override
    method createClientMethod (line 34) | @Override
    method createClientMethod (line 46) | public com.microsoft.tfs.core.httpclient.HttpMethod createClientMethod...
    method innerCreateClientMethod (line 50) | PostMethod innerCreateClientMethod(final String uri, final String body...

FILE: tfs/src/main/java/hudson/plugins/tfs/model/JobCompletionEventArgs.java
  class JobCompletionEventArgs (line 6) | public class JobCompletionEventArgs {
    method JobCompletionEventArgs (line 17) | public JobCompletionEventArgs(final String serverKey, final String pay...
    method getServerKey (line 23) | public String getServerKey() {
    method getPayload (line 27) | public String getPayload() {
    method getPayloadSignature (line 31) | public String getPayloadSignature() {

FILE: tfs/src/main/java/hudson/plugins/tfs/model/JsonPatchOperation.java
  class JsonPatchOperation (line 11) | public class JsonPatchOperation {
    method getOp (line 17) | public Operation getOp() {
    method setOp (line 21) | public void setOp(Operation op) {
    method getPath (line 25) | public String getPath() {
    method setPath (line 29) | public void setPath(String path) {
    method getValue (line 33) | public Object getValue() {
    method setValue (line 37) | public void setValue(Object value) {

FILE: tfs/src/main/java/hudson/plugins/tfs/model/LegacyIdentityManagementService.java
  class LegacyIdentityManagementService (line 24) | public class LegacyIdentityManagementService implements IIdentityManagem...
    method readIdentities (line 26) | public TeamFoundationIdentity[] readIdentities(IdentityDescriptor[] pa...
    method readIdentity (line 31) | public TeamFoundationIdentity readIdentity(IdentityDescriptor paramIde...
    method readIdentities (line 36) | public TeamFoundationIdentity[] readIdentities(GUID[] paramArrayOfGUID...
    method readIdentities (line 40) | public TeamFoundationIdentity[][] readIdentities(IdentitySearchFactor ...
    method readIdentity (line 45) | public TeamFoundationIdentity readIdentity(IdentitySearchFactor search...
    method createApplicationGroup (line 51) | public IdentityDescriptor createApplicationGroup(String paramString1, ...
    method listApplicationGroups (line 55) | public TeamFoundationIdentity[] listApplicationGroups(String paramStri...
    method updateApplicationGroup (line 59) | public void updateApplicationGroup(IdentityDescriptor paramIdentityDes...
    method deleteApplicationGroup (line 64) | public void deleteApplicationGroup(IdentityDescriptor paramIdentityDes...
    method addMemberToApplicationGroup (line 68) | public void addMemberToApplicationGroup(IdentityDescriptor paramIdenti...
    method removeMemberFromApplicationGroup (line 72) | public void removeMemberFromApplicationGroup(IdentityDescriptor paramI...
    method isMember (line 77) | public boolean isMember(IdentityDescriptor paramIdentityDescriptor1, I...
    method refreshIdentity (line 81) | public boolean refreshIdentity(IdentityDescriptor paramIdentityDescrip...
    method getScopeName (line 85) | public String getScopeName(String paramString) {
    method isOwner (line 89) | public boolean isOwner(IdentityDescriptor paramIdentityDescriptor) {
    method isOwnedWellKnownGroup (line 93) | public boolean isOwnedWellKnownGroup(IdentityDescriptor paramIdentityD...
    method getIdentityDomainScope (line 97) | public String getIdentityDomainScope() {

FILE: tfs/src/main/java/hudson/plugins/tfs/model/Link.java
  class Link (line 9) | @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD", just...
    method Link (line 14) | public Link() {
    method Link (line 18) | public Link(final String rel, final String url) {

FILE: tfs/src/main/java/hudson/plugins/tfs/model/ListOfGitRepositories.java
  class ListOfGitRepositories (line 8) | public class ListOfGitRepositories {

FILE: tfs/src/main/java/hudson/plugins/tfs/model/ManualCredentialsConfigurer.java
  class ManualCredentialsConfigurer (line 14) | @SuppressFBWarnings(value = "SE_TRANSIENT_FIELD_NOT_RESTORED", justifica...
    method ManualCredentialsConfigurer (line 24) | @DataBoundConstructor
    method getUserName (line 30) | public String getUserName() {
    method getPassword (line 34) | public Secret getPassword() {
    method getCredentials (line 38) | @Override
    class DescriptorImpl (line 53) | @Extension
      method getDisplayName (line 56) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/model/MockableVersionControlClient.java
  class MockableVersionControlClient (line 27) | public class MockableVersionControlClient implements Closable {
    method MockableVersionControlClient (line 32) | public MockableVersionControlClient(final VersionControlClient vcc) {
    method close (line 36) | public void close() {
    method makeSureNotClosed (line 43) | private void makeSureNotClosed() {
    method createLabel (line 63) | public LabelResult[] createLabel(
    method createWorkspace (line 105) | public Workspace createWorkspace(
    method deleteWorkspace (line 138) | public void deleteWorkspace(final Workspace workspace) {
    method getConnection (line 143) | public TFSTeamProjectCollection getConnection() {
    method getEventEngine (line 154) | public VersionControlEventEngine getEventEngine() {
    method getLocalWorkspace (line 165) | public Workspace getLocalWorkspace(final String workspaceName, final S...
    method getLatestChangesetID (line 175) | public int getLatestChangesetID() {
    method getWorkspace (line 195) | public Workspace getWorkspace(final String localPath) throws ItemNotMa...
    method queryHistory (line 241) | public Changeset[] queryHistory(
    method queryLabels (line 292) | public VersionControlLabel[] queryLabels(
    method queryWorkspace (line 329) | public Workspace queryWorkspace(final String name, final String owner) {
    method queryWorkspaces (line 355) | public Workspace[] queryWorkspaces(
    method removeCachedWorkspace (line 369) | public WorkspaceInfo removeCachedWorkspace(final String workspaceName,...
    method tryGetWorkspace (line 385) | public Workspace tryGetWorkspace(final String localPath) {

FILE: tfs/src/main/java/hudson/plugins/tfs/model/ModernConnectionAdvisor.java
  class ModernConnectionAdvisor (line 15) | public class ModernConnectionAdvisor extends DefaultConnectionAdvisor {
    method ModernConnectionAdvisor (line 24) | public ModernConnectionAdvisor(final ProxyHostEx proxyHost) {
    method ModernConnectionAdvisor (line 33) | public ModernConnectionAdvisor(final ProxyHostEx proxyHost, final Pers...
    method getPersistenceStoreProvider (line 39) | @Override
    method getHTTPClientFactory (line 46) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/model/ModernHTTPClientFactory.java
  class ModernHTTPClientFactory (line 16) | public class ModernHTTPClientFactory extends DefaultHTTPClientFactory {
    method ModernHTTPClientFactory (line 24) | public ModernHTTPClientFactory(final ConnectionInstanceData connection...
    method ModernHTTPClientFactory (line 33) | public ModernHTTPClientFactory(final ConnectionInstanceData connection...
    method getUserAgentExtraString (line 38) | @Override
    method configureClientProxy (line 50) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/model/NativeLibraryExtractor.java
  type NativeLibraryExtractor (line 8) | public interface NativeLibraryExtractor {
    method extractFile (line 17) | void extractFile(String operatingSystem, String architecture, String f...

FILE: tfs/src/main/java/hudson/plugins/tfs/model/NativeLibraryManager.java
  class NativeLibraryManager (line 19) | public class NativeLibraryManager implements NativeLibraryExtractor {
    method compare (line 114) | @SuppressWarnings("ComparatorMethodParameterNotUsed" /* because of nul...
    method NativeLibraryManager (line 185) | public NativeLibraryManager(final PersistenceStore store) {
    method extractFiles (line 189) | public void extractFiles() throws IOException {
    method extractFiles (line 194) | static void extractFiles(final NativeLibraryExtractor extractor) throw...
    method extractFile (line 206) | public void extractFile(final String operatingSystem, final String arc...
    method buildPathToNativeFile (line 224) | static String buildPathToNativeFile(final String operatingSystem, fina...
    method initialize (line 236) | public static synchronized void initialize() throws IOException {

FILE: tfs/src/main/java/hudson/plugins/tfs/model/PingCommand.java
  class PingCommand (line 11) | public class PingCommand extends AbstractCommand {
    class Factory (line 13) | public static class Factory implements AbstractCommand.Factory {
      method create (line 14) | @Override
      method getSampleRequestPayload (line 19) | @Override
    method perform (line 31) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/model/PingHookEvent.java
  class PingHookEvent (line 8) | public class PingHookEvent extends AbstractHookEvent {
    class Factory (line 10) | public static class Factory implements AbstractHookEvent.Factory {
      method create (line 11) | @Override
      method getSampleRequestPayload (line 16) | @Override
    method perform (line 28) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/model/Project.java
  class Project (line 32) | public class Project {
    method Project (line 38) | public Project(Server server, String projectPath) {
    method getProjectPath (line 43) | public String getProjectPath() {
    method convertServerChange (line 47) | static hudson.plugins.tfs.model.ChangeSet.Item convertServerChange
    method convertServerChangeset (line 55) | public static hudson.plugins.tfs.model.ChangeSet convertServerChangeset
    method getVCCHistory (line 81) | public List<ChangeSet> getVCCHistory(VersionSpec fromVersion, VersionS...
    method getOrCreateUserLookup (line 108) | @SuppressFBWarnings(value = "DC_DOUBLECHECK", justification = "Only sy...
    method getDetailedHistory (line 129) | public List<ChangeSet> getDetailedHistory(Calendar fromTimestamp, Cale...
    method getDetailedHistory (line 135) | public List<ChangeSet> getDetailedHistory(final String singleVersionSp...
    method getBriefHistory (line 146) | public List<ChangeSet> getBriefHistory(Calendar fromTimestamp, Calenda...
    method getBriefHistory (line 158) | public List<ChangeSet> getBriefHistory(int fromChangeset, Calendar toT...
    method getLatestChangeset (line 168) | public ChangeSet getLatestChangeset() {
    method getLatestUncloakedChangeset (line 180) | public ChangeSet getLatestUncloakedChangeset(final int fromChangeset, ...
    method findLatestUncloakedChangeset (line 187) | static ChangeSet findLatestUncloakedChangeset(final Collection<String>...
    method getDetailedHistoryWithoutCloakedPaths (line 218) | public List<ChangeSet> getDetailedHistoryWithoutCloakedPaths(final Cal...
    method getDetailedHistoryWithoutCloakedPaths (line 224) | public List<ChangeSet> getDetailedHistoryWithoutCloakedPaths(final Ver...
    method isChangesetFullyCloaked (line 237) | static boolean isChangesetFullyCloaked(final Collection<String> change...
    method getFiles (line 262) | public void getFiles(String localPath, String versionSpec, boolean use...
    method getRemoteChangesetVersion (line 274) | public int getRemoteChangesetVersion(final String remotePath, final Ve...
    method extractChangesetNumber (line 279) | int extractChangesetNumber(final RemoteChangesetVersionCommand command) {
    method getRemoteChangesetVersion (line 291) | public int getRemoteChangesetVersion(final VersionSpec versionSpec) {
    method hashCode (line 295) | @Override
    method equals (line 300) | @Override
    method getUserLookup (line 312) | protected UserLookup getUserLookup() {
    method setUserLookup (line 316) | protected void setUserLookup(final UserLookup userLookup) {

FILE: tfs/src/main/java/hudson/plugins/tfs/model/ProxyHostEx.java
  class ProxyHostEx (line 6) | public class ProxyHostEx extends com.microsoft.tfs.core.httpclient.Proxy...
    method ProxyHostEx (line 11) | public ProxyHostEx(final String hostname, final int port, final String...
    method getProxyUser (line 17) | public String getProxyUser() {
    method getProxySecret (line 21) | public Secret getProxySecret() {
    method equals (line 25) | @Override
    method hashCode (line 30) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/model/PullRequestMergeCommitCreatedEventArgs.java
  class PullRequestMergeCommitCreatedEventArgs (line 4) | public class PullRequestMergeCommitCreatedEventArgs extends GitCodePushe...

FILE: tfs/src/main/java/hudson/plugins/tfs/model/Server.java
  class Server (line 38) | public class Server implements ServerConfigurationProvider, Closable {
    method Server (line 58) | public Server(final Launcher launcher, final TaskListener taskListener...
    method create (line 62) | public static Server create(final Launcher launcher, final TaskListene...
    method Server (line 78) | public Server(final Launcher launcher, final TaskListener taskListener...
    method determineGlobalConfig (line 141) | static TeamPluginGlobalConfig determineGlobalConfig(final VirtualChann...
    method determineProxyConfiguration (line 170) | static ProxyConfiguration determineProxyConfiguration(final VirtualCha...
    method getProject (line 197) | public Project getProject(String projectPath) {
    method getWorkspaces (line 204) | public Workspaces getWorkspaces() {
    method getVersionControlClient (line 211) | @SuppressFBWarnings(value = { "DC_DOUBLECHECK", "IS2_INCONSISTENT_SYNC...
    method getHttpClient (line 224) | public HttpClient getHttpClient() {
    method execute (line 228) | public <T, E extends Exception> T execute(final Callable<T, E> callabl...
    method getUrl (line 239) | public String getUrl() {
    method getUserName (line 243) | public String getUserName() {
    method getUserPassword (line 247) | public String getUserPassword() {
    method getLauncher (line 251) | public Launcher getLauncher() {
    method getWebProxySettings (line 255) | public WebProxySettings getWebProxySettings() {
    method getExtraSettings (line 259) | public ExtraSettings getExtraSettings() {
    method getListener (line 263) | public TaskListener getListener() {
    method close (line 267) | public synchronized void close() {
    method createIdentityManagementService (line 279) | public IIdentityManagementService createIdentityManagementService() {

FILE: tfs/src/main/java/hudson/plugins/tfs/model/TeamBuildPayload.java
  class TeamBuildPayload (line 11) | @SuppressFBWarnings(value = "NM_FIELD_NAMING_CONVENTION", justification ...

FILE: tfs/src/main/java/hudson/plugins/tfs/model/TeamGitStatus.java
  class TeamGitStatus (line 16) | public class TeamGitStatus {
    method fromRun (line 35) | public static TeamGitStatus fromRun(@Nonnull final Run<?, ?> run) {
    method fromJob (line 52) | public static TeamGitStatus fromJob(@Nonnull final Job job) {
    method getStatusContext (line 61) | private static GitStatusContext getStatusContext(@Nonnull final Job jo...
    method toJson (line 67) | public String toJson() {

FILE: tfs/src/main/java/hudson/plugins/tfs/model/TeamRequestedResult.java
  class TeamRequestedResult (line 21) | public class TeamRequestedResult extends AbstractDescribableImpl<TeamReq...
    method TeamRequestedResult (line 25) | @DataBoundConstructor
    method getTeamResultType (line 31) | public TeamResultType getTeamResultType() {
    method getIncludes (line 35) | public String getIncludes() {
    method setIncludes (line 39) | @DataBoundSetter
    class DescriptorImpl (line 44) | @Extension
      method getDisplayName (line 47) | @Override
      method doFillTeamResultTypeItems (line 52) | @SuppressWarnings("unused")
      method doCheckIncludes (line 63) | public FormValidation doCheckIncludes(

FILE: tfs/src/main/java/hudson/plugins/tfs/model/TeamResultType.java
  type TeamResultType (line 7) | public enum TeamResultType {
    method TeamResultType (line 18) | TeamResultType(final String folderName, final String displayName) {
    method getFolderName (line 23) | public String getFolderName() {
    method getDisplayName (line 27) | public String getDisplayName() {

FILE: tfs/src/main/java/hudson/plugins/tfs/model/TfsUserLookup.java
  class TfsUserLookup (line 19) | public class TfsUserLookup implements UserLookup {
    method TfsUserLookup (line 26) | public TfsUserLookup(final IIdentityManagementService ims, final UserA...
    method find (line 35) | public User find(final String accountName) {

FILE: tfs/src/main/java/hudson/plugins/tfs/model/UserAccountMapper.java
  class UserAccountMapper (line 13) | public abstract class UserAccountMapper implements ExtensionPoint, Descr...
    method getDisplayName (line 19) | public final String getDisplayName() {
    method getDescriptor (line 26) | public UserAccountMapperDescriptor getDescriptor() {
    method mapUserAccount (line 34) | public abstract String mapUserAccount(final String input);
    method all (line 39) | public static DescriptorExtensionList<UserAccountMapper, UserAccountMa...

FILE: tfs/src/main/java/hudson/plugins/tfs/model/UserAccountMapperDescriptor.java
  class UserAccountMapperDescriptor (line 8) | public abstract class UserAccountMapperDescriptor extends Descriptor<Use...

FILE: tfs/src/main/java/hudson/plugins/tfs/model/UserHomePersistenceStore.java
  class UserHomePersistenceStore (line 12) | public class UserHomePersistenceStore extends FilesystemPersistenceStore {
    method UserHomePersistenceStore (line 13) | public UserHomePersistenceStore(final File subDirectory) {
    method getItemOutputStream (line 17) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/model/UserLookup.java
  type UserLookup (line 8) | public interface UserLookup {
    method find (line 14) | User find(String accountName);

FILE: tfs/src/main/java/hudson/plugins/tfs/model/WebProxySettings.java
  class WebProxySettings (line 20) | public class WebProxySettings implements Serializable {
    method WebProxySettings (line 29) | @SuppressWarnings("unused" /* Needed by Serializable interface */)
    method WebProxySettings (line 47) | public WebProxySettings(final String hostName, final int port, final L...
    method WebProxySettings (line 61) | public WebProxySettings(final ProxyConfiguration proxyConfiguration) {
    method copyNoProxyHostPatterns (line 77) | private static ArrayList<Pattern> copyNoProxyHostPatterns(final List<P...
    method toProxyHost (line 93) | public ProxyHostEx toProxyHost(final String hostToProxy) {
    method toProxy (line 111) | public Proxy toProxy(final String hostToProxy) {
    method shouldProxy (line 139) | static boolean shouldProxy(final String host, final List<Pattern> noPr...
    method getHostName (line 151) | public String getHostName() {
    method getPort (line 155) | public int getPort() {
    method getProxyUser (line 159) | public String getProxyUser() {
    method getProxySecret (line 163) | public Secret getProxySecret() {

FILE: tfs/src/main/java/hudson/plugins/tfs/model/WorkItem.java
  class WorkItem (line 11) | public class WorkItem
    method getFields (line 19) | public HashMap<String, Object> getFields() {
    method setFields (line 23) | public void setFields(final HashMap<String, Object> fields) {
    method getId (line 27) | public int getId() {
    method setId (line 31) | public void setId(final int id) {
    method getRelations (line 35) | public ArrayList<WorkItemRelation> getRelations() {
    method setRelations (line 39) | public void setRelations(final ArrayList<WorkItemRelation> relations) {
    method getRev (line 43) | public int getRev() {
    method setRev (line 47) | public void setRev(final int rev) {

FILE: tfs/src/main/java/hudson/plugins/tfs/model/WorkItemTrackingResource.java
  class WorkItemTrackingResource (line 10) | public class WorkItemTrackingResource
    method getLinks (line 15) | @JsonProperty("_links")
    method setLinks (line 20) | @JsonProperty("_links")

FILE: tfs/src/main/java/hudson/plugins/tfs/model/WorkItemTrackingResourceReference.java
  class WorkItemTrackingResourceReference (line 6) | public class WorkItemTrackingResourceReference {
    method getUrl (line 10) | public String getUrl() {
    method setUrl (line 14) | public void setUrl(final String url) {

FILE: tfs/src/main/java/hudson/plugins/tfs/model/Workspace.java
  class Workspace (line 9) | public class Workspace implements Serializable{
    method Workspace (line 16) | public Workspace(String name, String computer, String owner, String co...
    method Workspace (line 23) | public Workspace(String name) {
    method getName (line 27) | public String getName() {
    method getComputer (line 31) | public String getComputer() {
    method getOwner (line 35) | public String getOwner() {
    method getComment (line 39) | public String getComment() {
    method hashCode (line 43) | @Override
    method equals (line 48) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/model/WorkspaceConfiguration.java
  class WorkspaceConfiguration (line 14) | public class WorkspaceConfiguration extends InvisibleAction implements S...
    method WorkspaceConfiguration (line 25) | public WorkspaceConfiguration(String serverUrl, String workspaceName, ...
    method WorkspaceConfiguration (line 34) | public WorkspaceConfiguration(WorkspaceConfiguration configuration) {
    method getWorkspaceName (line 43) | public String getWorkspaceName() {
    method getWorkfolder (line 47) | public String getWorkfolder() {
    method getProjectPath (line 51) | public String getProjectPath() {
    method getServerUrl (line 55) | public String getServerUrl() {
    method workspaceExists (line 59) | public boolean workspaceExists() {
    method setWorkspaceWasRemoved (line 63) | public void setWorkspaceWasRemoved() {
    method getCloakedPaths (line 67) | public Collection<String> getCloakedPaths() {
    method hashCode (line 71) | @Override
    method equals (line 84) | @Override
    method toString (line 127) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/model/WorkspaceMapping.java
  class WorkspaceMapping (line 6) | public class WorkspaceMapping {
    method WorkspaceMapping (line 11) | public WorkspaceMapping(final String projectPath, final String localPa...
    method getProjectPath (line 16) | public String getProjectPath() {
    method getLocalPath (line 20) | public String getLocalPath() {

FILE: tfs/src/main/java/hudson/plugins/tfs/model/Workspaces.java
  class Workspaces (line 19) | public class Workspaces implements ListWorkspacesCommand.WorkspaceFactory {
    method Workspaces (line 25) | public Workspaces(Server server) {
    method getListFromServer (line 33) | private List<Workspace> getListFromServer() {
    method populateMapFromServer (line 43) | private void populateMapFromServer() {
    method getWorkspace (line 57) | public Workspace getWorkspace(String workspaceName) {
    method exists (line 69) | public boolean exists(String workspaceName) {
    method exists (line 81) | public boolean exists(Workspace workspace) {
    method getWorkspaceMapping (line 93) | public String getWorkspaceMapping(final String localPath) {
    method newWorkspace (line 107) | public Workspace newWorkspace(final String workspaceName, final String...
    method deleteWorkspace (line 119) | public void deleteWorkspace(Workspace workspace) {
    method createWorkspace (line 125) | public Workspace createWorkspace(String name, String computer, String ...

FILE: tfs/src/main/java/hudson/plugins/tfs/model/servicehooks/Event.java
  class Event (line 9) | public class Event {
    method Event (line 20) | public Event() {
    method getId (line 24) | public UUID getId() {
    method setId (line 28) | public void setId(final UUID id) {
    method getEventType (line 32) | public String getEventType() {
    method setEventType (line 36) | public void setEventType(final String eventType) {
    method getPublisherId (line 40) | public String getPublisherId() {
    method setPublisherId (line 44) | public void setPublisherId(final String publisherId) {
    method getScope (line 48) | public EventScope getScope() {
    method setScope (line 52) | public void setScope(final EventScope scope) {
    method getMessage (line 56) | public FormattedEventMessage getMessage() {
    method setMessage (line 60) | public void setMessage(final FormattedEventMessage message) {
    method getDetailedMessage (line 64) | public FormattedEventMessage getDetailedMessage() {
    method setDetailedMessage (line 68) | public void setDetailedMessage(final FormattedEventMessage detailedMes...
    method getResource (line 72) | public Object getResource() {
    method setResource (line 76) | public void setResource(final Object resource) {
    method getResourceVersion (line 80) | public String getResourceVersion() {
    method setResourceVersion (line 84) | public void setResourceVersion(final String resourceVersion) {
    method getResourceContainers (line 88) | public Map<String, ResourceContainer> getResourceContainers() {
    method setResourceContainers (line 92) | public void setResourceContainers(final Map<String, ResourceContainer>...

FILE: tfs/src/main/java/hudson/plugins/tfs/model/servicehooks/EventScope.java
  type EventScope (line 12) | public enum EventScope {
    method caseInsensitiveValueOf (line 56) | @SuppressWarnings("unused" /* Invoked by Jackson via @JsonCreator */)

FILE: tfs/src/main/java/hudson/plugins/tfs/model/servicehooks/FormattedEventMessage.java
  class FormattedEventMessage (line 6) | public class FormattedEventMessage {
    method getText (line 11) | public String getText() {
    method setText (line 15) | public void setText(final String text) {
    method getHtml (line 19) | public String getHtml() {
    method setHtml (line 23) | public void setHtml(final String html) {
    method getMarkdown (line 27) | public String getMarkdown() {
    method setMarkdown (line 31) | public void setMarkdown(final String markdown) {

FILE: tfs/src/main/java/hudson/plugins/tfs/model/servicehooks/ResourceContainer.java
  class ResourceContainer (line 8) | public class ResourceContainer {
    method ResourceContainer (line 14) | public ResourceContainer() {
    method getId (line 18) | public UUID getId() {
    method setId (line 22) | public void setId(final UUID id) {
    method getBaseUrl (line 26) | public String getBaseUrl() {
    method setBaseUrl (line 30) | public void setBaseUrl(final String baseUrl) {
    method getUrl (line 34) | public String getUrl() {
    method setUrl (line 38) | public void setUrl(final String url) {
    method getName (line 42) | public String getName() {
    method setName (line 46) | public void setName(final String name) {

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/Artifact.java
  class Artifact (line 11) | public class Artifact
    method getId (line 25) | public Integer getId()
    method setId (line 35) | public void setId(Integer id)
    method getType (line 45) | public String getType()
    method setType (line 55) | public void setType(String type)
    method getAlias (line 65) | public String getAlias()
    method setAlias (line 75) | public void setAlias(String alias)
    method getDefinitionReference (line 85) | public DefinitionReference getDefinitionReference()
    method setDefinitionReference (line 95) | public void setDefinitionReference(DefinitionReference definitionRefer...
    method getAdditionalProperties (line 100) | public Map<String, Object> getAdditionalProperties()
    method setAdditionalProperty (line 105) | public void setAdditionalProperty(String name, Object value)

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/ArtifactVersion.java
  class ArtifactVersion (line 11) | public class ArtifactVersion
    method getSourceId (line 23) | public Object getSourceId()
    method setSourceId (line 33) | public void setSourceId(Object sourceId)
    method getAlias (line 43) | public String getAlias()
    method setAlias (line 53) | public void setAlias(String alias)
    method getVersions (line 63) | public List<Version> getVersions()
    method setVersions (line 73) | public void setVersions(List<Version> versions)
    method getErrorMessage (line 83) | public Object getErrorMessage()
    method setErrorMessage (line 93) | public void setErrorMessage(Object errorMessage)

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/ConnectReleaseWebHookEvent.java
  class ConnectReleaseWebHookEvent (line 27) | public class ConnectReleaseWebHookEvent extends AbstractHookEvent {
    class Factory (line 39) | public static class Factory implements AbstractHookEvent.Factory {
      method create (line 40) | @Override
      method getSampleRequestPayload (line 45) | @Override
    method perform (line 58) | @Override
    method validateAndGetPayloadUrl (line 80) | private String validateAndGetPayloadUrl(final ReleaseWebHookResource p...
    method validateAndGetJenkinsProject (line 102) | private AbstractProject validateAndGetJenkinsProject(final ReleaseWebH...
    method validateAndGetReleaseWebHookByName (line 118) | private ReleaseWebHook validateAndGetReleaseWebHookByName(final String...
    method createReleaseWebHook (line 135) | private void createReleaseWebHook(final ReleaseWebHookResource resourc...
    method deleteReleaseWebHook (line 165) | private void deleteReleaseWebHook(final ReleaseWebHookResource resourc...
    method listReleaseWebHook (line 198) | private JSONObject listReleaseWebHook() {
    method linkWebHook (line 215) | private void linkWebHook(final ReleaseWebHookResource resource) {
    method unlinkWebHook (line 261) | private void unlinkWebHook(final ReleaseWebHookResource resource) {
    method getReleaseWebHookActionFromProject (line 301) | private ReleaseWebHookAction getReleaseWebHookActionFromProject(final ...
    method saveProject (line 318) | private void saveProject(final AbstractProject project) {

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/CreatedBy.java
  class CreatedBy (line 11) | public class CreatedBy
    method getId (line 26) | public String getId()
    method setId (line 36) | public void setId(String id)
    method getDisplayName (line 46) | public String getDisplayName()
    method setDisplayName (line 56) | public void setDisplayName(String displayName)
    method getUniqueName (line 66) | public String getUniqueName()
    method setUniqueName (line 76) | public void setUniqueName(String uniqueName)
    method getUrl (line 86) | public String getUrl()
    method setUrl (line 96) | public void setUrl(String url)
    method getImageUrl (line 106) | public String getImageUrl()
    method setImageUrl (line 116) | public void setImageUrl(String imageUrl)
    method getAdditionalProperties (line 121) | public Map<String, Object> getAdditionalProperties()
    method setAdditionalProperty (line 126) | public void setAdditionalProperty(String name, Object value)

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/Definition.java
  class Definition (line 11) | public class Definition
    method getId (line 23) | public String getId()
    method setId (line 33) | public void setId(String id)
    method getName (line 43) | public String getName()
    method setName (line 53) | public void setName(String name)
    method getAdditionalProperties (line 58) | public Map<String, Object> getAdditionalProperties()
    method setAdditionalProperty (line 63) | public void setAdditionalProperty(String name, Object value)

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/DefinitionReference.java
  class DefinitionReference (line 11) | public class DefinitionReference
    method getDefinition (line 23) | public Definition getDefinition()
    method setDefinition (line 33) | public void setDefinition(Definition definition)
    method getProject (line 43) | public Project getProject()
    method setProject (line 53) | public void setProject(Project project)
    method getAdditionalProperties (line 58) | public Map<String, Object> getAdditionalProperties()
    method setAdditionalProperty (line 63) | public void setAdditionalProperty(String name, Object value)

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/InstanceReference.java
  class InstanceReference (line 10) | public class InstanceReference
    method getName (line 24) | public String getName()
    method setName (line 34) | public void setName(String name)
    method getId (line 44) | public String getId()
    method setId (line 54) | public void setId(String id)
    method getSourceBranch (line 64) | public String getSourceBranch()
    method setSourceBranch (line 74) | public void setSourceBranch(String sourceBranch)

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/ModifiedBy.java
  class ModifiedBy (line 10) | public class ModifiedBy {
    method getId (line 23) | public String getId() {
    method setId (line 31) | public void setId(String id) {
    method getDisplayName (line 39) | public String getDisplayName() {
    method setDisplayName (line 47) | public void setDisplayName(String displayName) {
    method getUniqueName (line 55) | public String getUniqueName() {
    method setUniqueName (line 63) | public void setUniqueName(String uniqueName) {
    method getUrl (line 71) | public String getUrl() {
    method setUrl (line 79) | public void setUrl(String url) {
    method getImageUrl (line 87) | public String getImageUrl() {
    method setImageUrl (line 95) | public void setImageUrl(String imageUrl) {
    method getAdditionalProperties (line 99) | public Map<String, Object> getAdditionalProperties() {
    method setAdditionalProperty (line 103) | public void setAdditionalProperty(String name, Object value) {

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/Project.java
  class Project (line 11) | public class Project
    method getId (line 23) | public String getId()
    method setId (line 33) | public void setId(String id)
    method getName (line 43) | public String getName()
    method setName (line 53) | public void setName(String name)
    method getAdditionalProperties (line 58) | public Map<String, Object> getAdditionalProperties()
    method setAdditionalProperty (line 63) | public void setAdditionalProperty(String name, Object value)

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseArtifact.java
  class ReleaseArtifact (line 10) | public class ReleaseArtifact
    method getAlias (line 23) | public String getAlias()
    method setAlias (line 33) | public void setAlias(String alias)
    method getInstanceReference (line 43) | public InstanceReference getInstanceReference()
    method setInstanceReference (line 53) | public void setInstanceReference(InstanceReference instanceReference)

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseArtifactVersionsResponse.java
  class ReleaseArtifactVersionsResponse (line 11) | public class ReleaseArtifactVersionsResponse
    method getArtifactVersions (line 20) | public List<ArtifactVersion> getArtifactVersions()
    method setArtifactVersions (line 30) | public void setArtifactVersions(List<ArtifactVersion> artifactVersions)

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseBody.java
  class ReleaseBody (line 12) | public class ReleaseBody
    method getDefinitionId (line 31) | public Integer getDefinitionId()
    method setDefinitionId (line 41) | public void setDefinitionId(Integer definitionId)
    method getDescription (line 51) | public String getDescription()
    method setDescription (line 61) | public void setDescription(String description)
    method getArtifacts (line 71) | public List<ReleaseArtifact> getArtifacts()
    method setArtifacts (line 81) | public void setArtifacts(List<ReleaseArtifact> artifacts)
    method getIsDraft (line 91) | public Boolean getIsDraft()
    method setIsDraft (line 101) | public void setIsDraft(Boolean isDraft)
    method getManualEnvironments (line 111) | public List<Object> getManualEnvironments()
    method setManualEnvironments (line 121) | public void setManualEnvironments(List<Object> manualEnvironments)

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseDefinition.java
  class ReleaseDefinition (line 13) | public class ReleaseDefinition
    method getId (line 33) | public Integer getId()
    method setId (line 43) | public void setId(Integer id)
    method getRevision (line 53) | public Integer getRevision()
    method setRevision (line 63) | public void setRevision(Integer revision)
    method getName (line 73) | public String getName()
    method setName (line 83) | public void setName(String name)
    method getCreatedBy (line 93) | public CreatedBy getCreatedBy()
    method setCreatedBy (line 103) | public void setCreatedBy(CreatedBy createdBy)
    method getCreatedOn (line 113) | public String getCreatedOn()
    method setCreatedOn (line 123) | public void setCreatedOn(String createdOn)
    method getModifiedBy (line 133) | public ModifiedBy getModifiedBy()
    method setModifiedBy (line 143) | public void setModifiedBy(ModifiedBy modifiedBy)
    method getModifiedOn (line 153) | public String getModifiedOn()
    method setModifiedOn (line 163) | public void setModifiedOn(String modifiedOn)
    method getArtifacts (line 173) | public List<Artifact> getArtifacts()
    method setArtifacts (line 183) | public void setArtifacts(List<Artifact> artifacts)
    method getReleaseNameFormat (line 193) | public String getReleaseNameFormat()
    method setReleaseNameFormat (line 203) | public void setReleaseNameFormat(String releaseNameFormat)
    method getRetentionPolicy (line 213) | public RetentionPolicy getRetentionPolicy()
    method setRetentionPolicy (line 223) | public void setRetentionPolicy(RetentionPolicy retentionPolicy)
    method getUrl (line 228) | public String getUrl()
    method setUrl (line 234) | public void setUrl(String url)
    method getAdditionalProperties (line 239) | public Map<String, Object> getAdditionalProperties()
    method setAdditionalProperty (line 244) | public void setAdditionalProperty(String name, Object value)

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseManagementCI.java
  class ReleaseManagementCI (line 41) | public class ReleaseManagementCI extends Notifier implements Serializable {
    method ReleaseManagementCI (line 55) | public ReleaseManagementCI(String collectionUrl, String projectName, S...
    method ReleaseManagementCI (line 74) | @DataBoundConstructor
    method readResolve (line 96) | protected Object readResolve() {
    method getRequiredMonitorService (line 127) | @Override
    method perform (line 139) | @Override
    method CreateRelease (line 193) | void CreateRelease(
    method PrepareReleaseArtifacts (line 245) | private List<ReleaseArtifact> PrepareReleaseArtifacts(ReleaseDefinitio...
    class DescriptorImpl (line 280) | @Extension
      method isApplicable (line 289) | @Override
      method getDisplayName (line 300) | @Override
      method doFillCredentialsIdItems (line 306) | public ListBoxModel doFillCredentialsIdItems(@AncestorInPath Item ow...
      method doFillProjectNameItems (line 321) | public ListBoxModel doFillProjectNameItems(@QueryParameter String co...
      method doFillReleaseDefinitionNameItems (line 358) | public ListBoxModel doFillReleaseDefinitionNameItems(@QueryParameter...

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseManagementException.java
  class ReleaseManagementException (line 8) | public class ReleaseManagementException extends Exception
    method ReleaseManagementException (line 10) | public ReleaseManagementException()
    method ReleaseManagementException (line 22) | public ReleaseManagementException(String message)
    method ReleaseManagementException (line 46) | public ReleaseManagementException(String message, Throwable cause)
    method ReleaseManagementException (line 65) | public ReleaseManagementException(Throwable cause)

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseManagementHttpClient.java
  class ReleaseManagementHttpClient (line 25) | public class ReleaseManagementHttpClient
    method ReleaseManagementHttpClient (line 33) | ReleaseManagementHttpClient(String accountUrl, String username, Secret...
    method GetReleaseDefinitions (line 42) | public List<ReleaseDefinition> GetReleaseDefinitions(String project) t...
    method CreateRelease (line 50) | public String CreateRelease(String project, String body) throws Releas...
    method GetVersions (line 56) | public ReleaseArtifactVersionsResponse GetVersions(String project, Lis...
    method GetProjectItems (line 64) | public List<Project> GetProjectItems() throws ReleaseManagementException
    method ExecutePostmethod (line 76) | private String ExecutePostmethod(String url, String body) throws Relea...
    method ExecuteGetMethod (line 100) | private String ExecuteGetMethod(String url) throws ReleaseManagementEx...
    class DefinitionResponse (line 122) | private class DefinitionResponse
      method getCount (line 134) | public Integer getCount()
      method setCount (line 144) | public void setCount(Integer count)
      method getValue (line 154) | public List<ReleaseDefinition> getValue()
      method setValue (line 164) | public void setValue(List<ReleaseDefinition> value)
      method getAdditionalProperties (line 169) | public Map<String, Object> getAdditionalProperties()
      method setAdditionalProperty (line 174) | public void setAdditionalProperty(String name, Object value)

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseSummaryAction.java
  class ReleaseSummaryAction (line 10) | @ExportedBean
    method ReleaseSummaryAction (line 16) | public ReleaseSummaryAction() {
    method ReleaseSummaryAction (line 20) | public ReleaseSummaryAction(final String projectName, final int buildN...
    method getProjectName (line 26) | public String getProjectName() {
    method getBuildNo (line 30) | public int getBuildNo() {
    method getReleaseLink (line 34) | public String getReleaseLink() {

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseWebHook.java
  class ReleaseWebHook (line 19) | public class ReleaseWebHook extends AbstractDescribableImpl<ReleaseWebHo...
    method ReleaseWebHook (line 26) | @DataBoundConstructor
    method ReleaseWebHook (line 33) | public ReleaseWebHook(final String webHookName, final String payloadUr...
    method getWebHookName (line 39) | public String getWebHookName() {
    method getPayloadUrl (line 43) | public String getPayloadUrl() {
    method getSecret (line 47) | public String getSecret() {
    method getDescriptor (line 51) | @Override
    class DescriptorImpl (line 59) | @Extension
      method getDisplayName (line 62) | @Override
      method doCheckPayloadUrl (line 72) | @SuppressWarnings("unused")
      method doCheckWebHookName (line 98) | @SuppressWarnings("unused")

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseWebHookAction.java
  class ReleaseWebHookAction (line 39) | public class ReleaseWebHookAction extends Notifier implements Serializab...
    method ReleaseWebHookAction (line 45) | @DataBoundConstructor
    method getRequiredMonitorService (line 50) | @Override
    method getWebHookReferences (line 55) | public List<ReleaseWebHookReference> getWebHookReferences() {
    method setWebHookReferences (line 59) | public void setWebHookReferences(final List<ReleaseWebHookReference> w...
    method perform (line 63) | @Override
    method sendJobCompletedEvent (line 103) | private ReleaseWebHookStatus sendJobCompletedEvent(final JSONObject js...
    class DescriptorImpl (line 137) | @Extension
      method isApplicable (line 140) | @Override
      method getDisplayName (line 145) | @Override
    method getStartedBy (line 151) | private String getStartedBy(final AbstractBuild build) {

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseWebHookHelper.java
  class ReleaseWebHookHelper (line 14) | public final class ReleaseWebHookHelper {
    method ReleaseWebHookHelper (line 15) | private ReleaseWebHookHelper() {
    method getReleaseWebHookConfigurations (line 22) | public static List<ReleaseWebHook> getReleaseWebHookConfigurations() {
    method saveReleaseWebHookConfigurations (line 35) | public static void saveReleaseWebHookConfigurations(final List<Release...
    method getPayloadSignature (line 51) | public static String getPayloadSignature(final String secret, final St...

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseWebHookReference.java
  class ReleaseWebHookReference (line 16) | public class ReleaseWebHookReference extends AbstractDescribableImpl<Rel...
    method ReleaseWebHookReference (line 21) | @DataBoundConstructor
    method getWebHookName (line 26) | public String getWebHookName() {
    method getDescriptor (line 30) | @Override
    class DescriptorImpl (line 38) | @Extension
      method getDisplayName (line 41) | @Override
      method doFillWebHookNameItems (line 50) | public ListBoxModel doFillWebHookNameItems() {

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseWebHookResource.java
  class ReleaseWebHookResource (line 7) | public class ReleaseWebHookResource {
    method getOperationType (line 14) | public String getOperationType() {
    method setOperationType (line 18) | public void setOperationType(final String operationType) {
    method getWebHookName (line 22) | public String getWebHookName() {
    method setWebHookName (line 26) | public void setWebHookName(final String webHookName) {
    method getProjectName (line 30) | public String getProjectName() {
    method setProjectName (line 34) | public void setProjectName(final String jobName) {
    method getPayloadUrl (line 38) | public String getPayloadUrl() {
    method setPayloadUrl (line 42) | public void setPayloadUrl(final String payloadUrl) {
    method getSecret (line 46) | public String getSecret() {
    method setSecret (line 50) | public void setSecret(final String secret) {

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseWebHookStatus.java
  class ReleaseWebHookStatus (line 10) | public class ReleaseWebHookStatus {
    method ReleaseWebHookStatus (line 17) | public ReleaseWebHookStatus(final String payloadUrl, final int status) {
    method ReleaseWebHookStatus (line 23) | public ReleaseWebHookStatus(final String payloadUrl, final int status,...
    method getPayloadUrl (line 28) | public String getPayloadUrl() {
    method getStatusCode (line 32) | public int getStatusCode() {
    method getErrorMessage (line 36) | public String getErrorMessage() {
    method getTimeStamp (line 40) | public String getTimeStamp() {

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseWebHookSummaryAction.java
  class ReleaseWebHookSummaryAction (line 10) | public class ReleaseWebHookSummaryAction extends InvisibleAction {
    method ReleaseWebHookSummaryAction (line 14) | public ReleaseWebHookSummaryAction(final List<ReleaseWebHookStatus> we...
    method getWebHookStatus (line 18) | public List<ReleaseWebHookStatus> getWebHookStatus() {

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/RetentionPolicy.java
  class RetentionPolicy (line 11) | public class RetentionPolicy
    method getDaysToKeep (line 22) | public Integer getDaysToKeep()
    method setDaysToKeep (line 32) | public void setDaysToKeep(Integer daysToKeep)
    method getAdditionalProperties (line 37) | public Map<String, Object> getAdditionalProperties()
    method setAdditionalProperty (line 42) | public void setAdditionalProperty(String name, Object value)

FILE: tfs/src/main/java/hudson/plugins/tfs/rm/Version.java
  class Version (line 8) | public class Version
    method getId (line 20) | public String getId()
    method setId (line 30) | public void setId(String id)
    method getName (line 40) | public String getName()
    method setName (line 50) | public void setName(String name)
    method getSourceBranch (line 60) | public String getSourceBranch()
    method setSourceBranch (line 70) | public void setSourceBranch(String sourceBranch)

FILE: tfs/src/main/java/hudson/plugins/tfs/telemetry/TelemetryContextInitializer.java
  class TelemetryContextInitializer (line 26) | public class TelemetryContextInitializer implements ContextInitializer {
    method TelemetryContextInitializer (line 50) | public TelemetryContextInitializer(final boolean isDeveloperMode) {
    method initialize (line 54) | @Override
    method getUserAgent (line 73) | public String getUserAgent(final String defaultUserAgent) {
    method initializeDevice (line 91) | private void initializeDevice(final DeviceContext device) {
    method initializeInstrumentationKey (line 96) | private void initializeInstrumentationKey(final TelemetryContext conte...
    method initializeUser (line 104) | private void initializeUser(final UserContext user) {
    method getUserId (line 109) | private String getUserId() {
    method getComputerName (line 118) | private String getComputerName() {
    method initializeComponent (line 134) | private void initializeComponent(final ComponentContext component) {
    method initializeTags (line 138) | private void initializeTags(final Map<String, String> tags) {
    method initializeSession (line 144) | private void initializeSession(final SessionContext sessionContext) {
    method initializeProperties (line 148) | private void initializeProperties(final Map<String, String> properties) {
    method getSystemProperty (line 165) | private String getSystemProperty(final String propertyName) {
    method getPlatformName (line 169) | private String getPlatformName() {
    method getPlatformVersion (line 173) | private String getPlatformVersion() {
    method getLocaleName (line 177) | private String getLocaleName() {
    method getJavaName (line 181) | private String getJavaName() {
    method getJavaVersion (line 185) | private String getJavaVersion() {
    method getPluginVersion (line 189) | private String getPluginVersion() {

FILE: tfs/src/main/java/hudson/plugins/tfs/telemetry/TelemetryHelper.java
  class TelemetryHelper (line 20) | public final class TelemetryHelper {
    class TfsTelemetryHelperHolder (line 39) | private static class TfsTelemetryHelperHolder {
    method getInstance (line 46) | private static TelemetryHelper getInstance() {
    method TelemetryHelper (line 52) | private TelemetryHelper() {
    method sendEvent (line 95) | public static void sendEvent(final String name, final Map<String, Stri...
    method sendMetric (line 109) | public static void sendMetric(final String name, final double value) {
    method sendException (line 122) | public static void sendException(final Exception exception, final Map<...
    method sendMetricInternal (line 130) | protected void sendMetricInternal(final String name, final double valu...
    method sendEventInternal (line 139) | protected void sendEventInternal(final String name, final Map<String, ...
    method sendExceptionInternal (line 151) | protected void sendExceptionInternal(final Exception exception, final ...
    class PropertyMapBuilder (line 165) | public static class PropertyMapBuilder {
      method PropertyMapBuilder (line 170) | public PropertyMapBuilder() {
      method PropertyMapBuilder (line 174) | public PropertyMapBuilder(final Map<String, String> properties) {
      method build (line 185) | public Map<String, String> build() {
      method serverContext (line 193) | public PropertyMapBuilder serverContext(final String serverUrl, fina...
      method pair (line 206) | public PropertyMapBuilder pair(final String key, final String value) {
      method getServerId (line 213) | private String getServerId(final String serverUrl) {
      method getCollectionId (line 224) | private String getCollectionId(final String collectionUrl) {
      method add (line 236) | private void add(final String key, final String value) {
      method toString (line 245) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/util/ActionHelper.java
  class ActionHelper (line 13) | public final class ActionHelper {
    method ActionHelper (line 15) | private ActionHelper() { }
    method create (line 20) | public static Action[] create(final Collection<Action> actions, final ...

FILE: tfs/src/main/java/hudson/plugins/tfs/util/BuildVariableResolver.java
  class BuildVariableResolver (line 32) | public class BuildVariableResolver implements VariableResolver<String> {
    method BuildVariableResolver (line 42) | public BuildVariableResolver(final Job<?, ?> job) {
    method BuildVariableResolver (line 51) | public BuildVariableResolver(final Job<?, ?> project, final Computer c...
    method BuildVariableResolver (line 82) | public BuildVariableResolver(final AbstractBuild<?, ?> build, final Co...
    method resolve (line 95) | public String resolve(final String variable) {
    type LazyResolver (line 114) | private interface LazyResolver {
      method getValue (line 115) | String getValue() throws IOException, InterruptedException;
    class LazyComputerResolver (line 122) | private abstract class LazyComputerResolver implements LazyResolver {
      method getValue (line 123) | protected abstract String getValue(Computer computer) throws IOExcep...
      method getValue (line 124) | public String getValue() throws IOException, InterruptedException {

FILE: tfs/src/main/java/hudson/plugins/tfs/util/BuildWorkspaceConfigurationRetriever.java
  class BuildWorkspaceConfigurationRetriever (line 18) | public class BuildWorkspaceConfigurationRetriever {
    method getLatestForNode (line 20) | public BuildWorkspaceConfiguration getLatestForNode(Node needleNode, R...
    class BuildWorkspaceConfiguration (line 47) | public static class BuildWorkspaceConfiguration extends WorkspaceConfi...
      method BuildWorkspaceConfiguration (line 51) | public BuildWorkspaceConfiguration(WorkspaceConfiguration configurat...
      method save (line 56) | public void save() throws IOException {
      method equals (line 63) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/util/DateUtil.java
  class DateUtil (line 18) | public class DateUtil {
    method DateUtil (line 20) | private DateUtil() {
    method initialValue (line 26) | @Override
    method toString (line 34) | public static String toString(final DateVersionSpec dateVersionSpec) {
    method toString (line 39) | public static String toString(final Calendar calendar) {
    method toString (line 44) | public static String toString(final Date dateTime) {
    method parseDate (line 54) | public static Date parseDate(String dateString) throws ParseException {
    method parseDate (line 58) | @SuppressWarnings("deprecation")
    method parseWithFormats (line 79) | static Date parseWithFormats(String input, DateFormat[] formats) throw...
    method createDateFormatsForLocaleAndTimeZone (line 98) | static DateFormat[] createDateFormatsForLocaleAndTimeZone(Locale local...
    method addDateFormatsToList (line 107) | static void addDateFormatsToList(Locale locale, TimeZone timeZone, Lis...
    method addDateTimeFormatsToList (line 115) | static void addDateTimeFormatsToList(Locale locale, TimeZone timeZone,...

FILE: tfs/src/main/java/hudson/plugins/tfs/util/EndpointHelper.java
  class EndpointHelper (line 14) | public class EndpointHelper {
    method error (line 24) | public static void error(final int code, final Throwable cause) {

FILE: tfs/src/main/java/hudson/plugins/tfs/util/KeyValueTextReader.java
  class KeyValueTextReader (line 20) | public class KeyValueTextReader {
    method parse (line 28) | public Map<String, String> parse(final String string) throws IOExcepti...
    method parse (line 35) | public Map<String, String> parse(final BufferedReader reader) throws I...

FILE: tfs/src/main/java/hudson/plugins/tfs/util/MaskedArgumentListBuilder.java
  class MaskedArgumentListBuilder (line 14) | public class MaskedArgumentListBuilder extends ArgumentListBuilder{
    method prepend (line 20) | @Override
    method hasMaskedArguments (line 36) | public boolean hasMaskedArguments() {
    method toMaskArray (line 44) | public boolean[] toMaskArray() {
    method addMasked (line 59) | public void addMasked(String string) {

FILE: tfs/src/main/java/hudson/plugins/tfs/util/MediaType.java
  class MediaType (line 8) | public final class MediaType {
    method MediaType (line 9) | private MediaType() { }

FILE: tfs/src/main/java/hudson/plugins/tfs/util/QueryString.java
  class QueryString (line 11) | public class QueryString extends LinkedHashMap<String, String> {
    method QueryString (line 13) | public QueryString() {
    method QueryString (line 16) | public QueryString(final String... nameValuePairs) {
    method toString (line 27) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/util/ResourceHelper.java
  class ResourceHelper (line 11) | public final class ResourceHelper {
    method ResourceHelper (line 13) | private ResourceHelper() { }
    method fetchAsString (line 18) | public static String fetchAsString(final Class<?> referenceClass, fina...

FILE: tfs/src/main/java/hudson/plugins/tfs/util/StringBodyParameter.java
  class StringBodyHandler (line 32) | class StringBodyHandler extends AnnotationHandler<StringBodyParameter> {
    method parse (line 37) | @Override

FILE: tfs/src/main/java/hudson/plugins/tfs/util/StringHelper.java
  class StringHelper (line 4) | public class StringHelper {
    method endsWithIgnoreCase (line 6) | public static boolean endsWithIgnoreCase(final String haystack, final ...
    method equal (line 30) | public static boolean equal(final String a, final String b) {
    method equalIgnoringCase (line 34) | public static boolean equalIgnoringCase(final String a, final String b) {
    method innerEqual (line 38) | static boolean innerEqual(final String a, final String b, final boolea...
    method determineContentTypeWithoutCharset (line 52) | public static String determineContentTypeWithoutCharset(final String c...

FILE: tfs/src/main/java/hudson/plugins/tfs/util/TeamRestClient.java
  class TeamRestClient (line 35) | public class TeamRestClient {
    method TeamRestClient (line 46) | public TeamRestClient(final URI collectionUri) throws IOException {
    method TeamRestClient (line 50) | public TeamRestClient(final URI collectionUri, final StandardUsernameP...
    method TeamRestClient (line 63) | public TeamRestClient(final String collectionUri, final StandardUserna...
    method createAuthorization (line 67) | static String createAuthorization(final StandardUsernamePasswordCreden...
    method request (line 78) | protected <TRequest, TResponse> TResponse request(
    method request (line 87) | protected <TRequest, TResponse> TResponse request(
    method deserialize (line 137) | public static <TResponse> TResponse deserialize(final Class<TResponse>...
    method innerRequest (line 146) | static String innerRequest(final com.microsoft.tfs.core.httpclient.Htt...
    method readResponseText (line 175) | @SuppressFBWarnings(value = "DM_DEFAULT_ENCODING", justification = "Be...
    method ping (line 195) | public String ping() throws IOException {
    method getRepositories (line 207) | public ListOfGitRepositories getRepositories() throws IOException {
    method addCommitStatus (line 220) | public TeamGitStatus addCommitStatus(final GitCodePushedEventArgs args...
    method getWorkItem (line 234) | public WorkItem getWorkItem(final int workItemId) throws IOException {
    method addHyperlinkToWorkItem (line 248) | public void addHyperlinkToWorkItem(final int workItemId, final String ...
    method addPullRequestStatus (line 281) | public TeamGitStatus addPullRequestStatus(final PullRequestMergeCommit...
    method addPullRequestIterationStatus (line 295) | public TeamGitStatus addPullRequestIterationStatus(final PullRequestMe...
    method sendJobCompletionEvent (line 311) | public void sendJobCompletionEvent(final JobCompletionEventArgs args) ...

FILE: tfs/src/main/java/hudson/plugins/tfs/util/TeamStatus.java
  class TeamStatus (line 22) | public final class TeamStatus {
    method TeamStatus (line 23) | private TeamStatus() { }
    method createFromRun (line 28) | public static void createFromRun(@Nonnull final Run<?, ?> run, @Nonnul...
    method createFromJob (line 72) | public static void createFromJob(final PullRequestMergeCommitCreatedEv...
    method addStatus (line 78) | private static void addStatus(final PullRequestMergeCommitCreatedEvent...

FILE: tfs/src/main/java/hudson/plugins/tfs/util/TextTableParser.java
  class TextTableParser (line 44) | public class TextTableParser {
    method TextTableParser (line 54) | public TextTableParser(Reader reader) throws IOException {
    method TextTableParser (line 58) | public TextTableParser(Reader reader, int optionalColumnCount) throws ...
    method init (line 64) | private void init() throws IOException {
    method getColumnCount (line 88) | public int getColumnCount() {
    method getColumn (line 97) | public String getColumn(int index) {
    method nextRow (line 119) | public boolean nextRow() throws IOException {
    class ColumnRange (line 126) | private static class ColumnRange {
      method ColumnRange (line 129) | public ColumnRange(int start, int end) {

FILE: tfs/src/main/java/hudson/plugins/tfs/util/UriHelper.java
  class UriHelper (line 19) | public class UriHelper {
    method areSame (line 49) | public static boolean areSame(final URI a, final URI b) {
    method areSameGitRepo (line 88) | public static boolean areSameGitRepo(final URIish a, final URIish b) {
    method areSameGitRepo (line 95) | public static boolean areSameGitRepo(final URI a, final URI b) {
    method normalizePort (line 145) | static int normalizePort(final URI uri) {
    method normalizePath (line 158) | static String normalizePath(final URI uri) {
    method decomposePath (line 171) | static Iterator<String> decomposePath(final String path) {
    method hasPath (line 175) | public static boolean hasPath(final URI uri) {
    method isWellFormedUriString (line 185) | public static boolean isWellFormedUriString(final String uriString) {
    method join (line 195) | public static URI join(final URI collectionUri, final Object... compon...
    method join (line 199) | public static URI join(final String collectionUrl, final Object... com...
    method endsWithSlash (line 244) | static boolean endsWithSlash(final StringBuilder stringBuilder) {
    method serializeParameters (line 249) | public static String serializeParameters(final Map<String, String> par...

FILE: tfs/src/main/java/hudson/plugins/tfs/util/XmlHelper.java
  class XmlHelper (line 27) | public class XmlHelper {
    method peekValue (line 33) | public static String peekValue(final Document doc, final String xpathE...
    method peekValue (line 43) | public static String peekValue(final File file, final String xpathExpr...
    method pokeValue (line 59) | public static void pokeValue(final Document doc, final String xpathExp...
    method pokeValue (line 68) | public static void pokeValue(final File file, final String xpathExpres...

FILE: tfs/src/test/java/hudson/plugins/tfs/ChangeSetReaderTest.java
  class ChangeSetReaderTest (line 14) | public class ChangeSetReaderTest {
    method assertParsingTwoXmlChangeSets (line 16) | @Test
    method assertItemHasParent (line 50) | @Test
    method assertXmlWithEscapedCharsIsReadCorrectly (line 73) | public void assertXmlWithEscapedCharsIsReadCorrectly() throws Exception {
    method assertParsingOfKeywordCheckedInByIsParsed (line 93) | @Test

FILE: tfs/src/test/java/hudson/plugins/tfs/ChangeSetWriterTest.java
  class ChangeSetWriterTest (line 13) | public class ChangeSetWriterTest {
    method setUp (line 15) | @Before
    method assertWriterOutputsCorrectChangeLogXml (line 22) | @Test
    method assertWriterIgnoredNullDomain (line 46) | @Test
    method assertXmlCharsAreEscaped (line 64) | @Test
    method assertCheckedInByUserIsWritten (line 82) | @Test

FILE: tfs/src/test/java/hudson/plugins/tfs/CommitParameterActionTest.java
  class CommitParameterActionTest (line 9) | public class CommitParameterActionTest {

FILE: tfs/src/test/java/hudson/plugins/tfs/EndToEndTfs.java
  class StubRunner (line 56) | class StubRunner extends JenkinsRecipe.Runner<EndToEndTfs> {
    method getEncryptedPassword (line 61) | public String getEncryptedPassword() {
    method getParent (line 65) | protected RunnerImpl getParent() {
    method setParent (line 69) | private void setParent(final RunnerImpl parent) {
    method getHelper (line 73) | protected IntegrationTestHelper getHelper() {
    method setHelper (line 77) | private void setHelper(final IntegrationTestHelper helper) {
    method decorateHome (line 81) | @Override
  class RunnerImpl (line 120) | class RunnerImpl extends JenkinsRecipe.Runner<EndToEndTfs>  {
    method RunnerImpl (line 136) | public RunnerImpl() throws URISyntaxException {
    method setup (line 141) | @Override
    method getLocalBaseFolderFile (line 201) | public File getLocalBaseFolderFile() {
    method getPathInTfvc (line 205) | public String getPathInTfvc() {
    method getWorkspaceName (line 209) | public String getWorkspaceName() {
    method getTestCaseName (line 213) | public String getTestCaseName() {
    method getTestClassName (line 217) | public String getTestClassName() {
    method getServerUrl (line 221) | public String getServerUrl() {
    method getServer (line 225) | public Server getServer() {
    method getJobFolder (line 229) | public String getJobFolder() {
    method getInnerRunner (line 233) | public <T extends StubRunner> T getInnerRunner(final Class<T> type) {
    method getWorkspace (line 237) | public Workspace getWorkspace() {
    method checkIn (line 241) | public int checkIn(final String comment) {
    method checkIn (line 245) | static int checkIn(Workspace workspace, String comment) {
    method createWorkspace (line 257) | static Workspace createWorkspace(final MockableVersionControlClient vc...
    method deleteWorkspace (line 271) | static void deleteWorkspace(final MockableVersionControlClient vcc, fi...
    method decorateHome (line 285) | @Override
    method tearDown (line 292) | @Override

FILE: tfs/src/test/java/hudson/plugins/tfs/FunctionalTest.java
  class FunctionalTest (line 76) | @Category(IntegrationTests.class)
    class TfsJenkinsRule (line 84) | public class TfsJenkinsRule extends JenkinsRule{
      method purgeSlaves (line 89) | private void purgeSlaves() {
      method after (line 120) | @Override
      method getTfsRunner (line 128) | public EndToEndTfs.RunnerImpl getTfsRunner() {
    method runScmPollTrigger (line 155) | public static AbstractBuild runScmPollTrigger(final Project project)
    method runUserTrigger (line 173) | public static AbstractBuild runUserTrigger(final Project project)
    method waitForQueuedBuild (line 182) | static AbstractBuild waitForQueuedBuild(final Project project)
    method createLabel (line 208) | @LocalData
    method assertBuildSuccess (line 248) | public void assertBuildSuccess(final AbstractBuild build) throws IOExc...
    class CreateLabel (line 262) | public static class CreateLabel extends CurrentChangesetInjector {
      method CreateLabel (line 266) | public CreateLabel(){
      method getGeneratedLabelName (line 272) | public String getGeneratedLabelName() {
      method decorateHome (line 276) | @Override public void decorateHome(final JenkinsRule jenkinsRule, fi...
    method agent (line 289) | @LocalData
    method newJob (line 324) | @LocalData
    method assertEmptyFileIsInWorkspace (line 409) | public void assertEmptyFileIsInWorkspace(final FilePath workspace) thr...
    method checkInEmptyFile (line 416) | public static int checkInEmptyFile(final EndToEndTfs.RunnerImpl tfsRun...
    method checkInFile (line 420) | public static int checkInFile(final EndToEndTfs.RunnerImpl tfsRunner, ...
    method cloakedPaths (line 447) | @LocalData
    method assertCloakedPathsWorkspaceContents (line 558) | private static void assertCloakedPathsWorkspaceContents(final FilePath...
    method createWorkspaceFile (line 574) | static String createWorkspaceFile(final File root, final String relFil...
    class CloakedPaths (line 584) | public static class CloakedPaths extends CurrentChangesetInjector {
      method decorateHome (line 586) | @Override public void decorateHome(final JenkinsRule jenkinsRule, fi...
    method oldPollingFallback (line 610) | @LocalData
    class OldPollingFallback (line 627) | public static class OldPollingFallback extends EndToEndTfs.StubRunner {
      method decorateHome (line 629) | @Override public void decorateHome(final JenkinsRule jenkinsRule, fi...
    method upgradeEncodedPassword (line 653) | @LocalData
    class UpgradeEncodedPassword (line 693) | public static class UpgradeEncodedPassword extends CurrentChangesetInj...
      method decorateHome (line 694) | @Override public void decorateHome(final JenkinsRule jenkinsRule, fi...
    method useWebProxyServer (line 711) | @LocalData
    class UseWebProxyServer (line 777) | public static class UseWebProxyServer extends CurrentChangesetInjector {
      method UseWebProxyServer (line 782) | public UseWebProxyServer() {
      method decorateHome (line 793) | @Override public void decorateHome(final JenkinsRule jenkinsRule, fi...
      method getServer (line 802) | public HttpProxyServer getServer() {
      method getAdapter (line 806) | public LoggingFiltersSourceAdapter getAdapter() {
    class CurrentChangesetInjector (line 814) | public static class CurrentChangesetInjector extends EndToEndTfs.StubR...
      method decorateHome (line 816) | @Override public void decorateHome(final JenkinsRule jenkinsRule, fi...

FILE: tfs/src/test/java/hudson/plugins/tfs/IntegrationTestHelper.java
  class IntegrationTestHelper (line 19) | public class IntegrationTestHelper {
    method IntegrationTestHelper (line 25) | public IntegrationTestHelper() throws URISyntaxException {
    method IntegrationTestHelper (line 34) | public IntegrationTestHelper(final String tfsServerName) throws URISyn...
    method IntegrationTestHelper (line 45) | public IntegrationTestHelper(final String tfsServerUrl, final String t...
    method propertyOrNull (line 57) | static String propertyOrNull(final String propertyName) {
    method propertyOrFail (line 62) | static String propertyOrFail(final String propertyName) {
    method getServerUrl (line 73) | public String getServerUrl() {
    method getUserName (line 77) | public String getUserName() {
    method getUserPassword (line 81) | public String getUserPassword() {
    method determinePathInTfvcForTestCase (line 92) | public static String determinePathInTfvcForTestCase(Description testDe...
    method tryToDetermineHostName (line 100) | public static String tryToDetermineHostName() {
    method inventHostName (line 129) | public static String inventHostName() {
    method formatFriendlyName (line 171) | public static String formatFriendlyName(final byte[] addressBytes) {

FILE: tfs/src/test/java/hudson/plugins/tfs/IntegrationTestHelperTest.java
  class IntegrationTestHelperTest (line 6) | public class IntegrationTestHelperTest {
    method buildServerUrl_onPremiseTfsServer (line 8) | @Test public void buildServerUrl_onPremiseTfsServer() throws Exception {
    method buildServerUrl_designatedVsoAccount (line 16) | @Test public void buildServerUrl_designatedVsoAccount() throws Excepti...

FILE: tfs/src/test/java/hudson/plugins/tfs/IntegrationTests.java
  type IntegrationTests (line 7) | public interface IntegrationTests {

FILE: tfs/src/test/java/hudson/plugins/tfs/InterceptingTaskListener.java
  class InterceptingTaskListener (line 13) | public class InterceptingTaskListener implements TaskListener {
    method InterceptingTaskListener (line 19) | public InterceptingTaskListener(final TaskListener victim) {
    method getLogger (line 23) | public PrintStream getLogger() {
    method annotate (line 27) | public void annotate(final ConsoleNote ann) throws IOException {
    method hyperlink (line 31) | public void hyperlink(final String url, final String text) throws IOEx...
    method add (line 35) | private static void add(final List<String> destination, final String f...
    method error (line 42) | public PrintWriter error(final String msg) {
    method error (line 47) | public PrintWriter error(final String format, final Object... args) {
    method fatalError (line 52) | public PrintWriter fatalError(final String msg) {
    method fatalError (line 57) | public PrintWriter fatalError(final String format, final Object... arg...
    method getErrors (line 62) | public List<String> getErrors() {
    method getFatalErrors (line 66) | public List<String> getFatalErrors() {

FILE: tfs/src/test/java/hudson/plugins/tfs/LoggingFiltersSourceAdapter.java
  class LoggingFiltersSourceAdapter (line 16) | public class LoggingFiltersSourceAdapter extends HttpFiltersSourceAdapter {
    method getMaximumRequestBufferSizeInBytes (line 32) | @Override public int getMaximumRequestBufferSizeInBytes() {
    method getMaximumResponseBufferSizeInBytes (line 36) | @Override public int getMaximumResponseBufferSizeInBytes() {
    method filterRequest (line 40) | @Override public HttpFilters filterRequest(final HttpRequest originalR...
    method proxyWasUsed (line 54) | public boolean proxyWasUsed() {
    method reset (line 58) | public void reset() {

FILE: tfs/src/test/java/hudson/plugins/tfs/SwedishLocaleTestCase.java
  class SwedishLocaleTestCase (line 14) | public abstract class SwedishLocaleTestCase {
    method setToSwedishLocale (line 18) | @Before
    method resetDefaultLocale (line 24) | @After

FILE: tfs/src/test/java/hudson/plugins/tfs/TFSRevisionStateTest.java
  class TFSRevisionStateTest (line 13) | public class TFSRevisionStateTest {
    method exportedProperties (line 15) | @Test
    method assertCollectionContains (line 31) | private static <T> void assertCollectionContains(Iterable<T> actual, T...

FILE: tfs/src/test/java/hudson/plugins/tfs/TeamBuildEndpointTest.java
  class TeamBuildEndpointTest (line 9) | public class TeamBuildEndpointTest {
    method decodeCommandAndJobNames_typical (line 11) | @Test public void decodeCommandAndJobNames_typical() throws Exception {
    method decodeCommandAndJobNames_withDecoding (line 22) | @Test public void decodeCommandAndJobNames_withDecoding() throws Excep...
    method decodeCommandAndJobNames_noJob (line 33) | @Test public void decodeCommandAndJobNames_noJob() throws Exception {
    method decodeCommandAndJobNames_noJobNoSlash (line 43) | @Test public void decodeCommandAndJobNames_noJobNoSlash() throws Excep...

FILE: tfs/src/test/java/hudson/plugins/tfs/TeamCollectionConfigurationTest.java
  class TeamCollectionConfigurationTest (line 12) | public class TeamCollectionConfigurationTest {
    method assertSameCollectionUri (line 14) | private static void assertSameCollectionUri(final String a, final Stri...
    method areSameCollectionUri (line 18) | private static void areSameCollectionUri(final String a, final String ...
    method areSameCollectionUri_identity (line 27) | @Test public void areSameCollectionUri_identity() throws Exception {
    method areSameCollectionUri_typical (line 32) | @Test public void areSameCollectionUri_typical() throws Exception {
    method areSameCollectionUri_withSlashes (line 39) | @Test public void areSameCollectionUri_withSlashes() throws Exception {
    method areSameCollectionUri_withoutSlashes (line 46) | @Test public void areSameCollectionUri_withoutSlashes() throws Excepti...
    method checkTeamServices_serverOnly (line 54) | @Test public void checkTeamServices_serverOnly() throws Exception {
    method checkTeamServices_serverWithSlash (line 62) | @Test public void checkTeamServices_serverWithSlash() throws Exception {
    method checkTeamServices_serverWithDefaultCollection (line 70) | @Test public void checkTeamServices_serverWithDefaultCollection() thro...
    method checkTeamServices_serverWithDefaultCollectionSlash (line 78) | @Test public void checkTeamServices_serverWithDefaultCollectionSlash()...
    method checkTeamServices_gitUrl (line 86) | @Test public void checkTeamServices_gitUrl() throws Exception {

FILE: tfs/src/test/java/hudson/plugins/tfs/TeamEventsEndpointTest.java
  class TeamEventsEndpointTest (line 20) | public class TeamEventsEndpointTest {
    method deserializeEvent_sample (line 25) | @Test
    method innerDispatch_fakedGitPushEventHandling (line 35) | @Test
    class FakedGitPush (line 44) | private static class FakedGitPush extends AbstractHookEvent {
      method create (line 47) | @Override
      method getSampleRequestPayload (line 52) | @Override
      method perform (line 58) | @Override

FILE: tfs/src/test/java/hudson/plugins/tfs/TeamFoundationServerScmIntegrationTest.java
  class TeamFoundationServerScmIntegrationTest (line 15) | @Category(IntegrationTests.class)
    method connectToTfs (line 20) | @Before
    method sample (line 28) | @Test

FILE: tfs/src/test/java/hudson/plugins/tfs/TeamFoundationServerScmTest.java
  class TeamFoundationServerScmTest (line 46) | @SuppressWarnings("unchecked")
    method tearDown (line 51) | @After public void tearDown() throws Exception {
    method upgradeFromScrambledPassword (line 63) | @Test public void upgradeFromScrambledPassword() {
    method assertWorkspaceNameReplacesJobName (line 119) | @Test
    method assertDoProjectPathCheckRegexWorks (line 130) | @Test
    method assertDoWorkspaceNameCheckRegexWorks (line 139) | @Test
    method assertCloakedPathsCheckRegexWorks (line 153) | @Test
    method isCloakedPathValid (line 174) | private static boolean isCloakedPathValid(final String path) {
    method serializeCloakedPathCollectionToString_one (line 178) | @Test
    method serializeCloakedPathCollectionToString_two (line 187) | @Test
    method serializeCloakedPathCollectionToString_many (line 196) | @Test
    method splitCloakedPaths_one (line 205) | @Test
    method splitCloakedPaths_newlinesMany (line 214) | @Test
    method splitCloakedPaths_newlinesWithLiberalSpacing (line 223) | @Test
    method splitCloakedPaths_newlinesWithBlankLines (line 232) | @Test
    method areEqual (line 241) | private static <T> void areEqual(final Collection<T> actual, T... expe...
    method assertDefaultValueIsUsedForNullLocalPath (line 261) | @Test
    method assertDefaultValueIsUsedForEmptyLocalPath (line 267) | @Test
    method assertDefaultValueIsUsedForEmptyWorkspaceName (line 275) | @Test
    method assertGetModuleRootReturnsWorkFolder (line 281) | @Test
    method assertGetModuleRootWorksForDotWorkFolder (line 291) | @Test
    method assertTeamServicesBuildVariablesAreAddedToEnvVars (line 301) | @Test
    method assertWorkspaceNameIsAddedToEnvVars (line 329) | @Test
    method createForEnvVars (line 342) | private TeamFoundationServerScm createForEnvVars() {
    method assertWorksfolderPathIsAddedToEnvVars (line 348) | @Test
    method assertProjectPathIsAddedToEnvVars (line 358) | @Test
    method assertServerUrlIsAddedToEnvVars (line 366) | @Test
    method assertTfsUserNameIsAddedToEnvVars (line 374) | @Test
    method assertTfsWorkspaceChangesetIsAddedToEnvVars (line 382) | @Test
    method assertTfsWorkspaceChangesetIsNotAddedToEnvVarsIfEmpty (line 391) | @Test
    method assertTfsWorkspaceChangesetIsNotAddedToEnvVarsIfNull (line 400) | @Test
    method recordWorkspaceChangesetVersion (line 409) | @Test public void recordWorkspaceChangesetVersion() throws Exception {
    method recordWorkspaceChangesetVersionWithSingleVersionSpec (line 428) | @Test public void recordWorkspaceChangesetVersionWithSingleVersionSpec...
    method assertWorkspaceNameReplacesInvalidChars (line 449) | @Test
    method assertWorkspaceNameReplacesEndingPeriod (line 458) | @Test
    method assertWorkspaceNameReplacesEndingSpace (line 467) | @Test
    method assertServerUrlResolvesBuildVariables (line 473) | @Test public void assertServerUrlResolvesBuildVariables() {
    method assertProjectPathResolvesBuildVariables (line 483) | @Test public void assertProjectPathResolvesBuildVariables() {
    method assertWorkspaceNameResolvesBuildVariables (line 493) | @Test public void assertWorkspaceNameResolvesBuildVariables() {
    method assertTfsWorkspaceIsntRemovedIfThereIsNoBuildWhenProcessWorkspaceBeforeDeletion (line 503) | @Test public void assertTfsWorkspaceIsntRemovedIfThereIsNoBuildWhenPro...
    method assertWorkspaceIsntRemoveIfThereIsNoBuildOnSpecifiedNodeAndHudsonWantsToRemoveWorkspaceOnNode (line 512) | @Test public void assertWorkspaceIsntRemoveIfThereIsNoBuildOnSpecified...

FILE: tfs/src/test/java/hudson/plugins/tfs/Util.java
  class Util (line 9) | public class Util {
    method Util (line 11) | private Util() {
    method getCalendar (line 14) | public static Calendar getCalendar(int year, int month, int day) {
    method getCalendar (line 18) | public static Calendar getCalendar(int year, int month, int day, int h...
    method getCalendar (line 22) | public static Calendar getCalendar(int year, int month, int day, int h...
    method getCalendar (line 26) | public static Calendar getCalendar(int year, int month, int day, int h...
    method createTempFilePath (line 39) | public static FilePath createTempFilePath() throws Exception {
    method toBoxedArray (line 52) | public static Boolean[] toBoxedArray(boolean[] array) {

FILE: tfs/src/test/java/hudson/plugins/tfs/actions/CheckoutActionTest.java
  class CheckoutActionTest (line 33) | public class CheckoutActionTest {
    method setup (line 44) | @Before public void setup() throws Exception {
    method teardown (line 49) | @After public void teardown() throws Exception {
    method prepareCommonMocks (line 55) | private void prepareCommonMocks() {
    method assertFirstCheckoutBySingleVersionSpecNotUsingUpdate (line 64) | @Test
    method assertFirstCheckoutNotUsingUpdate (line 79) | @Test
    method assertFirstCheckoutBySingleVersionSpecUsingUpdate (line 94) | @Test
    method assertFirstCheckoutUsingUpdate (line 108) | @Test
    method assertSecondCheckoutBySingleVersionSpecUsingUpdate (line 122) | @Test
    method assertSecondCheckoutUsingUpdate (line 136) | @Test
    method assertSecondCheckoutBySingleVersionSpecNotUsingUpdate (line 150) | @Test
    method assertSecondCheckoutNotUsingUpdate (line 165) | @Test
    method assertDetailedHistoryIsNotRetrievedInFirstBuildCheckingOutByLabel (line 180) | @Test
    method assertDetailedHistoryIsNotRetrievedInFirstBuild (line 192) | @Test
    method assertDetailedHistoryIsRetrievedInSecondBuildCheckingOutByLabel (line 204) | @Test
    method assertDetailedHistoryIsRetrievedInSecondBuild (line 220) | @Test
    method assertWorkFolderIsCleanedIfNotUsingUpdate (line 239) | @Test
    method assertWorkFolderIsCleanedIfNotUsingUpdateCheckingOutByLabel (line 257) | @Test
    method assertWorkspaceIsNotCleanedIfUsingUpdate (line 275) | @Test
    method assertCheckoutBySingleVersionSpecDeletesWorkspaceAtStartIfNotUsingUpdate (line 292) | @Bug(3882)
    method assertCheckoutDeletesWorkspaceAtStartIfNotUsingUpdate (line 312) | @Bug(3882)
    method assertCheckoutDoesNotDeleteWorkspaceAtStartIfUsingUpdate (line 332) | @Bug(3882)
    method assertCheckoutBySingleVersionSpecDoesNotDeleteWorkspaceAtStartIfUsingUpdate (line 348) | @Bug(3882)
    method assertCheckoutDoesNotDeleteWorkspaceIfNotUsingUpdateAndThereIsNoWorkspace (line 364) | @Bug(3882)
    method assertCheckoutBySingleVersionSpecDoesNotDeleteWorkspaceIfNotUsingUpdateAndThereIsNoWorkspace (line 381) | @Bug(3882)
    method assertCheckoutOnlyRetrievesChangesToTheStartTimestampForCurrentBuild (line 398) | @Bug(6596)
    class DateVersionSpecMatcher (line 423) | private static class DateVersionSpecMatcher extends CustomMatcher<Date...
      method DateVersionSpecMatcher (line 427) | public DateVersionSpecMatcher(final DateVersionSpec base) {
      method matches (line 432) | public boolean matches(final Object item) {
    method determineCheckoutPath_absoluteOverrideOnNix (line 446) | @Test
    method determineCheckoutPath_absoluteOverrideOnWindows (line 458) | @Test
    method determineCheckoutPath_absoluteOverrideOnWindowsWithForwardSlashes (line 470) | @Test
    method determineCheckoutPath_defaultOnNix (line 482) | @Test
    method determineCheckoutPath_defaultOnWindows (line 493) | @Test
    method determineCheckoutPath_defaultOnWindowsWithForwardSlashes (line 504) | @Test
    method determineCheckoutPath_relativeOnNix (line 515) | @Test
    method determineCheckoutPath_relativeOnWindows (line 526) | @Test
    method determineCheckoutPath_relativeOnWindowsWithForwardSlashes (line 537) | @Test

FILE: tfs/src/test/java/hudson/plugins/tfs/actions/RemoveWorkspaceActionTest.java
  class RemoveWorkspaceActionTest (line 16) | public class RemoveWorkspaceActionTest {
    method setUp (line 21) | @Before public void setUp() throws Exception {
    method assertNoSuchWorkspaceNameDoesNothing (line 25) | @Test
    method assertWorkspaceIsDeleted (line 40) | @Test

FILE: tfs/src/test/java/hudson/plugins/tfs/browsers/TeamSystemWebAccessBrowserTest.java
  class TeamSystemWebAccessBrowserTest (line 19) | @SuppressWarnings("rawtypes")
    method assertChangeSetLinkWithServerUrlWithPort (line 22) | @Test public void assertChangeSetLinkWithServerUrlWithPort() throws Ex...
    method assertChangeSetLinkWithRealisticServerUrlWithPort (line 29) | @Test public void assertChangeSetLinkWithRealisticServerUrlWithPort() ...
    method assertChangeSetLinkWithRealisticServerUrl (line 36) | @Test public void assertChangeSetLinkWithRealisticServerUrl() throws E...
    method assertChangeSetLinkWithOnlyServerUrl (line 43) | @Bug(7394)
    method assertChangeSetLinkWithOnlyServerUrlWithTrailingSlash (line 52) | @Bug(7394)
    method createTestScm (line 61) | private static TeamFoundationServerScm createTestScm(String serverUrl) {
    method assertChangeSetLinkUsesScmConfiguration (line 74) | @Test public void assertChangeSetLinkUsesScmConfiguration() throws Exc...
    method assertChangeSetLinkUsesScmConfigurationNoSlash (line 89) | @Test public void assertChangeSetLinkUsesScmConfigurationNoSlash() thr...
    method assertFileLinkUsesScmConfiguration (line 105) | @Test public void assertFileLinkUsesScmConfiguration() throws Exception {
    method assertDiffLinkUsesScmConfiguration (line 122) | @Test public void assertDiffLinkUsesScmConfiguration() throws Exception {
    method assertFileLink (line 139) | @Test public void assertFileLink() throws Exception {
    method assertFileLinkWithRealisticServerUrl (line 148) | @Test public void assertFileLinkWithRealisticServerUrl() throws Except...
    method assertDiffLink (line 157) | @Test public void assertDiffLink() throws Exception {
    method assertDiffLinkWithRealisticServerUrl (line 166) | @Test public void assertDiffLinkWithRealisticServerUrl() throws Except...
    method assertNullDiffLinkForAddedFile (line 175) | @Test public void assertNullDiffLinkForAddedFile() throws Exception {

FILE: tfs/src/test/java/hudson/plugins/tfs/commands/AbstractCallableCommandTest.java
  class AbstractCallableCommandTest (line 32) | public abstract class AbstractCallableCommandTest {
    method configureDefaultMocks (line 39) | @Before
    method assertLog (line 51) | protected void assertLog(final String... expectedLines) throws IOExcep...
    method createCommand (line 71) | protected abstract AbstractCallableCommand createCommand(final ServerC...
    method verifySerializable (line 73) | @Test public void verifySerializable() throws IOException {

FILE: tfs/src/test/java/hudson/plugins/tfs/commands/AbstractCommandTest.java
  class AbstractCommandTest (line 11) | public class AbstractCommandTest {
    method assertAddingServerArguments (line 13) | @Test
    method assertAddingUserCredentials (line 24) | @Test
    method assertNotAddingInvalidUserCredentials (line 37) | @Test
    method assertNotAddingUserCredentialsForEmptyName (line 50) | @Test
    method assertAddingUserCredentialsForEmptyPassword (line 63) | @Test
    class AbstractCommandImpl (line 76) | private static class AbstractCommandImpl extends AbstractCommand {
      method AbstractCommandImpl (line 78) | public AbstractCommandImpl(ServerConfigurationProvider provider) {
      method getArguments (line 82) | public MaskedArgumentListBuilder getArguments() {

FILE: tfs/src/test/java/hudson/plugins/tfs/commands/DeleteWorkspaceCommandTest.java
  class DeleteWorkspaceCommandTest (line 18) | public class DeleteWorkspaceCommandTest extends AbstractCallableCommandT...
    method assertLogging (line 20) | @Test
    method createCommand (line 41) | @Override protected AbstractCallableCommand createCommand(final Server...

FILE: tfs/src/test/java/hudson/plugins/tfs/commands/GetFilesToWorkFolderCommandTest.java
  class GetFilesToWorkFolderCommandTest (line 14) | public class GetFilesToWorkFolderCommandTest extends AbstractCallableCom...
    method assertLogging (line 16) | @Ignore("Finish test when we have MockableWorkspace and MockableVersio...
    method onGet_typical (line 32) | @Test public void onGet_typical() throws IOException {
    method createCommand (line 46) | @Override protected AbstractCallableCommand createCommand(final Server...

FILE: tfs/src/test/java/hudson/plugins/tfs/commands/LabelCommandTest.java
  class LabelCommandTest (line 16) | public class LabelCommandTest extends AbstractCallableCommandTest {
    method assertLogging (line 18) | @Test public void assertLogging() throws Exception {
    method createCommand (line 43) | @Override protected AbstractCallableCommand createCommand(final Server...

FILE: tfs/src/test/java/hudson/plugins/tfs/commands/ListWorkspacesCommandTest.java
  class ListWorkspacesCommandTest (line 31) | public class ListWorkspacesCommandTest extends AbstractCallableCommandTe...
    method assertLoggingWithComputer (line 33) | @Category(IntegrationTests.class)
    method assertLoggingWithoutComputer (line 80) | @Category(IntegrationTests.class)
    method assertEmptyListWithEmptyOutput (line 127) | @Test
    method assertListWithValidOutput (line 135) | @Test
    method assertListWithWorkspaceContainingSpace (line 161) | @Test
    method assertNoIndexOutOfBoundsIsThrown (line 178) | @Bug(4666)
    method assertNoIndexOutOfBoundsIsThrownSecondEdition (line 192) | @Bug(4726)
    method logWithNoWorkspaces (line 205) | @Test public void logWithNoWorkspaces() throws IOException {
    method logWithManyWorkspaces (line 215) | @Test public void logWithManyWorkspaces() throws IOException {
    method logWithOneWorkspace (line 231) | @Test public void logWithOneWorkspace() throws IOException {
    method createCommand (line 245) | @Override protected AbstractCallableCommand createCommand(final Server...

FILE: tfs/src/test/java/hudson/plugins/tfs/commands/NewWorkspaceCommandTest.java
  class NewWorkspaceCommandTest (line 18) | public class NewWorkspaceCommandTest extends AbstractCallableCommandTest {
    method assertLogging (line 22) | @Test public void assertLogging() throws Exception {
    method assertLoggingWhenAlsoMapping (line 52) | @Test public void assertLoggingWhenAlsoMapping() throws Exception {
    method createCommand (line 86) | @Override protected AbstractCallableCommand createCommand(final Server...

FILE: tfs/src/test/java/hudson/plugins/tfs/commands/RemoteChangesetVersionCommandTest.java
  class RemoteChangesetVersionCommandTest (line 34) | public class RemoteChangesetVersionCommandTest extends AbstractCallableC...
    method assertLoggingWhenChangeset (line 38) | @Test public void assertLoggingWhenChangeset() throws Exception {
    method assertLoggingWhenNoResult (line 92) | @Test public void assertLoggingWhenNoResult() throws Exception {
    method assertNoChangesWithEmptyOutput (line 123) | @Test
    method assertChangesWithEmptyToolOutput (line 130) | @Test
    method assertChangesWithChangeOutput (line 138) | @Test
    method assertChangesWithNoComment (line 151) | @Test
    method assertChangesNoEmptyLine (line 164) | @Test
    method getVersionSpecificationWhenDateVersionSpec (line 176) | @Test public void getVersionSpecificationWhenDateVersionSpec() {
    method getVersionSpecificationWhenChangesetVersionSpec (line 183) | @Test public void getVersionSpecificationWhenChangesetVersionSpec() {
    method getVersionSpecificationWhenLabelVersionSpecWithoutScope (line 191) | @Test public void getVersionSpecificationWhenLabelVersionSpecWithoutSc...
    method getVersionSpecificationWhenLabelVersionSpecWithScope (line 199) | @Test public void getVersionSpecificationWhenLabelVersionSpecWithScope...
    method createCommand (line 207) | @Override protected AbstractCallableCommand createCommand(final Server...

FILE: tfs/src/test/java/hudson/plugins/tfs/model/AbstractHookEventTest.java
  class AbstractHookEventTest (line 10) | public class AbstractHookEventTest {

FILE: tfs/src/test/java/hudson/plugins/tfs/model/ChangeLogSetIntegrationTest.java
  class ChangeLogSetIntegrationTest (line 9) | public class ChangeLogSetIntegrationTest extends HudsonTestCase {
    method testThatLogSetContainsCheckedInByUserReference (line 15) | @LocalData

FILE: tfs/src/test/java/hudson/plugins/tfs/model/ChangeLogSetTest.java
  class ChangeLogSetTest (line 11) | public class ChangeLogSetTest {
    method assertChangeSetsHaveLogSetParent (line 13) | @Test
    method assertIsEmptyReturnsFalseWhenNoChangesets (line 22) | @Test
    method assertIsEmptyReturnsTrueWithChangesets (line 29) | @Test

FILE: tfs/src/test/java/hudson/plugins/tfs/model/ChangeSetTest.java
  class ChangeSetTest (line 14) | public class ChangeSetTest {
    method assertMsgReturnsComment (line 16) | @Test
    method assertAffectedPathsReturnsPaths (line 22) | @Test
    method assertAddedItemReturnsAddEditType (line 35) | @Test
    method assertDeletedItemReturnsDeleteEditType (line 41) | @Test
    method assertModifiedItemReturnsEditEditType (line 47) | @Test
    method assertUserNameIsSetCorrectly (line 53) | @Test
    method assertDomainNameIsSetCorrectly (line 59) | @Test

FILE: tfs/src/test/java/hudson/plugins/tfs/model/GitCodePushedEventArgsTest.java
  class GitCodePushedEventArgsTest (line 9) | public class GitCodePushedEventArgsTest {

FILE: tfs/src/test/java/hudson/plugins/tfs/model/GitPullRequestMergedEventTest.java
  class GitPullRequestMergedEventTest (line 12) | public class GitPullRequestMergedEventTest {

FILE: tfs/src/test/java/hudson/plugins/tfs/model/GitPushEventTest.java
  class GitPushEventTest (line 24) | public class GitPushEventTest {
    method determineCollectionUri_sample (line 26) | @Test
    method perform_noCommitsInPayload (line 36) | @Test

FILE: tfs/src/test/java/hudson/plugins/tfs/model/GitStatusContextTest.java
  class GitStatusContextTest (line 9) | public class GitStatusContextTest {
    method fromJsonString_typical (line 17) | @Test public void fromJsonString_typical() throws Exception {

FILE: tfs/src/test/java/hudson/plugins/tfs/model/NativeLibraryManagerTest.java
  class NativeLibraryManagerTest (line 17) | public class NativeLibraryManagerTest {
    method buildPathToNativeFile_threeComponents (line 19) | @Test public void buildPathToNativeFile_threeComponents() throws Excep...
    method buildPathToNativeFile_twoComponents (line 26) | @Test public void buildPathToNativeFile_twoComponents() throws Excepti...
    method extractFile (line 33) | @Test public void extractFile() throws IOException {
    method extractFile_noArch (line 45) | @Test public void extractFile_noArch() throws IOException {
    method extractFiles (line 57) | @Test public void extractFiles() throws Exception {

FILE: tfs/src/test/java/hudson/plugins/tfs/model/ProjectTest.java
  class ProjectTest (line 37) | public class ProjectTest extends SwedishLocaleTestCase {
    method createServerChange (line 39) | private com.microsoft.tfs.core.clients.versioncontrol.soapextensions.C...
    method assertConvertServerChange (line 49) | @Test
    method createMockUserLookup (line 59) | private UserLookup createMockUserLookup(String accountName, String dis...
    method assertConvertServerChangeset (line 74) | @Test
    method findLatestUncloakedChangeset_latestIsUncloaked (line 107) | @Test
    method findLatestUncloakedChangeset_latestIsCloaked (line 120) | @Test
    method findLatestUncloakedChangeset_everythingIsCloaked (line 133) | @Test
    method createChangeSet (line 146) | private static ChangeSet createChangeSet(final int version, final Stri...
    method isChangesetFullyCloaked_nullCloakedPaths (line 160) | @Test
    method isChangesetFullyCloaked_independentCloakedPaths (line 170) | @Test
    method isChangesetFullyCloaked_caseInsensitiveCloakedPaths (line 180) | @Test
    method isChangesetFullyCloaked_cloakingChild (line 190) | @Test
    method isChangesetFullyCloaked_partiallyCloakedPaths (line 200) | @Test
    method isChangesetFullyCloaked_fullyCloakedPath (line 210) | @Test
    method isChangesetFullyCloaked_fullyCloakedPaths (line 220) | @Test
    method isChangesetFullyCloaked_manyToMany (line 230) | @Test
    method getDetailedHistory_singleVersionSpec (line 240) | @Category(IntegrationTests.class)

FILE: tfs/src/test/java/hudson/plugins/tfs/model/PullRequestMergeCommitCreatedEventArgsTest.java
  class PullRequestMergeCommitCreatedEventArgsTest (line 9) | public class PullRequestMergeCommitCreatedEventArgsTest {

FILE: tfs/src/test/java/hudson/plugins/tfs/model/ServerIntegrationTest.java
  class ServerIntegrationTest (line 12) | public class ServerIntegrationTest {
    method canFindTfsSdkNativeLibraries (line 16) | @Test(expected = TECoreException.class)

FILE: tfs/src/test/java/hudson/plugins/tfs/model/ServerTest.java
  class ServerTest (line 11) | public class ServerTest {
    method setup (line 13) | @Before
    method createServer (line 18) | static Server createServer() throws IOException {
    method assertGetWorkspacesReturnSameObject (line 22) | @Test
    method assertGetProjectWithSameProjectPathReturnsSameInstance (line 29) | @Test
    method assertGetProjectWithDifferentProjectPathReturnsNotSameInstance (line 37) | @Test

FILE: tfs/src/test/java/hudson/plugins/tfs/model/TeamGitStatusTest.java
  class TeamGitStatusTest (line 10) | public class TeamGitStatusTest {
    method toJson_typical (line 12) | @Test public void toJson_typical() {
    method fromJsonString_server (line 35) | @Test public void fromJsonString_server() throws Exception {

FILE: tfs/src/test/java/hudson/plugins/tfs/model/WorkspaceConfigurationTest.java
  class WorkspaceConfigurationTest (line 11) | public class WorkspaceConfigurationTest {
    method assertConfigurationsEquals (line 15) | @Test public void assertConfigurationsEquals() {

FILE: tfs/src/test/java/hudson/plugins/tfs/model/WorkspacesTest.java
  class WorkspacesTest (line 21) | public class WorkspacesTest {
    method setup (line 28) | @Before
    method parse (line 34) | private List<Workspace> parse(final String s) throws IOException {
    method assertListFromServerIsParsedProperly (line 39) | @Test
    method assertListFromServerIsRetrievedOnce (line 51) | @Test
    method assertExistsWorkspace (line 67) | @Test
    method assertWorkspaceExistsWithOnlyName (line 78) | @Test
    method assertNewWorkspaceIsAddedToMap (line 89) | @Test
    method assertGettingNewWorkspaceIsNotRetrievingServerList (line 99) | @Test
    method assertNewWorkspaceExistsIsNotRetrievingServerList (line 109) | @Test
    method assertWorkspaceIsDeletedFromMap (line 119) | @Test
    method assertGetUnknownWorkspaceReturnsNull (line 131) | @Test
    method assertUnknownWorkspaceDoesNotExists (line 138) | @Test
    method assertWorkspaceFactory (line 145) | @Test

FILE: tfs/src/test/java/hudson/plugins/tfs/model/servicehooks/EventScopeTest.java
  class EventScopeTest (line 10) | public class EventScopeTest {
    method deserialize_enumCasing (line 12) | @Test

FILE: tfs/src/test/java/hudson/plugins/tfs/util/BuildVariableResolverTest.java
  class BuildVariableResolverTest (line 21) | @SuppressWarnings("unchecked")
    method before (line 28) | @Before public void before() throws Exception {
    method assertConstructorBuildUsesProject (line 32) | @Test public void assertConstructorBuildUsesProject() throws IOExcepti...
    method assertJobNameIsResolved (line 40) | @Test public void assertJobNameIsResolved() {
    method assertJobNameWithoutComputerIsResolved (line 48) | @Test public void assertJobNameWithoutComputerIsResolved() {
    method assertComputerEnvVarIsResolved (line 56) | @Test public void assertComputerEnvVarIsResolved() throws Exception {
    method assertComputerUserNameIsResolved (line 67) | @Test public void assertComputerUserNameIsResolved() throws Exception {
    method assertNodeNameIsResolved (line 78) | @Test public void assertNodeNameIsResolved() {
    method assertMasterNodeNameIsResolved (line 89) | @Test public void assertMasterNodeNameIsResolved() {
    method assertNoComputeraDoesNotThrowNPEWhenResolvingNodeName (line 97) | @Test public void assertNoComputeraDoesNotThrowNPEWhenResolvingNodeNam...
    method assertBuildEnvVarIsResolved (line 103) | @Test public void assertBuildEnvVarIsResolved() throws Exception {

FILE: tfs/src/test/java/hudson/plugins/tfs/util/BuildWorkspaceConfigurationRetrieverTest.java
  class BuildWorkspaceConfigurationRetrieverTest (line 20) | @SuppressWarnings("unchecked")
    method assertGetLatestConfgiurationOnNode (line 25) | @Test
    method assertGetLatestConfgiurationOnNodeWithNoPrevioudBuild (line 47) | @Test
    method assertGetLatestConfigurationOnNodeWithNoPrevioudScmConfiguration (line 67) | @Test
    method assertGetLatestConfgiurationOnNodeWithNoAbstractBuild (line 85) | @Test
    method assertSaveWorkspaceConfigurationUsesSaveOnBuild (line 94) | @Test
    method assertGetLatestConfgiurationOnPreviousDeletedNode (line 110) | @Bug(8322)

FILE: tfs/src/test/java/hudson/plugins/tfs/util/DateUtilTest.java
  class DateUtilTest (line 11) | public class DateUtilTest {
    method toString_date (line 16) | @Test
    method toString_calendar (line 23) | @Test
    method toString_dateVersionSpec (line 30) | @Test

FILE: tfs/src/test/java/hudson/plugins/tfs/util/KeyValueTextReaderTest.java
  class KeyValueTextReaderTest (line 9) | public class KeyValueTextReaderTest {
    method assertKeysAreRead (line 11) | @Test
    method assertValueIsTrimmed (line 18) | @Test
    method assertKeyContainsSpace (line 24) | @Test
    method assertMultilineDataIsRead (line 30) | @Test
    method asserOnlyKeyIsReadIfValueContainsColon (line 36) | @Test
    method assertValueBeginingOnNextRowIsParsedWithoutPrefixedEndline (line 42) | @Test

FILE: tfs/src/test/java/hudson/plugins/tfs/util/MaskedArgumentListBuilderTest.java
  class MaskedArgumentListBuilderTest (line 9) | public class MaskedArgumentListBuilderTest {
    method assertEmptyMask (line 11) | @Test
    method assertLastArgumentIsMasked (line 23) | @Test
    method assertSeveralMaskedArguments (line 35) | @Test
    method assertPrependAfterAddingMasked (line 49) | @Test
    method assertPrependBeforeAddingMasked (line 62) | @Test

FILE: tfs/src/test/java/hudson/plugins/tfs/util/QueryStringTest.java
  class QueryStringTest (line 9) | public class QueryStringTest {
    method toString_typical (line 11) | @Test public void toString_typical() throws Exception {
    method constructor_typical (line 20) | @Test public void constructor_typical() throws Exception {
    method constructor_twoPairs (line 29) | @Test public void constructor_twoPairs() throws Exception {
    method constructor_oddParameters (line 38) | @Test(expected = IllegalArgumentException.class)

FILE: tfs/src/test/java/hudson/plugins/tfs/util/StringHelperTest.java
  class StringHelperTest (line 9) | public class StringHelperTest {
    method determineContentTypeWithoutCharset_null (line 11) | @Test public void determineContentTypeWithoutCharset_null() throws Exc...
    method determineContentTypeWithoutCharset_withoutCharset (line 17) | @Test public void determineContentTypeWithoutCharset_withoutCharset() ...
    method determineContentTypeWithoutCharset_withCharset (line 25) | @Test public void determineContentTypeWithoutCharset_withCharset() thr...

FILE: tfs/src/test/java/hudson/plugins/tfs/util/TeamRestClientTest.java
  class TeamRestClientTest (line 21) | public class TeamRestClientTest {
    method setUp (line 25) | @Before public void setUp() throws Exception {
    method tearDown (line 29) | @After public void tearDown() throws Exception {
    method createAuthorization_typical (line 35) | @Test public void createAuthorization_typical() throws Exception {
    method ping (line 49) | @Ignore("Only works on visualstudio.com due to the use of the Authoriz...

FILE: tfs/src/test/java/hudson/plugins/tfs/util/TextTableParserTest.java
  class TextTableParserTest (line 11) | public class TextTableParserTest {
    method assertThatReaderWithoutTableIsParsed (line 13) | @Test public void assertThatReaderWithoutTableIsParsed() throws Except...
    method assertColumnCount (line 18) | @Test public void assertColumnCount() throws Exception {
    method assertDashInTextIsIgnored (line 24) | @Bug(4666)
    method assertGetColumn (line 31) | @Test public void assertGetColumn() throws Exception {
    method assertNextRow (line 41) | @Test public void assertNextRow() throws Exception {
    method assertNextRowWithNonsenseLine (line 51) | @Test public void assertNextRowWithNonsenseLine() throws Exception {
    method assertGetColumnWorksIfLastcolumnIsShorterThanLastColumnLength (line 64) | @Test public void assertGetColumnWorksIfLastcolumnIsShorterThanLastCol...
    method assertGetColumnWorksIfColumnIsShorter (line 74) | @Test public void assertGetColumnWorksIfColumnIsShorter() throws Excep...
    method assertTableStartsImmediately (line 82) | @Test public void assertTableStartsImmediately() throws Exception {
    method assertNextRowWorksWithOptionalColumns (line 92) | @Test public void assertNextRowWorksWithOptionalColumns() throws Excep...
    method assertGetColumnAfterLastRowThrowsException (line 105) | @Test(expected=IllegalStateException.class) public void assertGetColum...

FILE: tfs/src/test/java/hudson/plugins/tfs/util/UriHelperTest.java
  class UriHelperTest (line 12) | public class UriHelperTest {
    method setUp (line 16) | @Before public void setUp() {
    method assertSame (line 21) | private static void assertSame(final String a, final String b) {
    method assertNotSame (line 25) | private static void assertNotSame(final String a, final String b) {
    method areSame (line 29) | private static void areSame(final String a, final String b, final bool...
    method areSame_bothNull (line 39) | @Test public void areSame_bothNull() throws Exception {
    method areSame_sameInstance (line 43) | @Test public void areSame_sameInstance() throws Exception {
    method areSame_identity (line 48) | @Test public void areSame_identity() throws Exception {
    method areSame_endsWithSlash (line 52) | @Test public void areSame_endsWithSlash() throws Exception {
    method areSame_schemeCase (line 56) | @Test public void areSame_schemeCase() throws Exception {
    method areSame_hostCase (line 60) | @Test public void areSame_hostCase() throws Exception {
    method areSame_implicitPort (line 64) | @Test public void areSame_implicitPort() throws Exception {
    method areSame_withPathSlash (line 68) | @Test public void areSame_withPathSlash() throws Exception {
    method areSame_withPathWithoutSlash (line 72) | @Test public void areSame_withPathWithoutSlash() throws Exception {
    method areSame_withPathQuery (line 76) | @Test public void areSame_withPathQuery() throws Exception {
    method areSame_withPathQueryFragment (line 80) | @Test public void areSame_withPathQueryFragment() throws Exception {
    method areSame_oneNull (line 85) | @Test public void areSame_oneNull() throws Exception {
    method areSame_differentScheme (line 90) | @Test public void areSame_differentScheme() throws Exception {
    method areSame_differentHost (line 95) | @Test public void areSame_differentHost() throws Exception {
    method areSame_differentPort (line 100) | @Test public void areSame_differentPort() throws Exception {
    method areSame_differentPath (line 105) | @Test public void areSame_differentPath() throws Exception {
    method areSame_differentQuery (line 110) | @Test public void areSame_differentQuery() throws Exception {
    method areSame_differentFragment (line 115) | @Test public void areSame_differentFragment() throws Exception {
    method areSame_differentFragmentAfterQuery (line 120) | @Test public void areSame_differentFragmentAfterQuery() throws Excepti...
    method assertSameGitRepo (line 126) | private static void assertSameGitRepo(final String a, final String b) {
    method assertNotSameGitRepo (line 130) | private static void assertNotSameGitRepo(final String a, final String ...
    method areSameGitRepo (line 134) | private static void areSameGitRepo(final String a, final String b, fin...
    method areSameGitRepo_withoutDefaultCollection (line 143) | @Test public void areSameGitRepo_withoutDefaultCollection() throws Exc...
    method areSameGitRepo_withDefaultCollection (line 150) | @Test public void areSameGitRepo_withDefaultCollection() throws Except...
    method areSameGitRepo_withMixedCaseDefaultCollection (line 157) | @Test public void areSameGitRepo_withMixedCaseDefaultCollection() thro...
    method areSameGitRepo_differentProject (line 164) | @Test public void areSameGitRepo_differentProject() throws Exception {
    method areSameGitRepo_differentRepo (line 171) | @Test public void areSameGitRepo_differentRepo() throws Exception {
    method areSameGitRepo_mixTeamServicesDefaultCollection (line 178) | @Test public void areSameGitRepo_mixTeamServicesDefaultCollection() th...
    method areSameGitRepo_mixTfsDefaultCollection (line 185) | @Test public void areSameGitRepo_mixTfsDefaultCollection() throws Exce...
    method areSameGitRepo_differentPorts (line 192) | @Test public void areSameGitRepo_differentPorts() throws Exception {
    method areSameGitRepo_teamServicesDifferentProtocols (line 199) | @Test public void areSameGitRepo_teamServicesDifferentProtocols() thro...
    method areSameGitRepo_tfsDifferentProtocols (line 206) | @Test public void areSameGitRepo_tfsDifferentProtocols() throws Except...
    method hasPath_hostOnly (line 213) | @Test public void hasPath_hostOnly() throws Exception {
    method hasPath_hostSlash (line 221) | @Test public void hasPath_hostSlash() throws Exception {
    method hasPath_path (line 229) | @Test public void hasPath_path() throws Exception {
    method hasPath_pathSlash (line 237) | @Test public void hasPath_pathSlash() throws Exception {
    method join_uriNoSlash_pathComponents (line 246) | @Test public void join_uriNoSlash_pathComponents() throws Exception {
    method join_noSlash_pathComponents (line 254) | @Test public void join_noSlash_pathComponents() throws Exception {
    method join_withSlash_pathComponents (line 262) | @Test public void join_withSlash_pathComponents() throws Exception {
    method join_noSlash_queryString (line 270) | @Test public void join_noSlash_queryString() throws Exception {
    method join_withSlash_queryString (line 278) | @Test public void join_withSlash_queryString() throws Exception {
    method join_noSlash_pathAndQueryString (line 286) | @Test public void join_noSlash_pathAndQueryString() throws Exception {
    method join_withSlash_pathAndQueryString (line 294) | @Test public void join_withSlash_pathAndQueryString() throws Exception {
    method join_urlEncoding (line 302) | @Test public void join_urlEncoding() throws Exception {
    method join_sampleApiCall (line 310) | @Test public void join_sampleApiCall() throws Exception {

FILE: tfs/src/test/java/hudson/plugins/tfs/util/XmlHelperTest.java
  class XmlHelperTest (line 24) | public class XmlHelperTest {
    method peekValue_Document (line 26) | @Test public void peekValue_Document() throws Exception {
    method peekValue_File (line 53) | @Test public void peekValue_File() throws Exception {
    method pokeValue_Document (line 70) | @Test public void pokeValue_Document() throws Exception {
    method pokeValue_File (line 97) | @Test public void pokeValue_File() throws Exception {
    method assertReaders (line 122) | public static void assertReaders(final BufferedReader expected, final ...

FILE: tfs/src/test/java/hudson/util/SecretOverride.java
  class SecretOverride (line 14) | public class SecretOverride implements Closeable {
    method set (line 18) | public static void set(final String secretKey) {
    method SecretOverride (line 33) | public SecretOverride() {
    method SecretOverride (line 37) | public SecretOverride(final String secretKey) {
    method close (line 41) | public void close() throws IOException {

FILE: tfs/src/test/java/jenkins/security/ConfidentialStoreOverride.java
  class ConfidentialStoreOverride (line 10) | public class ConfidentialStoreOverride implements Closeable {
    method randomBytes (line 21) | public byte[] randomBytes(final int size) {
    method initialValue (line 28) | protected ConfidentialStore initialValue() {
    method set (line 41) | public static void set(final ThreadLocal<ConfidentialStore> override) {
    method ConfidentialStoreOverride (line 45) | public ConfidentialStoreOverride() {
    method ConfidentialStoreOverride (line 49) | public ConfidentialStoreOverride(final ThreadLocal<ConfidentialStore> ...
    method close (line 53) | public void close() throws IOException {
Condensed preview — 435 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,342K chars).
[
  {
    "path": ".gitignore",
    "chars": 86,
    "preview": ".settings\r\n**/target\r\n**/workspaces\r\n**/work\r\n.project\r\n.classpath\r\n/.idea\r\n**/*.iml\r\n"
  },
  {
    "path": "Jenkinsfile",
    "chars": 145,
    "preview": "pipeline {\n    agent any\n    stages {\n        stage('Build') {\n            steps {\n                buildPlugin()\n       "
  },
  {
    "path": "README.md",
    "chars": 29257,
    "preview": "Azure DevOps and Team Foundation Server plugin for Jenkins\n============================\nCopyright &copy; Erik Ramfelt, O"
  },
  {
    "path": "ReleaseNotes.md",
    "chars": 235,
    "preview": "These notes are for release **(to be determined)**.\nOther releases and their notes can be found at the [tfs-plugin GitHu"
  },
  {
    "path": "Releasing.md",
    "chars": 8042,
    "preview": "Pre-requisites\r\n==============\r\n\r\n1. Machine: preferably Linux over Windows, to avoid any weirdness between Cygwin and G"
  },
  {
    "path": "Testing.md",
    "chars": 3716,
    "preview": "Functional Tests\r\n================\r\nThere's only so much testing you can do with test friends such as mocks and network "
  },
  {
    "path": "contributing.md",
    "chars": 4248,
    "preview": "Contributing to the Team Foundation Server plugin for Jenkins\n=========================================================="
  },
  {
    "path": "pom.xml",
    "chars": 3648,
    "preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocat"
  },
  {
    "path": "tfs/checkstyle.xml",
    "chars": 7674,
    "preview": "<?xml version=\"1.0\"?>\n<!DOCTYPE module PUBLIC\n        \"-//Puppy Crawl//DTD Check Configuration 1.3//EN\"\n        \"http://"
  },
  {
    "path": "tfs/pom.xml",
    "chars": 9848,
    "preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocat"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/ChangeSetReader.java",
    "chars": 2276,
    "preview": "package hudson.plugins.tfs;\r\n\r\nimport java.io.File;\r\nimport java.io.FileInputStream;\r\nimport java.io.IOException;\r\nimpor"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/ChangeSetWriter.java",
    "chars": 4452,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs;\r\n\r\nimport edu.umd.cs.findbugs.annotations.SuppressFBWarnings;\r\nimport huds"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/CommitParameterAction.java",
    "chars": 1665,
    "preview": "package hudson.plugins.tfs;\r\n\r\nimport hudson.plugins.git.RevisionParameterAction;\r\nimport hudson.plugins.tfs.model.GitCo"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/JenkinsEventNotifier.java",
    "chars": 6074,
    "preview": "package hudson.plugins.tfs;\n\nimport hudson.plugins.tfs.model.ConnectionParameters;\nimport hudson.plugins.tfs.model.JobCo"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/PullRequestParameterAction.java",
    "chars": 617,
    "preview": "package hudson.plugins.tfs;\r\n\r\nimport hudson.plugins.tfs.model.PullRequestMergeCommitCreatedEventArgs;\r\n\r\n/**\r\n * Action"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/SafeParametersAction.java",
    "chars": 2008,
    "preview": "package hudson.plugins.tfs;\n\nimport hudson.EnvVars;\nimport hudson.Extension;\nimport hudson.model.EnvironmentContributor;"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/TFSLabeler.java",
    "chars": 4940,
    "preview": "//CHECKSTYLE:OFF\npackage hudson.plugins.tfs;\n\nimport hudson.EnvVars;\nimport hudson.Extension;\nimport hudson.FilePath;\nim"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/TFSRevisionState.java",
    "chars": 749,
    "preview": "//CHECKSTYLE:OFF\npackage hudson.plugins.tfs;\n\nimport org.kohsuke.stapler.export.Exported;\nimport org.kohsuke.stapler.exp"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/TeamBuildDetailsAction.java",
    "chars": 2434,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs;\r\n\r\nimport hudson.model.Action;\r\nimport hudson.plugins.tfs.util.QueryString"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/TeamBuildEndpoint.java",
    "chars": 14877,
    "preview": "package hudson.plugins.tfs;\r\n\r\nimport com.fasterxml.jackson.databind.ObjectMapper;\r\nimport hudson.Extension;\r\nimport hud"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/TeamCollectResultsPostBuildAction.java",
    "chars": 5047,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs;\r\n\r\nimport hudson.Extension;\r\nimport hudson.FilePath;\r\nimport hudson.Launch"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/TeamCollectionConfiguration.java",
    "chars": 15239,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs;\r\n\r\nimport com.cloudbees.plugins.credentials.Credentials;\r\nimport com.cloud"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/TeamCompletedStatusPostBuildAction.java",
    "chars": 2548,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs;\r\n\r\nimport hudson.Extension;\r\nimport hudson.FilePath;\r\nimport hudson.Launch"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/TeamEventsEndpoint.java",
    "chars": 13422,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs;\r\n\r\nimport hudson.Extension;\r\nimport hudson.model.Item;\r\nimport hudson.mode"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/TeamFoundationServerScm.java",
    "chars": 32758,
    "preview": "package hudson.plugins.tfs;\r\n\r\nimport com.cloudbees.plugins.credentials.common.StandardUsernamePasswordCredentials;\r\nimp"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/TeamGlobalStatusAction.java",
    "chars": 1072,
    "preview": "package hudson.plugins.tfs;\r\n\r\nimport hudson.model.Action;\r\nimport hudson.model.InvisibleAction;\r\nimport hudson.model.Ru"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/TeamGlobalStatusPoster.java",
    "chars": 1055,
    "preview": "package hudson.plugins.tfs;\r\n\r\nimport hudson.Extension;\r\nimport hudson.model.AbstractBuild;\r\nimport hudson.model.TaskLis"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/TeamHookCause.java",
    "chars": 444,
    "preview": "package hudson.plugins.tfs;\r\n\r\nimport hudson.plugins.git.GitStatus;\r\n\r\n/**\r\n * Attached to the build if it was started b"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/TeamPRPushTrigger.java",
    "chars": 1265,
    "preview": "package hudson.plugins.tfs;\n\nimport hudson.Extension;\nimport hudson.model.Job;\nimport org.kohsuke.stapler.DataBoundConst"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/TeamPendingStatusBuildStep.java",
    "chars": 2213,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs;\r\n\r\nimport hudson.Extension;\r\nimport hudson.FilePath;\r\nimport hudson.Launch"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/TeamPluginGlobalConfig.java",
    "chars": 5084,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs;\r\n\r\nimport hudson.Extension;\r\nimport hudson.ExtensionList;\r\nimport hudson.p"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/TeamPullRequestMergedDetailsAction.java",
    "chars": 3684,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs;\r\n\r\nimport com.microsoft.teamfoundation.core.webapi.model.TeamProjectRefere"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/TeamPushCause.java",
    "chars": 1475,
    "preview": "package hudson.plugins.tfs;\r\n\r\nimport hudson.triggers.SCMTrigger.SCMTriggerCause;\r\nimport org.apache.commons.lang.String"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/TeamPushTrigger.java",
    "chars": 9533,
    "preview": "package hudson.plugins.tfs;\r\n\r\nimport hudson.Extension;\r\nimport hudson.Util;\r\nimport hudson.console.AnnotatedLargeText;\r"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/TeamResultsAction.java",
    "chars": 3469,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs;\r\n\r\nimport hudson.model.Run;\r\nimport hudson.plugins.tfs.util.EndpointHelper"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/TeamUpdateWorkItemPostBuildAction.java",
    "chars": 3286,
    "preview": "package hudson.plugins.tfs;\r\n\r\nimport com.microsoft.visualstudio.services.webapi.model.ResourceRef;\r\nimport hudson.Exten"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/UnsupportedIntegrationAction.java",
    "chars": 1333,
    "preview": "package hudson.plugins.tfs;\r\n\r\nimport hudson.model.Action;\r\nimport hudson.model.InvisibleAction;\r\nimport hudson.model.Ru"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/actions/CheckoutAction.java",
    "chars": 7209,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.actions;\r\n\r\nimport com.microsoft.tfs.core.clients.versioncontrol.specs.vers"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/actions/RemoveWorkspaceAction.java",
    "chars": 948,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.actions;\r\n\r\nimport java.io.IOException;\r\n\r\nimport hudson.plugins.tfs.model."
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/browsers/TeamFoundationServerRepositoryBrowser.java",
    "chars": 1273,
    "preview": "package hudson.plugins.tfs.browsers;\r\n\r\nimport java.io.IOException;\r\nimport java.net.URL;\r\n\r\nimport hudson.plugins.tfs.m"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/browsers/TeamSystemWebAccessBrowser.java",
    "chars": 3869,
    "preview": "package hudson.plugins.tfs.browsers;\r\n\r\nimport hudson.Extension;\r\nimport hudson.Util;\r\nimport hudson.model.AbstractProje"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/commands/AbstractCallableCommand.java",
    "chars": 2281,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.commands;\r\n\r\nimport com.microsoft.tfs.core.TFSTeamProjectCollection;\r\nimpor"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/commands/AbstractCommand.java",
    "chars": 1034,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.commands;\r\n\r\nimport hudson.Util;\r\nimport hudson.plugins.tfs.util.MaskedArgu"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/commands/Command.java",
    "chars": 410,
    "preview": "package hudson.plugins.tfs.commands;\r\n\r\nimport hudson.plugins.tfs.util.MaskedArgumentListBuilder;\r\n\r\n/**\r\n * Command tha"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/commands/DeleteWorkspaceCommand.java",
    "chars": 3581,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.commands;\r\n\r\nimport com.microsoft.tfs.core.TFSTeamProjectCollection;\r\nimpor"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/commands/GetFilesToWorkFolderCommand.java",
    "chars": 3784,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.commands;\r\n\r\nimport java.io.PrintStream;\r\n\r\nimport com.microsoft.tfs.core.c"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/commands/GetWorkspaceMappingCommand.java",
    "chars": 1959,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.commands;\r\n\r\nimport com.microsoft.tfs.core.TFSTeamProjectCollection;\r\nimpor"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/commands/LabelCommand.java",
    "chars": 3540,
    "preview": "//CHECKSTYLE:OFF\npackage hudson.plugins.tfs.commands;\n\nimport com.microsoft.tfs.core.clients.versioncontrol.VersionContr"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/commands/ListWorkspacesCommand.java",
    "chars": 5739,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.commands;\r\n\r\nimport com.microsoft.tfs.core.clients.versioncontrol.Workspace"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/commands/NewWorkspaceCommand.java",
    "chars": 4377,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.commands;\r\n\r\nimport com.microsoft.tfs.core.TFSTeamProjectCollection;\r\nimpor"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/commands/RemoteChangesetVersionCommand.java",
    "chars": 5583,
    "preview": "//CHECKSTYLE:OFF\npackage hudson.plugins.tfs.commands;\n\nimport com.google.common.base.Strings;\nimport com.microsoft.tfs.c"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/commands/ServerConfigurationProvider.java",
    "chars": 496,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.commands;\r\n\r\nimport hudson.model.TaskListener;\r\nimport hudson.plugins.tfs.m"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/listeners/JenkinsRunListener.java",
    "chars": 1554,
    "preview": "package hudson.plugins.tfs.listeners;\n\nimport hudson.Extension;\nimport hudson.model.Run;\nimport hudson.model.TaskListene"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/AbstractCommand.java",
    "chars": 1627,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport com.fasterxml.jackson.databind.ObjectMapper;\r\nimport hudso"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/AbstractHookEvent.java",
    "chars": 19329,
    "preview": "package hudson.plugins.tfs.model;\r\n\r\nimport com.fasterxml.jackson.databind.ObjectMapper;\r\nimport hudson.model.AbstractPr"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/AliasOnlyUserAccountMapper.java",
    "chars": 1042,
    "preview": "package hudson.plugins.tfs.model;\r\n\r\nimport hudson.Extension;\r\nimport org.kohsuke.stapler.DataBoundConstructor;\r\n\r\n/**\r\n"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/AutomaticCredentialsConfigurer.java",
    "chars": 1177,
    "preview": "package hudson.plugins.tfs.model;\r\n\r\nimport com.cloudbees.plugins.credentials.common.StandardUsernamePasswordCredentials"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/BuildCommand.java",
    "chars": 15095,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport com.fasterxml.jackson.databind.ObjectMapper;\r\nimport com.m"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/BuildParameter.java",
    "chars": 456,
    "preview": "package hudson.plugins.tfs.model;\r\n\r\nimport edu.umd.cs.findbugs.annotations.SuppressFBWarnings;\r\n\r\n/**\r\n * Used by TFS B"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/BuildWithParametersCommand.java",
    "chars": 1091,
    "preview": "package hudson.plugins.tfs.model;\r\n\r\nimport hudson.plugins.tfs.util.MediaType;\r\nimport org.apache.commons.io.IOUtils;\r\n\r"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/ChangeLogSet.java",
    "chars": 1888,
    "preview": "package hudson.plugins.tfs.model;\r\n\r\nimport edu.umd.cs.findbugs.annotations.SuppressFBWarnings;\r\nimport hudson.model.Abs"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/ChangeSet.java",
    "chars": 6094,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport java.text.ParseException;\r\nimport java.util.ArrayList;\r\nim"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/ClonePersistenceStoreProvider.java",
    "chars": 2733,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport com.microsoft.tfs.core.config.persistence.PersistenceStore"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/ConnectHookEvent.java",
    "chars": 2739,
    "preview": "package hudson.plugins.tfs.model;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport hudson.plugins.tfs.TeamCol"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/ConnectionParameters.java",
    "chars": 1396,
    "preview": "package hudson.plugins.tfs.model;\n\n/**\n * These parameters are stored and modified from outside Jenkins through the Team"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/CredentialsConfigurer.java",
    "chars": 1170,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport com.cloudbees.plugins.credentials.common.StandardUsernameP"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/CredentialsConfigurerDescriptor.java",
    "chars": 226,
    "preview": "package hudson.plugins.tfs.model;\r\n\r\nimport hudson.model.Descriptor;\r\n\r\n/**\r\n * Descriptor for CredentialsConfigurer.\r\n "
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/DomainUserAccountMapper.java",
    "chars": 805,
    "preview": "package hudson.plugins.tfs.model;\r\n\r\nimport hudson.Extension;\r\nimport org.kohsuke.stapler.DataBoundConstructor;\r\n\r\n/**\r\n"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/ExtraSettings.java",
    "chars": 2077,
    "preview": "package hudson.plugins.tfs.model;\r\n\r\nimport hudson.model.Computer;\r\nimport hudson.plugins.tfs.TeamPluginGlobalConfig;\r\ni"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/GitCodePushedEventArgs.java",
    "chars": 806,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport org.eclipse.jgit.transport.URIish;\r\n\r\nimport java.io.Seria"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/GitPullRequestEx.java",
    "chars": 943,
    "preview": "package hudson.plugins.tfs.model;\r\n\r\nimport com.microsoft.teamfoundation.sourcecontrol.webapi.model.GitPullRequest;\r\nimp"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/GitPullRequestMergedEvent.java",
    "chars": 5939,
    "preview": "package hudson.plugins.tfs.model;\r\n\r\nimport com.fasterxml.jackson.databind.ObjectMapper;\r\nimport com.microsoft.teamfound"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/GitPushEvent.java",
    "chars": 6154,
    "preview": "package hudson.plugins.tfs.model;\r\n\r\nimport com.fasterxml.jackson.databind.ObjectMapper;\r\nimport com.microsoft.teamfound"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/GitStatusContext.java",
    "chars": 811,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport net.sf.json.JSONObject;\r\nimport net.sf.json.JsonConfig;\r\n\r"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/GitStatusState.java",
    "chars": 1381,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport com.fasterxml.jackson.annotation.JsonCreator;\r\n\r\nimport ja"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/HttpMethod.java",
    "chars": 2344,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport com.microsoft.tfs.core.httpclient.methods.GetMethod;\r\nimpo"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/JobCompletionEventArgs.java",
    "chars": 837,
    "preview": "package hudson.plugins.tfs.model;\n\n/**\n * This class holds the information needed to send the Job Completion event.\n */\n"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/JsonPatchOperation.java",
    "chars": 801,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport com.microsoft.visualstudio.services.webapi.patch.Operation"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/LegacyIdentityManagementService.java",
    "chars": 4346,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport org.apache.commons.lang.NotImplementedException;\r\n\r\nimport"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/Link.java",
    "chars": 547,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport edu.umd.cs.findbugs.annotations.SuppressFBWarnings;\r\n\r\n/**"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/ListOfGitRepositories.java",
    "chars": 265,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport com.microsoft.teamfoundation.sourcecontrol.webapi.model.Gi"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/ManualCredentialsConfigurer.java",
    "chars": 1882,
    "preview": "package hudson.plugins.tfs.model;\r\n\r\nimport com.cloudbees.plugins.credentials.CredentialsScope;\r\nimport com.cloudbees.pl"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/MockableVersionControlClient.java",
    "chars": 16218,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport com.microsoft.tfs.core.TFSTeamProjectCollection;\r\nimport c"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/ModernConnectionAdvisor.java",
    "chars": 1779,
    "preview": "package hudson.plugins.tfs.model;\n\nimport java.util.Locale;\nimport java.util.TimeZone;\n\nimport com.microsoft.tfs.core.co"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/ModernHTTPClientFactory.java",
    "chars": 2652,
    "preview": "package hudson.plugins.tfs.model;\n\nimport com.microsoft.tfs.core.config.ConnectionInstanceData;\nimport com.microsoft.tfs"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/NativeLibraryExtractor.java",
    "chars": 440,
    "preview": "package hudson.plugins.tfs.model;\r\n\r\nimport java.io.IOException;\r\n\r\n/**\r\n * An interface for native library extractors.\r"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/NativeLibraryManager.java",
    "chars": 10996,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport com.microsoft.tfs.core.persistence.FilesystemPersistenceSt"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/PingCommand.java",
    "chars": 1295,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport com.fasterxml.jackson.databind.ObjectMapper;\r\nimport hudso"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/PingHookEvent.java",
    "chars": 1044,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport com.fasterxml.jackson.databind.ObjectMapper;\r\nimport hudso"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/Project.java",
    "chars": 14629,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport com.microsoft.tfs.core.clients.versioncontrol.specs.versio"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/ProxyHostEx.java",
    "chars": 811,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport hudson.util.Secret;\r\n\r\npublic class ProxyHostEx extends co"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/PullRequestMergeCommitCreatedEventArgs.java",
    "chars": 213,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\npublic class PullRequestMergeCommitCreatedEventArgs extends GitCo"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/Server.java",
    "chars": 11595,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport com.cloudbees.plugins.credentials.common.StandardUsernameP"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/TeamBuildPayload.java",
    "chars": 657,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport com.fasterxml.jackson.annotation.JsonProperty;\r\nimport edu"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/TeamGitStatus.java",
    "chars": 2821,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport hudson.model.Job;\r\nimport hudson.model.Result;\r\nimport hud"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/TeamRequestedResult.java",
    "chars": 2224,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport hudson.Extension;\r\nimport hudson.FilePath;\r\nimport hudson."
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/TeamResultType.java",
    "chars": 774,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\n/**\r\n * Enum to represent the type of build result (junit tests, "
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/TfsUserLookup.java",
    "chars": 3081,
    "preview": "package hudson.plugins.tfs.model;\n\nimport java.io.IOException;\nimport java.util.logging.Level;\nimport java.util.logging."
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/UserAccountMapper.java",
    "chars": 1326,
    "preview": "package hudson.plugins.tfs.model;\r\n\r\nimport hudson.DescriptorExtensionList;\r\nimport hudson.ExtensionPoint;\r\nimport hudso"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/UserAccountMapperDescriptor.java",
    "chars": 220,
    "preview": "package hudson.plugins.tfs.model;\r\n\r\nimport hudson.model.Descriptor;\r\n\r\n/**\r\n * Class descriptor for UserAccountMapper.\r"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/UserHomePersistenceStore.java",
    "chars": 1030,
    "preview": "package hudson.plugins.tfs.model;\r\n\r\nimport com.microsoft.tfs.core.persistence.FilesystemPersistenceStore;\r\n\r\nimport jav"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/UserLookup.java",
    "chars": 356,
    "preview": "package hudson.plugins.tfs.model;\n\nimport hudson.model.User;\n\n/**\n * An interface to define the UserLookup contract.\n */"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/WebProxySettings.java",
    "chars": 6765,
    "preview": "package hudson.plugins.tfs.model;\r\n\r\nimport hudson.ProxyConfiguration;\r\nimport hudson.util.Secret;\r\nimport org.apache.co"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/WorkItem.java",
    "chars": 1119,
    "preview": "package hudson.plugins.tfs.model;\r\n\r\nimport com.microsoft.tfs.core.clients.workitem.internal.query.WorkItemRelation;\r\n\r\n"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/WorkItemTrackingResource.java",
    "chars": 611,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport com.fasterxml.jackson.annotation.JsonProperty;\r\nimport com"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/WorkItemTrackingResourceReference.java",
    "chars": 324,
    "preview": "package hudson.plugins.tfs.model;\r\n\r\n/**\r\n * Workaround for missing classes in vso-httpclient-java.\r\n */\r\npublic class W"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/Workspace.java",
    "chars": 1610,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport org.apache.commons.lang.builder.EqualsBuilder;\r\nimport org"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/WorkspaceConfiguration.java",
    "chars": 4577,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport java.io.Serializable;\r\nimport java.util.Collection;\r\n\r\nimp"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/WorkspaceMapping.java",
    "chars": 561,
    "preview": "package hudson.plugins.tfs.model;\r\n\r\n/**\r\n * Mapping between a working folder and a project path that exists in a worksp"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/Workspaces.java",
    "chars": 4842,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.model;\r\n\r\nimport hudson.plugins.tfs.commands.DeleteWorkspaceCommand;\r\nimpor"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/servicehooks/Event.java",
    "chars": 2288,
    "preview": "package hudson.plugins.tfs.model.servicehooks;\r\n\r\nimport java.util.Map;\r\nimport java.util.UUID;\r\n\r\n/**\r\n * Encapsulates "
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/servicehooks/EventScope.java",
    "chars": 1622,
    "preview": "package hudson.plugins.tfs.model.servicehooks;\r\n\r\nimport com.fasterxml.jackson.annotation.JsonCreator;\r\n\r\nimport java.ut"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/servicehooks/FormattedEventMessage.java",
    "chars": 691,
    "preview": "package hudson.plugins.tfs.model.servicehooks;\r\n\r\n/**\r\n * Provides different formats of an event message.\r\n */\r\npublic c"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/model/servicehooks/ResourceContainer.java",
    "chars": 924,
    "preview": "package hudson.plugins.tfs.model.servicehooks;\r\n\r\nimport java.util.UUID;\r\n\r\n/**\r\n * The base class for all resource cont"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/Artifact.java",
    "chars": 1750,
    "preview": "//CHECKSTYLE:OFF\npackage hudson.plugins.tfs.rm;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * @author Ankit G"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/ArtifactVersion.java",
    "chars": 1458,
    "preview": "//CHECKSTYLE:OFF\npackage hudson.plugins.tfs.rm;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n *\n * @author a"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/ConnectReleaseWebHookEvent.java",
    "chars": 13770,
    "preview": "package hudson.plugins.tfs.rm;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport hudson.model.AbstractProject;"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/CreatedBy.java",
    "chars": 1978,
    "preview": "//CHECKSTYLE:OFF\npackage hudson.plugins.tfs.rm;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * @author Ankit G"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/Definition.java",
    "chars": 1012,
    "preview": "//CHECKSTYLE:OFF\npackage hudson.plugins.tfs.rm;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * @author Ankit G"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/DefinitionReference.java",
    "chars": 1146,
    "preview": "//CHECKSTYLE:OFF\npackage hudson.plugins.tfs.rm;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * @author Ankit G"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/InstanceReference.java",
    "chars": 1123,
    "preview": "//CHECKSTYLE:OFF\npackage hudson.plugins.tfs.rm;\n\nimport com.google.gson.annotations.SerializedName;\n\n/**\n *\n * @author a"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/ModifiedBy.java",
    "chars": 1889,
    "preview": "//CHECKSTYLE:OFF\npackage hudson.plugins.tfs.rm;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * @author Ankit G"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/Project.java",
    "chars": 1009,
    "preview": "//CHECKSTYLE:OFF\npackage hudson.plugins.tfs.rm;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * @author Ankit G"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseArtifact.java",
    "chars": 946,
    "preview": "//CHECKSTYLE:OFF\npackage hudson.plugins.tfs.rm;\n\nimport com.google.gson.annotations.SerializedName;\n\n/**\n *\n * @author a"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseArtifactVersionsResponse.java",
    "chars": 649,
    "preview": "//CHECKSTYLE:OFF\npackage hudson.plugins.tfs.rm;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n *\n * @author a"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseBody.java",
    "chars": 2237,
    "preview": "//CHECKSTYLE:OFF\npackage hudson.plugins.tfs.rm;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport com.google.gs"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseDefinition.java",
    "chars": 4035,
    "preview": "//CHECKSTYLE:OFF\npackage hudson.plugins.tfs.rm;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util."
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseManagementCI.java",
    "chars": 16687,
    "preview": "//CHECKSTYLE:OFF\npackage hudson.plugins.tfs.rm;\n\nimport com.cloudbees.plugins.credentials.common.StandardListBoxModel;\ni"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseManagementException.java",
    "chars": 2108,
    "preview": "//CHECKSTYLE:OFF\npackage hudson.plugins.tfs.rm;\n\n/**\n * @author Ankit Goyal\n */\n\npublic class ReleaseManagementException"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseManagementHttpClient.java",
    "chars": 5678,
    "preview": "//CHECKSTYLE:OFF\npackage hudson.plugins.tfs.rm;\n\nimport com.google.gson.Gson;\nimport hudson.util.Secret;\n\nimport java.ni"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseSummaryAction.java",
    "chars": 809,
    "preview": "package hudson.plugins.tfs.rm;\n\nimport hudson.model.InvisibleAction;\nimport org.kohsuke.stapler.export.ExportedBean;\n\n/*"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseWebHook.java",
    "chars": 3208,
    "preview": "package hudson.plugins.tfs.rm;\n\nimport hudson.Extension;\nimport hudson.model.AbstractDescribableImpl;\nimport hudson.mode"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseWebHookAction.java",
    "chars": 6335,
    "preview": "package hudson.plugins.tfs.rm;\n\nimport hudson.Extension;\nimport hudson.Launcher;\nimport hudson.model.AbstractBuild;\nimpo"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseWebHookHelper.java",
    "chars": 1744,
    "preview": "package hudson.plugins.tfs.rm;\n\nimport hudson.plugins.tfs.JenkinsEventNotifier;\nimport hudson.plugins.tfs.TeamPluginGlob"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseWebHookReference.java",
    "chars": 1609,
    "preview": "package hudson.plugins.tfs.rm;\n\nimport com.cloudbees.plugins.credentials.common.StandardListBoxModel;\nimport hudson.Exte"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseWebHookResource.java",
    "chars": 1218,
    "preview": "package hudson.plugins.tfs.rm;\n\n/**\n * Implements ReleaseWebHookResource. Model to represent webHook register event.\n * "
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseWebHookStatus.java",
    "chars": 1063,
    "preview": "package hudson.plugins.tfs.rm;\n\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\n\n/**\n * Implements ReleaseWebH"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/ReleaseWebHookSummaryAction.java",
    "chars": 532,
    "preview": "package hudson.plugins.tfs.rm;\n\nimport hudson.model.InvisibleAction;\nimport java.util.List;\n\n/**\n * Implements ReleaseWe"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/RetentionPolicy.java",
    "chars": 834,
    "preview": "//CHECKSTYLE:OFF\npackage hudson.plugins.tfs.rm;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * @author Ankit G"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/rm/Version.java",
    "chars": 975,
    "preview": "//CHECKSTYLE:OFF\npackage hudson.plugins.tfs.rm;\n\n/**\n *\n * @author angoya\n */\npublic class Version\n{\n    \n    private St"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/telemetry/TelemetryContextInitializer.java",
    "chars": 7804,
    "preview": "package hudson.plugins.tfs.telemetry;\n\nimport com.microsoft.applicationinsights.extensibility.ContextInitializer;\nimport"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/telemetry/TelemetryHelper.java",
    "chars": 9878,
    "preview": "package hudson.plugins.tfs.telemetry;\n\nimport com.microsoft.applicationinsights.TelemetryClient;\nimport com.microsoft.ap"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/util/ActionHelper.java",
    "chars": 881,
    "preview": "package hudson.plugins.tfs.util;\r\n\r\nimport hudson.model.Action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Collect"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/util/BuildVariableResolver.java",
    "chars": 4864,
    "preview": "package hudson.plugins.tfs.util;\r\n\r\nimport java.io.IOException;\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/util/BuildWorkspaceConfigurationRetriever.java",
    "chars": 2338,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.util;\r\n\r\nimport java.io.IOException;\r\n\r\nimport hudson.model.AbstractBuild;\r"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/util/DateUtil.java",
    "chars": 5041,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.util;\r\n\r\nimport com.microsoft.tfs.core.clients.versioncontrol.specs.version"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/util/EndpointHelper.java",
    "chars": 1416,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.util;\r\n\r\nimport com.fasterxml.jackson.databind.DeserializationFeature;\r\nimp"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/util/KeyValueTextReader.java",
    "chars": 2247,
    "preview": "//CHECKSTYLE:OFF\npackage hudson.plugins.tfs.util;\n\nimport java.io.BufferedReader;\nimport java.io.IOException;\nimport jav"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/util/License.txt",
    "chars": 1162,
    "preview": "Git Credential Manager for Mac and Linux\r\n\r\nCopyright (c) Microsoft Corporation\r\n\r\nAll rights reserved.\r\n\r\nMIT License\r\n"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/util/MaskedArgumentListBuilder.java",
    "chars": 1982,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.util;\r\n\r\nimport java.util.Collection;\r\nimport java.util.HashSet;\r\n\r\nimport "
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/util/MediaType.java",
    "chars": 838,
    "preview": "package hudson.plugins.tfs.util;\r\n\r\nimport java.nio.charset.Charset;\r\n\r\n/**\r\n * Media Type constants.\r\n */\r\npublic final"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/util/QueryString.java",
    "chars": 901,
    "preview": "// Copyright (c) Microsoft. All rights reserved.\r\n// Licensed under the MIT license. See sibling License.txt file\r\n\r\npac"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/util/ResourceHelper.java",
    "chars": 745,
    "preview": "package hudson.plugins.tfs.util;\r\n\r\nimport org.apache.commons.io.IOUtils;\r\n\r\nimport java.io.IOException;\r\nimport java.io"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/util/StringBodyParameter.java",
    "chars": 2147,
    "preview": "package hudson.plugins.tfs.util;\r\n\r\nimport org.apache.commons.io.IOUtils;\r\nimport org.kohsuke.stapler.AnnotationHandler;"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/util/StringHelper.java",
    "chars": 1941,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.util;\r\n\r\npublic class StringHelper {\r\n\r\n    public static boolean endsWithI"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/util/TeamRestClient.java",
    "chars": 13110,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.util;\r\n\r\nimport com.cloudbees.plugins.credentials.common.StandardUsernamePa"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/util/TeamStatus.java",
    "chars": 4662,
    "preview": "package hudson.plugins.tfs.util;\r\n\r\nimport hudson.model.Job;\r\nimport hudson.model.Run;\r\nimport hudson.model.TaskListener"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/util/TextTableParser.java",
    "chars": 4519,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.util;\r\n\r\nimport java.io.BufferedReader;\r\nimport java.io.IOException;\r\nimpor"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/util/UriHelper.java",
    "chars": 9885,
    "preview": "//CHECKSTYLE:OFF\r\n// Copyright (c) Microsoft. All rights reserved.\r\n// Licensed under the MIT license. See sibling Licen"
  },
  {
    "path": "tfs/src/main/java/hudson/plugins/tfs/util/XmlHelper.java",
    "chars": 3578,
    "preview": "//CHECKSTYLE:OFF\r\npackage hudson.plugins.tfs.util;\r\n\r\nimport org.w3c.dom.Document;\r\nimport org.w3c.dom.Node;\r\nimport org"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TFSLabeler/config.jelly",
    "chars": 636,
    "preview": "<?jelly escape-by-default='true'?>\n<j:jelly xmlns:j=\"jelly:core\" xmlns:st=\"jelly:stapler\" xmlns:d=\"jelly:define\" xmlns:l"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TFSLabeler/global.jelly",
    "chars": 190,
    "preview": "<?jelly escape-by-default='true'?>\n<j:jelly xmlns:j=\"jelly:core\" xmlns:st=\"jelly:stapler\" xmlns:d=\"jelly:define\" xmlns:l"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamBuildDetailsAction/index.jelly",
    "chars": 445,
    "preview": "<?jelly escape-by-default='true'?>\r\n<j:jelly xmlns:j=\"jelly:core\" xmlns:st=\"jelly:stapler\"\r\n\txmlns:d=\"jelly:define\" xmln"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamBuildDetailsAction/summary.jelly",
    "chars": 391,
    "preview": "<?jelly escape-by-default='true'?>\r\n<j:jelly xmlns:j=\"jelly:core\" xmlns:st=\"jelly:stapler\"\r\n\txmlns:d=\"jelly:define\" xmln"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamBuildEndpoint.html",
    "chars": 2578,
    "preview": "<html>\r\n    <body>\r\n        <h1>The <code>/%1$s/</code> endpoint</h1>\r\n\r\n        <h2>Security</h2>\r\n        When your Je"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamCollectResultsPostBuildAction/config.groovy",
    "chars": 433,
    "preview": "package hudson.plugins.tfs.TeamCollectResultsPostBuildAction;\r\n\r\ndef f = namespace(lib.FormTagLib);\r\n\r\n// this would loo"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamCollectResultsPostBuildAction/help.html",
    "chars": 148,
    "preview": "<div>\r\n    At the end of the build, files matching each of the requested result types will be archived for retrieval by "
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamCollectionConfiguration/config.groovy",
    "chars": 782,
    "preview": "package hudson.plugins.tfs.TeamCollectionConfiguration;\r\n\r\ndef f = namespace(lib.FormTagLib);\r\ndef c = namespace(lib.Cre"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamCollectionConfiguration/help-collectionUrl.html",
    "chars": 464,
    "preview": "<div>\r\n    The URL to the TFS/Team Services <em>team project collection</em>.<br />\r\n    If you are using Team Services,"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamCompletedStatusPostBuildAction/help.html",
    "chars": 213,
    "preview": "<div>\r\n    At the end of the build, the status of the associated pull request and/or commit will be updated in TFS/Team "
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamEventsEndpoint.html",
    "chars": 1766,
    "preview": "<html>\r\n    <body>\r\n        <h1>The <code>/%1$s/</code> endpoint</h1>\r\n\r\n        <h2>Cross Site Request Forgery (CSRF) p"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamFoundationServerScm/config.jelly",
    "chars": 2396,
    "preview": "<?jelly escape-by-default='true'?>\r\n<j:jelly xmlns:j=\"jelly:core\" xmlns:st=\"jelly:stapler\" xmlns:d=\"jelly:define\" xmlns:"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamFoundationServerScm/config_fr.properties",
    "chars": 1422,
    "preview": "# The MIT License\n#\n# Copyright (c) 2004-2010, Sun Microsystems, Inc.\n#\n# Permission is hereby granted, free of charge, "
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamFoundationServerScm/help-cloakedPaths.html",
    "chars": 1832,
    "preview": "<div>\n  <p>\n    Paths that are cloaked will not be pulled into the local workspace during a GET\n    from the TFVC reposi"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamFoundationServerScm/help-credentialsConfigurer.html",
    "chars": 947,
    "preview": "<div>\r\n    <b>NEW since 5.1.0:</b>  Credentials for team project collections can now be configured once instead of once "
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamFoundationServerScm/help-localPath.html",
    "chars": 279,
    "preview": "<div>\r\n  <p>\r\n\tThe folder where all files will be retrieved into. The folder name is a relative path, under\r\n\tthe worksp"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamFoundationServerScm/help-projectPath.html",
    "chars": 89,
    "preview": "<div>\r\n  <p>\r\n\tThe name of the project as it is registered on the server.\r\n  </p>\r\n</div>"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamFoundationServerScm/help-serverUrl.html",
    "chars": 957,
    "preview": "<div>\r\n    <b>NEW since 5.1.0:</b> This field now allows you to select from a list that is built from the values configu"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamFoundationServerScm/help-workspaceName.html",
    "chars": 1016,
    "preview": "<div>\r\n  <p>\r\n\tThe name of the Workspace under which the source should be retrieved. This workspace is \r\n\tcreated as nee"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamPRPushTrigger/config.jelly",
    "chars": 407,
    "preview": "<?jelly escape-by-default='true'?>\n<j:jelly xmlns:j=\"jelly:core\" xmlns:st=\"jelly:stapler\" xmlns:d=\"jelly:define\" xmlns:l"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamPRPushTrigger/help.html",
    "chars": 189,
    "preview": "This job will be triggered if Jenkins receives a notification on code push in a TFS pull request, from TFS/Team Services"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamPendingStatusBuildStep/help.html",
    "chars": 171,
    "preview": "<div>\r\n    The status of the associated pull request and/or commit will be updated in TFS/Team Services as \"pending\", in"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamPluginGlobalConfig/config.groovy",
    "chars": 1785,
    "preview": "package hudson.plugins.tfs.TeamPluginGlobalConfig;\r\n\r\ndef f = namespace(lib.FormTagLib);\r\n\r\nf.section(title: descriptor."
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamPluginGlobalConfig/help-configFolderPerNode.html",
    "chars": 1016,
    "preview": "<div>\r\n    In some environments, the \"home\" directory is mounted over a network and shared between many computers, inclu"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamPluginGlobalConfig/help-enableTeamPushTriggerForAllJobs.html",
    "chars": 451,
    "preview": "<div>\r\n    If enabled, when an event is received from TFS/Team Services for a Git repository, all the Jenkins jobs that "
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamPluginGlobalConfig/help-enableTeamStatusForAllJobs.html",
    "chars": 408,
    "preview": "<div>\r\n    If enabled, when an event is received from TFS/Team Services for a Git repository, all the Jenkins jobs that "
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamPluginGlobalConfig/help-releaseWebhookConfigurations.html",
    "chars": 185,
    "preview": "<div>\n    Adds a Release Webhook. Project can refer to this Webhook in its post build action. When a build completes it "
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamPluginGlobalConfig/help-userAccountMapper.html",
    "chars": 547,
    "preview": "<div>\r\n    <p>\r\n    When interpreting changesets from TFVC, the TFS plugin will attempt to map domain accounts (i.e. <co"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamPluginGlobalConfig/help.jelly",
    "chars": 351,
    "preview": "<?jelly escape-by-default='true'?>\r\n<j:jelly xmlns:j=\"jelly:core\" xmlns:l=\"/lib/layout\">\r\n    <l:ajax>\r\n        <div>\r\n "
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamPullRequestMergedDetailsAction/index.jelly",
    "chars": 1398,
    "preview": "<?jelly escape-by-default='true'?>\r\n<j:jelly xmlns:j=\"jelly:core\" xmlns:st=\"jelly:stapler\" xmlns:d=\"jelly:define\" xmlns:"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamPullRequestMergedDetailsAction/summary.jelly",
    "chars": 769,
    "preview": "<?jelly escape-by-default='true'?>\r\n<j:jelly xmlns:j=\"jelly:core\" xmlns:st=\"jelly:stapler\"\r\n    xmlns:d=\"jelly:define\" x"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamPushTrigger/TeamPollingAction/index.jelly",
    "chars": 2013,
    "preview": "<!--\r\nThe MIT License\r\n\r\nCopyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi\r\n\r\nPermission is hereby gran"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamPushTrigger/config.jelly",
    "chars": 295,
    "preview": "<?jelly escape-by-default='true'?>\n<j:jelly xmlns:j=\"jelly:core\" xmlns:st=\"jelly:stapler\" xmlns:d=\"jelly:define\" xmlns:l"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamPushTrigger/help.html",
    "chars": 154,
    "preview": "This job will be triggered if Jenkins receives a notification from TFS/Team Services for a Git repository defined in the"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/TeamUpdateWorkItemPostBuildAction/help.html",
    "chars": 221,
    "preview": "<div>\r\n    At the end of the build, if any work items in TFS/Team Services have been found to be associated with the Jen"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/browsers/TeamSystemWebAccessBrowser/config.jelly",
    "chars": 243,
    "preview": "<?jelly escape-by-default='true'?>\r\n<j:jelly xmlns:j=\"jelly:core\" xmlns:f=\"/lib/form\">\r\n  <f:entry title=\"URL\" help=\"/pl"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/model/AliasOnlyUserAccountMapper/config.groovy",
    "chars": 63,
    "preview": "package hudson.plugins.tfs.model.AliasOnlyUserAccountMapper\r\n\r\n"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/model/BuildCommand.json",
    "chars": 483,
    "preview": "{\r\n  \"team-build\":\r\n  {\r\n    \"Build.Repository.Provider\": \"TfGit\",\r\n    \"System.TeamFoundationCollectionUri\": \"https://f"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/model/BuildWithParametersCommand.json",
    "chars": 741,
    "preview": "{\r\n  \"parameter\":\r\n  [\r\n    {\"name\":\"id\",\"value\":\"123\"},\r\n    {\"name\":\"verbosity\",\"value\":\"high\"}\r\n  ],\r\n  \"team-event\":"
  },
  {
    "path": "tfs/src/main/resources/hudson/plugins/tfs/model/ChangeLogSet/digest.jelly",
    "chars": 577,
    "preview": "<?jelly escape-by-default='true'?>\r\n<j:jelly xmlns:j=\"jelly:core\" xmlns:st=\"jelly:stapler\" xmlns:d=\"jelly:define\" xmlns:"
  }
]

// ... and 235 more files (download for full content)

About this extraction

This page contains the full source code of the jenkinsci/tfs-plugin GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 435 files (19.2 MB), approximately 273.4k tokens, and a symbol index with 1735 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!