pysvn Thumbs.db 일괄 삭제

Posted at 2009/04/16 21:04// Posted in python/pysvn
윈도우는 숨김 파일을 보여주지 않기 대문에
많은 아티스트 분들이 Thumbs.db 를 svn 에 넣는 경우가 있습니다.

SVN 프로퍼티중 svn:ignore 를 사용해서
Thumb.db 를 완전히 무시해버리는 것이 좋지만
이미 등록되어 있는 경우에는 문제가 됩니다

일일이 지워주기는 역시나 귀찮으므로 스크립트로 돌리는 것이 좋습니다.


import os
import pysvn

c = pysvn.Client()
for base, dirs, files in os.walk("."):
if ".svn" in dirs:
dirs.remove(".svn")

for fileName in files:
if fileName.lower() == "thumbs.db":
filePath = os.sep.join((base, fileName.encode("mbcs")))
print filePath
c.remove(filePath.decode("mbcs"))


원천적으로 한글 이름이 없어야 하지만
한글 이름이 있는 경우도 있더군요. 이럴 경우 에러가 발생하면 삭제가 중단되므로
mbcs 로 변환해서 처리해주는 코드도 들어 있습니다.

이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/04/16 21:04 2009/04/16 21:04
Tag , ,

pysvn 폴더 단위 커밋

Posted at 2009/04/16 20:52// Posted in python/pysvn
svn 은 대용량 바이너리 데이터를 업데이트 하면 급격히 느려지는 현상이 발생합니다.
그래픽 데이터들은 용량에 크기 때문에 커밋을 할때 주의해야하죠.

가장 좋은 방법은 최대한 작은 단위로 커밋하는건데
직접 하기에는 매우 귀찮으므로 아래와 같은 파이썬 스크립트를 만들어 보았습니다.


import os
import pysvn

dirPaths = []
for base, dirs, files in os.walk("."):
if ".svn" in dirs:
dirs.remove(".svn")

for dir in dirs:
dirPaths.append(os.sep.join((base, dir)))

dirPaths.sort()

c = pysvn.Client()
for dirPath in dirPaths:
print "commit:", dirPath
c.checkin([dirPath], "commit %s" % (dirPath), recurse=False)

이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/04/16 20:52 2009/04/16 20:52
Tag , ,
pysvn 에서 출력되는 메시지가 utf8 형식이므로
euckr 프로그램 내부에서 돌릴 경우 제대로된 메시지 확인이 어렵습니다.

쉽게 생각할 수 있는 해결 방법 중 하나는 pysvn 함수를 호출하기 전에
stdout 과 stderr 을 보관했다가 호출이 완료되면 복구하는 것인데...
자칫하면 개노가다 코딩이 되기 쉽습니다.

이런 경우에 사용하는 방법이 데코레이터입니다.


import sys

class SVN_Translator:
def __init__(self, out):
self.out = out

def write(self, msg):
self.out.write(msg.decode("utf8").encode("mbcs"))


def SVN_Translate(func):
def call(*args, **kwargs):
oldout = sys.stdout
olderr = sys.stderr
sys.stdout = SVN_Translator(oldout)
sys.stderr = SVN_Translator(olderr)
try:
ret = func(*args, **kwargs)
except:
raise
finally:
sys.stdout = oldout
sys.stderr = olderr
return ret
return call


위처럼 작성한 다음 앞으로 사용하려는 함수 위에 @SVN_Translate 라고 적어주면 끝입니다.


import pysvn

@SVN_Translate
def SVN_Update(path):
client = pysvn.Client()
updateResults = client.update(path)
if updateResults:
updateResult = updateResults[0]
return updateResult.number

print "현재 리비전은 %d입니다" % (SVN_Update("."))


~(-_-)~ 짠

자동 락 걸어주거나 할때도 유용한 방법입니다.
이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/02/04 22:42 2009/02/04 22:42
pysvn 을 처음 설치하고 제일 단순한 업데이트 코드를 돌리면 다음과 같은 에러가 발생합니다


import pysvn
c = pysvn.Client()
c.update(".")


결과
Traceback (most recent call last):
  File "D:\builder\main.py", line 17, in <module>
    c.update(".")
pysvn._pysvn_2_5.ClientError: Can't create tunnel: 吏€?뺣맂 ?뚯씪??李얠쓣 ???놁뒿?덈떎.

이런 결과가 나오는 이유는 출력문이 utf8 이기 때문입니다 (-_-);

유닉스 계열에서는 이미 utf8 이 천하를 통일했지만
윈도우 계열에서는 아직 mbcs 한글로 이야기하면 cp949 가 디폴트 인코딩인 상태입니다.

그러므로 제대로 된 문자열을 보기 위해서는 번역기를 하나 달아줘야 합니다.


import sys
import pysvn

class Translator:
def __init__(self, out):
self.out = out

def write(self, msg):
self.out.write(msg.decode("utf8").encode("mbcs"))

console = sys.stdout
sys.stdout = Translator(console)
sys.stderr = Translator(console)

c = pysvn.Client()
c.update(".")


결과
  File "D:\builder\main.py", line 16, in <module>
    c.update(".")
pysvn._pysvn_2_5.ClientError: Can't create tunnel: 지정된 파일을 찾을 수 없습니다.

자-_- 그럼 이제 이글의 핵심문제인 터널을 만들 수 없다는 걸 해결해봅시다.

pysvn 은 ssh+svn 프로토콜로 통신을 할때 ssh.exe 를 필요로 합니다.

유닉스계열에서는 ssh 가 기본으로 설치되어있지만, 윈도우에서는 그렇지 않습니다.

음 그럼 어떻게 해야 할까요 (-_-)?

pysvn 은 TortoiseSVN 에서 나온 제품입니다.

TortoiseSVN 을 보면 TortoisePlink.exe 란 프로그램이 있는데

이것이 바로 ssh 프로그램입니다.

이 파일을 하나 복사해서 ssh.exe 로 이름을 변경한후 c:\windows 에 복사해두면

위의 스크립트는 아름답게 실행되게 됩니다 ~(-_-)~



이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/02/04 22:14 2009/02/04 22:14

pysvn/재귀적으로 vssver.scc 파일 지우기

Posted at 2008/07/29 15:13// Posted in python/pysvn
import os
import pysvn

c = pysvn.Client()
for root, dirs, files in os.walk("."):
    dirs.remove(".svn")

    for fileName in files:
        if fileName == "vssver.scc":
            filePath = os.sep.join((root, fileName))
            print filePath
            c.remove(filePath)
이올린에 북마크하기(0) 이올린에 추천하기(0)
2008/07/29 15:13 2008/07/29 15:13
Tag
from pysvn import Client
from os import access
from os import R_OK
from os import walk
from os import sep

KEY = "paladin"
OLD_FOLDER = "fighter"
NEW_FOLDER = "fighter2p"

c = Client()
for root, dirs, files in walk(OLD_FOLDER):
    dirs.remove(".svn")
    for fileName in files:
        if KEY in fileName:
            oldName = sep.join((root, fileName))

            newRoot = root.replace(OLD_FOLDER, NEW_FOLDER)
            newName = sep.join((newRoot, fileName))
            c.move(oldName, newName)

이올린에 북마크하기(0) 이올린에 추천하기(0)
2008/06/24 16:15 2008/06/24 16:15
Tag ,

pysvn/monster 폴더를 npc 폴더로 바꾸기

Posted at 2008/06/04 22:28// Posted in python/pysvn
from pysvn import Client
from os import access
from os import R_OK
from os import walk
from os import sep

c = Client()
if access("monster", R_OK) and not access("npc", R_OK):
    c.move("monster", "npc")

for root, dirs, files in walk("npc"):
    dirs.remove(".svn")
    for fileName in files:
        if "monster" in fileName:
            oldName = sep.join((root, fileName))
            newName = sep.join((root, fileName.replace("monster", "npc")))
            c.move(oldName, newName)
이올린에 북마크하기(0) 이올린에 추천하기(0)
2008/06/04 22:28 2008/06/04 22:28
Tag ,

pysvn/특정 명칭이 들어간 폴더 지우기

Posted at 2008/05/15 14:05// Posted in python/pysvn
import os
import pysvn

client = pysvn.Client()
for root, dirs, files in os.walk("."):
    if ".svn" in dirs:
        dirs.remove(".svn")

    for dir in dirs:
        if dir == "monster":
            path = os.sep.join((root, dir))
            print path
            client.remove(path)

폴더 이름이 "monster" 인 폴더를 찾아 삭제합니다.
( commit 을 해야 실제 삭제 됩니다 )
이올린에 북마크하기(0) 이올린에 추천하기(0)
2008/05/15 14:05 2008/05/15 14:05
Tag