// Copyright 2008 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.

package codereview.internal;
option java_package = "com.google.codereview.internal";

import "add_patchset.proto";
import "complete_patchset.proto";
import "submit_change.proto";
import "upload_patchset_file.proto";

service ChangeService {
  // Create a change and (empty) patchset for a Git commit.
  //
  rpc SubmitChange(SubmitChangeRequest)
  returns (SubmitChangeResponse);

  // Add a patch set to a change.
  //
  rpc AddPatchSet(AddPatchSetRequest)
  returns (AddPatchSetResponse);

  // Attaches a file to an existing patchset
  //
  rpc UploadPatchsetFile(UploadPatchsetFileRequest)
  returns (UploadPatchsetFileResponse);

  // Mark a patchset as complete (fully uploaded)
  //
  rpc CompletePatchset(CompletePatchsetRequest)
  returns (CompletePatchsetResponse);
}
