distninja

command module
v1.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 27, 2025 License: Apache-2.0 Imports: 1 Imported by: 0

README

distninja

Build Status Go Report Card License Tag

Introduction

distninja is a distributed build system

Features

  • Graph Database Power - Uses cayley's quad-based storage for complex relationships
  • Schema Support - Structured data with Go struct mapping
  • Rich Queries - Path-based queries for complex dependency analysis
  • Relationship Modeling - Explicit modeling of all Ninja relationships
  • Cycle Detection - Built-in circular dependency detection
  • Performance - Efficient graph traversal and querying

Usage

1. HTTP Server
# Deploy server
distninja serve --http <string> --store <string>
# Test server
go run main.go serve --http :9090 --store /tmp/ninja.db
./script/http.sh
2. gRPC Server
# Deploy server
distninja serve --grpc <string> --store <string>
# Test server
go run main.go serve --grpc :9090 --store /tmp/ninja.db
./script/grpc.sh

API

  • Admin API

    • GET /health - Get health check
    • GET /api/v1/status - Get server status
  • Build API

    • POST /api/v1/builds - Create new build
    • GET /api/v1/builds/stats - Get build statistics
    • GET /api/v1/builds/order - Get topological build order
    • GET /api/v1/builds/{id} - Get specific build
  • Rule API

    • POST /api/v1/rules - Create new rule
    • GET /api/v1/rules/{name}/targets - Get targets using a rule
    • GET /api/v1/rules/{name} - Get specific rule
  • Target API

    • GET /api/v1/targets - Get all targets
    • GET /api/v1/targets/{path}/dependencies - Get target dependencies
    • GET /api/v1/targets/{path}/reverse_dependencies - Get target reverse dependencies
    • PUT /api/v1/targets/{path}/status - Update target status
    • GET /api/v1/targets/{path} - Get specific target
  • Analysis API

    • GET /api/v1/analysis/cycles - Find circular dependencies
  • Debug API

    • GET /api/v1/debug/quads - Debug quad information
  • Load API

    • POST /api/v1/load - Load ninja file

Proto

syntax = "proto3";

package distninja;

option go_package = "github.com/distninja/distninja/server/proto;proto";

service DistNinjaService {
  // Admin
  rpc Health(HealthRequest) returns (HealthResponse);
  rpc Status(StatusRequest) returns (StatusResponse);

  // Build
  rpc CreateBuild(CreateBuildRequest) returns (CreateBuildResponse);
  rpc GetBuild(GetBuildRequest) returns (NinjaBuild);
  rpc GetBuildStats(BuildStatsRequest) returns (BuildStatsResponse);
  rpc GetBuildOrder(BuildOrderRequest) returns (BuildOrderResponse);

  // Rule
  rpc CreateRule(CreateRuleRequest) returns (CreateRuleResponse);
  rpc GetRule(GetRuleRequest) returns (NinjaRule);
  rpc GetTargetsByRule(GetTargetsByRuleRequest) returns (GetTargetsByRuleResponse);

  // Target
  rpc GetAllTargets(GetAllTargetsRequest) returns (GetAllTargetsResponse);
  rpc GetTarget(GetTargetRequest) returns (NinjaTarget);
  rpc GetTargetDependencies(GetTargetDependenciesRequest) returns (GetTargetDependenciesResponse);
  rpc GetTargetReverseDependencies(GetTargetReverseDependenciesRequest) returns (GetTargetReverseDependenciesResponse);
  rpc UpdateTargetStatus(UpdateTargetStatusRequest) returns (UpdateTargetStatusResponse);

  // Analysis
  rpc FindCycles(FindCyclesRequest) returns (FindCyclesResponse);

  // Debug
  rpc DebugQuads(DebugQuadsRequest) returns (DebugQuadsResponse);

  // Load
  rpc LoadNinjaFile(LoadNinjaFileRequest) returns (LoadNinjaFileResponse);
}

// Admin
message HealthRequest {}
message HealthResponse {
  string status = 1;
  string timestamp = 2;
}

message StatusRequest {}
message StatusResponse {
  string service = 1;
  string uptime = 2;
}

// Build
message CreateBuildRequest {
  string build_id = 1;
  string rule = 2;
  map<string, string> variables = 3;
  string pool = 4;
  repeated string inputs = 5;
  repeated string outputs = 6;
  repeated string implicit_deps = 7;
  repeated string order_deps = 8;
}
message CreateBuildResponse {
  string status = 1;
  string build_id = 2;
}

message GetBuildRequest { string id = 1; }

message BuildStatsRequest {}
message BuildStatsResponse {
  map<string, int64> stats = 1;
}

message BuildOrderRequest {}
message BuildOrderResponse {
  repeated string build_order = 1;
}

// Rule
message CreateRuleRequest {
  string name = 1;
  string command = 2;
  string description = 3;
  map<string, string> variables = 4;
}
message CreateRuleResponse {
  string status = 1;
  string name = 2;
}

message GetRuleRequest { string name = 1; }
message GetTargetsByRuleRequest { string rule_name = 1; }
message GetTargetsByRuleResponse { repeated NinjaTarget targets = 1; }

// Target
message GetAllTargetsRequest {}
message GetAllTargetsResponse { repeated NinjaTarget targets = 1; }

message GetTargetRequest { string path = 1; }

message GetTargetDependenciesRequest { string path = 1; }
message GetTargetDependenciesResponse { repeated NinjaFile dependencies = 1; }

message GetTargetReverseDependenciesRequest { string path = 1; }
message GetTargetReverseDependenciesResponse { repeated NinjaTarget reverse_dependencies = 1; }

message UpdateTargetStatusRequest {
  string path = 1;
  string status = 2;
}
message UpdateTargetStatusResponse { string status = 1; }

// Analysis
message FindCyclesRequest {}
message FindCyclesResponse {
  repeated Cycle cycles = 1;
  int32 cycle_count = 2;
}
message Cycle { repeated string nodes = 1; }

// Debug
message DebugQuadsRequest {
  int32 limit = 1;
}
message DebugQuadsResponse {
  string message = 1;
  int32 limit = 2;
}

// Load
message LoadNinjaFileRequest {
  string file_path = 1;
  string content = 2;
}
message LoadNinjaFileResponse {
  string status = 1;
  string message = 2;
  map<string, int64> stats = 3;
  string build_time = 4;
}

// Ninja
message NinjaBuild {
  string id = 1;
  string type = 2;
  string build_id = 3;
  string rule = 4;
  string variables = 5;
  string pool = 6;
}

message NinjaFile {
  string id = 1;
  string type = 2;
  string path = 3;
  string file_type = 4;
}

message NinjaRule {
  string id = 1;
  string type = 2;
  string name = 3;
  string command = 4;
  string description = 5;
  string variables = 6;
}

message NinjaTarget {
  string id = 1;
  string type = 2;
  string path = 3;
  string status = 4;
  string hash = 5;
  string build = 6;
}

License

Project License can be found here.

Reference

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL