로컬 SVN 저장소 복구용 스크립트

  • Post author:
  • Post category:
  • Post comments:8 Comments
  • Post last modified:November 21, 2013

로컬 SVN 저장소가 맛이 갔다. Update를 하려면 우선 CleanUp부터 하라고 하고, CleanUp부터 하려면 Lock부터 풀라고 한다. Lock을 풀려니 무슨 이유에선지 안 되더라. 이런 경우를 처음 당하는 게 아니라서 이전처럼 대처했다. trunk/.svn/tmp 폴더를 svn.exe가 붙잡고 있는지 확인했더니 역시나!

Unlocker로 락을 풀어줬다. 그러나 여전히 CleanUp 실패! 어라, 이런 적이 없었는데…

딱히 이유를 모르겠기에 .svn 폴더를 뒤적거리니 lock이란 파일이 있었다. 혹시 이것 때문인가?하는 생각에 지워봤더니 CleanUp이 되더라. 하여 모든 .svn/lock 파일을 지우려 했으나 수백 개의 폴더를 뒤지자니 환장할 노릇! 그래서 오랜만에 파이썬 스크립트를 짰다.

어쨌거나 문제는 해결했다.

#!C:\\Python25\python.exe
# -*- coding: utf-8 -*-

import sys
import getopt
import os
import win32api


#시작

def find_svn_dirs(target_dir):
     # This attempts to remove _all_ sub directories from a directory.
     # Use with caution on directories that store temporary information.
    dirs_found = []
    for root, dirs, files in os.walk(target_dir, topdown=False):
        for dir_name in dirs:
            if dir_name == ".svn" or dir_name == "_svn":
                full_dir_name = os.path.join(root, dir_name)
                dirs_found.append( full_dir_name )
    return dirs_found

def remove_certain_files(target_dir, target_filenames):
    # This attempts to remove _all_ files from a directory.
    # Use with caution on directories that store temporary files.

    for root, dirs, files in os.walk(target_dir):
        for f in files:
            if f in target_filenames:
                print os.path.join(root, f)
                try:
                    # Make attributes normal so file can be deleted.
                    win32api.SetFileAttributes(os.path.join(root, f),
                    win32con.FILE_ATTRIBUTE_NORMAL)
                except:
                    pass

                try:
                    # Try to delete the file.
                    os.unlink(os.path.join(root, f))
                except:
                    pass


class Usage(Exception):
    def __init__(self, msg):
        self.msg = msg

def main(argv=None):
    if argv is None:
        argv = sys.argv
    try:
        try:
            opts, args = getopt.getopt(argv[1:], "h", ["help"])
        except getopt.error, msg:
             raise Usage(msg)

        # more code, unchanged
        # findSvnDirectories
        target_dir = argv[1]
        svn_dirs = find_svn_dirs(target_dir)

        for svn_dir in svn_dirs:
            remove_certain_files(svn_dir, ['lock'])


    except Usage, err:
        print <<sys.stderr, err.msg
        print <<sys.stderr, "for help use --help"
        return 2

if __name__ == "__main__":
    sys.exit(main())
Author Details
Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.
0 0 votes
Article Rating
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

8 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
하얀말
15 years ago

UNIX의 find가 Windows에 없어서 불편한 경우가 좀 있죠. 전 그냥 dir /s 씁니다. 지우는 건 del

/s 쓰고요

최재훈
15 years ago

이 경우엔 dir /s 쓰기가 곤란하지 않나요? 로컬 저장소 중 .svn 폴더에 있는 lock이란 이름을 가진 파일만 지워야 하는데, dir 로는 세세히 설정하기 힘드니까요.

윈도우는 PowerShell 아니면, Python 을 스크립트 언어로 써야 할 듯 한데, 아직 어느 쪽으로 가야할지 모르겠습니다. 고민 중이예요. ㅎㅎ

hey
hey
15 years ago

저같으면 탐색기 검색을 이용하겠어요. 사이즈 0에 이름 검색만 하면 되지 않을까요? 검색한 다음에 바로 지울 수도 있구요.

최재훈
15 years ago

듣고 보니 그런 방법이 있었군요.

daybreaker
15 years ago

아무래도 이런 용도로 파이썬이 참 편하죠. ㅎㅎ 단순히 파일 이름으로 찾는 정도가 아니라 내부에 특정 문자열을 정규표현식 매칭하려고 한다든가 이럴 때도 그렇고.. 그러고보니 언제 한 번 이런 일만 해주는 라이브러리를 하나 간단하게 짜봐야겠군요.

최재훈
15 years ago

PowerShell은 닷넷 코드를 쓸 수 있어서 윈도우에선 오히려 파이썬보다 나을지 몰라요. 둘 다 익히긴 솔직히 시간이 부족하고(다른 것도 해야 하니), 하나만 제대로 파볼까 싶은데 고민이네요.

daybreaker
15 years ago

그래서 나온 게 IronPython이라는 게 있죠; 닷넷프레임웍 위에서 Python이 돕니다. 기존 파이썬 라이브러리도 거의 그대로 사용할 수 있구요.;;

Mono 같은 데서도 돌아가기 때문에 다른 플랫폼으로 이식하는 것도 어느 정도 보장되지요.

최재훈
15 years ago

맞아요. IronPython은 비주얼 스튜디오 2008과 연동이 되기 때문에 윈도우 개발자에겐 나름 편리하죠.

흠. 괜찮은 생각 같네요.