ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [스프링] svn 히스토리 조회 기능 만들기 (+엑셀출력)
    Web/Spring boot 2020. 6. 4. 17:04

    svn의 commit기록들이 보기 힘들어 SVN의 API를 이용해 스프링에서 엑셀로 출력하는 기능을 만들었다.

     

    내가 필요했던 기능

    1. 특정일 이후의 커밋 파일 경로 목록

    2. 삭제, 추가, 변경인지의 상태코드

    3. 엑셀로 출력

     

    그래서 아래 코드로 작성했지만, 만약 일자 시간별로 출력을 하고 싶다면 위의 API링크소스를 복붙한 후 url, name, password를 수정하고 실행하면 된다.

    그럼 일자별로(하루에 3번 커밋했다면 해당기록도 나옴) 출력될 것이다.

     

    1. pom.xml poi와 svn을 사용하기 위한 dependency를 추가한다.

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.17</version>
    </dependency>
    <dependency>
        <groupId>org.tmatesoft.svnkit</groupId>
        <artifactId>svnkit</artifactId>
        <version>1.8.5</version>
    </dependency>

     

    2. 아래 소스코드를 복붙한다. 엑셀로 저장한다.

    
    		// https://wiki.svnkit.com/Printing_Out_Repository_History 참고
    		DAVRepositoryFactory.setup();
    
    		String url = "URL";
    		String name = "아이디";
    		String password = "비번";
    		setupLibrary();
    
    		long startRevision = 2803; // 시작할commit번호
    		long endRevision = -1; // HEAD (the latest) revision
    
    		SVNRepository repository = null;
    		try {
    			repository = SVNRepositoryFactory.create(SVNURL.parseURIEncoded(url));
    
    		} catch (SVNException svne) {
    			System.err.println(
    					"error while creating an SVNRepository for the location '" + url + "': " + svne.getMessage());
    			System.exit(1);
    		}
    
    		ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(name, password);
    		repository.setAuthenticationManager(authManager);
    
    		try {
    			endRevision = repository.getLatestRevision();
    		} catch (SVNException svne) {
    			System.err.println("error while fetching the latest repository revision: " + svne.getMessage());
    			System.exit(1);
    		}
    
    		Collection logEntries = null;
    		try {
    			logEntries = repository.log(new String[] { "" }, null, startRevision, endRevision, true, true);
    
    		} catch (SVNException svne) {
    			System.out.println("error while collecting log information for '" + url + "': " + svne.getMessage());
    			System.exit(1);
    		}
    		Map<String, String> map = new HashMap<String, String>();
    
    		for (Iterator entries = logEntries.iterator(); entries.hasNext();) {
    			SVNLogEntry logEntry = (SVNLogEntry) entries.next();
    
    //					System.out.println("---------------------------------------------");
    //					System.out.println("revision: " + logEntry.getRevision());
    //					SimpleDateFormat formatter = new SimpleDateFormat("yyyy년MM월dd (E) HH:mm:ss", Locale.KOREA);
    //					System.out.println("date: " + formatter.format(logEntry.getDate()));
    
    			if (logEntry.getChangedPaths().size() > 0) {
    				Set changedPathsSet = logEntry.getChangedPaths().keySet();
    
    				for (Iterator changedPaths = changedPathsSet.iterator(); changedPaths.hasNext();) {
    					SVNLogEntryPath entryPath = (SVNLogEntryPath) logEntry.getChangedPaths().get(changedPaths.next());
    
    					if (entryPath.getPath().startsWith("/a") || entryPath.getPath().startsWith("/b")) { // a와 b경로로 시작하는곳만
    
    						map.put(String.valueOf(entryPath.getPath()), String.valueOf(entryPath.getType()));
    
    					}
    //							System.out.println(" " + entryPath.getType() + "	" + entryPath.getPath()
    //							+ ((entryPath.getCopyPath() != null) ? " (from " + entryPath.getCopyPath() + " revision "
    //									+ entryPath.getCopyRevision() + ")" : ""));
    				}
    			}
    		}
    
    		StringBuilder str = new StringBuilder(); // 화면에 출력할 용도
    		List<Map<String, String>> list = new ArrayList<Map<String, String>>();
    
    		for (String k : map.keySet()) {
    			Map<String, String> m = new HashMap<String, String>();
    			System.out.println(String.format("path : %s	, type : %s", k, map.get(k)));
    			m.put(k, map.get(k));
    			list.add(m);
    			str.append(String.format("path : %s	, type : %s \r\n", k, map.get(k)));
    		}
    
    		// 엑셀 생성하기 ~
    		Workbook wb = new HSSFWorkbook();
    		Sheet sheet = wb.createSheet("x월 이후 변경된 API목록");
    
    		Row row = null;
    		Cell cell = null;
    		int rowNo = 0;
    
    		CellStyle headStyle = wb.createCellStyle();
    
    		headStyle.setBorderTop(BorderStyle.THIN);
    		headStyle.setBorderBottom(BorderStyle.THIN);
    		headStyle.setBorderLeft(BorderStyle.THIN);
    		headStyle.setBorderRight(BorderStyle.THIN);
    
    		headStyle.setFillForegroundColor(HSSFColorPredefined.YELLOW.getIndex());
    		headStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
    
    		headStyle.setAlignment(HorizontalAlignment.CENTER);
    
    		CellStyle bodyStyle = wb.createCellStyle();
    		bodyStyle.setBorderTop(BorderStyle.THIN);
    		bodyStyle.setBorderBottom(BorderStyle.THIN);
    		bodyStyle.setBorderLeft(BorderStyle.THIN);
    		bodyStyle.setBorderRight(BorderStyle.THIN);
    
    		row = sheet.createRow(rowNo++);
    		cell = row.createCell(0);
    		cell.setCellStyle(headStyle);
    		cell.setCellValue("순번");
    		cell = row.createCell(1);
    		cell.setCellStyle(headStyle);
    		cell.setCellValue("변경된 경로");
    		cell = row.createCell(2);
    		cell.setCellStyle(headStyle);
    		cell.setCellValue("A: 추가, M: 수정, D: 삭제");
    
    		int cnt = 1;
    		for (Map<String, String> m : list) {
    			for (Map.Entry<String, String> entry : m.entrySet()) {
    				String key = entry.getKey();
    				String value = entry.getValue();
    				row = sheet.createRow(rowNo++);
    				cell = row.createCell(0);
    				cell.setCellStyle(bodyStyle);
    				cell.setCellValue(cnt++);
    				cell = row.createCell(1);
    				cell.setCellStyle(bodyStyle);
    				cell.setCellValue(key);
    				cell = row.createCell(2);
    				cell.setCellStyle(bodyStyle);
    				cell.setCellValue(value);
    			}
    		}
    
    		// 컨텐츠 타입과 파일명 지정
    		response.setContentType("ms-vnd/excel");
    		response.setHeader("Content-Disposition", "attachment;filename=test.xls");
    
    		// 엑셀 출력
    		wb.write(response.getOutputStream());
    		wb.close();
    
    		return String.valueOf(str);
    	

     

    도움되셨다면 좋아요클릭

    반응형

    댓글

Designed by Tistory.