0

ねえ、そこにいる素晴らしい頭脳、

動作していることがわかったこの Python スクリプトを取得しようとしていますが、それが私だけなのか、元の投稿者がコードを正しく取得していないのかわかりません。mergeこのスクリプトは、競合する 2 つのファイルを取得し、そのうちの 1 つをファイル名に日付スタンプを付けて複製することにより、prefs ファイル内のコマンドを利用することにより、Unison での自動競合解決を有効にすることになっています。元のポーズはここにありますが、へこみがなかったので、ポップアップするエラーを見て手動で実行する必要がありました. 私が今回避できないように見えるエラーは

    File "/bin/unison_merge.py", line 5, in <module>
        PATH, CURRENT1, CURRENT2, NEW = sys.argv[1:]
ValueError: need more than 0 values to unpack

誰かが私を助けてくれることを願っています。

以下のスクリプト全体を含めて、それが役に立ち、他のエラーに気付くことを願っています:)。

#!/usr/bin/env python2.7

import sys, os, datetime, os, filecmp

PATH, CURRENT1, CURRENT2, NEW = sys.argv[1:]

# see http://www.cis.upenn.edu/~bcpierce/unison/download/releases/stable/unison-manual.html#merge

promote_remote = False
backup_file_color = "red"

def is_suffix(a, b): return b[-len(a):] == a

def merge(PATH, CURRENT1, CURRENT2, NEW, promote_remote):
# CURRENT1 is copy of local, CURRENT2 is copy of remote

    if filecmp.cmp(CURRENT1, CURRENT2, shallow = False):
# special case -- files have same contents
# not a real conflict. just use local copy, no backup
        print "merge of identical files"
    os.link(CURRENT1, NEW)
    return

# PATH is relative to unison root.
# We need to know absolute path.
# We get it, assuming CURRENT1 is an absolute path
# referring to a file in the same subdirectory as PATH.

assert CURRENT1[0] == '/', "CURRENT1 (%s) is not absolute path" % CURRENT1

PATH_dir, PATH_tail = os.path.split(PATH)
ABS_dir = os.path.dirname(CURRENT1)

assert is_suffix(PATH_dir, ABS_dir), "%s not suffix of %s!" % (PATH_dir, ABS_dir)

ABS_PATH = os.path.join(ABS_dir, PATH_tail)

timestamp = datetime.datetime.now().strftime("%y%m%d_%H%M")
(root, ext) = os.path.splitext(PATH_tail)
for counter in range(100):
    counter = " %d" % counter if counter else ""
    filename = "%s @%s%s%s" % (root, timestamp, counter, ext)
    BACKUP = os.path.join(ABS_dir, filename)
    if not os.path.exists(BACKUP): break
else:
    assert False, "too many existing backups %s" % BACKUP

# promote_remote = False
# seems to retain file props, saving update in next sync?

    print "CONFLICT:", ABS_PATH

if promote_remote:
# resolve conflict by using remote copy, while backing up local to
    BACKUP
    CURRENT1, CURRENT2 = CURRENT2, CURRENT1
    print "CONFLICT remote saved as", filename
else:
    print "CONFLICT local saved as", filename

assert os.path.isfile(CURRENT1)
assert not os.path.exists(NEW)
assert not os.path.exists(BACKUP)

os.link(CURRENT1, BACKUP)
os.link(CURRENT2, NEW)

if backup_file_color and backup_file_color != 'none':
    mac_color_file(BACKUP, backup_file_color)

# note: coloring the tmp file NEW is useless - not propagated
# coloring the current file ABS_PATH causes UNISON to complain

# chmod -w BACKUP
# os.chmod(BACKUP, stat.S_IRUSR)

# just for coloring file in mac Finder
def mac_color_file(file, color):
    if not os.path.exists("/usr/bin/osascript"): return
color_map = {
"none":0,
"orange":1,
"red":2,
"yellow":3,
"blue":4,
"purple":5,
"green":6,
"gray":7,
}
assert color in color_map
assert file[0] == '/', 'absolute path required'
assert os.path.exists(file)
#see http://stackoverflow.com/questions/2435580/tagging-files-with-colors-in-os-x-finder-from-shell-scripts
#osascript -e "tell application \"Finder\" to set label index of alias POSIX
file ("$filename\" to $label")
cmd = '''/usr/bin/osascript -e 'tell application "Finder" to set label index of alias POSIX file "%s" to %d' > /dev/null ''' % (file, color_map[color])
try:
    retcode = subprocess.call(cmd, shell=True)
    if retcode < 0:
        print >>sys.stderr, "mac_color_file child was terminated by signal", retcode
    elif retcode > 0:
        print >>sys.stderr, "mac_color_file child returned", retcode
except OSError, e:
    print >>sys.stderr, "mac_color_file child failed:", e

### main ###

merge(PATH, CURRENT1, CURRENT2, NEW, promote_remote)
4

3 に答える 3

0

これが現在のスクリプトです。ユニゾンのドキュメントで説明されているように、4つの引数で呼び出されることを想定していることに注意してください。トリガーするには、次のような行をunison.prfファイルに追加します。

merge = Name * -> /Users/neal/Bin/daemons/unison_merge.py 'PATH' CURRENT1 CURRENT2 NEW

バグを一斉に回避するには、一重引用符が必要です(必要でしたか?)。

スクリプトは次のとおりです。

#!/usr/bin/env python2.7

# see http://www.cis.upenn.edu/~bcpierce/unison/download/releases/stable/unison-manual.html#merge

import sys, os, datetime, os, stat, subprocess, filecmp

# log = open("/Users/neal/unison_merge.log", "a")
# sys.stdout = log
# sys.stderr = log

# work around bug in unison adds quotes incorrectly
# something to do with blanks in filenames

def clean(x):
    if len(x) < 3: return x
    if x[0] == "'": x = x[1:]
    if x[-1] == "'": x = x[:-1]
    return x

sys.argv = [clean(x) for x in sys.argv]

try:
    PATH, CURRENT1, CURRENT2, NEW = sys.argv[1:]
except:
    print "usage: ", " ".join("[%s]" % x for x in sys.argv)
    raise

backup_file_color = 'red'  # for mac
promote_remote = False

def is_suffix(a, b): return b[-len(a):] == a

def mac_color_file(file, color):
    if not os.path.exists("/usr/bin/osascript"): return
    color_map = {
        "none":0,
        "orange":1,
        "red":2,
        "yellow":3,
        "blue":4,
        "purple":5,
        "green":6,
        "gray":7,
        }
    assert color in color_map
    assert file[0] == '/', 'absolute path required'
    assert os.path.exists(file)
    #see http://stackoverflow.com/questions/2435580/tagging-files-with-colors-in-os-x-finder-from-shell-scripts
    #osascript -e "tell application \"Finder\" to set label index of alias POSIX file \"$filename\" to $label"
    cmd = '''/usr/bin/osascript -e 'tell application "Finder" to set label index of alias POSIX file "%s" to %d' > /dev/null ''' % (file, color_map[color])
    try:
        retcode = subprocess.call(cmd, shell=True)
        if retcode < 0:
            print >>sys.stderr, "mac_color_file child was terminated by signal", -retcode
        elif retcode > 0:
            print >>sys.stderr, "mac_color_file child returned", retcode
    except OSError, e:
        print >>sys.stderr, "mac_color_file child failed:", e

def merge(PATH, CURRENT1, CURRENT2, NEW, promote_remote):
    # CURRENT1 is copy of local, CURRENT2 is copy of remote

    # PATH is relative to unison root.
    # We need to know absolute path.
    # We get it, assuming CURRENT1 is an absolute path
    # referring to a file in the same subdirectory as PATH.

    if filecmp.cmp(CURRENT1, CURRENT2, shallow = False):
        # special case -- files have same contents
        # not a real conflict.  just use local copy, no backup
        print "merge of identical files"
        os.link(CURRENT1, NEW)
        return

    assert CURRENT1[0] == '/', "CURRENT1 (%s) is not absolute path" % CURRENT1

    PATH_dir, PATH_tail = os.path.split(PATH)
    ABS_dir = os.path.dirname(CURRENT1)

    assert is_suffix(PATH_dir, ABS_dir), "%s not suffix of %s!" % (PATH_dir, ABS_dir)

    ABS_PATH = os.path.join(ABS_dir, PATH_tail)

    timestamp = datetime.datetime.now().strftime("%y%m%d_%H%M")
    (root, ext) = os.path.splitext(PATH_tail)
    for counter in range(100):
        counter = " %d" % counter if counter else ""
        filename = "%s @%s%s%s" % (root, timestamp, counter, ext)
        BACKUP = os.path.join(ABS_dir, filename)
        if not os.path.exists(BACKUP): break
    else:
        assert False, "too many existing backups %s" % BACKUP

    # promote_remote = False
    # seems to retain file props, saving update in next sync?

    print "CONFLICT:", ABS_PATH

    if promote_remote:
        # resolve conflict by using remote copy, while backing up local to BACKUP
        CURRENT1, CURRENT2 = CURRENT2, CURRENT1
        print "CONFLICT remote saved as", filename
    else:
        print "CONFLICT local saved as", filename

    assert os.path.isfile(CURRENT1)
    assert not os.path.exists(NEW)
    assert not os.path.exists(BACKUP)

    os.link(CURRENT1, BACKUP)
    os.link(CURRENT2, NEW)

    if backup_file_color and backup_file_color != 'none':
        mac_color_file(BACKUP, backup_file_color)

    # note: coloring the tmp file NEW is useless - not propagated
    # coloring the current file ABS_PATH causes UNISON to complain

    # chmod -w BACKUP
    # os.chmod(BACKUP, stat.S_IRUSR)

### main ###

try:
    merge(PATH, CURRENT1, CURRENT2, NEW, promote_remote)
except Exception as e:
    print >>sys.stderr, "ERROR in unison_merge.py"
    print >>sys.stderr, "ERROR:", str(e)
于 2012-06-28T21:02:37.070 に答える
0

ブロックには付随するtryがありませんexcept

このチュートリアルページでは、try..except構造の使用法を明確にしています:http: //docs.python.org/tutorial/errors.html#handling-exceptions

于 2012-06-21T05:08:00.843 に答える
0

これは中途半端な試みです。

インデントが本当にずれていて、プログラムが何をしようとしているのかわかりません。

キックオフされる単一の大きな機能があることを願っています。

コマンド ラインからプログラムを実行するには、コマンド ライン引数を指定する必要があります。

python test.py x y c v 

この場合:

PATH, CURRENT1, CURRENT2, NEW  = 'x', 'y', 'c', 'z'

プログラム

#!/usr/bin/env python2.7

import sys, os, datetime, os, filecmp

print sys.argv
PATH, CURRENT1, CURRENT2, NEW = sys.argv[1:]

# see http://www.cis.upenn.edu/~bcpierce/unison/download/releases/stable/unison-manual.html#merge

promote_remote = False
backup_file_color = "red"

def is_suffix(a, b): 
    return b[-len(a):] == a

def merge(PATH, CURRENT1, CURRENT2, NEW, promote_remote):
    # CURRENT1 is copy of local, CURRENT2 is copy of remote

    if filecmp.cmp(CURRENT1, CURRENT2, shallow = False):
    # special case -- files have same contents
    # not a real conflict. just use local copy, no backup
        print "merge of identical files"
        os.link(CURRENT1, NEW)
        return

    # PATH is relative to unison root.
    # We need to know absolute path.
    # We get it, assuming CURRENT1 is an absolute path
    # referring to a file in the same subdirectory as PATH.

    assert CURRENT1[0] == '/', "CURRENT1 (%s) is not absolute path" % CURRENT1

    PATH_dir, PATH_tail = os.path.split(PATH)
    ABS_dir = os.path.dirname(CURRENT1)

    assert is_suffix(PATH_dir, ABS_dir), "%s not suffix of %s!" % (PATH_dir, ABS_dir)

    ABS_PATH = os.path.join(ABS_dir, PATH_tail)

    timestamp = datetime.datetime.now().strftime("%y%m%d_%H%M")
    (root, ext) = os.path.splitext(PATH_tail)
    for counter in range(100):
        counter = " %d" % counter if counter else ""
        filename = "%s @%s%s%s" % (root, timestamp, counter, ext)
        BACKUP = os.path.join(ABS_dir, filename)
        if not os.path.exists(BACKUP): 
            break
        else:
            assert False, "too many existing backups %s" % BACKUP

    # promote_remote = False
    # seems to retain file props, saving update in next sync?

    print "CONFLICT:", ABS_PATH

    if promote_remote:
        # resolve conflict by using remote copy, while backing up local to BACKUP
        CURRENT1, CURRENT2 = CURRENT2, CURRENT1
        print "CONFLICT remote saved as", filename
    else:
        print "CONFLICT local saved as", filename

    assert os.path.isfile(CURRENT1)
    assert not os.path.exists(NEW)
    assert not os.path.exists(BACKUP)

    os.link(CURRENT1, BACKUP)
    os.link(CURRENT2, NEW)

    if backup_file_color and backup_file_color != 'none':
        mac_color_file(BACKUP, backup_file_color)

    # note: coloring the tmp file NEW is useless - not propagated
    # coloring the current file ABS_PATH causes UNISON to complain

    # chmod -w BACKUP
    # os.chmod(BACKUP, stat.S_IRUSR)

    # just for coloring file in mac Finder
    def mac_color_file(file, color):
        if not os.path.exists("/usr/bin/osascript"): 
        return

    color_map = {
    "none":0,
    "orange":1,
    "red":2,
    "yellow":3,
    "blue":4,
    "purple":5,
    "green":6,
    "gray":7,
    }

    assert color in color_map
    assert file[0] == '/', 'absolute path required'
    assert os.path.exists(file)
    #see http://stackoverflow.com/questions/2435580/tagging-files-with-colors-in-os-x-finder-from-shell-scripts
    #osascript -e "tell application \"Finder\" to set label index of alias POSIX
    file ("$filename\" to $label")
    cmd = '''/usr/bin/osascript -e 'tell application "Finder" to set label index of alias POSIX file "%s" to %d' > /dev/null ''' % (file, color_map[color])

    try:
        retcode = subprocess.call(cmd, shell=True)
        if retcode < 0:
            print >>sys.stderr, "mac_color_file child was terminated by signal", retcode
        elif retcode > 0:
            print >>sys.stderr, "mac_color_file child returned", retcode
    except:
        pass

if __file__ == '__main__':
    merge(PATH, CURRENT1, CURRENT2, NEW, promote_remote)
于 2012-06-21T05:11:51.607 に答える