From: <tak...@us...> - 2013-02-28 13:03:55
|
Revision: 7813 http://gfarm.svn.sourceforge.net/gfarm/?rev=7813&view=rev Author: takuya-i Date: 2013-02-28 13:03:48 +0000 (Thu, 28 Feb 2013) Log Message: ----------- implement #632 - gfpcopy supports overwriting only different files Modified Paths: -------------- gfarm_v2/branches/2.5/doc/docbook/en/ref/man1/gfpcopy.1.docbook gfarm_v2/branches/2.5/gftool/gfprep/gfprep.c Modified: gfarm_v2/branches/2.5/doc/docbook/en/ref/man1/gfpcopy.1.docbook =================================================================== --- gfarm_v2/branches/2.5/doc/docbook/en/ref/man1/gfpcopy.1.docbook 2013-02-28 11:24:01 UTC (rev 7812) +++ gfarm_v2/branches/2.5/doc/docbook/en/ref/man1/gfpcopy.1.docbook 2013-02-28 13:03:48 UTC (rev 7813) @@ -3,7 +3,7 @@ <refentry id='gfpcopy.1'> -<refentryinfo><date>19 October 2012</date></refentryinfo> +<refentryinfo><date>28 Feb 2013</date></refentryinfo> <refmeta> <refentrytitle>gfpcopy</refentrytitle> @@ -85,9 +85,15 @@ <term><option>-f</option></term> <listitem> <para> -If a file or directory exists on the destination, the file or -directory is overwritten. +With -f option, existing destination files will be overwritten when +the size is different or the modification time is different from the +source file. </para> +<para> +Without -f option, existing destination files will be overwritten when +the size is different or the modification time is older than the +source file. +</para> </listitem> </varlistentry> Modified: gfarm_v2/branches/2.5/gftool/gfprep/gfprep.c =================================================================== --- gfarm_v2/branches/2.5/gftool/gfprep/gfprep.c 2013-02-28 11:24:01 UTC (rev 7812) +++ gfarm_v2/branches/2.5/gftool/gfprep/gfprep.c 2013-02-28 13:03:48 UTC (rev 7813) @@ -2934,6 +2934,7 @@ /* [5] gfpcopy p1/f1 p2/f1(exist) : ENOTDIR */ if (gfprep_is_dir(dst_is_gfarm, dst_dir, NULL, &e)) { /* exist dst_dir */ + assert(e == GFARM_ERR_NO_ERROR); if (src_base_name) { /* [3] */ if (!opt_force_copy) { char *tmp_dst_file; @@ -3000,10 +3001,7 @@ gfprep_convert_gfarm_rootdir(&dst_dir); if (checked == 0 && gfprep_is_dir(dst_is_gfarm, dst_dir, NULL, &e)) { - if (!opt_force_copy) { - gfprep_error("dst_dir(%s) exists", dst_dir); - exit(EXIT_FAILURE); - } + /* OK */ } else if (e == GFARM_ERR_NO_SUCH_FILE_OR_DIRECTORY) { e = gfprep_mkdir(dst_is_gfarm, dst_dir, src_dir_mode); if (e != GFARM_ERR_NO_ERROR) @@ -3043,9 +3041,8 @@ pfunc_cb_func_init(); /* create child-processes before gfarm_initialize() */ - assert(opt_force_copy ? is_gfpcopy : 1); e = gfarm_dirtree_open(&dirtree_handle, src_dir, - opt_force_copy ? dst_dir : NULL, + is_gfpcopy ? dst_dir : NULL, opt_dirtree_n_para, opt_dirtree_n_fifo, src_base_name ? 0 : 1); gfprep_fatal_e(e, "gfarm_dirtree"); @@ -3204,12 +3201,26 @@ dst_url, entry->dst_ncopy, entry->dst_m_sec); if (entry->dst_exist && opt_simulate_KBs <= 0) { - if (!opt_force_copy) { - gfprep_warn( - "already exists: %s", dst_url); + if (entry->src_size == entry->dst_size && + ((!opt_force_copy && + entry->src_m_sec <= entry->dst_m_sec) + || + (opt_force_copy && + entry->src_m_sec == entry->dst_m_sec))) { + gfprep_verbose( + "already exists: %s", dst_url); goto next_entry; } - /* opt_force_copy */ + /* opt_force_copy or different mtime */ + gfprep_debug("overwrite: " + "src_size=%lld, dst_size=%lld, " + "src_m_sec=%lld, dst_m_sec=%lld, " + "src_m_nsec=%d, dst_m_nsec=%d", + (long long)entry->src_size, + (long long)entry->dst_size, + (long long)entry->src_m_sec, + (long long)entry->dst_m_sec, + entry->dst_m_nsec, entry->dst_m_nsec); if (entry->dst_d_type == GFS_DT_LNK || entry->dst_d_type == GFS_DT_UNKNOWN) { e = gfprep_unlink(dst_is_gfarm, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |