로컬 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())
Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.
follow me
  • 결정 한번 전광석화네 https://t.co/nujVeCRdMT
    11 hours ago
  • 싸이월드 법인가 뭔가 화제였는데 이런 게 훨씬 현실적인 접근이다 https://t.co/fSB9LiMYzO
    1 day ago
  • 시장을 좋게 보는 사람을 좋게 볼 근거를 찾고 그렇지 않은 사람은 나쁘게 볼 근거만 열심히 찾네. 그 반대로 해야 얻는 게 있을텐데
    1 day ago
Buy me a coffeeBuy me a coffee
×
Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.
Latest Posts