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>
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 userGetUserAsync(username)- Get user by username
Repository Methods
GetRepositoryAsync(owner, repo)- Get repositoryListUserRepositoriesAsync(username)- List user's repositories
Release Methods
GetReleaseAsync(owner, repo, releaseId)- Get release by IDGetReleaseByTagAsync(owner, repo, tag)- Get release by tagListReleasesAsync(owner, repo)- List all releases
Upload Methods
UploadReleaseAssetAsync(...)- Upload release asset with chunked uploadCreateChunkedUpload(owner, repo, releaseId, options)- Create upload handlerGetUploadSessionAsync(sessionId)- Get upload session statusCancelUploadAsync(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.