2011-03-17 2 views
4

Я бы хотел показать результат «git описать» на мой взгляд. Нужно ли мне писать плагин, который обновляет значение и устанавливает его в приложении? Или есть более простой способ сделать это?Ввод вывода «git описать» в шаблоне с использованием игрового фрейма?

ответ

3

Я только что прочитал о игровых модулях и решил написать (https://github.com/killdashnine/play-git-plugin), чтобы увидеть, если я мог бы решить мою проблему:

import java.io.BufferedReader; 
import java.io.InputStreamReader; 

import play.Logger; 
import play.Play; 
import play.PlayPlugin; 

public class GitPlugin extends PlayPlugin { 

     private static String GIT_PLUGIN_PREFIX = "GIT plugin: "; 

     @Override 
     public void onApplicationStart() { 
       Logger.info(GIT_PLUGIN_PREFIX + "executing 'git describe'"); 
       final StringBuffer gitVersion = new StringBuffer(); 
       try { 
         final Process p = Runtime.getRuntime().exec("git describe"); 
         final BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 

         // wait for process to complete 
         p.waitFor(); 

         // read the output 
         String line = reader.readLine(); 
         while(line != null) { 
           gitVersion.append(line); 
           line = reader.readLine(); 
         } 
       } 
       catch(Exception e) { 
         Logger.error(GIT_PLUGIN_PREFIX + "unable to execute 'git describe'"); 
       } 

       // set a property for this value 
       Play.configuration.setProperty("git.revision", gitVersion.toString()); 

       Logger.info(GIT_PLUGIN_PREFIX + "revision is " + gitVersion.toString()); 
     } 
} 

что приводит:

12:14:46,508 INFO ~ GIT plugin: executing 'git describe' 
12:14:46,513 INFO ~ GIT plugin: revision is V0-beta-7-gac9af80 

В моем контроллере :

@Before 
    static void addDefaults() { 
     renderArgs.put("version", Play.configuration.getProperty("git.revision")); 
    } 

Конечно, это не очень портативно и может быть улучшено. Возможное улучшение было бы, чтобы пользовательская команда запускалась через настройки в вашем файле конфигурации.

1

Если вы не запустить свой код из мерзавца репо вы могли бы сделать, как я, у меня есть сценарий сборки, который создает архив войны и в этом сценарии я буду делать:

cat > {apppath}/conf/application_version.properties << EOF 
application.version=`git describe` 
application.buildtime=`date` 
EOF 
... 

И в класс @OnApplicationStart я добавить свойства

private def readApplicationVersion() { 
    Logger.info("Bootstrap.readApplicationVersion file") 
    Play.id match { 
     case "" | "test" => Play.configuration.put("application.version", "TEST-MODE"); Play.configuration.put("application.buildtime", "YEAH BABY YEAH REALTIME") 
     case _ => addFileProp(VirtualFile.open(Play.applicationPath).child("conf/application_version.properties").inputstream()) 
    } 
} 

private def addFileProp(input: InputStream) { 
    input match { 
     case null => Logger.error("can't find config file, Play id: " + Play.id + ". Will exit now.") 
     case _ => val extendCconfiguration = IO.readUtf8Properties(input); 
     for (key <- extendCconfiguration.keys) { 
      Play.configuration.put(key, extendCconfiguration.get(key)) 
     } 
    } 
} 

И от контроллера

object ApplicationVersion extends Controller { 
    def version = { 
     Json("{iamVersion: '"+configuration.getProperty("application.version")+"', buildTime: '"+configuration.getProperty("application.buildtime")+"'}") 
    } 
}