Может вы слышали про такой вот замечательный продукт code_swarm (более свежая версия на github).
В общем пришла мне в голову мысль а что если сделать лог активности в TS и в результате родился вот такой вот скритп:
- Code: Select all
<#assign listresult>
<@std.script>
import java.util.*;
import com.trackstudio.kernel.cache.*;
import java.io.*;
import com.trackstudio.secured.*;
import com.trackstudio.securedkernel.*;
import com.trackstudio.tools.*;
import java.text.SimpleDateFormat;
import com.trackstudio.app.adapter.AdapterManager;
try
{
String strOut = "";
String strOut_Code = "";
SimpleDateFormat df = new SimpleDateFormat("EEE MMM d HH:mm:ss yyyy Z", new Locale("us", "US"));
List taskList = TaskRelatedManager.getInstance().getAllTasksIdCollection();
for(String curTaskId : taskList){
SecuredTaskBean curTask = new SecuredTaskBean(curTaskId, sc);
if(curTask != null)
{
String pathTask = "";
String ext = ".task";
for(SecuredTaskBean curTask_ : Util.fullPath(curTask)){
if(curTask_.getCategory().getPreferences().contains("V"))
pathTask += "/" + curTask_.getNumber();
else
pathTask += "/" + curTask_.getNumber() /*getName().replaceAll("/", "_")*/;
}
pathTask = pathTask.replaceAll("(/758(/|$))", "/Forum$2");
if(pathTask.matches(".*(/152(/|$)).*")){
ext = ".supp";
pathTask = pathTask.replaceAll("(/152(/|$))", "/Suppor$2");
}
if(pathTask.matches(".*(/1012(/|$)).*")){
ext = ".buh";
pathTask = pathTask.replaceAll("(/1012(/|$))", "/Acts$2");
}
if(pathTask.matches(".*(/761(/|$)).*")){
ext = ".fts";
pathTask = pathTask.replaceAll("(/761(/|$))", "/TS$2");
}
if(pathTask.matches(".*(/2012(/|$)).*")){
ext = ".frb";
pathTask = pathTask.replaceAll("(/2012(/|$))", "/RBook$2");
}
if(pathTask.matches(".*(/760(/|$)).*")){
ext = ".fsp";
pathTask = pathTask.replaceAll("(/760(/|$))", "/SelzParam$2");
}
if(pathTask.matches(".*(/759(/|$)).*")){
ext = ".fselz";
pathTask = pathTask.replaceAll("(/759(/|$))", "/Selz$2");
}
if(pathTask.matches(".*(/331(/|$)).*")){
ext = ".selz";
pathTask = pathTask.replaceAll("(/331(/|$))", "/Selz$2");
}
if(pathTask.matches(".*(/335(/|$)).*")){
ext = ".sparam";
pathTask = pathTask.replaceAll("(/335(/|$))", "/SelzParam$2");
}
if(pathTask.matches(".*(/334(/|$)).*")){
ext = ".rbook";
pathTask = pathTask.replaceAll("(/334(/|$))", "/RBook$2");
}
pathTask += ext;
strOut_Code += "<event date=\"" +
Long.toString(curTask.getSubmitdate().getTime().getTime()) +
"\" author=\"";
if(curTask.getSubmitter() != null)
strOut_Code += curTask.getSubmitter().getLogin();
strOut_Code += "\" filename=\"" + pathTask +
"\" action=\"A\" comment=\"\"/>\n";
strOut += Long.toString(curTask.getSubmitdate().getTime().getTime()/1000) + "|";
if(curTask.getSubmitter() != null)
strOut += curTask.getSubmitter().getLogin();
strOut += "|A|" + pathTask + "|\n";
for(SecuredMessageBean curMess : curTask.getMessages())
{
strOut_Code += "<event date=\"" +
Long.toString(curMess.getTime().getTime().getTime()) +
"\" author=\"";
if(curMess.getSubmitter() != null)
strOut_Code += curMess.getSubmitter().getLogin();
strOut_Code += "\" filename=\"" + pathTask +
"\" action=\"M\" comment=\"\"/>\n";
strOut += Long.toString(curMess.getTime().getTime().getTime()/1000) +"|";
if(curMess.getSubmitter() != null)
strOut += curMess.getSubmitter().getLogin();
strOut += "|M|" + pathTask + "|\n";
}
if(curTask.getHandlerUser()!=null){
strOut_Code += "<event date=\"" +
Long.toString(curTask.getSubmitdate().getTime().getTime()) +
"\" author=\"";
strOut_Code += curTask.getHandlerUser().getLogin();
strOut_Code += "\" filename=\"" + pathTask +
"\" action=\"M\" comment=\"\"/>\n";
strOut += Long.toString(curTask.getSubmitdate().getTime().getTime()/1000) + "|";
strOut += curTask.getHandlerUser().getLogin();
strOut += "|M|" + pathTask + "|\n";
}
if(curTask.getHandler()!=null){
strOut_Code += "<event date=\"" +
Long.toString(curTask.getSubmitdate().getTime().getTime()) +
"\" author=\"";
strOut_Code += curTask.getHandler().getLogin();
strOut_Code += "\" filename=\"" + pathTask +
"\" action=\"M\" comment=\"\"/>\n";
strOut += Long.toString(curTask.getSubmitdate().getTime().getTime()/1000) + "|";
strOut += curTask.getHandler().getLogin();
strOut += "|M|" + pathTask + "|\n";
}
if(curTask.getHandlerGroup()!=null){
for(SecuredUserAclBean curAcl : AdapterManager.getInstance().
getSecuredAclAdapterManager().
getGroupUserAclList(sc, curTask.getHandlerGroupId())){
strOut_Code += "<event date=\"" +
Long.toString(curTask.getSubmitdate().getTime().getTime()) +
"\" author=\"";
strOut_Code += curAcl.getToUser().getLogin();
strOut_Code += "\" filename=\"" + pathTask +
"\" action=\"M\" comment=\"\"/>\n";
strOut += Long.toString(curTask.getSubmitdate().getTime().getTime()/1000) + "|";
strOut += curAcl.getToUser().getLogin();
strOut += "|M|" + pathTask + "|\n";
}
}
}
}
try {
FileOutputStream fos = new FileOutputStream("C:/temp/git_g.log");
Writer out = new OutputStreamWriter(fos, "UTF8");
out.write(strOut);
out.close();
FileOutputStream fos = new FileOutputStream("C:/temp/actions.xml");
Writer out = new OutputStreamWriter(fos, "UTF8");
out.write("<?xml version=\"1.0\"?>\n<file_events>" +
strOut_Code +
"</file_events>");
out.close();
} catch (IOException e) {
return e.printStackTrace();
}
return strOut;
}
catch(Exception e)
{
return e.Message;
}
</@std.script>
</#assign>
${listresult}
запускать рекомендую с правами root'а. Я его исполняю из шаблонов но можно и в триггер подложить сделав java файлик если.
если вы посмотрите там еще и код генерации лога для gource или на github, но в gource косячно отрабатывает так как генерируются по дате как попало.
если кто доработает скрипт буду благодарен.
А разработчикам предлагаю включить подобный механизм в TS =) прям чтоб была команда сделать лог для codeswarm или gource =)
