From 1099c60d2d5d2f5d21c0cdcabc77b39fc2da2900 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C4=99drzej=20Nowacki?= <jedrzej.nowacki@digia.com>
Date: Thu, 27 Sep 2012 12:49:19 +0200
Subject: [PATCH] Qt QDoc bot: Automatically initialize unknown projects.

Change-Id: Ibaec7723a155c760ccafa89fe09c67d6410f06b5
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@digia.com>
---
 git-hooks/qdoc-bot.py | 31 ++++++++++++++++++++++++++++---
 1 file changed, 28 insertions(+), 3 deletions(-)

diff --git a/git-hooks/qdoc-bot.py b/git-hooks/qdoc-bot.py
index c3b876e..9fada03 100755
--- a/git-hooks/qdoc-bot.py
+++ b/git-hooks/qdoc-bot.py
@@ -228,9 +228,34 @@ def process_event(event_string):
     try:
         os.chdir(source_path)
     except OSError, e:
-        logging.error("Unknown project, TODO write code to initialize it, error message: %s", e) #TODO for know you need to have qt/qtbase checkout ready
-        logging.debug("Current dir was: %s", os.getcwd())
-        return -1
+        logging.info("Unknown project: %s, trying to clone it", project)
+        tmp_dir = tempfile.mkdtemp(prefix="qdoc_code_")
+        os.chdir(tmp_dir)
+        try:
+            logging.debug("Clonning a new project (%s) to a tmp_dir (%s)", project, tmp_dir)
+            cmd_git_clone = ["git", "clone", "ssh://" + config.gerrit_address + "/" + project, "."]
+            subprocess.check_call(cmd_git_clone)
+        except Error, e:
+            logging.error("Could not clone a new project (%s) to a tmp_dir (%s), error message:", project, tmp_dir, e)
+            shutil.rmtree(tmp_dir)
+            return -1
+        try:
+            root_project_dir = config.watcher_working_dir + "/" + project.split('/')[:-1][0]
+            logging.debug("Creating destination folder (%s) for the new project (%s)", root_project_dir, project)
+            try:
+                os.mkdir(root_project_dir)
+            except OSError, e:
+                if e.errno != 17: # if error is different then "File exist"
+                    logging.error("Can not make project root directory: %s ", e)
+                    raise e
+            logging.debug("Moving the clone (%s) from tmp dir (%s) to the destination folder (%s)", project, tmp_dir, source_path)
+            os.rename(tmp_dir, source_path)
+        except Error, e:
+            logging.info("Initialization of a new project (%s) failed because it was initialized before, probably by an other process", project)
+            logging.debug("Exception caught during rename operation: %s", e)
+            shutil.rmtree(tmp_dir)
+        os.chdir(source_path)
+        logging.info("New project (%s) was initialized correctly", project)
 
     if fetch_change(project, patch_set, change_number) != 0:
         return -1
-- 
GitLab