azure-devops-dotnet-samples icon indicating copy to clipboard operation
azure-devops-dotnet-samples copied to clipboard

Need an example on how to checkin an existing file without knowing enconding or file type (just file path)

Open Sl1ckR1ck opened this issue 6 years ago • 1 comments

Hi there,

i tried to follow the example on how to create a changeset with multiple files.

Although i am a bit stuck at the TFVCItem and ItemContent stage where i don't know how to extract the content and enconding of my file.

Im trying to write some code in order to checkin a file given to me by a filePath and check it in at a given location.

Would anyone care to help me out on how to do this?

This is what i came up so far: `

Public Function CreateChangeset(ByVal projectName As String,
                                      ByVal files As Dictionary(Of String, String),
                                      ByVal comment As String) As TfvcChangesetRef

    Dim c = TFSConnection.GetClient(Of TfvcHttpClient)
    Dim newChangetset = New TfvcChangeset

    Dim changes = New List(Of TfvcChange)

    For Each fKP In files
        Dim fileSource = fKP.Key
        Dim fileTarget = fKP.Value

        Dim newChange = New TfvcChange

        newChange.ChangeType = VersionControlChangeType.Add

        Dim newItem = New TfvcItem
        newItem.Path = $"&/{projectName}/{fileTarget}"
        newItem.ContentMetadata = New FileContentMetadata

        ' TODO: How to extract the correct encoding, and type?...
        newItem.ContentMetadata.Encoding = GetFileEncoding(fileSource)
        newItem.ContentMetadata.ContentType = "text/plain"
        newChange.Item = newItem

        ' TODO: How to extract the correct content, and type?...
        Dim newContent = New ItemContent
        newContent.Content = "Blabla"
        newContent.ContentType = ItemContentType.RawText
        newChange.NewContent = newContent

        changes.Add(newChange)
    Next
    newChangetset.Changes = changes
    newChangetset.Comment = comment

    Dim changesetRef = c.CreateChangesetAsync(newChangetset).Result

    Return changesetRef
End Function

`

Sl1ckR1ck avatar Oct 15 '18 13:10 Sl1ckR1ck

Ok so i managed to make it work but i still am not sure how to properly set the ContentType.

I have the choice between ItemContentType.RawText and ItemContentType.Base64Encoded but i am not sure when to use one or the other.

Here is the new code which seems to work:

` Public Function CreateChangeset(ByVal projectName As String, ByVal files As Dictionary(Of String, String), ByVal comment As String) As TfvcChangesetRef

    Dim c = TFSConnection.GetClient(Of TfvcHttpClient)
    Dim newChangetset = New TfvcChangeset

    Dim changes = New List(Of TfvcChange)

    For Each fKP In files

        ' Extract and build our target and source paths.
        Dim fileSource = fKP.Key
        Dim fileTarget = fKP.Value
        Dim fileName = IO.Path.GetFileName(fileSource)

        Dim newChange = New TfvcChange

        ' Create the new TFVC item which will be checked-in.
        Dim newItem = New TfvcItem
        newItem.Path = $"$/{projectName}/{fileTarget}/{fileName}"
        newItem.ContentMetadata = New FileContentMetadata

        ' Try to extract the item from the server.
        Dim serverItem = c.GetItemAsync(newItem.Path).Result

        If serverItem Is Nothing Then
            ' If the file is not on the server, then its a new file.
            newChange.ChangeType = VersionControlChangeType.Add
        Else
            ' Indicate that we are dealing with a file modification 
            ' and specify which version we are editing.
            newChange.ChangeType = VersionControlChangeType.Edit
            newItem.ChangesetVersion = serverItem.ChangesetVersion
        End If

        ' Read the file content to a stream.
        Using reader = New StreamReader(fileSource,
                                        Text.Encoding.Default,
                                        True) ' This last parameter allows to extract the correct encoding.
            Dim fileContent As String = String.Empty

            ' Read all the file content to a string so that we can store 
            ' it in the itemcontent.
            ' NOTE: reading it also allows to retrieve the correct file enconding.
            If reader.Peek() >= 0 Then
                fileContent = reader.ReadToEnd
            End If

            ' Set the file enconding and MIME Type.
            newItem.ContentMetadata.Encoding = reader.CurrentEncoding.WindowsCodePage
            newItem.ContentMetadata.ContentType = System.Web.MimeMapping.GetMimeMapping(fileSource)
            newChange.Item = newItem

            ' Set the file content.
            Dim newContent = New ItemContent
            newContent.Content = fileContent

            ' TODO: What should be the logic to set the Content Type? Not too sure...
            ' If newItem.ContentMetadata.ContentType.StartsWith("text/") Then
            newContent.ContentType = ItemContentType.RawText
            '  Else
            '  newContent.ContentType = ItemContentType.Base64Encoded
            '  End If

            ' Store the content to the change.
            newChange.NewContent = newContent
        End Using

        changes.Add(newChange)
    Next

    newChangetset.Changes = changes
    newChangetset.Comment = comment

    Dim changesetRef = c.CreateChangesetAsync(newChangetset).Result

    Return changesetRef
End Function`

Sl1ckR1ck avatar Oct 15 '18 14:10 Sl1ckR1ck