Example #1
0
def command(argv):
    initialized()
    if len(argv) < 1:
        help()
        sys.exit(1)

    ref = argv[0]
    match = re.match("(\w+)(~[1-9][0-9]*){0,1}", ref)
    if match is None:
        help()
        sys.exit(1)
    groups = match.groups()
    ref = groups[0]
    if ref == "HEAD":
        head = HEAD.from_file()
        ref = head.ref

    if groups[1] is None:
        prev_count = 0
    else:
        prev_count = int(groups[1][1:])

    head = HEAD.from_file()

    if head.sha1 is None:
        print >> sys.stderr, "Branch does not have the first commit"
        sys.exit(1)

    checkout_branch = Branch.from_file(ref)
    checkout_commit = Commit.from_file(checkout_branch.sha1text)
    for i in xrange(prev_count):
        if checkout_commit.parent is None:
            print >> sys.stderr, "Last commit doesn't have a parent"
            sys.exit()
        checkout_commit = Commit.from_file(checkout_commit.parent)
    staging = Index()
    staging.load(os.path.join(MYGIT_ROOTDIR, 'index'))
    target_commit_index = Index.from_tree(2, checkout_commit.treesha1)
    non_overwritable_files = staging.list_nonoverwritable_files_by_index(
        target_commit_index)
    if non_overwritable_files:
        print >> sys.stderr, "original file changed, you shouldn't write onto it %s" % non_overwritable_files
        sys.exit()
    current_head = HEAD.from_file()
    current_commit = Commit.from_file(current_head.sha1)
    current_index = Index.from_tree(2, current_commit.treesha1)
    staging.overwrite_repo(current_index, target_commit_index)
    target_commit_index.save(os.path.join(MYGIT_ROOTDIR, 'index'))
    new_head = HEAD()
    if not prev_count:
        new_head.ref = ref
        new_head.sha1 = checkout_commit.sha1
    else:
        new_head.sha1 = checkout_commit.sha1
    new_head.save()
Example #2
0
 def assertBranchHEADEquals(self, branch_name, file_names):
     master = Branch.from_file(branch_name)
     commit = Commit.from_file(master.sha1text)
     tree = Index.from_tree(2, commit.treesha1)
     saved_file_names = [ie.name for ie in tree.index_entries]
     for file_name in file_names:
         self.assertIn(file_name, saved_file_names)
Example #3
0
def command(argv):
    initialized()
    if len(argv) > 0:
        help()
        sys.exit(1)

    filename = os.path.join(MYGIT_ROOTDIR, 'index')
    index = Index()
    index.load(filename)
    head = HEAD.from_file()
    if head.ref is None:
        commitsha1 = head.sha1
    else:
        branch = Branch.from_file(head.ref)
        commitsha1 = branch.sha1text

    commit = Commit.from_file(commitsha1)
    commitIndex = index.from_tree(2, commit.treesha1)

    removed, changed, added = index.differences(commitIndex)

    print "Added files:"
    print "\n".join(added) + "\n"
    print "Changed files:"
    print "\n".join(changed) + "\n"
    print "Removed files:"
    print "\n".join(removed) + "\n"

    fs_removed, fs_changed, fs_added = index.filesystem_differences()
    print "Changes not staged for commit"
    print "Added files:"
    print "\n".join(fs_added) + "\n"
    print "Changed files:"
    print "\n".join(fs_changed) + "\n"
    print "Removed files:"
    print "\n".join(fs_removed) + "\n"

    return ((removed, changed, added), (fs_removed, fs_changed, fs_added))
Example #4
0
def command(argv):
    initialized()
    if len(argv) < 2:
        help()
        sys.exit(1)

    object_type = argv[0]
    sha1text = argv[1]
    if object_type == "blob":
        blob = Blob.from_saved_blob(sha1text)
        print blob.original_content
    elif object_type == "tree":
        # version should be read from the file?
        tree = Index.from_tree(2, sha1text)
        for index_entry in tree.index_entries:
            print "%s %s" % (index_entry.sha1, index_entry)
    elif object_type == "commit":
        commit = Commit.from_file(sha1text)
        print "commit: %s\ntree: %s\nauthor: %s\nmessage: %s\nparent: %s" % (
            sha1text, commit.treesha1, commit.author, commit.message,
            commit.parent)
    else:
        print >> sys.stderr, "%s is not an object type" % object_type
Example #5
0
File: diff.py Project: oguzalb/cit
def command(argv):
    initialized()
    if len(argv) > 0:
        help()
        sys.exit(1)

    filename = os.path.join(MYGIT_ROOTDIR, 'index')
    index = Index()
    index.load(filename)
    head = HEAD.from_file()
    if head.ref is None:
        commitsha1 = head.sha1
    else:
        branch = Branch.from_file(head.ref)
        commitsha1 = branch.sha1text

    commit = Commit.from_file(commitsha1)
    commit_index = index.from_tree(2, commit.treesha1)
    for new_file in commit_index.new_files(index):
        with open(new_file, "r") as f:
            for line in unified_diff([""], f.readlines(), fromfile=new_file, tofile=new_file):
                print line
    removed_files, changed_files = commit_index.changed_files()
    for changed_file in changed_files:
        index_entry = next(
            (i for i in commit_index.index_entries if i.name == changed_file), None)
        blob = Blob.from_saved_blob(index_entry.sha1)
        with open(changed_file, "r") as f:
            for line in unified_diff(blob.content.split(), f.readlines(), fromfile=changed_file, tofile=changed_file):
                print line
    for removed_file in removed_files:
        index_entry = next(
            (i for i in commit_index.index_entries if i.name == removed_file), None)
        blob = Blob.from_saved_blob(index_entry.sha1)
        for line in unified_diff(blob.content.split(), [""], fromfile=removed_file, tofile=removed_file):
            print line