// Copyright 2017 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package google.devtools.source.v1;

import "google/api/annotations.proto";

option csharp_namespace = "Google.Cloud.DevTools.Source.V1";
option go_package = "google.golang.org/genproto/googleapis/devtools/source/v1;source";
option java_multiple_files = true;
option java_outer_classname = "SourceContextProto";
option java_package = "com.google.devtools.source.v1";


// A SourceContext is a reference to a tree of files. A SourceContext together
// with a path point to a unique revision of a single file or directory.
message SourceContext {
  // A SourceContext can refer any one of the following types of repositories.
  oneof context {
    // A SourceContext referring to a revision in a cloud repo.
    CloudRepoSourceContext cloud_repo = 1;

    // A SourceContext referring to a snapshot in a cloud workspace.
    CloudWorkspaceSourceContext cloud_workspace = 2;

    // A SourceContext referring to a Gerrit project.
    GerritSourceContext gerrit = 3;

    // A SourceContext referring to any third party Git repo (e.g. GitHub).
    GitSourceContext git = 6;
  }
}

// An ExtendedSourceContext is a SourceContext combined with additional
// details describing the context.
message ExtendedSourceContext {
  // Any source context.
  SourceContext context = 1;

  // Labels with user defined metadata.
  map<string, string> labels = 2;
}

// An alias to a repo revision.
message AliasContext {
  // The type of an Alias.
  enum Kind {
    // Do not use.
    ANY = 0;

    // Git tag
    FIXED = 1;

    // Git branch
    MOVABLE = 2;

    // OTHER is used to specify non-standard aliases, those not of the kinds
    // above. For example, if a Git repo has a ref named "refs/foo/bar", it
    // is considered to be of kind OTHER.
    OTHER = 4;
  }

  // The alias kind.
  Kind kind = 1;

  // The alias name.
  string name = 2;
}

// A CloudRepoSourceContext denotes a particular revision in a cloud
// repo (a repo hosted by the Google Cloud Platform).
message CloudRepoSourceContext {
  // The ID of the repo.
  RepoId repo_id = 1;

  // A revision in a cloud repository can be identified by either its revision
  // ID or its Alias.
  oneof revision {
    // A revision ID.
    string revision_id = 2;

    // The name of an alias (branch, tag, etc.).
    string alias_name = 3;

    // An alias, which may be a branch or tag.
    AliasContext alias_context = 4;
  }
}

// A CloudWorkspaceSourceContext denotes a workspace at a particular snapshot.
message CloudWorkspaceSourceContext {
  // The ID of the workspace.
  CloudWorkspaceId workspace_id = 1;

  // The ID of the snapshot.
  // An empty snapshot_id refers to the most recent snapshot.
  string snapshot_id = 2;
}

// A SourceContext referring to a Gerrit project.
message GerritSourceContext {
  // The URI of a running Gerrit instance.
  string host_uri = 1;

  // The full project name within the host. Projects may be nested, so
  // "project/subproject" is a valid project name.
  // The "repo name" is hostURI/project.
  string gerrit_project = 2;

  // A revision in a Gerrit project can be identified by either its revision ID
  // or its alias.
  oneof revision {
    // A revision (commit) ID.
    string revision_id = 3;

    // The name of an alias (branch, tag, etc.).
    string alias_name = 4;

    // An alias, which may be a branch or tag.
    AliasContext alias_context = 5;
  }
}

// A GitSourceContext denotes a particular revision in a third party Git
// repository (e.g. GitHub).
message GitSourceContext {
  // Git repository URL.
  string url = 1;

  // Git commit hash.
  // required.
  string revision_id = 2;
}

// A unique identifier for a cloud repo.
message RepoId {
  // A cloud repository can be identified by either its project ID and
  // repository name combination, or its globally unique identifier.
  oneof id {
    // A combination of a project ID and a repo name.
    ProjectRepoId project_repo_id = 1;

    // A server-assigned, globally unique identifier.
    string uid = 2;
  }
}

// Selects a repo using a Google Cloud Platform project ID
// (e.g. winged-cargo-31) and a repo name within that project.
message ProjectRepoId {
  // The ID of the project.
  string project_id = 1;

  // The name of the repo. Leave empty for the default repo.
  string repo_name = 2;
}

// A CloudWorkspaceId is a unique identifier for a cloud workspace.
// A cloud workspace is a place associated with a repo where modified files
// can be stored before they are committed.
message CloudWorkspaceId {
  // The ID of the repo containing the workspace.
  RepoId repo_id = 1;

  // The unique name of the workspace within the repo.  This is the name
  // chosen by the client in the Source API's CreateWorkspace method.
  string name = 2;
}
