gitea/sdk/csharp
logikonline e35aa8d878 sdk: add C# and Java SDK libraries with chunked upload support
Both SDKs provide:
- Full API client for users, repositories, and releases
- Chunked upload with parallel workers
- Progress tracking with speed/ETA
- SHA256 checksum verification
- Comprehensive exception handling

C# SDK (.NET 8.0):
- Modern record types for models
- Async/await pattern throughout
- System.Text.Json serialization

Java SDK (Java 17):
- Standard Maven project
- Jackson for JSON
- HttpClient for HTTP
- ExecutorService for parallel uploads

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 12:19:17 -05:00
..
Gitea.SDK sdk: add C# and Java SDK libraries with chunked upload support 2026-01-09 12:19:17 -05:00
README.md sdk: add C# and Java SDK libraries with chunked upload support 2026-01-09 12:19:17 -05:00

Gitea .NET SDK

Official .NET SDK for the Gitea API with chunked upload support for large files.

Installation

dotnet add package Gitea.SDK

Quick Start

using Gitea.SDK;

// Create client
var client = new GiteaClient("https://gitea.example.com", "your_token");

// Get current user
var user = await client.GetCurrentUserAsync();
Console.WriteLine($"Logged in as {user.Login}");

// Get a repository
var repo = await client.GetRepositoryAsync("owner", "repo");
Console.WriteLine($"Repository: {repo.FullName}");

Chunked Upload

Upload large files with progress tracking:

using Gitea.SDK;

var client = new GiteaClient("https://gitea.example.com", "your_token");

// Upload a release asset with progress
await using var fileStream = File.OpenRead("large-file.tar.gz");

var result = await client.UploadReleaseAssetAsync(
    owner: "myorg",
    repo: "myrepo",
    releaseId: 123,
    fileStream: fileStream,
    filename: "large-file.tar.gz",
    options: new ChunkedUploadOptions
    {
        ChunkSize = 50 * 1024 * 1024, // 50MB chunks
        Parallel = 4,
        VerifyChecksum = true,
        OnProgress = p =>
        {
            Console.WriteLine($"Progress: {p.Percent:F1}%");
            Console.WriteLine($"Speed: {p.SpeedFormatted}");
            Console.WriteLine($"ETA: {p.EtaFormatted}");
        }
    });

Console.WriteLine($"Uploaded: {result.BrowserDownloadUrl}");

Using ChunkedUpload Directly

For more control over the upload process:

using Gitea.SDK;

var client = new GiteaClient("https://gitea.example.com", "your_token");

var upload = client.CreateChunkedUpload("owner", "repo", 123, new ChunkedUploadOptions
{
    ChunkSize = 50 * 1024 * 1024,
    Parallel = 4,
    OnProgress = p => Console.WriteLine($"{p.Percent:F1}%")
});

try
{
    await using var stream = File.OpenRead("file.tar.gz");
    var result = await upload.UploadAsync(stream, "file.tar.gz");
    Console.WriteLine($"Success: {result.BrowserDownloadUrl}");
}
catch (UploadException ex)
{
    // Upload failed, can retry later
    Console.WriteLine($"Resume with session: {upload.Session?.Id}");
}

API Reference

GiteaClient

Constructor

var client = new GiteaClient(
    baseUrl: "https://gitea.example.com",
    token: "your_api_token",
    httpClient: null // Optional custom HttpClient
);

User Methods

  • GetCurrentUserAsync() - Get authenticated user
  • GetUserAsync(username) - Get user by username

Repository Methods

  • GetRepositoryAsync(owner, repo) - Get repository
  • ListUserRepositoriesAsync(username) - List user's repositories

Release Methods

  • GetReleaseAsync(owner, repo, releaseId) - Get release by ID
  • GetReleaseByTagAsync(owner, repo, tag) - Get release by tag
  • ListReleasesAsync(owner, repo) - List all releases

Upload Methods

  • UploadReleaseAssetAsync(...) - Upload release asset with chunked upload
  • CreateChunkedUpload(owner, repo, releaseId, options) - Create upload handler
  • GetUploadSessionAsync(sessionId) - Get upload session status
  • CancelUploadAsync(sessionId) - Cancel upload session

Error Handling

using Gitea.SDK;

var client = new GiteaClient("https://gitea.example.com", "your_token");

try
{
    var repo = await client.GetRepositoryAsync("owner", "nonexistent");
}
catch (NotFoundException ex)
{
    Console.WriteLine($"Repository not found: {ex.Message}");
}
catch (AuthenticationException ex)
{
    Console.WriteLine($"Authentication failed: {ex.Message}");
}
catch (UploadException ex)
{
    Console.WriteLine($"Upload failed: {ex.Message}");
    Console.WriteLine($"Session: {ex.SessionId}, Chunk: {ex.ChunkNumber}");
}
catch (ApiException ex)
{
    Console.WriteLine($"API error [{ex.Code}]: {ex.Message}");
}

Requirements

  • .NET 8.0 or later
  • System.Text.Json for JSON serialization

License

MIT License - See LICENSE file for details.