visual-studiohttpversion-controlazure-devopsfileupdate

Updating a file using REST Api Visual Studio Team Services


Is there any way to update the contents of a file in a project on your visual studio team services account using HTTP verbs, similar to how it is done here with github https://developer.github.com/v3/repos/contents/#update-a-file.

 var json={
        "comment": "Update scripts.json",
        "changes": [{
            "changeType": 2,
            "item": {
                "path": "$/ExtensionsTest/scripts.json",
                "contentMetadata": { "encoding": 65001 },
                "version": 47
            },
            "newContent": {
                "content": "[ {\"hello\" : \"Test\"} ]",
                "contentType":"RawText"
            }
        }]
    };
   $.ajax({
        type: 'POST',
        url: 'https://xxxxx.visualstudio.com/_apis/tfvc/changesets?api-version=3.0-preview.2',
        contentType: 'application/json',
        data: JSON.stringify(json),
        cache: false,
        dataType: "json",
        beforeSend: function (xhr) {
                    xhr.setRequestHeader("Authorization", "Basic " +    btoa("my UserName" + ":" + "my PW"));
        }
    }).done(function (data) {
        console.log(data);
    });
};

The code above is what I am using and I get a 400 error with it. Any suggestions on what I am doing wrong.


Solution

  • Try these ways:

    If you are using GIT:

    1. Get commit ID value: Request method: GET; URL [collection url]/[team project name]/_apis/git/repositories/[repository name]/commits?api-version=1.0&branch=master&$top=1
    2. Update file content: Request method: Post; URL: [collection url]/[team project name]/_apis/git/repositories/[repository name]/pushes?api-version=3.0-preview.2; Content Type: application/json;

    JSON data:

    {
        "refUpdates": [{
            "name": "refs/heads/master",
            "oldObjectId": "[step 1 commit ID]"
        }],
        "commits": [{
            "comment": "Updated BuildLog.cs",
            "changes": [{
                "changeType": 2,
                "item": {"path": "/BuildLog.cs"},
                "newContent": {
                    "content": "using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication1
    {
        public class BuildLog
        {
            public int count;
            public string[] value6;
        }
    }
    ",
                    "contentType": 0
                }
            }]
        }]
    }
    

    If you are using TFVC:

    1. Get changeset ID: Request method: GET; URL: [collection url]/_apis/tfvc/changesets?api-version=1.0&$top=1
    2. Update file content: Request method: Post; URL: [collection url]/_apis/tfvc/changesets?api-version=3.0-preview.2; Content Type: application/json;

    Json data:

    {
        "comment": "Updated Class1.cs",
        "changes": [{
            "changeType": 2,
            "item": {
                "path": "$/Scrum2015/ClassLibraryB/ClassLibraryB/Class1.cs",
                "contentMetadata": {"encoding": 65001},
                "version": [step changeset id]
            },
            "newContent": {
                "content": "using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ClassLibraryB
    {
        public class Class1
        {
            string sgs = \"\";
            public void T()
            {
                ClassLibraryA.Class1 c = new ClassLibraryA.Class1();
                c.TestOther2();
            }
        }
    }
    ",
                "contentType": 0
            }
        }]
    }
    

    Note: You need to parse quotes if file content contains quotes (\”test\”), the same as other special charters.

    On the other hand, you can achieve that through vso-node-api, more information, you can refer to this thread: TFS Rest API check-in to Version Control

    Update1:

    Refer to this code to modify your code:

      var json={
                        "comment": "Updated tt.json",
                        "changes": [{
                            "changeType": 2,
                            "item": {
                                "path": "$/Scrum2015/Buildtest/CoreSolutionDemo/WebApplication1/tt.json",
                                "contentMetadata": { "encoding": 65001 },
                                "version": 754
                            },
                            "newContent": {
                                "content": "[ {\"hello\" : \"Test2\"} ]",
                                "contentType": "RawText"
                            }
                        }]
                    };
                    $.ajax({
                        type: 'POST',
                        url: 'https://XXX.visualstudio.com/_apis/tfvc/changesets?api-version=3.0-preview.2',
                        contentType: 'application/json',
                        data: JSON.stringify(json),
                        cache: false,
                        dataType: 'json',
                        beforeSend: function (xhr) {
                            xhr.setRequestHeader("Authorization", "Basic " + btoa("name" + ":" + "password or PAT"));
                        },
                    }).done(function (data) {
                        var s1 = "ss";
    
                    }).error(function (e) {
                        var s = "ss";
                    });
                })