def main():
    # parse arguments
    args = parse_command_line(sys.argv[1:])
    try:
        manifest = Manifest(args.manifest)
        manifest.validate_manifest()
    except KeyError as error:
        print "Failed to create a Manifest instance for the manifest file {0} \nERROR:\n{1}"\
              .format(args.manifest, error.message)
        sys.exit(1)

    if args.publish:
        if args.git_credential:
            repo_operator = RepoOperator(args.git_credential)
        else:
            print "Error occurs when get crendtail in update submodule"
            sys.exit(1)
    else:
        repo_operator = RepoOperator(args.git_credential)
    if os.path.isdir(args.build_dir):
        print args.build_dir
        for filename in os.listdir(args.build_dir):
            try:
                repo_dir = os.path.join(args.build_dir, filename)
                repo_operator.submodule_init(repo_dir)
                repo_operator.submodule_update(repo_dir)
                submodules_list = repo_operator.get_current_submodule(repo_dir)
                if len(submodules_list) == 0:
                    continue
                for key in submodules_list:
                    commit_id = get_manifest_commit_id(key, manifest)
                    if commit_id != None:
                        sub_dir = repo_dir + "/" + key
                        repo_operator.checkout_to_commit(sub_dir, commit_id)
                if args.publish:
                    print "start to publish  update submodule in {0}".format(
                        repo_dir)
                    commit_message = "update submodule for new commit {0}".format(
                        args.version)
                    repo_operator.push_repo_changes(repo_dir, commit_message)
            except Exception, e:
                print "Failed to update submodule of {0} due to {1}".format(
                    filename, e)
                sys.exit(1)
def main():
    # parse arguments
    args = parse_command_line(sys.argv[1:])
    try:
            manifest = Manifest(args.manifest)
            manifest.validate_manifest()
    except KeyError as error:
            print "Failed to create a Manifest instance for the manifest file {0} \nERROR:\n{1}"\
                  .format(args.manifest, error.message)
            sys.exit(1)


    if args.publish:
        if args.git_credential:
            repo_operator = RepoOperator(args.git_credential)
        else:
            print "Error occurs when get crendtail in update submodule"
            sys.exit(1)
    else:
        repo_operator = RepoOperator(args.git_credential)
    if os.path.isdir(args.build_dir):
        print args.build_dir
        for filename in os.listdir(args.build_dir):
            try:
                repo_dir = os.path.join(args.build_dir, filename)
                repo_operator.submodule_init(repo_dir)
                repo_operator.submodule_update(repo_dir) 
                submodules_list = repo_operator.get_current_submodule(repo_dir)
                if len(submodules_list)==0:
                    continue;
                for key in submodules_list:
                    commit_id = get_manifest_commit_id(key,manifest)
                    if commit_id != None:
                        sub_dir = repo_dir+"/"+key
                        repo_operator.checkout_to_commit(sub_dir,commit_id)
                if args.publish:
                    print "start to publish  update submodule in {0}".format(repo_dir)
                    commit_message = "update submodule for new commit {0}".format(args.version)
                    repo_operator.push_repo_changes(repo_dir, commit_message)
            except Exception,e:
                print "Failed to update submodule of {0} due to {1}".format(filename, e)
                sys.exit(1)