繁体   English   中英

使用 Azure DevOps Rest API 重命名文件

[英]Renaming a file using Azure DevOps Rest API

I'm creating an Azure function for a renaming a file in an Azure DevOps Repository but need the 'oldObjectId' which is the last 'commitId' from the Get Commits API call ie

GET https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}/commits?api-version=6.0

我正在本地和通过 PostMan 测试代码,但不知道要在请求正文中包含什么,因为没有为此指定任何内容。

我对 C# 和 Azure 函数很陌生,不知道如何在我自己的项目中正确实现它。 如果有人能引导我走向正确的方向,我将不胜感激。

我正在使用带有 .NET Core 3.0 和 Azure 函数的 Visual Studio。

这是到目前为止的代码:


using System;
using System.IO;
using System.Net;
using Microsoft.Azure.WebJobs;
using Newtonsoft.Json;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;

namespace FileRename
{
    public static class Rename
    {
        private static bool flgFileRenamed;
        private static bool flgRepoCommit;

        [FunctionName("RenameFunction")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]
             HttpRequest req, ILogger log)
        {

            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            dynamic body = JsonConvert.DeserializeObject(requestBody);


            string devOpsUsername = Environment.GetEnvironmentVariable("DevOpsUsername", EnvironmentVariableTarget.Process);
            string devOpsPAT = Environment.GetEnvironmentVariable("DevOpsPAT", EnvironmentVariableTarget.Process);
            string serviceEndpointId = Environment.GetEnvironmentVariable("ServiceEndpointId", EnvironmentVariableTarget.Process);
            string sourceRepoUrl = Environment.GetEnvironmentVariable("SourceRepoUrl", EnvironmentVariableTarget.Process);
            string baseTargetUri = Environment.GetEnvironmentVariable("BaseTargetUri", EnvironmentVariableTarget.Process);

            string RepoId = "1bfc406f-5dd7-44e1-b5fc-bd14829fbb12";

            using HttpClient client = new HttpClient();
            {

                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
                    Convert.ToBase64String(
                        ASCIIEncoding.ASCII.GetBytes(
                            string.Format("{0}:{1}", devOpsUsername, devOpsPAT))));


                // Get Latest Commits to the Repository
                var latestCommittsRequestBody = new
                {

                };

                //GET https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}/commits?searchCriteria.$top=1&api-version=6.1-preview.1
                var latestCommittsUrl = baseTargetUri + "git/repositories/" + RepoId + "/commits?searchCriteria.$top=1&api-version=6.1-preview.1";


                HttpRequestMessage latestCommittsRequest = new HttpRequestMessage(HttpMethod.Get, latestCommittsUrl);
                latestCommittsRequest.Content = new StringContent(JsonConvert.SerializeObject(latestCommittsRequestBody), Encoding.UTF8, "application/json");

                //var CommitId = body.value.commitId;

                // latest Commits Response
                using HttpResponseMessage latestCommittsResponse = await client.SendAsync(latestCommittsRequest);
                {
                    if (latestCommittsResponse.StatusCode == HttpStatusCode.Created)
                    {
                        flgRepoCommit = true;
                    }
                    else
                    {
                        flgRepoCommit = false;

                    }
                }


                // Rename a File
                var renameFileRequestBody = new
                {
                    refUpdates = new
                    {
                        name = "refs/heads/master",
                        oldObjectId = body.value.commitId,
                    },

                    commits = new
                    {
                        comment = "Renaming ABC.txt to XYZ.txt",
                        changes = new
                        {
                            changeType = "rename",
                            sourceServerItem = "/ABC.txt",
                            item = new
                            {
                                path = "/XYZ.txt",
                            }
                        },
                    }
                };

                var renameFileUrl = baseTargetUri + "git/repositories/" + RepoId + "/pushes?api-version=6.0-preview.1";

                HttpRequestMessage renameFileRequest = new HttpRequestMessage(HttpMethod.Post, renameFileUrl);
                renameFileRequest.Content = new StringContent(JsonConvert.SerializeObject(renameFileRequestBody), Encoding.UTF8, "application/json");

                using HttpResponseMessage renameFileResponse = await client.SendAsync(renameFileRequest);
                {
                    if (renameFileResponse.StatusCode == HttpStatusCode.Created)
                    {
                        flgFileRenamed = true;
                    }
                    else
                    {
                        flgFileRenamed = false;
                    }
                }

                // Checks if file is renamed or not 
                if (flgFileRenamed == true)
                {
                    return new OkObjectResult("File is renamed successfully!"); // 200                      
                }
                else
                {
                    return new BadRequestObjectResult("File could not be renamed successfully."); // 400
                }
            }
        }
    }
}


关于这个问题,请参考以下代码

Client.DefaultRequestHeaders.Accept.Add(
              new MediaTypeWithQualityHeaderValue("application/json"));

            Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
                Convert.ToBase64String(
                    ASCIIEncoding.ASCII.GetBytes(
                        string.Format("{0}:{1}", "", PAT))));

            var requestMessage = new HttpRequestMessage(HttpMethod.Get, "https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}/commits?api-version=6.0-preview.1&searchCriteria.$top=1");
            string content = string.Empty;
            using (HttpResponseMessage response = await Client.SendAsync(requestMessage))
            {
                if (!response.IsSuccessStatusCode)
                {
                    try
                    {
                        response.EnsureSuccessStatusCode();
                    }
                    catch (HttpRequestException ex)
                    {

                        throw ex;
                    }


                }
                var res = await response.Content.ReadAsStringAsync();
                JObject resObj = JsonConvert.DeserializeObject<JObject>(res);
               var commitId = (resObj["value"].Last).Value<string>("commitId");
                log.LogInformation("commitId: "+ commitId);
                var renameFileRequestBody = new
                {
                    refUpdates = new Object[] {
                        new {
                            name = "refs/heads/master",
                            oldObjectId = commitId,
                        },
                    },
                    

                    commits =new Object[] {
                       new{
                            comment = "Renaming test.txt to mytest.txt",
                            changes = new Object[]{
                               new{
                                    changeType = "rename",
                                    sourceServerItem = "/test.txt",
                                    item = new
                                    {
                                        path = "/mytest.txt",
                                    }
                                },
                            }
                        }


                    }
                };
                HttpRequestMessage renameFileRequest = new HttpRequestMessage(HttpMethod.Post, "https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}/pushes?api-version=6.1-preview.2");
                renameFileRequest.Content = new StringContent(JsonConvert.SerializeObject(renameFileRequestBody), Encoding.UTF8, "application/json");
                using (HttpResponseMessage renameFileResponse=await  Client.SendAsync(renameFileRequest))
                {
                    if (renameFileResponse.StatusCode == HttpStatusCode.Created)
                    {
                        return new OkObjectResult("File is renamed successfully!");
                    }
                    else
                    {
                        return new BadRequestObjectResult("File could not be renamed successfully."); // 400
                    }

                   
                }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM