summaryrefslogtreecommitdiffstats
path: root/webapp/codereview/internal/change_service.py
diff options
context:
space:
mode:
Diffstat (limited to 'webapp/codereview/internal/change_service.py')
-rw-r--r--webapp/codereview/internal/change_service.py165
1 files changed, 165 insertions, 0 deletions
diff --git a/webapp/codereview/internal/change_service.py b/webapp/codereview/internal/change_service.py
new file mode 100644
index 0000000000..1ce26dccb9
--- /dev/null
+++ b/webapp/codereview/internal/change_service.py
@@ -0,0 +1,165 @@
+# 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.
+
+import logging
+
+from google.appengine.api import users
+from google.appengine.ext import db
+
+from codereview import models
+
+from change_pb2 import ChangeService
+from complete_patchset_pb2 import *
+from upload_patchset_file_pb2 import *
+from submit_change_pb2 import *
+from util import *
+
+class ChangeServiceImp(ChangeService, InternalAPI):
+
+ @automatic_retry
+ def SubmitChange(self, rpc_controller, req, done):
+ rsp = SubmitChangeResponse()
+
+ user = users.User(req.owner)
+ branch = db.get(db.Key(req.dest_branch_key))
+ if not branch:
+ rsp.status_code = SubmitChangeResponse.UNKNOWN_BRANCH
+ done(rsp)
+
+ rev = commit_to_revision(branch.project, req.commit)
+ if rev.patchset:
+ rsp.status_code = SubmitChangeResponse.PATCHSET_EXISTS
+ done(rsp)
+
+ subject = u(req.commit.subject)[0:100]
+
+ def trans():
+ change = models.Change(
+ subject = subject,
+ description = u(req.commit.message),
+ owner = user,
+ dest_project = branch.project,
+ dest_branch = branch,
+ n_patchsets = 1)
+ change.put()
+
+ patchset = models.PatchSet(
+ change = change,
+ owner = user,
+ parent = change,
+ revision = rev,
+ id = 1)
+ patchset.put()
+ return (change, patchset)
+ change, patchset = db.run_in_transaction(trans)
+
+ if rev.link_patchset(patchset):
+ rsp.status_code = SubmitChangeResponse.CREATED
+ rsp.change_id = change.key().id()
+ rsp.patchset_id = patchset.id
+ rsp.patchset_key = str(patchset.key())
+ else:
+ db.delete([change, patchset])
+ rsp.status_code = SubmitChangeResponse.PATCHSET_EXISTS
+ done(rsp)
+
+ @automatic_retry
+ def UploadPatchsetFile(self, rpc_controller, req, done):
+ rsp = UploadPatchsetFileResponse()
+
+ patchset = db.get(db.Key(req.patchset_key))
+ if not patchset:
+ rsp.status_code = UploadPatchsetFileResponse.UNKNOWN_PATCHSET
+ done(rsp)
+ return
+
+ if patchset.complete or patchset.change.closed:
+ rsp.status_code = UploadPatchsetFileResponse.CLOSED
+ done(rsp)
+ return
+
+ if UploadPatchsetFileRequest.ADD == req.status:
+ status = 'A'
+ elif UploadPatchsetFileRequest.MODIFY == req.status:
+ status = 'M'
+ elif UploadPatchsetFileRequest.DELETE == req.status:
+ status = 'D'
+ else:
+ status = '?'
+
+ try:
+ if req.base_id:
+ old_data = models.DeltaContent.create_content(
+ id = req.base_id,
+ text_z = req.base_z)
+ new_data = models.DeltaContent.create_content(
+ id = req.final_id,
+ text_z = req.patch_z,
+ base = old_data)
+ if new_data.text_z == req.patch_z:
+ diff_data = new_data
+ else:
+ diff_data = models.DeltaContent.create_patch(
+ id = req.patch_id,
+ text_z = req.patch_z)
+ else:
+ old_data = None
+ new_data = None
+ diff_data = models.DeltaContent.create_patch(
+ id = req.patch_id,
+ text_z = req.patch_z)
+ except models.DeltaPatchingException:
+ logging.error("Patch error on change %s, patch set %s, file %s"
+ % (patchset.change.key().id(),
+ str(patchset.id),
+ u(req.file_name))
+ )
+ rsp.status_code = UploadPatchsetFileResponse.PATCHING_ERROR
+ done(rsp)
+ return
+
+ patch = models.Patch.get_or_insert_patch(
+ patchset = patchset,
+ filename = u(req.file_name),
+ status = status,
+ n_comments = 0,
+ old_data = old_data,
+ new_data = new_data,
+ diff_data = diff_data)
+
+ if old_data:
+ models.CachedDeltaContent.get(old_data.key())
+ models.CachedDeltaContent.get(new_data.key())
+ if diff_data != new_data:
+ models.CachedDeltaContent.get(diff_data.key())
+ else:
+ models.CachedDeltaContent.get(diff_data.key())
+
+ rsp.status_code = UploadPatchsetFileResponse.CREATED
+ done(rsp)
+
+ @automatic_retry
+ def CompletePatchset(serlf, rpc_controller, req, done):
+ rsp = CompletePatchsetResponse()
+
+ patchset = db.get(db.Key(req.patchset_key))
+ if not patchset.complete:
+ patchset.complete = True
+ patchset.put()
+
+ if len(req.compressed_filenames) > 0:
+ models.PatchSetFilenames.store_compressed(
+ patchset,
+ req.compressed_filenames)
+ done(rsp)