2013-12-19 57 views
2

一個獨特的測試場景我有,我需要能夠讀取Java中的一個給定的Github的項目(公共事業)的目錄結構。換句話說,給定一個GitHub項目url,我的程序應該能夠讀取/src/main/java下的Java文件。讀一GitHub上項目的目錄結構中的Java

選項1:直接從像下面和解析某些令牌URL中讀取HTML是一種選擇,但它太脆而痛苦。

https://github.com/testuser/testproject/tree/master/src/main/java

選項2:下載該項目作爲zip文件和使用Java ZipInputStream來處理它。

https://github.com/testuser/testproject/archive/master.zip

除了這兩個選項,有沒有簡單的解決方案,我很想念?

+0

其他選項:實現一個git客戶端;) – zapl

+2

或使用現有的一個:http://developer.github.com/libraries/ –

+0

感謝。我試圖從[developer.github.com/libraries]提到的庫列表使用[Kohsuke的GitHub的API對於Java(http://github-api.kohsuke.org/index.html)。我能夠連接到公共庫和獲得[GHBranch(http://github-api.kohsuke.org/apidocs/index.html)對象。但是,我找不到任何提示文件/目錄列表的線索。我發送了一封電子郵件給API的作者。 – MFIhsan

回答

1

因爲我無法獲取Java GitHub的圖書館工作,我決定來解析源zip文件得到我想要的東西。

String githubZip = "https://github.com/testuser/testproject/archive/master.zip" 

    ZipInputStream zipInputStream = null 
    def javaFiles = [:] 
    try { 
     zipInputStream = new ZipInputStream(new URL(githubZip).openStream()); 
     ZipEntry zipEntry; 

     while((zipEntry = zipInputStream.getNextEntry())!=null) { 
      if(!zipEntry.isDirectory() && zipEntry.getName().endsWith("java")){ 
       StringWriter stringWriter = new StringWriter() 
       IOUtils.copy(zipInputStream, stringWriter) 
       def fileContent = stringWriter.toString(); 

       javaFiles[zipEntry.getName()] = fileContent 
       stringWriter.close() 
      } 
     } 
    } catch (Exception e){ 
     e.printStackTrace() 
    } finally { 
     zipInputStream.close() 
    } 
0

使用JGit庫克隆庫到你的文件系統,然後遍歷工作目錄以正常的方式 - 因爲它只是一個普通的目錄。

+0

謝謝羅賓。正如Dave Newton所提到的,如果我成功使用develop.github.com/libraries中的一個GitHub Java API,那麼這對我來說是理想的解決方案。我想避免將存儲庫克隆到文件系統,因爲我可能沒有訪問外部構建系統的權限。 – MFIhsan