0

嘿,聪明的头脑,

我正在尝试获取这个我发现工作的 Python 脚本,但不知道是我自己还是原始发帖人没有正确获取代码。该脚本应该通过使用 prefs 文件中的命令来启用 Unison 中的自动冲突解决,方法是merge获取两个冲突的文件并使用文件名中的日期戳复制其中一个。原来的姿势在这里,但没有任何缩进,所以我不得不通过观察弹出的错误来手动完成。我现在似乎无法解决的错误是

    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

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 回答
0

这是当前脚本。请注意,它期望使用一致文档中描述的四个参数来调用。要触发它,请在您的 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 回答