From 07ce37542ce3ac0320244aeefaa0ab747b903996 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Leroy=20R=C3=BCgemer?= <lruegeme@techfak.uni-bielefeld.de>
Date: Wed, 27 Jun 2018 11:18:28 +0200
Subject: [PATCH] add maven settings.xml generation to environment

---
 env-hooks/15.rosjava.bash.em      |  2 +
 env-hooks/15.rosjava.sh.em        |  2 +
 generate_environment_variables.py | 90 +++++++++++++++++++++++++++----
 package.xml                       |  2 +-
 4 files changed, 85 insertions(+), 11 deletions(-)

diff --git a/env-hooks/15.rosjava.bash.em b/env-hooks/15.rosjava.bash.em
index 9da9f00..95fe7cc 100644
--- a/env-hooks/15.rosjava.bash.em
+++ b/env-hooks/15.rosjava.bash.em
@@ -9,3 +9,5 @@ SCRIPT=@(CMAKE_INSTALL_PREFIX)/share/rosjava_build_tools/generate_environment_va
 export ROS_MAVEN_PATH="`python ${SCRIPT} --maven-path`"
 export ROS_MAVEN_DEPLOYMENT_REPOSITORY="`python ${SCRIPT} --maven-deployment-repository`"
 export ROS_MAVEN_REPOSITORY="`python ${SCRIPT} --maven-repository`"
+export ROS_LOCAL_MAVEN_REPOSITORY="`python ${SCRIPT} --local-maven-repository`"
+export ROS_MAVEN_SETTING_XML_CONTENT="`python ${SCRIPT} --create-maven-settings`"
diff --git a/env-hooks/15.rosjava.sh.em b/env-hooks/15.rosjava.sh.em
index 36f796e..bb125d8 100644
--- a/env-hooks/15.rosjava.sh.em
+++ b/env-hooks/15.rosjava.sh.em
@@ -9,3 +9,5 @@ SCRIPT=@(CMAKE_INSTALL_PREFIX)/share/rosjava_build_tools/generate_environment_va
 export ROS_MAVEN_PATH="`python ${SCRIPT} --maven-path`"
 export ROS_MAVEN_DEPLOYMENT_REPOSITORY="`python ${SCRIPT} --maven-deployment-repository`"
 export ROS_MAVEN_REPOSITORY="`python ${SCRIPT} --maven-repository`"
+export ROS_LOCAL_MAVEN_REPOSITORY="`python ${SCRIPT} --local-maven-repository`"
+export ROS_MAVEN_SETTING_XML_CONTENT="`python ${SCRIPT} --create-maven-settings`"
\ No newline at end of file
diff --git a/generate_environment_variables.py b/generate_environment_variables.py
index b7ff803..e3a7620 100755
--- a/generate_environment_variables.py
+++ b/generate_environment_variables.py
@@ -12,9 +12,65 @@ def parse_arguments():
     cmd_group.add_argument('-r', '--maven-repository', action='store_true', help='The url to the external ros maven repository.')
     cmd_group.add_argument('-m', '--maven-path', action='store_true', help='Generate maven path across all chained workspcaes.')
     cmd_group.add_argument('-g', '--gradle-user-home', action='store_true', help='Generate the local gradle user home in the current devel workspace (share/gradle).')
+    cmd_group.add_argument('-l', '--local-maven-repository', action='store_true', help='Generate the local maven cache in the current devel workspace (share/maven).')
+    cmd_group.add_argument("-s", '--create-maven-settings', action='store_true', help='Generate maven settings.xml for the current devel workspace.')
     args = parser.parse_args()
     return args
 
+MAVEN_HEADER="""
+	<settings xmlns='http://maven.apache.org/SETTINGS/1.0.0/'
+    xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
+    xsi:schemaLocation='http://maven.apache.org/SETTINGS/1.0.0
+    http://maven.apache.org/xsd/settings-1.0.0.xsd'>
+		<profiles>
+			<profile>
+				<id>catkin</id>
+				<activation>
+					<activeByDefault>true</activeByDefault>
+				</activation>
+				<repositories>
+"""
+
+MAVEN_FOOTER="""
+				</repositories>
+			</profile>
+		</profiles>
+	</settings>
+"""
+
+
+def get_repository_xml(id, path):
+
+	if path.startswith("/"):
+		path = "file://" + path
+
+	return """
+		<repository>
+			<id>{id}</id>
+			<name>{id}</name>
+			<url>{url}</url>
+			<layout>default</layout>
+			<releases>
+				<updatePolicy>always</updatePolicy>
+				<enabled>true</enabled>
+			</releases>
+			<snapshots>
+				<updatePolicy>always</updatePolicy>
+				<enabled>true</enabled>
+			</snapshots>
+		</repository>
+		""".format(
+			url=path,
+			id=id,
+		)
+
+def get_repositories_xml():
+	maven_paths = generate_maven_path()
+	settings = ""
+	for id, repo, in enumerate(maven_paths.split(":")):
+		settings += get_repository_xml(id,repo)
+	return settings
+
 def get_workspaces(environ):
     '''
     Based on CMAKE_PREFIX_PATH return all catkin workspaces.
@@ -37,6 +93,19 @@ def get_environment_variable(environ, key):
         var = None
     return var
 
+def generate_maven_path():
+    new_maven_paths = [os.path.join(path, 'share', 'repository') for path in workspaces] #TODO: make configurable!
+    maven_paths = get_environment_variable(environment_variables, 'ROS_MAVEN_PATH')
+    if maven_paths is None:
+        maven_paths = new_maven_paths
+    else:
+        maven_paths = maven_paths.split(os.pathsep)
+        common_paths = [p for p in maven_paths if p in new_maven_paths]
+        if common_paths:
+            maven_paths = new_maven_paths
+
+    return os.pathsep.join(maven_paths)
+
 if __name__ == '__main__':
     args = parse_arguments()
     environment_variables = dict(os.environ)
@@ -55,16 +124,7 @@ if __name__ == '__main__':
             repo = 'https://mvn.cit-ec.de/nexus/content/repositories/releases/'
         print(repo)
     elif args.maven_path:
-        new_maven_paths = [os.path.join(path, 'share', 'repository') for path in workspaces] #TODO: make configurable!
-        maven_paths = get_environment_variable(environment_variables, 'ROS_MAVEN_PATH')
-        if maven_paths is None:
-            maven_paths = new_maven_paths
-        else:
-            maven_paths = maven_paths.split(os.pathsep)
-            common_paths = [p for p in maven_paths if p in new_maven_paths]
-            if common_paths:
-                maven_paths = new_maven_paths
-        print(os.pathsep.join(maven_paths))
+        print(generate_maven_path())
     elif args.gradle_user_home:
         home = get_environment_variable(environment_variables, 'GRADLE_USER_HOME')
         if home is None:
@@ -73,5 +133,15 @@ if __name__ == '__main__':
             if home in [os.path.join(w, 'share', 'gradle') for w in workspaces]:
                 home = os.path.join(workspaces[0], 'share', 'gradle')
         print(home)
+    elif args.local_maven_repository:
+        home = get_environment_variable(environment_variables, 'MAVEN_USER_LOCAL_REPOSITORY') #TODO research key
+        if home is None:
+            home = os.path.join(workspaces[0], 'share', 'maven')
+        else:
+            if home in [os.path.join(w, 'share', 'maven') for w in workspaces]:
+                home = os.path.join(workspaces[0], 'share', 'maven')
+        print(home)
+    elif args.create_maven_settings:
+        print(MAVEN_HEADER + get_repositories_xml() + MAVEN_FOOTER)
     else:
         print("Nothing to see here - please provide one of the valid command switches.")
diff --git a/package.xml b/package.xml
index 06c3a94..9a7d957 100644
--- a/package.xml
+++ b/package.xml
@@ -1,6 +1,6 @@
 <package>
   <name>rosjava_build_tools</name>
-  <version>0.3.5</version>
+  <version>0.3.6</version>
   <description>
     Simple tools and catkin modules for rosjava development.
   </description>
-- 
GitLab