From 4fab55bd4d387a2266c0d72411a4cba6423ebcb4 Mon Sep 17 00:00:00 2001 From: "Y.Chen" Date: Mon, 1 Sep 2014 15:58:48 +0800 Subject: [PATCH 1/3] change git log order type to '--topo-order',make sure change list order is correct. --- checkin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/checkin.py b/checkin.py index 1c27f15..b5dc6bc 100644 --- a/checkin.py +++ b/checkin.py @@ -29,7 +29,7 @@ def main(force=False, no_deliver=False, initial=False, all=False, cclabel=''): if force: IGNORE_CONFLICTS=True cc_exec(['update', '.'], errors=False) - log = ['log', '-z', '--reverse', '--pretty=format:'+ LOG_FORMAT ] + log = ['log', '-z', '--reverse', '--topo-order', '--pretty=format:'+ LOG_FORMAT ] if not all: log.append('--first-parent') if not initial: From 5c5e8d51306e52cae5d2e4031c36c2faccf1cbf7 Mon Sep 17 00:00:00 2001 From: "Y.Chen" Date: Mon, 1 Sep 2014 16:07:08 +0800 Subject: [PATCH 2/3] modify status "Rename", not check in file in new place. add a new status "RenameModify", if the file not modified when rename, use "Rename".it modified, use "RenameModify" --- checkin.py | 24 ++++++++++++++++++++++-- status.py | 12 ++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/checkin.py b/checkin.py index b5dc6bc..72b1ee4 100644 --- a/checkin.py +++ b/checkin.py @@ -2,7 +2,7 @@ from common import * from clearcase import cc -from status import Modify, Add, Delete, Rename, SymLink +from status import Modify, Add, Delete, Rename, RenameModify, SymLink import filecmp from os import listdir from os.path import isdir @@ -50,6 +50,8 @@ def main(force=False, no_deliver=False, initial=False, all=False, cclabel=''): reset.main('HEAD') def getStatuses(id, initial): + modifylist = None + cmd = ['diff','--name-status', '-M', '-z', '--ignore-submodules', '%s^..%s' % (id, id)] if initial: cmd = cmd[:-1] @@ -58,7 +60,7 @@ def getStatuses(id, initial): status = git_exec(cmd) status = status.strip() status = status.strip("\x00") - types = {'M':Modify, 'R':Rename, 'D':Delete, 'A':Add, 'C':Add, 'S':SymLink} + types = {'M':Modify, 'R':Rename, 'RM': RenameModify, 'D':Delete, 'A':Add, 'C':Add, 'S':SymLink} list = [] split = status.split('\x00') while len(split) > 1: @@ -71,6 +73,10 @@ def getStatuses(id, initial): args.append(id) if char == 'R': args.append(split.pop(0)) + if (modifylist == None): + modifylist = getFileModifyInfo(id) + if (args[1] in modifylist): + char = "RM" elif char == 'C': args = [split.pop(0)] if args[0] == cache.FILE: @@ -80,6 +86,20 @@ def getStatuses(id, initial): list.append(type) return list +def getFileModifyInfo(id): + modifyFileList = [] + cmd = ['diff', '--numstat', "-M", '--diff-filter=R', '-z', '--ignore-submodules', '%s^..%s' % (id, id)] + status = git_exec(cmd) + split = status.split('\x00') + while len(split) > 3: + changes = split.pop(0).split() + oldname = split.pop(0) + newname = split.pop(0) + if int(changes[0]) != 0 or int(changes[1]) != 0: + modifyFileList.append(newname) + return modifyFileList + + def checkout(stats, comment, initial): """Poor mans two-phase commit""" transaction = ITransaction(comment) if initial else Transaction(comment) diff --git a/status.py b/status.py index 795829c..2ffaa7a 100644 --- a/status.py +++ b/status.py @@ -51,6 +51,18 @@ def commit(self, t): cc_exec(['rm', self.file]) class Rename(Status): + def __init__(self, files): + self.old = files[0] + self.new = files[1] + self.setFile(self.new) + def stage(self, t): + t.stageDir(dirname(self.old)) + self.stageDirs(t) + def commit(self, t): + self.commitDirs(t) + cc_exec(['mv', '-nc', self.old, self.new]) + +class RenameModify(Rename): def __init__(self, files): self.old = files[0] self.new = files[1] From 1fddecd17fd3363a8eda1c6b8588f5a1e98ed1f0 Mon Sep 17 00:00:00 2001 From: c00247997 Date: Tue, 9 Sep 2014 10:13:56 +0800 Subject: [PATCH 3/3] R100 means the file only rename or move, less than 100 means the file modified. --- checkin.py | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/checkin.py b/checkin.py index 72b1ee4..8b85c38 100644 --- a/checkin.py +++ b/checkin.py @@ -64,7 +64,8 @@ def getStatuses(id, initial): list = [] split = status.split('\x00') while len(split) > 1: - char = split.pop(0)[0] # first char + statusstr = split.pop(0) + char = statusstr[0] # first char args = [split.pop(0)] # check if file is really a symlink cmd = ['ls-tree', '-z', id, '--', args[0]] @@ -73,9 +74,7 @@ def getStatuses(id, initial): args.append(id) if char == 'R': args.append(split.pop(0)) - if (modifylist == None): - modifylist = getFileModifyInfo(id) - if (args[1] in modifylist): + if (statusstr[1:] != "100"): char = "RM" elif char == 'C': args = [split.pop(0)] @@ -86,19 +85,6 @@ def getStatuses(id, initial): list.append(type) return list -def getFileModifyInfo(id): - modifyFileList = [] - cmd = ['diff', '--numstat', "-M", '--diff-filter=R', '-z', '--ignore-submodules', '%s^..%s' % (id, id)] - status = git_exec(cmd) - split = status.split('\x00') - while len(split) > 3: - changes = split.pop(0).split() - oldname = split.pop(0) - newname = split.pop(0) - if int(changes[0]) != 0 or int(changes[1]) != 0: - modifyFileList.append(newname) - return modifyFileList - def checkout(stats, comment, initial): """Poor mans two-phase commit"""